Compare commits
923 Commits
Feature/Lo
...
Main
| Author | SHA1 | Date | |
|---|---|---|---|
| dd89e5a04d | |||
| c844867cab | |||
|
|
59d73d5ca8 | ||
|
|
ce146d9733 | ||
| cb3d4b711a | |||
| 779514f5c0 | |||
|
|
ec8dfe4799 | ||
| b69d450a3a | |||
| bc491eec18 | |||
| c980c627ba | |||
| 67910d2fa5 | |||
| 8cf960ebd7 | |||
| ad167ea1f4 | |||
| 9475c786d3 | |||
| db32b1e6ea | |||
| b30a8b0e4d | |||
| 0ba0043751 | |||
| 79a9d72b86 | |||
| dddc4b143a | |||
| 127d9f7a46 | |||
| a8cb226d20 | |||
| 793b10c6cc | |||
| ffe8fa67e2 | |||
| a0d2023a6c | |||
|
|
8ff6d8ecc0 | ||
|
|
c466b68c9a | ||
| 332f58de9b | |||
| db0047d3d3 | |||
|
|
2c305e1d7a | ||
|
|
da966e49c3 | ||
|
|
7d35a65f35 | ||
| ddeb6a7182 | |||
| 77b5c8168e | |||
|
|
1343d9a2a7 | ||
| d7731cd7ad | |||
| cd2c770a9f | |||
|
|
734d0ca692 | ||
|
|
d07a78a637 | ||
|
|
1ac73f9689 | ||
| c28bb46aaf | |||
|
|
d2d95b4fbe | ||
|
|
f067d5a7b4 | ||
|
|
fe8e94f121 | ||
|
|
c493718452 | ||
| dc56df5e0f | |||
| d6e60e2cab | |||
| fa4c39904a | |||
|
|
a14a78309e | ||
|
|
4ccade4c7a | ||
| 085d138bc5 | |||
|
|
6e74447ccb | ||
|
|
b65c33c43a | ||
| 0b1cc34008 | |||
| 3dace574ff | |||
| bf2a102a55 | |||
| 88744bd4cf | |||
| 0705823157 | |||
| 5942075dd6 | |||
| 61015ae5c1 | |||
| 57a5000124 | |||
|
|
734fd9ebca | ||
| 7cbb9eef69 | |||
|
|
add04f854e | ||
|
|
debb54bafc | ||
|
|
7a065e9d16 | ||
| 3bd20d528f | |||
| b850ab1206 | |||
| 33a2c0be95 | |||
| fedfc372d0 | |||
|
|
a2c1fd30bf | ||
| 170f30f162 | |||
| db26c29057 | |||
| 0e7787dd56 | |||
|
|
1e9f864c1e | ||
|
|
e2bab8c1ce | ||
|
|
3f23d1dac0 | ||
|
|
6f0a579c33 | ||
|
|
b088d3089d | ||
|
|
45b4690066 | ||
|
|
26517c20d8 | ||
|
|
7ce3224d69 | ||
|
|
5a9bfde922 | ||
|
|
64746fa3c3 | ||
|
|
bc3bc17a61 | ||
|
|
a678b92c39 | ||
|
|
4c513191b6 | ||
|
|
33ae28f0e5 | ||
|
|
2f45d519b9 | ||
| 179de86840 | |||
| 3840d89433 | |||
| e0d10510e0 | |||
| 23d42bd8f5 | |||
| 25aa76b16c | |||
| d6a9c5e87d | |||
|
|
34d336f43e | ||
|
|
6b81f383f6 | ||
|
|
54ff59de48 | ||
| 411363555f | |||
| a55492b16a | |||
|
|
faeb5e11a5 | ||
|
|
50b56d928d | ||
|
|
9f09b6af97 | ||
|
|
63e169b82d | ||
| 9596c8f8b6 | |||
|
|
7339eaaadf | ||
|
|
e5c96c8bcb | ||
| 8622f12f12 | |||
| a20a847065 | |||
| 258a809451 | |||
|
|
187b7406d2 | ||
|
|
c51bb90a2b | ||
|
|
6285c7320e | ||
|
|
17f117726e | ||
|
|
13fb6fec5d | ||
| 5bead0cc86 | |||
| 9bca1b81d6 | |||
| 9ff6b5cf56 | |||
|
|
bef21edf22 | ||
|
|
04642b7257 | ||
|
|
c151e2d3f7 | ||
|
|
1e36966767 | ||
| c1c9fe51cb | |||
|
|
0d2ac58bbb | ||
| 64693b2ca3 | |||
| 43ccb3a1dd | |||
| 0134111aba | |||
|
|
3cc7adae35 | ||
|
|
c97ea5356f | ||
| 64cb4baba9 | |||
| 03657b6848 | |||
| 69f4819bf6 | |||
|
|
1257e15b62 | ||
|
|
331fb24a99 | ||
| 3be1547137 | |||
|
|
1324baa9c7 | ||
| ce836476a1 | |||
| 15f1c938f7 | |||
| 7e563a0f01 | |||
|
|
48cc07bf2a | ||
| 900b4b3f4d | |||
|
|
be319f6286 | ||
|
|
d3dacceab1 | ||
| bdc6f95af8 | |||
| 7a73e69afa | |||
| a3fd3e6920 | |||
|
|
8db161f960 | ||
|
|
3bb16c02b4 | ||
| 025c59e695 | |||
|
|
7a79343b2f | ||
| 36ccd96352 | |||
| a7c97b22b4 | |||
| 4c143d6bbc | |||
| 0e5a0a16ac | |||
|
|
dfc392f07a | ||
| 88f54b6310 | |||
| a68b879e95 | |||
| 161f3a92a7 | |||
| 5a1ec104a1 | |||
|
|
7fc5ac7ccd | ||
|
|
5b6f967fca | ||
| d4694e7e1c | |||
|
|
3317bde6d6 | ||
| 4bde4ade2d | |||
|
|
5cd30e5910 | ||
| 5c3c9739d1 | |||
| bd12ff0506 | |||
|
|
d51e4c462a | ||
|
|
4463fdc177 | ||
|
|
2ce63d1e0f | ||
|
|
21302803b6 | ||
|
|
38603b2249 | ||
|
|
037723ef70 | ||
|
|
7bb507c841 | ||
|
|
bf03247f81 | ||
| cb2c6b9ad1 | |||
| 355ec72140 | |||
| 21b3467517 | |||
| e9d0efc52f | |||
| 301a8f06f4 | |||
| 63a3027a17 | |||
| b22aa86aea | |||
| f0feac9601 | |||
| 8faddedd46 | |||
|
|
12af5dcb56 | ||
| 1382305433 | |||
|
|
8ec13ffae1 | ||
|
|
5508d4e88f | ||
| 43abb74c61 | |||
| 73e6681baa | |||
| 90fa0ac8f8 | |||
| 90b2fd2eab | |||
| eb8352e8fc | |||
| 4c7599b568 | |||
| d179c90c48 | |||
|
|
ae2427473b | ||
|
|
2fc124bf6d | ||
|
|
068d34b4b4 | ||
|
|
1d88ca0fbb | ||
|
|
e2911dfc2a | ||
|
|
377f95561c | ||
|
|
cfb96d1277 | ||
|
|
b5c5be2cb6 | ||
| 8850328fd4 | |||
| b7172630e2 | |||
|
|
b66dc81688 | ||
|
|
f5c8888137 | ||
|
|
20ff66da2f | ||
|
|
4d7923936e | ||
| 0604514190 | |||
| 915f16c7c0 | |||
|
|
2e95846336 | ||
| ad91383e86 | |||
| 6281a024ca | |||
| 0ef4ead292 | |||
| b286923dfe | |||
|
|
532065e3a8 | ||
|
|
f7bfa37a77 | ||
| 18867b4929 | |||
| a9df0669c6 | |||
| 5c75316f40 | |||
| 8839b54dd3 | |||
| 87c3cebb60 | |||
| d9c431e20e | |||
| ff5180eb75 | |||
| a1c9335487 | |||
|
|
2746bf69ea | ||
|
|
77dbb50512 | ||
|
|
1c7e8824c7 | ||
| 20ece4886c | |||
| 0eff1b9a66 | |||
| 0d72392701 | |||
|
|
0d33d79620 | ||
|
|
e4355faffc | ||
| 8f6007835c | |||
| 05d860795e | |||
|
|
577fe5db76 | ||
| 607c0780b6 | |||
| 587fa40d81 | |||
| b741ab9ed2 | |||
| b6fde4903a | |||
| 0772604432 | |||
|
|
ec8333c715 | ||
|
|
8aa93e089a | ||
| 59891d1199 | |||
| 7cb39b1b92 | |||
|
|
5580d56874 | ||
|
|
423b49e6e7 | ||
|
|
0ab3052251 | ||
| 38027352d6 | |||
| 43562fb49c | |||
|
|
5202779d9f | ||
| 791c8f91b7 | |||
| 80a58f8cdc | |||
| c980354c6b | |||
| 7c611825a4 | |||
| 22a5564ba0 | |||
| ef49302f8a | |||
| d8d2c34de7 | |||
|
|
67a85735f0 | ||
|
|
bf46dfd1dc | ||
|
|
a1ed3ad648 | ||
|
|
3a343a19e1 | ||
|
|
e65852c829 | ||
|
|
35e6355069 | ||
| 8679abb1e7 | |||
| 7f1939390c | |||
| c8dddabdff | |||
| 6f076bdc77 | |||
|
|
07a4ce1f64 | ||
|
|
4de2e12ac5 | ||
| 380ed8f6b1 | |||
| 7423391003 | |||
|
|
23b65cfbfe | ||
| 572f66f905 | |||
|
|
7207172ce0 | ||
|
|
48b75d2baa | ||
| 048da40f3c | |||
| 140414b866 | |||
| 7ba85fe1aa | |||
| 4ade9e12a6 | |||
|
|
63edb33bf5 | ||
| dd7e816767 | |||
| 1deeff996f | |||
|
|
3280202644 | ||
| 1a334c22b8 | |||
|
|
a1bda5bc54 | ||
| c80be16807 | |||
| 2bea265989 | |||
| ef9b78b924 | |||
|
|
f6a285b6ea | ||
| 8ad296fe61 | |||
| 68b1f89ef0 | |||
| 18fe6a5c6a | |||
|
|
56fc69f99f | ||
|
|
823110ea74 | ||
| 061058cbeb | |||
| d6096b232d | |||
| 95d66c2d89 | |||
| 609daf4353 | |||
| a81e01ce2b | |||
| 6d5c032802 | |||
| 71c0cff03a | |||
| 2cd838a5e3 | |||
| c6ed46d8b7 | |||
| 3da7453ece | |||
|
|
9a591fabff | ||
| 9d09ef60f8 | |||
|
|
ebcb7530e0 | ||
|
|
9ff9b0be18 | ||
|
|
ceb328cfa7 | ||
| 0757ac7e74 | |||
| a9789023ac | |||
| 5a7d65427d | |||
| 8adb0f567c | |||
| 34bd7ba444 | |||
|
|
7aaf161718 | ||
|
|
2f408a6cc1 | ||
| 16b11a8bb8 | |||
|
|
3ef717583f | ||
|
|
dd5455d80a | ||
| 9360dcad71 | |||
| 1971252713 | |||
|
|
551f5a754c | ||
|
|
ba88a012ff | ||
| 02cc099104 | |||
|
|
e4c41bb704 | ||
|
|
dee55f8854 | ||
|
|
802c79812b | ||
| e2e7aa1989 | |||
| 43b124664e | |||
| b82e831991 | |||
|
|
44cbdbaa1c | ||
|
|
94466bbb27 | ||
| 931d41c446 | |||
|
|
9614e44003 | ||
| d2dd67343b | |||
|
|
f097be54aa | ||
| 3d2b5ff6bd | |||
| 209aa5912d | |||
| 5ba72e2281 | |||
| 340685a06c | |||
| b20a56df26 | |||
| 8d93fa4fc6 | |||
|
|
be4bc2c900 | ||
| 0b42546666 | |||
| a35a51370a | |||
| 8f10f7057c | |||
| 00b5066f6f | |||
| abd221cb55 | |||
| 33833a408c | |||
|
|
ef86c6d07d | ||
| c2fca9f9eb | |||
|
|
1b284b51b9 | ||
|
|
5b15596696 | ||
| a16c20440b | |||
| 1f365f3642 | |||
| 0bfcde6a3f | |||
| f290a71dd3 | |||
| 4ada29a98a | |||
| 0d0f643058 | |||
| 6f64ee1ce4 | |||
|
|
5ad5fdcca0 | ||
|
|
fb1601db77 | ||
| 582da511c6 | |||
|
|
b39b58b21e | ||
| 3340edcc17 | |||
|
|
2a3e733eb6 | ||
| 5d2a917168 | |||
| 4ab9f60932 | |||
| cbcd42db85 | |||
| 385a885c93 | |||
|
|
76aabc3a45 | ||
| a22dbd8811 | |||
| f99f199a77 | |||
| 9cfae54db3 | |||
| 287b31e356 | |||
|
|
3cdd5e7ac7 | ||
| de4e2de2e7 | |||
| d7dd91eaba | |||
|
|
d6e3c48770 | ||
|
|
946024d81e | ||
| 5f8232809a | |||
| 3c72311096 | |||
| 250d17eba2 | |||
| 5db8e7d319 | |||
|
|
3300f60845 | ||
|
|
7537cfe5b8 | ||
|
|
3c1bf7dff0 | ||
| 6909fcf715 | |||
| fe66ff5aa3 | |||
| ce305edac4 | |||
| a49b825ce9 | |||
| fb62523a23 | |||
|
|
e171a4749c | ||
| 9b6c0d4cc4 | |||
| f8126b4000 | |||
|
|
cf62d75f0e | ||
|
|
f93e59b77c | ||
|
|
8f37d9f388 | ||
| 8e72b56758 | |||
| a6e1251445 | |||
| 490a1a69d5 | |||
| 7e3ea39d5b | |||
| 66a6c411d6 | |||
|
|
b03a806dfb | ||
| 14ff0a2e59 | |||
| 58f695fe95 | |||
| b4ccacd37e | |||
| 1fef8e355a | |||
| 147621de34 | |||
| e7ce947342 | |||
| d663857de1 | |||
|
|
4d326b1983 | ||
| 796a13cdcc | |||
| aa37ca4b28 | |||
| 2b7871c582 | |||
| 9bbdff9bc6 | |||
| 45615684ed | |||
| 8f0c707647 | |||
| d11fdcf106 | |||
| eb9a3e52fe | |||
| a835663e5c | |||
| 94955ea1b4 | |||
| 16c1ae04a9 | |||
| 0bceed55d1 | |||
| 656bb49fab | |||
| 946e980324 | |||
| cf3f0564f9 | |||
| fb5b98bf25 | |||
| 93847e6aa8 | |||
| b329e40930 | |||
| 12318a6a51 | |||
|
|
6e34ba79e0 | ||
| 1e733f3f20 | |||
| 5f21b59cb3 | |||
| 836e721b6f | |||
| 8fca1f3a91 | |||
| e0ea5aec53 | |||
| 2feca1f7f8 | |||
|
|
43000bde7e | ||
|
|
0a7d80c2fe | ||
| 2984d2a3cf | |||
| bc6854f8a7 | |||
| 4f66270cb0 | |||
|
|
6b6ec79faa | ||
| 4e9cecbb74 | |||
| adf297455f | |||
|
|
1304a3e8ef | ||
|
|
57881af130 | ||
|
|
6154c2c7f5 | ||
|
|
647909319f | ||
|
|
d5b70d1545 | ||
| 4ed1907075 | |||
| 1d656a590f | |||
| efcf40eea8 | |||
|
|
d2acf59eba | ||
|
|
a33d7c019c | ||
|
|
d62b5ca155 | ||
|
|
18a4334d8a | ||
|
|
3139552217 | ||
| 84416fe1f5 | |||
|
|
8e6defb29e | ||
|
|
fe4e81a60c | ||
|
|
098233fd1b | ||
| 61062dba7b | |||
|
|
bd1c1fa814 | ||
| 5581e7e013 | |||
| d855684cd7 | |||
|
|
47d8f7156c | ||
| 9e5e8d8e5d | |||
| 0b704da21f | |||
|
|
8496b52013 | ||
| e8059f98d5 | |||
| 9eefdd8fd1 | |||
|
|
df5b820782 | ||
|
|
ed8f9558d6 | ||
|
|
5c1547dced | ||
|
|
c09321d89d | ||
| 219e64c0f7 | |||
| 60a1d1cd8e | |||
| b42217ed94 | |||
| 8b6786c09a | |||
| 45c5d20323 | |||
|
|
dc4c8e9a26 | ||
| 0721467abf | |||
| ad6f872145 | |||
| d22805892a | |||
| 4da496cab8 | |||
| aa0eae6c83 | |||
| 2159901614 | |||
|
|
4b40580658 | ||
|
|
8bc9e044ae | ||
|
|
0e7cb00a9f | ||
|
|
cddaf2f709 | ||
|
|
337cd40a4e | ||
| 7ce7854091 | |||
|
|
a98300cacd | ||
|
|
ba4c00c012 | ||
|
|
b3b3b14ebf | ||
|
|
ee486eb706 | ||
|
|
daded35ab1 | ||
|
|
ba778bb519 | ||
| 4c638cbdae | |||
|
|
27e8d302d9 | ||
|
|
54c67fe8f7 | ||
| 92e1d6de5c | |||
| c488f61a09 | |||
|
|
dc703fad3c | ||
| 54e5904951 | |||
|
|
a638913172 | ||
| a986212834 | |||
| 649242fc76 | |||
|
|
d254da1393 | ||
| ad4b0be033 | |||
| 733f39db9f | |||
| 94237434c5 | |||
| 2da8bc8a20 | |||
| 39a5918a11 | |||
| 8b217f6cd0 | |||
|
|
74bd802a3d | ||
| b58481a36f | |||
|
|
3fd17299f9 | ||
|
|
fc315cc908 | ||
|
|
abe07e1c4b | ||
|
|
6046f55ece | ||
| c60af8d248 | |||
| d80a36ec35 | |||
|
|
7b648b135e | ||
|
|
5998bd212f | ||
|
|
d77bffabdd | ||
| 4f0e5a34a4 | |||
| 5faa2062b9 | |||
|
|
57d13b9bed | ||
|
|
6d0a6085a5 | ||
|
|
69476f3f2d | ||
|
|
4bc65e500d | ||
| 2e274dd280 | |||
| 07587d162f | |||
| be7fad2cf5 | |||
| a79f9a28fb | |||
| 0d4b5774b6 | |||
| 30b4f52896 | |||
| 134466547e | |||
| a191968c15 | |||
|
|
59bbb7aae6 | ||
| d740c36dc6 | |||
|
|
a623044b93 | ||
|
|
89de3162de | ||
|
|
76408c48cf | ||
|
|
4ac51f24b5 | ||
|
|
132c8ac5a4 | ||
| b9e271de1a | |||
| e661bc2dcb | |||
|
|
f00fde4084 | ||
|
|
e8b3700cdf | ||
| 0ca35e3295 | |||
| ed121e9ade | |||
| 548aefb8e1 | |||
| 223c2bde21 | |||
| a1736fa3cc | |||
| 62f6817640 | |||
| f17b566957 | |||
| 1a91743916 | |||
|
|
dd68473150 | ||
|
|
72e3859d2c | ||
| 46d193b45e | |||
| 1bfe41418b | |||
| 6a446d5972 | |||
|
|
acec101c4c | ||
|
|
27edcc5f7b | ||
|
|
7d92321d1c | ||
|
|
19f78a230c | ||
| 0e91e6f287 | |||
| 9df56ee19b | |||
| 8750604d96 | |||
| f27ce460fd | |||
|
|
934019c6c6 | ||
|
|
21b69edf93 | ||
|
|
82bf10c2d5 | ||
|
|
68b42c98d6 | ||
|
|
f13688ccb2 | ||
|
|
bb9074df34 | ||
|
|
19a72ac78d | ||
|
|
9cb42b7cef | ||
| 1a6248f15d | |||
| 8e5d4c312e | |||
| 12fab5a9a5 | |||
| 20dd8f64f4 | |||
| b827493306 | |||
| 04c65eae93 | |||
| b4526a4338 | |||
| 2d879ce80a | |||
| a9511ffa82 | |||
| 56e79d2099 | |||
| 6f3d6e986c | |||
| 18da3221d7 | |||
| 93891f3837 | |||
|
|
5bdfbc572b | ||
| 186cb95c70 | |||
| b1f9bc98ba | |||
| 4385a65cbc | |||
| 722f8dae7c | |||
|
|
07113353c4 | ||
| 93ee88ba46 | |||
| 4b39994de6 | |||
| 5c6af6184c | |||
| 0dd2dc7c43 | |||
| 8c6336b9bd | |||
| e81a3ea7aa | |||
| 20c00893b6 | |||
| 20e3d454cf | |||
| b0d174a575 | |||
| 7d92ae6658 | |||
| 2bf31db6b2 | |||
| 5de90be51e | |||
| a1ead80a42 | |||
| 7a4a6de84f | |||
| 293ea0f6f4 | |||
| 3ce4cf3966 | |||
| a121e62102 | |||
| 4f16d7680c | |||
|
|
7a10d5ce59 | ||
|
|
3d88feeee7 | ||
|
|
f408624463 | ||
|
|
8296292e49 | ||
| be8deef167 | |||
| 84fb29c8c8 | |||
| 0969e8a5fd | |||
| 92e2282381 | |||
|
|
3b71b7d707 | ||
| 6123a53f01 | |||
| ec74db17eb | |||
| dc118cf18b | |||
| a11e54c333 | |||
|
|
2383e7a54f | ||
|
|
2ef1ea3d1a | ||
|
|
ebdc9b1e55 | ||
| 9e5a494881 | |||
| 2972807c9f | |||
| f7351454f3 | |||
| b64d0e5ffd | |||
| 35b7a3a3dd | |||
| fe93ef60c9 | |||
| ef865d9c68 | |||
|
|
61e35100f9 | ||
|
|
01d33ff340 | ||
| cd64e1d24d | |||
| d9da2e97ab | |||
|
|
1c1c8816a5 | ||
| a1e85261a6 | |||
| 000af89fd7 | |||
|
|
a4f3feba1c | ||
|
|
a3d286c040 | ||
|
|
902ef34757 | ||
|
|
e67aca37f9 | ||
| 2a31b27f9b | |||
| e05eb1236b | |||
| 5d20238904 | |||
| a7d3b1e96f | |||
| 4b35c3e443 | |||
| 73bef104fb | |||
|
|
b31559a29a | ||
|
|
c8d6644116 | ||
|
|
e62270a9b7 | ||
|
|
fff5bb3706 | ||
|
|
998759e2dc | ||
|
|
49d401856f | ||
|
|
74597c0ad5 | ||
|
|
cccccf084e | ||
|
|
2faf6c1400 | ||
|
|
a01a927f6f | ||
| 54b3745276 | |||
| bca1e66f0f | |||
|
|
097d5a6e86 | ||
| b50ad83144 | |||
| 83a7bbf5f3 | |||
|
|
24501df615 | ||
| d2e832d52e | |||
| da46d45601 | |||
| 14fda440c1 | |||
| 85ce92af2c | |||
|
|
5777a869cf | ||
| ed6301831c | |||
| 2d0eb52211 | |||
| 05d8b738cc | |||
|
|
5936f02421 | ||
|
|
57116b14cc | ||
| a1e52ca48a | |||
| f75d267ef5 | |||
| 5be44432b1 | |||
|
|
c0d2cae82e | ||
|
|
955a6a3d21 | ||
| a52e313984 | |||
| 58816ca383 | |||
| 370feca81e | |||
|
|
a4bf6c952d | ||
|
|
c9d582877b | ||
| 339cea998a | |||
| 32065aec33 | |||
| f2293934d4 | |||
| b12b3b9eb8 | |||
| 91259046f6 | |||
| c9882f0b59 | |||
|
|
e89aae1cc9 | ||
| 9469a5f76e | |||
| c059066b13 | |||
| ba0669bc55 | |||
| b3f42af77c | |||
| f42db3d21c | |||
| eb49bf771d | |||
| cdeba2009f | |||
| 65adbda73f | |||
| f829b8ddd1 | |||
| 5e6033db95 | |||
| 27e8a26ed8 | |||
|
|
0a2815946c | ||
|
|
7776dedd2a | ||
|
|
5da523e9a8 | ||
| b7a7fb01d7 | |||
| 8d49220532 | |||
|
|
def27929d9 | ||
|
|
ea6fcbc773 | ||
| 788d58b413 | |||
| de8181770d | |||
| 3a32d1ca9d | |||
| 951a194961 | |||
| ea896c4c11 | |||
| 167b2bce09 | |||
|
|
32a05398de | ||
|
|
c137c9e78e | ||
|
|
4801d593b7 | ||
|
|
582e140726 | ||
|
|
57853e2d1f | ||
|
|
acd96bcdc7 | ||
| 3c0ec01f77 | |||
| 517f2d06ca | |||
|
|
fb97d3453d | ||
|
|
2320185ade | ||
|
|
80fdd1fece | ||
| 343f830d0d | |||
| 323a46a623 | |||
| 87ff7976fb | |||
| a533850f24 | |||
| b5c1a4c29d | |||
| 28607dec66 | |||
| 4a041ca8e2 | |||
|
|
de0de6fde8 | ||
|
|
70447a74ef | ||
| 90aa6058f0 | |||
| 3df296f205 | |||
| 6a2e4405de | |||
| 88c10ac141 | |||
|
|
8de3939675 | ||
| e78c838cab | |||
|
|
5e4b8a3a80 | ||
|
|
a18984fec1 | ||
| a178fcd202 | |||
| ff04dff0ca | |||
|
|
c04089b68a | ||
|
|
d9ee96c057 | ||
| 9e92d2215f | |||
| c63eb23b22 | |||
| 238926118f | |||
| c874164ca2 | |||
| d2f0ed46ae | |||
| fc45e46502 | |||
| 40dd90074b | |||
| 452b0b6277 | |||
| 720e998a54 | |||
| 626722e805 | |||
| 8015e583bf | |||
| 5e5910e0fd | |||
| 524660d7b4 | |||
| 5d81731512 | |||
| c2d9d809f1 | |||
| b5d52feee4 | |||
| 511932fa58 | |||
| 95891d5bae | |||
| 4c58942e15 | |||
| edf8c8c92d | |||
|
|
901a4ebd35 | ||
|
|
8eaeefecc8 | ||
|
|
911c29ea6b | ||
| 8fc798746f | |||
| 3526fdbf2f | |||
| f3fa76c292 | |||
|
|
9d0bb7df0e | ||
|
|
a1d0c3ba5b | ||
|
|
16b04fc75c | ||
| ac6bbc3587 | |||
| 947d7590f4 | |||
| 91403a52a3 | |||
| 7e80342f80 | |||
| 5e92207778 | |||
|
|
29484e9565 | ||
|
|
86ac300e00 | ||
| ba640494d2 | |||
| 6974a505b4 | |||
| 409fc0df96 | |||
| 7533bc821a | |||
| 6d3d599449 | |||
|
|
ca520c7291 | ||
| 2d28bd1f98 | |||
| 0a3bdb2720 | |||
| 75ae3efb65 | |||
| eb53fd67ef | |||
| 1eb3b7d066 | |||
| 8ec717916c | |||
| 64bdbcbd2d | |||
|
|
90a420c8c5 | ||
|
|
73563b0421 | ||
| bc3cb5b115 | |||
| c9f519d7ec | |||
| aabb53c6d2 | |||
|
|
0fe0c05e5c | ||
|
|
62349c0a54 | ||
|
|
cb08e11593 | ||
|
|
7eba632f1c | ||
| de37555db9 | |||
| 6102ec3be8 | |||
| aaea658e58 | |||
|
|
e704258c23 | ||
| ea153d17b7 | |||
| dce24e3849 | |||
| f112bab021 | |||
| 00ffb08e2e | |||
| 8b39eed7bb | |||
| 58e30eb297 | |||
| 07851ff7c8 | |||
| 0fbd5c9d3e | |||
| 8436f70aa0 | |||
|
|
17eb5832fe | ||
|
|
8b8b5c3e76 | ||
|
|
db761ceba8 | ||
| 58499d6837 | |||
| d2df27320f | |||
| f4c73a418b | |||
|
|
daf0a366ef | ||
| b36919e0b6 | |||
| 87d47fa0d9 | |||
| c7d4481a6d | |||
| 4b52d144e0 | |||
|
|
91b72fdf8f | ||
| 38184b8d1b | |||
| 90a1683047 | |||
|
|
f93991db96 | ||
|
|
bca3e1dd42 | ||
|
|
c7e22e4ca6 | ||
|
|
7386bd5750 | ||
|
|
5c8a521f8e | ||
|
|
22973fe47b | ||
|
|
48c83e648d | ||
| 36b60555f3 | |||
|
|
494b80c461 | ||
|
|
7cdb431d98 | ||
|
|
f7ae463544 | ||
|
|
1913147f89 | ||
|
|
77798eaccb | ||
|
|
f17c1f0d8e | ||
|
|
bd4f2d18f5 | ||
|
|
0bbed013d2 | ||
|
|
3455c8a786 | ||
|
|
9981116caa | ||
| 9cf8447a83 | |||
| e124a4d5d9 | |||
| 7b9e7881c6 | |||
|
|
10e7400611 | ||
| 379126c513 | |||
| d078feccf9 | |||
| fb2d67c069 | |||
| d1ac8e49ba | |||
| c596bf78f4 | |||
| c6a7e0a0bd | |||
| d0fa1b2f58 | |||
| c10ae17f8c | |||
| e612150f1d | |||
| f3c391582c | |||
| c13ad3a8a7 | |||
|
|
2803c34591 | ||
| f76a12d45c | |||
| 2d5efb62be | |||
| ef3338c648 | |||
| fcf2b38457 | |||
|
|
82bb932cfc | ||
|
|
82c2b641fe | ||
| 7b71bd36b1 | |||
| bdc142d577 | |||
| 62900a22a1 | |||
|
|
23c99e60d5 | ||
| f7b9389f55 | |||
| 1c2ff03c90 | |||
| e6977b29fc | |||
| 6e902011ca | |||
| 7cce903f6e | |||
| 4d6077c93d | |||
| 83c1985ad9 | |||
| e0c247d07b | |||
| 1a3558df52 | |||
| c36e81e263 | |||
|
|
490393acbc | ||
| d3cd7e5b3c | |||
| 818d88d859 | |||
| 1a70569a36 | |||
| 8d24339f04 | |||
| bea858d4e7 | |||
|
|
c6874b33cf | ||
|
|
596e21b712 | ||
|
|
e9c3176dfc | ||
|
|
4a956a1397 | ||
|
|
fc3053dd17 | ||
|
|
bb79380ce5 | ||
|
|
849369fea3 | ||
|
|
283f66ab32 | ||
|
|
abf00884a4 | ||
|
|
50718eda93 | ||
|
|
a3dc27f08e | ||
|
|
055ce2b2a7 | ||
|
|
8171e06965 | ||
|
|
bfa8688c38 | ||
|
|
66c903045f | ||
|
|
b245023dd2 | ||
|
|
8044d64d5e | ||
|
|
1ef86d5e9c |
28
.github/workflows/dotnet-developPublish.yml
vendored
28
.github/workflows/dotnet-developPublish.yml
vendored
@@ -19,30 +19,36 @@ jobs:
|
|||||||
- name: Setup .NET SDK
|
- name: Setup .NET SDK
|
||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v4
|
||||||
with:
|
with:
|
||||||
dotnet-version: '8.0.x' # یا نسخه پروژهت
|
dotnet-version: '10.0.x'
|
||||||
|
|
||||||
- name: Restore dependencies
|
- name: Restore dependencies
|
||||||
run: dotnet restore
|
run: dotnet restore ServiceHost/ServiceHost.csproj
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dotnet build --configuration Release
|
run: dotnet build ServiceHost/ServiceHost.csproj --configuration Release
|
||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: dotnet publish --configuration Release --output ./publish /p:EnvironmentName=Development --no-build
|
run: dotnet publish ServiceHost/ServiceHost.csproj --configuration Release --output ./publish /p:EnvironmentName=Development --no-build
|
||||||
|
|
||||||
- name: Deploy to IIS via Web Deploy
|
- name: Deploy to IIS via Web Deploy
|
||||||
shell: powershell
|
shell: powershell
|
||||||
run: |
|
run: |
|
||||||
$publishFolder = Resolve-Path ./publish
|
$publishFolder = Resolve-Path ./publish
|
||||||
|
$server = $env:SERVER_HOST
|
||||||
|
$user = $env:DEPLOY_USER
|
||||||
|
$pass = $env:DEPLOY_PASSWORD
|
||||||
|
|
||||||
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
|
& "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
|
||||||
-verb:sync `
|
-verb:sync `
|
||||||
-source:contentPath="$publishFolder" `
|
-source:contentPath="$publishFolder" `
|
||||||
-dest:contentPath="dadmehrg",computerName="https://171.22.24.15:8172/msdeploy.axd?site=dadmehrg",userName="Administrator",password="R2rNpdnetP3j>q5b18",authType="Basic" `
|
-dest:contentPath="dadmehrg",computerName="https://${server}:8172/msdeploy.axd?site=dadmehrg",userName="$user",password="$pass",authType="Basic" `
|
||||||
-allowUntrusted `
|
-allowUntrusted `
|
||||||
-enableRule:AppOffline
|
-enableRule:AppOffline
|
||||||
|
-disableRule:DeleteRule `
|
||||||
|
-useChecksum `
|
||||||
|
-retryAttempts:3 `
|
||||||
|
-retryInterval:2000
|
||||||
|
|
||||||
|
env:
|
||||||
env:
|
SERVER_HOST: ${{ secrets.DEV_HOST }}
|
||||||
SERVER_HOST: your-server-ip-or-domain
|
DEPLOY_USER: ${{ secrets.DEV_USER }}
|
||||||
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
DEPLOY_PASSWORD: ${{ secrets.DEV_PASS }}
|
||||||
DEPLOY_PASSWORD: ${{ secrets.DEPLOY_PASSWORD }}
|
|
||||||
|
|||||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -362,3 +362,13 @@ MigrationBackup/
|
|||||||
# # Fody - auto-generated XML schema
|
# # Fody - auto-generated XML schema
|
||||||
# FodyWeavers.xsd
|
# FodyWeavers.xsd
|
||||||
.idea
|
.idea
|
||||||
|
/ServiceHost/appsettings.Development.json
|
||||||
|
/ServiceHost/appsettings.json
|
||||||
|
/ServiceHost/web.config
|
||||||
|
|
||||||
|
# Storage folder - ignore all uploaded files, thumbnails, and temporary files
|
||||||
|
ServiceHost/Storage
|
||||||
|
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,27 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<RootNamespace>_0_Framework</RootNamespace>
|
<RootNamespace>_0_Framework</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="IPE.SmsIR" Version="1.0.5" />
|
<PackageReference Include="FluentValidation" Version="12.1.1" />
|
||||||
<PackageReference Include="EPPlus" Version="7.5.2" />
|
<PackageReference Include="IPE.SmsIR" Version="1.2.7" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.1.34" />
|
<PackageReference Include="EPPlus" Version="8.4.0" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.3.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.3" />
|
||||||
<PackageReference Include="PersianTools.Core" Version="2.0.4" />
|
<PackageReference Include="PersianTools.Core" Version="2.0.4" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="9.0.0" />
|
<PackageReference Include="System.Drawing.Common" Version="10.0.1" />
|
||||||
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.5.0" />
|
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.6.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="7.2.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="10.0.1" />
|
||||||
|
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||||
|
<!--<PackageReference Include="DNTPersianUtils.Core" Version="6.7.1" />-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,11 @@ public class AuthHelper : IAuthHelper
|
|||||||
return Tools.DeserializeFromBsonList<int>(permissions); //Mahan
|
return Tools.DeserializeFromBsonList<int>(permissions); //Mahan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasPermission(int permission)
|
||||||
|
{
|
||||||
|
return GetPermissions().Any(x => x == permission);
|
||||||
|
}
|
||||||
|
|
||||||
public long CurrentAccountId()
|
public long CurrentAccountId()
|
||||||
{
|
{
|
||||||
return IsAuthenticated()
|
return IsAuthenticated()
|
||||||
@@ -198,7 +203,8 @@ public class AuthHelper : IAuthHelper
|
|||||||
new("workshopList",workshopBson),
|
new("workshopList",workshopBson),
|
||||||
new("WorkshopSlug",slug),
|
new("WorkshopSlug",slug),
|
||||||
new("WorkshopId", account.WorkshopId.ToString()),
|
new("WorkshopId", account.WorkshopId.ToString()),
|
||||||
new("WorkshopName",account.WorkshopName??"")
|
new("WorkshopName",account.WorkshopName??""),
|
||||||
|
new("pm.userId", account.PmUserId.ToString()),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,10 +27,12 @@ public class AuthViewModel
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public long SubAccountId { get; set; }
|
public long SubAccountId { get; set; }
|
||||||
|
public long? PmUserId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public AuthViewModel(long id, long roleId, string fullname, string username, string mobile,string profilePhoto,
|
public AuthViewModel(long id, long roleId, string fullname, string username, string mobile,string profilePhoto,
|
||||||
List<int> permissions, string roleName, string adminAreaPermission, string clientAriaPermission, int? positionValue, long subAccountId = 0)
|
List<int> permissions, string roleName, string adminAreaPermission, string clientAriaPermission, int? positionValue,
|
||||||
|
long subAccountId = 0,long? pmUserId = null)
|
||||||
{
|
{
|
||||||
Id = id;
|
Id = id;
|
||||||
RoleId = roleId;
|
RoleId = roleId;
|
||||||
@@ -44,6 +46,7 @@ public class AuthViewModel
|
|||||||
ClientAriaPermission = clientAriaPermission;
|
ClientAriaPermission = clientAriaPermission;
|
||||||
PositionValue = positionValue;
|
PositionValue = positionValue;
|
||||||
SubAccountId = subAccountId;
|
SubAccountId = subAccountId;
|
||||||
|
PmUserId = pmUserId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuthViewModel()
|
public AuthViewModel()
|
||||||
|
|||||||
237
0_Framework/Application/ClassificationRangeOfGroupRate.cs
Normal file
237
0_Framework/Application/ClassificationRangeOfGroupRate.cs
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace _0_Framework.Application;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دامنه امتیازات گروه های طبقه بندی مشاغل
|
||||||
|
/// </summary>
|
||||||
|
public static class ClassificationRangeOfGroupRate
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت فاصله امتیاز گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupNo"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static ClassificationGroupRate GetGroupDistanceRate(string groupNo)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (groupNo)
|
||||||
|
{
|
||||||
|
case "1":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 0,
|
||||||
|
HighRate = 80,
|
||||||
|
DistanceRate = 0,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "2":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 81,
|
||||||
|
HighRate = 95,
|
||||||
|
DistanceRate = 15,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "3":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 96,
|
||||||
|
HighRate = 110,
|
||||||
|
DistanceRate = 30, //فاصله سقف این گروه تا سقف گروه یک
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "4":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 111,
|
||||||
|
HighRate = 125,
|
||||||
|
DistanceRate = 45, //فاصله سقف این گروه تا سقف گروه یک
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "5":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 126,
|
||||||
|
HighRate = 145,
|
||||||
|
DistanceRate = 65, //فاصله سقف این گروه تا سقف گروه یک
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "6":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 146,
|
||||||
|
HighRate = 165,
|
||||||
|
DistanceRate = 85,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "7":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 166,
|
||||||
|
HighRate = 185,
|
||||||
|
DistanceRate = 105,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "8":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 186,
|
||||||
|
HighRate = 210,
|
||||||
|
DistanceRate = 130,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "9":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 211,
|
||||||
|
HighRate = 235,
|
||||||
|
DistanceRate = 155,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "10":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 236,
|
||||||
|
HighRate = 265,
|
||||||
|
DistanceRate = 185,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "11":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 266,
|
||||||
|
HighRate = 295,
|
||||||
|
DistanceRate = 215,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "12":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 296,
|
||||||
|
HighRate = 325,
|
||||||
|
DistanceRate = 245,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "13":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 326,
|
||||||
|
HighRate = 365,
|
||||||
|
DistanceRate = 285,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "14":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 366,
|
||||||
|
HighRate = 405,
|
||||||
|
DistanceRate = 325,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "15":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 406,
|
||||||
|
HighRate = 445,
|
||||||
|
DistanceRate = 365,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "16":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 446,
|
||||||
|
HighRate = 495,
|
||||||
|
DistanceRate = 415,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "17":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 496,
|
||||||
|
HighRate = 545,
|
||||||
|
DistanceRate = 465,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "18":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 546,
|
||||||
|
HighRate = 605,
|
||||||
|
DistanceRate = 525,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "19":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 606,
|
||||||
|
HighRate = 665,
|
||||||
|
DistanceRate = 585,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "20":
|
||||||
|
return new ClassificationGroupRate()
|
||||||
|
{
|
||||||
|
GroupNo = groupNo,
|
||||||
|
LowRate = 666,
|
||||||
|
HighRate = 740,
|
||||||
|
DistanceRate = 660,
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return new ClassificationGroupRate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دیتای امتیازات هر گرو
|
||||||
|
/// </summary>
|
||||||
|
public class ClassificationGroupRate
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شمازه گروه
|
||||||
|
/// </summary>
|
||||||
|
public string GroupNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// امتیاز کف
|
||||||
|
/// </summary>
|
||||||
|
public int LowRate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// امتیاز سقف
|
||||||
|
/// </summary>
|
||||||
|
public int HighRate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// فاصله امتیاز
|
||||||
|
/// </summary>
|
||||||
|
public int DistanceRate { get; set; }
|
||||||
|
}
|
||||||
14
0_Framework/Application/Enums/TypeOfCoefficient.cs
Normal file
14
0_Framework/Application/Enums/TypeOfCoefficient.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace _0_Framework.Application.Enums;
|
||||||
|
|
||||||
|
public enum TypeOfCoefficient
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ضریب ریالی طرح
|
||||||
|
/// </summary>
|
||||||
|
RialCoefficient,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ضریب ریالی اداره کار
|
||||||
|
/// </summary>
|
||||||
|
JobOrganization,
|
||||||
|
}
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
public enum TypeOfSmsSetting
|
public enum TypeOfSmsSetting
|
||||||
{
|
{
|
||||||
|
//همه انواع پیامک
|
||||||
|
All = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
@@ -23,7 +25,7 @@ public enum TypeOfSmsSetting
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک
|
/// پیامک
|
||||||
/// هشدار اول
|
/// هشدار بدهی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Warning,
|
Warning,
|
||||||
|
|
||||||
@@ -33,4 +35,24 @@ public enum TypeOfSmsSetting
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
LegalAction,
|
LegalAction,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک تایید قراداد
|
||||||
|
/// </summary>
|
||||||
|
InstitutionContractConfirm,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال کد تاییدیه قرارداد مالی
|
||||||
|
/// </summary>
|
||||||
|
SendInstitutionContractConfirmationCode,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لینک تاییدیه ایجاد قرارداد مالی
|
||||||
|
/// </summary>
|
||||||
|
SendInstitutionContractConfirmationLink,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// یادآور وظایف
|
||||||
|
/// </summary>
|
||||||
|
TaskReminder,
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ public interface IFaceEmbeddingService
|
|||||||
Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding, float confidence, Dictionary<string, object> metadata = null);
|
Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding, float confidence, Dictionary<string, object> metadata = null);
|
||||||
Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId);
|
Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId);
|
||||||
Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId);
|
Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId);
|
||||||
|
Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId, string newFullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class FaceEmbeddingResponse
|
public class FaceEmbeddingResponse
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public interface IAuthHelper
|
|||||||
string CurrentAccountRole();
|
string CurrentAccountRole();
|
||||||
AuthViewModel CurrentAccountInfo();
|
AuthViewModel CurrentAccountInfo();
|
||||||
List<int> GetPermissions();
|
List<int> GetPermissions();
|
||||||
|
bool HasPermission(int permission);
|
||||||
long CurrentAccountId();
|
long CurrentAccountId();
|
||||||
string CurrentAccountMobile();
|
string CurrentAccountMobile();
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace _0_Framework.Application;
|
|||||||
public class PagedResult<T> where T : class
|
public class PagedResult<T> where T : class
|
||||||
{
|
{
|
||||||
public int TotalCount { get; set; }
|
public int TotalCount { get; set; }
|
||||||
public List<T> List { get; set; }
|
public List<T> List { get; set; } = [];
|
||||||
}
|
}
|
||||||
public class PagedResult<T,TMeta>:PagedResult<T> where T : class
|
public class PagedResult<T,TMeta>:PagedResult<T> where T : class
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Net.Http;
|
|||||||
using System.Net.Http.Json;
|
using System.Net.Http.Json;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace _0_Framework.Application.PaymentGateway;
|
namespace _0_Framework.Application.PaymentGateway;
|
||||||
@@ -12,18 +13,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
{
|
{
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private const long TerminalId = 99213700;
|
private const long TerminalId = 99213700;
|
||||||
|
private readonly ILogger<SepehrPaymentGateway> _logger;
|
||||||
|
|
||||||
public SepehrPaymentGateway(IHttpClientFactory httpClient)
|
public SepehrPaymentGateway(IHttpClientFactory httpClient, ILogger<SepehrPaymentGateway> logger)
|
||||||
{
|
{
|
||||||
|
_logger = logger;
|
||||||
_httpClient = httpClient.CreateClient();
|
_httpClient = httpClient.CreateClient();
|
||||||
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
_httpClient.BaseAddress = new Uri("https://sepehr.shaparak.ir/Rest/V1/PeymentApi/");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Create(CreatePaymentGatewayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Create payment started. TransactionId: {TransactionId}, Amount: {Amount}", command.TransactionId, command.Amount);
|
||||||
command.ExtraData ??= new Dictionary<string, object>();
|
command.ExtraData ??= new Dictionary<string, object>();
|
||||||
|
_logger.LogInformation("Initializing extra data with FinancialInvoiceId: {FinancialInvoiceId}", command.FinancialInvoiceId);
|
||||||
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
command.ExtraData.Add("financialInvoiceId", command.FinancialInvoiceId);
|
||||||
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
var extraData = JsonConvert.SerializeObject(command.ExtraData);
|
||||||
|
_logger.LogInformation("Serialized extra data payload: {Payload}", extraData);
|
||||||
|
|
||||||
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
var res = await _httpClient.PostAsJsonAsync("GetToken", new
|
||||||
{
|
{
|
||||||
TerminalID = TerminalId,
|
TerminalID = TerminalId,
|
||||||
@@ -32,21 +39,25 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
callbackURL = command.CallBackUrl,
|
callbackURL = command.CallBackUrl,
|
||||||
payload = extraData
|
payload = extraData
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Create payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Create payment JSON parsed successfully.");
|
||||||
|
|
||||||
// گرفتن مقدار AccessToken
|
// گرفتن مقدار AccessToken
|
||||||
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
var accessToken = json.RootElement.GetProperty("Accesstoken").ToString();
|
||||||
var status = json.RootElement.GetProperty("Status").ToString();
|
var status = json.RootElement.GetProperty("Status").ToString();
|
||||||
|
_logger.LogInformation("Create payment parsed values. Status: {Status}, AccessToken: {AccessToken}", status, accessToken);
|
||||||
|
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
IsSuccess = status == "0",
|
IsSuccess = status == "0",
|
||||||
Token = accessToken
|
Token = accessToken,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,21 +66,24 @@ public class SepehrPaymentGateway:IPaymentGateway
|
|||||||
|
|
||||||
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
public async Task<PaymentGatewayResponse> Verify(VerifyPaymentGateWayRequest command, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("Verify payment started. DigitalReceipt: {DigitalReceipt}", command.DigitalReceipt);
|
||||||
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
var res = await _httpClient.PostAsJsonAsync("Advice", new
|
||||||
{
|
{
|
||||||
digitalreceipt = command.DigitalReceipt,
|
digitalreceipt = command.DigitalReceipt,
|
||||||
Tid = TerminalId,
|
Tid = TerminalId,
|
||||||
}, cancellationToken: cancellationToken);
|
}, cancellationToken: cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment request sent. StatusCode: {StatusCode}", res.StatusCode);
|
||||||
// خواندن محتوای پاسخ
|
// خواندن محتوای پاسخ
|
||||||
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
var content = await res.Content.ReadAsStringAsync(cancellationToken);
|
||||||
|
_logger.LogInformation("Verify payment response content: {Content}", content);
|
||||||
|
|
||||||
// تبدیل پاسخ JSON به آبجکت داتنت
|
// تبدیل پاسخ JSON به آبجکت داتنت
|
||||||
var json = System.Text.Json.JsonDocument.Parse(content);
|
var json = System.Text.Json.JsonDocument.Parse(content);
|
||||||
|
_logger.LogInformation("Verify payment JSON parsed successfully.");
|
||||||
|
|
||||||
var message = json.RootElement.GetProperty("Message").GetString();
|
var message = json.RootElement.GetProperty("Message").GetString();
|
||||||
var status = json.RootElement.GetProperty("Status").GetString();
|
var status = json.RootElement.GetProperty("Status").GetString();
|
||||||
|
_logger.LogInformation("Verify payment parsed values. Status: {Status}, Message: {Message}", status, message);
|
||||||
return new PaymentGatewayResponse
|
return new PaymentGatewayResponse
|
||||||
{
|
{
|
||||||
Status = status,
|
Status = status,
|
||||||
|
|||||||
13
0_Framework/Application/SecretKeys.cs
Normal file
13
0_Framework/Application/SecretKeys.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace _0_Framework.Application;
|
||||||
|
|
||||||
|
public static class SecretKeys
|
||||||
|
{
|
||||||
|
|
||||||
|
public static string ProgramManagerInternalApi => "JOb09$Ic3NJd0siLCJtYWMiOiI2%dmODJmNDV";
|
||||||
|
}
|
||||||
@@ -18,3 +18,34 @@ public class ApiResultViewModel
|
|||||||
public string DeliveryColor { get; set; }
|
public string DeliveryColor { get; set; }
|
||||||
public string FullName { get; set; }
|
public string FullName { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class ApiReportDto
|
||||||
|
{
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
|
||||||
|
public long Mobile { get; set; }
|
||||||
|
|
||||||
|
public string SendUnixTime { get; set; }
|
||||||
|
public string DeliveryState { get; set; }
|
||||||
|
public string DeliveryUnixTime { get; set; }
|
||||||
|
public string DeliveryColor { get; set; }
|
||||||
|
public string FullName { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SmsDetailsDto
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public string MessageText { get; set; }
|
||||||
|
|
||||||
|
public long Mobile { get; set; }
|
||||||
|
|
||||||
|
public string SendUnixTime { get; set; }
|
||||||
|
public string DeliveryState { get; set; }
|
||||||
|
public string DeliveryUnixTime { get; set; }
|
||||||
|
public string DeliveryColor { get; set; }
|
||||||
|
public string FullName { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
@@ -16,9 +16,22 @@ public interface ISmsService
|
|||||||
/// <param name="code"></param>
|
/// <param name="code"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<SentSmsViewModel> SendVerifyCodeToClient(string number, string code);
|
Task<SentSmsViewModel> SendVerifyCodeToClient(string number, string code);
|
||||||
bool SendAccountsInfo(string number,string fullName, string userName);
|
bool SendAccountsInfo(string number, string fullName, string userName);
|
||||||
Task<ApiResultViewModel> GetByMessageId(int messId);
|
Task<ApiResultViewModel> GetByMessageId(int messId);
|
||||||
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
Task<List<ApiResultViewModel>> GetApiResult(string startDate, string endDate);
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
|
||||||
|
Task<List<ApiReportDto>> GetApiReport(string startDate, string endDate);
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت جزئیات پیامک
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messId"></param>
|
||||||
|
/// <param name="fullName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<SmsDetailsDto> GetSmsDetailsByMessageId(int messId, string fullName);
|
||||||
|
#endregion
|
||||||
|
|
||||||
string DeliveryStatus(byte? dv);
|
string DeliveryStatus(byte? dv);
|
||||||
string DeliveryColorStatus(byte? dv);
|
string DeliveryColorStatus(byte? dv);
|
||||||
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
string UnixTimeStampToDateTime(int? unixTimeStamp);
|
||||||
@@ -27,7 +40,7 @@ public interface ISmsService
|
|||||||
|
|
||||||
Task<double> GetCreditAmount();
|
Task<double> GetCreditAmount();
|
||||||
|
|
||||||
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId);
|
public Task<bool> SendInstitutionCreationVerificationLink(string number, string fullName, Guid institutionId, long contractingPartyId, long institutionContractId, string typeOfSms = null);
|
||||||
|
|
||||||
public Task<bool> SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
|
public Task<bool> SendInstitutionVerificationCode(string number, string code, string contractingPartyFullName,
|
||||||
long contractingPartyId, long institutionContractId);
|
long contractingPartyId, long institutionContractId);
|
||||||
@@ -64,6 +77,7 @@ public interface ISmsService
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پیامک مسدودی طرف حساب
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قراردادهای قدیم
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="number"></param>
|
/// <param name="number"></param>
|
||||||
/// <param name="fullname"></param>
|
/// <param name="fullname"></param>
|
||||||
@@ -74,6 +88,19 @@ public interface ISmsService
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, string id, string aprove);
|
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessage(string number, string fullname, string amount, string accountType, string id, string aprove);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک مسدودی طرف حساب
|
||||||
|
/// قرارداد های جدید
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="number"></param>
|
||||||
|
/// <param name="fullname"></param>
|
||||||
|
/// <param name="amount"></param>
|
||||||
|
/// <param name="code1"></param>
|
||||||
|
/// <param name="code2"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(byte status, string message, int messaeId, bool isSucceded)> BlockMessageForElectronicContract(string number,
|
||||||
|
string fullname,
|
||||||
|
string amount, string code1, string code2);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region AlarmMessage
|
#region AlarmMessage
|
||||||
|
|||||||
@@ -31,12 +31,24 @@ public static class StaticWorkshopAccounts
|
|||||||
/// 381 - مهدی قربانی
|
/// 381 - مهدی قربانی
|
||||||
/// 392 - عمار حسن دوست
|
/// 392 - عمار حسن دوست
|
||||||
/// 20 - سمیرا الهی نیا
|
/// 20 - سمیرا الهی نیا
|
||||||
|
/// 322 - ماهان چمنی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20];
|
public static List<long> StaticAccountIds = [2, 3, 380, 381, 392, 20, 476,322];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
/// این تاریخ در جدول اکانت لفت ورک به این معنیست
|
||||||
/// که کاربر همچنان به کارگاه دسترسی دارد
|
/// که کاربر همچنان به کارگاه دسترسی دارد
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static DateTime ContinuesWorkingDate = new DateTime(2150, 1, 1);
|
public static DateTime ContinuesWorkingDate = new DateTime(2150, 1, 1);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیستی آی دی نقش هایی که مسئول بیمه کارگاه هستند
|
||||||
|
/// 7 : بیمه ارشد
|
||||||
|
/// 8 : بیمه ساده
|
||||||
|
/// </summary>
|
||||||
|
public static List<long> InsuranceAccountsRoleIds = [7, 8];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -33,6 +33,35 @@ public static class Tools
|
|||||||
public static string[] DayNames = { "شنبه", "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه" };
|
public static string[] DayNames = { "شنبه", "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه" };
|
||||||
public static string[] DayNamesG = { "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه", "شنبه" };
|
public static string[] DayNamesG = { "یکشنبه", "دو شنبه", "سه شنبه", "چهار شنبه", "پنج شنبه", "جمعه", "شنبه" };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام ستون از جدول مزد سنوات طبثه بندی را میگیرد و دیتای داخل آن ستون را برمیگرداند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="obj"></param>
|
||||||
|
/// <param name="propertyName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static double? GetDynamicDouble(object obj, string propertyName)
|
||||||
|
{
|
||||||
|
if (obj == null || string.IsNullOrWhiteSpace(propertyName))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var propertyInfo = obj.GetType().GetProperty(propertyName);
|
||||||
|
if (propertyInfo == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var value = propertyInfo.GetValue(obj);
|
||||||
|
if (value == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return Convert.ToDouble(value);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static bool IsMobileValid(this string mobileNo)
|
public static bool IsMobileValid(this string mobileNo)
|
||||||
{
|
{
|
||||||
@@ -41,6 +70,33 @@ public static class Tools
|
|||||||
return Regex.IsMatch(mobileNo, "^((09))(\\d{9})$");
|
return Regex.IsMatch(mobileNo, "^((09))(\\d{9})$");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// متد رند کننده مبلغ
|
||||||
|
/// استفاده شده در بیمه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static double GetRoundDoubleValue(double value)
|
||||||
|
{
|
||||||
|
string strValue = value.ToString();
|
||||||
|
if (strValue.IndexOf('.') > -1)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
string a = strValue.Substring(strValue.IndexOf('.') + 1, 1);
|
||||||
|
if (int.Parse(a) > 5)
|
||||||
|
{
|
||||||
|
return (Math.Round(value, MidpointRounding.ToPositiveInfinity));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (Math.Round(value, MidpointRounding.ToNegativeInfinity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// تاریخ شروع و تعداد ماه را میگیرد و تاریخ پایان قراردا را بر میگرداند
|
/// تاریخ شروع و تعداد ماه را میگیرد و تاریخ پایان قراردا را بر میگرداند
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -445,6 +501,30 @@ public static class Tools
|
|||||||
|
|
||||||
return myMoney.ToString("N0", CultureInfo.CreateSpecificCulture("fa-ir"));
|
return myMoney.ToString("N0", CultureInfo.CreateSpecificCulture("fa-ir"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// اگر مبلغ صفر باشد خط تیره برمیگرداند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="myMoney"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string ToMoneyCheckZero(this double myMoney)
|
||||||
|
{
|
||||||
|
if (myMoney == 0)
|
||||||
|
return "-";
|
||||||
|
return myMoney.ToString("N0", CultureInfo.CreateSpecificCulture("fa-ir"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// اگر مبلغ صفر یا نال باشد خط تیره برمیگرداند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="myMoney"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string ToMoneyCheckZeroNullable(this double? myMoney)
|
||||||
|
{
|
||||||
|
if (myMoney == 0 || myMoney == null)
|
||||||
|
return "-";
|
||||||
|
return myMoney?.ToString("N0", CultureInfo.CreateSpecificCulture("fa-ir"));
|
||||||
|
}
|
||||||
public static string ToMoneyNullable(this double? myMoney)
|
public static string ToMoneyNullable(this double? myMoney)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -626,7 +706,115 @@ public static class Tools
|
|||||||
return y2;
|
return y2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شمسی میگیرد و پایان ماه را به میلادی برمیگرداند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="date"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static DateTime FindeEndOfMonthReturnGr(this string date)
|
||||||
|
{
|
||||||
|
string y2 = string.Empty;
|
||||||
|
var year = Convert.ToInt32(date.Substring(0, 4));
|
||||||
|
var month = Convert.ToInt32(date.Substring(5, 2));
|
||||||
|
var YearD = date.Substring(0, 4);
|
||||||
|
var MonthD = date.Substring(5, 2);
|
||||||
|
if (month <= 6)
|
||||||
|
{
|
||||||
|
y2 = $"{YearD}/{MonthD}/31";
|
||||||
|
}
|
||||||
|
else if (month > 6 && month < 12)
|
||||||
|
{
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
}
|
||||||
|
else if (month == 12)
|
||||||
|
{
|
||||||
|
switch (year)
|
||||||
|
{
|
||||||
|
case 1346:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1350:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1354:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1358:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1362:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1366:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1370:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1375:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1379:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1383:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1387:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1391:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1395:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1399:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1403:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1408:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1412:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1416:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1420:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1424:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1428:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1432:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1436:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1441:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
case 1445:
|
||||||
|
y2 = $"{YearD}/{MonthD}/30";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
y2 = $"{YearD}/{MonthD}/29";
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return y2.ToGeorgianDateTime();
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// تعداد روزهای سال را برمیگرداند
|
/// تعداد روزهای سال را برمیگرداند
|
||||||
/// اگر کبیسهد بود سال 366 روزه برمیگرداند
|
/// اگر کبیسهد بود سال 366 روزه برمیگرداند
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public interface IRepository<TKey, T> where T:class
|
|||||||
{
|
{
|
||||||
T Get(TKey id);
|
T Get(TKey id);
|
||||||
List<T> Get();
|
List<T> Get();
|
||||||
|
Task<List<T>> GetListByIdList(List<TKey> ids);
|
||||||
void Create(T entity);
|
void Create(T entity);
|
||||||
Task CreateAsync(T entity);
|
Task CreateAsync(T entity);
|
||||||
bool ExistsIgnoreQueryFilter(Expression<Func<T, bool>> expression);
|
bool ExistsIgnoreQueryFilter(Expression<Func<T, bool>> expression);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class ExcelGenerator
|
|||||||
{
|
{
|
||||||
public ExcelGenerator()
|
public ExcelGenerator()
|
||||||
{
|
{
|
||||||
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
OfficeOpenXml.ExcelPackage.License.SetNonCommercialOrganization("Gozareshgir Noncommercial organization");
|
||||||
}
|
}
|
||||||
public static byte[] GenerateExcel<T>(List<T> obj, string date = "") where T : class
|
public static byte[] GenerateExcel<T>(List<T> obj, string date = "") where T : class
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
using System;
|
#nullable enable
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using FluentValidation;
|
||||||
using Microsoft.AspNetCore.Diagnostics;
|
using Microsoft.AspNetCore.Diagnostics;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -21,12 +24,24 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
|
|
||||||
public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken)
|
public async ValueTask<bool> TryHandleAsync(HttpContext context, Exception exception, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
_logger.LogError(
|
_logger.LogError(exception,
|
||||||
"Error Message: {exceptionMessage}, Time of occurrence {time}",
|
"Error Message: {exceptionMessage}, Type: {exceptionType}, Time: {time}, Path: {path}, TraceId: {traceId}",
|
||||||
exception.Message, DateTime.UtcNow);
|
exception.Message,
|
||||||
|
exception.GetType().FullName,
|
||||||
|
DateTime.UtcNow,
|
||||||
|
context.Request.Path,
|
||||||
|
context.TraceIdentifier);
|
||||||
|
|
||||||
(string Detail, string Title, int StatusCode, Dictionary<string, object>? Extra) details = exception switch
|
(string Detail, string Title, int StatusCode, Dictionary<string, object>? Extra) details = exception switch
|
||||||
{
|
{
|
||||||
|
ValidationException validationException =>
|
||||||
|
(
|
||||||
|
validationException.Errors.FirstOrDefault()?.ErrorMessage ?? "One or more validation errors occurred.",
|
||||||
|
"Validation Error",
|
||||||
|
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||||
|
null
|
||||||
|
),
|
||||||
|
|
||||||
InternalServerException =>
|
InternalServerException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -34,6 +49,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
context.Response.StatusCode = StatusCodes.Status500InternalServerError,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
BadRequestException bre =>
|
BadRequestException bre =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -41,6 +57,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
context.Response.StatusCode = StatusCodes.Status400BadRequest,
|
||||||
bre.Extra
|
bre.Extra
|
||||||
),
|
),
|
||||||
|
|
||||||
NotFoundException =>
|
NotFoundException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -48,6 +65,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
context.Response.StatusCode = StatusCodes.Status404NotFound,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
UnAuthorizeException =>
|
UnAuthorizeException =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -55,6 +73,7 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
context.Response.StatusCode = StatusCodes.Status401Unauthorized,
|
||||||
null
|
null
|
||||||
),
|
),
|
||||||
|
|
||||||
_ =>
|
_ =>
|
||||||
(
|
(
|
||||||
exception.Message,
|
exception.Message,
|
||||||
@@ -73,8 +92,6 @@ public class CustomExceptionHandler : IExceptionHandler
|
|||||||
Extensions = details.Extra ?? new Dictionary<string, object>()
|
Extensions = details.Extra ?? new Dictionary<string, object>()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
problemDetails.Extensions.Add("traceId", context.TraceIdentifier);
|
||||||
|
|
||||||
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
await context.Response.WriteAsJsonAsync(problemDetails, cancellationToken: cancellationToken);
|
||||||
|
|||||||
@@ -18,329 +18,387 @@ namespace _0_Framework.Infrastructure;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class FaceEmbeddingService : IFaceEmbeddingService
|
public class FaceEmbeddingService : IFaceEmbeddingService
|
||||||
{
|
{
|
||||||
private readonly IHttpClientFactory _httpClientFactory;
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private readonly ILogger<FaceEmbeddingService> _logger;
|
private readonly ILogger<FaceEmbeddingService> _logger;
|
||||||
private readonly IFaceEmbeddingNotificationService _notificationService;
|
private readonly IFaceEmbeddingNotificationService _notificationService;
|
||||||
private readonly string _apiBaseUrl;
|
private readonly string _apiBaseUrl;
|
||||||
|
|
||||||
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
public FaceEmbeddingService(IHttpClientFactory httpClientFactory, ILogger<FaceEmbeddingService> logger,
|
||||||
IFaceEmbeddingNotificationService notificationService = null)
|
IFaceEmbeddingNotificationService notificationService = null)
|
||||||
{
|
{
|
||||||
_httpClientFactory = httpClientFactory;
|
_httpClientFactory = httpClientFactory;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_notificationService = notificationService;
|
_notificationService = notificationService;
|
||||||
_apiBaseUrl = "http://localhost:8000";
|
_apiBaseUrl = "http://localhost:8000";
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
public async Task<OperationResult> GenerateEmbeddingsAsync(long employeeId, long workshopId,
|
||||||
string employeeFullName, string picture1Path, string picture2Path)
|
string employeeFullName, string picture1Path, string picture2Path)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
using var content = new MultipartFormDataContent();
|
using var content = new MultipartFormDataContent();
|
||||||
|
|
||||||
// Add form fields
|
// Add form fields
|
||||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||||
|
|
||||||
// Add picture files
|
// Add picture files
|
||||||
if (File.Exists(picture1Path))
|
if (File.Exists(picture1Path))
|
||||||
{
|
{
|
||||||
var picture1Bytes = await File.ReadAllBytesAsync(picture1Path);
|
var picture1Bytes = await File.ReadAllBytesAsync(picture1Path);
|
||||||
var picture1Content = new ByteArrayContent(picture1Bytes);
|
var picture1Content = new ByteArrayContent(picture1Bytes);
|
||||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||||
content.Add(picture1Content, "picture1", "1.jpg");
|
content.Add(picture1Content, "picture1", "1.jpg");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Picture1 not found at path: {Path}", picture1Path);
|
_logger.LogWarning("Picture1 not found at path: {Path}", picture1Path);
|
||||||
return new OperationResult { IsSuccedded = false, Message = "تصویر اول یافت نشد" };
|
return new OperationResult { IsSuccedded = false, Message = "تصویر اول یافت نشد" };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (File.Exists(picture2Path))
|
if (File.Exists(picture2Path))
|
||||||
{
|
{
|
||||||
var picture2Bytes = await File.ReadAllBytesAsync(picture2Path);
|
var picture2Bytes = await File.ReadAllBytesAsync(picture2Path);
|
||||||
var picture2Content = new ByteArrayContent(picture2Bytes);
|
var picture2Content = new ByteArrayContent(picture2Bytes);
|
||||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||||
content.Add(picture2Content, "picture2", "2.jpg");
|
content.Add(picture2Content, "picture2", "2.jpg");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Picture2 not found at path: {Path}", picture2Path);
|
_logger.LogWarning("Picture2 not found at path: {Path}", picture2Path);
|
||||||
return new OperationResult { IsSuccedded = false, Message = "تصویر دوم یافت نشد" };
|
return new OperationResult { IsSuccedded = false, Message = "تصویر دوم یافت نشد" };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send request to Python API
|
// Send request to Python API
|
||||||
var response = await httpClient.PostAsync("embeddings", content);
|
var response = await httpClient.PostAsync("embeddings", content);
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
var responseContent = await response.Content.ReadAsStringAsync();
|
var responseContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogInformation("Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
_logger.LogInformation(
|
||||||
employeeId, workshopId);
|
"Embeddings generated successfully for Employee {EmployeeId}, Workshop {WorkshopId}",
|
||||||
|
employeeId, workshopId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
if (_notificationService != null)
|
if (_notificationService != null)
|
||||||
{
|
{
|
||||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = true,
|
IsSuccedded = true,
|
||||||
Message = "Embedding با موفقیت ایجاد شد"
|
Message = "Embedding با موفقیت ایجاد شد"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = await response.Content.ReadAsStringAsync();
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogError("Failed to generate embeddings. Status: {StatusCode}, Error: {Error}",
|
_logger.LogError("Failed to generate embeddings. Status: {StatusCode}, Error: {Error}",
|
||||||
response.StatusCode, errorContent);
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "HTTP error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "HTTP error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = "خطا در ارتباط با سرور Embedding"
|
Message = "خطا در ارتباط با سرور Embedding"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while calling embeddings API for Employee {EmployeeId}", employeeId);
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = "خطای غیرمنتظره در تولید Embedding"
|
Message = "خطای غیرمنتظره در تولید Embedding"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult> GenerateEmbeddingsFromStreamAsync(long employeeId, long workshopId,
|
public async Task<OperationResult> GenerateEmbeddingsFromStreamAsync(long employeeId, long workshopId,
|
||||||
string employeeFullName, Stream picture1Stream, Stream picture2Stream)
|
string employeeFullName, Stream picture1Stream, Stream picture2Stream)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
using var content = new MultipartFormDataContent();
|
using var content = new MultipartFormDataContent();
|
||||||
|
|
||||||
// Add form fields
|
// Add form fields
|
||||||
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
content.Add(new StringContent(employeeId.ToString()), "employee_id");
|
||||||
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
content.Add(new StringContent(workshopId.ToString()), "workshop_id");
|
||||||
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
content.Add(new StringContent(employeeFullName ?? ""), "employee_full_name");
|
||||||
|
|
||||||
// Add picture streams
|
// Add picture streams
|
||||||
var picture1Content = new StreamContent(picture1Stream);
|
var picture1Content = new StreamContent(picture1Stream);
|
||||||
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
picture1Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||||
content.Add(picture1Content, "picture1", "1.jpg");
|
content.Add(picture1Content, "picture1", "1.jpg");
|
||||||
|
|
||||||
var picture2Content = new StreamContent(picture2Stream);
|
var picture2Content = new StreamContent(picture2Stream);
|
||||||
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
picture2Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
|
||||||
content.Add(picture2Content, "picture2", "2.jpg");
|
content.Add(picture2Content, "picture2", "2.jpg");
|
||||||
|
|
||||||
// Send request to Python API
|
// Send request to Python API
|
||||||
var response = await httpClient.PostAsync("embeddings", content);
|
var response = await httpClient.PostAsync("embeddings", content);
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}", employeeId);
|
_logger.LogInformation("Embeddings generated successfully from streams for Employee {EmployeeId}",
|
||||||
|
employeeId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
if (_notificationService != null)
|
if (_notificationService != null)
|
||||||
{
|
{
|
||||||
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
await _notificationService.NotifyEmbeddingCreatedAsync(workshopId, employeeId, employeeFullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OperationResult { IsSuccedded = true, Message = "Embedding با موفقیت ایجاد شد" };
|
return new OperationResult { IsSuccedded = true, Message = "Embedding با موفقیت ایجاد شد" };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = await response.Content.ReadAsStringAsync();
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogError("Failed to generate embeddings from streams. Status: {StatusCode}, Error: {Error}",
|
_logger.LogError("Failed to generate embeddings from streams. Status: {StatusCode}, Error: {Error}",
|
||||||
response.StatusCode, errorContent);
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
Message = $"خطا در تولید Embedding: {response.StatusCode}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while generating embeddings from streams for Employee {EmployeeId}",
|
||||||
return new OperationResult
|
employeeId);
|
||||||
{
|
return new OperationResult
|
||||||
IsSuccedded = false,
|
{
|
||||||
Message = "خطا در تولید Embedding"
|
IsSuccedded = false,
|
||||||
};
|
Message = "خطا در تولید Embedding"
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding,
|
public async Task<OperationResult> RefineEmbeddingAsync(long employeeId, long workshopId, float[] embedding,
|
||||||
float confidence, Dictionary<string, object> metadata = null)
|
float confidence, Dictionary<string, object> metadata = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
var requestBody = new
|
var requestBody = new
|
||||||
{
|
{
|
||||||
employeeId,
|
employeeId,
|
||||||
workshopId,
|
workshopId,
|
||||||
embedding,
|
embedding,
|
||||||
confidence,
|
confidence,
|
||||||
metadata = metadata ?? new Dictionary<string, object>()
|
metadata = metadata ?? new Dictionary<string, object>()
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await httpClient.PostAsJsonAsync("embeddings/refine", requestBody);
|
var response = await httpClient.PostAsJsonAsync("embeddings/refine", requestBody);
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Embedding refined successfully for Employee {EmployeeId}", employeeId);
|
_logger.LogInformation("Embedding refined successfully for Employee {EmployeeId}", employeeId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
if (_notificationService != null)
|
if (_notificationService != null)
|
||||||
{
|
{
|
||||||
await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OperationResult { IsSuccedded = true, Message = "Embedding بهبود یافت" };
|
return new OperationResult { IsSuccedded = true, Message = "Embedding بهبود یافت" };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = await response.Content.ReadAsStringAsync();
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||||
response.StatusCode, errorContent);
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while refining embedding for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while refining embedding for Employee {EmployeeId}", employeeId);
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = "خطا در بهبود Embedding"
|
Message = "خطا در بهبود Embedding"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId)
|
public async Task<OperationResult> DeleteEmbeddingAsync(long employeeId, long workshopId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
var response = await httpClient.DeleteAsync($"embeddings/{workshopId}/{employeeId}");
|
var response = await httpClient.DeleteAsync($"embeddings/{workshopId}/{employeeId}");
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Embedding deleted successfully for Employee {EmployeeId}", employeeId);
|
_logger.LogInformation("Embedding deleted successfully for Employee {EmployeeId}", employeeId);
|
||||||
|
|
||||||
// ارسال اطلاعرسانی به سایر سیستمها
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
if (_notificationService != null)
|
if (_notificationService != null)
|
||||||
{
|
{
|
||||||
await _notificationService.NotifyEmbeddingDeletedAsync(workshopId, employeeId);
|
await _notificationService.NotifyEmbeddingDeletedAsync(workshopId, employeeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OperationResult { IsSuccedded = true, Message = "Embedding حذف شد" };
|
return new OperationResult { IsSuccedded = true, Message = "Embedding حذف شد" };
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = await response.Content.ReadAsStringAsync();
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogError("Failed to delete embedding. Status: {StatusCode}, Error: {Error}",
|
_logger.LogError("Failed to delete embedding. Status: {StatusCode}, Error: {Error}",
|
||||||
response.StatusCode, errorContent);
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = $"خطا در حذف Embedding: {response.StatusCode}"
|
Message = $"خطا در حذف Embedding: {response.StatusCode}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while deleting embedding for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while deleting embedding for Employee {EmployeeId}", employeeId);
|
||||||
return new OperationResult
|
return new OperationResult
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = "خطا در حذف Embedding"
|
Message = "خطا در حذف Embedding"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId)
|
public async Task<OperationResult<FaceEmbeddingResponse>> GetEmbeddingAsync(long employeeId, long workshopId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var httpClient = _httpClientFactory.CreateClient();
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
var response = await httpClient.GetAsync($"embeddings/{workshopId}/{employeeId}");
|
var response = await httpClient.GetAsync($"embeddings/{workshopId}/{employeeId}");
|
||||||
|
|
||||||
if (response.IsSuccessStatusCode)
|
if (response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
var embeddingData = JsonSerializer.Deserialize<FaceEmbeddingResponse>(content,
|
var embeddingData = JsonSerializer.Deserialize<FaceEmbeddingResponse>(content,
|
||||||
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
||||||
|
|
||||||
_logger.LogInformation("Embedding retrieved successfully for Employee {EmployeeId}", employeeId);
|
_logger.LogInformation("Embedding retrieved successfully for Employee {EmployeeId}", employeeId);
|
||||||
|
|
||||||
return new OperationResult<FaceEmbeddingResponse>
|
return new OperationResult<FaceEmbeddingResponse>
|
||||||
{
|
{
|
||||||
IsSuccedded = true,
|
IsSuccedded = true,
|
||||||
Message = "Embedding دریافت شد",
|
Message = "Embedding دریافت شد",
|
||||||
Data = embeddingData
|
Data = embeddingData
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = await response.Content.ReadAsStringAsync();
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
_logger.LogError("Failed to get embedding. Status: {StatusCode}, Error: {Error}",
|
_logger.LogError("Failed to get embedding. Status: {StatusCode}, Error: {Error}",
|
||||||
response.StatusCode, errorContent);
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
return new OperationResult<FaceEmbeddingResponse>
|
return new OperationResult<FaceEmbeddingResponse>
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = $"خطا در دریافت Embedding: {response.StatusCode}"
|
Message = $"خطا در دریافت Embedding: {response.StatusCode}"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Error while getting embedding for Employee {EmployeeId}", employeeId);
|
_logger.LogError(ex, "Error while getting embedding for Employee {EmployeeId}", employeeId);
|
||||||
return new OperationResult<FaceEmbeddingResponse>
|
return new OperationResult<FaceEmbeddingResponse>
|
||||||
{
|
{
|
||||||
IsSuccedded = false,
|
IsSuccedded = false,
|
||||||
Message = "خطا در دریافت Embedding"
|
Message = "خطا در دریافت Embedding"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<OperationResult> UpdateEmbeddingFullNameAsync(long employeeId, long workshopId,
|
||||||
|
string newFullName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var httpClient = _httpClientFactory.CreateClient();
|
||||||
|
httpClient.BaseAddress = new Uri(_apiBaseUrl);
|
||||||
|
httpClient.Timeout = TimeSpan.FromSeconds(30);
|
||||||
|
|
||||||
|
var requestBody = new
|
||||||
|
{
|
||||||
|
employee_id = employeeId,
|
||||||
|
workshop_id = workshopId,
|
||||||
|
employee_full_name = newFullName
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await httpClient.PutAsJsonAsync("embeddings/update-name", requestBody);
|
||||||
|
|
||||||
|
if (response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("Employee Name Changed For {EmployeeId} In workshop ={WorkshopId}", employeeId,
|
||||||
|
workshopId);
|
||||||
|
|
||||||
|
// ارسال اطلاعرسانی به سایر سیستمها
|
||||||
|
if (_notificationService != null)
|
||||||
|
{
|
||||||
|
//await _notificationService.NotifyEmbeddingRefinedAsync(workshopId, employeeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new OperationResult { IsSuccedded = true, Message = "عملیات با موفقیت انجام شد" };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var errorContent = await response.Content.ReadAsStringAsync();
|
||||||
|
_logger.LogError("Failed to refine embedding. Status: {StatusCode}, Error: {Error}",
|
||||||
|
response.StatusCode, errorContent);
|
||||||
|
|
||||||
|
return new OperationResult
|
||||||
|
{
|
||||||
|
IsSuccedded = false,
|
||||||
|
Message = $"خطا در بهبود Embedding: {response.StatusCode}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error while Changing EmployeeFullName for Employee {EmployeeId}", employeeId);
|
||||||
|
return new OperationResult
|
||||||
|
{
|
||||||
|
IsSuccedded = false,
|
||||||
|
Message = "خطا در بهبود Embedding"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -27,4 +27,3 @@ public class NullFaceEmbeddingNotificationService : IFaceEmbeddingNotificationSe
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,11 @@ namespace _0_Framework.InfraStructure
|
|||||||
{
|
{
|
||||||
return _context.Set<T>().ToList();
|
return _context.Set<T>().ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<T>> GetListByIdList(List<TKey> ids)
|
||||||
|
{
|
||||||
|
return await _context.Set<T>().Where(e => ids.Contains(EF.Property<TKey>(e, "id"))).ToListAsync();
|
||||||
|
}
|
||||||
public void Remove(T entity)
|
public void Remove(T entity)
|
||||||
{
|
{
|
||||||
_context.Set<T>().Remove(entity);
|
_context.Set<T>().Remove(entity);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using AccountManagement.Application.Contracts.Role;
|
using AccountManagement.Application.Contracts.Role;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
|
|
||||||
@@ -35,4 +36,20 @@ public class CreateAccount
|
|||||||
public string Email { get; set; }
|
public string Email { get; set; }
|
||||||
public string VerifyCode { get; set; }
|
public string VerifyCode { get; set; }
|
||||||
public string IsActiveString { get; set; }
|
public string IsActiveString { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آیا کاربر در پروگرام منیجر فعالیت مبکند؟
|
||||||
|
/// </summary>
|
||||||
|
public bool IsProgramManagerUser { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// لیست نقش های پروگرام منیجر
|
||||||
|
/// </summary>
|
||||||
|
public List<long> UserRoles { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیست نقشهای موجود در پروگرام منیجر
|
||||||
|
/// </summary>
|
||||||
|
public SelectList RoleList { get; set; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,4 +3,5 @@
|
|||||||
public class EditAccount : CreateAccount
|
public class EditAccount : CreateAccount
|
||||||
{
|
{
|
||||||
public long Id { get; set; }
|
public long Id { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
|
||||||
|
|
||||||
public class EditClientAccount : RegisterAccount
|
public class EditClientAccount : RegisterAccount
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,15 +2,21 @@
|
|||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Shared.Contracts.PmUser.Queries;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
|
|
||||||
public interface IAccountApplication
|
public interface IAccountApplication
|
||||||
{
|
{
|
||||||
AccountViewModel GetAccountBy(long id);
|
AccountViewModel GetAccountBy(long id);
|
||||||
OperationResult Create(CreateAccount command);
|
/// <summary>
|
||||||
|
/// ایجاد کاربر گزارشگیر و پروگرام منیجر
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<OperationResult> Create(CreateAccount command);
|
||||||
OperationResult RegisterClient(RegisterAccount command);
|
OperationResult RegisterClient(RegisterAccount command);
|
||||||
OperationResult Edit(EditAccount command);
|
Task<OperationResult> Edit(EditAccount command);
|
||||||
OperationResult EditClient(EditClientAccount command);
|
OperationResult EditClient(EditClientAccount command);
|
||||||
OperationResult ChangePassword(ChangePassword command);
|
OperationResult ChangePassword(ChangePassword command);
|
||||||
OperationResult Login(Login command);
|
OperationResult Login(Login command);
|
||||||
@@ -28,7 +34,7 @@ public interface IAccountApplication
|
|||||||
OperationResult DeActive(long id);
|
OperationResult DeActive(long id);
|
||||||
OperationResult DirectLogin(long id);
|
OperationResult DirectLogin(long id);
|
||||||
|
|
||||||
AccountLeftWorkViewModel WorkshopList(long accountId);
|
// AccountLeftWorkViewModel WorkshopList(long accountId);
|
||||||
OperationResult SaveWorkshopAccount(
|
OperationResult SaveWorkshopAccount(
|
||||||
List<WorkshopAccountlistViewModel> workshopAccountList,
|
List<WorkshopAccountlistViewModel> workshopAccountList,
|
||||||
string startDate,
|
string startDate,
|
||||||
@@ -67,6 +73,8 @@ public interface IAccountApplication
|
|||||||
List<AccountViewModel> GetAdminAccountsNew();
|
List<AccountViewModel> GetAdminAccountsNew();
|
||||||
|
|
||||||
void CameraLogin(CameraLoginRequest request);
|
void CameraLogin(CameraLoginRequest request);
|
||||||
|
|
||||||
|
Task<GetPmUserDto> GetPmUserAsync(long accountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CameraLoginRequest
|
public class CameraLoginRequest
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace AccountManagement.Application.Contracts.Account;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Account;
|
|
||||||
|
|
||||||
public class WorkshopSelectList
|
public class WorkshopSelectList
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,21 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<NuGetAudit>false</NuGetAudit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||||
|
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
||||||
|
<ProjectReference Include="..\Shared.Contracts\Shared.Contracts.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
public record ApiResponse
|
||||||
|
{
|
||||||
|
public bool isSuccess { get; set; }
|
||||||
|
public string errorMessage { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public ErrorType ErrorType { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
|
||||||
|
public record CreateProgramManagerRole
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// نام نقش
|
||||||
|
/// </summary>
|
||||||
|
public string RoleName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// کدهای دسترسی
|
||||||
|
/// </summary>
|
||||||
|
public List<int> Permissions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی اکانت گزارشگیر
|
||||||
|
/// </summary>
|
||||||
|
public long? GozareshgirRoleId { get; set; }
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
public record CreateProgramManagerUser(string FullName, string UserName, string Password, string Mobile, string Email, long? AccountId, List<long> Roles);
|
||||||
|
|
||||||
|
public record EditUserCommand(string FullName, string UserName, string Mobile, long AccountId, List<long> Roles, bool IsActive);
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
public enum ErrorType
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
BadRequest,
|
||||||
|
NotFound,
|
||||||
|
Unauthorized,
|
||||||
|
Validation,
|
||||||
|
InternalServerError
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
public class RoleResponse
|
||||||
|
{
|
||||||
|
public bool isSuccess { get; set; }
|
||||||
|
public RolesData data { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RolesData
|
||||||
|
{
|
||||||
|
public List<RoleList> role { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RoleList
|
||||||
|
{
|
||||||
|
public int id { get; set; }
|
||||||
|
public string roleName { get; set; }
|
||||||
|
public int gozareshgirRoleId { get; set; }
|
||||||
|
public List<int> permissions { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
|
namespace AccountManagement.Application.Contracts.ProgramManagerApiResult;
|
||||||
|
|
||||||
|
public record SingleUserResponseResult
|
||||||
|
{
|
||||||
|
public bool isSuccess { get; set; }
|
||||||
|
public SingleUserData Data { get; set; }
|
||||||
|
};
|
||||||
|
|
||||||
|
public record SingleUserData
|
||||||
|
|
||||||
|
{
|
||||||
|
public long id { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// نام و نام خانوادگی
|
||||||
|
/// </summary>
|
||||||
|
public string fullName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام کاربری
|
||||||
|
/// </summary>
|
||||||
|
public string userName { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مسیر عکس پروفایل
|
||||||
|
/// </summary>
|
||||||
|
public string profilePhotoPath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره موبایل
|
||||||
|
/// </summary>
|
||||||
|
public string mobile { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// فعال/غیر فعال بودن یوزر
|
||||||
|
/// </summary>
|
||||||
|
public bool isActive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// گذرواژه
|
||||||
|
/// </summary>
|
||||||
|
public string password { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ای دی اکانت کاربر در گزارشگیر
|
||||||
|
/// </summary>
|
||||||
|
public long? accountId { get; set; }
|
||||||
|
|
||||||
|
public List<long> Roles { get; set; }
|
||||||
|
}
|
||||||
@@ -9,6 +9,10 @@ namespace AccountManagement.Application.Contracts.Role
|
|||||||
[Required(ErrorMessage = ValidationMessages.IsRequired)]
|
[Required(ErrorMessage = ValidationMessages.IsRequired)]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public List<int> Permissions { get; set; }
|
public List<int> Permissions { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// لیست پرمیشن های پروگرام منیجر
|
||||||
|
/// </summary>
|
||||||
|
public List<int> PmPermissions { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,26 @@
|
|||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Shared.Contracts.PmRole.Queries;
|
||||||
|
|
||||||
namespace AccountManagement.Application.Contracts.Role
|
namespace AccountManagement.Application.Contracts.Role
|
||||||
{
|
{
|
||||||
public interface IRoleApplication
|
public interface IRoleApplication
|
||||||
{
|
{
|
||||||
OperationResult Create(CreateRole command);
|
Task<OperationResult> Create(CreateRole command);
|
||||||
OperationResult Edit(EditRole command);
|
Task<OperationResult> Edit(EditRole command);
|
||||||
List<RoleViewModel> List();
|
List<RoleViewModel> List();
|
||||||
EditRole GetDetails(long id);
|
EditRole GetDetails(long id);
|
||||||
|
|
||||||
|
#region ProgramManager
|
||||||
|
|
||||||
|
Task<SelectList> GetPmRoleList(long? gozareshgirRoleId);
|
||||||
|
Task<List<GetPmRolesDto>> GetPmRoleListToEdit(long? gozareshgirRoleId);
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,25 @@
|
|||||||
using System;
|
using _0_Framework.Application;
|
||||||
using System.Collections;
|
using _0_Framework.Application.Sms;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Exceptions;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
using AccountManagement.Domain.AccountAgg;
|
using AccountManagement.Domain.AccountAgg;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application.Sms;
|
|
||||||
using AccountManagement.Domain.AccountLeftWorkAgg;
|
using AccountManagement.Domain.AccountLeftWorkAgg;
|
||||||
using AccountManagement.Domain.CameraAccountAgg;
|
using AccountManagement.Domain.CameraAccountAgg;
|
||||||
using AccountManagement.Domain.RoleAgg;
|
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
using Company.Domain.WorkshopAgg;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using _0_Framework.Exceptions;
|
|
||||||
using AccountManagement.Domain.PositionAgg;
|
using AccountManagement.Domain.PositionAgg;
|
||||||
|
using AccountManagement.Domain.RoleAgg;
|
||||||
using AccountManagement.Domain.SubAccountAgg;
|
using AccountManagement.Domain.SubAccountAgg;
|
||||||
using AccountManagement.Domain.SubAccountPermissionSubtitle1Agg;
|
using AccountManagement.Domain.SubAccountPermissionSubtitle1Agg;
|
||||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||||
|
using Company.Domain._common;
|
||||||
|
using Company.Domain.WorkshopAgg;
|
||||||
using Company.Domain.WorkshopSubAccountAgg;
|
using Company.Domain.WorkshopSubAccountAgg;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Shared.Contracts.PmUser.Commands;
|
||||||
|
using Shared.Contracts.PmUser.Queries;
|
||||||
|
|
||||||
//using AccountManagement.Domain.RoleAgg;
|
//using AccountManagement.Domain.RoleAgg;
|
||||||
|
|
||||||
@@ -46,8 +42,18 @@ public class AccountApplication : IAccountApplication
|
|||||||
private readonly IWorkshopSubAccountRepository _workshopSubAccountRepository;
|
private readonly IWorkshopSubAccountRepository _workshopSubAccountRepository;
|
||||||
private readonly ISubAccountPermissionSubtitle1Repository _accountPermissionSubtitle1Repository;
|
private readonly ISubAccountPermissionSubtitle1Repository _accountPermissionSubtitle1Repository;
|
||||||
|
|
||||||
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker, ISmsService smsService, ICameraAccountRepository cameraAccountRepository, IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository, IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository, ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository, ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository)
|
private readonly IPmUserQueryService _pmUserQueryService;
|
||||||
|
private readonly IPmUserCommandService _pmUserCommandService;
|
||||||
|
|
||||||
|
public AccountApplication(IAccountRepository accountRepository, IPasswordHasher passwordHasher,
|
||||||
|
IFileUploader fileUploader, IAuthHelper authHelper, IRoleRepository roleRepository, IWorker worker,
|
||||||
|
ISmsService smsService, ICameraAccountRepository cameraAccountRepository,
|
||||||
|
IPositionRepository positionRepository, IAccountLeftworkRepository accountLeftworkRepository,
|
||||||
|
IWorkshopRepository workshopRepository, ISubAccountRepository subAccountRepository,
|
||||||
|
ISubAccountRoleRepository subAccountRoleRepository, IWorkshopSubAccountRepository workshopSubAccountRepository,
|
||||||
|
ISubAccountPermissionSubtitle1Repository accountPermissionSubtitle1Repository, IUnitOfWork unitOfWork,
|
||||||
|
IPmUserQueryService pmUserQueryService, IPmUserCommandService pmUserCommandService)
|
||||||
{
|
{
|
||||||
_authHelper = authHelper;
|
_authHelper = authHelper;
|
||||||
_roleRepository = roleRepository;
|
_roleRepository = roleRepository;
|
||||||
@@ -60,10 +66,13 @@ public class AccountApplication : IAccountApplication
|
|||||||
_subAccountRoleRepository = subAccountRoleRepository;
|
_subAccountRoleRepository = subAccountRoleRepository;
|
||||||
_workshopSubAccountRepository = workshopSubAccountRepository;
|
_workshopSubAccountRepository = workshopSubAccountRepository;
|
||||||
_accountPermissionSubtitle1Repository = accountPermissionSubtitle1Repository;
|
_accountPermissionSubtitle1Repository = accountPermissionSubtitle1Repository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
|
||||||
|
_pmUserQueryService = pmUserQueryService;
|
||||||
|
_pmUserCommandService = pmUserCommandService;
|
||||||
_fileUploader = fileUploader;
|
_fileUploader = fileUploader;
|
||||||
_passwordHasher = passwordHasher;
|
_passwordHasher = passwordHasher;
|
||||||
_accountRepository = accountRepository;
|
_accountRepository = accountRepository;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult EditClient(EditClientAccount command)
|
public OperationResult EditClient(EditClientAccount command)
|
||||||
@@ -84,7 +93,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
(x.Mobile == command.Mobile && x.id != command.Id)))
|
(x.Mobile == command.Mobile && x.id != command.Id)))
|
||||||
return opreation.Failed("شماره موبایل تکراری است");
|
return opreation.Failed("شماره موبایل تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) && x.id != command.Id)))
|
(x.NationalCode == command.NationalCode && !string.IsNullOrWhiteSpace(x.NationalCode) &&
|
||||||
|
x.id != command.Id)))
|
||||||
return opreation.Failed("کد ملی تکراری است");
|
return opreation.Failed("کد ملی تکراری است");
|
||||||
if (_accountRepository.Exists(x =>
|
if (_accountRepository.Exists(x =>
|
||||||
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
(x.Email == command.Email && !string.IsNullOrWhiteSpace(x.Email) && x.id != command.Id)))
|
||||||
@@ -92,7 +102,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var path = $"profilePhotos";
|
var path = $"profilePhotos";
|
||||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
editAccount.EditClient(command.Fullname,command.Username,command.Mobile,picturePath,command.Email,command.NationalCode);
|
editAccount.EditClient(command.Fullname, command.Username, command.Mobile, picturePath, command.Email,
|
||||||
|
command.NationalCode);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return opreation.Succcedded();
|
return opreation.Succcedded();
|
||||||
}
|
}
|
||||||
@@ -123,7 +134,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Create(CreateAccount command)
|
public async Task<OperationResult> Create(CreateAccount command)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
|
|
||||||
@@ -133,15 +144,59 @@ public class AccountApplication : IAccountApplication
|
|||||||
var password = _passwordHasher.Hash(command.Password);
|
var password = _passwordHasher.Hash(command.Password);
|
||||||
var roleName = _roleRepository.GetDetails(command.RoleId);
|
var roleName = _roleRepository.GetDetails(command.RoleId);
|
||||||
var path = $"profilePhotos";
|
var path = $"profilePhotos";
|
||||||
|
var picturePath = "";
|
||||||
if (_fileUploader != null)
|
if (_fileUploader != null)
|
||||||
{
|
{
|
||||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
|
||||||
picturePath, roleName.Name,"true","false");
|
|
||||||
_accountRepository.Create(account);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var account = new Account(command.Fullname, command.Username, password, command.Mobile, command.RoleId,
|
||||||
|
picturePath, roleName.Name, "true", "false");
|
||||||
|
|
||||||
|
_unitOfWork.BeginAccountContext();
|
||||||
|
|
||||||
|
|
||||||
|
_accountRepository.Create(account);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
|
|
||||||
|
if (command.IsProgramManagerUser)
|
||||||
|
{
|
||||||
|
if (command.UserRoles == null)
|
||||||
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname, command.Username,
|
||||||
|
account.Password, command.Mobile,
|
||||||
|
null, account.id, pmUserRoles));
|
||||||
|
if (!createPm.isSuccess)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//var url = "api/user/create";
|
||||||
|
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
|
||||||
|
//var response = InternalApiCaller.PostAsync<CreateProgramManagerUser, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Error);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Result.errorMessage);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
_unitOfWork.CommitAccountContext();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +210,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
return opreation.Failed("پر کردن تمامی فیلدها الزامی است");
|
return opreation.Failed("پر کردن تمامی فیلدها الزامی است");
|
||||||
if (_accountRepository.Exists(x => x.Username == command.Username))
|
if (_accountRepository.Exists(x => x.Username == command.Username))
|
||||||
return opreation.Failed("نام کاربری تکراری است");
|
return opreation.Failed("نام کاربری تکراری است");
|
||||||
if (_accountRepository.Exists(x => x.Mobile == command.Mobile && x.IsActiveString =="true"))
|
if (_accountRepository.Exists(x => x.Mobile == command.Mobile && x.IsActiveString == "true"))
|
||||||
|
|
||||||
return opreation.Failed("مقادیر وارد شده تکراری است");
|
return opreation.Failed("مقادیر وارد شده تکراری است");
|
||||||
|
|
||||||
@@ -173,14 +228,14 @@ public class AccountApplication : IAccountApplication
|
|||||||
// break;
|
// break;
|
||||||
//}
|
//}
|
||||||
var password = _passwordHasher.Hash(command.Password);
|
var password = _passwordHasher.Hash(command.Password);
|
||||||
var register =new Account(command.Fullname,command.Username, password, command.Mobile, command.NationalCode);
|
var register = new Account(command.Fullname, command.Username, password, command.Mobile, command.NationalCode);
|
||||||
_accountRepository.Create(register);
|
_accountRepository.Create(register);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
|
|
||||||
return opreation.Succcedded(register.id,message: "ثبت نام شما با موفقیت انجام شد");
|
return opreation.Succcedded(register.id, message: "ثبت نام شما با موفقیت انجام شد");
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Edit(EditAccount command)
|
public async Task<OperationResult> Edit(EditAccount command)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
var account = _accountRepository.Get(command.Id);
|
var account = _accountRepository.Get(command.Id);
|
||||||
@@ -194,8 +249,124 @@ public class AccountApplication : IAccountApplication
|
|||||||
var roleName = _roleRepository.GetDetails(command.RoleId);
|
var roleName = _roleRepository.GetDetails(command.RoleId);
|
||||||
var path = $"profilePhotos";
|
var path = $"profilePhotos";
|
||||||
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
var picturePath = _fileUploader.Upload(command.ProfilePhoto, path);
|
||||||
|
_unitOfWork.BeginAccountContext();
|
||||||
account.Edit(command.Fullname, command.Username, command.Mobile, command.RoleId, picturePath, roleName.Name);
|
account.Edit(command.Fullname, command.Username, command.Mobile, command.RoleId, picturePath, roleName.Name);
|
||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
|
var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
|
||||||
|
//var apiResult = InternalApiCaller.GetAsync<SingleUserResponseResult>(
|
||||||
|
// $"api/user/{account.id}",
|
||||||
|
// key
|
||||||
|
//);
|
||||||
|
var userResult = await _pmUserQueryService.GetPmUserDataByAccountId(account.id);
|
||||||
|
|
||||||
|
if (command.UserRoles == null)
|
||||||
|
return operation.Failed("حداقل یک نقش برای کاربر مدیریت پروژه لازم است");
|
||||||
|
var pmUserRoles = command.UserRoles.Where(x => x > 0).ToList();
|
||||||
|
|
||||||
|
//اگر کاربر در پروگرام منیجر قبلا ایجاد شده
|
||||||
|
if (userResult.Id > 0)
|
||||||
|
{
|
||||||
|
if (!command.UserRoles.Any())
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||||
|
}
|
||||||
|
|
||||||
|
var editPm = await _pmUserCommandService.Edit(new EditPmUserDto(command.Fullname, command.Username,
|
||||||
|
command.Mobile, account.id, pmUserRoles,
|
||||||
|
command.IsProgramManagerUser));
|
||||||
|
if (!editPm.isSuccess)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
//var parameters = new EditUserCommand(
|
||||||
|
// command.Fullname,
|
||||||
|
// command.Username,
|
||||||
|
// command.Mobile,
|
||||||
|
// account.id,
|
||||||
|
// command.UserRoles,
|
||||||
|
// command.IsProgramManagerUser
|
||||||
|
//);
|
||||||
|
//var url = "api/user/edit";
|
||||||
|
//var response = InternalApiCaller.PostAsync<EditUserCommand, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Error);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Error);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
else //اگر کاربر قبلا ایجاد نشده
|
||||||
|
{
|
||||||
|
//اگر تیک فعالیت در پروگرام منیجر روشن بود
|
||||||
|
if (command.IsProgramManagerUser)
|
||||||
|
{
|
||||||
|
if (!command.UserRoles.Any())
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("حداقل یک نقش باید انتخاب شود");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var createPm = await _pmUserCommandService.Create(new CreatePmUserDto(command.Fullname,
|
||||||
|
command.Username, account.Password, command.Mobile,
|
||||||
|
null, account.id, pmUserRoles));
|
||||||
|
if (!createPm.isSuccess)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش کاربر پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//var parameters = new CreateProgramManagerUser(
|
||||||
|
// command.Fullname,
|
||||||
|
// command.Username,
|
||||||
|
// account.Password,
|
||||||
|
// command.Mobile,
|
||||||
|
// command.Email,
|
||||||
|
// account.id,
|
||||||
|
// command.UserRoles
|
||||||
|
//);
|
||||||
|
|
||||||
|
//var url = "api/user/Create";
|
||||||
|
|
||||||
|
|
||||||
|
//var response = InternalApiCaller.PostAsync<CreateProgramManagerUser, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Error);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Error);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_unitOfWork.CommitAccountContext();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,22 +377,21 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
public OperationResult Login(Login command)
|
public OperationResult Login(Login command)
|
||||||
{
|
{
|
||||||
|
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
if (string.IsNullOrWhiteSpace(command.Password))
|
if (string.IsNullOrWhiteSpace(command.Password))
|
||||||
return operation.Failed(ApplicationMessages.EmptyPassword);
|
return operation.Failed(ApplicationMessages.EmptyPassword);
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(command.Username))
|
if (string.IsNullOrWhiteSpace(command.Username))
|
||||||
return operation.Failed(ApplicationMessages.EmptyUsername);
|
return operation.Failed(ApplicationMessages.EmptyUsername);
|
||||||
|
|
||||||
var account = _accountRepository.GetBy(command.Username);
|
var account = _accountRepository.GetBy(command.Username);
|
||||||
var cameraAccount = _cameraAccountRepository.GetBy(command.Username);
|
var cameraAccount = _cameraAccountRepository.GetBy(command.Username);
|
||||||
SubAccount subAccount = _subAccountRepository.GetBy(command.Username);
|
SubAccount subAccount = _subAccountRepository.GetBy(command.Username);
|
||||||
if (account == null && cameraAccount == null && subAccount == null)
|
if (account == null && cameraAccount == null && subAccount == null)
|
||||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||||
|
|
||||||
if (account != null)
|
if (account != null)
|
||||||
{
|
{
|
||||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(account.Password, command.Password);
|
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(account.Password, command.Password);
|
||||||
if (!result.Verified)
|
if (!result.Verified)
|
||||||
@@ -230,6 +400,29 @@ public class AccountApplication : IAccountApplication
|
|||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
//PmPermission
|
||||||
|
var PmUserData = _pmUserQueryService.GetPmUserDataByAccountId(account.id)
|
||||||
|
.GetAwaiter().GetResult();
|
||||||
|
long? pmUserId = null;
|
||||||
|
if (PmUserData != null)
|
||||||
|
{
|
||||||
|
if (PmUserData.AccountId > 0 && PmUserData.IsActive)
|
||||||
|
{
|
||||||
|
var pmUserPermissions =
|
||||||
|
PmUserData.RoleListDto != null
|
||||||
|
? PmUserData.RoleListDto
|
||||||
|
.SelectMany(x => x.Permissions)
|
||||||
|
.Where(p => p != 99)
|
||||||
|
.Distinct()
|
||||||
|
.ToList()
|
||||||
|
: new List<int>();
|
||||||
|
permissions.AddRange(pmUserPermissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
pmUserId = PmUserData.Id > 0 ? PmUserData.Id : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int? positionValue;
|
int? positionValue;
|
||||||
if (account.PositionId != null)
|
if (account.PositionId != null)
|
||||||
{
|
{
|
||||||
@@ -239,37 +432,45 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
positionValue = null;
|
positionValue = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto,
|
||||||
|
permissions, account.RoleName, account.AdminAreaPermission,
|
||||||
|
account.ClientAriaPermission, positionValue, 0, pmUserId);
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
account.IsActiveString == "true")
|
account.IsActiveString == "true")
|
||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
{
|
new WorkshopClaim
|
||||||
PersonnelCount = x.PersonnelCount,
|
{
|
||||||
Id = x.Id,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Name = x.WorkshopFullName,
|
Id = x.Id,
|
||||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
Name = x.WorkshopFullName,
|
||||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||||
|
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||||
authViewModel.WorkshopList = workshopList;
|
authViewModel.WorkshopList = workshopList;
|
||||||
if (workshopList.Any())
|
if (workshopList.Any())
|
||||||
{
|
{
|
||||||
var workshop = workshopList.First();
|
var workshop = workshopList.First();
|
||||||
authViewModel.WorkshopName = workshop.Name;
|
authViewModel.WorkshopName = workshop.Name;
|
||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||||
authViewModel.WorkshopId = workshop.Id;
|
authViewModel.WorkshopId = workshop.Id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
|
|
||||||
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" && account.IsActiveString == "true") || (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false" && account.IsActiveString == "true"))
|
if ((account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" &&
|
||||||
|
account.IsActiveString == "true") || (account.AdminAreaPermission == "true" &&
|
||||||
|
account.ClientAriaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true"))
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" && account.IsActiveString == "true")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
|
account.IsActiveString == "true")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +482,8 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,cameraAccount.IsActiveSting);
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
{
|
{
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
@@ -291,42 +493,43 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
idAutoriz = 0;
|
idAutoriz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subAccount != null)
|
if (subAccount != null)
|
||||||
{
|
{
|
||||||
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(subAccount.Password, command.Password);
|
(bool Verified, bool NeedUpgrade) result = _passwordHasher.Check(subAccount.Password, command.Password);
|
||||||
if (!result.Verified)
|
if (!result.Verified)
|
||||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||||
var role = _subAccountRoleRepository.Get(subAccount.SubAccountRoleId);
|
var role = _subAccountRoleRepository.Get(subAccount.SubAccountRoleId);
|
||||||
|
|
||||||
var permissions = role.RolePermissions.Select(x => x.PermissionCode).ToList();
|
var permissions = role.RolePermissions.Select(x => x.PermissionCode).ToList();
|
||||||
var authViewModel = new AuthViewModel(subAccount.AccountId, subAccount.SubAccountRoleId, subAccount.FullName
|
var authViewModel = new AuthViewModel(subAccount.AccountId, subAccount.SubAccountRoleId, subAccount.FullName
|
||||||
, subAccount.Username, subAccount.PhoneNumber, "", permissions, role.Title, "false",
|
, subAccount.Username, subAccount.PhoneNumber, "", permissions, role.Title, "false",
|
||||||
"true", 0, subAccount.id);
|
"true", 0, subAccount.id);
|
||||||
var workshopList = _workshopSubAccountRepository.GetWorkshopsBySubAccountId(subAccount.id);
|
var workshopList = _workshopSubAccountRepository.GetWorkshopsBySubAccountId(subAccount.id);
|
||||||
authViewModel.WorkshopList = workshopList.Select(x => new WorkshopClaim()
|
authViewModel.WorkshopList = workshopList.Select(x => new WorkshopClaim()
|
||||||
{
|
{
|
||||||
Slug = _passwordHasher.SlugHasher(x.WorkshopId),
|
Slug = _passwordHasher.SlugHasher(x.WorkshopId),
|
||||||
Name = x.WorkshopName,
|
Name = x.WorkshopName,
|
||||||
PersonnelCount = x.PersonnelCount,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Id = x.WorkshopId
|
Id = x.WorkshopId
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
if (workshopList.Any())
|
if (workshopList.Any())
|
||||||
{
|
{
|
||||||
var workshop = workshopList.First();
|
var workshop = workshopList.First();
|
||||||
authViewModel.WorkshopName = workshop.WorkshopName;
|
authViewModel.WorkshopName = workshop.WorkshopName;
|
||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.WorkshopId);
|
||||||
authViewModel.WorkshopId = workshop.WorkshopId;
|
authViewModel.WorkshopId = workshop.WorkshopId;
|
||||||
}
|
}
|
||||||
_authHelper.Signin(authViewModel);
|
|
||||||
idAutoriz = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return operation.Succcedded(idAutoriz);
|
_authHelper.Signin(authViewModel);
|
||||||
|
idAutoriz = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult LoginWithMobile(long id)
|
public OperationResult LoginWithMobile(long id)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
@@ -335,7 +538,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed(ApplicationMessages.WrongUserPass);
|
return operation.Failed(ApplicationMessages.WrongUserPass);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -351,39 +553,43 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, positionValue);
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false" &&
|
||||||
account.IsActiveString == "true")
|
account.IsActiveString == "true")
|
||||||
{
|
{
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x =>
|
||||||
{
|
new WorkshopClaim
|
||||||
PersonnelCount = x.PersonnelCount,
|
{
|
||||||
Id = x.Id,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Name = x.WorkshopFullName,
|
Id = x.Id,
|
||||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
Name = x.WorkshopFullName,
|
||||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||||
authViewModel.WorkshopList = workshopList;
|
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||||
if (workshopList.Any())
|
authViewModel.WorkshopList = workshopList;
|
||||||
{
|
if (workshopList.Any())
|
||||||
var workshop = workshopList.First();
|
{
|
||||||
authViewModel.WorkshopName = workshop.Name;
|
var workshop = workshopList.First();
|
||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
authViewModel.WorkshopName = workshop.Name;
|
||||||
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||||
authViewModel.WorkshopId = workshop.Id;
|
authViewModel.WorkshopId = workshop.Id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
long idAutoriz = 0;
|
long idAutoriz = 0;
|
||||||
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" || account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
if (account.AdminAreaPermission == "true" && account.ClientAriaPermission == "true" ||
|
||||||
|
account.AdminAreaPermission == "true" && account.ClientAriaPermission == "false")
|
||||||
idAutoriz = 1;
|
idAutoriz = 1;
|
||||||
|
|
||||||
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
if (account.ClientAriaPermission == "true" && account.AdminAreaPermission == "false")
|
||||||
idAutoriz = 2;
|
idAutoriz = 2;
|
||||||
return operation.Succcedded(idAutoriz);
|
return operation.Succcedded(idAutoriz);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Logout()
|
public void Logout()
|
||||||
{
|
{
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
@@ -419,6 +625,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
_accountRepository.SaveChanges();
|
_accountRepository.SaveChanges();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public EditAccount GetByVerifyCode(string code, string phone)
|
public EditAccount GetByVerifyCode(string code, string phone)
|
||||||
{
|
{
|
||||||
return _accountRepository.GetByVerifyCode(code, phone);
|
return _accountRepository.GetByVerifyCode(code, phone);
|
||||||
@@ -429,7 +636,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
return _accountRepository.GetByUserNameAndId(id, username);
|
return _accountRepository.GetByUserNameAndId(id, username);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task <OperationResult> SetVerifyCode(string phone, long id)
|
public async Task<OperationResult> SetVerifyCode(string phone, long id)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
var account = _accountRepository.Get(id);
|
var account = _accountRepository.Get(id);
|
||||||
@@ -447,7 +654,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
await _accountRepository.RemoveCode(id);
|
await _accountRepository.RemoveCode(id);
|
||||||
|
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -492,7 +698,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -501,80 +706,81 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true",null);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, "false", "true",
|
||||||
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
null);
|
||||||
{
|
var workshopList = _workshopRepository.GetWorkshopsByClientAccountId(account.id).Select(x => new WorkshopClaim
|
||||||
PersonnelCount = x.PersonnelCount,
|
{
|
||||||
Id = x.Id,
|
PersonnelCount = x.PersonnelCount,
|
||||||
Name = x.WorkshopFullName,
|
Id = x.Id,
|
||||||
Slug = _passwordHasher.SlugHasher(x.Id)
|
Name = x.WorkshopFullName,
|
||||||
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
Slug = _passwordHasher.SlugHasher(x.Id)
|
||||||
|
}).OrderByDescending(x => x.PersonnelCount).ToList();
|
||||||
|
|
||||||
authViewModel.WorkshopList = workshopList;
|
authViewModel.WorkshopList = workshopList;
|
||||||
|
|
||||||
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
var clientPermissions = _accountPermissionSubtitle1Repository.GetAllPermissionCodes();
|
||||||
authViewModel.Permissions = clientPermissions;
|
authViewModel.Permissions = clientPermissions;
|
||||||
if (authViewModel.WorkshopList.Any())
|
if (authViewModel.WorkshopList.Any())
|
||||||
{
|
{
|
||||||
var workshop = authViewModel.WorkshopList.First();
|
var workshop = authViewModel.WorkshopList.First();
|
||||||
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
authViewModel.WorkshopSlug = _passwordHasher.SlugHasher(workshop.Id);
|
||||||
authViewModel.WorkshopName = workshop.Name;
|
authViewModel.WorkshopName = workshop.Name;
|
||||||
authViewModel.WorkshopId = workshop.Id;
|
authViewModel.WorkshopId = workshop.Id;
|
||||||
}
|
}
|
||||||
_authHelper.Signin(authViewModel);
|
|
||||||
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult DirectCameraLogin(long cameraAccountId)
|
public OperationResult DirectCameraLogin(long cameraAccountId)
|
||||||
{
|
{
|
||||||
var prAcc = _authHelper.CurrentAccountInfo();
|
var prAcc = _authHelper.CurrentAccountInfo();
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
var cameraAccount = _cameraAccountRepository.GetById(cameraAccountId);
|
var cameraAccount = _cameraAccountRepository.GetById(cameraAccountId);
|
||||||
if (cameraAccount == null)
|
if (cameraAccount == null)
|
||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
_authHelper.SignOut();
|
||||||
|
|
||||||
|
|
||||||
|
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
||||||
_authHelper.SignOut();
|
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
||||||
|
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId,
|
||||||
|
cameraAccount.IsActiveSting);
|
||||||
var mobile = string.IsNullOrWhiteSpace(cameraAccount.Mobile) ? " " : cameraAccount.Mobile;
|
if (cameraAccount.IsActiveSting == "true")
|
||||||
var authViewModel = new CameraAuthViewModel(cameraAccount.id, cameraAccount.WorkshopId,
|
|
||||||
cameraAccount.Username, mobile, cameraAccount.WorkshopName, cameraAccount.AccountId, cameraAccount.IsActiveSting);
|
|
||||||
if (cameraAccount.IsActiveSting == "true")
|
|
||||||
{
|
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return operation.Failed("این اکانت غیر فعال شده است");
|
|
||||||
}
|
|
||||||
return operation.Succcedded(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public AccountLeftWorkViewModel WorkshopList(long accountId)
|
|
||||||
{
|
|
||||||
string fullname = this._accountRepository.GetById(accountId).Fullname;
|
|
||||||
List<WorkshopAccountlistViewModel> source =_accountLeftworkRepository.WorkshopList(accountId);
|
|
||||||
List<long> userWorkshopIds = source.Select(x => x.WorkshopId).ToList();
|
|
||||||
List<WorkshopSelectList> allWorkshops = this._accountLeftworkRepository.GetAllWorkshops();
|
|
||||||
List<AccountViewModel> accountSelectList = this._accountRepository.GetAdminAccountSelectList();
|
|
||||||
(string StartWorkFa, string LeftWorkFa) byAccountId = this._accountLeftworkRepository.GetByAccountId(accountId);
|
|
||||||
return new AccountLeftWorkViewModel()
|
|
||||||
{
|
{
|
||||||
AccountId = accountId,
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
AccountFullName = fullname,
|
}
|
||||||
StartDateFa = byAccountId.StartWorkFa,
|
else
|
||||||
LeftDateFa = byAccountId.LeftWorkFa,
|
{
|
||||||
WorkshopAccountlist = source,
|
return operation.Failed("این اکانت غیر فعال شده است");
|
||||||
WorkshopSelectList = new SelectList(allWorkshops.Where(x => !userWorkshopIds.Contains(x.Id)), "Id", "WorkshopFullName"),
|
}
|
||||||
AccountSelectList = new SelectList(accountSelectList, "Id", "Fullname")
|
|
||||||
};
|
return operation.Succcedded(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// public AccountLeftWorkViewModel WorkshopList(long accountId)
|
||||||
|
// {
|
||||||
|
// string fullname = this._accountRepository.GetById(accountId).Fullname;
|
||||||
|
// List<WorkshopAccountlistViewModel> source = _accountLeftworkRepository.WorkshopList(accountId);
|
||||||
|
// List<long> userWorkshopIds = source.Select(x => x.WorkshopId).ToList();
|
||||||
|
// List<WorkshopSelectList> allWorkshops = this._accountLeftworkRepository.GetAllWorkshops();
|
||||||
|
// List<AccountViewModel> accountSelectList = this._accountRepository.GetAdminAccountSelectList();
|
||||||
|
// (string StartWorkFa, string LeftWorkFa) byAccountId = this._accountLeftworkRepository.GetByAccountId(accountId);
|
||||||
|
// return new AccountLeftWorkViewModel()
|
||||||
|
// {
|
||||||
|
// AccountId = accountId,
|
||||||
|
// AccountFullName = fullname,
|
||||||
|
// StartDateFa = byAccountId.StartWorkFa,
|
||||||
|
// LeftDateFa = byAccountId.LeftWorkFa,
|
||||||
|
// WorkshopAccountlist = source,
|
||||||
|
// WorkshopSelectList = new SelectList(allWorkshops.Where(x => !userWorkshopIds.Contains(x.Id)), "Id", "WorkshopFullName"),
|
||||||
|
// AccountSelectList = new SelectList(accountSelectList, "Id", "Fullname")
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
|
||||||
public OperationResult SaveWorkshopAccount(
|
public OperationResult SaveWorkshopAccount(
|
||||||
List<WorkshopAccountlistViewModel> workshopAccountList,
|
List<WorkshopAccountlistViewModel> workshopAccountList,
|
||||||
string startDate,
|
string startDate,
|
||||||
@@ -583,10 +789,12 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
return this._accountLeftworkRepository.SaveWorkshopAccount(workshopAccountList, startDate, leftDate, accountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
public OperationResult CreateNewWorkshopAccount(long currentAccountId, long newAccountId)
|
||||||
{
|
{
|
||||||
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
return this._accountLeftworkRepository.CopyWorkshopToNewAccount(currentAccountId, newAccountId);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Mahan
|
#region Mahan
|
||||||
|
|
||||||
public List<AccountViewModel> AccountsForAssign(long taskId)
|
public List<AccountViewModel> AccountsForAssign(long taskId)
|
||||||
@@ -600,6 +808,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
{
|
{
|
||||||
return new List<AccountViewModel>();
|
return new List<AccountViewModel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _accountRepository.GetAccountsByPositionId(positionId);
|
return _accountRepository.GetAccountsByPositionId(positionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,7 +826,6 @@ public class AccountApplication : IAccountApplication
|
|||||||
return operation.Failed("این اکانت وجود ندارد");
|
return operation.Failed("این اکانت وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var permissions = _roleRepository.Get(account.RoleId)
|
var permissions = _roleRepository.Get(account.RoleId)
|
||||||
.Permissions
|
.Permissions
|
||||||
.Select(x => x.Code)
|
.Select(x => x.Code)
|
||||||
@@ -626,10 +834,10 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.SignOut();
|
_authHelper.SignOut();
|
||||||
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
var authViewModel = new AuthViewModel(account.id, account.RoleId, account.Fullname
|
||||||
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName, account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
, account.Username, account.Mobile, account.ProfilePhoto, permissions, account.RoleName,
|
||||||
|
account.AdminAreaPermission, account.ClientAriaPermission, account.Position.PositionValue);
|
||||||
_authHelper.Signin(authViewModel);
|
_authHelper.Signin(authViewModel);
|
||||||
return operation.Succcedded(2);
|
return operation.Succcedded(2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
public async Task<List<AccountSelectListViewModel>> GetAdminSelectList()
|
||||||
@@ -638,68 +846,74 @@ public class AccountApplication : IAccountApplication
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password, string rePassword)
|
|
||||||
|
public OperationResult IsPhoneNumberAndPasswordValid(long accountId, string phoneNumber, string password,
|
||||||
|
string rePassword)
|
||||||
{
|
{
|
||||||
OperationResult op = new();
|
OperationResult op = new();
|
||||||
|
|
||||||
var entity = _accountRepository.Get(accountId);
|
var entity = _accountRepository.Get(accountId);
|
||||||
|
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(rePassword) || !string.IsNullOrWhiteSpace(password))
|
if (!string.IsNullOrWhiteSpace(rePassword) || !string.IsNullOrWhiteSpace(password))
|
||||||
{
|
{
|
||||||
if (rePassword != password)
|
if (rePassword != password)
|
||||||
return op.Failed("تکرار رمز عبور با رمز عبور مطابقت ندارد");
|
return op.Failed("تکرار رمز عبور با رمز عبور مطابقت ندارد");
|
||||||
|
|
||||||
if (password.Length < 8)
|
if (password.Length < 8)
|
||||||
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
return op.Failed("رمز عبور نمی تواند کمتر از 8 کاراکتر باشد");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) && string.IsNullOrWhiteSpace(rePassword))
|
if ((string.IsNullOrWhiteSpace(phoneNumber) || entity.Mobile == phoneNumber) &&
|
||||||
return op.Failed("چیزی برای تغییر وجود ندارد");
|
string.IsNullOrWhiteSpace(rePassword))
|
||||||
|
return op.Failed("چیزی برای تغییر وجود ندارد");
|
||||||
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(phoneNumber) && entity.Mobile != phoneNumber)
|
if (!string.IsNullOrWhiteSpace(phoneNumber) && entity.Mobile != phoneNumber)
|
||||||
{
|
{
|
||||||
phoneNumber = phoneNumber.Trim();
|
phoneNumber = phoneNumber.Trim();
|
||||||
if (phoneNumber.Length != 11)
|
if (phoneNumber.Length != 11)
|
||||||
return op.Failed("شماره تلفن همراه به درستی وارد نشده است");
|
return op.Failed("شماره تلفن همراه به درستی وارد نشده است");
|
||||||
if (_accountRepository.Exists(x => x.Mobile == phoneNumber && x.id != accountId) ||
|
if (_accountRepository.Exists(x => x.Mobile == phoneNumber && x.id != accountId) ||
|
||||||
_subAccountRepository.Exists(x => x.PhoneNumber == phoneNumber) ||
|
_subAccountRepository.Exists(x => x.PhoneNumber == phoneNumber) ||
|
||||||
_cameraAccountRepository.Exists(x => x.Mobile == phoneNumber))
|
_cameraAccountRepository.Exists(x => x.Mobile == phoneNumber))
|
||||||
return op.Failed("قبلا یک حساب با این شماره ثبت شده است");
|
return op.Failed("قبلا یک حساب با این شماره ثبت شده است");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return op.Succcedded();
|
return op.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult ChangePasswordAndPhoneNumber(AccountChangePasswordAndPhoneNumber command)
|
public OperationResult ChangePasswordAndPhoneNumber(AccountChangePasswordAndPhoneNumber command)
|
||||||
{
|
{
|
||||||
OperationResult op = new();
|
OperationResult op = new();
|
||||||
command.PhoneNumber = command.PhoneNumber.Trim();
|
command.PhoneNumber = command.PhoneNumber.Trim();
|
||||||
var entity = _accountRepository.Get(command.AccountId);
|
var entity = _accountRepository.Get(command.AccountId);
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return op.Failed(ApplicationMessages.RecordNotFound);
|
return op.Failed(ApplicationMessages.RecordNotFound);
|
||||||
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password, command.RePassword);
|
var validationResult = IsPhoneNumberAndPasswordValid(command.AccountId, command.PhoneNumber, command.Password,
|
||||||
if (validationResult.IsSuccedded == false)
|
command.RePassword);
|
||||||
return validationResult;
|
if (validationResult.IsSuccedded == false)
|
||||||
|
return validationResult;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
if (!string.IsNullOrWhiteSpace(command.RePassword))
|
||||||
{
|
{
|
||||||
|
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
||||||
|
}
|
||||||
|
|
||||||
entity.ChangePassword(_passwordHasher.Hash(command.Password));
|
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
||||||
}
|
{
|
||||||
|
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto,
|
||||||
|
entity.RoleName);
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(command.PhoneNumber))
|
_accountRepository.SaveChanges();
|
||||||
{
|
return op.Succcedded();
|
||||||
entity.Edit(entity.Fullname, entity.Username, command.PhoneNumber, entity.RoleId, entity.ProfilePhoto, entity.RoleName);
|
}
|
||||||
}
|
|
||||||
_accountRepository.SaveChanges();
|
|
||||||
return op.Succcedded();
|
|
||||||
}
|
|
||||||
//public UserClaimsResponseDTO GetClaimsForSignIn(Login command)
|
//public UserClaimsResponseDTO GetClaimsForSignIn(Login command)
|
||||||
//{
|
//{
|
||||||
// var operation = new OperationResult();
|
// var operation = new OperationResult();
|
||||||
@@ -792,6 +1006,7 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
// return claimsResponse.Failed(ApplicationMessages.WrongUserPass);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@@ -829,4 +1044,9 @@ public class AccountApplication : IAccountApplication
|
|||||||
|
|
||||||
_authHelper.CameraSignIn(authViewModel);
|
_authHelper.CameraSignIn(authViewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<GetPmUserDto> GetPmUserAsync(long accountId)
|
||||||
|
{
|
||||||
|
return await _pmUserQueryService.GetPmUserDataByAccountId(accountId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
||||||
<ProjectReference Include="..\AccountManagement.Domain\AccountManagement.Domain.csproj" />
|
<ProjectReference Include="..\AccountManagement.Domain\AccountManagement.Domain.csproj" />
|
||||||
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
||||||
|
<ProjectReference Include="..\Shared.Contracts\Shared.Contracts.csproj" />
|
||||||
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using AccountManagement.Application.Contracts.Account;
|
using AccountManagement.Application.Contracts.Account;
|
||||||
using AccountManagement.Application.Contracts.CameraAccount;
|
using AccountManagement.Application.Contracts.CameraAccount;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
|||||||
@@ -2,6 +2,14 @@
|
|||||||
using AccountManagement.Application.Contracts.Role;
|
using AccountManagement.Application.Contracts.Role;
|
||||||
using AccountManagement.Domain.RoleAgg;
|
using AccountManagement.Domain.RoleAgg;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Company.Domain._common;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using Shared.Contracts.PmRole.Commands;
|
||||||
|
using GetPmRolesDto = Shared.Contracts.PmRole.Queries.GetPmRolesDto;
|
||||||
|
using Role = AccountManagement.Domain.RoleAgg.Role;
|
||||||
|
using Shared.Contracts.PmRole.Queries;
|
||||||
|
|
||||||
namespace AccountManagement.Application;
|
namespace AccountManagement.Application;
|
||||||
|
|
||||||
@@ -9,32 +17,82 @@ public class RoleApplication : IRoleApplication
|
|||||||
{
|
{
|
||||||
private readonly IRoleRepository _roleRepository;
|
private readonly IRoleRepository _roleRepository;
|
||||||
|
|
||||||
public RoleApplication(IRoleRepository roleRepository)
|
private readonly IPmRoleQueryService _pmRoleQueryService;
|
||||||
|
private readonly IPmRoleCommandService _pmRoleCommandService;
|
||||||
|
private readonly IUnitOfWork _unitOfWork;
|
||||||
|
|
||||||
|
public RoleApplication(IRoleRepository roleRepository, IUnitOfWork unitOfWork, IPmRoleQueryService pmRoleQueryService, IPmRoleCommandService pmRoleCommandService)
|
||||||
{
|
{
|
||||||
_roleRepository = roleRepository;
|
_roleRepository = roleRepository;
|
||||||
|
_unitOfWork = unitOfWork;
|
||||||
|
_pmRoleQueryService = pmRoleQueryService;
|
||||||
|
_pmRoleCommandService = pmRoleCommandService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Create(CreateRole command)
|
public async Task<OperationResult> Create(CreateRole command)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
if (_roleRepository.Exists(x => x.Name == command.Name))
|
if (_roleRepository.Exists(x => x.Name == command.Name))
|
||||||
return operation.Failed(ApplicationMessages.DuplicatedRecord);
|
return operation.Failed(ApplicationMessages.DuplicatedRecord);
|
||||||
var permissions = new List<Permission>();
|
var permissions = command.Permissions.Where(x => x > 0).Select(x => new Permission(x)).ToList();
|
||||||
foreach (var code in command.Permissions)
|
|
||||||
{
|
|
||||||
if (code > 0)
|
|
||||||
{
|
|
||||||
permissions.Add(new Permission(code));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
|
||||||
var role = new Role(command.Name, permissions);
|
var role = new Role(command.Name, permissions);
|
||||||
|
_unitOfWork.BeginAccountContext();
|
||||||
|
|
||||||
_roleRepository.Create(role);
|
_roleRepository.Create(role);
|
||||||
_roleRepository.SaveChanges();
|
_roleRepository.SaveChanges();
|
||||||
|
|
||||||
|
var pmPermissions = command.PmPermissions.Where(x => x > 0).ToList();
|
||||||
|
if (pmPermissions.Any())
|
||||||
|
{
|
||||||
|
|
||||||
|
var pmRole = new CreatePmRoleDto{ RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id};
|
||||||
|
var res =await _pmRoleCommandService.Create(pmRole);
|
||||||
|
if (!res.Item1)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//var parameters = new CreateProgramManagerRole
|
||||||
|
//{
|
||||||
|
// RoleName = command.Name,
|
||||||
|
// Permissions = pmPermissions,
|
||||||
|
// GozareshgirRoleId = role.id
|
||||||
|
|
||||||
|
//};
|
||||||
|
|
||||||
|
//var url = "api/role";
|
||||||
|
//var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
|
||||||
|
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Result.errorMessage);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
||||||
|
_unitOfWork.CommitAccountContext();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperationResult Edit(EditRole command)
|
public async Task<OperationResult> Edit(EditRole command)
|
||||||
{
|
{
|
||||||
var operation = new OperationResult();
|
var operation = new OperationResult();
|
||||||
var role = _roleRepository.Get(command.Id);
|
var role = _roleRepository.Get(command.Id);
|
||||||
@@ -47,17 +105,134 @@ public class RoleApplication : IRoleApplication
|
|||||||
//var permissions = new List<Permission>();
|
//var permissions = new List<Permission>();
|
||||||
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
//command.Permissions.ForEach(code => permissions.Add(new Permission(code)));
|
||||||
|
|
||||||
var permissions = new List<Permission>();
|
var permissions = command.Permissions.Where(x => x > 0).Select(x => new Permission(x)).ToList();
|
||||||
foreach (var code in command.Permissions)
|
|
||||||
{
|
|
||||||
if (code > 0)
|
|
||||||
{
|
|
||||||
permissions.Add(new Permission(code));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_unitOfWork.BeginAccountContext();
|
||||||
role.Edit(command.Name, permissions);
|
role.Edit(command.Name, permissions);
|
||||||
_roleRepository.SaveChanges();
|
_roleRepository.SaveChanges();
|
||||||
|
var key = SecretKeys.ProgramManagerInternalApi;
|
||||||
|
var pmPermissions = command.PmPermissions.Where(x => x > 0).ToList();
|
||||||
|
|
||||||
|
|
||||||
|
//یافتن نقش در پروگرام منیجر
|
||||||
|
//var apiResult = InternalApiCaller.GetAsync<RoleResponse>(
|
||||||
|
// "api/role",
|
||||||
|
// key,
|
||||||
|
// new Dictionary<string, object>
|
||||||
|
// {
|
||||||
|
// { "RoleName", "" },
|
||||||
|
|
||||||
|
// { "GozareshgirRoleId", command.Id}
|
||||||
|
// }
|
||||||
|
//);
|
||||||
|
|
||||||
|
|
||||||
|
var pmRoleListResult = await _pmRoleQueryService.GetPmRoleList(command.Id);
|
||||||
|
var pmRoleResult = pmRoleListResult.FirstOrDefault();
|
||||||
|
|
||||||
|
//اگر این نقش در پروگرام منیجر وجود داشت ویرایش کن
|
||||||
|
if (pmRoleResult != null)
|
||||||
|
{
|
||||||
|
var edit = new CreatePmRoleDto { RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id };
|
||||||
|
var res = await _pmRoleCommandService.Edit(edit);
|
||||||
|
if (!res.Item1)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//var parameters = new CreateProgramManagerRole
|
||||||
|
//{
|
||||||
|
// RoleName = command.Name,
|
||||||
|
// Permissions = pmPermissions,
|
||||||
|
// GozareshgirRoleId = role.id
|
||||||
|
|
||||||
|
//};
|
||||||
|
//var url = "api/role/edit";
|
||||||
|
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Result.errorMessage);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
else //اگر نقش در پروگرام منیجر وجود نداشت
|
||||||
|
{
|
||||||
|
|
||||||
|
//اگر تیک پرمیشن های پروگرام منیجر زده شده
|
||||||
|
//این نقش را سمت پروگرام منیجر بساز
|
||||||
|
if (pmPermissions.Any())
|
||||||
|
{
|
||||||
|
var pmRole = new CreatePmRoleDto { RoleName = command.Name, Permissions = pmPermissions, GozareshgirRoleId = role.id };
|
||||||
|
var res = await _pmRoleCommandService.Create(pmRole);
|
||||||
|
if (!res.Item1)
|
||||||
|
{
|
||||||
|
_unitOfWork.RollbackAccountContext();
|
||||||
|
return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||||
|
}
|
||||||
|
|
||||||
|
//try
|
||||||
|
//{
|
||||||
|
// var pmPermissionsData = pmPermissions.Where(x => x > 0).Select(x => new PmPermission(x)).ToList();
|
||||||
|
// var pmRole = new PmRole(command.Name, command.Id, pmPermissionsData);
|
||||||
|
// await _pmRoleRepository.CreateAsync(pmRole);
|
||||||
|
// await _pmRoleRepository.SaveChangesAsync();
|
||||||
|
|
||||||
|
//}
|
||||||
|
//catch (System.Exception)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed("خطا در ویرایش دسترسی ها در پروگرام منیجر");
|
||||||
|
//}
|
||||||
|
|
||||||
|
//var parameters = new CreateProgramManagerRole
|
||||||
|
//{
|
||||||
|
// RoleName = command.Name,
|
||||||
|
// Permissions = pmPermissions,
|
||||||
|
// GozareshgirRoleId = role.id
|
||||||
|
|
||||||
|
//};
|
||||||
|
|
||||||
|
//var url = "api/role";
|
||||||
|
|
||||||
|
|
||||||
|
//var response = InternalApiCaller.PostAsync<CreateProgramManagerRole, ApiResponse>(
|
||||||
|
// url,
|
||||||
|
// key,
|
||||||
|
// parameters
|
||||||
|
//);
|
||||||
|
|
||||||
|
|
||||||
|
//if (!response.Success)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed("ارتباط با اپلیکیش پروگرام منیجر برقرار نشد");
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if (!response.Result.isSuccess)
|
||||||
|
//{
|
||||||
|
// _unitOfWork.RollbackAccountContext();
|
||||||
|
// return operation.Failed(response.Result.errorMessage);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_unitOfWork.CommitAccountContext();
|
||||||
return operation.Succcedded();
|
return operation.Succcedded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,4 +245,23 @@ public class RoleApplication : IRoleApplication
|
|||||||
{
|
{
|
||||||
return _roleRepository.List();
|
return _roleRepository.List();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task<SelectList> GetPmRoleList(long? gozareshgirRoleId)
|
||||||
|
{
|
||||||
|
var rolse = await _pmRoleQueryService.GetPmRoleList(gozareshgirRoleId);
|
||||||
|
return new SelectList(rolse, "Id", "RoleName");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<GetPmRolesDto>> GetPmRoleListToEdit(long? gozareshgirRoleId)
|
||||||
|
{
|
||||||
|
return await _pmRoleQueryService.GetPmRoleList(gozareshgirRoleId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -5,14 +5,11 @@ using AccountManagement.Domain.AccountAgg;
|
|||||||
using AccountManagement.Domain.CameraAccountAgg;
|
using AccountManagement.Domain.CameraAccountAgg;
|
||||||
using AccountManagement.Domain.SubAccountAgg;
|
using AccountManagement.Domain.SubAccountAgg;
|
||||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||||
using Company.Domain.WorkshopAccountAgg;
|
|
||||||
using Company.Domain.WorkshopSubAccountAgg;
|
using Company.Domain.WorkshopSubAccountAgg;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
|
|
||||||
|
|
||||||
namespace AccountManagement.Application
|
namespace AccountManagement.Application
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using AccountManagement.Application.Contracts.TaskSubject;
|
using AccountManagement.Application.Contracts.TaskSubject;
|
||||||
using AccountManagement.Domain.TaskSubjectAgg;
|
using AccountManagement.Domain.TaskSubjectAgg;
|
||||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
|
|
||||||
|
|
||||||
namespace AccountManagement.Application;
|
namespace AccountManagement.Application;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public interface IAccountLeftworkRepository : IRepository<long, AccountLeftWork>
|
|||||||
{
|
{
|
||||||
(string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId);
|
(string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId);
|
||||||
List<WorkshopAccountlistViewModel> WorkshopList(long accountId);
|
List<WorkshopAccountlistViewModel> WorkshopList(long accountId);
|
||||||
List<WorkshopSelectList> GetAllWorkshops();
|
// List<WorkshopSelectList> GetAllWorkshops();
|
||||||
|
|
||||||
OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId);
|
OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId);
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||||
|
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
<ProjectReference Include="..\0_Framework\0_Framework.csproj" />
|
||||||
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
<ProjectReference Include="..\AccountManagement.Application.Contracts\AccountManagement.Application.Contracts.csproj" />
|
||||||
|
|||||||
155
AccountManagement.Domain/InternalApiCaller/InternalApiCaller.cs
Normal file
155
AccountManagement.Domain/InternalApiCaller/InternalApiCaller.cs
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Text;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
|
||||||
|
namespace AccountManagement.Domain.InternalApiCaller;
|
||||||
|
|
||||||
|
public class ApiResult<T>
|
||||||
|
{
|
||||||
|
public bool Success { get; set; }
|
||||||
|
public T Result { get; set; }
|
||||||
|
public string Error { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class InternalApiCaller
|
||||||
|
{
|
||||||
|
private static string _baseUrl = "";
|
||||||
|
|
||||||
|
public static void SetBaseUrl(string baseUrl)
|
||||||
|
{
|
||||||
|
_baseUrl = baseUrl.TrimEnd('/'); // حذف / اضافی
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
///api post متد
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TRequest"></typeparam>
|
||||||
|
/// <typeparam name="TResponse"></typeparam>
|
||||||
|
/// <param name="url"></param>
|
||||||
|
/// <param name="internalKey"></param>
|
||||||
|
/// <param name="body"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static ApiResult<TResponse> PostAsync<TRequest, TResponse>(
|
||||||
|
string url,
|
||||||
|
string internalKey,
|
||||||
|
TRequest body
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var client = new HttpClient();
|
||||||
|
|
||||||
|
// ساخت URL نهایی
|
||||||
|
var finalUrl = $"{_baseUrl}/{url.TrimStart('/')}";
|
||||||
|
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Post, finalUrl);
|
||||||
|
|
||||||
|
request.Headers.Add("X-INTERNAL-KEY", internalKey);
|
||||||
|
|
||||||
|
var json = JsonConvert.SerializeObject(body);
|
||||||
|
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
|
||||||
|
|
||||||
|
var response = client.SendAsync(request).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Error = $"HTTP Error: {response.StatusCode}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var text = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
|
||||||
|
var deserialized = JsonConvert.DeserializeObject<TResponse>(text);
|
||||||
|
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = true,
|
||||||
|
Result = deserialized
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Error = ex.Message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Api Get متد
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TResponse"></typeparam>
|
||||||
|
/// <param name="url"></param>
|
||||||
|
/// <param name="internalKey"></param>
|
||||||
|
/// <param name="parameters"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static ApiResult<TResponse> GetAsync<TResponse>(
|
||||||
|
string url,
|
||||||
|
string internalKey,
|
||||||
|
Dictionary<string, object> parameters = null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (parameters != null && parameters.Any())
|
||||||
|
{
|
||||||
|
var query = string.Join("&",
|
||||||
|
parameters
|
||||||
|
.Where(p => p.Value != null)
|
||||||
|
.Select(p => $"{p.Key}={p.Value}")
|
||||||
|
);
|
||||||
|
|
||||||
|
url += url.Contains("?") ? "&" + query : "?" + query;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ساخت URL نهایی
|
||||||
|
var finalUrl = $"{_baseUrl}/{url.TrimStart('/')}";
|
||||||
|
|
||||||
|
var client = new HttpClient();
|
||||||
|
var request = new HttpRequestMessage(HttpMethod.Get, finalUrl);
|
||||||
|
|
||||||
|
request.Headers.Add("X-INTERNAL-KEY", internalKey);
|
||||||
|
|
||||||
|
var response = client.SendAsync(request).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Error = $"HTTP Error: {response.StatusCode}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var text = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
|
||||||
|
var deserialized = JsonConvert.DeserializeObject<TResponse>(text);
|
||||||
|
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = true,
|
||||||
|
Result = deserialized
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return new ApiResult<TResponse>
|
||||||
|
{
|
||||||
|
Success = false,
|
||||||
|
Error = ex.Message
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using AccountManagement.Domain.AccountAgg;
|
using AccountManagement.Domain.AccountAgg;
|
||||||
using AccountMangement.Infrastructure.EFCore.Mappings;
|
using AccountMangement.Infrastructure.EFCore.Mappings;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
@@ -26,7 +26,6 @@ using AccountManagement.Domain.SubAccountPermissionSubtitle2Agg;
|
|||||||
using AccountManagement.Domain.SubAccountPermissionSubtitle3Agg;
|
using AccountManagement.Domain.SubAccountPermissionSubtitle3Agg;
|
||||||
using AccountManagement.Domain.SubAccountPermissionSubtitle4Agg;
|
using AccountManagement.Domain.SubAccountPermissionSubtitle4Agg;
|
||||||
using AccountManagement.Domain.SubAccountRoleAgg;
|
using AccountManagement.Domain.SubAccountRoleAgg;
|
||||||
using AccountMangement.Infrastructure.EFCore.Seed;
|
|
||||||
using AccountManagement.Domain.TaskScheduleAgg;
|
using AccountManagement.Domain.TaskScheduleAgg;
|
||||||
|
|
||||||
namespace AccountMangement.Infrastructure.EFCore
|
namespace AccountMangement.Infrastructure.EFCore
|
||||||
@@ -60,9 +59,10 @@ namespace AccountMangement.Infrastructure.EFCore
|
|||||||
|
|
||||||
public DbSet<TaskSchedule> TaskSchedules { get; set; }
|
public DbSet<TaskSchedule> TaskSchedules { get; set; }
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region Pooya
|
#region Pooya
|
||||||
public DbSet<SubAccount> SubAccounts { get; set; }
|
public DbSet<SubAccount> SubAccounts { get; set; }
|
||||||
public DbSet<SubAccountRole> SubAccountRoles { get; set; }
|
public DbSet<SubAccountRole> SubAccountRoles { get; set; }
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
|
<PackageReference Include="Azure.Identity" Version="1.17.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" />
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.4">
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.1">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
@@ -18,4 +20,12 @@
|
|||||||
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
<ProjectReference Include="..\Company.Domain\Company.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Services\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Mappings\BugReportMapping.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class addprogrammangerbooinaccount : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "IsProgramManagerUser",
|
||||||
|
table: "Accounts",
|
||||||
|
type: "bit",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "IsProgramManagerUser",
|
||||||
|
table: "Accounts");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace AccountMangement.Infrastructure.EFCore.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class romoveIsProgramManagerUserFromAccount : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "IsProgramManagerUser",
|
||||||
|
table: "Accounts");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "IsProgramManagerUser",
|
||||||
|
table: "Accounts",
|
||||||
|
type: "bit",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
|||||||
{
|
{
|
||||||
#pragma warning disable 612, 618
|
#pragma warning disable 612, 618
|
||||||
modelBuilder
|
modelBuilder
|
||||||
.HasAnnotation("ProductVersion", "8.0.10")
|
.HasAnnotation("ProductVersion", "10.0.1")
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
.HasAnnotation("Relational:MaxIdentifierLength", 128);
|
||||||
|
|
||||||
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
|
||||||
@@ -377,6 +377,87 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
|||||||
b.ToTable("Medias", (string)null);
|
b.ToTable("Medias", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmRoleAgg.PmRole", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationDate")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<long?>("GozareshgirRoleId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<string>("RoleName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.HasKey("id");
|
||||||
|
|
||||||
|
b.ToTable("PmRoles", null, t =>
|
||||||
|
{
|
||||||
|
t.ExcludeFromMigrations();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmUserAgg.PmUser", b =>
|
||||||
|
{
|
||||||
|
b.Property<long>("id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("id"));
|
||||||
|
|
||||||
|
b.Property<long?>("AccountId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b.Property<DateTime>("CreationDate")
|
||||||
|
.HasColumnType("datetime2");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.HasMaxLength(150)
|
||||||
|
.HasColumnType("nvarchar(150)");
|
||||||
|
|
||||||
|
b.Property<string>("FullName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<bool>("IsActive")
|
||||||
|
.HasColumnType("bit");
|
||||||
|
|
||||||
|
b.Property<string>("Mobile")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(20)
|
||||||
|
.HasColumnType("nvarchar(20)");
|
||||||
|
|
||||||
|
b.Property<string>("Password")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(1000)
|
||||||
|
.HasColumnType("nvarchar(1000)");
|
||||||
|
|
||||||
|
b.Property<string>("ProfilePhotoPath")
|
||||||
|
.HasMaxLength(500)
|
||||||
|
.HasColumnType("nvarchar(500)");
|
||||||
|
|
||||||
|
b.Property<string>("UserName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(100)
|
||||||
|
.HasColumnType("nvarchar(100)");
|
||||||
|
|
||||||
|
b.Property<string>("VerifyCode")
|
||||||
|
.HasMaxLength(10)
|
||||||
|
.HasColumnType("nvarchar(10)");
|
||||||
|
|
||||||
|
b.HasKey("id");
|
||||||
|
|
||||||
|
b.ToTable("Users", (string)null);
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("AccountManagement.Domain.PositionAgg.Position", b =>
|
modelBuilder.Entity("AccountManagement.Domain.PositionAgg.Position", b =>
|
||||||
{
|
{
|
||||||
b.Property<long>("id")
|
b.Property<long>("id")
|
||||||
@@ -1001,6 +1082,71 @@ namespace AccountMangement.Infrastructure.EFCore.Migrations
|
|||||||
b.Navigation("Media");
|
b.Navigation("Media");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmRoleAgg.PmRole", b =>
|
||||||
|
{
|
||||||
|
b.OwnsMany("AccountManagement.Domain.PmDomains.PmPermissionAgg.PmPermission", "PmPermission", b1 =>
|
||||||
|
{
|
||||||
|
b1.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<long>("Id"));
|
||||||
|
|
||||||
|
b1.Property<int>("Code")
|
||||||
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
b1.Property<long>("Roleid")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b1.HasKey("Id");
|
||||||
|
|
||||||
|
b1.HasIndex("Roleid");
|
||||||
|
|
||||||
|
b1.ToTable("PmRolePermissions", null, t =>
|
||||||
|
{
|
||||||
|
t.ExcludeFromMigrations();
|
||||||
|
});
|
||||||
|
|
||||||
|
b1.WithOwner("Role")
|
||||||
|
.HasForeignKey("Roleid");
|
||||||
|
|
||||||
|
b1.Navigation("Role");
|
||||||
|
});
|
||||||
|
|
||||||
|
b.Navigation("PmPermission");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("AccountManagement.Domain.PmDomains.PmUserAgg.PmUser", b =>
|
||||||
|
{
|
||||||
|
b.OwnsMany("AccountManagement.Domain.PmDomains.PmRoleUserAgg.PmRoleUser", "RoleUser", b1 =>
|
||||||
|
{
|
||||||
|
b1.Property<long>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property<long>("Id"));
|
||||||
|
|
||||||
|
b1.Property<long>("RoleId")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b1.Property<long>("Userid")
|
||||||
|
.HasColumnType("bigint");
|
||||||
|
|
||||||
|
b1.HasKey("Id");
|
||||||
|
|
||||||
|
b1.HasIndex("Userid");
|
||||||
|
|
||||||
|
b1.ToTable("RoleUsers", (string)null);
|
||||||
|
|
||||||
|
b1.WithOwner("User")
|
||||||
|
.HasForeignKey("Userid");
|
||||||
|
|
||||||
|
b1.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
b.Navigation("RoleUser");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("AccountManagement.Domain.RoleAgg.Role", b =>
|
modelBuilder.Entity("AccountManagement.Domain.RoleAgg.Role", b =>
|
||||||
{
|
{
|
||||||
b.OwnsMany("AccountManagement.Domain.RoleAgg.Permission", "Permissions", b1 =>
|
b.OwnsMany("AccountManagement.Domain.RoleAgg.Permission", "Permissions", b1 =>
|
||||||
|
|||||||
@@ -18,14 +18,13 @@ public class AccountLeftworkRepository : RepositoryBase<long, AccountLeftWork>,
|
|||||||
{
|
{
|
||||||
private readonly AccountContext _accountContext;
|
private readonly AccountContext _accountContext;
|
||||||
private readonly IWorkshopAccountRepository _workshopAccountRepository;
|
private readonly IWorkshopAccountRepository _workshopAccountRepository;
|
||||||
private readonly IWorkshopApplication _workshopApplication;
|
|
||||||
|
|
||||||
public AccountLeftworkRepository(AccountContext accountContext, IWorkshopAccountRepository workshopAccountRepository, IWorkshopApplication workshopApplication) : base(accountContext)
|
public AccountLeftworkRepository(AccountContext accountContext,
|
||||||
|
IWorkshopAccountRepository workshopAccountRepository) : base(accountContext)
|
||||||
{
|
{
|
||||||
_accountContext = accountContext;
|
_accountContext = accountContext;
|
||||||
_workshopAccountRepository = workshopAccountRepository;
|
_workshopAccountRepository = workshopAccountRepository;
|
||||||
_workshopApplication = workshopApplication;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public (string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId)
|
public (string StartWorkFa, string LeftWorkFa) GetByAccountId(long accountId)
|
||||||
{
|
{
|
||||||
@@ -58,14 +57,14 @@ public class AccountLeftworkRepository : RepositoryBase<long, AccountLeftWork>,
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<WorkshopSelectList> GetAllWorkshops()
|
// public List<WorkshopSelectList> GetAllWorkshops()
|
||||||
{
|
// {
|
||||||
return this._workshopApplication.GetWorkshopAll().Select(x => new WorkshopSelectList()
|
// return this._workshopApplication.GetWorkshopAll().Select(x => new WorkshopSelectList()
|
||||||
{
|
// {
|
||||||
Id = x.Id,
|
// Id = x.Id,
|
||||||
WorkshopFullName = x.WorkshopFullName
|
// WorkshopFullName = x.WorkshopFullName
|
||||||
}).ToList();
|
// }).ToList();
|
||||||
}
|
// }
|
||||||
|
|
||||||
public OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId)
|
public OperationResult CopyWorkshopToNewAccount(long currentAccountId, long newAccountId)
|
||||||
{
|
{
|
||||||
|
|||||||
175
BUG_REPORT_SYSTEM.md
Normal file
175
BUG_REPORT_SYSTEM.md
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
# سیستم گزارش خرابی (Bug Report System)
|
||||||
|
|
||||||
|
## نمای کلی
|
||||||
|
|
||||||
|
این سیستم برای جمعآوری، ذخیره و مدیریت گزارشهای خرابی از تطبیق موبایلی طراحی شده است.
|
||||||
|
|
||||||
|
## ساختار فایلها
|
||||||
|
|
||||||
|
### Domain Layer
|
||||||
|
- `AccountManagement.Domain/BugReportAgg/`
|
||||||
|
- `BugReport.cs` - موجودیت اصلی
|
||||||
|
- `BugReportLog.cs` - لاگهای گزارش
|
||||||
|
- `BugReportScreenshot.cs` - تصاویر ضمیمه شده
|
||||||
|
|
||||||
|
### Application Contracts
|
||||||
|
- `AccountManagement.Application.Contracts/BugReport/`
|
||||||
|
- `IBugReportApplication.cs` - اینترفیس سرویس
|
||||||
|
- `CreateBugReportCommand.cs` - درخواست ایجاد
|
||||||
|
- `EditBugReportCommand.cs` - درخواست ویرایش
|
||||||
|
- `BugReportViewModel.cs` - نمایش لیست
|
||||||
|
- `BugReportDetailViewModel.cs` - نمایش جزئیات
|
||||||
|
- `IBugReportRepository.cs` - اینترفیس Repository
|
||||||
|
|
||||||
|
### Application Service
|
||||||
|
- `AccountManagement.Application/BugReportApplication.cs` - پیادهسازی سرویس
|
||||||
|
|
||||||
|
### Infrastructure
|
||||||
|
- `AccountMangement.Infrastructure.EFCore/`
|
||||||
|
- `Mappings/BugReportMapping.cs`
|
||||||
|
- `Mappings/BugReportLogMapping.cs`
|
||||||
|
- `Mappings/BugReportScreenshotMapping.cs`
|
||||||
|
- `Repository/BugReportRepository.cs`
|
||||||
|
|
||||||
|
### API Controller
|
||||||
|
- `ServiceHost/Controllers/BugReportController.cs`
|
||||||
|
|
||||||
|
### Admin Pages
|
||||||
|
- `ServiceHost/Areas/AdminNew/Pages/BugReport/`
|
||||||
|
- `BugReportPageModel.cs` - base model
|
||||||
|
- `Index.cshtml.cs / Index.cshtml` - لیست گزارشها
|
||||||
|
- `Details.cshtml.cs / Details.cshtml` - جزئیات کامل
|
||||||
|
- `Edit.cshtml.cs / Edit.cshtml` - ویرایش وضعیت/اولویت
|
||||||
|
- `Delete.cshtml.cs / Delete.cshtml` - حذف
|
||||||
|
|
||||||
|
## روش استفاده
|
||||||
|
|
||||||
|
### 1. ثبت گزارش از موبایل
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
POST /api/bugreport/submit
|
||||||
|
|
||||||
|
{
|
||||||
|
"title": "برنامه هنگام ورود خراب میشود",
|
||||||
|
"description": "هنگام وارد کردن نام کاربری، برنامه کرش میکند",
|
||||||
|
"userEmail": "user@example.com",
|
||||||
|
"deviceModel": "Samsung Galaxy S21",
|
||||||
|
"osVersion": "Android 12",
|
||||||
|
"platform": "Android",
|
||||||
|
"manufacturer": "Samsung",
|
||||||
|
"deviceId": "device-unique-id",
|
||||||
|
"screenResolution": "1440x3200",
|
||||||
|
"memoryInMB": 8000,
|
||||||
|
"storageInMB": 256000,
|
||||||
|
"batteryLevel": 75,
|
||||||
|
"isCharging": false,
|
||||||
|
"networkType": "4G",
|
||||||
|
"appVersion": "1.0.0",
|
||||||
|
"buildNumber": "100",
|
||||||
|
"packageName": "com.example.app",
|
||||||
|
"installTime": "2024-01-01T10:00:00Z",
|
||||||
|
"lastUpdateTime": "2024-12-01T14:30:00Z",
|
||||||
|
"flavor": "production",
|
||||||
|
"type": 1, // Crash = 1
|
||||||
|
"priority": 2, // High = 2
|
||||||
|
"stackTrace": "...",
|
||||||
|
"logs": ["log1", "log2"],
|
||||||
|
"screenshots": ["base64-encoded-image-1"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. دسترسی به Admin Panel
|
||||||
|
|
||||||
|
```
|
||||||
|
https://yourdomain.com/AdminNew/BugReport
|
||||||
|
```
|
||||||
|
|
||||||
|
**صفحات موجود:**
|
||||||
|
- **Index** - لیست تمام گزارشها با فیلترها
|
||||||
|
- **Details** - نمایش جزئیات کامل شامل:
|
||||||
|
- معلومات کاربر و گزارش
|
||||||
|
- معلومات دستگاه
|
||||||
|
- معلومات برنامه
|
||||||
|
- لاگها
|
||||||
|
- تصاویر
|
||||||
|
- Stack Trace
|
||||||
|
- **Edit** - تغییر وضعیت و اولویت
|
||||||
|
- **Delete** - حذف گزارش
|
||||||
|
|
||||||
|
### 3. درخواستهای API
|
||||||
|
|
||||||
|
#### دریافت لیست
|
||||||
|
```
|
||||||
|
GET /api/bugreport/list?type=1&priority=2&status=1&searchTerm=crash&pageNumber=1&pageSize=10
|
||||||
|
```
|
||||||
|
|
||||||
|
#### دریافت جزئیات
|
||||||
|
```
|
||||||
|
GET /api/bugreport/{id}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ویرایش
|
||||||
|
```
|
||||||
|
PUT /api/bugreport/{id}
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"priority": 2,
|
||||||
|
"status": 3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### حذف
|
||||||
|
```
|
||||||
|
DELETE /api/bugreport/{id}
|
||||||
|
```
|
||||||
|
|
||||||
|
## انواع (Enums)
|
||||||
|
|
||||||
|
### BugReportType
|
||||||
|
- `1` - Crash (کرش)
|
||||||
|
- `2` - UI (مشکل رابط)
|
||||||
|
- `3` - Performance (عملکرد)
|
||||||
|
- `4` - Feature (فیچر)
|
||||||
|
- `5` - Network (شبکه)
|
||||||
|
- `6` - Camera (دوربین)
|
||||||
|
- `7` - FaceRecognition (تشخیص چهره)
|
||||||
|
- `8` - Database (دیتابیس)
|
||||||
|
- `9` - Login (ورود)
|
||||||
|
- `10` - Other (سایر)
|
||||||
|
|
||||||
|
### BugPriority
|
||||||
|
- `1` - Critical (بحرانی)
|
||||||
|
- `2` - High (بالا)
|
||||||
|
- `3` - Medium (متوسط)
|
||||||
|
- `4` - Low (پایین)
|
||||||
|
|
||||||
|
### BugReportStatus
|
||||||
|
- `1` - Open (باز)
|
||||||
|
- `2` - InProgress (در حال بررسی)
|
||||||
|
- `3` - Fixed (رفع شده)
|
||||||
|
- `4` - Closed (بسته شده)
|
||||||
|
- `5` - Reopened (مجدداً باز)
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
|
||||||
|
برای اعمال تغییرات دیتابیس:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Add-Migration AddBugReportTables
|
||||||
|
Update-Database
|
||||||
|
```
|
||||||
|
|
||||||
|
## نکات مهم
|
||||||
|
|
||||||
|
1. **تصاویر**: تصاویر به صورت Base64 encoded ذخیره میشوند
|
||||||
|
2. **لاگها**: تمام لاگها به صورت جدا ذخیره میشوند
|
||||||
|
3. **وضعیت پیشفرض**: وقتی گزارش ثبت میشود، وضعیت آن "Open" است
|
||||||
|
4. **تاریخ**: تاریخ ایجاد و بروزرسانی خودکار ثبت میشود
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- API endpoints از `authentication` محافظت میشوند
|
||||||
|
- Admin pages تنها برای کاربرانی با دسترسی AdminArea قابل دسترس هستند
|
||||||
|
- حذف و ویرایش نیاز به تأیید دارد
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<AssemblyName>BackgroundInstitutionContract.Task</AssemblyName>
|
<AssemblyName>BackgroundInstitutionContract.Task</AssemblyName>
|
||||||
@@ -12,8 +12,14 @@
|
|||||||
<ProjectReference Include="..\..\0_Framework\0_Framework.csproj" />
|
<ProjectReference Include="..\..\0_Framework\0_Framework.csproj" />
|
||||||
<ProjectReference Include="..\..\AccountManagement.Configuration\AccountManagement.Configuration.csproj" />
|
<ProjectReference Include="..\..\AccountManagement.Configuration\AccountManagement.Configuration.csproj" />
|
||||||
<ProjectReference Include="..\..\PersonalContractingParty.Config\PersonalContractingParty.Config.csproj" />
|
<ProjectReference Include="..\..\PersonalContractingParty.Config\PersonalContractingParty.Config.csproj" />
|
||||||
|
<ProjectReference Include="..\..\ProgramManager\src\Infrastructure\GozareshgirProgramManager.Infrastructure\GozareshgirProgramManager.Infrastructure.csproj" />
|
||||||
<ProjectReference Include="..\..\Query.Bootstrapper\Query.Bootstrapper.csproj" />
|
<ProjectReference Include="..\..\Query.Bootstrapper\Query.Bootstrapper.csproj" />
|
||||||
<ProjectReference Include="..\..\WorkFlow\Infrastructure\WorkFlow.Infrastructure.Config\WorkFlow.Infrastructure.Config.csproj" />
|
<ProjectReference Include="..\..\WorkFlow\Infrastructure\WorkFlow.Infrastructure.Config\WorkFlow.Infrastructure.Config.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||||
|
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Application.Sms;
|
||||||
using Company.Domain.ContarctingPartyAgg;
|
using Company.Domain.ContarctingPartyAgg;
|
||||||
using Company.Domain.InstitutionContractAgg;
|
using Company.Domain.InstitutionContractAgg;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
@@ -11,20 +13,26 @@ public class JobSchedulerRegistrator
|
|||||||
private readonly IBackgroundJobClient _backgroundJobClient;
|
private readonly IBackgroundJobClient _backgroundJobClient;
|
||||||
private readonly SmsReminder _smsReminder;
|
private readonly SmsReminder _smsReminder;
|
||||||
private readonly IInstitutionContractRepository _institutionContractRepository;
|
private readonly IInstitutionContractRepository _institutionContractRepository;
|
||||||
|
private readonly IInstitutionContractSmsServiceRepository _institutionContractSmsServiceRepository;
|
||||||
private static DateTime? _lastRunCreateTransaction;
|
private static DateTime? _lastRunCreateTransaction;
|
||||||
private static DateTime? _lastRunSendMonthlySms;
|
private static DateTime? _lastRunSendMonthlySms;
|
||||||
|
private readonly ISmsService _smsService;
|
||||||
|
private readonly ILogger<JobSchedulerRegistrator> _logger;
|
||||||
|
|
||||||
|
|
||||||
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository)
|
public JobSchedulerRegistrator(SmsReminder smsReminder, IBackgroundJobClient backgroundJobClient, IInstitutionContractRepository institutionContractRepository, ISmsService smsService, ILogger<JobSchedulerRegistrator> logger, IInstitutionContractSmsServiceRepository institutionContractSmsServiceRepository)
|
||||||
{
|
{
|
||||||
_smsReminder = smsReminder;
|
_smsReminder = smsReminder;
|
||||||
_backgroundJobClient = backgroundJobClient;
|
_backgroundJobClient = backgroundJobClient;
|
||||||
_institutionContractRepository = institutionContractRepository;
|
_institutionContractRepository = institutionContractRepository;
|
||||||
|
_smsService = smsService;
|
||||||
|
_logger = logger;
|
||||||
|
_institutionContractSmsServiceRepository = institutionContractSmsServiceRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Register()
|
public void Register()
|
||||||
{
|
{
|
||||||
|
_logger.LogInformation("hangfire Started");
|
||||||
RecurringJob.AddOrUpdate(
|
RecurringJob.AddOrUpdate(
|
||||||
"InstitutionContract.CreateFinancialTransaction",
|
"InstitutionContract.CreateFinancialTransaction",
|
||||||
() => CreateFinancialTransaction(),
|
() => CreateFinancialTransaction(),
|
||||||
@@ -47,6 +55,49 @@ public class JobSchedulerRegistrator
|
|||||||
() => SendBlockSms(),
|
() => SendBlockSms(),
|
||||||
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
);
|
);
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendInstitutionContractConfirmSms",
|
||||||
|
() => SendInstitutionContractConfirmSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendWarningSms",
|
||||||
|
() => SendWarningSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.SendLegalActionSms",
|
||||||
|
() => SendLegalActionSms(),
|
||||||
|
"*/1 * * * *" // هر 1 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.Block",
|
||||||
|
() => Block(),
|
||||||
|
"*/30 * * * *" // هر 30 دقیقه یکبار چک کن
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.UnBlock",
|
||||||
|
() => UnBlock(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.DeActiveInstitutionEndOfContract",
|
||||||
|
() => DeActiveInstitutionEndOfContract(),
|
||||||
|
"*/30 * * * *"
|
||||||
|
);
|
||||||
|
|
||||||
|
RecurringJob.AddOrUpdate(
|
||||||
|
"InstitutionContract.BlueDeActiveAfterZeroDebt",
|
||||||
|
() => BlueDeActiveAfterZeroDebt(),
|
||||||
|
"*/10 * * * *"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -57,10 +108,10 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
||||||
public async System.Threading.Tasks.Task CreateFinancialTransaction()
|
public async System.Threading.Tasks.Task CreateFinancialTransaction()
|
||||||
{
|
{
|
||||||
var now =DateTime.Now;
|
var now = DateTime.Now;
|
||||||
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
||||||
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
||||||
|
_logger.LogInformation("CreateFinancialTransaction job run");
|
||||||
if (now.Date == endOfMonthGr.Date && now.Hour >= 2 && now.Hour < 4 &&
|
if (now.Date == endOfMonthGr.Date && now.Hour >= 2 && now.Hour < 4 &&
|
||||||
now.Date != _lastRunCreateTransaction?.Date)
|
now.Date != _lastRunCreateTransaction?.Date)
|
||||||
{
|
{
|
||||||
@@ -79,14 +130,14 @@ public class JobSchedulerRegistrator
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description);
|
await _institutionContractRepository.CreateTransactionForInstitutionContracts(endNewGr, endNewFa, description);
|
||||||
_lastRunCreateTransaction = now;
|
_lastRunCreateTransaction = now;
|
||||||
Console.WriteLine("CreateTransAction executed");
|
Console.WriteLine("CreateTransAction executed");
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
//_smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
await _smsService.Alarm("09114221321", "خطا-ایجاد سند مالی");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,14 +156,14 @@ public class JobSchedulerRegistrator
|
|||||||
var now = DateTime.Now;
|
var now = DateTime.Now;
|
||||||
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
var endOfMonth = now.ToFarsi().FindeEndOfMonth();
|
||||||
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
var endOfMonthGr = endOfMonth.ToGeorgianDateTime();
|
||||||
|
_logger.LogInformation("SendFirstDayOfMonthSms job run");
|
||||||
if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 &&
|
if (now.Date == endOfMonthGr.Date && now.Hour >= 10 && now.Hour < 11 &&
|
||||||
now.Date != _lastRunSendMonthlySms?.Date)
|
now.Date != _lastRunSendMonthlySms?.Date)
|
||||||
{
|
{
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendMonthlySms(now);
|
await _institutionContractSmsServiceRepository.SendMonthlySms(now);
|
||||||
_lastRunSendMonthlySms = now;
|
_lastRunSendMonthlySms = now;
|
||||||
Console.WriteLine("Send Monthly sms executed");
|
Console.WriteLine("Send Monthly sms executed");
|
||||||
|
|
||||||
@@ -133,7 +184,8 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
[DisableConcurrentExecution(timeoutInSeconds: 1200)]
|
||||||
public async System.Threading.Tasks.Task SendReminderSms()
|
public async System.Threading.Tasks.Task SendReminderSms()
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendReminderSmsForBackgroundTask();
|
_logger.LogInformation("SendReminderSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendReminderSmsForBackgroundTask();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -143,7 +195,110 @@ public class JobSchedulerRegistrator
|
|||||||
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
public async System.Threading.Tasks.Task SendBlockSms()
|
public async System.Threading.Tasks.Task SendBlockSms()
|
||||||
{
|
{
|
||||||
await _institutionContractRepository.SendBlockSmsForBackgroundTask();
|
_logger.LogInformation("SendBlockSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendBlockSmsForBackgroundTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendInstitutionContractConfirmSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendInstitutionContractConfirmSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendInstitutionContractConfirmSmsTask();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendWarningSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.Warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پیامک اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task SendLegalActionSms()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("SendWarningSms job run");
|
||||||
|
await _institutionContractSmsServiceRepository.SendWarningOrLegalActionSmsTask(TypeOfSmsSetting.LegalAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاگ سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task Block()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("block job run");
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "20")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.Block(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task UnBlock()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("UnBlock job run");
|
||||||
|
|
||||||
|
await _institutionContractSmsServiceRepository.UnBlock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 100)]
|
||||||
|
public async System.Threading.Tasks.Task DeActiveInstitutionEndOfContract()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("DeActiveInstitutionEndOfContract job run");
|
||||||
|
|
||||||
|
|
||||||
|
var now = DateTime.Now;
|
||||||
|
var executeDate = now.ToFarsi().Substring(8, 2);
|
||||||
|
if (executeDate == "01")
|
||||||
|
{
|
||||||
|
if (now.Hour >= 9 && now.Hour < 10)
|
||||||
|
{
|
||||||
|
await _institutionContractSmsServiceRepository.DeActiveInstitutionEndOfContract(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[DisableConcurrentExecution(timeoutInSeconds: 800)]
|
||||||
|
public async System.Threading.Tasks.Task BlueDeActiveAfterZeroDebt()
|
||||||
|
{
|
||||||
|
_logger.LogInformation("BlueDeActiveAfterZeroDebt job run");
|
||||||
|
await _institutionContractSmsServiceRepository.BlueDeActiveAfterZeroDebt();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using GozareshgirProgramManager.Application.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||||||
|
|
||||||
|
public class NullBoardNotificationPublisher:IBoardNotificationPublisher
|
||||||
|
{
|
||||||
|
public Task SendProjectStatusChanged(long userId, TaskSectionStatus oldStatus, TaskSectionStatus newStatus, Guid sectionId)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,13 +7,47 @@ using BackgroundInstitutionContract.Task;
|
|||||||
using BackgroundInstitutionContract.Task.Jobs;
|
using BackgroundInstitutionContract.Task.Jobs;
|
||||||
using CompanyManagment.App.Contracts.Hubs;
|
using CompanyManagment.App.Contracts.Hubs;
|
||||||
using CompanyManagment.EFCore.Services;
|
using CompanyManagment.EFCore.Services;
|
||||||
|
using GozareshgirProgramManager.Application._Bootstrapper;
|
||||||
|
using GozareshgirProgramManager.Application.Interfaces;
|
||||||
|
using GozareshgirProgramManager.Application.Modules.Users.Commands.CreateUser;
|
||||||
|
using GozareshgirProgramManager.Infrastructure;
|
||||||
|
using GozareshgirProgramManager.Infrastructure.Persistence.Seed;
|
||||||
using Hangfire;
|
using Hangfire;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
using PersonalContractingParty.Config;
|
using PersonalContractingParty.Config;
|
||||||
using Query.Bootstrapper;
|
using Query.Bootstrapper;
|
||||||
|
using Serilog;
|
||||||
|
using Serilog.Events;
|
||||||
|
using Shared.Contracts.PmUser.Queries;
|
||||||
using WorkFlow.Infrastructure.Config;
|
using WorkFlow.Infrastructure.Config;
|
||||||
|
|
||||||
|
var logDirectory = @"C:\Logs\Hangfire\BackgroundInstitutionContract\";
|
||||||
|
|
||||||
|
if (!Directory.Exists(logDirectory))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(logDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.Logger = new LoggerConfiguration()
|
||||||
|
//NO EF Core log
|
||||||
|
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
|
||||||
|
|
||||||
|
//NO DbCommand log
|
||||||
|
.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning)
|
||||||
|
|
||||||
|
//NO Microsoft Public log
|
||||||
|
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
|
||||||
|
//.MinimumLevel.Information()
|
||||||
|
.WriteTo.File(
|
||||||
|
path: Path.Combine(logDirectory, "institution-contract-log-.txt"),
|
||||||
|
rollingInterval: RollingInterval.Day,
|
||||||
|
retainedFileCountLimit: 30,
|
||||||
|
shared: true,
|
||||||
|
outputTemplate:
|
||||||
|
"{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}"
|
||||||
|
).CreateLogger();
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
|
var hangfireConnectionString = builder.Configuration.GetConnectionString("HangfireDb");
|
||||||
builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
|
builder.Services.AddHangfire(x => x.UseSqlServerStorage(hangfireConnectionString));
|
||||||
@@ -26,7 +60,7 @@ builder.Services.AddTransient<ISmsService, SmsService>();
|
|||||||
builder.Services.AddTransient<IUidService, UidService>();
|
builder.Services.AddTransient<IUidService, UidService>();
|
||||||
builder.Services.AddTransient<IFileUploader, FileUploader>();
|
builder.Services.AddTransient<IFileUploader, FileUploader>();
|
||||||
builder.Services.Configure<AppSettingConfiguration>(builder.Configuration);
|
builder.Services.Configure<AppSettingConfiguration>(builder.Configuration);
|
||||||
|
builder.Services.AddScoped<IBoardNotificationPublisher, NullBoardNotificationPublisher>();
|
||||||
#region MongoDb
|
#region MongoDb
|
||||||
|
|
||||||
var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
|
var mongoConnectionSection = builder.Configuration.GetSection("MongoDb");
|
||||||
@@ -38,17 +72,28 @@ builder.Services.AddSingleton<IMongoDatabase>(mongoDatabase);
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
builder.Services.AddProgramManagerApplication();
|
||||||
|
builder.Services.AddProgramManagerInfrastructure(builder.Configuration);
|
||||||
|
|
||||||
|
|
||||||
PersonalBootstrapper.Configure(builder.Services, connectionString);
|
PersonalBootstrapper.Configure(builder.Services, connectionString);
|
||||||
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
|
TestDbBootStrapper.Configure(builder.Services, connectionStringTestDb);
|
||||||
AccountManagementBootstrapper.Configure(builder.Services, connectionString);
|
AccountManagementBootstrapper.Configure(builder.Services, connectionString);
|
||||||
WorkFlowBootstrapper.Configure(builder.Services, connectionString);
|
WorkFlowBootstrapper.Configure(builder.Services, connectionString);
|
||||||
|
|
||||||
QueryBootstrapper.Configure(builder.Services);
|
QueryBootstrapper.Configure(builder.Services);
|
||||||
JobsBootstrapper.Configure(builder.Services);
|
JobsBootstrapper.Configure(builder.Services);
|
||||||
builder.Services.AddHttpClient();
|
builder.Services.AddHttpClient();
|
||||||
builder.Services.AddHttpContextAccessor();
|
builder.Services.AddHttpContextAccessor();
|
||||||
builder.Services.AddSignalR();
|
builder.Services.AddSignalR();
|
||||||
|
|
||||||
|
|
||||||
|
builder.Host.UseSerilog();
|
||||||
|
Log.Information("SERILOG STARTED SUCCESSFULLY");
|
||||||
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
app.MapHub<SendSmsHub>("/sendSmsHub");
|
app.MapHub<SendSmsHub>("/sendSmsHub");
|
||||||
|
|
||||||
app.MapHangfireDashboard();
|
app.MapHangfireDashboard();
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
|
|
||||||
//mahan Docker
|
//mahan Docker
|
||||||
//"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
|
//"MesbahDb": "Data Source=localhost,5069;Initial Catalog=mesbah_db;User ID=sa;Password=YourPassword123;TrustServerCertificate=True;",
|
||||||
//"HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;",
|
"HangfireDb": "Data Source=.;Initial Catalog=hangfire_db;Integrated Security=True;TrustServerCertificate=true;",
|
||||||
"HangfireDb": "Data Source=185.208.175.186;Initial Catalog=hangfire_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;"
|
//"HangfireDb": "Data Source=185.208.175.186;Initial Catalog=hangfire_db;Persist Security Info=False;User ID=ir_db;Password=R2rNp[170]18[3019]#@ATt;TrustServerCertificate=true;"
|
||||||
},
|
},
|
||||||
|
|
||||||
"GoogleRecaptchaV3": {
|
"GoogleRecaptchaV3": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
314
CHANGELOG.md
Normal file
314
CHANGELOG.md
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
# خلاصه تغییرات سیستم گزارش خرابی
|
||||||
|
|
||||||
|
## 📝 فایلهای اضافه شده (23 فایل)
|
||||||
|
|
||||||
|
### 1️⃣ Domain Layer (3 فایل)
|
||||||
|
```
|
||||||
|
✓ AccountManagement.Domain/BugReportAgg/
|
||||||
|
├── BugReport.cs
|
||||||
|
├── BugReportLog.cs
|
||||||
|
└── BugReportScreenshot.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2️⃣ Application Contracts (6 فایل)
|
||||||
|
```
|
||||||
|
✓ AccountManagement.Application.Contracts/BugReport/
|
||||||
|
├── IBugReportRepository.cs
|
||||||
|
├── IBugReportApplication.cs
|
||||||
|
├── CreateBugReportCommand.cs
|
||||||
|
├── EditBugReportCommand.cs
|
||||||
|
├── BugReportViewModel.cs
|
||||||
|
└── BugReportDetailViewModel.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3️⃣ Application Service (1 فایل)
|
||||||
|
```
|
||||||
|
✓ AccountManagement.Application/
|
||||||
|
└── BugReportApplication.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4️⃣ Infrastructure EFCore (4 فایل)
|
||||||
|
```
|
||||||
|
✓ AccountMangement.Infrastructure.EFCore/
|
||||||
|
├── Mappings/
|
||||||
|
│ ├── BugReportMapping.cs
|
||||||
|
│ ├── BugReportLogMapping.cs
|
||||||
|
│ └── BugReportScreenshotMapping.cs
|
||||||
|
└── Repository/
|
||||||
|
└── BugReportRepository.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5️⃣ API Controller (1 فایل)
|
||||||
|
```
|
||||||
|
✓ ServiceHost/Controllers/
|
||||||
|
└── BugReportController.cs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6️⃣ Admin Pages (8 فایل)
|
||||||
|
```
|
||||||
|
✓ ServiceHost/Areas/AdminNew/Pages/BugReport/
|
||||||
|
├── BugReportPageModel.cs
|
||||||
|
├── Index.cshtml.cs
|
||||||
|
├── Index.cshtml
|
||||||
|
├── Details.cshtml.cs
|
||||||
|
├── Details.cshtml
|
||||||
|
├── Edit.cshtml.cs
|
||||||
|
├── Edit.cshtml
|
||||||
|
├── Delete.cshtml.cs
|
||||||
|
└── Delete.cshtml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7️⃣ Documentation (2 فایل)
|
||||||
|
```
|
||||||
|
✓ BUG_REPORT_SYSTEM.md
|
||||||
|
✓ FLUTTER_BUG_REPORT_EXAMPLE.dart
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✏️ فایلهای اصلاح شده (2 فایل)
|
||||||
|
|
||||||
|
### 1. AccountManagement.Configuration/AccountManagementBootstrapper.cs
|
||||||
|
**تغییر:** اضافه کردن using برای BugReport
|
||||||
|
```csharp
|
||||||
|
using AccountManagement.Application.Contracts.BugReport;
|
||||||
|
```
|
||||||
|
|
||||||
|
**تغییر:** رجیستریشن سرویسها
|
||||||
|
```csharp
|
||||||
|
services.AddTransient<IBugReportApplication, BugReportApplication>();
|
||||||
|
services.AddTransient<IBugReportRepository, BugReportRepository>();
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. AccountMangement.Infrastructure.EFCore/AccountContext.cs
|
||||||
|
**تغییر:** اضافه کردن using
|
||||||
|
```csharp
|
||||||
|
using AccountManagement.Domain.BugReportAgg;
|
||||||
|
```
|
||||||
|
|
||||||
|
**تغییر:** اضافه کردن DbSets
|
||||||
|
```csharp
|
||||||
|
#region BugReport
|
||||||
|
public DbSet<BugReport> BugReports { get; set; }
|
||||||
|
public DbSet<BugReportLog> BugReportLogs { get; set; }
|
||||||
|
public DbSet<BugReportScreenshot> BugReportScreenshots { get; set; }
|
||||||
|
#endregion
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 موارد مورد نیاز قبل از استفاده
|
||||||
|
|
||||||
|
### 1. Database Migration
|
||||||
|
```powershell
|
||||||
|
# در Package Manager Console
|
||||||
|
cd AccountMangement.Infrastructure.EFCore
|
||||||
|
|
||||||
|
Add-Migration AddBugReportSystem
|
||||||
|
Update-Database
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. الگوی Enum برای Flutter
|
||||||
|
```dart
|
||||||
|
enum BugReportType {
|
||||||
|
crash, // 1
|
||||||
|
ui, // 2
|
||||||
|
performance, // 3
|
||||||
|
feature, // 4
|
||||||
|
network, // 5
|
||||||
|
camera, // 6
|
||||||
|
faceRecognition, // 7
|
||||||
|
database, // 8
|
||||||
|
login, // 9
|
||||||
|
other, // 10
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BugPriority {
|
||||||
|
critical, // 1
|
||||||
|
high, // 2
|
||||||
|
medium, // 3
|
||||||
|
low, // 4
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 نقاط ورود
|
||||||
|
|
||||||
|
### API Endpoints
|
||||||
|
```
|
||||||
|
POST /api/bugreport/submit - ثبت گزارش جدید
|
||||||
|
GET /api/bugreport/list - دریافت لیست
|
||||||
|
GET /api/bugreport/{id} - دریافت جزئیات
|
||||||
|
PUT /api/bugreport/{id} - ویرایش وضعیت/اولویت
|
||||||
|
DELETE /api/bugreport/{id} - حذف گزارش
|
||||||
|
```
|
||||||
|
|
||||||
|
### Admin Pages
|
||||||
|
```
|
||||||
|
/AdminNew/BugReport - لیست گزارشها
|
||||||
|
/AdminNew/BugReport/Details/{id} - جزئیات کامل
|
||||||
|
/AdminNew/BugReport/Edit/{id} - ویرایش
|
||||||
|
/AdminNew/BugReport/Delete/{id} - حذف
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Database Schema
|
||||||
|
|
||||||
|
### BugReports جدول
|
||||||
|
```sql
|
||||||
|
- id (bigint, PK)
|
||||||
|
- Title (nvarchar(200))
|
||||||
|
- Description (ntext)
|
||||||
|
- UserEmail (nvarchar(150))
|
||||||
|
- AccountId (bigint, nullable)
|
||||||
|
- DeviceModel (nvarchar(100))
|
||||||
|
- OsVersion (nvarchar(50))
|
||||||
|
- Platform (nvarchar(50))
|
||||||
|
- Manufacturer (nvarchar(100))
|
||||||
|
- DeviceId (nvarchar(200))
|
||||||
|
- ScreenResolution (nvarchar(50))
|
||||||
|
- MemoryInMB (int)
|
||||||
|
- StorageInMB (int)
|
||||||
|
- BatteryLevel (int)
|
||||||
|
- IsCharging (bit)
|
||||||
|
- NetworkType (nvarchar(50))
|
||||||
|
- AppVersion (nvarchar(50))
|
||||||
|
- BuildNumber (nvarchar(50))
|
||||||
|
- PackageName (nvarchar(150))
|
||||||
|
- InstallTime (datetime2)
|
||||||
|
- LastUpdateTime (datetime2)
|
||||||
|
- Flavor (nvarchar(50))
|
||||||
|
- Type (int)
|
||||||
|
- Priority (int)
|
||||||
|
- Status (int)
|
||||||
|
- StackTrace (ntext, nullable)
|
||||||
|
- CreationDate (datetime2)
|
||||||
|
- UpdateDate (datetime2, nullable)
|
||||||
|
```
|
||||||
|
|
||||||
|
### BugReportLogs جدول
|
||||||
|
```sql
|
||||||
|
- id (bigint, PK)
|
||||||
|
- BugReportId (bigint, FK)
|
||||||
|
- Message (ntext)
|
||||||
|
- Timestamp (datetime2)
|
||||||
|
```
|
||||||
|
|
||||||
|
### BugReportScreenshots جدول
|
||||||
|
```sql
|
||||||
|
- id (bigint, PK)
|
||||||
|
- BugReportId (bigint, FK)
|
||||||
|
- Base64Data (ntext)
|
||||||
|
- FileName (nvarchar(255))
|
||||||
|
- UploadDate (datetime2)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✨ مثال درخواست API
|
||||||
|
|
||||||
|
```json
|
||||||
|
POST /api/bugreport/submit
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"title": "برنامه هنگام ورود خراب میشود",
|
||||||
|
"description": "هنگام فشار دادن دکمه ورود، برنامه کرش میکند",
|
||||||
|
"userEmail": "user@example.com",
|
||||||
|
"accountId": 123,
|
||||||
|
"deviceModel": "Samsung Galaxy S21",
|
||||||
|
"osVersion": "Android 12",
|
||||||
|
"platform": "Android",
|
||||||
|
"manufacturer": "Samsung",
|
||||||
|
"deviceId": "device-12345",
|
||||||
|
"screenResolution": "1440x3200",
|
||||||
|
"memoryInMB": 8000,
|
||||||
|
"storageInMB": 256000,
|
||||||
|
"batteryLevel": 75,
|
||||||
|
"isCharging": false,
|
||||||
|
"networkType": "4G",
|
||||||
|
"appVersion": "1.0.0",
|
||||||
|
"buildNumber": "100",
|
||||||
|
"packageName": "com.example.app",
|
||||||
|
"installTime": "2024-01-01T10:00:00Z",
|
||||||
|
"lastUpdateTime": "2024-12-07T14:30:00Z",
|
||||||
|
"flavor": "production",
|
||||||
|
"type": 1,
|
||||||
|
"priority": 2,
|
||||||
|
"stackTrace": "...",
|
||||||
|
"logs": ["log line 1", "log line 2"],
|
||||||
|
"screenshots": ["base64-string"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 Security Features
|
||||||
|
|
||||||
|
- ✅ Authorization برای Admin Pages (AdminAreaPermission required)
|
||||||
|
- ✅ API Authentication
|
||||||
|
- ✅ XSS Protection (Html.Raw محدود)
|
||||||
|
- ✅ CSRF Protection (ASP.NET Core default)
|
||||||
|
- ✅ Input Validation
|
||||||
|
- ✅ Safe Delete with Confirmation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Documentation Files
|
||||||
|
|
||||||
|
1. **BUG_REPORT_SYSTEM.md** - راهنمای کامل سیستم
|
||||||
|
2. **FLUTTER_BUG_REPORT_EXAMPLE.dart** - مثال پیادهسازی Flutter
|
||||||
|
3. **CHANGELOG.md** (این فایل) - خلاصه تغییرات
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ Checklist پیادهسازی
|
||||||
|
|
||||||
|
- [x] Domain Models
|
||||||
|
- [x] Database Mappings
|
||||||
|
- [x] Repository Pattern
|
||||||
|
- [x] Application Services
|
||||||
|
- [x] API Endpoints
|
||||||
|
- [x] Admin UI Pages
|
||||||
|
- [x] Dependency Injection
|
||||||
|
- [x] Error Handling
|
||||||
|
- [x] Documentation
|
||||||
|
- [x] Flutter Example
|
||||||
|
- [ ] Database Migration (باید دستی اجرا شود)
|
||||||
|
- [ ] Testing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 مراحل بعدی
|
||||||
|
|
||||||
|
1. **اجرای Migration:**
|
||||||
|
```powershell
|
||||||
|
Add-Migration AddBugReportSystem
|
||||||
|
Update-Database
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **تست API:**
|
||||||
|
- استفاده از Postman/Thunder Client
|
||||||
|
- تست تمام endpoints
|
||||||
|
|
||||||
|
3. **تست Admin Panel:**
|
||||||
|
- دسترسی به /AdminNew/BugReport
|
||||||
|
- تست فیلترها و جستجو
|
||||||
|
- تست ویرایش و حذف
|
||||||
|
|
||||||
|
4. **Integration Flutter:**
|
||||||
|
- کپی کردن `FLUTTER_BUG_REPORT_EXAMPLE.dart`
|
||||||
|
- سازگار کردن با پروژه Flutter
|
||||||
|
- تست ثبت گزارشها
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 پشتیبانی
|
||||||
|
|
||||||
|
برای هر سوال یا مشکل:
|
||||||
|
1. بررسی کنید `BUG_REPORT_SYSTEM.md`
|
||||||
|
2. بررسی کنید logs و error messages
|
||||||
|
3. مطمئن شوید Migration اجرا شده است
|
||||||
|
|
||||||
@@ -8,5 +8,6 @@ namespace Company.Domain.BankAgg
|
|||||||
{
|
{
|
||||||
public void Remove(Bank entity);
|
public void Remove(Bank entity);
|
||||||
List<BankViewModel> Search(string name);
|
List<BankViewModel> Search(string name);
|
||||||
|
List<BankSelectList> GetBanksForSelectList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
195
Company.Domain/CameraBugReportAgg/CameraBugReport.cs
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مدل دامنه برای گزارش خرابی دوربین
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReport
|
||||||
|
{
|
||||||
|
[BsonId]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
public CameraBugReport()
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid();
|
||||||
|
CreationDate = DateTime.Now;
|
||||||
|
Status = CameraBugReportStatus.Open;
|
||||||
|
Screenshots = new List<CameraBugReportScreenshot>();
|
||||||
|
Logs = new List<CameraBugReportLog>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraBugReport(
|
||||||
|
string title,
|
||||||
|
string description,
|
||||||
|
string userEmail,
|
||||||
|
string deviceModel,
|
||||||
|
string osVersion,
|
||||||
|
string manufacturer,
|
||||||
|
string buildNumber,
|
||||||
|
string appVersion,
|
||||||
|
string screenResolution,
|
||||||
|
bool isCharging,
|
||||||
|
int batteryLevel,
|
||||||
|
int storageInMB,
|
||||||
|
int memoryInMB,
|
||||||
|
string networkType,
|
||||||
|
string platform,
|
||||||
|
string deviceId,
|
||||||
|
string packageName,
|
||||||
|
DateTime installTime,
|
||||||
|
DateTime lastUpdateTime,
|
||||||
|
string flavor,
|
||||||
|
CameraBugReportType type,
|
||||||
|
CameraBugPriority priority,
|
||||||
|
long? accountId = null,
|
||||||
|
string stackTrace = null) : this()
|
||||||
|
|
||||||
|
{
|
||||||
|
Priority = priority;
|
||||||
|
Type = type;
|
||||||
|
Flavor = flavor;
|
||||||
|
LastUpdateTime = lastUpdateTime;
|
||||||
|
InstallTime = installTime;
|
||||||
|
PackageName = packageName;
|
||||||
|
BuildNumber = buildNumber;
|
||||||
|
AppVersion = appVersion;
|
||||||
|
NetworkType = networkType;
|
||||||
|
IsCharging = isCharging;
|
||||||
|
BatteryLevel = batteryLevel;
|
||||||
|
StorageInMB = storageInMB;
|
||||||
|
MemoryInMB = memoryInMB;
|
||||||
|
ScreenResolution = screenResolution;
|
||||||
|
DeviceId = deviceId;
|
||||||
|
Manufacturer = manufacturer;
|
||||||
|
Platform = platform;
|
||||||
|
OsVersion = osVersion;
|
||||||
|
DeviceModel = deviceModel;
|
||||||
|
AccountId = accountId;
|
||||||
|
UserEmail = userEmail;
|
||||||
|
Description = description;
|
||||||
|
Title = title;
|
||||||
|
StackTrace = stackTrace;
|
||||||
|
}
|
||||||
|
|
||||||
|
[BsonElement("screenshots")]
|
||||||
|
public List<CameraBugReportScreenshot> Screenshots { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("logs")]
|
||||||
|
public List<CameraBugReportLog> Logs { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("updateDate")]
|
||||||
|
public DateTime? UpdateDate { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("creationDate")]
|
||||||
|
public DateTime CreationDate { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("stackTrace")]
|
||||||
|
public string StackTrace { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("status")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
public CameraBugReportStatus Status { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("priority")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
|
||||||
|
public CameraBugPriority Priority { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("type")]
|
||||||
|
[BsonRepresentation(MongoDB.Bson.BsonType.String)]
|
||||||
|
|
||||||
|
public CameraBugReportType Type { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("flavor")]
|
||||||
|
public string Flavor { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("lastUpdateTime")]
|
||||||
|
public DateTime LastUpdateTime { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("installTime")]
|
||||||
|
public DateTime InstallTime { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("packageName")]
|
||||||
|
public string PackageName { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("buildNumber")]
|
||||||
|
public string BuildNumber { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("appVersion")]
|
||||||
|
public string AppVersion { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("networkType")]
|
||||||
|
public string NetworkType { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("isCharging")]
|
||||||
|
public bool IsCharging { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("batteryLevel")]
|
||||||
|
public int BatteryLevel { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("storageInMB")]
|
||||||
|
public int StorageInMB { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("memoryInMB")]
|
||||||
|
public int MemoryInMB { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("screenResolution")]
|
||||||
|
public string ScreenResolution { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("deviceId")]
|
||||||
|
public string DeviceId { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("manufacturer")]
|
||||||
|
public string Manufacturer { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("platform")]
|
||||||
|
public string Platform { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("osVersion")]
|
||||||
|
public string OsVersion { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("deviceModel")]
|
||||||
|
public string DeviceModel { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("accountId")]
|
||||||
|
public long? AccountId { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("userEmail")]
|
||||||
|
public string UserEmail { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("description")]
|
||||||
|
public string Description { get; private set; }
|
||||||
|
|
||||||
|
[BsonElement("title")]
|
||||||
|
public string Title { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public void ChangeStatus(CameraBugReportStatus newStatus)
|
||||||
|
{
|
||||||
|
UpdateDate = DateTime.Now;
|
||||||
|
Status = newStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ChangePriority(CameraBugPriority newPriority)
|
||||||
|
{
|
||||||
|
Priority = newPriority;
|
||||||
|
UpdateDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddScreenshot(string base64Data, string fileName)
|
||||||
|
{
|
||||||
|
Screenshots.Add(new CameraBugReportScreenshot
|
||||||
|
{ Base64Data = base64Data, FileName = fileName, UploadDate = DateTime.Now });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddLog(string logMessage)
|
||||||
|
{
|
||||||
|
Logs.Add(new CameraBugReportLog { Message = logMessage, Timestamp = DateTime.Now });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
20
Company.Domain/CameraBugReportAgg/CameraBugReportLog.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// لاگهای گزارش خرابی دوربین
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReportLog : EntityBase
|
||||||
|
{
|
||||||
|
// FK و navigation property حذف شد برای MongoDB
|
||||||
|
[BsonElement("message")]
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("timestamp")]
|
||||||
|
public DateTime Timestamp { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// عکسهای ضمیمه شده به گزارش خرابی دوربین (Base64 encoded)
|
||||||
|
/// </summary>
|
||||||
|
public class CameraBugReportScreenshot : EntityBase
|
||||||
|
{
|
||||||
|
// FK و navigation property حذف شد برای MongoDB
|
||||||
|
[BsonElement("base64Data")]
|
||||||
|
public string Base64Data { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("fileName")]
|
||||||
|
public string FileName { get; set; }
|
||||||
|
|
||||||
|
[BsonElement("uploadDate")]
|
||||||
|
public DateTime UploadDate { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.InfraStructure;
|
||||||
|
|
||||||
|
namespace Company.Domain.CameraBugReportAgg;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// رابط انبار گزارش خرابی دوربین برای MongoDB
|
||||||
|
/// </summary>
|
||||||
|
public interface ICameraBugReportRepository
|
||||||
|
{
|
||||||
|
// Async methods for MongoDB operations
|
||||||
|
Task CreateAsync(CameraBugReport bugReport);
|
||||||
|
Task UpdateAsync(CameraBugReport bugReport);
|
||||||
|
Task<CameraBugReport> GetByIdAsync(Guid id);
|
||||||
|
Task<List<CameraBugReport>> GetAllAsync();
|
||||||
|
Task<List<CameraBugReport>> GetAllAsync(int skip, int take);
|
||||||
|
Task DeleteAsync(Guid id);
|
||||||
|
Task<bool> IsExistAsync(Guid id);
|
||||||
|
Task<List<CameraBugReport>> FilterAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null,
|
||||||
|
int skip = 0,
|
||||||
|
int take = 10);
|
||||||
|
Task<int> CountAsync(
|
||||||
|
CameraBugReportType? type = null,
|
||||||
|
CameraBugPriority? priority = null,
|
||||||
|
CameraBugReportStatus? status = null,
|
||||||
|
string searchTerm = null);
|
||||||
|
}
|
||||||
@@ -31,7 +31,7 @@ public class Checkout : EntityBase
|
|||||||
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
string overNightWorkValue, string fridayWorkValue, string rotatingShifValue, string absenceValue,
|
||||||
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
string totalDayOfLeaveCompute, string totalDayOfYearsCompute, string totalDayOfBunosesCompute,
|
||||||
ICollection<CheckoutLoanInstallment> loanInstallments,
|
ICollection<CheckoutLoanInstallment> loanInstallments,
|
||||||
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList)
|
ICollection<CheckoutSalaryAid> salaryAids, CheckoutRollCall checkoutRollCall, TimeSpan employeeMandatoryHours, bool hasInsuranceShareTheSameAsList, ICollection<CheckoutReward> rewards,double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -71,7 +71,7 @@ public class Checkout : EntityBase
|
|||||||
TotalClaims = totalClaims;
|
TotalClaims = totalClaims;
|
||||||
TotalDeductions = totalDeductions;
|
TotalDeductions = totalDeductions;
|
||||||
TotalPayment = totalPayment;
|
TotalPayment = totalPayment;
|
||||||
RewardPay = 0;
|
RewardPay = rewardPay;
|
||||||
IsActiveString = "true";
|
IsActiveString = "true";
|
||||||
Signature = signature;
|
Signature = signature;
|
||||||
MarriedAllowance = marriedAllowance;
|
MarriedAllowance = marriedAllowance;
|
||||||
@@ -93,6 +93,7 @@ public class Checkout : EntityBase
|
|||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
EmployeeMandatoryHours = employeeMandatoryHours;
|
EmployeeMandatoryHours = employeeMandatoryHours;
|
||||||
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
HasInsuranceShareTheSameAsList = hasInsuranceShareTheSameAsList;
|
||||||
|
Rewards = rewards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -130,7 +131,7 @@ public class Checkout : EntityBase
|
|||||||
public double BonusesPay { get; private set; }
|
public double BonusesPay { get; private set; }
|
||||||
public double YearsPay { get; private set; }
|
public double YearsPay { get; private set; }
|
||||||
public double LeavePay { get; private set; }
|
public double LeavePay { get; private set; }
|
||||||
public double? RewardPay { get; private set; }
|
public double RewardPay { get; private set; }
|
||||||
public double InsuranceDeduction { get; private set; }
|
public double InsuranceDeduction { get; private set; }
|
||||||
public double TaxDeducation { get; private set; }
|
public double TaxDeducation { get; private set; }
|
||||||
public double InstallmentDeduction { get; private set; }
|
public double InstallmentDeduction { get; private set; }
|
||||||
@@ -223,6 +224,8 @@ public class Checkout : EntityBase
|
|||||||
|
|
||||||
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
public ICollection<CheckoutLoanInstallment> LoanInstallments { get; set; } = [];
|
||||||
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
public ICollection<CheckoutSalaryAid> SalaryAids { get; set; } = [];
|
||||||
|
|
||||||
|
public ICollection<CheckoutReward> Rewards { get; set; } = [];
|
||||||
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
public CheckoutRollCall CheckoutRollCall { get; private set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -239,7 +242,7 @@ public class Checkout : EntityBase
|
|||||||
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
double insuranceDeduction, double taxDeducation, double installmentDeduction,
|
||||||
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
double salaryAidDeduction, double absenceDeduction, string sumOfWorkingDays
|
||||||
, string archiveCode, string personnelCode,
|
, string archiveCode, string personnelCode,
|
||||||
string totalClaims, string totalDeductions, double totalPayment, double? rewardPay)
|
string totalClaims, string totalDeductions, double totalPayment, double rewardPay)
|
||||||
{
|
{
|
||||||
EmployeeFullName = employeeFullName;
|
EmployeeFullName = employeeFullName;
|
||||||
FathersName = fathersName;
|
FathersName = fathersName;
|
||||||
@@ -337,6 +340,11 @@ public class Checkout : EntityBase
|
|||||||
InstallmentDeduction = installmentsAmount;
|
InstallmentDeduction = installmentsAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetReward(ICollection<CheckoutReward> rewards, double rewardAmount)
|
||||||
|
{
|
||||||
|
RewardPay = rewardAmount;
|
||||||
|
Rewards = rewards;
|
||||||
|
}
|
||||||
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
public void SetCheckoutRollCall(CheckoutRollCall checkoutRollCall)
|
||||||
{
|
{
|
||||||
CheckoutRollCall = checkoutRollCall;
|
CheckoutRollCall = checkoutRollCall;
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
using System;
|
using _0_Framework.Application;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using _0_Framework.Application;
|
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.Checkout;
|
using CompanyManagment.App.Contracts.Checkout;
|
||||||
|
using CompanyManagment.App.Contracts.Checkout.Dto;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
||||||
namespace Company.Domain.CheckoutAgg;
|
namespace Company.Domain.CheckoutAgg;
|
||||||
@@ -22,7 +23,7 @@ public interface ICheckoutRepository : IRepository<long, Checkout>
|
|||||||
string year, string month);
|
string year, string month);
|
||||||
EditCheckout GetDetails(long id);
|
EditCheckout GetDetails(long id);
|
||||||
|
|
||||||
Task CreateCkeckout(Checkout command);
|
Task<bool> CreateCheckout(Checkout command);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// لود لیست اولیه جهت ایجاد فیش حقوقی
|
/// لود لیست اولیه جهت ایجاد فیش حقوقی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -80,4 +81,44 @@ public interface ICheckoutRepository : IRepository<long, Checkout>
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
Task<Checkout> GetByWorkshopIdEmployeeIdInDate(long workshopId, long employeeId, DateTime inDate);
|
Task<Checkout> GetByWorkshopIdEmployeeIdInDate(long workshopId, long employeeId, DateTime inDate);
|
||||||
|
Task<PagedResult<CheckoutListClientDto>> GetListForClient(long workshopId,
|
||||||
|
CheckoutListClientSearchModel searchModel);
|
||||||
|
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت سلکت لیست پرسنل کارگاه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EmployeeSelectListDto>> GetEmployeeSelectListByWorkshopId(long id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست فیش حقوقی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<PagedResult<CheckoutDto>> GetList(CheckoutSearchModelDto searchModel);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پرینت فیش حقوقی
|
||||||
|
/// Api
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ids"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<CheckoutPrintDto>> CheckoutPrint(List<long> ids);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت قردادها و جداول وابسته برای ایجاد فیش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ids"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
/// <param name="month"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<OperationResult<GetContractAndIncludesDataToCreateDto>> GetContractsAndIncludeDataDataToCreateCheckout(
|
||||||
|
List<long> ids, string year, string month, long workshopId);
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
57
Company.Domain/CheckoutAgg/ValueObjects/CheckoutReward.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Company.Domain.CheckoutAgg.ValueObjects;
|
||||||
|
|
||||||
|
public class CheckoutReward
|
||||||
|
{
|
||||||
|
public CheckoutReward(string amount, double amountDouble, string grantDateFa, DateTime grantDateGr, string description, string title, long entityId)
|
||||||
|
{
|
||||||
|
Amount = amount;
|
||||||
|
AmountDouble = amountDouble;
|
||||||
|
GrantDateFa = grantDateFa;
|
||||||
|
GrantDateGr = grantDateGr;
|
||||||
|
Description = description;
|
||||||
|
Title = title;
|
||||||
|
EntityId = entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// string
|
||||||
|
/// </summary>
|
||||||
|
public string Amount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مبلغ پاداش
|
||||||
|
/// double
|
||||||
|
/// </summary>
|
||||||
|
public double AmountDouble { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// شمسی
|
||||||
|
/// </summary>
|
||||||
|
public string GrantDateFa { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اعطاء
|
||||||
|
/// میلادی
|
||||||
|
/// </summary>
|
||||||
|
public DateTime GrantDateGr { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// توضیحات
|
||||||
|
/// </summary>
|
||||||
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// عنوان
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی پاداش
|
||||||
|
/// </summary>
|
||||||
|
public long EntityId { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public class ClassificationEmployee : EntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد پرسنل طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="employeeId"></param>
|
||||||
|
/// <param name="classificationSchemeId"></param>
|
||||||
|
/// <param name="classificationGroupId"></param>
|
||||||
|
/// <param name="classificationGroupJobId"></param>
|
||||||
|
/// <param name="startGroupDate"></param>
|
||||||
|
/// <param name="endGroupDate"></param>
|
||||||
|
public ClassificationEmployee(long workshopId, long employeeId, long classificationSchemeId, long classificationGroupId, long classificationGroupJobId, DateTime? startGroupDate)
|
||||||
|
{
|
||||||
|
WorkshopId = workshopId;
|
||||||
|
EmployeeId = employeeId;
|
||||||
|
ClassificationSchemeId = classificationSchemeId;
|
||||||
|
ClassificationGroupId = classificationGroupId;
|
||||||
|
ClassificationGroupJobId = classificationGroupJobId;
|
||||||
|
StartGroupDate = startGroupDate;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی کارگاه
|
||||||
|
/// </summary>
|
||||||
|
public long WorkshopId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی پرسنل
|
||||||
|
/// </summary>
|
||||||
|
public long EmployeeId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی طرح
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationSchemeId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی گروه
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationGroupId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی شغل
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationGroupJobId { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شروع استفاده از گروه
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? StartGroupDate{ get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ پایان استفاده از گروه
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EndGroupDate { get; private set; }
|
||||||
|
|
||||||
|
public ClassificationGroup ClassificationGroup { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ویرایش پرسنل طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="classificationGroupId"></param>
|
||||||
|
/// <param name="classificationGroupJobId"></param>
|
||||||
|
public void Edit(long classificationGroupId, long classificationGroupJobId)
|
||||||
|
{
|
||||||
|
ClassificationGroupId = classificationGroupId;
|
||||||
|
ClassificationGroupJobId = classificationGroupJobId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ویرایش گروه های چندگانه پرسنل طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="classificationGroupId"></param>
|
||||||
|
/// <param name="classificationGroupJobId"></param>
|
||||||
|
/// <param name="startGroupDate"></param>
|
||||||
|
/// <param name="endGroupDate"></param>
|
||||||
|
public void EditMultipleGroupMember(long classificationGroupId, long classificationGroupJobId, DateTime startGroupDate)
|
||||||
|
{
|
||||||
|
ClassificationGroupId = classificationGroupId;
|
||||||
|
ClassificationGroupJobId = classificationGroupJobId;
|
||||||
|
StartGroupDate = startGroupDate;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
|
||||||
|
public class ClassificationGroup : EntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد گروه های بیست گانه طرح طبقه بندی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupNo"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="classificationSchemeId"></param>
|
||||||
|
public ClassificationGroup(string groupNo, long workshopId, long classificationSchemeId)
|
||||||
|
{
|
||||||
|
GroupNo = groupNo;
|
||||||
|
WorkshopId = workshopId;
|
||||||
|
ClassificationSchemeId = classificationSchemeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره گروه
|
||||||
|
/// </summary>
|
||||||
|
public string GroupNo { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی کارگاه
|
||||||
|
/// </summary>
|
||||||
|
public long WorkshopId { get; private set; }
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی طرح
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationSchemeId { get; private set; }
|
||||||
|
|
||||||
|
public ClassificationScheme ClassificationScheme { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public List<ClassificationGroupJob> ClassificationGroupJobs { get; set; }
|
||||||
|
public List<ClassificationGroupSalary> ClassificationGroupSalaries { get; set; }
|
||||||
|
|
||||||
|
public List<ClassificationEmployee> ClassificationEmployees { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
using _0_Framework_b.Domain;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public class ClassificationGroupJob : EntityBaseWithoutCreationDate
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد لیست مشغال برای گروه های طرح طبقه بندی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="jobId"></param>
|
||||||
|
/// <param name="jobName"></param>
|
||||||
|
/// <param name="jobCode"></param>
|
||||||
|
/// <param name="classificationGroupId"></param>
|
||||||
|
/// <param name="groupNo"></param>
|
||||||
|
public ClassificationGroupJob(long jobId, string jobName, string jobCode, long classificationGroupId, string groupNo)
|
||||||
|
{
|
||||||
|
JobId = jobId;
|
||||||
|
JobName = jobName;
|
||||||
|
JobCode = jobCode;
|
||||||
|
ClassificationGroupId = classificationGroupId;
|
||||||
|
GroupNo = groupNo;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی شغل
|
||||||
|
/// </summary>
|
||||||
|
public long JobId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام شغل
|
||||||
|
/// </summary>
|
||||||
|
public string JobName { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// کد شغل
|
||||||
|
/// </summary>
|
||||||
|
public string JobCode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی گروه
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationGroupId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره گروه
|
||||||
|
/// </summary>
|
||||||
|
public string GroupNo { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public ClassificationGroup ClassificationGroup { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public class ClassificationGroupSalary : EntityBase
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد دستمزد برای گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="classificationGroupId"></param>
|
||||||
|
/// <param name="groupNo"></param>
|
||||||
|
/// <param name="groupSalary"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="endDate"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
public ClassificationGroupSalary(long classificationGroupId, string groupNo, double groupSalary, DateTime startDate, DateTime endDate, int year, long schemeId)
|
||||||
|
{
|
||||||
|
ClassificationGroupId = classificationGroupId;
|
||||||
|
GroupNo = groupNo;
|
||||||
|
GroupSalary = groupSalary;
|
||||||
|
StartDate = startDate;
|
||||||
|
EndDate = endDate;
|
||||||
|
Year = year;
|
||||||
|
SchemeId = schemeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی گروه
|
||||||
|
/// </summary>
|
||||||
|
public long ClassificationGroupId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره گروه
|
||||||
|
/// </summary>
|
||||||
|
public string GroupNo { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دستمزد گروه
|
||||||
|
/// </summary>
|
||||||
|
public double GroupSalary { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شروع
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartDate { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ پایان
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndDate { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سال
|
||||||
|
/// </summary>
|
||||||
|
public int Year { get; private set; }
|
||||||
|
|
||||||
|
public long SchemeId { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public ClassificationGroup ClassificationGroup { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ویرایش دستمزد گروه
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
/// <param name="groupSalary"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="endDate"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
public void Edit(double groupSalary, DateTime startDate, DateTime endDate, int year)
|
||||||
|
{
|
||||||
|
|
||||||
|
GroupSalary = groupSalary;
|
||||||
|
StartDate = startDate;
|
||||||
|
EndDate = endDate;
|
||||||
|
Year = year;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
using System;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public class ClassificationRialCoefficient : EntityBaseWithoutCreationDate
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایچاد ضریب ریالی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="classificationSchemeId"></param>
|
||||||
|
/// <param name="rialCoefficient"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="endDate"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
public ClassificationRialCoefficient(long classificationSchemeId, double rialCoefficient, DateTime startDate, DateTime endDate, int year)
|
||||||
|
{
|
||||||
|
ClassificationSchemeId = classificationSchemeId;
|
||||||
|
RialCoefficient = rialCoefficient;
|
||||||
|
StartDate = startDate;
|
||||||
|
EndDate = endDate;
|
||||||
|
Year = year;
|
||||||
|
}
|
||||||
|
|
||||||
|
//آی دی طرح
|
||||||
|
public long ClassificationSchemeId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ضریب ریالی
|
||||||
|
/// </summary>
|
||||||
|
public double RialCoefficient { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شروع
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartDate { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ پایان
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndDate { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سال
|
||||||
|
/// </summary>
|
||||||
|
public int Year { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public ClassificationScheme ClassificationScheme { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ویرایش ضریب ریالی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="classificationSchemeId"></param>
|
||||||
|
/// <param name="rialCoefficient"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="endDate"></param>
|
||||||
|
/// <param name="year"></param>
|
||||||
|
public void Edit(double rialCoefficient, DateTime startDate, DateTime endDate, int year)
|
||||||
|
{
|
||||||
|
|
||||||
|
RialCoefficient = rialCoefficient;
|
||||||
|
StartDate = startDate;
|
||||||
|
EndDate = endDate;
|
||||||
|
Year = year;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public class ClassificationScheme : EntityBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد طرح طبقه بندی مشاغل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="includingDateGr"></param>
|
||||||
|
/// <param name="executionDateGr"></param>
|
||||||
|
/// <param name="designerFullName"></param>
|
||||||
|
/// <param name="designerPhone"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="typeOfCoefficient"></param>
|
||||||
|
public ClassificationScheme(DateTime includingDateGr, DateTime executionDateGr, string designerFullName, string designerPhone, long workshopId, TypeOfCoefficient typeOfCoefficient)
|
||||||
|
{
|
||||||
|
IncludingDateGr = includingDateGr;
|
||||||
|
ExecutionDateGr = executionDateGr;
|
||||||
|
DesignerFullName = designerFullName;
|
||||||
|
DesignerPhone = designerPhone;
|
||||||
|
WorkshopId = workshopId;
|
||||||
|
TypeOfCoefficient = typeOfCoefficient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ شمول طرح
|
||||||
|
/// </summary>
|
||||||
|
public DateTime IncludingDateGr { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ اجرای طرح
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ExecutionDateGr { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تاریخ پایان طرح
|
||||||
|
/// </summary>
|
||||||
|
public DateTime? EndSchemeDateGr { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نام کامل طراح
|
||||||
|
/// </summary>
|
||||||
|
public string DesignerFullName { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// شماره همراه طراح
|
||||||
|
/// </summary>
|
||||||
|
public string DesignerPhone { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آی دی کارگاه
|
||||||
|
/// </summary>
|
||||||
|
public long WorkshopId { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// نوع ضریب
|
||||||
|
/// </summary>
|
||||||
|
public TypeOfCoefficient TypeOfCoefficient { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
public List<ClassificationGroup> ClassificationGroups { get; set; }
|
||||||
|
|
||||||
|
public List<ClassificationRialCoefficient> ClassificationRialCoefficients { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ویرایش طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="includingDateGr"></param>
|
||||||
|
/// <param name="executionDateGr"></param>
|
||||||
|
/// <param name="designerFullName"></param>
|
||||||
|
/// <param name="designerPhone"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
public void Edit(DateTime includingDateGr, DateTime executionDateGr,string designerFullName, string designerPhone, TypeOfCoefficient typeOfCoefficient)
|
||||||
|
{
|
||||||
|
IncludingDateGr = includingDateGr;
|
||||||
|
ExecutionDateGr = executionDateGr;
|
||||||
|
DesignerFullName = designerFullName;
|
||||||
|
DesignerPhone = designerPhone;
|
||||||
|
TypeOfCoefficient = typeOfCoefficient;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.ClassificationScheme;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public interface IClassificationEmployeeRepository : IRepository<long, ClassificationEmployee>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست پرسنل کارگاه
|
||||||
|
/// تب افزودن پرسنل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EmployeeInfoList>> GetEmployeeListData(long schemeId);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اطلاعات عضویتی پرسنل در گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="employeeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EditEmployeeGroupList>> GetEmployeeMemberizeData(long employeeId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ذخیره انتقال پرسنل به گره های دیگر
|
||||||
|
///بصورت گروهی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task CreateTransferRange(List<ClassificationEmployee> command);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// حذف پرسنل از گروه از سمت ویرایش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task RemoveRangeByEdit(List<ClassificationEmployee> command);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.ClassificationScheme;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public interface IClassificationGroupRepository : IRepository<long, ClassificationGroup>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت گروه های طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<ClassificationGroupList>> GetGroups(long schemeId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت گروه ها و مشاغلشان برای تب تعیین مشاغل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<ClassificationGroupAndJobModel>> GetGroupAndJobs(long schemeId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست گروه ها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<GetGroupAndJobSchemeListDto>> GetGroupList(long schemeId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست مشاغل برای مودال ایجاد و ویرایش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<AddOrEditJobInGroupDto> GetCreateOrEditJobsData(long groupId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// چک میکند که آی پرسنلی وجود دارد که این شغل به او نسبت داده شده
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="jobId"></param>
|
||||||
|
/// <param name="groupId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> CheckIfEmployeeHasThisJob(long jobId, long groupId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ذخیر ایجاد یا ویرایش مشاغل در گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> SaveJobsToGroup(AddOrEditJobInGroupDto command);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت مشاغل گروه توسط آی دی گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EditClassificationGroupJob>> GetGroupJobs(long groupId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// چک میکند که آی پرسنلی وجود دارد که این شغل به او نسبت داده شده
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <param name="groupId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> CheckEmployeeHasThisJob(long id, long groupId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد مشاغل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="createClassificationGroupJob"></param>
|
||||||
|
/// <param name="deleteJobList"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> CreateJobs(List<ClassificationGroupJob> createClassificationGroupJob, List<long> deleteJobList);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// در یافت اطلاعات گروه برای لود مودال ایجاد دستمزد های
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<SalaryAndRialCoefficientModel> GetGroupToCreateSalariesModal(long schemeId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد گروه های بیست گانه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="groupList"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task CreateGroups(List<ClassificationGroup> groupList);
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.ClassificationScheme;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public interface IClassificationGroupSalariesRepository : IRepository<long, ClassificationGroupSalary>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد دستمزدهای گروه ها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="createClassificationGroupSalary"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task CreateSalaries(List<ClassificationGroupSalary> createClassificationGroupSalary);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت دستمزدها و ضریب ریالی برای مودال ویرایش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <param name="startDate"></param>
|
||||||
|
/// <param name="endDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<SalaryAndRialCoefficientModel> GetEditSalariesData(long schemeId, string startDate, string endDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// لیست دستمزدها بر اساس تاریخ و سال برای تب دستمزدها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<SalaryAndRialCoefficientTab> GetSalariesTabData(long schemeId);
|
||||||
|
|
||||||
|
|
||||||
|
#region ForApi
|
||||||
|
/// <summary>
|
||||||
|
/// لیست دستمزدها بر اساس تاریخ و سال برای تب دستمزدها
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SalaryAndRialCoefficientTabDataList>> GetSalaryList(long schemeId);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
using _0_Framework.Domain;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public interface IClassificationRialCoefficientRepository : IRepository<long, ClassificationRialCoefficient>
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using _0_Framework.Application;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.ClassificationScheme;
|
||||||
|
using CompanyManagment.App.Contracts.YearlySalary;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.ClassificationSchemeAgg;
|
||||||
|
|
||||||
|
public interface IClassificationSchemeRepository : IRepository<long, ClassificationScheme>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// پارشیال صفحه ایجاد طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="worskhopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<ClassificationSchemeListDto> GetClassificationSchemeList(long workshopId);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اطلاعات طرح برای ویرایش
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<EditClassificationSchemeDto> GetClassificationScheme(long id);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اطلاعات طر برای محاسبات
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<EditClassificationScheme> GetClassificationSchemeToCompute(long id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// متد محاسبه پایه سنوات برا افراد تک گروه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="schemeStart">تاریخ شروع طرح</param>
|
||||||
|
/// <param name="schemeEnd">تاریخ پاین طرح، اجباری نیست</param>
|
||||||
|
/// <param name="contractStart">تاریخ شروع قراداد</param>
|
||||||
|
/// <param name="contractEnd">تاریخ پایان قراداد</param>
|
||||||
|
/// <param name="groupNo">شماره گروه</param>
|
||||||
|
/// <param name="employeeId">آی دی پرسنل</param>
|
||||||
|
/// <param name="workshopId">آی دی کارگاه</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<BaseYearDataViewModel> BaseYearComputeOneGroup(DateTime schemeStart, DateTime? schemeEnd,
|
||||||
|
DateTime contractStart, DateTime contractEnd, string groupNo, long employeeId, long workshopId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// حذف طرح
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task DeleteClassificationScheme(long id);
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -16,10 +16,15 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="CheckoutAgg\ValueObjects\" />
|
<Folder Include="CheckoutAgg\ValueObjects\" />
|
||||||
|
<Folder Include="_common\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MongoDB.Bson" Version="3.5.0" />
|
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.1" />
|
||||||
|
<PackageReference Include="MongoDB.Bson" Version="3.5.2" />
|
||||||
|
<PackageReference Include="System.Security.Cryptography.Xml" Version="10.0.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
using System;
|
||||||
|
using CompanyManagment.App.Contracts.PersonalContractingParty;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using _0_Framework.Application;
|
using _0_Framework.Application;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
@@ -32,7 +33,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
List<PersonalContractingPartyViewModel> SearchForMain(PersonalContractingPartySearchModel searchModel2);
|
||||||
OperationResult DeletePersonalContractingParties(long id);
|
OperationResult DeletePersonalContractingParties(long id);
|
||||||
bool GetHasContract(long id);
|
bool GetHasContract(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult DeActiveAll(long id);
|
OperationResult DeActiveAll(long id);
|
||||||
|
[Obsolete("از متدهای async استفاده کنید")]
|
||||||
OperationResult ActiveAll(long id);
|
OperationResult ActiveAll(long id);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -76,4 +79,9 @@ public interface IPersonalContractingPartyRepository :IRepository<long, Personal
|
|||||||
|
|
||||||
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
Task<PersonalContractingParty> GetByNationalCode(string nationalCode);
|
||||||
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
Task<PersonalContractingParty> GetByNationalId(string registerId);
|
||||||
|
|
||||||
|
Task<OperationResult> DeActiveAllAsync(long id);
|
||||||
|
Task<OperationResult> ActiveAllAsync(long id);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -252,6 +252,35 @@ public class PersonalContractingParty : EntityBase
|
|||||||
Phone = phone;
|
Phone = phone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UnAuthenticateRealEdit(string fName, string lName, string fatherName,string idNumber,
|
||||||
|
string idNumberSeri, string idNumberSerial, string dateOfBirth, Gender gender,string phone)
|
||||||
|
{
|
||||||
|
this.FName = fName;
|
||||||
|
this.LName = lName;
|
||||||
|
this.FatherName = fatherName;
|
||||||
|
this.IdNumberSeri = idNumberSeri;
|
||||||
|
this.IdNumberSerial = idNumberSerial;
|
||||||
|
this.DateOfBirth = !string.IsNullOrWhiteSpace(dateOfBirth) ? dateOfBirth.ToGeorgianDateTime() : null;
|
||||||
|
this.IdNumber = idNumber;
|
||||||
|
this.Gender = gender;
|
||||||
|
Phone = phone;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnAuthenticateLegalEdit(string fName, string lName, string fatherName, string idNumber,
|
||||||
|
string idNumberSeri,
|
||||||
|
string idNumberSerial, string dateOfBirth, Gender gender, string phone)
|
||||||
|
{
|
||||||
|
CeoFName = fName;
|
||||||
|
CeoLName = lName;
|
||||||
|
this.FatherName = fatherName;
|
||||||
|
this.IdNumberSeri = idNumberSeri;
|
||||||
|
this.IdNumberSerial = idNumberSerial;
|
||||||
|
this.DateOfBirth = !string.IsNullOrWhiteSpace(dateOfBirth) ? dateOfBirth.ToGeorgianDateTime() : null;
|
||||||
|
this.IdNumber = idNumber;
|
||||||
|
this.Gender = gender;
|
||||||
|
Phone = phone;
|
||||||
|
}
|
||||||
|
|
||||||
public void RegisterComplete(string fatherName, string idNumberSeri, string idNumberSerial, DateTime dateOfBirth, Gender gender)
|
public void RegisterComplete(string fatherName, string idNumberSeri, string idNumberSerial, DateTime dateOfBirth, Gender gender)
|
||||||
{
|
{
|
||||||
this.FatherName = fatherName;
|
this.FatherName = fatherName;
|
||||||
@@ -261,4 +290,13 @@ public class PersonalContractingParty : EntityBase
|
|||||||
this.Gender = gender;
|
this.Gender = gender;
|
||||||
this.IsAuthenticated = true;
|
this.IsAuthenticated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void EditLegalPartyFromInstitution(string legalPosition, string companyName,
|
||||||
|
string registerId,string nationalId)
|
||||||
|
{
|
||||||
|
LegalPosition = legalPosition;
|
||||||
|
LName = companyName;
|
||||||
|
RegisterId = registerId;
|
||||||
|
NationalId = nationalId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -48,6 +48,10 @@ public interface IContractRepository : IRepository<long, Contract>
|
|||||||
bool Remove(long id);
|
bool Remove(long id);
|
||||||
|
|
||||||
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
List<ContractViweModel> SearchForClient(ContractSearchModel searchModel);
|
||||||
|
|
||||||
|
Task<PagedResult<GetContractListForClientResponse>> GetContractListForClient(GetContractListForClientRequest searchModel);
|
||||||
|
|
||||||
|
Task<List<ContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
#endregion
|
#endregion
|
||||||
#region NewChangeByHeydari
|
#region NewChangeByHeydari
|
||||||
|
|
||||||
@@ -63,4 +67,8 @@ public interface IContractRepository : IRepository<long, Contract>
|
|||||||
ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth);
|
ContractViweModel GetByWorkshopIdEmployeeIdInDates(long workshopId, long employeeId, DateTime startOfMonth, DateTime endOfMonth);
|
||||||
List<ContractViweModel> GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd);
|
List<ContractViweModel> GetByWorkshopIdInDates(long workshopId, DateTime contractStart, DateTime contractEnd);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ public interface IEmployeeRepository : IRepository<long, Employee>
|
|||||||
|
|
||||||
Employee GetIgnoreQueryFilter(long id);
|
Employee GetIgnoreQueryFilter(long id);
|
||||||
|
|
||||||
|
[Obsolete("این متد منسوخ شده است و از متد WorkedEmployeesInWorkshopSelectList استفاده کنید")]
|
||||||
Task<List<EmployeeSelectListViewModel>> WorkedEmployeesInWorkshopSelectList(long workshopId);
|
Task<List<EmployeeSelectListViewModel>> WorkedEmployeesInWorkshopSelectList(long workshopId);
|
||||||
|
|
||||||
|
|
||||||
@@ -76,7 +77,40 @@ public interface IEmployeeRepository : IRepository<long, Employee>
|
|||||||
#region Api
|
#region Api
|
||||||
Task<List<EmployeeSelectListViewModel>> GetSelectList(string searchText,long id);
|
Task<List<EmployeeSelectListViewModel>> GetSelectList(string searchText,long id);
|
||||||
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
Task<List<GetEmployeeListViewModel>> GetList(GetEmployeeListSearchModel searchModel);
|
||||||
#endregion
|
Task<List<GetClientEmployeeListViewModel>> GetClientEmployeeList(GetClientEmployeeListSearchModel searchModel, long workshopId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست پرسنل کلاینت
|
||||||
|
/// api
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchModel"></param>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EmployeeListDto>> ListOfAllEmployeesClient(EmployeeSearchModelDto searchModel, long workshopId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پرینت تجمیعی پرسنل کلاینت
|
||||||
|
/// api
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<PrintAllEmployeesInfoDtoClient>> PrintAllEmployeesInfoClient(long workshopId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پرینت گروهی تفکیکی پرسنل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<PrintAllDetailsPersonnelInfoDtoClient>> PrintAllDetailsPersonnelInfoClient(long workshopId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سلکت لیست پرسنل های کارگاه کلاینت
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<EmployeeSelectListViewModel>> GetWorkingEmployeesSelectList(long workshopId);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
|
using System;
|
||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
using CompanyManagment.App.Contracts.EmployeeBankInformation;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Security.AccessControl;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using CompanyManagment.App.Contracts.Workshop;
|
||||||
|
|
||||||
namespace Company.Domain.EmployeeBankInformationAgg
|
namespace Company.Domain.EmployeeBankInformationAgg
|
||||||
{
|
{
|
||||||
@@ -11,14 +15,31 @@ namespace Company.Domain.EmployeeBankInformationAgg
|
|||||||
void Remove(EmployeeBankInformation bankInformation);
|
void Remove(EmployeeBankInformation bankInformation);
|
||||||
void RemoveRange(List<EmployeeBankInformation> entities);
|
void RemoveRange(List<EmployeeBankInformation> entities);
|
||||||
|
|
||||||
|
[Obsolete("از متد async استفاده کنید")]
|
||||||
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
List<GroupedEmployeeBankInformationViewModel> Search(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
Task<List<GroupedEmployeeBankInformationViewModel>> SearchAsync(long workshopId,
|
||||||
|
EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
|
||||||
GroupedEmployeeBankInformationViewModel GetByEmployeeId(long workshopId, long employeeId);
|
GroupedEmployeeBankInformationViewModel GetByEmployeeId(long workshopId, long employeeId);
|
||||||
List<EmployeeBankInformation> GetRangeByEmployeeId(long workshopId, long employeeId);
|
List<EmployeeBankInformation> GetRangeByEmployeeId(long workshopId, long employeeId);
|
||||||
EmployeeBankInformationViewModel GetDetails(long id);
|
EmployeeBankInformationViewModel GetDetails(long id);
|
||||||
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
List<GroupedEmployeeBankInformationViewModel> GetAllByWorkshopId(long workshopId);
|
||||||
|
|
||||||
|
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId,
|
||||||
|
EmployeeBankInformationSearchModel searchParams);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جزئیات اطلاعات بانکی بر اساس پرسنل
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="workshopId"></param>
|
||||||
|
/// <param name="employeeId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<GetEmployeeBankInfoDetailsDto> GetDetailsByEmployeeIdAsync(long workshopId, long employeeId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<EmployeeBankInformationViewModelForExcel> SearchForExcel(long workshopId, EmployeeBankInformationSearchModel searchParams);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Company.Domain.EmployeeDocumentsAgg
|
|||||||
{
|
{
|
||||||
WorkshopId = workshopId;
|
WorkshopId = workshopId;
|
||||||
EmployeeId = employeeId;
|
EmployeeId = employeeId;
|
||||||
Gender = gender;
|
Gender = gender??string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EmployeeDocuments()
|
private EmployeeDocuments()
|
||||||
|
|||||||
@@ -10,4 +10,6 @@ public interface IFinancialInvoiceRepository : IRepository<long, FinancialInvoic
|
|||||||
EditFinancialInvoice GetDetails(long id);
|
EditFinancialInvoice GetDetails(long id);
|
||||||
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
List<FinancialInvoiceViewModel> Search(FinancialInvoiceSearchModel searchModel);
|
||||||
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
Task<FinancialInvoice> GetUnPaidByEntityId(long entityId, FinancialInvoiceItemType financialInvoiceItemType);
|
||||||
|
Task<FinancialInvoice> GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(long contractingPartyId,
|
||||||
|
double amount);
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,6 @@ using _0_Framework.Application.Enums;
|
|||||||
using _0_Framework.Domain;
|
using _0_Framework.Domain;
|
||||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
using CompanyManagment.App.Contracts.Workshop;
|
using CompanyManagment.App.Contracts.Workshop;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace Company.Domain.InstitutionContractAgg;
|
namespace Company.Domain.InstitutionContractAgg;
|
||||||
|
|
||||||
@@ -56,6 +55,13 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
void UpdateStatusIfNeeded(long institutionContractId);
|
void UpdateStatusIfNeeded(long institutionContractId);
|
||||||
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
Task<GetInstitutionVerificationDetailsViewModel> GetVerificationDetails(Guid id);
|
||||||
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
Task<InstitutionContract> GetByPublicIdAsync(Guid id);
|
||||||
|
InstitutionContractDiscountResponse CalculateDiscount(InstitutionContractSetDiscountRequest request, string contractStart = null);
|
||||||
|
InstitutionContractDiscountResponse ResetDiscountCreate(InstitutionContractResetDiscountForCreateRequest request);
|
||||||
|
|
||||||
|
#region Creation
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Extension
|
#region Extension
|
||||||
|
|
||||||
@@ -63,77 +69,31 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
Task<InstitutionContractExtensionWorkshopsResponse> GetExtensionWorkshops(InstitutionContractExtensionWorkshopsRequest request);
|
Task<InstitutionContractExtensionWorkshopsResponse> GetExtensionWorkshops(InstitutionContractExtensionWorkshopsRequest request);
|
||||||
Task<InstitutionContractExtensionPlanResponse> GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request);
|
Task<InstitutionContractExtensionPlanResponse> GetExtensionInstitutionPlan(InstitutionContractExtensionPlanRequest request);
|
||||||
Task<InstitutionContractExtensionPaymentResponse> GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request);
|
Task<InstitutionContractExtensionPaymentResponse> GetExtensionPaymentMethod(InstitutionContractExtensionPaymentRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> SetDiscountForExtension(
|
||||||
|
InstitutionContractSetDiscountForExtensionRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> ResetDiscountForExtension(InstitutionContractResetDiscountForExtensionRequest request);
|
||||||
|
|
||||||
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
|
Task<OperationResult> ExtensionComplete(InstitutionContractExtensionCompleteRequest request);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Upgrade(Amendment)
|
#region Upgrade(Amendment)
|
||||||
|
|
||||||
Task<InstitutionContractAmendmentWorkshopsResponse> GetAmendmentWorkshops(long institutionContractId);
|
Task<InstitutionContractAmendmentWorkshopsResponse> GetAmendmentWorkshops(long institutionContractId);
|
||||||
Task<InsitutionContractAmendmentPaymentResponse> GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request);
|
Task<InsitutionContractAmendmentPaymentResponse> GetAmendmentPaymentDetails(InsitutionContractAmendmentPaymentRequest request);
|
||||||
|
|
||||||
Task<InsertAmendmentTempWorkshopResponse> InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request);
|
Task<InsertAmendmentTempWorkshopResponse> InsertAmendmentTempWorkshops(InstitutionContractAmendmentTempWorkshopViewModel request);
|
||||||
Task RemoveAmendmentWorkshops(Guid workshopTempId);
|
Task RemoveAmendmentWorkshops(Guid workshopTempId);
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
Task<List<InstitutionContractSelectListViewModel>> GetInstitutionContractSelectList(string search, string selected);
|
Task<List<InstitutionContractSelectListViewModel>> GetInstitutionContractSelectList(string search, string selected);
|
||||||
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
Task<List<InstitutionContractPrintViewModel>> PrintAllAsync(List<long> ids);
|
||||||
|
Task<GetInstitutionContractWorkshopsDetails> GetContractWorkshopsDetails(long id);
|
||||||
|
Task AmendmentComplete(InstitutionContractAmendmentCompleteRequest request);
|
||||||
|
Task<GetInstitutionAmendmentVerificationDetailsViewModel> GetAmendmentVerificationDetails(Guid id, long amendmentId);
|
||||||
|
|
||||||
|
|
||||||
#region ReminderSMS
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست - ارسال پیامک
|
|
||||||
/// فراخوانی از سمت بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<bool> SendReminderSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک صورت حساب ماهانه
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="now"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendMonthlySms(DateTime now);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsForBackgroundTask();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// دریافت لیست واجد شرایط بلاک
|
|
||||||
/// جهت ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="checkDate"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک مسدودی
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="smsListData"></param>
|
|
||||||
/// <param name="typeOfSms"></param>
|
|
||||||
/// <param name="sendMessStart"></param>
|
|
||||||
/// <param name="sendMessEnd"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
|
||||||
string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///دریافت لیست بدهکارن
|
|
||||||
/// جهت ارسال پیامک
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ارسال پیامک های یاد آور بدهی
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region CreateMontlyTransaction
|
#region CreateMontlyTransaction
|
||||||
|
|
||||||
@@ -145,4 +105,22 @@ public interface IInstitutionContractRepository : IRepository<long, InstitutionC
|
|||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Task<long> GetIdByInstallmentId(long installmentId);
|
||||||
|
Task<InstitutionContract> GetPreviousContract(long currentInstitutionContractId);
|
||||||
|
Task<InstitutionContractCreationInquiryResult> CreationInquiry(InstitutionContractCreationInquiryRequest request);
|
||||||
|
Task<InstitutionContractCreationWorkshopsResponse> GetCreationWorkshops(InstitutionContractCreationWorkshopsRequest request);
|
||||||
|
Task<InstitutionContractCreationPlanResponse> GetCreationInstitutionPlan(InstitutionContractCreationPlanRequest request);
|
||||||
|
Task<InstitutionContractCreationPaymentResponse> GetCreationPaymentMethod(InstitutionContractCreationPaymentRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> SetDiscountForCreation(InstitutionContractSetDiscountForCreationRequest request);
|
||||||
|
Task<InstitutionContractDiscountResponse> ResetDiscountForCreation(InstitutionContractResetDiscountForExtensionRequest request);
|
||||||
|
Task<OperationResult> CreationComplete(InstitutionContractExtensionCompleteRequest request);
|
||||||
|
Task<InstitutionContract> GetIncludeInstallments(long id);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
using _0_Framework.Application.Enums;
|
||||||
|
using _0_Framework.Domain;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Company.Domain.InstitutionContractAgg;
|
||||||
|
|
||||||
|
public interface IInstitutionContractSmsServiceRepository : IRepository<long, InstitutionContract>
|
||||||
|
{
|
||||||
|
#region reminderSMs
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک یادآور تایید قراداد مالی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendInstitutionContractConfirmSmsTask();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//هشدار و اقدام قضایی
|
||||||
|
#region WarningOrLegalActionSmsListData
|
||||||
|
/// <summary>
|
||||||
|
/// اجرای تسک پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSmsTask(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکاران آبی جهت هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetWarningOrLegalActionSmsListData(TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک هشدار یا اقدام قضایی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSmsSetting"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendWarningOrLegalActionSms(List<SmsListData> smsListData, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//بلاک - آنبلاک - پیامک بلاک -
|
||||||
|
// غیر فعال سازی قراداد های پایان یافته
|
||||||
|
#region Block
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی از طرف بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست واجد شرایط بلاک
|
||||||
|
/// جهت ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<BlockSmsListData>> GetBlockListData(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک مسدودی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="smsListData"></param>
|
||||||
|
/// <param name="typeOfSms"></param>
|
||||||
|
/// <param name="sendMessStart"></param>
|
||||||
|
/// <param name="sendMessEnd"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendBlockSmsToContractingParties(List<BlockSmsListData> smsListData, string typeOfSms,
|
||||||
|
string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بلاک سازی
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task Block(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست بدهکارانی که باید بلاک شوند
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<long>> GetToBeBlockList(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// آنبلاک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task UnBlock();
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیر فعالسازی قرارداد های پایان یافته
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="checkDate"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task DeActiveInstitutionEndOfContract(DateTime checkDate);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// غیرفعال سازس قرارداد های آبی که بدهی ندارند
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task BlueDeActiveAfterZeroDebt();
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region ReminderSMS
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت لیست - ارسال پیامک
|
||||||
|
/// فراخوانی از سمت بک گراند سرویس
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> SendReminderSmsForBackgroundTask();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک صورت حساب ماهانه
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="now"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendMonthlySms(DateTime now);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///دریافت لیست بدهکارن
|
||||||
|
/// جهت ارسال پیامک
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<List<SmsListData>> GetSmsListData(DateTime checkDate, TypeOfSmsSetting typeOfSmsSetting);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ارسال پیامک های یاد آور بدهی
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task SendReminderSmsToContractingParties(List<SmsListData> smsListData, string typeOfSms, string sendMessStart, string sendMessEnd);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -19,7 +19,8 @@ public class InstitutionContract : EntityBase
|
|||||||
string contractEndFa, double contractAmount, double dailyCompenseation, double obligation,
|
string contractEndFa, double contractAmount, double dailyCompenseation, double obligation,
|
||||||
double totalAmount, int extensionNo, string workshopManualCount, string employeeManualCount, string description,
|
double totalAmount, int extensionNo, string workshopManualCount, string employeeManualCount, string description,
|
||||||
string officialCompany, string typeOfcontract, string hasValueAddedTax, double valueAddedTax,
|
string officialCompany, string typeOfcontract, string hasValueAddedTax, double valueAddedTax,
|
||||||
List<InstitutionContractWorkshopInitial> workshopDetails, long lawId)
|
List<InstitutionContractWorkshopInitial> workshopDetails, long lawId,
|
||||||
|
int discountPercentage, double discountAmount)
|
||||||
{
|
{
|
||||||
ContractNo = contractNo;
|
ContractNo = contractNo;
|
||||||
RepresentativeId = representativeId;
|
RepresentativeId = representativeId;
|
||||||
@@ -57,8 +58,12 @@ public class InstitutionContract : EntityBase
|
|||||||
WorkshopGroup = new InstitutionContractWorkshopGroup(id, workshopDetails);
|
WorkshopGroup = new InstitutionContractWorkshopGroup(id, workshopDetails);
|
||||||
PublicId = Guid.NewGuid();
|
PublicId = Guid.NewGuid();
|
||||||
LawId = lawId;
|
LawId = lawId;
|
||||||
|
DiscountPercentage = discountPercentage;
|
||||||
|
DiscountAmount = discountAmount;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public long LawId { get; private set; }
|
public long LawId { get; private set; }
|
||||||
|
|
||||||
public string ContractNo { get; private set; }
|
public string ContractNo { get; private set; }
|
||||||
@@ -93,6 +98,11 @@ public class InstitutionContract : EntityBase
|
|||||||
// مبلغ قرارداد
|
// مبلغ قرارداد
|
||||||
public double ContractAmount { get; private set; }
|
public double ContractAmount { get; private set; }
|
||||||
|
|
||||||
|
public double ContractAmountWithTax => !IsOldContract ? ContractAmount + ContractAmountTax
|
||||||
|
: ContractAmount;
|
||||||
|
|
||||||
|
public double ContractAmountTax => ContractAmount*0.10;
|
||||||
|
|
||||||
//خسارت روزانه
|
//خسارت روزانه
|
||||||
public double DailyCompenseation { get; private set; }
|
public double DailyCompenseation { get; private set; }
|
||||||
|
|
||||||
@@ -129,6 +139,10 @@ public class InstitutionContract : EntityBase
|
|||||||
public string VerifierFullName { get; private set; }
|
public string VerifierFullName { get; private set; }
|
||||||
public string VerifierPhoneNumber { get; private set; }
|
public string VerifierPhoneNumber { get; private set; }
|
||||||
|
|
||||||
|
public double DiscountAmount { get; private set; }
|
||||||
|
|
||||||
|
public int DiscountPercentage { get; private set; }
|
||||||
|
|
||||||
[NotMapped] public bool VerifyCodeExpired => VerifyCodeCreation.Add(ExpireTime) <= DateTime.Now;
|
[NotMapped] public bool VerifyCodeExpired => VerifyCodeCreation.Add(ExpireTime) <= DateTime.Now;
|
||||||
|
|
||||||
[NotMapped] public bool CanResendVerifyCode => VerifyCodeCreation.Add(ReSendTime) <= DateTime.Now;
|
[NotMapped] public bool CanResendVerifyCode => VerifyCodeCreation.Add(ReSendTime) <= DateTime.Now;
|
||||||
@@ -150,6 +164,10 @@ public class InstitutionContract : EntityBase
|
|||||||
|
|
||||||
public List<InstitutionContractAmendment> Amendments { get; private set; }
|
public List<InstitutionContractAmendment> Amendments { get; private set; }
|
||||||
|
|
||||||
|
public InstitutionContractSigningType? SigningType { get; private set; }
|
||||||
|
|
||||||
|
public bool IsOldContract => LawId== 0;
|
||||||
|
|
||||||
public InstitutionContract()
|
public InstitutionContract()
|
||||||
{
|
{
|
||||||
ContactInfoList = [];
|
ContactInfoList = [];
|
||||||
@@ -253,6 +271,15 @@ public class InstitutionContract : EntityBase
|
|||||||
{
|
{
|
||||||
WorkshopGroup = null;
|
WorkshopGroup = null;
|
||||||
}
|
}
|
||||||
|
public void SetSigningType(InstitutionContractSigningType signingType)
|
||||||
|
{
|
||||||
|
SigningType = signingType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddAmendment(InstitutionContractAmendment amendment)
|
||||||
|
{
|
||||||
|
Amendments.Add(amendment);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractAmendment : EntityBase
|
public class InstitutionContractAmendment : EntityBase
|
||||||
@@ -260,14 +287,15 @@ public class InstitutionContractAmendment : EntityBase
|
|||||||
private InstitutionContractAmendment(){}
|
private InstitutionContractAmendment(){}
|
||||||
public InstitutionContractAmendment(long institutionContractId,
|
public InstitutionContractAmendment(long institutionContractId,
|
||||||
List<InstitutionContractInstallment> installments, double amount, bool hasInstallment,
|
List<InstitutionContractInstallment> installments, double amount, bool hasInstallment,
|
||||||
InstitutionContractAmendmentChange amendmentChange, long lawId)
|
List<InstitutionContractAmendmentChange> amendmentChanges, long lawId)
|
||||||
{
|
{
|
||||||
InstitutionContractId = institutionContractId;
|
InstitutionContractId = institutionContractId;
|
||||||
Installments = installments is { Count: > 0} ? installments : [];
|
Installments = installments is { Count: > 0} ? installments : [];
|
||||||
Amount = amount;
|
Amount = amount;
|
||||||
HasInstallment = hasInstallment;
|
HasInstallment = hasInstallment;
|
||||||
AmendmentChanges = [amendmentChange];
|
AmendmentChanges = amendmentChanges;
|
||||||
LawId = lawId;
|
LawId = lawId;
|
||||||
|
VerificationStatus = InstitutionContractVerificationStatus.PendingForVerify;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long InstitutionContractId { get; set; }
|
public long InstitutionContractId { get; set; }
|
||||||
@@ -281,6 +309,15 @@ public class InstitutionContractAmendment : EntityBase
|
|||||||
|
|
||||||
public long LawId { get; set; }
|
public long LawId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public string VerifierPhoneNumber { get; private set; }
|
||||||
|
|
||||||
|
public string VerifierFullName { get; private set; }
|
||||||
|
|
||||||
|
public InstitutionContractVerificationStatus VerificationStatus { get; set; }
|
||||||
|
|
||||||
|
public DateTime VerifyCodeCreation { get; set; }
|
||||||
|
|
||||||
public void SetVerifyCode(string code,string verifierFullName, string verifierPhoneNumber)
|
public void SetVerifyCode(string code,string verifierFullName, string verifierPhoneNumber)
|
||||||
{
|
{
|
||||||
VerifyCode = code;
|
VerifyCode = code;
|
||||||
@@ -288,25 +325,22 @@ public class InstitutionContractAmendment : EntityBase
|
|||||||
VerifierFullName = verifierFullName;
|
VerifierFullName = verifierFullName;
|
||||||
VerifierPhoneNumber = verifierPhoneNumber;
|
VerifierPhoneNumber = verifierPhoneNumber;
|
||||||
}
|
}
|
||||||
|
public void Verified()
|
||||||
public string VerifierPhoneNumber { get; private set; }
|
{
|
||||||
|
VerificationStatus = InstitutionContractVerificationStatus.Verified;
|
||||||
public string VerifierFullName { get; private set; }
|
}
|
||||||
|
|
||||||
public DateTime VerifyCodeCreation { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractAmendmentChange : EntityBase
|
public class InstitutionContractAmendmentChange : EntityBase
|
||||||
{
|
{
|
||||||
private InstitutionContractAmendmentChange() { }
|
private InstitutionContractAmendmentChange() { }
|
||||||
private InstitutionContractAmendmentChange(long institutionContractAmendmentId,
|
|
||||||
InstitutionContractAmendment institutionContractAmendment, InstitutionContractAmendmentChangeType changeType,
|
private InstitutionContractAmendmentChange(InstitutionContractAmendmentChangeType changeType,
|
||||||
DateTime changeDateGr, bool? hasRollCallPlan, bool? hasCustomizeCheckoutPlan, bool? hasContractPlan,
|
DateTime changeDateGr, bool? hasCustomizeCheckoutPlan, bool? hasContractPlan,
|
||||||
bool? hasContractPlanInPerson, bool? hasInsurancePlan, bool? hasInsurancePlanInPerson, int? personnelCount,
|
bool? hasContractPlanInPerson, bool? hasInsurancePlan, bool? hasInsurancePlanInPerson, int? personnelCount,
|
||||||
long? workshopDetailsId)
|
bool? hasRollCallPlan, bool? hasRollCallInPerson,
|
||||||
|
long? currentWorkshopId, int personnelCountDifference)
|
||||||
{
|
{
|
||||||
InstitutionContractAmendmentId = institutionContractAmendmentId;
|
|
||||||
InstitutionContractAmendment = institutionContractAmendment;
|
|
||||||
ChangeType = changeType;
|
ChangeType = changeType;
|
||||||
ChangeDateGr = changeDateGr;
|
ChangeDateGr = changeDateGr;
|
||||||
HasRollCallPlan = hasRollCallPlan;
|
HasRollCallPlan = hasRollCallPlan;
|
||||||
@@ -316,9 +350,80 @@ public class InstitutionContractAmendmentChange : EntityBase
|
|||||||
HasInsurancePlan = hasInsurancePlan;
|
HasInsurancePlan = hasInsurancePlan;
|
||||||
HasInsurancePlanInPerson = hasInsurancePlanInPerson;
|
HasInsurancePlanInPerson = hasInsurancePlanInPerson;
|
||||||
PersonnelCount = personnelCount;
|
PersonnelCount = personnelCount;
|
||||||
WorkshopDetailsId = workshopDetailsId;
|
PersonnelCountDifference = personnelCountDifference;
|
||||||
|
CurrentWorkshopId = currentWorkshopId;
|
||||||
|
HasRollCallInPerson = hasRollCallInPerson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تغییر تعداد پرسنل
|
||||||
|
/// </summary>
|
||||||
|
public static InstitutionContractAmendmentChange CreatePersonCountChange(
|
||||||
|
DateTime changeDateGr, int personnelCount, int personnelCountDifference,
|
||||||
|
long currentWorkshopId)
|
||||||
|
{
|
||||||
|
return new InstitutionContractAmendmentChange(
|
||||||
|
changeType: InstitutionContractAmendmentChangeType.PersonCount,
|
||||||
|
changeDateGr: changeDateGr,
|
||||||
|
hasCustomizeCheckoutPlan: null,
|
||||||
|
hasContractPlan: null,
|
||||||
|
hasContractPlanInPerson: null,
|
||||||
|
hasInsurancePlan: null,
|
||||||
|
hasInsurancePlanInPerson: null,
|
||||||
|
personnelCount: personnelCount,
|
||||||
|
hasRollCallPlan: null,
|
||||||
|
hasRollCallInPerson: null,
|
||||||
|
currentWorkshopId: currentWorkshopId,
|
||||||
|
personnelCountDifference: personnelCountDifference);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// تغییر خدمات
|
||||||
|
/// </summary>
|
||||||
|
public static InstitutionContractAmendmentChange CreateServicesChange(
|
||||||
|
DateTime changeDateGr, long currentWorkshopId, bool hasRollCallPlan, bool hasRollCallInPerson,
|
||||||
|
bool hasCustomizeCheckoutPlan, bool hasContractPlan, bool hasContractPlanInPerson,
|
||||||
|
bool hasInsurancePlan, bool hasInsurancePlanInPerson)
|
||||||
|
{
|
||||||
|
return new InstitutionContractAmendmentChange(
|
||||||
|
changeType: InstitutionContractAmendmentChangeType.Services,
|
||||||
|
changeDateGr: changeDateGr,
|
||||||
|
hasCustomizeCheckoutPlan: hasCustomizeCheckoutPlan,
|
||||||
|
hasContractPlan: hasContractPlan,
|
||||||
|
hasContractPlanInPerson: hasContractPlanInPerson,
|
||||||
|
hasInsurancePlan: hasInsurancePlan,
|
||||||
|
hasInsurancePlanInPerson: hasInsurancePlanInPerson,
|
||||||
|
personnelCount: null,
|
||||||
|
hasRollCallPlan: hasRollCallPlan,
|
||||||
|
hasRollCallInPerson: hasRollCallInPerson,
|
||||||
|
currentWorkshopId: currentWorkshopId,
|
||||||
|
personnelCountDifference: 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ایجاد کارگاه جدید
|
||||||
|
/// </summary>
|
||||||
|
public static InstitutionContractAmendmentChange CreateWorkshopCreatedChange(
|
||||||
|
DateTime changeDateGr, bool hasRollCallPlan, bool hasRollCallInPerson,
|
||||||
|
bool hasCustomizeCheckoutPlan, bool hasContractPlan, bool hasContractPlanInPerson,
|
||||||
|
bool hasInsurancePlan, bool hasInsurancePlanInPerson,int personnelCount)
|
||||||
|
{
|
||||||
|
return new InstitutionContractAmendmentChange(
|
||||||
|
changeType: InstitutionContractAmendmentChangeType.WorkshopCreated,
|
||||||
|
changeDateGr: changeDateGr,
|
||||||
|
hasCustomizeCheckoutPlan: hasCustomizeCheckoutPlan,
|
||||||
|
hasContractPlan: hasContractPlan,
|
||||||
|
hasContractPlanInPerson: hasContractPlanInPerson,
|
||||||
|
hasInsurancePlan: hasInsurancePlan,
|
||||||
|
hasInsurancePlanInPerson: hasInsurancePlanInPerson,
|
||||||
|
personnelCount: personnelCount,
|
||||||
|
hasRollCallPlan: hasRollCallPlan,
|
||||||
|
hasRollCallInPerson: hasRollCallInPerson,
|
||||||
|
currentWorkshopId: null,
|
||||||
|
personnelCountDifference: 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public long InstitutionContractAmendmentId { get; private set; }
|
public long InstitutionContractAmendmentId { get; private set; }
|
||||||
public InstitutionContractAmendment InstitutionContractAmendment { get; private set; }
|
public InstitutionContractAmendment InstitutionContractAmendment { get; private set; }
|
||||||
public InstitutionContractAmendmentChangeType ChangeType { get; private set; }
|
public InstitutionContractAmendmentChangeType ChangeType { get; private set; }
|
||||||
@@ -329,6 +434,8 @@ public class InstitutionContractAmendmentChange : EntityBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? HasRollCallPlan { get; private set; }
|
public bool? HasRollCallPlan { get; private set; }
|
||||||
|
|
||||||
|
public bool? HasRollCallInPerson { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// پلن فیش غیر رسمی
|
/// پلن فیش غیر رسمی
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -359,10 +466,16 @@ public class InstitutionContractAmendmentChange : EntityBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int? PersonnelCount { get; private set; }
|
public int? PersonnelCount { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// مقدار تغییرات تعداد پرسنل
|
||||||
|
/// </summary>
|
||||||
|
public int PersonnelCountDifference { get; set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// تعداد کارگاه
|
/// تعداد کارگاه
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long? WorkshopDetailsId { get; private set; }
|
public long? CurrentWorkshopId { get; private set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum InstitutionContractAmendmentChangeType
|
public enum InstitutionContractAmendmentChangeType
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ public class InstitutionContractWorkshopBase:EntityBase
|
|||||||
protected InstitutionContractWorkshopBase(){}
|
protected InstitutionContractWorkshopBase(){}
|
||||||
public InstitutionContractWorkshopBase(string workshopName, bool hasRollCallPlan,bool hasRollCallPlanInPerson,
|
public InstitutionContractWorkshopBase(string workshopName, bool hasRollCallPlan,bool hasRollCallPlanInPerson,
|
||||||
bool hasCustomizeCheckoutPlan, bool hasContractPlan,bool hasContractPlanInPerson,bool hasInsurancePlan,bool hasInsurancePlanInPerson,
|
bool hasCustomizeCheckoutPlan, bool hasContractPlan,bool hasContractPlanInPerson,bool hasInsurancePlan,bool hasInsurancePlanInPerson,
|
||||||
int personnelCount, double price )
|
int personnelCount, double price,bool isAmendment )
|
||||||
{
|
{
|
||||||
WorkshopName = workshopName;
|
WorkshopName = workshopName;
|
||||||
Services = new WorkshopServices(hasInsurancePlan, hasInsurancePlanInPerson,
|
Services = new WorkshopServices(hasInsurancePlan, hasInsurancePlanInPerson,
|
||||||
@@ -17,7 +17,10 @@ public class InstitutionContractWorkshopBase:EntityBase
|
|||||||
PersonnelCount = personnelCount;
|
PersonnelCount = personnelCount;
|
||||||
Price = price;
|
Price = price;
|
||||||
Employers = [];
|
Employers = [];
|
||||||
|
IsAmendment = isAmendment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// شناسه کارگاه
|
/// شناسه کارگاه
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -43,6 +46,10 @@ public class InstitutionContractWorkshopBase:EntityBase
|
|||||||
|
|
||||||
public double Price { get; private set; }
|
public double Price { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// جهت نمایش دادن اینکه آیا این کارگاه مربوط به ارتقا قرارداد است یا خیر
|
||||||
|
/// </summary>
|
||||||
|
public bool IsAmendment { get; set; }
|
||||||
|
|
||||||
public List<InstitutionContractWorkshopDetailEmployer> Employers { get; private set; } = new();
|
public List<InstitutionContractWorkshopDetailEmployer> Employers { get; private set; } = new();
|
||||||
|
|
||||||
|
|||||||
@@ -10,13 +10,15 @@ public class InstitutionContractWorkshopCurrent:InstitutionContractWorkshopBase
|
|||||||
public InstitutionContractWorkshopCurrent(string workshopName, bool hasRollCallPlan,
|
public InstitutionContractWorkshopCurrent(string workshopName, bool hasRollCallPlan,
|
||||||
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
||||||
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
||||||
int personnelCount, double price,long institutionContractWorkshopGroupId,InstitutionContractWorkshopGroup workshopGroup,long workshopId) : base(workshopName, hasRollCallPlan,
|
int personnelCount, double price,long institutionContractWorkshopGroupId,
|
||||||
|
InstitutionContractWorkshopGroup workshopGroup,long workshopId,bool isAmendment, long initialWorkshopId) : base(workshopName, hasRollCallPlan,
|
||||||
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan,
|
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan,
|
||||||
hasContractPlanInPerson, hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price)
|
hasContractPlanInPerson, hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price,isAmendment)
|
||||||
{
|
{
|
||||||
InstitutionContractWorkshopGroupId = institutionContractWorkshopGroupId;
|
InstitutionContractWorkshopGroupId = institutionContractWorkshopGroupId;
|
||||||
WorkshopGroup = workshopGroup;
|
WorkshopGroup = workshopGroup;
|
||||||
WorkshopId = workshopId;
|
WorkshopId = workshopId;
|
||||||
|
InitialWorkshopId = initialWorkshopId;
|
||||||
}
|
}
|
||||||
public long InstitutionContractWorkshopGroupId { get; private set; }
|
public long InstitutionContractWorkshopGroupId { get; private set; }
|
||||||
public InstitutionContractWorkshopGroup WorkshopGroup { get; private set; }
|
public InstitutionContractWorkshopGroup WorkshopGroup { get; private set; }
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ public class InstitutionContractWorkshopGroup : EntityBase
|
|||||||
!InitialWorkshops.Cast<InstitutionContractWorkshopBase>()
|
!InitialWorkshops.Cast<InstitutionContractWorkshopBase>()
|
||||||
.SequenceEqual(CurrentWorkshops.Cast<InstitutionContractWorkshopBase>());
|
.SequenceEqual(CurrentWorkshops.Cast<InstitutionContractWorkshopBase>());
|
||||||
|
|
||||||
|
public bool IsInPersonContract => InitialWorkshops.Any(x => x.Services.ContractInPerson);
|
||||||
|
|
||||||
public InstitutionContractWorkshopGroup(long institutionContractId,
|
public InstitutionContractWorkshopGroup(long institutionContractId,
|
||||||
List<InstitutionContractWorkshopInitial> initialDetails)
|
List<InstitutionContractWorkshopInitial> initialDetails)
|
||||||
{
|
{
|
||||||
@@ -32,9 +34,22 @@ public class InstitutionContractWorkshopGroup : EntityBase
|
|||||||
LastModifiedDate = DateTime.Now;
|
LastModifiedDate = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddAmendmentWorkshops(List<InstitutionContractWorkshopInitial> amendmentDetails)
|
||||||
|
{
|
||||||
|
InitialWorkshops.AddRange(amendmentDetails);
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void UpdateCurrentWorkshops(List<InstitutionContractWorkshopCurrent> updatedDetails)
|
public void UpdateCurrentWorkshops(List<InstitutionContractWorkshopCurrent> updatedDetails)
|
||||||
{
|
{
|
||||||
CurrentWorkshops = updatedDetails.ToList();
|
CurrentWorkshops = updatedDetails.ToList();
|
||||||
LastModifiedDate = DateTime.Now;
|
LastModifiedDate = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddCurrentWorkshop(InstitutionContractWorkshopCurrent currentWorkshop)
|
||||||
|
{
|
||||||
|
CurrentWorkshops.Add(currentWorkshop);
|
||||||
|
LastModifiedDate = DateTime.Now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,9 +11,9 @@ public class InstitutionContractWorkshopInitial:InstitutionContractWorkshopBase
|
|||||||
public InstitutionContractWorkshopInitial(string workshopName, bool hasRollCallPlan,
|
public InstitutionContractWorkshopInitial(string workshopName, bool hasRollCallPlan,
|
||||||
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
bool hasRollCallPlanInPerson, bool hasCustomizeCheckoutPlan, bool hasContractPlan,
|
||||||
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
bool hasContractPlanInPerson, bool hasInsurancePlan, bool hasInsurancePlanInPerson,
|
||||||
int personnelCount, double price) : base(workshopName, hasRollCallPlan,
|
int personnelCount, double price,bool isAmendment =false) : base(workshopName, hasRollCallPlan,
|
||||||
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan, hasContractPlanInPerson,
|
hasRollCallPlanInPerson, hasCustomizeCheckoutPlan, hasContractPlan, hasContractPlanInPerson,
|
||||||
hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price)
|
hasInsurancePlan, hasInsurancePlanInPerson, personnelCount, price,isAmendment)
|
||||||
{
|
{
|
||||||
WorkshopCreated = false;
|
WorkshopCreated = false;
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,8 @@ public class InstitutionContractWorkshopInitial:InstitutionContractWorkshopBase
|
|||||||
WorkshopCreated = true;
|
WorkshopCreated = true;
|
||||||
WorkshopCurrent = new InstitutionContractWorkshopCurrent(WorkshopName,Services.RollCall,Services.RollCallInPerson,
|
WorkshopCurrent = new InstitutionContractWorkshopCurrent(WorkshopName,Services.RollCall,Services.RollCallInPerson,
|
||||||
Services.CustomizeCheckout,Services.Contract,Services.ContractInPerson,Services.Insurance,
|
Services.CustomizeCheckout,Services.Contract,Services.ContractInPerson,Services.Insurance,
|
||||||
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId);
|
Services.InsuranceInPerson,PersonnelCount,Price,InstitutionContractWorkshopGroupId,WorkshopGroup,workshopId,
|
||||||
|
IsAmendment, id);
|
||||||
WorkshopCurrent.SetEmployers(Employers.Select(x=>x.EmployerId).ToList());
|
WorkshopCurrent.SetEmployers(Employers.Select(x=>x.EmployerId).ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||||
using MongoDB.Bson;
|
using MongoDB.Bson;
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
@@ -16,7 +17,7 @@ public class InstitutionContractAmendmentTemp
|
|||||||
NewWorkshops = prevWorkshops.Select(x=> new InstitutionContractAmendmentTempNewWorkshop(
|
NewWorkshops = prevWorkshops.Select(x=> new InstitutionContractAmendmentTempNewWorkshop(
|
||||||
x.WorkshopName, x.CountPerson, x.ContractAndCheckout, x.ContractAndCheckoutInPerson, x.Insurance,
|
x.WorkshopName, x.CountPerson, x.ContractAndCheckout, x.ContractAndCheckoutInPerson, x.Insurance,
|
||||||
x.InsuranceInPerson, x.RollCall, x.RollCallInPerson, x.CustomizeCheckout, x.Price, x.WorkshopId,
|
x.InsuranceInPerson, x.RollCall, x.RollCallInPerson, x.CustomizeCheckout, x.Price, x.WorkshopId,
|
||||||
x.CurrentWorkshopId, 0)).ToList();
|
x.CurrentWorkshopId, 0,x.Id)).ToList();
|
||||||
InstitutionContractId = institutionContractId;
|
InstitutionContractId = institutionContractId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,17 +26,32 @@ public class InstitutionContractAmendmentTemp
|
|||||||
public Guid Id { get; private set; }
|
public Guid Id { get; private set; }
|
||||||
public List<InstitutionContractAmendmentTempPrevWorkshop> PrevWorkshops { get; private set; }
|
public List<InstitutionContractAmendmentTempPrevWorkshop> PrevWorkshops { get; private set; }
|
||||||
public List<InstitutionContractAmendmentTempNewWorkshop> NewWorkshops { get; private set; }
|
public List<InstitutionContractAmendmentTempNewWorkshop> NewWorkshops { get; private set; }
|
||||||
|
|
||||||
|
public InstitutionContractPaymentMonthlyViewModel MonthlyPayment { get; set; }
|
||||||
|
|
||||||
|
public InstitutionContractPaymentOneTimeViewModel OneTimePayment { get; set; }
|
||||||
|
|
||||||
public long InstitutionContractId { get; private set; }
|
public long InstitutionContractId { get; private set; }
|
||||||
|
|
||||||
|
public int MonthDifference { get; set; }
|
||||||
|
public void AddPaymentDetails(InstitutionContractPaymentMonthlyViewModel resMonthly, InstitutionContractPaymentOneTimeViewModel resOneTime, int monthDiff)
|
||||||
|
{
|
||||||
|
MonthlyPayment = resMonthly;
|
||||||
|
OneTimePayment = resOneTime;
|
||||||
|
MonthDifference = monthDiff;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InstitutionContractAmendmentTempNewWorkshop : InstitutionContractAmendmentTempPrevWorkshop
|
public class InstitutionContractAmendmentTempNewWorkshop : InstitutionContractAmendmentTempPrevWorkshop
|
||||||
{
|
{
|
||||||
public InstitutionContractAmendmentTempNewWorkshop(string workshopName, int countPerson, bool contractAndCheckout,
|
public InstitutionContractAmendmentTempNewWorkshop(string workshopName, int countPerson, bool contractAndCheckout,
|
||||||
bool contractAndCheckoutInPerson, bool insurance, bool insuranceInPerson, bool rollCall, bool rollCallInPerson,
|
bool contractAndCheckoutInPerson, bool insurance, bool insuranceInPerson, bool rollCall, bool rollCallInPerson,
|
||||||
bool customizeCheckout, double price, long workshopId, long currentWorkshopId,double priceDifference) : base(
|
bool customizeCheckout, double price, long workshopId, long currentWorkshopId,double priceDifference,Guid prevId) : base(
|
||||||
workshopName, countPerson, contractAndCheckout, contractAndCheckoutInPerson, insurance, insuranceInPerson,
|
workshopName, countPerson, contractAndCheckout, contractAndCheckoutInPerson, insurance, insuranceInPerson,
|
||||||
rollCall, rollCallInPerson, customizeCheckout, price, workshopId, currentWorkshopId)
|
rollCall, rollCallInPerson, customizeCheckout, price, workshopId, currentWorkshopId)
|
||||||
{
|
{
|
||||||
|
Id = prevId;
|
||||||
PriceDifference = priceDifference;
|
PriceDifference = priceDifference;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user