Compare commits
874 Commits
origin/pro
...
8cd1385a21
| Author | SHA1 | Date | |
|---|---|---|---|
| 8cd1385a21 | |||
| 46ac5c8651 | |||
| 4fea68e542 | |||
| 4027d6f687 | |||
| f343f31075 | |||
|
|
7a72e6674f | ||
|
|
a7b1c78cc5 | ||
|
|
843ddd0201 | ||
|
|
80204a7abb | ||
|
|
682edcd50e | ||
|
|
d96e439b2a | ||
|
|
21a909aacb | ||
|
|
5dc04d01e2 | ||
|
|
429ef68f09 | ||
|
|
d935445ebc | ||
|
|
597e52dc56 | ||
|
|
9cbc65ade9 | ||
|
|
4160021ffb | ||
|
|
8e375c2764 | ||
|
|
eddfcd2b21 | ||
|
|
0ee868e071 | ||
|
|
7478064d5f | ||
|
|
2ae56ce039 | ||
|
|
63698bc1d1 | ||
|
|
0938444926 | ||
|
|
ff11db177f | ||
|
|
89506b8491 | ||
|
|
51018456bc | ||
|
|
ad111bc61f | ||
|
|
e494fbb800 | ||
|
|
c32e0dd779 | ||
|
|
f42266258f | ||
|
|
18edec5393 | ||
|
|
14e0182709 | ||
|
|
7dad4e8004 | ||
|
|
5dbad1f6a2 | ||
|
|
88be6605c2 | ||
|
|
8eba77dc2f | ||
|
|
63de17a98f | ||
|
|
e4a6a58e17 | ||
|
|
5725178c1f | ||
|
|
492bdf6cc6 | ||
|
|
daddb3ba74 | ||
|
|
f119948c63 | ||
|
|
8de1f2baa0 | ||
|
|
f98c3c836c | ||
|
|
4ed1a3246e | ||
| e62d0b2181 | |||
|
|
5a4257e22a | ||
|
|
d3d47292dd | ||
|
|
cd3d285082 | ||
|
|
256a630872 | ||
|
|
9c01a5fdf7 | ||
|
|
25453eeeda | ||
|
|
63117263a6 | ||
| 8b50b8d14a | |||
|
|
23e201d50c | ||
| 31b0a7811b | |||
| 5bf5a05698 | |||
|
|
5994aae990 | ||
|
|
0c9ec123fb | ||
|
|
ebafd8697d | ||
|
|
19c7fdd3e0 | ||
|
|
97a68e3d4f | ||
|
|
3554e680ce | ||
|
|
85200b27ba | ||
|
|
3d9fe9cec0 | ||
|
|
36653c4751 | ||
|
|
20fa3fbc02 | ||
|
|
765d1a5ef3 | ||
|
|
48bd2af847 | ||
|
|
63c169ae61 | ||
|
|
0370302fe6 | ||
|
|
b0b34df1b0 | ||
|
|
928cb37289 | ||
|
|
ba4fba8380 | ||
|
|
e889eaadbf | ||
| 30e8dd3cda | |||
| 77c8d7200d | |||
| 7c2a8496af | |||
|
|
6ffc1bcfa5 | ||
|
|
d81d38ada4 | ||
|
|
2bb8091082 | ||
|
|
f82c6177a3 | ||
|
|
7bae2cee54 | ||
|
|
8eb82a171c | ||
|
|
3534818c60 | ||
|
|
bc8a088d8b | ||
|
|
127ef3ff50 | ||
|
|
8084a83c3d | ||
|
|
7e42a5ecfd | ||
|
|
8077284d3b | ||
|
|
f10589eb85 | ||
|
|
b8a72b8119 | ||
|
|
e81998cbe2 | ||
|
|
833e158c19 | ||
|
|
37d96ddb37 | ||
|
|
8d84b123f7 | ||
|
|
eaf7c94f7a | ||
|
|
e178682fcf | ||
|
|
9333e37dfe | ||
|
|
9976e8e438 | ||
|
|
14ddbf48f3 | ||
|
|
c6d0015c07 | ||
|
|
d547b6d374 | ||
|
|
179f4b3088 | ||
|
|
04752ffcd7 | ||
|
|
42ea2e108d | ||
|
|
a29c39086a | ||
| b27682f5b3 | |||
| acfc8d1288 | |||
| c65a95ce09 | |||
| 6a885c84ac | |||
| 3c9066edc6 | |||
| 6a4aaff628 | |||
|
|
ff5c1de363 | ||
|
|
5f701af321 | ||
|
|
14f2da6909 | ||
|
|
b2580c49ab | ||
|
|
ea4059766e | ||
|
|
a9423e8b0a | ||
|
|
9900c00b8d | ||
|
|
633c9aeae0 | ||
|
|
ba2490147f | ||
|
|
fa29494a67 | ||
|
|
9634b12f11 | ||
| df02dc0c5f | |||
|
|
80fe484b09 | ||
| 60f5f38ffe | |||
| 05bed90598 | |||
|
|
b6e8bbb79b | ||
|
|
664f2a7faa | ||
|
|
bec3c2bf17 | ||
|
|
5482ca3ae8 | ||
| eaa508ad74 | |||
|
|
eb0c34293e | ||
| a480b6e133 | |||
|
|
2a4a6f2ca2 | ||
| 84caa2265d | |||
|
|
202df9064f | ||
|
|
8b06eb77d1 | ||
|
|
9bc2ecac96 | ||
| a3e0c72908 | |||
| 06bba125c8 | |||
|
|
7ae6a89ff9 | ||
| e657e3f75a | |||
|
|
45aeb8faee | ||
| af20355b31 | |||
|
|
b9f0bffbc3 | ||
| 8597ce1fff | |||
| efc46c0f92 | |||
|
|
86ed6b5bb1 | ||
|
|
6ffd34a409 | ||
|
|
61ed988f50 | ||
|
|
29eb4fd3ef | ||
|
|
277802c708 | ||
| ab3d850bd4 | |||
| dc2f40e5ad | |||
| e2c9a4bad0 | |||
|
|
a661ee7f25 | ||
| b587e53f7a | |||
|
|
ad93252997 | ||
| c8efb2d82b | |||
|
|
418631380a | ||
| e3369542f4 | |||
| 58d2c70839 | |||
|
|
21dc2a8df8 | ||
| 1644002c11 | |||
|
|
47ab0d2d61 | ||
| 8956804351 | |||
| ca2c397c51 | |||
|
|
6c170c19de | ||
|
|
6deaf27bca | ||
|
|
3fc44c56f5 | ||
|
|
dc02745c5a | ||
|
|
246fc11438 | ||
| 4e3bf6d11e | |||
| 9811ccd92d | |||
|
|
6fdc228b6f | ||
| 6e2e630780 | |||
|
|
e856a5873d | ||
| 46c7c5c0cb | |||
|
|
b66494194e | ||
|
|
66762055da | ||
| ccd39e4d77 | |||
| 51ce855408 | |||
| 9810a28774 | |||
| ce2c417045 | |||
| 8ed6700339 | |||
| 74acd90709 | |||
| 1a90cefb04 | |||
| cfab2f37ea | |||
| a0a7c3b735 | |||
| e56910e0c1 | |||
| cb2a335989 | |||
| ffaef03945 | |||
|
|
d6a84ce9f2 | ||
|
|
7ed8acd064 | ||
| a7c7dd8d8f | |||
| 9090c16a6a | |||
| b163ba5547 | |||
|
|
5a8fa432d2 | ||
|
|
7470f01466 | ||
| 7e41f543ae | |||
| f75f8ddb51 | |||
|
|
4fde6fa756 | ||
| d297fc6ab2 | |||
| 3b228a96fb | |||
|
|
ac4e59996d | ||
| c8994caaf5 | |||
|
|
43065ed30c | ||
| 67b6b3a605 | |||
| a94972d14d | |||
|
|
9db7037c31 | ||
| 7dcc816af1 | |||
|
|
922551a2b8 | ||
| ced9e6ac32 | |||
| 5c1befd7ab | |||
|
|
6689449fb0 | ||
| 5b869a4ee8 | |||
| 33bfb8ede9 | |||
| 2860f44d10 | |||
|
|
118ce107ec | ||
|
|
a2fbabf457 | ||
|
|
e0b58e23b2 | ||
| 59278de3a6 | |||
| c629765afd | |||
|
|
697c41eb70 | ||
|
|
d211bb7924 | ||
|
|
8e9492f98b | ||
|
|
7a885ef4a1 | ||
|
|
888a364a22 | ||
|
|
e4253756e4 | ||
|
|
81a47bfb07 | ||
|
|
f6dfef61e3 | ||
|
|
5cb26d9553 | ||
|
|
fc8cf3f6b1 | ||
| 2bbbbc8fef | |||
| 0ab8ec85d3 | |||
| a436f8550b | |||
| de2a481bbe | |||
|
|
f521e8b6fa | ||
|
|
de86988cf0 | ||
| 979c1e06d2 | |||
| 5f7893c8de | |||
|
|
b69588ae65 | ||
|
|
18e0b13335 | ||
| de644e5db8 | |||
| fb70bc4206 | |||
|
|
828910752a | ||
|
|
e430c446fd | ||
|
|
3a76e7f7cf | ||
|
|
5bd8e4d8e7 | ||
|
|
e5c647bb7c | ||
|
|
9128ff3b86 | ||
|
|
659b28fde7 | ||
|
|
013c57d00a | ||
|
|
67e4306f10 | ||
|
|
6225c1c0e4 | ||
| 4c72d9ab21 | |||
| f3fd02671f | |||
| 772c91ef00 | |||
| 55a1ae3c71 | |||
|
|
7bc76bf1fd | ||
|
|
999ba3eb61 | ||
|
|
5e79feabb9 | ||
|
|
a8bfde8132 | ||
|
|
8c66a4cd31 | ||
|
|
0233058e66 | ||
|
|
9a4e9db798 | ||
|
|
0c8feec075 | ||
|
|
3fb8dbb091 | ||
|
|
39bc02b224 | ||
|
|
82eca4b58a | ||
|
|
f676f4a244 | ||
|
|
c57605b554 | ||
|
|
9e0507690a | ||
|
|
8d5c7e4cb4 | ||
|
|
2663a7bfbe | ||
|
|
d46e40e7b1 | ||
|
|
0f30c9c4b8 | ||
|
|
d184ba07b6 | ||
|
|
0758a70434 | ||
|
|
611689235b | ||
|
|
15138f7edf | ||
|
|
59e38b969e | ||
|
|
ac5bd92fe2 | ||
|
|
578a8847a2 | ||
|
|
99478f2b2c | ||
|
|
d534d94e6f | ||
|
|
c3e1e4061e | ||
|
|
bfa21b97e4 | ||
|
|
3087d30e16 | ||
|
|
4381fe6141 | ||
|
|
4034db6323 | ||
|
|
fc0b004fbd | ||
| e4d54ab78c | |||
| ff05c31914 | |||
| 9c396d1b36 | |||
|
|
f6d068c91b | ||
|
|
1bf608b1ed | ||
|
|
6473788765 | ||
| 195265deee | |||
| 836fab1c9a | |||
|
|
4f4a2e7136 | ||
|
|
70fc1579e7 | ||
| 48f63ede25 | |||
| 8e8aa9cb41 | |||
|
|
6d56e5cdf0 | ||
|
|
4287f7a436 | ||
|
|
d08acc5645 | ||
| 18946128aa | |||
| ee067f8080 | |||
| ebcba27eee | |||
| 59efa4a140 | |||
|
|
514fa323be | ||
|
|
b144cbd1a9 | ||
|
|
517455fd34 | ||
|
|
dc4bc41864 | ||
|
|
7f904b2449 | ||
|
|
e3609a69b8 | ||
|
|
29180eee15 | ||
|
|
ee6a1afc4b | ||
|
|
9b643cd7dd | ||
| 3ef3132251 | |||
| f941903dcd | |||
| bb57d7f69a | |||
| 740eae1a58 | |||
| f67ab6897c | |||
| de62cfff31 | |||
| 97b1b841d3 | |||
| 4ceaf41a7d | |||
| 32a45814b8 | |||
| 0252664e63 | |||
|
|
493076a71b | ||
|
|
851cf7b435 | ||
|
|
0411f8c7e5 | ||
| 13d54063e4 | |||
| 150216fb87 | |||
| fd7b31dfac | |||
| e7163c5a13 | |||
|
|
18732053a1 | ||
|
|
5ae872a5be | ||
|
|
e18afa93bf | ||
| 18a1350787 | |||
| fdf87ef59a | |||
|
|
46f3dec3a6 | ||
|
|
b1185093f1 | ||
|
|
f0c996ee80 | ||
|
|
8ad9e870b9 | ||
|
|
20a10b4c23 | ||
|
|
721e318997 | ||
|
|
533f63c6e7 | ||
|
|
c3341eef8d | ||
|
|
3fcaa6a4be | ||
|
|
0ddf3ee1d8 | ||
|
|
cff897aee2 | ||
|
|
4ab48219ab | ||
|
|
605fc72e89 | ||
|
|
0690eae429 | ||
|
|
c886cfa801 | ||
| 8474c59834 | |||
| 03d94905fa | |||
| 8956d8c13f | |||
| 36ca4925d9 | |||
| 377a9002b4 | |||
| 58740ece16 | |||
| fce657412e | |||
| 1eb6eb9cf3 | |||
|
|
6f711b592e | ||
|
|
4b7337f7cb | ||
|
|
5e0d0cac1b | ||
|
|
6ce4282a3b | ||
|
|
490ec57b06 | ||
| 6fb7034e2e | |||
|
|
1a7515e478 | ||
| 8b797f7a29 | |||
| 36b16d71b0 | |||
|
|
a1c21e2abf | ||
| a8beac0f90 | |||
|
|
9c185908da | ||
| 53f0fd725b | |||
|
|
8f23ee34e3 | ||
| 3c5bdbdece | |||
| aa32540fd8 | |||
|
|
6c712d15d2 | ||
|
|
bec92fc641 | ||
|
|
151248d448 | ||
| 2645a7d785 | |||
| 5b9514fa77 | |||
| 59524159b6 | |||
|
|
fdfc8113f8 | ||
|
|
35c1a2be50 | ||
| 8af376cd37 | |||
|
|
8ae6e44680 | ||
|
|
ebd880d9c8 | ||
|
|
492c3a2b05 | ||
|
|
117b81f92f | ||
|
|
6fef852e2c | ||
|
|
81311928da | ||
|
|
f50a4f6409 | ||
|
|
0cd2cf71fc | ||
|
|
6c2a4dae1b | ||
|
|
ffb7e0bc08 | ||
|
|
15cc88403f | ||
| f83a7954aa | |||
| 664f015c94 | |||
| ba55866203 | |||
| 504f152876 | |||
| f838b37045 | |||
| 0ac3e4d451 | |||
|
|
fa160aa2de | ||
|
|
4cc3df9859 | ||
|
|
c4cf1bc64e | ||
| 8bcc3fe15d | |||
| 9d116e8765 | |||
| b8fdaf2ada | |||
| 86034f6e5e | |||
| 04fb81c1f2 | |||
|
|
3ede40b559 | ||
| db0850b835 | |||
| f4a6a65e83 | |||
| 4264eb71cb | |||
| 7fc28d775d | |||
| afdd92a0f2 | |||
| c07241397f | |||
| cd9fff3265 | |||
| e113802776 | |||
|
|
e67b48a8da | ||
| 618fd9bf91 | |||
| 2317d36779 | |||
| 7ee4aceaa6 | |||
| 092b8375d9 | |||
| 9d79118e47 | |||
| 5dd0f24af9 | |||
| daa7176ff5 | |||
| 15df89e703 | |||
| 7516e475d6 | |||
| 738bba88a5 | |||
| a7bce13ec3 | |||
| 8cb30ddedd | |||
| 9f55783508 | |||
| 3ed0242963 | |||
| 04b0b2943d | |||
| 9168af67b6 | |||
| f3064d306c | |||
| 8aa67c1864 | |||
|
|
2b9553d003 | ||
|
|
15295ea963 | ||
|
|
6a13d7aa1f | ||
| 2c4fe723dc | |||
| 60af8f21ce | |||
| 0b7a8191bf | |||
| 85544a7f0e | |||
|
|
1cb3b2d3f0 | ||
| 2cf00ac927 | |||
| a424721d89 | |||
|
|
5bc4158cfb | ||
|
|
fe486b1593 | ||
|
|
d242339635 | ||
|
|
b55fcaf235 | ||
| 3cfca98846 | |||
| 1f26289b7a | |||
|
|
9710ce9977 | ||
|
|
6c4317b800 | ||
|
|
de59a1e69e | ||
|
|
d5ccd04cdf | ||
|
|
e8dd5134c1 | ||
|
|
07ddcd91c2 | ||
|
|
df5fa2dc95 | ||
|
|
7be9d12504 | ||
|
|
4dc5fdbd2c | ||
|
|
f3e3d24153 | ||
| 666712f015 | |||
| a92f62c5a3 | |||
|
|
f1447d2783 | ||
|
|
f816ebd839 | ||
|
|
7cd38a637a | ||
|
|
6d5421e664 | ||
|
|
ace40b0baa | ||
|
|
fdac5feac4 | ||
|
|
4698acb7c9 | ||
|
|
c7aa8ad493 | ||
|
|
5f0c794ac6 | ||
|
|
72ca483f1c | ||
|
|
ae1269a9ab | ||
| e0f6ebef8f | |||
|
|
d31602fea1 | ||
| f19eb5743f | |||
| ace5035879 | |||
| 8ed2425a55 | |||
|
|
7baca28205 | ||
| 9f42583e9d | |||
| 58a1f4c95a | |||
| 8e947c3949 | |||
|
|
01166dfc4f | ||
| 9206189434 | |||
|
|
1245e44178 | ||
| 0c65434c29 | |||
| 8294542f98 | |||
| b09a225a58 | |||
|
|
aaeea495a5 | ||
|
|
802fb7d16a | ||
|
|
0a4e534ba2 | ||
| 150aba4b0f | |||
| 6369e07d95 | |||
| a964e243e6 | |||
| e1bab4dd8e | |||
|
|
44c8e3e5f3 | ||
| a056915ae1 | |||
| bc95fbd51c | |||
|
|
5bd2195081 | ||
|
|
59d9f22e67 | ||
| 39398d718b | |||
|
|
cc75e54028 | ||
|
|
ccbded5e4e | ||
|
|
3fbc4c2cd1 | ||
|
|
c1b1270972 | ||
| 339eec9727 | |||
| e358623716 | |||
|
|
e3f08a44f3 | ||
|
|
39ccf2a0b5 | ||
| 3bae411dc6 | |||
| ab65d53aca | |||
| 7ff889919d | |||
| e138e9553f | |||
| e74ab0cbd4 | |||
| 28e11ac0e7 | |||
|
|
874c510fc5 | ||
|
|
99e53fed81 | ||
| 0c9a0aebc6 | |||
| 1937a3e572 | |||
| 19bddcdd22 | |||
| 547ecc0271 | |||
| c57b4e63a9 | |||
| b8cdfc1d74 | |||
| c60d1bfe65 | |||
| 72a97957b5 | |||
| e7d0cf2400 | |||
| 41449fa6b1 | |||
|
|
a0aa57ebe4 | ||
|
|
e612309347 | ||
| 5c2eba0c19 | |||
| be122a1162 | |||
|
|
c82bd31d57 | ||
| 82a715d9f1 | |||
| 7c5fdaef78 | |||
| 26e3cd5ac9 | |||
| 5c4e1e6c96 | |||
| f043165b15 | |||
| 40fb595673 | |||
| 9de0edd4f1 | |||
| cdb7873986 | |||
|
|
3ba4889713 | ||
|
|
79a097c958 | ||
| 841a26e22d | |||
| 1af8e0d27d | |||
|
|
bca43e3030 | ||
| 4dfbb8f867 | |||
| ccf7bee67a | |||
|
|
09c976ce3b | ||
| a8dd5f866c | |||
| abc1c92c50 | |||
| 0e7d9467ce | |||
|
|
2c9977c860 | ||
|
|
f2365922fc | ||
|
|
1299a03cdc | ||
|
|
693c7db324 | ||
| dcf1eead2d | |||
| 1e49344207 | |||
| 9667961b8c | |||
| d7a78337fa | |||
|
|
2a0aadadb2 | ||
|
|
4eba294f5a | ||
|
|
5e87495439 | ||
|
|
d6197330d3 | ||
|
|
917822506f | ||
|
|
b493b8c0a6 | ||
|
|
8faab96fb1 | ||
|
|
16e6aa08dd | ||
| 2b38a904d0 | |||
| 806e6d2749 | |||
| 2c868c00ec | |||
| 8895311a8f | |||
|
|
be0544b31b | ||
| 9cfbfec8c0 | |||
| a79b7b53e3 | |||
| 1e7576a5ce | |||
|
|
35cffa9928 | ||
| 15a99b95b9 | |||
|
|
4781bb146e | ||
|
|
cf85af68fe | ||
|
|
785f20e235 | ||
| 8f904a8ce8 | |||
|
|
f8021fbd0b | ||
| 4b0b68b58d | |||
|
|
b8f6532cfb | ||
| 99bab5e75d | |||
| 688e5db39e | |||
|
|
40ad1ecc82 | ||
|
|
baa45b9ea7 | ||
| e64b243fd6 | |||
| b500c9244b | |||
|
|
dd72af8cc9 | ||
|
|
c1047ee8d1 | ||
|
|
47e3d248b7 | ||
| c90095d4ca | |||
| f37657b154 | |||
| 14949a47f9 | |||
| 814eb014f7 | |||
| ccb374da85 | |||
|
|
1d666e81ef | ||
| f1f4fed33c | |||
|
|
be99463417 | ||
| 7474d199e4 | |||
|
|
3d9fe45989 | ||
| ef1b3d1301 | |||
|
|
44cc8ccb74 | ||
| 98f5d04b4d | |||
|
|
4891162765 | ||
| aec0b75a5b | |||
|
|
1f7a945432 | ||
|
|
1e7468fc02 | ||
| 2dad400486 | |||
|
|
f8f9356d4d | ||
| 7809e8828f | |||
| 5d3a41c81b | |||
| 7b7b24c842 | |||
|
|
7effdd3429 | ||
| 81ad0f4dc6 | |||
| fd5ad65487 | |||
|
|
e2e0fc52fc | ||
|
|
90c7460c7b | ||
|
|
f7e45bd155 | ||
|
|
323e7fa2de | ||
|
|
6ed3e0c382 | ||
|
|
37e61e4ae0 | ||
|
|
cc44f1f84e | ||
|
|
984232a926 | ||
|
|
d7fe8a8d83 | ||
|
|
6ceceb65ce | ||
|
|
c3a39cedd0 | ||
|
|
0b4f5fd478 | ||
| 0c9f92a1fb | |||
|
|
1acd57bf66 | ||
| a8b712e3a1 | |||
|
|
c2e2e5d0df | ||
| a68e3d0cd4 | |||
| 16a93b23ee | |||
| f389ec2438 | |||
| 22d2410508 | |||
|
|
c4388bd473 | ||
|
|
dd81dbaa6f | ||
| 062d70d3c2 | |||
| af53a504da | |||
|
|
e6556e5a90 | ||
|
|
a0b0e47b4d | ||
|
|
02cecd1f41 | ||
|
|
1c52addf99 | ||
|
|
61138b823d | ||
|
|
9b96c38b6f | ||
|
|
664bbc2c5a | ||
|
|
dba3e9a542 | ||
|
|
6d51ac6417 | ||
|
|
975cd46f58 | ||
| 826d4eb2a3 | |||
| 3f151f7753 | |||
| b9a9b53918 | |||
|
|
7103d74314 | ||
|
|
a9c14088c6 | ||
|
|
3769c05ac2 | ||
| adf97d049a | |||
|
|
25a3ace8e2 | ||
| f83d07db84 | |||
|
|
6a57849705 | ||
| 73411013c6 | |||
| 8caed2469c | |||
|
|
806ce91998 | ||
|
|
74d5da95a4 | ||
|
|
951125b5b6 | ||
| 1dc7b99d42 | |||
|
|
92c6957be8 | ||
| 0657448ef8 | |||
| 177896a5aa | |||
|
|
78ec25e660 | ||
|
|
e3ea1a3854 | ||
|
|
2845588300 | ||
| 5e38fdf154 | |||
| 12fee09c65 | |||
|
|
525d7db795 | ||
| 8a7fac07ff | |||
|
|
0ed5ad7e48 | ||
| 254e9e0624 | |||
|
|
910622f5d6 | ||
|
|
85749e4743 | ||
| 30cb0d7eeb | |||
| 53763674fd | |||
| 135c0987ab | |||
|
|
64cca9bca0 | ||
|
|
7e56fb4b77 | ||
| 0e9694101f | |||
|
|
932b20eba6 | ||
|
|
10852a22e9 | ||
|
|
1d5b5ee19b | ||
| dd57cb45fb | |||
| f8e6ba0c51 | |||
| a544ed442f | |||
|
|
a7618b5bfe | ||
| 1721631ae6 | |||
|
|
e0aadace17 | ||
| 3ccb9c0a4c | |||
| 914e907e0c | |||
| 26519cb895 | |||
| a794379973 | |||
| aaac2f0a87 | |||
| f23d6ab476 | |||
| c734a8ce6c | |||
| 529cb5c483 | |||
| 1cd65a9077 | |||
| 88aa3459cb | |||
| db9f07932e | |||
| a80bbf4a43 | |||
| e83121bbb4 | |||
| d92e2aba2e | |||
|
|
217d793a7b | ||
|
|
f34498ced5 | ||
|
|
55ff788dd6 | ||
| c41181b93b | |||
| c9d0e85449 | |||
| 2ce4a1efd1 | |||
| 9b225289a6 | |||
| 74f87e150a | |||
|
|
ccbc515686 | ||
| 908a8aff0a | |||
| a6dd301fbb | |||
| f8be2ce0be | |||
|
|
aa1579707c | ||
|
|
82d41265fc | ||
|
|
4e24f104f8 | ||
|
|
453ff3ec90 | ||
|
|
d0b8c25b7d | ||
|
|
1c688806ff | ||
|
|
1d6c952487 | ||
| 3d4aa9ec8a | |||
| 423fe7b182 | |||
|
|
1878455d7d | ||
|
|
f3b69c4540 | ||
|
|
b7847bf7aa | ||
|
|
d76865f336 | ||
|
|
9a4fefc91a | ||
|
|
08bdea979b | ||
|
|
5934e95ae3 | ||
| 667c08dc0c | |||
| 9b74bbcb5c | |||
| e2e3cfd5ff | |||
| ffa3c21972 | |||
| bd3d817955 | |||
| 9274f86bb8 | |||
|
|
73ae4a99a0 | ||
|
|
b2a6cd873a | ||
|
|
53d9e6aaeb | ||
|
|
5c941f768e | ||
|
|
fb87a39ff2 | ||
|
|
f027970987 | ||
| e83bfedee1 | |||
| d8fed82bcf | |||
|
|
6bbb0e7ad8 | ||
|
|
60c6550565 | ||
| 12102f4757 | |||
| 741f44f2a4 | |||
| 612cb3c1cb | |||
| 46bb594080 | |||
| 38bc838083 | |||
| 286ccf64e3 | |||
|
|
08b5b6ea20 | ||
|
|
0d23184935 | ||
|
|
784d5808fb | ||
|
|
2a6440dd1a | ||
|
|
32638eef56 | ||
| 4e0e801e95 | |||
| 7b37a06e20 | |||
|
|
1d0f2fa0fd | ||
|
|
a0e560631a | ||
|
|
0fa6850852 | ||
|
|
ae83980255 | ||
|
|
d4c6bfcc09 | ||
|
|
9776cb3d45 | ||
|
|
a54d9107f8 | ||
|
|
a770136b10 | ||
|
|
31fb5694ac | ||
|
|
3f1c620742 | ||
|
|
b182272de3 | ||
|
|
a9296f5c01 | ||
|
|
1c8240b43e | ||
|
|
543a1cb715 | ||
|
|
efe0d86169 | ||
|
|
b74ef82239 | ||
|
|
fd1a8cffac | ||
|
|
1d1392c2d0 | ||
|
|
7695650739 | ||
|
|
2ded7b8b0a | ||
| abc6c33717 | |||
| ce3257e9cb | |||
| c82e3063c5 | |||
|
|
675e352869 | ||
| 430c1a5ad5 | |||
|
|
081eaf6356 | ||
| e331c692bb | |||
| 6d47a7723d | |||
| 8ac9bc78a7 | |||
|
|
4a61537f50 | ||
|
|
d6185c014d | ||
|
|
ba03ca350e | ||
|
|
b9f89ad36b | ||
|
|
6fcb1e71a7 | ||
| f170745521 | |||
| 04f63cc0ec | |||
| 7648a7b16e | |||
|
|
2b083c01bc | ||
|
|
13eb8df193 | ||
|
|
6b2455fc5b | ||
|
|
df24b4fd89 | ||
|
|
beaea79224 | ||
|
|
f413a2a3d1 | ||
|
|
7c51aba819 | ||
|
|
259096f90b | ||
|
|
ff7e87f770 | ||
|
|
94204781a7 | ||
|
|
8173ae03cc | ||
|
|
ddf3b0eeff | ||
|
|
8c8b7e71a7 | ||
|
|
1260c1240e | ||
|
|
e0709184b4 | ||
|
|
0bd28f19a5 | ||
|
|
3f6a41cbb1 | ||
|
|
9a7ffce2ee | ||
| d0277a9c4a | |||
| 0a85653a20 | |||
|
|
4ee29d78f8 | ||
|
|
5c514a0bbc | ||
|
|
d0a85abd1b | ||
|
|
a3285aed02 | ||
| 1d791a2643 | |||
| df0ebe5c82 | |||
|
|
98ae27a306 | ||
|
|
fc7d2fe809 | ||
|
|
9a721de5ab | ||
| c140a3bbe2 | |||
| 06f4f97e33 | |||
|
|
4298c2b869 | ||
| dc1eb8769b | |||
| 45d3641539 | |||
| 844a098226 | |||
|
|
4977ef8666 | ||
|
|
6718f6ea83 | ||
|
|
000da0acf4 | ||
| 51960c62c9 | |||
| 3e383dffcf | |||
|
|
01da7593c3 | ||
| 726058067e | |||
|
|
e62f5f14d6 | ||
|
|
26ca75bf79 | ||
| 4ec126de89 | |||
|
|
96381e4a82 | ||
| 12ef4c167f | |||
| 9169c06897 | |||
|
|
bbe055bd8d | ||
|
|
d90abffedf | ||
| d88dce5b9e | |||
| 9c3e44f625 | |||
| cb6a98607a | |||
| 439daf4e2e | |||
| c4d2a32cf8 | |||
|
|
a3927d3770 |
15
.gitignore
vendored
15
.gitignore
vendored
@@ -15,3 +15,18 @@ yarn-error.log
|
||||
|
||||
/public/dashboard
|
||||
/public/dashboard-staging
|
||||
/public/dashboard-copy
|
||||
/public/dashboard-copy2
|
||||
|
||||
/public/client-portal
|
||||
/public/client-portal-staging
|
||||
|
||||
/public/hospital-portal
|
||||
/public/hospital-portal-staging
|
||||
|
||||
/public/files
|
||||
|
||||
/Modules/Internal/vendor
|
||||
composer.lock
|
||||
/frontend/dashboard/.env.*
|
||||
/frontend/hospital-portal/.env.*
|
||||
182
AGENTS.md
Normal file
182
AGENTS.md
Normal file
@@ -0,0 +1,182 @@
|
||||
# AGENTS.md
|
||||
|
||||
File ini berisi instruksi untuk AI coding agent yang bekerja di repository ini.
|
||||
|
||||
## Project Overview
|
||||
|
||||
Project name: ASO (Laravel + Modules)
|
||||
Purpose: Platform operasional health insurance/managed care untuk pengelolaan member, corporate policy, claim, monitoring, livechat, dan pelaporan.
|
||||
Main users: Tim internal operasional, portal client corporate, portal hospital.
|
||||
Business domain: Healthtech / asuransi kesehatan / manajemen klaim dan layanan kesehatan.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
Backend: PHP 8+, Laravel 9, `nwidart/laravel-modules`.
|
||||
Frontend: React + TypeScript + Vite (utama di `frontend/dashboard` dan `frontend/client-portal`), plus aset root Laravel (`resources/`, Vite/Mix).
|
||||
Database: MySQL/MariaDB (via Eloquent ORM + Laravel migrations).
|
||||
Queue/background jobs: Laravel Queue (`jobs` table tersedia; default testing `sync`).
|
||||
Cache: Laravel cache (driver mengikuti `.env`, testing pakai `array`).
|
||||
Auth: Laravel Sanctum, Spatie Permission (`role`/`permission` middleware), sebagian flow JWT untuk integrasi tertentu.
|
||||
Deployment: Build frontend ke `public/dashboard` dan `public/client-portal`; backend Laravel standar.
|
||||
Package manager: Composer (PHP), npm/yarn/pnpm (frontend, mixed antar subproject).
|
||||
|
||||
## Local Setup
|
||||
|
||||
Install dependencies:
|
||||
|
||||
```bash
|
||||
composer install
|
||||
npm install
|
||||
cd frontend/dashboard && yarn install
|
||||
cd ../client-portal && yarn install
|
||||
```
|
||||
|
||||
Run app:
|
||||
|
||||
```bash
|
||||
php artisan serve
|
||||
npm run dev
|
||||
cd frontend/dashboard && yarn start
|
||||
cd ../client-portal && yarn start
|
||||
```
|
||||
|
||||
Run tests:
|
||||
|
||||
```bash
|
||||
php artisan test
|
||||
```
|
||||
|
||||
Run lint:
|
||||
|
||||
```bash
|
||||
cd frontend/dashboard && yarn lint
|
||||
cd ../client-portal && yarn lint
|
||||
```
|
||||
|
||||
Run typecheck:
|
||||
|
||||
```bash
|
||||
# Belum ada script typecheck standar di root/subproject.
|
||||
# Jika diperlukan, gunakan tsc manual per frontend setelah konfirmasi tim.
|
||||
```
|
||||
|
||||
Run build:
|
||||
|
||||
```bash
|
||||
npm run production
|
||||
cd frontend/dashboard && yarn build
|
||||
cd ../client-portal && yarn build
|
||||
```
|
||||
|
||||
Run migrations:
|
||||
|
||||
```bash
|
||||
php artisan migrate
|
||||
```
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```text
|
||||
app/ # Core Laravel app (models, services, middleware, controllers)
|
||||
routes/ # Root web/api routes
|
||||
Modules/ # Domain/module-based backend (Client, Internal, Linksehat, Primaya, HospitalPortal)
|
||||
Modules/*/Routes/ # Route entry point tiap module
|
||||
Modules/*/Http/Controllers/Api/
|
||||
database/migrations/ # Root migrations
|
||||
frontend/dashboard/ # React TS admin/internal dashboard
|
||||
frontend/client-portal/ # React TS client portal
|
||||
resources/ # Blade/views/assets untuk app Laravel utama
|
||||
public/ # Public assets + output build frontend
|
||||
tests/ # PHPUnit tests (Feature/Unit)
|
||||
```
|
||||
|
||||
## Architecture Rules
|
||||
|
||||
- Tempatkan business logic di layer service/domain yang sudah ada (`app/Services`, `Modules/*/Services`) dan jaga controller tetap tipis.
|
||||
- API layer mengikuti pemisahan module: endpoint module didefinisikan di `Modules/<ModuleName>/Routes/api.php` dengan controller module terkait.
|
||||
- Untuk perubahan schema, gunakan migration baru; jangan ubah migration lama kecuali ada instruksi eksplisit.
|
||||
- Untuk frontend, ikuti pattern existing per app (`src/pages`, `src/components`, `src/hooks`, `src/sections`) dan hindari cross-import antar app dashboard/client-portal.
|
||||
- Testing backend utama menggunakan PHPUnit (`tests/Feature`, `tests/Unit`); tambah regression test untuk perubahan behavior penting.
|
||||
|
||||
## Coding Standards
|
||||
|
||||
- Ikuti pattern existing project sebelum membuat pattern baru.
|
||||
- Buat perubahan kecil dan fokus.
|
||||
- Jangan lakukan refactor yang tidak berhubungan.
|
||||
- Jangan hardcode secrets.
|
||||
- Jangan bypass validation.
|
||||
- Jangan bypass auth/permission checks.
|
||||
- Pilih code yang eksplisit dan mudah dibaca dibanding code yang terlalu clever.
|
||||
- Tambahkan atau update test jika behavior berubah.
|
||||
|
||||
## Git Rules
|
||||
|
||||
- Jangan commit kecuali user secara eksplisit meminta.
|
||||
- Jangan push kecuali user secara eksplisit meminta.
|
||||
- Jangan rewrite git history kecuali user secara eksplisit meminta.
|
||||
- Tampilkan file yang berubah di final response.
|
||||
|
||||
## Security Rules
|
||||
|
||||
- Jangan pernah print secrets.
|
||||
- Jangan ubah nilai `.env` asli kecuali diminta secara eksplisit.
|
||||
- Gunakan `.env-example`/`.env.example` untuk dokumentasi environment variables.
|
||||
- Validasi auth, permissions, dan scoping corporate/member untuk protected data.
|
||||
- Untuk endpoint API, pertahankan middleware auth yang ada (`auth:sanctum`, role/permission, middleware khusus module).
|
||||
- Minta konfirmasi sebelum destructive data changes.
|
||||
|
||||
## Database Rules
|
||||
|
||||
- Gunakan migration system project ini.
|
||||
- Jangan edit historical migrations kecuali project ini memang mengizinkan.
|
||||
- Sertakan rollback/safety notes untuk schema changes.
|
||||
- Pertimbangkan existing production data.
|
||||
- Perhatikan migrasi dapat berasal dari root `database/migrations` dan modul tertentu.
|
||||
|
||||
## Testing Rules
|
||||
|
||||
Sebelum selesai, jalankan command yang relevan:
|
||||
|
||||
```bash
|
||||
php artisan test
|
||||
cd frontend/dashboard && yarn lint
|
||||
cd frontend/client-portal && yarn lint
|
||||
```
|
||||
|
||||
Jika command tidak bisa dijalankan, jelaskan alasannya dan command apa yang harus dijalankan manual.
|
||||
|
||||
## AI Agent Workflow
|
||||
|
||||
Untuk feature work:
|
||||
|
||||
1. Baca file ini.
|
||||
2. Inspect pattern yang sudah ada.
|
||||
3. Tulis plan singkat untuk pekerjaan non-trivial.
|
||||
4. Tanya klarifikasi jika requirement kurang jelas.
|
||||
5. Implement perubahan kecil dan fokus.
|
||||
6. Jalankan test/lint/typecheck/build yang relevan.
|
||||
7. Rangkum file yang berubah, command yang dijalankan, dan risiko.
|
||||
|
||||
Untuk debugging:
|
||||
|
||||
1. Reproduce atau inspect issue.
|
||||
2. Identifikasi root cause sebelum mengubah code.
|
||||
3. Buat fix minimal yang aman.
|
||||
4. Tambahkan regression test jika memungkinkan.
|
||||
5. Jalankan verification.
|
||||
|
||||
## Final Response Format
|
||||
|
||||
```text
|
||||
Summary:
|
||||
- ...
|
||||
|
||||
Files changed:
|
||||
- ...
|
||||
|
||||
Commands run:
|
||||
- ...
|
||||
|
||||
Risks / notes:
|
||||
- ...
|
||||
```
|
||||
0
Modules/Client/Config/.gitkeep
Normal file → Executable file
0
Modules/Client/Config/.gitkeep
Normal file → Executable file
0
Modules/Client/Config/config.php
Normal file → Executable file
0
Modules/Client/Config/config.php
Normal file → Executable file
0
Modules/Client/Console/.gitkeep
Normal file → Executable file
0
Modules/Client/Console/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/Migrations/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/Migrations/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/Seeders/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/Seeders/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/Seeders/ClientDatabaseSeeder.php
Normal file → Executable file
0
Modules/Client/Database/Seeders/ClientDatabaseSeeder.php
Normal file → Executable file
0
Modules/Client/Database/factories/.gitkeep
Normal file → Executable file
0
Modules/Client/Database/factories/.gitkeep
Normal file → Executable file
0
Modules/Client/Entities/.gitkeep
Normal file → Executable file
0
Modules/Client/Entities/.gitkeep
Normal file → Executable file
0
Modules/Client/Http/Controllers/.gitkeep
Normal file → Executable file
0
Modules/Client/Http/Controllers/.gitkeep
Normal file → Executable file
75
Modules/Client/Http/Controllers/Api/AuthController.php
Normal file → Executable file
75
Modules/Client/Http/Controllers/Api/AuthController.php
Normal file → Executable file
@@ -8,14 +8,17 @@ use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'phoneOrEmail' => 'required'
|
||||
'phoneOrEmail' => 'required',
|
||||
'password' => 'required'
|
||||
]);
|
||||
|
||||
$user = User::query()
|
||||
@@ -32,28 +35,60 @@ class AuthController extends Controller
|
||||
return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message);
|
||||
}
|
||||
|
||||
if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
|
||||
User::query()->find($user->id)->update([
|
||||
'email' => $request->phoneOrEmail,
|
||||
'otp' => 4444, //rand(1000, 9999),
|
||||
'otp_created_at' => now()
|
||||
]);
|
||||
} else {
|
||||
User::query()->find($user->id)->update([
|
||||
'phone' => $request->phoneOrEmail,
|
||||
'otp' => 4444,//rand(1000, 9999),
|
||||
'otp_created_at' => now()
|
||||
]);
|
||||
|
||||
// $token = rand(1000, 9999); // Menghasilkan angka acak antara 100000 dan 999999
|
||||
// if($request->phoneOrEmail == 'manager+one@gmail.com' || $request->phoneOrEmail == 'manager+two@gmail.com')
|
||||
// {
|
||||
// $token = 4444;
|
||||
// }
|
||||
// if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
|
||||
// User::query()->find($user->id)->update([
|
||||
// 'email' => $request->phoneOrEmail,
|
||||
// 'otp' => $token,
|
||||
// 'otp_created_at' => now()
|
||||
// ]);
|
||||
// } else {
|
||||
// User::query()->find($user->id)->update([
|
||||
// 'phone' => $request->phoneOrEmail,
|
||||
// 'otp' => $token,
|
||||
// 'otp_created_at' => now()
|
||||
// ]);
|
||||
// }
|
||||
|
||||
// // TODO Send the OTP
|
||||
// if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
|
||||
// // Send Email
|
||||
// //send to alarm
|
||||
// if($request->phoneOrEmail != 'manager+one@gmail.com' && $request->phoneOrEmail != 'manager+two@gmail.com')
|
||||
// {
|
||||
// $nameTo = 'User';
|
||||
// $dataEmail = [
|
||||
// 'email' => $request->phoneOrEmail,
|
||||
// 'name' => $nameTo,
|
||||
// 'subject' => 'OTP Login Client Portal Tanggal '. date('Y-m-d H:i:s'),
|
||||
// 'body' => View::make('email/forgot_password', ['token' => $token])->render(),
|
||||
// ];
|
||||
// Helper::sendEmail($dataEmail);
|
||||
// }
|
||||
// } else {
|
||||
// // Send Whatsapp
|
||||
// }
|
||||
|
||||
// return Helper::responseJson(message: 'OTP Terkirim');
|
||||
|
||||
|
||||
if (!Hash::check($request->password, $user->password)) {
|
||||
return response(['message' => 'Password Salah'], 403);
|
||||
}
|
||||
|
||||
// TODO Send the OTP
|
||||
if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
|
||||
// Send Email
|
||||
} else {
|
||||
// Send Whatsapp
|
||||
}
|
||||
return Helper::responseJson(
|
||||
data: [
|
||||
'token' => $user->createToken('app')->plainTextToken,
|
||||
'user' => $user,
|
||||
],
|
||||
message: 'Selamat Datang'
|
||||
);
|
||||
|
||||
return Helper::responseJson(message: 'OTP Terkirim');
|
||||
}
|
||||
|
||||
public function validateOtp(Request $request)
|
||||
|
||||
286
Modules/Client/Http/Controllers/Api/BillingSummaryController.php
Normal file
286
Modules/Client/Http/Controllers/Api/BillingSummaryController.php
Normal file
@@ -0,0 +1,286 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Client\Http\Controllers\Api;
|
||||
|
||||
use Illuminate\Contracts\Support\Renderable;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class BillingSummaryController extends Controller
|
||||
{
|
||||
public function index(Request $request, $corporate_id)
|
||||
{
|
||||
$year = $request->year ?? now()->year;
|
||||
$status = $request->status;
|
||||
$bn = $request->bn;
|
||||
$payorId = $request->payorId;
|
||||
$service = $request->service;
|
||||
$billing = $request->billing;
|
||||
$search = $request->search;
|
||||
|
||||
$rows = DB::table('invoice_payments')
|
||||
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
|
||||
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
|
||||
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
|
||||
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
|
||||
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
|
||||
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
|
||||
->whereYear('invoice_payments.created_at', $year)
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
// FILTERS
|
||||
->when($status, fn ($q) =>
|
||||
$q->where('invoice_payments.status', $status)
|
||||
)
|
||||
->when($bn, fn ($q) =>
|
||||
$q->where('members.member_id', $bn)
|
||||
)
|
||||
->when($payorId, fn ($q) =>
|
||||
$q->where('members.payor_id', $payorId)
|
||||
)
|
||||
->when($service, fn ($q) =>
|
||||
$q->where('claim_requests.service_code', $service)
|
||||
)
|
||||
->when($billing, fn ($q) =>
|
||||
$q->where('invoice_payments.invoice_number', $billing)
|
||||
)
|
||||
|
||||
// 🔍 SEARCH PROVIDER (LIKE)
|
||||
->when($search, fn ($q) =>
|
||||
$q->where('organizations.name', 'like', '%' . $search . '%')
|
||||
)
|
||||
|
||||
->selectRaw("
|
||||
MONTH(invoice_payments.created_at) as month_number,
|
||||
organizations.name as provider,
|
||||
SUM(request_logs.nominal) as total
|
||||
")
|
||||
->groupBy('month_number', 'organizations.name')
|
||||
->orderBy('month_number')
|
||||
->get();
|
||||
|
||||
return response()->json(
|
||||
$this->formatMonthly($rows)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
protected function formatMonthly($rows): array
|
||||
{
|
||||
$months = [
|
||||
1 => 'Januari', 2 => 'Februari', 3 => 'Maret',
|
||||
4 => 'April', 5 => 'Mei', 6 => 'Juni',
|
||||
7 => 'Juli', 8 => 'Agustus', 9 => 'September',
|
||||
10 => 'Oktober', 11 => 'November', 12 => 'Desember',
|
||||
];
|
||||
|
||||
return collect($rows)
|
||||
->groupBy('month_number')
|
||||
->map(function ($items, $monthNumber) use ($months) {
|
||||
return [
|
||||
'month' => $months[$monthNumber],
|
||||
'total' => $items->sum('total'),
|
||||
'items' => $items->map(fn ($item) => [
|
||||
'provider' => $item->provider,
|
||||
'total' => (float) $item->total,
|
||||
])->values(),
|
||||
];
|
||||
})
|
||||
->values()
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public function providerSummary(Request $request, $corporate_id)
|
||||
{
|
||||
$year = $request->year ?? now()->year;
|
||||
$status = $request->status;
|
||||
$bn = $request->bn;
|
||||
$payorId = $request->payorId;
|
||||
$service = $request->service;
|
||||
$billing = $request->billing;
|
||||
$search = $request->search;
|
||||
|
||||
$query = DB::table('invoice_payments')
|
||||
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
|
||||
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
|
||||
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
|
||||
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
|
||||
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
|
||||
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
|
||||
->whereYear('invoice_payments.created_at', $year)
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
// FILTER
|
||||
->when($status, fn ($q) =>
|
||||
$q->where('invoice_payments.status', $status)
|
||||
)
|
||||
->when($bn, fn ($q) =>
|
||||
$q->where('members.member_id', $bn)
|
||||
)
|
||||
->when($payorId, fn ($q) =>
|
||||
$q->where('members.payor_id', $payorId)
|
||||
)
|
||||
->when($service, fn ($q) =>
|
||||
$q->where('claim_requests.service_code', $service)
|
||||
)
|
||||
->when($billing, fn ($q) =>
|
||||
$q->where('invoice_payments.invoice_number', $billing)
|
||||
)
|
||||
->when($search, fn ($q) =>
|
||||
$q->where('organizations.name', 'like', '%' . $search . '%')
|
||||
);
|
||||
|
||||
$items = $query
|
||||
->selectRaw("
|
||||
organizations.name as provider,
|
||||
SUM(request_logs.nominal) as total
|
||||
")
|
||||
->groupBy('organizations.name')
|
||||
->orderByDesc('total')
|
||||
->get()
|
||||
->map(fn ($row) => [
|
||||
'provider' => $row->provider,
|
||||
'total' => (float) $row->total,
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'total' => $items->sum('total'),
|
||||
'items' => $items,
|
||||
]);
|
||||
}
|
||||
|
||||
public function topDiagnosis(Request $request, $corporate_id)
|
||||
{
|
||||
$year = $request->year ?? now()->year;
|
||||
$status = $request->status;
|
||||
$bn = $request->bn;
|
||||
$payorId = $request->payorId;
|
||||
$service = $request->service;
|
||||
$billing = $request->billing;
|
||||
$search = $request->search;
|
||||
|
||||
$rows = DB::table('invoice_payments')
|
||||
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
|
||||
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
|
||||
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
|
||||
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
|
||||
// 🔥 ICD JOIN
|
||||
->leftJoin(
|
||||
'icd',
|
||||
DB::raw("icd.code"),
|
||||
'=',
|
||||
DB::raw("SUBSTRING_INDEX(request_logs.diagnosis, ',', 1)")
|
||||
)
|
||||
|
||||
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
->whereYear('invoice_payments.created_at', $year)
|
||||
|
||||
// FILTER
|
||||
->when($status, fn ($q) =>
|
||||
$q->where('invoice_payments.status', $status)
|
||||
)
|
||||
->when($bn, fn ($q) =>
|
||||
$q->where('members.member_id', $bn)
|
||||
)
|
||||
->when($payorId, fn ($q) =>
|
||||
$q->where('members.payor_id', $payorId)
|
||||
)
|
||||
->when($service, fn ($q) =>
|
||||
$q->where('claim_requests.service_code', $service)
|
||||
)
|
||||
->when($billing, fn ($q) =>
|
||||
$q->where('invoice_payments.invoice_number', $billing)
|
||||
)
|
||||
|
||||
->selectRaw("
|
||||
SUBSTRING_INDEX(request_logs.diagnosis, ',', 1) as code_diagnosis,
|
||||
icd.name as diagnosis,
|
||||
COUNT(request_logs.id) as total_case,
|
||||
SUM(request_logs.nominal) as total_billing
|
||||
")
|
||||
->groupBy('code_diagnosis', 'icd.name')
|
||||
->orderByDesc('total_case')
|
||||
->limit(10)
|
||||
->get();
|
||||
|
||||
return response()->json(
|
||||
$rows->map(fn ($row) => [
|
||||
'code' => $row->code_diagnosis,
|
||||
'diagnosis' => $row->diagnosis ?? '-',
|
||||
'total_case' => (int) $row->total_case,
|
||||
'total_billing' => (float) $row->total_billing,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
// public function index()
|
||||
// {
|
||||
// return view('client::index');
|
||||
// }
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('client::create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* @param Request $request
|
||||
* @return Renderable
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
return view('client::show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
return view('client::edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
394
Modules/Client/Http/Controllers/Api/ClaimController.php
Normal file → Executable file
394
Modules/Client/Http/Controllers/Api/ClaimController.php
Normal file → Executable file
@@ -17,6 +17,11 @@ use Modules\Client\Transformers\ClaimShowResource;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||||
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
|
||||
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
|
||||
use Box\Spout\Common\Entity\Style\CellAlignment;
|
||||
use Box\Spout\Common\Entity\Style\Color;
|
||||
use Carbon\Carbon;
|
||||
|
||||
class ClaimController extends Controller
|
||||
{
|
||||
@@ -194,19 +199,19 @@ class ClaimController extends Controller
|
||||
['value' => 'Amt Not Approved', 'cell' => 'J1', 'mergeCell' => false, 'mergeToCell' => ''],
|
||||
['value' => 'Excess Paid', 'cell' => 'K1', 'mergeCell' => false, 'mergeToCell' => ''],
|
||||
['value' => 'Diagnosis', 'cell' => 'L1', 'mergeCell' => false, 'mergeToCell' => 'J2'],
|
||||
|
||||
|
||||
];
|
||||
|
||||
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$sheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
foreach ($headers as $header) {
|
||||
$sheet->setCellValue($header['cell'], $header['value']);
|
||||
|
||||
|
||||
if ($header['mergeCell'] === true) {
|
||||
$sheet->mergeCells($header['cell'] . ':' . $header['mergeToCell']);
|
||||
}
|
||||
|
||||
|
||||
$sheet->getStyle($header['cell'])->getFont()->setBold(true);
|
||||
$sheet->getStyle($header['cell'])->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
|
||||
}
|
||||
@@ -226,7 +231,7 @@ class ClaimController extends Controller
|
||||
$sheet->setCellValue('J' . $startFrom, $d['amount_not_approved'] ?? '-');
|
||||
$sheet->setCellValue('K' . $startFrom, $d['excess_paid'] ?? '-');
|
||||
$sheet->setCellValue('L' . $startFrom, $d['diganosis'] ?? '-');
|
||||
|
||||
|
||||
$startFrom++;
|
||||
}
|
||||
|
||||
@@ -244,21 +249,392 @@ class ClaimController extends Controller
|
||||
|
||||
$sheet->getDefaultRowDimension()->setRowHeight(-1);
|
||||
$sheet->setTitle('Alarm Center Report');
|
||||
|
||||
|
||||
$writer = new Xlsx($spreadsheet);
|
||||
ob_start();
|
||||
$writer->save('php://output');
|
||||
$content = ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
|
||||
$fileName = 'result-' . now()->getPreciseTimestamp(3) . '-alarm-center-report.xlsx';
|
||||
Storage::disk('public')->put('temp/' . $fileName, $content);
|
||||
|
||||
|
||||
$fileUrl = url('storage/temp/' . $fileName);
|
||||
|
||||
|
||||
return Helper::responseJson([
|
||||
"file_url" => $fileUrl
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
public function exportAlrmCenter($corporate_id, $start, $end)
|
||||
{
|
||||
$writer = WriterEntityFactory::createXLSXWriter();
|
||||
$writer->openToFile(public_path('files/Report-Data-Alarm-Center-'.$start.'-'.$end.'.xlsx'));
|
||||
$header = [
|
||||
'No',
|
||||
'Code',
|
||||
'Date Submission',
|
||||
'Date Admission',
|
||||
'Date Discharge',
|
||||
'Provider',
|
||||
'Member ID (BN)',
|
||||
'Member Name',
|
||||
'Member Name Principal',
|
||||
'Plan Code',
|
||||
'Service',
|
||||
'Payor ID',
|
||||
'Corporate name',
|
||||
'Policy Number',
|
||||
'Total Billing',
|
||||
'Benefit Code',
|
||||
'Benefit Desc',
|
||||
'Amt Incurred',
|
||||
'Amt Approved',
|
||||
'Amt Not Approved',
|
||||
'Excess Paid',
|
||||
'Diagnosis',
|
||||
'Keterangan',
|
||||
'Catatan',
|
||||
'Invoice No',
|
||||
'Billing No',
|
||||
'Type Of Member',
|
||||
'Deskripsi Diagnosis'
|
||||
];
|
||||
$style = (new StyleBuilder())
|
||||
->setFontBold()
|
||||
// ->setFontSize(15)
|
||||
// ->setFontColor(Color::BLUE)
|
||||
// ->setShouldWrapText()
|
||||
->setCellAlignment(CellAlignment::LEFT)
|
||||
// ->setBackgroundColor(Color::YELLOW)
|
||||
->build();
|
||||
|
||||
$headerRow = WriterEntityFactory::createRowFromArray($header, $style);
|
||||
$writer->addRow($headerRow);
|
||||
|
||||
$data = DB::table('request_logs')
|
||||
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
|
||||
->leftJoin('corporate_employees','corporate_employees.member_id','=','members.id')
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
// ->where('request_logs.status_final_log', '=', 'approved')
|
||||
->where('request_logs.deleted_at', '=', null)
|
||||
->when($start != 'all' && $end != 'all', function ($query) use ($start, $end) {
|
||||
$query->where('request_logs.submission_date', '>=',$start. ' 00:00:00')
|
||||
->where('request_logs.submission_date', '<=',$end. ' 23:59:59');
|
||||
})
|
||||
->select(
|
||||
DB::raw('1 AS no'),
|
||||
'request_logs.submission_date',
|
||||
'request_logs.created_at',
|
||||
'request_logs.discharge_date',
|
||||
'request_logs.organization_id',
|
||||
'request_logs.id',
|
||||
'request_logs.member_id',
|
||||
'request_logs.service_code',
|
||||
'request_logs.code',
|
||||
'request_logs.diagnosis',
|
||||
'request_logs.keterangan',
|
||||
'request_logs.catatan',
|
||||
DB::raw('
|
||||
(Select SUM(request_log_benefits.amount_approved) as tot_bill FROM request_log_benefits
|
||||
WHERE request_log_benefits.request_log_id = request_logs.id AND request_log_benefits.deleted_at IS NULL LIMIT 1) AS tot_bill
|
||||
'),
|
||||
'request_logs.invoice_no',
|
||||
'request_logs.billing_no',
|
||||
'request_logs.type_of_member',
|
||||
)
|
||||
->groupBy(
|
||||
'request_logs.submission_date',
|
||||
'request_logs.created_at',
|
||||
'request_logs.discharge_date',
|
||||
'request_logs.organization_id',
|
||||
'request_logs.id',
|
||||
'request_logs.member_id',
|
||||
'request_logs.service_code',
|
||||
'request_logs.code',
|
||||
'request_logs.diagnosis',
|
||||
'request_logs.keterangan',
|
||||
'request_logs.catatan',
|
||||
'tot_bill'
|
||||
)
|
||||
->orderBy('request_logs.submission_date', 'desc')
|
||||
->get();
|
||||
|
||||
if (isset($data) && count($data) > 0)
|
||||
{
|
||||
$dataRow = array();
|
||||
$no = 0;
|
||||
foreach ($data as $item)
|
||||
{
|
||||
//Provider
|
||||
$dataRumahSakit = DB::table('organizations')
|
||||
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
|
||||
->where('organizations.id', '=', $item->organization_id)
|
||||
->where('addresses.addressable_type', '=', 'App\Models\Organization')
|
||||
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit', 'organizations.corporate_id_partner')
|
||||
->first();
|
||||
//Data Member
|
||||
$dataMember = DB::table('members')
|
||||
->where('members.id', '=', $item->member_id)
|
||||
->select(
|
||||
'members.nric',
|
||||
'members.id',
|
||||
'members.principal_id',
|
||||
'members.name',
|
||||
'members.birth_date',
|
||||
'members.member_id',
|
||||
'members.gender',
|
||||
DB::raw('
|
||||
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
|
||||
'),
|
||||
// DB::raw('
|
||||
// "LinkSehat" AS penjamin
|
||||
// '),
|
||||
DB::raw('
|
||||
(Select corporates.name FROM corporates
|
||||
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||
WHERE corporate_employees.member_id = members.id LIMIT 1) AS nama_perusahaan
|
||||
'),
|
||||
DB::raw('
|
||||
(Select corporates.id FROM corporates
|
||||
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||
WHERE corporate_employees.member_id = members.id LIMIT 1) AS id_perusahaan
|
||||
'),
|
||||
DB::raw('
|
||||
(Select corporates.code FROM corporates
|
||||
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||
WHERE corporate_employees.member_id = members.id LIMIT 1) AS code_perusahaan
|
||||
'),
|
||||
DB::raw('
|
||||
(Select services.name FROM services
|
||||
WHERE services.code = "'.$item->service_code.'" LIMIT 1) AS jenis_perawatan
|
||||
'),
|
||||
DB::raw('
|
||||
(Select member_policies.policy_id FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS no_polis
|
||||
'),
|
||||
DB::raw('
|
||||
(Select member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_polis
|
||||
'),
|
||||
DB::raw('
|
||||
(Select plans.code FROM member_plans
|
||||
LEFT JOIN plans ON plans.id = member_plans.plan_id
|
||||
WHERE member_plans.member_id = members.id AND plans.service_code = "'.$item->service_code.'" LIMIT 1) AS code_plan
|
||||
'),
|
||||
DB::raw('
|
||||
(Select plans.limit_rules FROM member_plans
|
||||
LEFT JOIN plans ON plans.id = member_plans.plan_id
|
||||
WHERE member_plans.member_id = members.id LIMIT 1) AS limit_rules
|
||||
'),
|
||||
DB::raw('
|
||||
"IDR" AS mata_uang
|
||||
'),
|
||||
'members.members_effective_date AS mulai',
|
||||
'members.members_expire_date AS akhir'
|
||||
)
|
||||
->first();
|
||||
|
||||
//get penjamin
|
||||
$penjamin = 'LinkSehat';
|
||||
if(!empty($dataRumahSakit->corporate_id_partner))
|
||||
{
|
||||
$corporate_id_partners = explode(',', $dataRumahSakit->corporate_id_partner);
|
||||
$valueToCheck = $dataMember->id_perusahaan;
|
||||
|
||||
if (in_array($valueToCheck, $corporate_id_partners)) {
|
||||
$penjamin = $dataMember->nama_perusahaan;
|
||||
}
|
||||
}
|
||||
|
||||
//Nama Karyawan
|
||||
$data['namaKaryawan'] = '';
|
||||
if($dataMember->principal_id)
|
||||
{
|
||||
$dataNamaKaryawan = DB::table('members')
|
||||
->where('members.principal_id', '=', $dataMember->principal_id)
|
||||
->select('members.name')
|
||||
->first();
|
||||
$data['namaKaryawan'] = $dataNamaKaryawan->name;
|
||||
}
|
||||
else{
|
||||
$data['namaKaryawan'] = $dataMember->name;
|
||||
}
|
||||
|
||||
//Data Benefit
|
||||
$dataClaimLog = DB::table('request_log_benefits')
|
||||
->where('request_log_benefits.request_log_id', '=', $item->id)
|
||||
->where('request_log_benefits.deleted_at', null)
|
||||
->select(
|
||||
'*',
|
||||
DB::raw('
|
||||
(Select benefits.description FROM benefits
|
||||
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS benfit
|
||||
'),
|
||||
DB::raw('
|
||||
(Select benefits.code FROM benefits
|
||||
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS code
|
||||
')
|
||||
)
|
||||
->get();
|
||||
|
||||
// Description Diagnosi
|
||||
$diagnosis = explode(",", $item->diagnosis);
|
||||
$descriptionDiagnosis = '-';
|
||||
if ($diagnosis){
|
||||
$dataDiagnosises = DB::table('icd')->whereIn('code',$diagnosis)->get();
|
||||
$descriptionDiagnosis = "";
|
||||
foreach($dataDiagnosises as $dataDiagnosis){
|
||||
$descriptionDiagnosis .= $dataDiagnosis->name ." ";
|
||||
}
|
||||
}
|
||||
$check_first_id = 0;
|
||||
if($check_first_id != $item->id)
|
||||
{
|
||||
$no += $item->no;
|
||||
}
|
||||
|
||||
$total_billing = 0;
|
||||
$lastIndex = count($dataClaimLog) - 1;
|
||||
$firtIndex = 0;
|
||||
if (isset($dataClaimLog) && count($dataClaimLog) > 0)
|
||||
{
|
||||
foreach ($dataClaimLog as $index => $item_benefit)
|
||||
{
|
||||
$total_billing += !empty($item_benefit->amount_approved) ? $item_benefit->amount_approved : 0;
|
||||
$rowData = [
|
||||
$check_first_id != $item->id ? $no : $no,
|
||||
!empty($item->code) ? $item->code : '',
|
||||
!empty($item->created_at) ? $item->created_at : '',
|
||||
!empty($item->submission_date) ? $item->submission_date : '',
|
||||
!empty($item->discharge_date) ? $item->discharge_date : '',
|
||||
!empty($dataRumahSakit->nama_rumahsakit) ? $dataRumahSakit->nama_rumahsakit : '',
|
||||
!empty($dataMember->member_id) ? $dataMember->member_id : '',
|
||||
!empty($dataMember->name) ? $dataMember->name : '',
|
||||
$data['namaKaryawan'],
|
||||
($firtIndex == $index ? (!empty($dataMember->code_plan) ? $dataMember->code_plan : '') : ''),
|
||||
!empty($dataMember->jenis_perawatan) ? $dataMember->jenis_perawatan : '',
|
||||
$penjamin,
|
||||
!empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '',
|
||||
!empty($dataMember->no_polis) ? $dataMember->no_polis : '',
|
||||
($firtIndex == $index ? $item->tot_bill : ''),
|
||||
!empty($item_benefit->code) ? $item_benefit->code : '',
|
||||
!empty($item_benefit->benfit) ? $item_benefit->benfit : '',
|
||||
!empty($item_benefit->amount_incurred) ? $item_benefit->amount_incurred : '',
|
||||
!empty($item_benefit->amount_approved) ? $item_benefit->amount_approved : '',
|
||||
!empty($item_benefit->amount_not_approved) ? $item_benefit->amount_not_approved : '',
|
||||
!empty($item_benefit->excess_paid) ? $item_benefit->excess_paid : '',
|
||||
!empty($item->diagnosis) ? $item->diagnosis : '',
|
||||
!empty($item->keterangan) ? $item->keterangan : '',
|
||||
!empty($item->catatan) ? $item->catatan : '',
|
||||
!empty($item->invoice_no) ? $item->invoice_no : '',
|
||||
!empty($item->billing_no) ? $item->billing_no : '',
|
||||
!empty($item->type_of_member) ? $item->type_of_member : '',
|
||||
$descriptionDiagnosis,
|
||||
|
||||
];
|
||||
array_push($dataRow,$rowData);
|
||||
|
||||
$check_first_id = $item->id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$rowData = [
|
||||
$check_first_id != $item->id ? $no : '',
|
||||
!empty($item->code) ? $item->code : '',
|
||||
!empty($item->created_at) ? $item->created_at : '',
|
||||
!empty($item->submission_date) ? $item->submission_date : '',
|
||||
!empty($item->discharge_date) ? $item->discharge_date : '',
|
||||
!empty($dataRumahSakit->nama_rumahsakit) ? $dataRumahSakit->nama_rumahsakit : '',
|
||||
!empty($dataMember->member_id) ? $dataMember->member_id : '',
|
||||
!empty($dataMember->name) ? $dataMember->name : '',
|
||||
$data['namaKaryawan'],
|
||||
!empty($dataMember->code_plan) ? $dataMember->code_plan : '',
|
||||
!empty($dataMember->jenis_perawatan) ? $dataMember->jenis_perawatan : '',
|
||||
$penjamin,
|
||||
!empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '',
|
||||
!empty($dataMember->no_polis) ? $dataMember->no_polis : '',
|
||||
'0',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
!empty($item->invoice_no) ? $item->invoice_no : '',
|
||||
!empty($item->billing_no) ? $item->billing_no : '',
|
||||
!empty($item->type_of_member) ? $item->type_of_member : '',
|
||||
$descriptionDiagnosis,
|
||||
|
||||
];
|
||||
array_push($dataRow,$rowData);
|
||||
|
||||
}
|
||||
}
|
||||
$style = (new StyleBuilder())
|
||||
//->setFontBold()
|
||||
// ->setFontSize(15)
|
||||
// ->setFontColor(Color::BLUE)
|
||||
// ->setShouldWrapText()
|
||||
->setCellAlignment(CellAlignment::LEFT)
|
||||
// ->setBackgroundColor(Color::YELLOW)
|
||||
->build();
|
||||
$grand_total_billing = 0;
|
||||
foreach ($dataRow as $rowData) {
|
||||
if (is_numeric($rowData[14])) {
|
||||
// Jumlahkan nilai angka ke total
|
||||
$grand_total_billing += $rowData[14];
|
||||
}
|
||||
$row = WriterEntityFactory::createRowFromArray($rowData, $style);
|
||||
$writer->addRow($row);
|
||||
}
|
||||
//Footer
|
||||
$footer = [
|
||||
'Total',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
$grand_total_billing,
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
''
|
||||
];
|
||||
$style = (new StyleBuilder())
|
||||
->setFontBold()
|
||||
// ->setFontSize(15)
|
||||
// ->setFontColor(Color::BLUE)
|
||||
// ->setShouldWrapText()
|
||||
->setCellAlignment(CellAlignment::LEFT)
|
||||
// ->setBackgroundColor(Color::YELLOW)
|
||||
->build();
|
||||
|
||||
$footerRow = WriterEntityFactory::createRowFromArray($footer, $style);
|
||||
$writer->addRow($footerRow);
|
||||
}
|
||||
$writer->close();
|
||||
|
||||
return Helper::responseJson([
|
||||
'file_name' => 'Report-Data-Alarm-Center-'. $start.'-'.$end,
|
||||
"file_url" => url('files/Report-Data-Alarm-Center-'. $start.'-'.$end.'.xlsx')
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
63
Modules/Client/Http/Controllers/Api/ClaimReportController.php
Normal file → Executable file
63
Modules/Client/Http/Controllers/Api/ClaimReportController.php
Normal file → Executable file
@@ -133,12 +133,46 @@ class ClaimReportController extends Controller
|
||||
)
|
||||
->get();
|
||||
$results['request_files'] = $request_files;
|
||||
|
||||
// Jika path kosong, kembalikan null
|
||||
if (!$row->path) {
|
||||
return null;
|
||||
}
|
||||
// $documents = DB::table('files')
|
||||
// ->where('fileable_type', 'App\Models\ClaimRequest')
|
||||
// ->where('fileable_id', $claimRequestId)
|
||||
// ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type')
|
||||
// ->orderBy('id', 'desc')
|
||||
// ->get();
|
||||
|
||||
$documents = DB::table('files')
|
||||
->where('fileable_type', 'App\Models\ClaimRequest')
|
||||
->where('fileable_id', $claimRequestId)
|
||||
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type')
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
->where('fileable_type', 'App\Models\ClaimRequest')
|
||||
->where('fileable_id', $claimRequestId)
|
||||
->select('id', 'original_name', 'path', 'source', 'type')
|
||||
->orderBy('id', 'desc')
|
||||
->get()
|
||||
->map(function ($row) {
|
||||
// default null kalau tidak ada path
|
||||
if (!$row->path) {
|
||||
$row->path = null; // atau bisa $row->url = null
|
||||
return $row;
|
||||
}
|
||||
|
||||
if ($row->source === 's3') {
|
||||
try {
|
||||
$row->path = Storage::disk('s3')->temporaryUrl(
|
||||
$row->path,
|
||||
now()->addMinutes(60)
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$row->path = Storage::disk('s3')->url($row->path);
|
||||
}
|
||||
} else {
|
||||
$row->path = Storage::disk('public')->url($row->path);
|
||||
}
|
||||
|
||||
return $row;
|
||||
});
|
||||
$results['documents'] = $documents;
|
||||
|
||||
return Helper::responseJson($results);
|
||||
@@ -149,15 +183,16 @@ class ClaimReportController extends Controller
|
||||
$claim_id = Crypt::decrypt($claim_id);
|
||||
if ($request->hasFile('fileDiagnosis')) {
|
||||
foreach ($request->fileDiagnosis as $file) {
|
||||
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
|
||||
$fileData = File::storeFile('claim-diagnosis', $claim_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-diagnosis',
|
||||
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -166,15 +201,16 @@ class ClaimReportController extends Controller
|
||||
|
||||
if ($request->hasFile('fileKondisis')) {
|
||||
foreach ($request->fileKondisis as $file) {
|
||||
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
|
||||
$fileData = File::storeFile('claim-kondisi', $claim_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-kondisi',
|
||||
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -188,10 +224,11 @@ class ClaimReportController extends Controller
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-result',
|
||||
'name' => File::getFileName('claim-result', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
19
Modules/Client/Http/Controllers/Api/ClaimRequestController.php
Normal file → Executable file
19
Modules/Client/Http/Controllers/Api/ClaimRequestController.php
Normal file → Executable file
@@ -19,7 +19,7 @@ class ClaimRequestController extends Controller
|
||||
* Display a listing of the resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
private static $code_prefix = 'CP';
|
||||
private static $code_prefix = 'CLAIM';
|
||||
public function index()
|
||||
{
|
||||
return view('client::index');
|
||||
@@ -109,6 +109,7 @@ class ClaimRequestController extends Controller
|
||||
'name' => $new_file_name,
|
||||
'original_name' => $full_path,
|
||||
'extension' => $ekstension,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $pathFile,
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
@@ -134,6 +135,7 @@ class ClaimRequestController extends Controller
|
||||
'name' => $new_file_name,
|
||||
'original_name' => $full_path,
|
||||
'extension' => $ekstension,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $pathFile,
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
@@ -159,6 +161,7 @@ class ClaimRequestController extends Controller
|
||||
'name' => $new_file_name,
|
||||
'original_name' => $full_path,
|
||||
'extension' => $ekstension,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $pathFile,
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
@@ -224,10 +227,6 @@ class ClaimRequestController extends Controller
|
||||
|
||||
public static function getNextCode()
|
||||
{
|
||||
// $last_number = ClaimRequest::max('code');
|
||||
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1);
|
||||
// return self::makeCode($next_number);
|
||||
|
||||
$last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, "-", -1) AS SIGNED)) as max_numeric_code'))
|
||||
->whereRaw('SUBSTRING_INDEX(code, "-", -1) REGEXP "^[0-9]+$"')
|
||||
->value('max_numeric_code');
|
||||
@@ -247,8 +246,14 @@ class ClaimRequestController extends Controller
|
||||
{
|
||||
// Pastikan $next_number adalah integer positif
|
||||
$next_number = max(1, (int) $next_number);
|
||||
|
||||
$requestLogData = RequestLog::where('id', $request_log_id)->first();
|
||||
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
|
||||
$provideCode = $organization ? $organization->code : '';
|
||||
$member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first();
|
||||
$sparator = '.';
|
||||
$date = date('ymd');
|
||||
// Menghasilkan kode dengan format yang diinginkan
|
||||
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
|
||||
return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 6, '0', STR_PAD_LEFT);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
1
Modules/Client/Http/Controllers/Api/CorporateCurrentController.php
Normal file → Executable file
1
Modules/Client/Http/Controllers/Api/CorporateCurrentController.php
Normal file → Executable file
@@ -70,6 +70,7 @@ class CorporateCurrentController extends Controller
|
||||
'type' => 'avatar',
|
||||
'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')),
|
||||
'extension' => $request->file('logo')->getClientOriginalExtension(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $pathFileAvatar,
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
|
||||
0
Modules/Client/Http/Controllers/Api/CorporateDivisionController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/CorporateDivisionController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/CorporateManageController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/CorporateManageController.php
Normal file → Executable file
220
Modules/Client/Http/Controllers/Api/CorporateMemberController.php
Normal file → Executable file
220
Modules/Client/Http/Controllers/Api/CorporateMemberController.php
Normal file → Executable file
@@ -21,6 +21,10 @@ use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as Dashboa
|
||||
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
|
||||
use Modules\Client\Transformers\EmployeeData\UserProfile\DataMemberResource as EmployeeDataProfileMemberResource;
|
||||
use Modules\Internal\Services\MemberEnrollmentService;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Dompdf\Dompdf;
|
||||
use Dompdf\Options;
|
||||
use PDF;
|
||||
|
||||
class CorporateMemberController extends Controller
|
||||
{
|
||||
@@ -188,15 +192,50 @@ class CorporateMemberController extends Controller
|
||||
public function showPerMember(Request $request, $corporate_id, $member_id)
|
||||
{
|
||||
$per_page = $request->has('per_page') ? $request->input('per_page') : 10;
|
||||
|
||||
$data = Member::query()
|
||||
->with(['requestLogs'])
|
||||
$member = Member::query()
|
||||
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
|
||||
$query->where('corporate_id', $corporate_id);
|
||||
})
|
||||
->find($member_id);
|
||||
|
||||
return response()->json(['full_name' => $data->full_name ?? null, 'paginations' => Helper::paginateResources(DataListClaimMemberResource::collection($data->requestLogs()->paginate($per_page)))]);
|
||||
$data = RequestLog::where([
|
||||
'member_id' => $member->id,
|
||||
'deleted_at' => null
|
||||
])
|
||||
->when($request->has('orderBy'), function ($query) use ($request) {
|
||||
$orderBy = match ($request->input('orderBy')) {
|
||||
'admission_date' => 'request_logs.submission_date',
|
||||
'discharge_date' => 'request_logs.discharge_date',
|
||||
'code' => 'request_logs.code',
|
||||
default => ''
|
||||
};
|
||||
$query->getQuery()->orderBy($orderBy, $request->order);
|
||||
})
|
||||
->when($request->search, function ($q, $search) {
|
||||
$q->where('code', 'LIKE', "%".$search."%");
|
||||
$q->orWhereHas('member', function ($subQuery) use ($search) {
|
||||
$subQuery->where('name', 'LIKE', "%".$search."%");
|
||||
});
|
||||
})
|
||||
->when($request->status, function ($q, $search) {
|
||||
if ($search == 'kondisi') {
|
||||
$q->whereHas('files', function ($subQuery) {
|
||||
$subQuery->where('type', 'final-log-kondisi');
|
||||
});
|
||||
} elseif ($search == 'diagnosa') {
|
||||
$q->whereHas('files', function ($subQuery) {
|
||||
$subQuery->where('type', 'final-log-diagnosis');
|
||||
});
|
||||
} elseif ($search == 'result') {
|
||||
$q->whereHas('files', function ($subQuery) {
|
||||
$subQuery->where('type', 'final-log-result');
|
||||
});
|
||||
} elseif ($search == 'none') {
|
||||
$q->doesntHave('files');
|
||||
}
|
||||
})
|
||||
->with(['member','files'])
|
||||
->paginate($per_page);
|
||||
return response()->json(['full_name' => $member->full_name?? null, 'paginations' => Helper::paginateResources(DataListClaimMemberResource::collection($data))]);
|
||||
}
|
||||
|
||||
public function serviceMonitoring(int $corporate_id, int $request_log_id)
|
||||
@@ -211,12 +250,14 @@ class CorporateMemberController extends Controller
|
||||
'requestLogBenefits:id,request_log_id,benefit_id,amount_incurred,amount_approved,amount_not_approved,excess_paid,keterangan' => [
|
||||
'benefit'
|
||||
],
|
||||
'requestLogDailyMonitorings:id,request_log_id,created_at,subject,body_temperature,sistole,diastole,respiration_rate,analysis,lab_date,provider,examination' => [
|
||||
'requestLogMedicalPlans:request_log_daily_monitoring_id,plan,type'
|
||||
'requestLogDailyMonitorings:id,request_log_id,submission_date,subject,object,body_temperature,sistole,diastole,respiration_rate,analysis,lab_date,provider,examination' => [
|
||||
'requestLogMedicalPlans:request_log_daily_monitoring_id,plan,type',
|
||||
// 'document'
|
||||
],
|
||||
'service:code,name',
|
||||
'files',
|
||||
])
|
||||
->find($request_log_id, ['id', 'submission_date', 'discharge_date', 'member_id', 'service_code', 'organization_id']);
|
||||
->find($request_log_id, ['id', 'submission_date', 'discharge_date', 'member_id', 'service_code', 'organization_id', 'diagnosis', 'keterangan', 'catatan']);
|
||||
|
||||
$dataBenefit = [];
|
||||
if (count($data->requestLogBenefits) > 0) {
|
||||
@@ -242,4 +283,167 @@ class CorporateMemberController extends Controller
|
||||
|
||||
return Helper::responseJson(DataServiceMonitoring::make($data));
|
||||
}
|
||||
|
||||
public function getDeposit($corporate_id)
|
||||
{
|
||||
$deposit = DB::table('corporate_policies')
|
||||
->select('total_premi',
|
||||
'minimal_deposit_percentage',
|
||||
'minimal_deposit_net',
|
||||
'minimal_alert_percentage',
|
||||
'minimal_alert_net',
|
||||
'minimal_stop_service_net',
|
||||
'minimal_stop_service_percentage')
|
||||
->where('corporate_id','=', $corporate_id)
|
||||
->first();
|
||||
$usage = DB::table('corporate_employees')
|
||||
->join('request_logs', 'request_logs.member_id', '=', 'corporate_employees.member_id')
|
||||
->join('request_log_benefits', 'request_log_benefits.request_log_id', '=', 'request_logs.id')
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
->whereNull('request_log_benefits.deleted_at')
|
||||
->sum('request_log_benefits.amount_approved');
|
||||
// Ganti dengan logika Anda untuk mendapatkan data deposit
|
||||
$deposit = [
|
||||
'deposit' => $deposit->total_premi,
|
||||
'limit' => $deposit->total_premi - $usage,
|
||||
'usage' => $usage,
|
||||
'minimal_deposit_percentage' => $deposit->minimal_deposit_percentage,
|
||||
'minimal_deposit_net' => $deposit->minimal_deposit_net,
|
||||
'minimal_alert_percentage' => $deposit->minimal_alert_percentage,
|
||||
'minimal_alert_net' => $deposit->minimal_alert_net,
|
||||
'minimal_stop_service_net' => $deposit->minimal_stop_service_net,
|
||||
'minimal_stop_service_percentage' => $deposit->minimal_stop_service_percentage
|
||||
];
|
||||
|
||||
return response()->json($deposit);
|
||||
}
|
||||
|
||||
public function getLimits($corporate_id, $member_id)
|
||||
{
|
||||
$deposit = DB::table('corporate_policies')
|
||||
->select('total_premi')
|
||||
->where('corporate_id','=', $corporate_id)
|
||||
->first();
|
||||
$usage = DB::table('corporate_employees')
|
||||
->join('request_logs', 'request_logs.member_id', '=', 'corporate_employees.member_id')
|
||||
->join('request_log_benefits', 'request_log_benefits.request_log_id', '=', 'request_logs.id')
|
||||
->where('corporate_employees.corporate_id', '=', $corporate_id)
|
||||
->where('request_logs.member_id', '=', $member_id)
|
||||
->whereNull('request_logs.deleted_at')
|
||||
->whereNull('request_log_benefits.deleted_at')
|
||||
->sum('request_log_benefits.amount_approved');
|
||||
|
||||
$services = DB::table('member_plans')
|
||||
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
|
||||
->leftJoin('services', 'services.code', '=', 'plans.service_code')
|
||||
->where('member_plans.member_id', '=', $member_id)
|
||||
->whereNull('member_plans.deleted_at')
|
||||
->select(
|
||||
'plans.service_code',
|
||||
'services.name as title',
|
||||
'plans.limit_rules as total',
|
||||
DB::raw("
|
||||
(
|
||||
IFNULL(
|
||||
(
|
||||
SELECT SUM(request_log_benefits.amount_approved)
|
||||
FROM request_logs
|
||||
INNER JOIN request_log_benefits
|
||||
ON request_log_benefits.request_log_id = request_logs.id
|
||||
WHERE request_logs.member_id = $member_id
|
||||
AND request_logs.service_code = plans.service_code
|
||||
AND request_log_benefits.deleted_at IS NULL
|
||||
), 0
|
||||
)
|
||||
) as current
|
||||
")
|
||||
|
||||
)
|
||||
->get();
|
||||
$total_premi = 0;
|
||||
foreach ($services as $value)
|
||||
{
|
||||
if($value->total > 0 && $value->total != 999999999)
|
||||
{
|
||||
$total_premi += $value->total;
|
||||
}
|
||||
else if($value->total == 999999999)
|
||||
{
|
||||
$total_premi = 999999999;
|
||||
}
|
||||
|
||||
}
|
||||
// Ganti dengan logika Anda untuk mendapatkan data deposit
|
||||
$deposit = [
|
||||
'deposit' => $total_premi,
|
||||
'usage' => $usage,
|
||||
'services' => $services
|
||||
];
|
||||
|
||||
return response()->json($deposit);
|
||||
}
|
||||
|
||||
public function downloadEcard($corporate_id, $member_id)
|
||||
{
|
||||
$member = Member::with([
|
||||
'currentPlan',
|
||||
'currentPolicy',
|
||||
'currentCorporate',
|
||||
'currentCorporate.files',
|
||||
// 'currentPlan.corporateBenefits.benefit'
|
||||
])->find($member_id);
|
||||
$dataMember['member'] = $member;
|
||||
|
||||
$pdf = new Dompdf();
|
||||
|
||||
$options = new Options();
|
||||
$options->set('isHtml5ParserEnabled', true);
|
||||
$options->set('isPhpEnabled', true);
|
||||
$options->set(['isRemoteEnabled' => true]);
|
||||
$pdf->setOptions($options);
|
||||
|
||||
$pdf->setPaper('A5', 'portrait');
|
||||
|
||||
if ($member->currentCorporate->id == 5){ // Vale
|
||||
$html1 = view('pdf.ecard', $dataMember);
|
||||
} else {
|
||||
$html1 = view('pdf.ecard-lms', $dataMember);
|
||||
}
|
||||
|
||||
// Halaman 2
|
||||
// $html2 = view('pdf.req_log_page_2', $data);
|
||||
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
// $htmlCombined = $html1 . $html2;
|
||||
$htmlCombined = $html1;
|
||||
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
}
|
||||
|
||||
public function viewECard($corporate_id, $member_id){
|
||||
$member = Member::with([
|
||||
'currentPlan',
|
||||
'currentPolicy',
|
||||
'currentCorporate',
|
||||
'currentCorporate.files',
|
||||
// 'currentPlan.corporateBenefits.benefit'
|
||||
])->find($member_id);
|
||||
|
||||
if ($member->currentCorporate->id == 5){ // Vale
|
||||
$pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
|
||||
} else {
|
||||
$pdf = PDF::loadView('pdf.ecard-lms', compact('member'))->setPaper('A5', 'portrait');
|
||||
}
|
||||
return $pdf->download('Ecard - '.$member->full_name.'.pdf');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
0
Modules/Client/Http/Controllers/Api/CorporatePolicyController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/CorporatePolicyController.php
Normal file → Executable file
905
Modules/Client/Http/Controllers/Api/DailyMonitoringController.php
Executable file
905
Modules/Client/Http/Controllers/Api/DailyMonitoringController.php
Executable file
@@ -0,0 +1,905 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Client\Http\Controllers\Api;
|
||||
use App\Helpers\Helper;
|
||||
use App\Models\DailyMonitoring;
|
||||
use App\Models\RequestDailyMonitoring;
|
||||
use App\Models\MedicalPlan;
|
||||
use App\Models\File;
|
||||
use DB;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\File as Files;
|
||||
use Modules\Internal\Transformers\DailyMonitoringResource;
|
||||
use Carbon\Carbon;
|
||||
|
||||
|
||||
/**
|
||||
* Bagaskoro BSD 27-10-2023
|
||||
*
|
||||
* Controller untuk daily monitoring
|
||||
*/
|
||||
class DailyMonitoringController extends Controller
|
||||
{
|
||||
protected $path_for_store = 'public/lab_result';
|
||||
protected function messages()
|
||||
{
|
||||
return [
|
||||
'required' => ':attribute harus diisi',
|
||||
'integer' => ':attribute harus angka',
|
||||
'unique' => ':attribute (:input) sudah ada',
|
||||
'max' => ':attribute maximal :max karakter',
|
||||
'exists' => ':attribute (:input) tidak ditemukan',
|
||||
'numeric' => ':attribute harus angka',
|
||||
'digits_between'=> ':attribute maximal :max digit minimal :min digit'
|
||||
];
|
||||
}
|
||||
|
||||
public function GetMemberList(Request $request)
|
||||
{
|
||||
$startDate = $request->start_date ? Carbon::parse($request->start_date) : Carbon::today();
|
||||
$endDate = $request->end_date ? Carbon::parse($request->end_date)->addDay() : Carbon::today()->addDay();
|
||||
|
||||
$memberList = DB::table('request_log_daily_monitorings')
|
||||
->leftJoin('request_logs', 'request_log_daily_monitorings.request_log_id', '=', 'request_logs.id')
|
||||
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
|
||||
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
|
||||
->select(
|
||||
'members.member_id',
|
||||
'members.name',
|
||||
'members.birth_date',
|
||||
'request_logs.type_of_member as member_type',
|
||||
'members.members_effective_date AS startdate',
|
||||
'members.members_expire_date AS enddate',
|
||||
'request_logs.submission_date as addmision_date',
|
||||
'organizations.name as provider',
|
||||
'request_logs.organization_id',
|
||||
'request_logs.code',
|
||||
// Using a subquery to fetch medical_plan
|
||||
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 1 LIMIT 1) as medical_plan'),
|
||||
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 2 LIMIT 1) as non_medical_plan'),
|
||||
'request_log_daily_monitorings.*'
|
||||
)
|
||||
->whereNull('request_logs.deleted_at') // Use whereNull() for checking NULL
|
||||
->when($request->search, function ($q, $search) {
|
||||
$q->where(function ($subQ) use ($search) {
|
||||
$subQ->where('members.member_id', 'LIKE', "%{$search}%");
|
||||
$subQ->orWhere('members.name', 'LIKE', "%{$search}%");
|
||||
});
|
||||
})
|
||||
->when($startDate, function ($q) use ($startDate) {
|
||||
$q->where('request_log_daily_monitorings.submission_date', '>=', $startDate);
|
||||
})
|
||||
->when($endDate, function ($q) use ($endDate) {
|
||||
$q->where('request_log_daily_monitorings.submission_date', '<=', Carbon::parse($endDate)->addDay());
|
||||
})
|
||||
->orderBy('request_logs.created_at', 'desc')
|
||||
->paginate();
|
||||
|
||||
return Helper::paginateResources(DailyMonitoringResource::collection($memberList));
|
||||
}
|
||||
|
||||
/**
|
||||
* Claim List - by member id
|
||||
*/
|
||||
public function GetClaimList(Request $request, $member_id)
|
||||
{
|
||||
$memberDetail = DB::table('members')
|
||||
->select('id','member_id','name')
|
||||
->where('member_id', $member_id)
|
||||
->first();
|
||||
|
||||
$claimList = DB::table('request_logs')
|
||||
->leftJoin('services', 'services.code', '=', 'request_logs.service_code')
|
||||
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
|
||||
->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name', 'members.member_id')
|
||||
->where('request_logs.service_code', 'IP')
|
||||
->where('request_logs.deleted_at', null)
|
||||
// ->where('request_logs.status_final_log', 'approved')
|
||||
->where("request_logs.member_id", "=", $memberDetail->id)
|
||||
->where("request_logs.organization_id", "=", $request->organization_id)
|
||||
->when($request->search, function ($q, $search) {
|
||||
$q->where('request_logs.code', 'LIKE', "%".$search."%");
|
||||
})
|
||||
->orderBy("request_logs.created_at", "desc")
|
||||
// ->get()
|
||||
->paginate();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => [
|
||||
'member_detail'=> $memberDetail,
|
||||
'claim_list' => $claimList,
|
||||
]
|
||||
],200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Detail Monitoring List - by claim_code
|
||||
*/
|
||||
public function GetDetailMonitoringList(Request $request, $request_code)
|
||||
{
|
||||
// get id request log
|
||||
$request_logs = DB::table('request_logs')
|
||||
->select('id','organization_id')
|
||||
->where('code', $request_code)
|
||||
->first();
|
||||
|
||||
$detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '')
|
||||
->orderBy("submission_date", "desc")
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => [
|
||||
'detail_list'=> $detail_list,
|
||||
'organization_id' => $request_logs ? $request_logs->organization_id : 0
|
||||
]
|
||||
],200);
|
||||
}
|
||||
|
||||
public function GetDetailMonitoringListbyID(Request $request, $id)
|
||||
{
|
||||
|
||||
$detail = RequestDailyMonitoring::where('id', $id)
|
||||
->orderBy("created_at", "desc")
|
||||
->first();
|
||||
|
||||
if ($detail) {
|
||||
// Ubah menjadi array agar bisa dimodifikasi
|
||||
$detailArray = $detail->toArray();
|
||||
|
||||
// Ubah nama key dari request_log_id menjadi log_id
|
||||
$detailArray['log_code'] = $detailArray['request_log_id'];
|
||||
unset($detailArray['request_log_id']);
|
||||
} else {
|
||||
$detailArray = null;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => $detailArray,
|
||||
], 200);
|
||||
|
||||
}
|
||||
|
||||
public function UpdateDetailMonitoringbyID(Request $request)
|
||||
{
|
||||
// validation rule
|
||||
$validator = Validator::make($request->all(),[
|
||||
'log_code' => 'required',
|
||||
'reason' => 'required',
|
||||
],$this->messages());
|
||||
|
||||
// validation error
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $validator->getMessageBag()
|
||||
],400);
|
||||
}
|
||||
try {
|
||||
// insert claim daily monitoring
|
||||
$db_response = RequestDailyMonitoring::where('id', $request->id)
|
||||
->update([
|
||||
'request_log_id' => $request->log_code,
|
||||
'submission_date' => $request->submission_date,
|
||||
'subject' => $request->subject,
|
||||
'object' => $request->objective,
|
||||
'sistole' => $request->sistole,
|
||||
'diastole' => $request->diastole,
|
||||
'body_temperature' => $request->body_temperature,
|
||||
'respiration_rate' => $request->respiration_rate,
|
||||
'analysis' => $request->analysis,
|
||||
'lab_date' => $request->lab_date,
|
||||
'provider' => $request->provider,
|
||||
'examination' => $request->examination,
|
||||
'doctor_1' => $request->doctor_1,
|
||||
'doctor_2' => $request->doctor_2,
|
||||
'temp_diagnosis' => $request->temp_diagnosis,
|
||||
'final_diagnosis' => $request->final_diagnosis,
|
||||
'approval_pendamping' => $request->approval_pendamping,
|
||||
'description' => $request->keterangan,
|
||||
'note' => $request->catatan,
|
||||
'reason' => $request->reason,
|
||||
'created_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
// cek medical plan
|
||||
$num_medical_plan = 0;
|
||||
foreach ($request->medical_plan as $row) {
|
||||
if ($row['medical_plan_str']) {
|
||||
$num_medical_plan++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($num_medical_plan == 0) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => [
|
||||
'medical_plan' => ['medical plan harus diisi']
|
||||
],
|
||||
'data' => []
|
||||
],400);
|
||||
}
|
||||
if ($request->medical_plan){
|
||||
// delete medical plan
|
||||
DB::table('request_log_medical_plan')
|
||||
->where([
|
||||
'request_log_daily_monitoring_id' => $request->id,
|
||||
'type' => 1
|
||||
])
|
||||
->delete();
|
||||
// insert medical plan
|
||||
foreach ($request->medical_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $request->id,
|
||||
'plan' => $row['medical_plan_str'],
|
||||
'type' => 1,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($request->non_medikamentosa_plan){
|
||||
// delete medical plan
|
||||
DB::table('request_log_medical_plan')
|
||||
->where([
|
||||
'request_log_daily_monitoring_id' => $request->id,
|
||||
'type' => 2
|
||||
])
|
||||
->delete();
|
||||
// insert non medical plan
|
||||
foreach ($request->non_medikamentosa_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $request->id,
|
||||
'plan' => $row['non_medikamentosa_plan_str'],
|
||||
'type' => 2,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// insert file result
|
||||
if ($request->confirmation_medical_leter){
|
||||
// $fileCurrents = File::where([
|
||||
// 'fileable_id' => $request->id,
|
||||
// 'type' => 'confirmation-medical-letter',
|
||||
// ])->get();
|
||||
// if ($fileCurrents){
|
||||
// foreach($fileCurrents as $fileCurrent){
|
||||
// if (Files::exists($fileCurrent->path)) {
|
||||
// Files::delete();
|
||||
// }
|
||||
// File::find($fileCurrent->id)->delete();
|
||||
// }
|
||||
// }
|
||||
foreach ($request->confirmation_medical_leter as $file) {
|
||||
$fileData = File::storeFile('confirmation-medical-letter', $request->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $request->id,
|
||||
'type' => 'confirmation-medical-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
if ($request->medical_action_letter){
|
||||
// $fileCurrents = File::where([
|
||||
// 'fileable_id' => $request->id,
|
||||
// 'type' => 'medical-action-letter',
|
||||
// ])->get();
|
||||
// if ($fileCurrents){
|
||||
// foreach($fileCurrents as $fileCurrent){
|
||||
// if (Files::exists($fileCurrent->path)) {
|
||||
// Files::delete();
|
||||
// }
|
||||
// File::find($fileCurrent->id)->delete();
|
||||
// }
|
||||
// }
|
||||
foreach ($request->medical_action_letter as $file) {
|
||||
$fileData = File::storeFile('medical-action-letter', $request->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $request->id,
|
||||
'type' => 'medical-action-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
if ($request->result){
|
||||
// $fileCurrents = File::where([
|
||||
// 'fileable_id' => $request->id,
|
||||
// 'type' => 'laboratorium-result',
|
||||
// ])->get();
|
||||
// if ($fileCurrents){
|
||||
// foreach($fileCurrents as $fileCurrent){
|
||||
// if (Files::exists($fileCurrent->path)) {
|
||||
// Files::delete();
|
||||
// }
|
||||
// File::find($fileCurrent->id)->delete();
|
||||
// }
|
||||
// }
|
||||
foreach ($request->result as $file) {
|
||||
$fileData = File::storeFile('laboratorium-result', $request->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $request->id,
|
||||
'type' => 'laboratorium-result',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
DB::commit();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => []
|
||||
],200);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => []
|
||||
],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Detail Monitoring List
|
||||
*/
|
||||
public function AddDetailMonitoringList(Request $request, $claim_code)
|
||||
{
|
||||
$request->merge(['claim_code' => $claim_code]);
|
||||
|
||||
// validation rule
|
||||
$validator = Validator::make($request->all(),[
|
||||
'claim_code' => 'required|exists:claim_requests,code',
|
||||
'subject' => 'required',
|
||||
'sistole' => 'required|numeric',
|
||||
'diastole' => 'required|numeric',
|
||||
'body_temperature' => 'required|numeric',
|
||||
'respiration_rate' => 'required|numeric',
|
||||
'analysis' => 'required',
|
||||
'complaints' => 'required',
|
||||
'medical_plan' => 'required',
|
||||
],$this->messages());
|
||||
|
||||
// validation error
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $validator->getMessageBag()
|
||||
],400);
|
||||
}
|
||||
|
||||
// get claim request
|
||||
$claim_request = DB::table('claim_requests')
|
||||
->select('id')
|
||||
->where('code', $claim_code)
|
||||
->first();
|
||||
|
||||
// get claim
|
||||
$claim = DB::table('claims')
|
||||
->select('id')
|
||||
->where('claim_request_id', $claim_request->id)
|
||||
->first();
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// insert claim daily monitoring
|
||||
$db_response = DailyMonitoring::create([
|
||||
'claim_id' => $claim->id,
|
||||
'subject' => $request->subject,
|
||||
'objective' => $request->objective,
|
||||
'sistole' => $request->sistole,
|
||||
'diastole' => $request->diastole,
|
||||
'body_temperature' => $request->body_temperature,
|
||||
'respiration_rate' => $request->respiration_rate,
|
||||
'analysis' => $request->analysis,
|
||||
'complaints' => $request->complaints,
|
||||
]);
|
||||
|
||||
|
||||
// cek medical plan
|
||||
$num_medical_plan = 0;
|
||||
|
||||
foreach ($request->medical_plan as $row) {
|
||||
if ($row['medical_plan_str']) {
|
||||
$num_medical_plan++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($num_medical_plan == 0) {
|
||||
DB::rollBack();
|
||||
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => [
|
||||
'medical_plan' => ['medical plan harus diisi']
|
||||
],
|
||||
'data' => []
|
||||
],400);
|
||||
}
|
||||
|
||||
// insert medical plan
|
||||
foreach ($request->medical_plan as $row) {
|
||||
MedicalPlan::create([
|
||||
'claim_daily_monitoring_id' => $db_response->id,
|
||||
'plan' => $row['medical_plan_str'],
|
||||
]);
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => []
|
||||
],200);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => []
|
||||
],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Detail Request LOG LIST
|
||||
*/
|
||||
public function AddDetailMonitoringListRequestLog(Request $request, $request_code)
|
||||
{
|
||||
$request->merge(['request_code' => $request_code]);
|
||||
|
||||
// validation rule
|
||||
$validator = Validator::make($request->all(),[
|
||||
'request_code' => 'required|exists:request_logs,code',
|
||||
'subject' => 'required',
|
||||
'submission_date' => 'required',
|
||||
'body_temperature' => 'required',
|
||||
'sistole' => 'required',
|
||||
'diastole' => 'required',
|
||||
'respiration_rate' => 'required',
|
||||
'analysis' => 'required',
|
||||
'medical_plan' => 'required',
|
||||
'non_medikamentosa_plan' => 'required',
|
||||
],$this->messages());
|
||||
|
||||
// validation error
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $validator->getMessageBag()
|
||||
],400);
|
||||
}
|
||||
|
||||
// get claim request
|
||||
$request_log = DB::table('request_logs')
|
||||
->select('id')
|
||||
->where('code', $request_code)
|
||||
->first();
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// insert claim daily monitoring
|
||||
$db_response = RequestDailyMonitoring::create([
|
||||
'request_log_id' => $request_log->id,
|
||||
'submission_date' => $request->submission_date,
|
||||
'subject' => $request->subject,
|
||||
'object' => $request->objective,
|
||||
'sistole' => $request->sistole,
|
||||
'diastole' => $request->diastole,
|
||||
'body_temperature' => $request->body_temperature,
|
||||
'respiration_rate' => $request->respiration_rate,
|
||||
'analysis' => $request->analysis,
|
||||
'lab_date' => $request->lab_date,
|
||||
'provider' => $request->provider,
|
||||
'examination' => $request->examination,
|
||||
'created_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
|
||||
// cek medical plan
|
||||
$num_medical_plan = 0;
|
||||
foreach ($request->medical_plan as $row) {
|
||||
if ($row['medical_plan_str']) {
|
||||
$num_medical_plan++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($num_medical_plan == 0) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => [
|
||||
'medical_plan' => ['medical plan harus diisi']
|
||||
],
|
||||
'data' => []
|
||||
],400);
|
||||
}
|
||||
|
||||
// insert medical plan
|
||||
foreach ($request->medical_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $db_response->id,
|
||||
'plan' => $row['medical_plan_str'],
|
||||
'type' => 1,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
|
||||
// insert non medical plan
|
||||
foreach ($request->non_medikamentosa_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $db_response->id,
|
||||
'plan' => $row['non_medikamentosa_plan_str'],
|
||||
'type' => 2,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
|
||||
// insert file result
|
||||
if ($request->confirmation_medical_leter){
|
||||
foreach ($request->confirmation_medical_leter as $file) {
|
||||
$fileData = File::storeFile('confirmation-medical-letter', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'confirmation-medical-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
if ($request->medical_action_letter){
|
||||
foreach ($request->medical_action_letter as $file) {
|
||||
$fileData = File::storeFile('medical-action-letter', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'medical-action-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
if ($request->result){
|
||||
foreach ($request->result as $file) {
|
||||
$fileData = File::storeFile('laboratorium-result', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'laboratorium-result',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => []
|
||||
],200);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => []
|
||||
],500);
|
||||
}
|
||||
}
|
||||
|
||||
public function AddListRequestLog(Request $request)
|
||||
{
|
||||
// validation rule
|
||||
$validator = Validator::make($request->all(),[
|
||||
'log_code' => 'required|exists:request_logs,id',
|
||||
'subject' => 'required',
|
||||
'submission_date' => 'required',
|
||||
'body_temperature' => 'required',
|
||||
'sistole' => 'required',
|
||||
'diastole' => 'required',
|
||||
'respiration_rate' => 'required',
|
||||
'analysis' => 'required',
|
||||
'medical_plan' => 'required',
|
||||
'non_medikamentosa_plan' => 'required',
|
||||
],$this->messages());
|
||||
|
||||
// validation error
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $validator->getMessageBag()
|
||||
],400);
|
||||
}
|
||||
|
||||
// get claim request
|
||||
$request_log = DB::table('request_logs')
|
||||
->select('id')
|
||||
->where('id', $request->log_code)
|
||||
->first();
|
||||
DB::beginTransaction();
|
||||
try {
|
||||
// insert claim daily monitoring
|
||||
$db_response = RequestDailyMonitoring::create([
|
||||
'request_log_id' => $request->log_code,
|
||||
'submission_date' => $request->submission_date,
|
||||
'doctor_1' => $request->doctor_1,
|
||||
'doctor_2' => $request->doctor_2,
|
||||
'temp_diagnosis' => $request->temp_diagnosis,
|
||||
'final_diagnosis' => $request->final_diagnosis,
|
||||
'approval_pendamping' => $request->approval_pendamping,
|
||||
'description' => $request->keterangan,
|
||||
'note' => $request->catatan,
|
||||
'subject' => $request->subject,
|
||||
'object' => $request->objective,
|
||||
'sistole' => $request->sistole,
|
||||
'diastole' => $request->diastole,
|
||||
'body_temperature' => $request->body_temperature,
|
||||
'respiration_rate' => $request->respiration_rate,
|
||||
'analysis' => $request->analysis,
|
||||
'lab_date' => $request->lab_date,
|
||||
'provider' => $request->provider,
|
||||
'examination' => $request->examination,
|
||||
'created_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
|
||||
// cek medical plan
|
||||
$num_medical_plan = 0;
|
||||
foreach ($request->medical_plan as $row) {
|
||||
if ($row['medical_plan_str']) {
|
||||
$num_medical_plan++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($num_medical_plan == 0) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => [
|
||||
'medical_plan' => ['medical plan harus diisi']
|
||||
],
|
||||
'data' => []
|
||||
],400);
|
||||
}
|
||||
|
||||
// insert medical plan
|
||||
foreach ($request->medical_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $db_response->id,
|
||||
'plan' => $row['medical_plan_str'],
|
||||
'type' => 1,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
|
||||
// insert non medical plan
|
||||
foreach ($request->non_medikamentosa_plan as $row) {
|
||||
DB::table('request_log_medical_plan')->insert([
|
||||
'request_log_daily_monitoring_id' => $db_response->id,
|
||||
'plan' => $row['non_medikamentosa_plan_str'],
|
||||
'type' => 2,
|
||||
'created_at' => date('Y-m-d'),
|
||||
]);
|
||||
}
|
||||
|
||||
// insert file result
|
||||
if ($request->confirmation_medical_leter){
|
||||
foreach ($request->confirmation_medical_leter as $file) {
|
||||
$fileData = File::storeFile('confirmation-medical-letter', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'confirmation-medical-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
}
|
||||
}
|
||||
if ($request->medical_action_letter){
|
||||
foreach ($request->medical_action_letter as $file) {
|
||||
$fileData = File::storeFile('medical-action-letter', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'medical-action-letter',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
if ($request->result){
|
||||
foreach ($request->result as $file) {
|
||||
$fileData = File::storeFile('laboratorium-result', $db_response->id, $file);
|
||||
File::create([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $db_response->id,
|
||||
'type' => 'laboratorium-result',
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $orignalName,
|
||||
'extension' => $file->getClientOriginalName(),
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
|
||||
]);
|
||||
|
||||
// $file->storeAs($this->path_for_store, $fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
DB::commit();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => []
|
||||
],200);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
DB::rollBack();
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => []
|
||||
],500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete Listing Daily Monitoring
|
||||
*/
|
||||
public function deleteDetailMonitoringListRequestLog(Request $request, $id)
|
||||
{
|
||||
$listDailyMonitoring = RequestDailyMonitoring::find($id);
|
||||
$listDailyMonitoring->reason = $request->reason;
|
||||
$listDailyMonitoring->save();
|
||||
|
||||
if (!$listDailyMonitoring) {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => "Data not found.",
|
||||
], 404);
|
||||
}
|
||||
|
||||
$listDailyMonitoring->delete();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "Delete success",
|
||||
'data' => $listDailyMonitoring
|
||||
], 200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete File Daily Monitoring
|
||||
*/
|
||||
public function deleteFileDetailMonitoringListRequestLog(Request $request, $id){
|
||||
$fileCurrent = File::where([
|
||||
'id' => $id,
|
||||
])->first();
|
||||
if ($fileCurrent){
|
||||
if (Files::exists($fileCurrent->path)) {
|
||||
Files::delete();
|
||||
}
|
||||
$fileCurrent->deleted_at = now();
|
||||
$fileCurrent->reason = $request->reason;
|
||||
$fileCurrent->deleted_by = auth()->user()->id;
|
||||
$fileCurrent->save();
|
||||
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "Delete success",
|
||||
'data' => $fileCurrent
|
||||
], 200);
|
||||
} else {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => "Data not found.",
|
||||
], 404);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update Status Request LOG
|
||||
*/
|
||||
public function UpdateListRequestLog(Request $request, $request_code)
|
||||
{
|
||||
// get claim request
|
||||
$request_log = DB::table('request_logs')
|
||||
->where('code', $request_code)
|
||||
->update([
|
||||
'discharge_date' => now(),
|
||||
'updated_by' => auth()->user()->id,
|
||||
'updated_at' => now()
|
||||
]);
|
||||
if ($request_log) {
|
||||
return response()->json([
|
||||
'error' => false,
|
||||
'message' => "success",
|
||||
'data' => []
|
||||
], 200);
|
||||
} else {
|
||||
return response()->json([
|
||||
'error' => true,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => []
|
||||
],500);
|
||||
}
|
||||
}
|
||||
}
|
||||
0
Modules/Client/Http/Controllers/Api/DataController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/DataController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/MemberController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/MemberController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/TopUpController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/TopUpController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/UserController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/Api/UserController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/ClientController.php
Normal file → Executable file
0
Modules/Client/Http/Controllers/ClientController.php
Normal file → Executable file
0
Modules/Client/Http/Middleware/.gitkeep
Normal file → Executable file
0
Modules/Client/Http/Middleware/.gitkeep
Normal file → Executable file
0
Modules/Client/Http/Requests/.gitkeep
Normal file → Executable file
0
Modules/Client/Http/Requests/.gitkeep
Normal file → Executable file
0
Modules/Client/Providers/.gitkeep
Normal file → Executable file
0
Modules/Client/Providers/.gitkeep
Normal file → Executable file
0
Modules/Client/Providers/ClientServiceProvider.php
Normal file → Executable file
0
Modules/Client/Providers/ClientServiceProvider.php
Normal file → Executable file
0
Modules/Client/Providers/RouteServiceProvider.php
Normal file → Executable file
0
Modules/Client/Providers/RouteServiceProvider.php
Normal file → Executable file
0
Modules/Client/Resources/assets/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/assets/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/assets/js/app.js
Normal file → Executable file
0
Modules/Client/Resources/assets/js/app.js
Normal file → Executable file
0
Modules/Client/Resources/assets/sass/app.scss
Normal file → Executable file
0
Modules/Client/Resources/assets/sass/app.scss
Normal file → Executable file
0
Modules/Client/Resources/lang/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/lang/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/views/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/views/.gitkeep
Normal file → Executable file
0
Modules/Client/Resources/views/index.blade.php
Normal file → Executable file
0
Modules/Client/Resources/views/index.blade.php
Normal file → Executable file
0
Modules/Client/Resources/views/layouts/master.blade.php
Normal file → Executable file
0
Modules/Client/Resources/views/layouts/master.blade.php
Normal file → Executable file
0
Modules/Client/Routes/.gitkeep
Normal file → Executable file
0
Modules/Client/Routes/.gitkeep
Normal file → Executable file
63
Modules/Client/Routes/api.php
Normal file → Executable file
63
Modules/Client/Routes/api.php
Normal file → Executable file
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Modules\Client\Http\Controllers\Api\AuthController;
|
||||
use Modules\Client\Http\Controllers\Api\BillingSummaryController;
|
||||
use Modules\Client\Http\Controllers\Api\CorporateDivisionController;
|
||||
use Modules\Client\Http\Controllers\Api\CorporateManageController;
|
||||
use Modules\Client\Http\Controllers\Api\CorporateMemberController;
|
||||
@@ -14,6 +15,15 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController;
|
||||
use Modules\Client\Http\Controllers\Api\ClaimReportController;
|
||||
use Modules\Client\Http\Controllers\Api\ClaimRequestController;
|
||||
use Modules\Client\Http\Controllers\Api\DataController;
|
||||
use Modules\Internal\Http\Controllers\Api\FormulariumController;
|
||||
use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController;
|
||||
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
|
||||
use Modules\Internal\Http\Controllers\Api\CorporateController;
|
||||
use Modules\Internal\Http\Controllers\Api\NavigationController;
|
||||
use Modules\Client\Http\Controllers\Api\DailyMonitoringController;
|
||||
use Modules\Internal\Http\Controllers\Api\RequestLogController;
|
||||
|
||||
use Modules\Internal\Http\Controllers\Api\UserManagementController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -28,6 +38,8 @@ use Modules\Client\Http\Controllers\Api\DataController;
|
||||
|
||||
Route::prefix('client')->group(function () {
|
||||
|
||||
Route::get('codeLog', [RequestLogController::class, 'codeLog']);
|
||||
|
||||
Route::controller(AuthController::class)->group(function () {
|
||||
Route::post('login', 'login');
|
||||
Route::post('verify-code', 'validateOtp');
|
||||
@@ -54,6 +66,7 @@ Route::prefix('client')->group(function () {
|
||||
Route::get('claims/status', [ClaimController::class, 'status']);
|
||||
Route::get('claims', [ClaimController::class, 'index']);
|
||||
Route::get('claims/export', [ClaimController::class, 'export']);
|
||||
Route::get('claims/exportAlrmCenter/{start}/{end}', [ClaimController::class, 'exportAlrmCenter']);
|
||||
Route::get('claims/{claim_id}/encounters', [ClaimEncounterController::class, 'getEncounterData']);
|
||||
Route::get('topup', [TopUpController::class, 'index']);
|
||||
// Route::get('topup', [TopUpController::class, 'get']);
|
||||
@@ -65,10 +78,60 @@ Route::prefix('client')->group(function () {
|
||||
|
||||
Route::get('corporate', [CorporateCurrentController::class, 'index']);
|
||||
Route::put('corporate-update', [CorporateCurrentController::class, 'update']);
|
||||
Route::get('get-deposits', [CorporateMemberController::class, 'getDeposit']);
|
||||
Route::get('billing/summary', [BillingSummaryController::class, 'index']);
|
||||
Route::get('/billing/provider-summary', [BillingSummaryController::class, 'providerSummary']);
|
||||
Route::get('/billing/top-diagnosis', [BillingSummaryController::class, 'topDiagnosis']);
|
||||
|
||||
Route::get('get-limits/{member_id}', [CorporateMemberController::class, 'getLimits']);
|
||||
|
||||
Route::get('download-ecard/{member_id}', [CorporateMemberController::class, 'downloadEcard']);
|
||||
Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']);
|
||||
});
|
||||
|
||||
Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']);
|
||||
|
||||
// Daily Monitoring
|
||||
Route::prefix('daily_monitoring')->group(function () {
|
||||
Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']);
|
||||
Route::get('detail/{id}/edit', [DailyMonitoringController::class, 'GetDetailMonitoringListbyID']);
|
||||
});
|
||||
|
||||
Route::get('claims/{id}', [ClaimController::class, 'show']);
|
||||
|
||||
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
|
||||
Route::post('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
|
||||
|
||||
Route::get('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'index']);
|
||||
Route::post('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'store']);
|
||||
Route::post('master/formulariums/{formulariums_template_id}/import', [FormulariumController::class, 'import']);
|
||||
Route::get('master/formulariums/{formulariums_template_id}/list', [FormulariumController::class, 'generateFormulariumList']);
|
||||
|
||||
Route::get('master/formularium-template', [FormulariumTemplateController::class, 'index']);
|
||||
Route::get('master/formularium-template/search', [FormulariumTemplateController::class, 'search']);
|
||||
Route::post('master/formularium-template/store', [FormulariumTemplateController::class, 'store']);
|
||||
Route::put('master/formularium-template/{id}/activation', [FormulariumTemplateController::class, 'activation']);
|
||||
Route::get('master/formularium-template/{id}/edit', [FormulariumTemplateController::class, 'edit']);
|
||||
Route::put('master/formularium-template/{id}/update', [FormulariumTemplateController::class, 'update']);
|
||||
|
||||
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
|
||||
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
|
||||
|
||||
// Navigation
|
||||
Route::get('navigations', [NavigationController::class, 'index']);
|
||||
|
||||
// User Management Role
|
||||
Route::get('user/role', [UserManagementController::class, 'index']);
|
||||
Route::post('user/role', [UserManagementController::class, 'store']);
|
||||
Route::get('user/role/{id}', [UserManagementController::class, 'edit']);
|
||||
Route::put('user/role/{id}', [UserManagementController::class, 'update']);
|
||||
Route::get('permission_list', [UserManagementController::class, 'permission_list']);
|
||||
|
||||
// User Role Access
|
||||
Route::get('user/access', [UserManagementController::class, 'list_access']);
|
||||
Route::post('user/access', [UserManagementController::class, 'store_access']);
|
||||
Route::get('user/access/{id}', [UserManagementController::class, 'edit_access']);
|
||||
Route::put('user/access/{id}', [UserManagementController::class, 'update_access']);
|
||||
Route::get('role-list', [UserManagementController::class, 'list_role']);
|
||||
});
|
||||
});
|
||||
|
||||
0
Modules/Client/Routes/web.php
Normal file → Executable file
0
Modules/Client/Routes/web.php
Normal file → Executable file
0
Modules/Client/Tests/Feature/.gitkeep
Normal file → Executable file
0
Modules/Client/Tests/Feature/.gitkeep
Normal file → Executable file
0
Modules/Client/Tests/Unit/.gitkeep
Normal file → Executable file
0
Modules/Client/Tests/Unit/.gitkeep
Normal file → Executable file
15
Modules/Client/Transformers/AlarmCenter/DataListClaimMemberResource.php
Normal file → Executable file
15
Modules/Client/Transformers/AlarmCenter/DataListClaimMemberResource.php
Normal file → Executable file
@@ -4,6 +4,9 @@ namespace Modules\Client\Transformers\AlarmCenter;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use App\Models\Service;
|
||||
use App\Models\Organization;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class DataListClaimMemberResource extends JsonResource
|
||||
{
|
||||
@@ -15,11 +18,19 @@ class DataListClaimMemberResource extends JsonResource
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
$filesGroupByType = $this->files->mapToGroups(function($file) {
|
||||
return [Str::slug($file->type, '_') => $file];
|
||||
});
|
||||
$serviceData = Service::where('code', $this->service_code)->first();
|
||||
$organization = Organization::where('id', $this->organization_id)->first();
|
||||
$organizationName = '-';
|
||||
if ($organization){
|
||||
$organizationName = $organization->name;
|
||||
}
|
||||
if ($serviceData) {
|
||||
$serviceName = $serviceData->name;
|
||||
} else {
|
||||
$serviceName = $this->service_cod;
|
||||
$serviceName = $this->service_code;
|
||||
}
|
||||
|
||||
if ($this->status == 'approved' && $this->status_final_log ){
|
||||
@@ -34,8 +45,10 @@ class DataListClaimMemberResource extends JsonResource
|
||||
'admission_date' => $this->submission_date ?? null,
|
||||
'discharge_date' => $this->discharge_date ?? null,
|
||||
'code' => $this->code ?? null,
|
||||
'provider_name' => $organizationName ?? null,
|
||||
'service_type' => $serviceName,
|
||||
'status' => $status,
|
||||
'files_by_type' => $filesGroupByType
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
183
Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php
Normal file → Executable file
183
Modules/Client/Transformers/AlarmCenter/DataServiceMonitoring.php
Normal file → Executable file
@@ -4,6 +4,8 @@ namespace Modules\Client\Transformers\AlarmCenter;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Illuminate\Support\Carbon;
|
||||
use App\Models\Icd;
|
||||
use DB;
|
||||
|
||||
class DataServiceMonitoring extends JsonResource
|
||||
{
|
||||
@@ -15,15 +17,85 @@ class DataServiceMonitoring extends JsonResource
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
$files = [];
|
||||
$filesFinalLogResult = [];
|
||||
$filesFinalLogDiagnosis = [];
|
||||
$filesFinalLogKondisi = [];
|
||||
if (count($this->files)>0){
|
||||
foreach ($this->files as $key => $value) {
|
||||
/*
|
||||
Sementara di buat satu dulu, jangan di hapus..
|
||||
karena suka labil client nya, tiba2 hide tiba2 munculin fitur :D
|
||||
*/
|
||||
|
||||
// if($value->type == 'final-log-result'){
|
||||
array_push($filesFinalLogResult, $value);
|
||||
// };
|
||||
|
||||
// if($value->type == 'final-log-diagnosis'){
|
||||
// array_push($filesFinalLogDiagnosis, $value);
|
||||
// }
|
||||
|
||||
// if($value->type == 'final-log-kondisi'){
|
||||
// array_push($filesFinalLogKondisi, $value);
|
||||
// }
|
||||
}
|
||||
|
||||
$files = [
|
||||
'result' => $filesFinalLogResult,
|
||||
'diagnosis' => $filesFinalLogDiagnosis,
|
||||
'kondisi' => $filesFinalLogKondisi,
|
||||
|
||||
];
|
||||
} else {
|
||||
$files = [
|
||||
'result' => [],
|
||||
'diagnosis' => [],
|
||||
'kondisi' => [],
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
$diagnosis = '-';
|
||||
$main_diagnosis = '-';
|
||||
if ($this->diagnosis){
|
||||
$diagnosis = explode(',', $this->diagnosis);
|
||||
if (count($diagnosis)>0){
|
||||
|
||||
foreach($diagnosis as $key => $d){
|
||||
$icd = Icd::where('code', $d)->first('name');
|
||||
if($key == 0){
|
||||
if ($icd){
|
||||
$main_diagnosis = $icd->name;
|
||||
} else {
|
||||
$main_diagnosis = $d;
|
||||
}
|
||||
$diagnosis = '-';
|
||||
}
|
||||
|
||||
if ($key > 0){
|
||||
if ($icd) {
|
||||
$diagnosis .= $icd->name . ', ';
|
||||
} else {
|
||||
$diagnosis .= $d .', ';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return [
|
||||
'companyName' => $this->member->currentCorporate->name ?? null,
|
||||
'serviceCode' => $this->service_code ?? null,
|
||||
'member_id' => $this->member->id ?? null,
|
||||
'memberId' => $this->member->member_id ?? null,
|
||||
'fullName' => $this->member->full_name ?? null,
|
||||
'dateOfBirth' => $this->member->birth_date ?? null,
|
||||
'phoneNumber' => $this->person->phone ?? null,
|
||||
'email' => $this->member->email ?? ($this->member->person->email ?? null),
|
||||
'serviceName' => $this->service->name ?? ($this->service_code ?? null),
|
||||
'files' => $files,
|
||||
'mainDiagnose' => $main_diagnosis,
|
||||
'comparativeDiagnosis' => $diagnosis,
|
||||
'benefits' => collect($this->requestLogBenefits)->map(function ($requestLogBenefit) {
|
||||
return [
|
||||
'amountIncurred' => $requestLogBenefit->amount_incurred,
|
||||
@@ -34,25 +106,68 @@ class DataServiceMonitoring extends JsonResource
|
||||
'name' => $requestLogBenefit->benefit->description,
|
||||
];
|
||||
})->all() ?? null,
|
||||
'keterangan' => $this->keterangan ?? null,
|
||||
'catatan' => $this->catatan ?? null,
|
||||
'benefitTotal' => $this->benefitTotal ?? null,
|
||||
'hospital' => $this->organization->name ?? null,
|
||||
'admissionDate' => $this->submission_date ?? null,
|
||||
'dischargeDate' => $this->discharge_date ?? null,
|
||||
'dailyMonitorings' => $this->when($this->service_code === 'IP', collect($this->requestLogDailyMonitorings)
|
||||
->groupBy(function ($requestLogDailyMonitoring) {
|
||||
return $requestLogDailyMonitoring->created_at->format('d M Y');
|
||||
return Carbon::parse($requestLogDailyMonitoring->submission_date)->format('d M Y');
|
||||
})
|
||||
->map(function ($groupedItems) {
|
||||
return collect($groupedItems)
|
||||
->map(function ($requestLogDailyMonitoring) {
|
||||
$arr_document = [];
|
||||
$document = DB::table('files')
|
||||
->where([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $requestLogDailyMonitoring->id,
|
||||
'deleted_at' => null
|
||||
])
|
||||
->whereIn('type', ['medical-action-letter', 'confirmation-medical-letter'])
|
||||
->get();
|
||||
if ($document){
|
||||
foreach($document as $d){
|
||||
// Jika path kosong, kembalikan null
|
||||
if (!$row->path) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Cek nilai 'source'. Jika 's3', gunakan disk S3.
|
||||
// Selain itu (termasuk null atau 'local'), gunakan disk 'public'.
|
||||
if ($row->source === 's3') {
|
||||
try {
|
||||
$path = Storage::disk('s3')->temporaryUrl(
|
||||
$row->path,
|
||||
now()->addMinutes(60) // expired 1 jam
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$path = Storage::disk('s3')->url($row->path); // fallback kalau public
|
||||
}
|
||||
} else {
|
||||
$path = Storage::disk('public')->url($row->path);
|
||||
}
|
||||
$arr_document[]= [
|
||||
'path' => $path,
|
||||
'type' => $d->type,
|
||||
'original_name' => $d->original_name,
|
||||
'name' => $d->name,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return [
|
||||
'time' => $requestLogDailyMonitoring->created_at->format('H:i') ?? null,
|
||||
'time' => Carbon::parse($requestLogDailyMonitoring->submission_date)->format('H:i') ?? null,
|
||||
'status' => 'Done' ?? null,
|
||||
'subject' => $requestLogDailyMonitoring->subject ?? null,
|
||||
'object' => $requestLogDailyMonitoring->object ?? null,
|
||||
'bodyTemperature' => $requestLogDailyMonitoring->body_temperature ?? null,
|
||||
'sistole' => $requestLogDailyMonitoring->sistole . 'mm[Hg]' ?? null,
|
||||
'diastole' => $requestLogDailyMonitoring->diastole . 'mm[Hg]' ?? null,
|
||||
'respirationRate' => $requestLogDailyMonitoring->respiration_rate . '/min' ?? null,
|
||||
'sistole' => $requestLogDailyMonitoring->sistole ?? null,
|
||||
'diastole' => $requestLogDailyMonitoring->diastole ?? null,
|
||||
'respirationRate' => $requestLogDailyMonitoring->respiration_rate ?? null,
|
||||
'analysis' => $requestLogDailyMonitoring->analysis ?? null,
|
||||
'complaints' => $requestLogDailyMonitoring->complaints ?? null,
|
||||
'plans' => $this->when($requestLogDailyMonitoring->requestLogMedicalPlans, collect($requestLogDailyMonitoring->requestLogMedicalPlans)
|
||||
@@ -64,6 +179,7 @@ class DataServiceMonitoring extends JsonResource
|
||||
})
|
||||
->sortBy('type')
|
||||
->all()) ?? null,
|
||||
'files' => $arr_document
|
||||
];
|
||||
})
|
||||
->sortByDesc(function ($item) {
|
||||
@@ -75,18 +191,63 @@ class DataServiceMonitoring extends JsonResource
|
||||
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
|
||||
})
|
||||
->all()) ?? null,
|
||||
'laboratoriumResults' => $this->whenLoaded('requestLogDailyMonitorings', collect($this->requestLogDailyMonitorings)
|
||||
'laboratoriumResults' => $this->when($this->service_code === 'IP', collect($this->requestLogDailyMonitorings)
|
||||
->groupBy(function ($requestLogDailyMonitoring) {
|
||||
return Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y');
|
||||
})
|
||||
->filter(function ($groupedItems) {
|
||||
return !is_null($groupedItems->first()->lab_date);
|
||||
})
|
||||
->map(function ($groupedItems) {
|
||||
return collect($groupedItems)
|
||||
->map(function ($requestLogDailyMonitoring) {
|
||||
|
||||
->map(function ($test) {
|
||||
$arr_document = [];
|
||||
$document = DB::table('files')
|
||||
->where([
|
||||
'fileable_type' => 'App\Models\LaboratoriumResult',
|
||||
'fileable_id' => $test->id,
|
||||
'deleted_at' => null
|
||||
])
|
||||
->whereIn('type', ['laboratorium-result'])
|
||||
->get();
|
||||
if ($document){
|
||||
foreach($document as $d){
|
||||
// Jika path kosong, kembalikan null
|
||||
if (!$row->path) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Cek nilai 'source'. Jika 's3', gunakan disk S3.
|
||||
// Selain itu (termasuk null atau 'local'), gunakan disk 'public'.
|
||||
if ($row->source === 's3') {
|
||||
try {
|
||||
$path = Storage::disk('s3')->temporaryUrl(
|
||||
$row->path,
|
||||
now()->addMinutes(60) // expired 1 jam
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$path = Storage::disk('s3')->url($row->path); // fallback kalau public
|
||||
}
|
||||
} else {
|
||||
$path = Storage::disk('public')->url($row->path);
|
||||
}
|
||||
|
||||
$arr_document[]= [
|
||||
'path' => $path,
|
||||
'type' => $d->type,
|
||||
'original_name' => $d->original_name,
|
||||
'name' => $d->name,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'code' => $requestLogDailyMonitoring->code,
|
||||
'date' => Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y') ?? null,
|
||||
'examination' => $requestLogDailyMonitoring->examination ?? null,
|
||||
'location' => $requestLogDailyMonitoring->provider ?? null,
|
||||
'code' => $test->code,
|
||||
'date' => Carbon::parse($test->lab_date)->format('d M Y') ?? null,
|
||||
'examination' => $test->examination ?? null,
|
||||
'location' => $test->provider ?? null,
|
||||
'files' => $arr_document
|
||||
];
|
||||
})
|
||||
->sortByDesc(function ($item) {
|
||||
|
||||
0
Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimReport/ClaimReportFileShowResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimReport/MemberResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimReport/MemberResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimReport/ShowResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimReport/ShowResources.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimShowResource.php
Normal file → Executable file
0
Modules/Client/Transformers/ClaimShowResource.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/LimitResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/LimitResources.php
Normal file → Executable file
1
Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php
Normal file → Executable file
1
Modules/Client/Transformers/Dashboard/MemberAlarmCenterResources.php
Normal file → Executable file
@@ -17,6 +17,7 @@ class MemberAlarmCenterResources extends JsonResource
|
||||
'id' => $this->id,
|
||||
'personId' => $this->person_id,
|
||||
'memberId' => $this->member_id,
|
||||
'link_document' => $this->link_document,
|
||||
'fullName' => $this->full_name,
|
||||
'service' => $this->service_code,
|
||||
'start_date' => $this->members_effective_date,
|
||||
|
||||
0
Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/MemberResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/MemberResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/TopUpLimitResources.php
Normal file → Executable file
0
Modules/Client/Transformers/Dashboard/TopUpLimitResources.php
Normal file → Executable file
0
Modules/Client/Transformers/DataMemberResource.php
Normal file → Executable file
0
Modules/Client/Transformers/DataMemberResource.php
Normal file → Executable file
0
Modules/Client/Transformers/EmployeeData/UserProfile/DataMemberResource.php
Normal file → Executable file
0
Modules/Client/Transformers/EmployeeData/UserProfile/DataMemberResource.php
Normal file → Executable file
0
Modules/Client/composer.json
Normal file → Executable file
0
Modules/Client/composer.json
Normal file → Executable file
0
Modules/Client/module.json
Normal file → Executable file
0
Modules/Client/module.json
Normal file → Executable file
0
Modules/Client/package.json
Normal file → Executable file
0
Modules/Client/package.json
Normal file → Executable file
0
Modules/Client/webpack.mix.js
Normal file → Executable file
0
Modules/Client/webpack.mix.js
Normal file → Executable file
0
Modules/HospitalPortal/Config/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Config/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Config/config.php
Normal file → Executable file
0
Modules/HospitalPortal/Config/config.php
Normal file → Executable file
0
Modules/HospitalPortal/Console/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Console/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/Migrations/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/Migrations/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/Seeders/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/Seeders/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/Seeders/HospitalPortalDatabaseSeeder.php
Normal file → Executable file
0
Modules/HospitalPortal/Database/Seeders/HospitalPortalDatabaseSeeder.php
Normal file → Executable file
0
Modules/HospitalPortal/Database/factories/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Database/factories/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Entities/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Entities/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Helpers/ApiResponse.php
Normal file → Executable file
0
Modules/HospitalPortal/Helpers/ApiResponse.php
Normal file → Executable file
93
Modules/HospitalPortal/Helpers/GrabHelper.php
Normal file
93
Modules/HospitalPortal/Helpers/GrabHelper.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\HospitalPortal\Helpers;
|
||||
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\Psr7\Request;
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
|
||||
class GrabHelper
|
||||
{
|
||||
protected $client;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->client = new Client();
|
||||
}
|
||||
|
||||
public function getToken()
|
||||
{
|
||||
$url = env('TOKEN_URL_GRAB');
|
||||
$headers = [
|
||||
'Content-Type' => 'application/json',
|
||||
];
|
||||
$body = json_encode([
|
||||
'client_id' => env('CLIENT_ID_GRAB'),
|
||||
'client_secret' => env('CLIENT_SECRET_GRAB'),
|
||||
'grant_type' => 'client_credentials',
|
||||
'scope' => 'grab_express.partner_deliveries',
|
||||
]);
|
||||
|
||||
$request = new Request('POST', $url, $headers, $body);
|
||||
$response = $this->client->send($request);
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
|
||||
return $data['access_token'] ?? null;
|
||||
}
|
||||
|
||||
public function createDelivery($token,$body)
|
||||
{
|
||||
$url = env('BASE_URL_GRAB').'/v1/deliveries';
|
||||
$headers = [
|
||||
'Content-Type' => 'application/json',
|
||||
'Authorization' => 'Bearer ' . $token,
|
||||
];
|
||||
$request = new Request('POST', $url, $headers, $body);
|
||||
$response = $this->client->send($request);
|
||||
|
||||
return $response->getBody()->getContents();
|
||||
}
|
||||
|
||||
public function normalizePhoneNumber($phoneNumber) {
|
||||
// Remove any non-digit characters (e.g., '+', '-', spaces)
|
||||
$phoneNumber = preg_replace('/\D/', '', $phoneNumber);
|
||||
|
||||
// Check if the cleaned phone number is numeric
|
||||
if (!is_numeric($phoneNumber)) {
|
||||
return null; // Return false or handle the error as needed
|
||||
}
|
||||
|
||||
// Handle phone numbers starting with '62' or '+62'
|
||||
if (substr($phoneNumber, 0, 2) === '62') {
|
||||
$phoneNumber = '0' . substr($phoneNumber, 2);
|
||||
}
|
||||
|
||||
// Handle phone numbers that already start with '8'
|
||||
if (substr($phoneNumber, 0, 1) === '8') {
|
||||
$phoneNumber = '0' . $phoneNumber;
|
||||
}
|
||||
|
||||
return $phoneNumber;
|
||||
}
|
||||
|
||||
public function getScheduleTimes()
|
||||
{
|
||||
// Create a DateTime object for the current time in Jakarta timezone
|
||||
$pickupTimeFrom = new DateTime('now', new DateTimeZone('Asia/Jakarta'));
|
||||
|
||||
// Add 30 minutes to the current time for pickupTimeFrom
|
||||
$pickupTimeFrom->modify('+30 minutes');
|
||||
|
||||
// Clone the pickupTimeFrom to calculate pickupTimeTo
|
||||
$pickupTimeTo = clone $pickupTimeFrom;
|
||||
// Add 1 hour to pickupTimeFrom for pickupTimeTo
|
||||
$pickupTimeTo->modify('+1 hour');
|
||||
|
||||
// Format the times to ISO 8601 format (e.g., 2024-10-02T12:37:28+07:00)
|
||||
return [
|
||||
"pickupTimeFrom" => $pickupTimeFrom->format(DateTime::ATOM),
|
||||
"pickupTimeTo" => $pickupTimeTo->format(DateTime::ATOM),
|
||||
];
|
||||
}
|
||||
}
|
||||
0
Modules/HospitalPortal/Http/Controllers/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Http/Controllers/.gitkeep
Normal file → Executable file
236
Modules/HospitalPortal/Http/Controllers/Api/AuthController.php
Normal file → Executable file
236
Modules/HospitalPortal/Http/Controllers/Api/AuthController.php
Normal file → Executable file
@@ -14,6 +14,9 @@ use Modules\Internal\Emails\SendVerifyEmail;
|
||||
use Modules\Internal\Events\ForgetPassword;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Modules\HospitalPortal\Helpers\ApiResponse;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Helpers\Helper;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
@@ -27,9 +30,9 @@ class AuthController extends Controller
|
||||
'email' => 'required|email',
|
||||
'password' => 'required'
|
||||
], [
|
||||
'email.required' => trans('validation.required',['attribute' => 'Email']),
|
||||
'email.email' => trans('validation.email'),
|
||||
'password.required' => trans('validation.required',['attribute' => 'Password']),
|
||||
'email.required' => trans('Validation.required',['attribute' => 'Email']),
|
||||
'email.email' => trans('Validation.email'),
|
||||
'password.required' => trans('Validation.required',['attribute' => 'Password']),
|
||||
]);
|
||||
|
||||
if ($validator->fails())
|
||||
@@ -40,11 +43,11 @@ class AuthController extends Controller
|
||||
{
|
||||
$user = User::where('email', $request->email)->first();
|
||||
if (!$user) {
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('message.not_found'), 404);
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
|
||||
}
|
||||
|
||||
if (!Hash::check($request->password, $user->password)) {
|
||||
return ApiResponse::apiResponse('Bad Request', $data, trans('message.password'), 400);
|
||||
return ApiResponse::apiResponse('Bad Request', $data, trans('Message.password'), 400);
|
||||
}
|
||||
|
||||
$res_data = [
|
||||
@@ -52,16 +55,15 @@ class AuthController extends Controller
|
||||
'token' => $user->createToken('app')->plainTextToken
|
||||
];
|
||||
|
||||
return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200);
|
||||
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
|
||||
}
|
||||
}
|
||||
|
||||
public function logout(Request $request)
|
||||
{
|
||||
$token = $request->bearerToken();
|
||||
Auth::user()->tokens()->where('id', $token)->delete();
|
||||
$request->user()->tokens()->delete();
|
||||
|
||||
return response(['message' => 'Berhasil Logout.']);
|
||||
return ApiResponse::apiResponse('Success', [], trans('Message.logout'), 200);
|
||||
}
|
||||
|
||||
public function resetPassword(Request $request)
|
||||
@@ -75,12 +77,12 @@ class AuthController extends Controller
|
||||
]);
|
||||
|
||||
if (!Hash::check($request['old_password'], $user->password)) {
|
||||
return response(['message' => 'Password Salah'], 403);
|
||||
return response(['Message' => 'Password Salah'], 403);
|
||||
}
|
||||
|
||||
if ($request["new_password"] != $request["confirm_new_password"]) {
|
||||
return response([
|
||||
'message' => "Password Tidak Sama"
|
||||
'Message' => "Password Tidak Sama"
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -92,52 +94,202 @@ class AuthController extends Controller
|
||||
|
||||
public function verifyEmail(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
$data = [
|
||||
'email' => $request->email,
|
||||
];
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'email' => 'required|email',
|
||||
], [
|
||||
'email.required' => trans('Validation.required',['attribute' => 'Email']),
|
||||
'email.email' => trans('Validation.email'),
|
||||
]);
|
||||
|
||||
$user = User::query()
|
||||
->where('email', $request->email)
|
||||
if ($validator->fails())
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
else
|
||||
{
|
||||
$user = User::where('email', $request->email)->first();
|
||||
if (!$user) {
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
|
||||
}
|
||||
|
||||
//send email
|
||||
// Insert data notifications
|
||||
$emailTo = $request->email;
|
||||
$dataNotif = [
|
||||
'user_id' => $user->id,
|
||||
'email' => $emailTo,
|
||||
'title' => 'Forgot Password',
|
||||
'description' => 'Request forgot password from Hospital Portal',
|
||||
'type' => 1,
|
||||
'isUnRead' => true,
|
||||
'created_by' => auth()->check() ? auth()->user()->id : null,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'updated_at' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
$sendNotif = Helper::insertNotification($dataNotif);
|
||||
//Insert data password reset
|
||||
$token = mt_rand(100000, 999999); // Menghasilkan angka acak antara 100000 dan 999999
|
||||
$p_resets = DB::table('password_resets')
|
||||
->insert([
|
||||
'email' => $request->email,
|
||||
'token' => $token,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
// Send Email after insert notifications
|
||||
if($sendNotif && $p_resets)
|
||||
{
|
||||
//send to alarm
|
||||
$nameTo = 'User';
|
||||
$dataEmail = [
|
||||
'email' => $emailTo,
|
||||
'name' => $nameTo,
|
||||
'subject' => 'Request Forgot Password from Hospital Portal Date '. date('Y-m-d H:i:s'),
|
||||
'body' => View::make('email/forgot_password', ['token' => $token])->render(),
|
||||
];
|
||||
Helper::sendEmail($dataEmail);
|
||||
|
||||
$res = DB::table('password_resets')
|
||||
->where('email', '=', $request->email)
|
||||
->where('token', '=', $token)
|
||||
->first();
|
||||
|
||||
return ApiResponse::apiResponse("Success", $res, trans('Message.success'), 200);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse("Internal Server Error", $data, trans('Message.server_error'), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function verifCode(Request $request)
|
||||
{
|
||||
$data = [
|
||||
'email' => $request->email,
|
||||
'token' => $request->token,
|
||||
];
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'email' => 'required|email',
|
||||
'token' => 'required|numeric',
|
||||
], [
|
||||
'email.required' => trans('Validation.required',['attribute' => 'Email']),
|
||||
'email.email' => trans('Validation.email'),
|
||||
'token.required' => trans('Validation.required',['attribute' => 'Token']),
|
||||
'token.numeric' => trans('Validation.required',['attribute' => 'Code Numeric']),
|
||||
]);
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Check Time
|
||||
$check = DB::table('password_resets')
|
||||
->where('email', '=', $request->email)
|
||||
->where('token', '=', $request->token)
|
||||
->select('created_at')
|
||||
->first();
|
||||
|
||||
if (!$user) {
|
||||
return response(['message' => 'User Tidak Ditemukan'], 404);
|
||||
if($check)
|
||||
{
|
||||
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
|
||||
$now = time(); // Waktu sekarang dalam UNIX timestamp
|
||||
|
||||
// Hitung selisih waktu dalam menit
|
||||
$diffInMinutes = ($now - $created_at) / 60;
|
||||
|
||||
if ($diffInMinutes > 60) {
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
|
||||
} else {
|
||||
// Lanjutkan dengan proses pemulihan kata sandi
|
||||
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
|
||||
}
|
||||
}
|
||||
|
||||
Event(new ForgetPassword($user));
|
||||
|
||||
// Mail::to($user->email)->send(new SendVerifyEmail($user));
|
||||
|
||||
return response()->json($user);
|
||||
}
|
||||
|
||||
public function forgetPassword(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'new_password' => 'required',
|
||||
'confirm_new_password' => 'required'
|
||||
$data = [
|
||||
'email' => $request->email,
|
||||
'token' => $request->token,
|
||||
'new_password' => $request->new_password
|
||||
];
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'email' => 'required|email',
|
||||
'token' => 'required|numeric',
|
||||
'new_password' => [
|
||||
'required',
|
||||
'min:8',
|
||||
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/'
|
||||
]
|
||||
], [
|
||||
'email.required' => trans('Validation.required',['attribute' => 'Email']),
|
||||
'email.email' => trans('Validation.email'),
|
||||
'token.required' => trans('Validation.required',['attribute' => 'Token']),
|
||||
'new_password.required' => trans('Validation.required',['attribute' => 'New Password']),
|
||||
'new_password.min' => trans('Validation.min',['attribute' => 'New Password']),
|
||||
'new_password.regex' => trans('Validation.regex',['attribute' => 'New Password']),
|
||||
]);
|
||||
|
||||
$token = Crypt::decryptString($request->token);
|
||||
$email = explode('|', $token)[0];
|
||||
|
||||
$user = User::query()
|
||||
->where('email', $email)
|
||||
if($request->new_password != $request->confirm_new_password)
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, 'Confirm password is not the same', 400);
|
||||
}
|
||||
else if ($validator->fails())
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Check Time
|
||||
$check = DB::table('password_resets')
|
||||
->where('email', '=', $request->email)
|
||||
->where('token', '=', $request->token)
|
||||
->select('created_at')
|
||||
->first();
|
||||
|
||||
if (!$user) {
|
||||
return response(['message' => 'User Tidak Ditemukan'], 404);
|
||||
}
|
||||
if($check)
|
||||
{
|
||||
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
|
||||
$now = time(); // Waktu sekarang dalam UNIX timestamp
|
||||
|
||||
if ($request["new_password"] != $request["confirm_new_password"]) {
|
||||
return response([
|
||||
'message' => "Password Tidak Sama"
|
||||
], 404);
|
||||
}
|
||||
// Hitung selisih waktu dalam menit
|
||||
$diffInMinutes = ($now - $created_at) / 60;
|
||||
|
||||
$user->update([
|
||||
'password' => Hash::make($request->confirm_new_password),
|
||||
]);
|
||||
return response()->json($user);
|
||||
if ($diffInMinutes > 60) {
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
|
||||
} else {
|
||||
// Lanjutkan dengan proses pemulihan kata sandi
|
||||
$user = User::where('email', $request->email)->first();
|
||||
if ($user)
|
||||
{
|
||||
$newPassword = Hash::make($request->new_password);
|
||||
$user->password = $newPassword;
|
||||
$user->save();
|
||||
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
86
Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php
Normal file → Executable file
86
Modules/HospitalPortal/Http/Controllers/Api/ClaimRequestController.php
Normal file → Executable file
@@ -7,6 +7,9 @@ use App\Helpers\Helper;
|
||||
use App\Models\ClaimRequest;
|
||||
use App\Models\File;
|
||||
use App\Models\Member;
|
||||
use App\Models\RequestLog;
|
||||
use App\Models\Organization;
|
||||
|
||||
use App\Services\ClaimRequestService;
|
||||
use App\Services\ClaimService;
|
||||
use Exception;
|
||||
@@ -26,7 +29,7 @@ class ClaimRequestController extends Controller
|
||||
* Display a listing of the resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
private static $code_prefix = 'CRQ-H';
|
||||
private static $code_prefix = 'CLAIM';
|
||||
public function index(request $request)
|
||||
{
|
||||
$claimRequests = ClaimRequest::query()
|
||||
@@ -85,21 +88,26 @@ class ClaimRequestController extends Controller
|
||||
else
|
||||
{
|
||||
$check_claim_requests = DB::table('claim_requests')
|
||||
->where('claim_requests.request_log_id', '=', $request->request_logs_id)
|
||||
->first();
|
||||
->where('claim_requests.request_log_id', '=', $request->request_logs_id)
|
||||
->first();
|
||||
if(!$check_claim_requests)
|
||||
{
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
$code = $this->getNextCode();
|
||||
$code = $this->getNextCode($request->request_logs_id);
|
||||
$member = Member::find($request->member_id);
|
||||
$requestLogData = RequestLog::where('id',$request->request_logs_id)->first();
|
||||
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
|
||||
$provideCode = $organization ? $organization->code : '';
|
||||
|
||||
$newClaimRequest = ClaimRequestService::storeClaimRequest(
|
||||
row: [],
|
||||
code: $code,
|
||||
member: $member,
|
||||
paymentType: 'reimbursement',
|
||||
paymentType: 'cashless',
|
||||
serviceCode: $request->service_code,
|
||||
requestLogID: $request->request_logs_id,
|
||||
organization_code: $provideCode,
|
||||
);
|
||||
// Log History
|
||||
$newClaimRequest->histories()->create([
|
||||
@@ -125,13 +133,25 @@ class ClaimRequestController extends Controller
|
||||
|
||||
if ($request->hasFile('additional_files')) {
|
||||
foreach ($request->additional_files as $file) {
|
||||
$pathFile = File::storeFile('additional-files', $newClaimRequest->id, $file);
|
||||
$newClaimRequest->files()->updateOrCreate([
|
||||
$fileData = File::storeFile('additional-files', $request->request_logs_id, $file);
|
||||
// $newClaimRequest->files()->updateOrCreate([
|
||||
// 'type' => 'additional-files',
|
||||
// 'name' => File::getFileName('additional-files', $newClaimRequest->id, $file),
|
||||
// 'original_name' => $file->getClientOriginalName(),
|
||||
// 'extension' => $file->getClientOriginalExtension(),
|
||||
// 'path' => $pathFile,
|
||||
// 'created_by' => auth()->user()->id,
|
||||
// 'updated_by' => auth()->user()->id,
|
||||
// ]);
|
||||
File::updateOrCreate([
|
||||
'fileable_type' => 'App\Models\RequestLog',
|
||||
'fileable_id' => $request->request_logs_id,
|
||||
'type' => 'additional-files',
|
||||
'name' => File::getFileName('additional-files', $newClaimRequest->id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -228,21 +248,35 @@ class ClaimRequestController extends Controller
|
||||
return $claimRequest;
|
||||
}
|
||||
|
||||
public static function getNextCode()
|
||||
public static function getNextCode($request_log_id = 0)
|
||||
{
|
||||
$last_number = ClaimRequest::withTrashed()->max('code');
|
||||
$last_number_parts = explode('-', $last_number);
|
||||
$next_number = count($last_number_parts) < 3 ? 1 : ((int) $last_number_parts[2] + 1);
|
||||
return self::makeCode($next_number);
|
||||
$last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code'))
|
||||
->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"')
|
||||
->value('max_numeric_code');
|
||||
// $next_number = 1;
|
||||
if ($last_numeric_code) {
|
||||
// // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir
|
||||
// $parts = explode('-', $last_code);
|
||||
// $last_number = (int) end($parts);
|
||||
$next_number = $last_numeric_code + 1;
|
||||
} else {
|
||||
$next_number = 1;
|
||||
}
|
||||
return self::makeCode($next_number, $request_log_id);
|
||||
}
|
||||
|
||||
public static function makeCode($next_number)
|
||||
public static function makeCode($next_number, $request_log_id)
|
||||
{
|
||||
// Pastikan $next_number adalah integer positif
|
||||
$next_number = max(1, (int) $next_number);
|
||||
|
||||
$requestLogData = RequestLog::where('id', $request_log_id)->first();
|
||||
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
|
||||
$provideCode = $organization ? $organization->code : '';
|
||||
$member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first();
|
||||
$sparator = '.';
|
||||
$date = date('ymd');
|
||||
// Menghasilkan kode dengan format yang diinginkan
|
||||
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
|
||||
return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
public function get_claim_requests(Request $request)
|
||||
@@ -411,15 +445,16 @@ class ClaimRequestController extends Controller
|
||||
|
||||
if ($request->hasFile('fileDiagnosis')) {
|
||||
foreach ($request->fileDiagnosis as $file) {
|
||||
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
|
||||
$fileData = File::storeFile('claim-diagnosis', $claim_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-diagnosis',
|
||||
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -428,12 +463,12 @@ class ClaimRequestController extends Controller
|
||||
|
||||
if ($request->hasFile('fileKondisis')) {
|
||||
foreach ($request->fileKondisis as $file) {
|
||||
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
|
||||
$fileData = File::storeFile('claim-kondisi', $claim_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-kondisi',
|
||||
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
@@ -445,15 +480,16 @@ class ClaimRequestController extends Controller
|
||||
|
||||
if ($request->hasFile('fileResults')) {
|
||||
foreach ($request->fileResults as $file) {
|
||||
$pathFile = File::storeFile('claim-result', $claim_id, $file);
|
||||
$fileData = File::storeFile('claim-result', $claim_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type'=>'App\Models\ClaimRequest',
|
||||
'fileable_id' => $claim_id,
|
||||
'type' => 'claim-result',
|
||||
'name' => File::getFileName('claim-result', $claim_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
|
||||
122
Modules/HospitalPortal/Http/Controllers/Api/MemberController.php
Normal file → Executable file
122
Modules/HospitalPortal/Http/Controllers/Api/MemberController.php
Normal file → Executable file
@@ -10,6 +10,9 @@ use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Modules\HospitalPortal\Helpers\ApiResponse;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Models\CorporateBenefit;
|
||||
use App\Models\MemberPlan;
|
||||
use App\Models\Plan;
|
||||
|
||||
class MemberController extends Controller
|
||||
{
|
||||
@@ -44,12 +47,12 @@ class MemberController extends Controller
|
||||
->select(
|
||||
'members.id',
|
||||
'members.name',
|
||||
'members.member_id',
|
||||
'members.member_id',
|
||||
'member_policies.policy_id',
|
||||
'persons.nik',
|
||||
'members.email',
|
||||
'members.birth_date',
|
||||
'members.gender',
|
||||
'persons.nik',
|
||||
'members.email',
|
||||
'members.birth_date',
|
||||
'members.gender',
|
||||
'members.marital_status',
|
||||
'members.language',
|
||||
'members.race',
|
||||
@@ -100,6 +103,10 @@ class MemberController extends Controller
|
||||
// Provider
|
||||
$providers = DB::table('organizations')
|
||||
->where('organizations.type', '=', 'hospital')
|
||||
->where('organizations.corporate_id_partner', '!=', 8)
|
||||
->orWhere('organizations.corporate_id_partner', NULL)
|
||||
->where('status', '=', 'active')
|
||||
->orderBy('organizations.name','asc')
|
||||
->select(
|
||||
'organizations.id',
|
||||
'organizations.name'
|
||||
@@ -108,14 +115,115 @@ class MemberController extends Controller
|
||||
|
||||
$res_data['providers'] = $providers;
|
||||
|
||||
|
||||
//company
|
||||
$companies = DB::table('corporates')
|
||||
->where('corporates.active', '=', 1)
|
||||
->select(
|
||||
'corporates.id',
|
||||
'corporates.name'
|
||||
)
|
||||
->get();
|
||||
|
||||
$res_data['companies'] = $companies;
|
||||
|
||||
//company
|
||||
$companies = DB::table('corporates')
|
||||
->where('corporates.active', '=', 1)
|
||||
->select(
|
||||
'corporates.id',
|
||||
'corporates.name'
|
||||
)
|
||||
->get();
|
||||
|
||||
$res_data['companies'] = $companies;
|
||||
|
||||
$corporateEmployee = DB::table('corporate_employees')
|
||||
->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id')
|
||||
->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id')
|
||||
// ->where('corporate_employees.status', 'ACTIVE')
|
||||
->where('corporates.active', 1)
|
||||
->where('corporate_policies.active', 1)
|
||||
->where('corporate_employees.member_id', $members->id)
|
||||
->select(
|
||||
'corporate_policies.total_premi',
|
||||
'corporate_employees.corporate_id'
|
||||
)
|
||||
->first();
|
||||
|
||||
$res_data['total_premi'] = $corporateEmployee ?? 0;
|
||||
|
||||
$limitRules = DB::table('member_plans')
|
||||
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
|
||||
->where('member_plans.member_id', $members->id)
|
||||
->where('member_plans.status', 'active')
|
||||
->where('plans.active', 1)
|
||||
->value('plans.limit_rules');
|
||||
|
||||
$res_data['limit_rules'] = $limitRules ?? 0;
|
||||
|
||||
$planMember = MemberPlan::where('member_id', $members->id)->get('plan_id');
|
||||
|
||||
$planId = Plan::whereIn('id', $planMember)->where('service_code', 'OP')->first();
|
||||
$benefit = CorporateBenefit::with(['benefit', 'plan'])->where('plan_id', $planId->id)->get()->toArray();
|
||||
$benefitData = [];
|
||||
if (count($benefit)){
|
||||
foreach($benefit as $data){
|
||||
$data['benefit']['plan_id'] = $data['plan_id'];
|
||||
$data['benefit']['limit_amount'] = $data['limit_amount'];
|
||||
$data['benefit']['family_plan'] = $planId->family_plan;
|
||||
$data['benefit']['max_frequency_period'] = $data['max_frequency_period'];
|
||||
$data['benefit']['limit_amount_plan'] = $data['plan']['limit_rules'];
|
||||
$data['benefit']['family_plan_plans'] = $data['plan']['family_plan'];
|
||||
array_push($benefitData, $data['benefit']);
|
||||
}
|
||||
}
|
||||
$memberUsage = Helper::getUsageMember($corporateEmployee->corporate_id, $members->id, $benefitData);;
|
||||
|
||||
$res_data['used_limit'] = json_decode($memberUsage);
|
||||
|
||||
$usedLimit = json_decode($memberUsage, true); // jadi array
|
||||
|
||||
$totalUsed = 0;
|
||||
|
||||
if (is_array($usedLimit)) {
|
||||
foreach ($usedLimit as $value) {
|
||||
$totalUsed += (int) $value;
|
||||
}
|
||||
}
|
||||
|
||||
$limitRules = (int) $limitRules;
|
||||
|
||||
// hitung sisa
|
||||
$remainingLimit = $limitRules - $totalUsed;
|
||||
|
||||
// biar gak minus
|
||||
if ($remainingLimit < 0) {
|
||||
$remainingLimit = 0;
|
||||
}
|
||||
|
||||
// set ke response
|
||||
$res_data['remaining_limit'] = $remainingLimit;
|
||||
$res_data['total_used_limit'] = $totalUsed;
|
||||
|
||||
// specialities
|
||||
$specialities = DB::table('specialities')
|
||||
->select(
|
||||
'specialities.id',
|
||||
'specialities.name'
|
||||
)
|
||||
->orderBy('specialities.name','asc')
|
||||
->get();
|
||||
|
||||
$res_data['specialities'] = $specialities;
|
||||
|
||||
|
||||
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
0
Modules/HospitalPortal/Http/Controllers/Api/NotificationController.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Controllers/Api/NotificationController.php
Normal file → Executable file
@@ -0,0 +1,661 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\HospitalPortal\Http\Controllers\Api;
|
||||
|
||||
use App\Models\Benefit;
|
||||
use App\Models\Claim;
|
||||
use App\Models\CorporateBenefit;
|
||||
use App\Models\Member;
|
||||
use App\Models\MemberPlan;
|
||||
use App\Models\Organization;
|
||||
use App\Models\Provider;
|
||||
use App\Models\RequestLog;
|
||||
use App\Models\RequestLogBenefit;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Str;
|
||||
use PDF;
|
||||
use Throwable;
|
||||
|
||||
class ProviderOnlineController extends Controller
|
||||
{
|
||||
public function addHeaderKey(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'kodeprovider' => 'required|string',
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
'status' => 'required|string',
|
||||
'header_token' => 'required|string',
|
||||
'namaprovider' => 'required|string',
|
||||
]);
|
||||
|
||||
$organization = Organization::query()->firstOrCreate(
|
||||
['code' => $request->kodeprovider],
|
||||
[
|
||||
'name' => $request->namaprovider,
|
||||
'status' => 'active',
|
||||
]
|
||||
);
|
||||
|
||||
if ((string) $organization->name !== (string) $request->namaprovider) {
|
||||
$organization->name = $request->namaprovider;
|
||||
$organization->save();
|
||||
}
|
||||
|
||||
$provider = Provider::query()->firstOrNew([
|
||||
'organization_id' => $organization->id,
|
||||
'username' => $request->username,
|
||||
]);
|
||||
|
||||
$provider->password = Hash::make($request->password);
|
||||
$provider->code = $request->kodeprovider;
|
||||
$provider->status = $request->status;
|
||||
$provider->header_token = $request->header_token;
|
||||
$provider->token = $provider->token ?: Str::random(64);
|
||||
$provider->save();
|
||||
|
||||
return response()->json([
|
||||
'header-token' => $provider->header_token,
|
||||
'userid' => $provider->id,
|
||||
'usertoken' => $provider->token,
|
||||
'kodeprovider' => $organization->code,
|
||||
'namaprovider' => $organization->name,
|
||||
'errornumber' => 0,
|
||||
'messagestring' => 'Success',
|
||||
]);
|
||||
}
|
||||
|
||||
public function getHeaderKey(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
]);
|
||||
|
||||
$organization = Organization::query()->where('code', $request->kodeprovider)->first();
|
||||
if (!$organization) {
|
||||
return $this->headerError('Kode provider tidak ditemukan');
|
||||
}
|
||||
|
||||
$provider = Provider::query()->firstOrNew([
|
||||
'organization_id' => $organization->id,
|
||||
'username' => $request->username,
|
||||
]);
|
||||
|
||||
if ($provider->exists) {
|
||||
$isPasswordValid = Hash::check($request->password, $provider->password) || $provider->password === $request->password;
|
||||
if (!$isPasswordValid) {
|
||||
return $this->headerError('Username atau password tidak valid');
|
||||
}
|
||||
} else {
|
||||
$provider->password = Hash::make($request->password);
|
||||
}
|
||||
|
||||
$provider->code = $request->kodeprovider;
|
||||
$provider->status = 'active';
|
||||
$provider->header_token = Str::random(64);
|
||||
$provider->token = Str::random(64);
|
||||
$provider->save();
|
||||
|
||||
return response()->json([
|
||||
'header-token' => $provider->header_token,
|
||||
'userid' => $provider->id,
|
||||
'usertoken' => $provider->token,
|
||||
'kodeprovider' => $organization->code,
|
||||
'namaprovider' => $organization->name,
|
||||
'errornumber' => 0,
|
||||
'messagestring' => 'Success',
|
||||
]);
|
||||
}
|
||||
|
||||
public function checkEligibilitasPeserta(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'nokartu' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$member = Member::query()
|
||||
->with(['person', 'currentCorporate', 'currentPolicy', 'memberPlans.plan'])
|
||||
->where('member_id', $request->nokartu)
|
||||
->first();
|
||||
|
||||
if (!$member) {
|
||||
return $this->statusError('Peserta tidak ditemukan');
|
||||
}
|
||||
|
||||
$planIds = $member->memberPlans
|
||||
->pluck('plan_id')
|
||||
->filter()
|
||||
->unique()
|
||||
->values();
|
||||
|
||||
$benefits = collect();
|
||||
if ($planIds->isNotEmpty()) {
|
||||
$benefits = CorporateBenefit::query()
|
||||
->with(['benefit', 'plan'])
|
||||
->whereIn('plan_id', $planIds)
|
||||
->get()
|
||||
->map(function (CorporateBenefit $corporateBenefit) {
|
||||
return [
|
||||
// Keep response keys unchanged, but fill with sub-benefit data
|
||||
'kodebenefit' => optional($corporateBenefit->benefit)->code,
|
||||
'namabenefit' => optional($corporateBenefit->benefit)->description,
|
||||
'planid' => optional($corporateBenefit->plan)->code,
|
||||
];
|
||||
})
|
||||
->filter(function (array $item) {
|
||||
return !empty($item['kodebenefit']);
|
||||
})
|
||||
->values();
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [
|
||||
'nokartu' => $member->member_id,
|
||||
'memberid' => (string) $member->id,
|
||||
'namapeserta' => $member->full_name,
|
||||
'nomorbpjs' => $member->bpjs_id,
|
||||
'jeniskelamin' => $member->gender_code,
|
||||
'tanggallahir' => $this->isoDate($member->birth_date),
|
||||
'hubungankeluarga' => $member->relation_with_principal,
|
||||
'namaperusahaan' => optional($member->currentCorporate)->name,
|
||||
'pesertavip' => 'N',
|
||||
'namapenjamin' => optional($organization)->name,
|
||||
'nomorpolis' => optional($member->currentPolicy)->code,
|
||||
'tglmulaipolis' => $this->isoDate(optional($member->currentPolicy)->start),
|
||||
'tglberakhirpolis' => $this->isoDate(optional($member->currentPolicy)->end),
|
||||
'phone' => optional($member->person)->phone,
|
||||
'email' => $member->email,
|
||||
],
|
||||
'Benefit' => $benefits,
|
||||
]);
|
||||
}
|
||||
|
||||
public function createPendaftaran(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'kodeprovider' => 'required|string',
|
||||
'kodebenefit' => 'required|string',
|
||||
'statusrujukan' => 'nullable|string',
|
||||
'nomorrujukan' => 'nullable|string',
|
||||
'keterangan' => 'nullable|string',
|
||||
'nomorsep' => 'nullable|string',
|
||||
'nokartu' => 'required|string',
|
||||
'kelaskamar' => 'nullable|string',
|
||||
'cobbpjs' => 'nullable|numeric',
|
||||
'notransaksiprovider' => 'nullable|string',
|
||||
'inacbgscode' => 'nullable|string',
|
||||
'inacbgsamount' => 'nullable|numeric',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$member = Member::query()
|
||||
->with(['person', 'currentCorporate', 'currentPolicy'])
|
||||
->where('member_id', $request->nokartu)
|
||||
->first();
|
||||
if (!$member) {
|
||||
return $this->statusError('Peserta tidak ditemukan');
|
||||
}
|
||||
|
||||
$plan = $this->resolvePlan($member, $request->kodebenefit);
|
||||
$generatedLogCode = $this->generateNextRequestLogCode($organization, $member);
|
||||
|
||||
$requestLog = RequestLog::query()->create([
|
||||
'code' => $generatedLogCode,
|
||||
'organization_id' => $organization->id,
|
||||
'member_id' => $member->id,
|
||||
'plan_id' => optional($plan)->id,
|
||||
'policy_id' => optional($member->currentPolicy)->id ?? 0,
|
||||
'payment_type' => 'cashless',
|
||||
'service_code' => $request->kodebenefit,
|
||||
'type_of_member' => 'member',
|
||||
'status' => 'approved',
|
||||
'source' => 'api',
|
||||
'keterangan' => $request->keterangan,
|
||||
'hak_kamar_pasien' => $request->kelaskamar ?? '',
|
||||
'penempatan_kamar' => $request->kelaskamar,
|
||||
'total_cob' => $request->cobbpjs,
|
||||
'nominal' => 0,
|
||||
'import_system' => 0,
|
||||
'nomor_sep' => $request->nomorsep,
|
||||
'inacbgs_code' => $request->inacbgscode,
|
||||
'inacbgs_amount' => $request->inacbgsamount,
|
||||
'no_transaksi_provider' => $request->notransaksiprovider,
|
||||
'diagnosis' => '',
|
||||
'reason' => '',
|
||||
'reason_final' => '',
|
||||
'catatan' => '',
|
||||
'nomor_rujukan' => $request->nomorrujukan,
|
||||
'status_rujukan' => $request->statusrujukan,
|
||||
'submission_date' => now(),
|
||||
'admission_date' => now(),
|
||||
]);
|
||||
|
||||
$limitSubBenefit = collect();
|
||||
if ($plan) {
|
||||
$limitSubBenefit = CorporateBenefit::query()
|
||||
->with('benefit')
|
||||
->where('plan_id', $plan->id)
|
||||
->get()
|
||||
->map(function (CorporateBenefit $corporateBenefit) {
|
||||
return [
|
||||
'kodesubbenefit' => optional($corporateBenefit->benefit)->code,
|
||||
'namasubbenefit' => optional($corporateBenefit->benefit)->description,
|
||||
'batasan' => (string) ($corporateBenefit->limit_amount ?? 0),
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [[
|
||||
'noklaim' => $requestLog->code,
|
||||
'namapeserta' => $member->full_name,
|
||||
'tanggallahir' => $this->isoDate($member->birth_date),
|
||||
'nokartu' => $member->member_id,
|
||||
'nopolis' => optional($member->currentPolicy)->code,
|
||||
'nobpjs' => $member->bpjs_id,
|
||||
'nosep' => $requestLog->nomor_sep,
|
||||
'nomorrujukan' => $requestLog->nomor_rujukan,
|
||||
'planid' => optional($plan)->code,
|
||||
'masapolis' => optional($member->currentPolicy)->end ? Carbon::parse($member->currentPolicy->end)->format('d/m/Y') : null,
|
||||
'namaperusahaan' => optional($member->currentCorporate)->name,
|
||||
'namapenjamin' => $organization->name,
|
||||
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
|
||||
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
|
||||
'hakkamar' => $requestLog->penempatan_kamar,
|
||||
'hakicu' => null,
|
||||
'nosuratjaminan' => $requestLog->code,
|
||||
'namapegawai' => null,
|
||||
'namabenefit' => optional($plan)->corporate_plan_id,
|
||||
'kodediagnosa' => $requestLog->diagnosis,
|
||||
'keterangan' => $requestLog->keterangan,
|
||||
'catatanTC1' => null,
|
||||
'catatanTC2' => null,
|
||||
'catatanTC3' => null,
|
||||
'catatanTC4' => null,
|
||||
'catatanTC5' => null,
|
||||
'catatanTC6' => null,
|
||||
'catatanTC7' => null,
|
||||
'catatanTC8' => null,
|
||||
'catatanTC9' => null,
|
||||
'catatanTC10' => null,
|
||||
'statusrujukan' => $requestLog->status_rujukan,
|
||||
'statusklaim' => 0,
|
||||
'notransaksiprovider' => $requestLog->no_transaksi_provider,
|
||||
'inacbgscode' => $requestLog->inacbgs_code,
|
||||
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
|
||||
]],
|
||||
'LimitSubBenefit' => $limitSubBenefit->values(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function createPengesahan(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'noklaim' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
'tanggalkeluar' => 'nullable|date',
|
||||
'kodediagnosa' => 'nullable|string',
|
||||
'inacbgscode' => 'nullable|string',
|
||||
'inacbgsamount' => 'nullable|numeric',
|
||||
'daftarbiaya' => 'nullable|array',
|
||||
'daftarbiaya.*.kodesubbenefit' => 'required_with:daftarbiaya|string',
|
||||
'daftarbiaya.*.biayaaju' => 'required_with:daftarbiaya|numeric',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$requestLog = RequestLog::query()
|
||||
->with(['member.person', 'member.currentCorporate', 'member.currentPolicy', 'plan'])
|
||||
->where('code', $request->noklaim)
|
||||
->where('organization_id', $organization->id)
|
||||
->first();
|
||||
if (!$requestLog) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
$requestLog->update([
|
||||
'status_final_log' => 'approved',
|
||||
'final_log' => true,
|
||||
'discharge_date' => $request->tanggalkeluar,
|
||||
'diagnosis' => $request->kodediagnosa,
|
||||
'inacbgs_code' => $request->inacbgscode ?? $requestLog->inacbgs_code,
|
||||
'inacbgs_amount' => $request->inacbgsamount ?? $requestLog->inacbgs_amount,
|
||||
]);
|
||||
|
||||
foreach (($request->daftarbiaya ?? []) as $biaya) {
|
||||
$benefit = Benefit::query()->where('code', $biaya['kodesubbenefit'])->first();
|
||||
if (!$benefit) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RequestLogBenefit::query()->updateOrCreate(
|
||||
[
|
||||
'request_log_id' => $requestLog->id,
|
||||
'benefit_id' => $benefit->id,
|
||||
],
|
||||
[
|
||||
'amount_incurred' => $biaya['biayaaju'],
|
||||
'amount_approved' => 0,
|
||||
'amount_not_approved' => 0,
|
||||
'excess_paid' => 0,
|
||||
'keterangan' => null,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
$requestLog->load(['requestLogBenefits.benefit']);
|
||||
|
||||
$biayaResponse = $requestLog->requestLogBenefits->map(function (RequestLogBenefit $requestLogBenefit) use ($requestLog) {
|
||||
return [
|
||||
'noklaim' => $requestLog->code,
|
||||
'kodesubbenefit' => optional($requestLogBenefit->benefit)->code,
|
||||
'namasubbenefit' => optional($requestLogBenefit->benefit)->description,
|
||||
'kodebenefit' => optional($requestLog->plan)->code,
|
||||
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
|
||||
'biayaaju' => (float) ($requestLogBenefit->amount_incurred ?? 0),
|
||||
'jaminanasuransi' => (float) ($requestLogBenefit->amount_approved ?? 0),
|
||||
'jaminanpeserta' => (float) ($requestLogBenefit->excess_paid ?? 0),
|
||||
'keterangan' => $requestLogBenefit->keterangan,
|
||||
];
|
||||
})->values();
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [[
|
||||
'noklaim' => $requestLog->code,
|
||||
'namapeserta' => optional($requestLog->member)->full_name,
|
||||
'tanggallahir' => $this->isoDate(optional($requestLog->member)->birth_date),
|
||||
'nokartu' => optional($requestLog->member)->member_id,
|
||||
'nopolis' => optional(optional($requestLog->member)->currentPolicy)->code,
|
||||
'nobpjs' => optional($requestLog->member)->bpjs_id,
|
||||
'nosep' => $requestLog->nomor_sep,
|
||||
'nomorrujukan' => $requestLog->nomor_rujukan,
|
||||
'planid' => optional($requestLog->plan)->code,
|
||||
'masapolis' => optional(optional($requestLog->member)->currentPolicy)->end ? Carbon::parse($requestLog->member->currentPolicy->end)->format('d/m/Y') : null,
|
||||
'namaperusahaan' => optional(optional($requestLog->member)->currentCorporate)->name,
|
||||
'namapenjamin' => $organization->name,
|
||||
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
|
||||
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
|
||||
'hakkamar' => $requestLog->penempatan_kamar,
|
||||
'hakicu' => null,
|
||||
'nosuratjaminan' => $requestLog->code,
|
||||
'namapegawai' => null,
|
||||
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
|
||||
'kodediagnosa' => $requestLog->diagnosis,
|
||||
'keterangan' => $requestLog->keterangan,
|
||||
'catatanTC1' => null,
|
||||
'catatanTC2' => null,
|
||||
'catatanTC3' => null,
|
||||
'catatanTC4' => null,
|
||||
'catatanTC5' => null,
|
||||
'catatanTC6' => null,
|
||||
'catatanTC7' => null,
|
||||
'catatanTC8' => null,
|
||||
'catatanTC9' => null,
|
||||
'catatanTC10' => null,
|
||||
'statusrujukan' => $requestLog->status_rujukan,
|
||||
'statusklaim' => 0,
|
||||
'notransaksiprovider' => $requestLog->no_transaksi_provider,
|
||||
'inacbgscode' => $requestLog->inacbgs_code,
|
||||
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
|
||||
]],
|
||||
'Biaya' => $biayaResponse,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getRincianBiayaKlaim(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'noklaim' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$requestLog = RequestLog::query()
|
||||
->with(['plan', 'requestLogBenefits.benefit'])
|
||||
->where('code', $request->noklaim)
|
||||
->where('organization_id', $organization->id)
|
||||
->first();
|
||||
if (!$requestLog) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
$biaya = $requestLog->requestLogBenefits->map(function (RequestLogBenefit $requestLogBenefit) use ($requestLog) {
|
||||
return [
|
||||
'noklaim' => $requestLog->code,
|
||||
'kodesubbenefit' => optional($requestLogBenefit->benefit)->code,
|
||||
'namasubbenefit' => optional($requestLogBenefit->benefit)->description,
|
||||
'kodebenefit' => optional($requestLog->plan)->code,
|
||||
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
|
||||
'biayaaju' => (float) ($requestLogBenefit->amount_incurred ?? 0),
|
||||
'jaminanasuransi' => (float) ($requestLogBenefit->amount_approved ?? 0),
|
||||
'jaminanpeserta' => (float) ($requestLogBenefit->excess_paid ?? 0),
|
||||
'keterangan' => $requestLogBenefit->keterangan,
|
||||
];
|
||||
})->values();
|
||||
|
||||
return response()->json([
|
||||
'Status' => $this->okStatus(),
|
||||
'Data' => [
|
||||
'noklaim' => $requestLog->code,
|
||||
'kodeprovider' => $organization->code,
|
||||
'nosep' => $requestLog->nomor_sep,
|
||||
'keterangan' => $requestLog->keterangan,
|
||||
'statusklaim' => $requestLog->status,
|
||||
],
|
||||
'Biaya' => $biaya,
|
||||
]);
|
||||
}
|
||||
|
||||
public function downloadStrukPendaftaran(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'noklaim' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
|
||||
if (!$requestLog) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
try {
|
||||
$requestLogController = new RequestLogController();
|
||||
return $requestLogController->downlodLog($requestLog->id);
|
||||
} catch (Throwable $e) {
|
||||
$fallbackUrl = url('api/v1/hospitalportal/download-log/' . $requestLog->id);
|
||||
return $this->statusError(
|
||||
'Gagal generate PDF struk pendaftaran: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||
500
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function downloadStrukPengesahan(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'noklaim' => 'required|string',
|
||||
'kodeprovider' => 'required|string',
|
||||
'p_user_no' => 'required',
|
||||
'p_token' => 'required|string',
|
||||
]);
|
||||
|
||||
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
|
||||
if ($authError) {
|
||||
return $authError;
|
||||
}
|
||||
|
||||
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
|
||||
if (!$requestLog) {
|
||||
return $this->statusError('Nomor klaim tidak ditemukan');
|
||||
}
|
||||
|
||||
try {
|
||||
$requestLogController = new RequestLogController();
|
||||
return $requestLogController->downlodFinalLog($requestLog->id);
|
||||
} catch (Throwable $e) {
|
||||
$fallbackUrl = url('api/v1/hospitalportal/download-final-log/' . $requestLog->id);
|
||||
return $this->statusError(
|
||||
'Gagal generate PDF struk pengesahan: ' . $e->getMessage() . '. request_log_id=' . $requestLog->id . ', fallback_url=' . $fallbackUrl,
|
||||
500
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private function resolveProvider(string $kodeProvider, $userId, string $token): array
|
||||
{
|
||||
$organization = Organization::query()->where('code', $kodeProvider)->first();
|
||||
if (!$organization) {
|
||||
return [null, null, $this->statusError('Kode provider tidak ditemukan')];
|
||||
}
|
||||
|
||||
$provider = Provider::query()
|
||||
->where('id', $userId)
|
||||
->where('organization_id', $organization->id)
|
||||
->where('code', $kodeProvider)
|
||||
->where('status', 'active')
|
||||
->first();
|
||||
if (!$provider) {
|
||||
return [null, null, $this->statusError('User provider tidak ditemukan')];
|
||||
}
|
||||
|
||||
if ((string) $provider->token !== (string) $token) {
|
||||
return [null, null, $this->statusError('Token tidak valid')];
|
||||
}
|
||||
|
||||
return [$provider, $organization, null];
|
||||
}
|
||||
|
||||
private function resolvePlan(Member $member, string $serviceCode)
|
||||
{
|
||||
$memberPlan = $member->memberPlans()->with('plan')
|
||||
->where('status', 'active')
|
||||
->orderByDesc('id')
|
||||
->get()
|
||||
->first(function (MemberPlan $item) use ($serviceCode) {
|
||||
return optional($item->plan)->service_code === $serviceCode;
|
||||
});
|
||||
|
||||
if ($memberPlan && $memberPlan->plan) {
|
||||
return $memberPlan->plan;
|
||||
}
|
||||
|
||||
return optional($member->memberPlans()->with('plan')->orderByDesc('id')->first())->plan;
|
||||
}
|
||||
|
||||
private function okStatus(): array
|
||||
{
|
||||
return [
|
||||
'errornumber' => 0,
|
||||
'messagestring' => 'Success',
|
||||
];
|
||||
}
|
||||
|
||||
private function statusError(string $message, int $statusCode = 400)
|
||||
{
|
||||
return response()->json([
|
||||
'Status' => [
|
||||
'errornumber' => 1,
|
||||
'messagestring' => $message,
|
||||
],
|
||||
'Data' => null,
|
||||
], $statusCode);
|
||||
}
|
||||
|
||||
private function headerError(string $message, int $statusCode = 400)
|
||||
{
|
||||
return response()->json([
|
||||
'header-token' => null,
|
||||
'userid' => 0,
|
||||
'usertoken' => null,
|
||||
'kodeprovider' => null,
|
||||
'namaprovider' => null,
|
||||
'errornumber' => 1,
|
||||
'messagestring' => $message,
|
||||
], $statusCode);
|
||||
}
|
||||
|
||||
private function isoDate($date): ?string
|
||||
{
|
||||
if (empty($date)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Carbon::parse($date)->toISOString();
|
||||
}
|
||||
|
||||
private function generateNextRequestLogCode(Organization $organization, Member $member): string
|
||||
{
|
||||
$data = [
|
||||
'source' => 'H',
|
||||
'provideCode' => $organization->code ?? '',
|
||||
'date' => date('ymd'),
|
||||
'policy' => optional($member->currentPolicy)->code ?? '-',
|
||||
'member_code' => $member->member_id ?? '-',
|
||||
];
|
||||
|
||||
$lastNumericCode = RequestLog::query()
|
||||
->select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code'))
|
||||
->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"')
|
||||
->value('max_numeric_code');
|
||||
|
||||
$nextNumber = $lastNumericCode ? ((int) $lastNumericCode + 1) : 1;
|
||||
|
||||
return $this->makeRequestLogCode($nextNumber, $data);
|
||||
}
|
||||
|
||||
private function makeRequestLogCode(int $nextNumber, array $data): string
|
||||
{
|
||||
$nextNumber = max(1, $nextNumber);
|
||||
|
||||
return implode('.', [
|
||||
'LOG',
|
||||
$data['source'],
|
||||
$data['provideCode'],
|
||||
$data['date'],
|
||||
$data['policy'],
|
||||
$data['member_code'],
|
||||
str_pad((string) $nextNumber, 5, '0', STR_PAD_LEFT),
|
||||
]);
|
||||
}
|
||||
}
|
||||
538
Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php
Normal file → Executable file
538
Modules/HospitalPortal/Http/Controllers/Api/RequestLogController.php
Normal file → Executable file
@@ -13,6 +13,11 @@ use App\Models\File;
|
||||
use Dompdf\Dompdf;
|
||||
use Dompdf\Options;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use App\Models\Member;
|
||||
use App\Models\RequestLog;
|
||||
use App\Models\Organization;
|
||||
use App\Services\ClaimRequestService;
|
||||
use App\Models\ClaimRequest;
|
||||
|
||||
class RequestLogController extends Controller
|
||||
{
|
||||
@@ -20,32 +25,49 @@ class RequestLogController extends Controller
|
||||
* Display a listing of the resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
private static $code_prefix = 'CLAIM';
|
||||
public function requestLog(Request $request)
|
||||
{
|
||||
$data = [
|
||||
'member_id' => $request->member_id,
|
||||
'service_code' => $request->service_code,
|
||||
'organization_id' => $request->organization_id,
|
||||
'organization_name' => $request->organization_name,
|
||||
'address_provider' => $request->address_provider
|
||||
'organization_name' => !empty($request->organization_name) ? $request->organization_name : null,
|
||||
'address_provider' => !empty($request->address_provider) ? $request->address_provider : null,
|
||||
'submission_date' => $request->submission_date,
|
||||
'corporate_id_partner' => !empty($request->corporate_id_partner) ? $request->corporate_id_partner : [],
|
||||
'specialities_id' => $request->specialities_id,
|
||||
'dppj' => $request->dppj
|
||||
];
|
||||
$validator = Validator::make($request->all(), [
|
||||
'member_id' => 'required',
|
||||
'service_code' => 'required'
|
||||
'service_code' => 'required',
|
||||
'submission_date' => 'required',
|
||||
'specialities_id' => 'required',
|
||||
'dppj' => 'required',
|
||||
], [
|
||||
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
|
||||
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
|
||||
'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']),
|
||||
'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']),
|
||||
'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']),
|
||||
]);
|
||||
if($request->organization_id)
|
||||
if(!empty($request->organization_id))
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'organization_id' => 'required',
|
||||
'member_id' => 'required',
|
||||
'service_code' => 'required'
|
||||
'service_code' => 'required',
|
||||
'submission_date' => 'required',
|
||||
'specialities_id' => 'required',
|
||||
'dppj' => 'required',
|
||||
], [
|
||||
'organization_id.required' => trans('Validation.required',['attribute' => 'Provider ID']),
|
||||
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
|
||||
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
|
||||
'submission_date.required' => trans('Validation.required',['attribute' => 'Submission Date']),
|
||||
'specialities_id.required' => trans('Validation.required',['attribute' => 'Specialities']),
|
||||
'dppj.required' => trans('Validation.required',['attribute' => 'DPJP']),
|
||||
]);
|
||||
}
|
||||
if ($validator->fails())
|
||||
@@ -56,7 +78,7 @@ class RequestLogController extends Controller
|
||||
{
|
||||
//insert data to organization
|
||||
try {
|
||||
if(!$request->organization_id)
|
||||
if (!empty($request->organization_name) && !empty($request->address_provider))
|
||||
{
|
||||
// Memulai transaksi
|
||||
DB::beginTransaction();
|
||||
@@ -66,7 +88,7 @@ class RequestLogController extends Controller
|
||||
$words = explode(' ', $request->organization_name);
|
||||
|
||||
foreach ($words as $word) {
|
||||
$singkatan .= strtoupper(substr($word, 0, 1));
|
||||
$singkatan .= strtoupper(substr($word, 0, 2));
|
||||
}
|
||||
|
||||
// Membuat kode organisasi
|
||||
@@ -78,6 +100,7 @@ class RequestLogController extends Controller
|
||||
'name' => $request->organization_name,
|
||||
'code' => $kodeOrganisasi,
|
||||
'type' => 'hospital',
|
||||
'corporate_id_partner' => $request->corporate_id_partner ? implode(',', $request->corporate_id_partner) : null,
|
||||
'created_at' => now(),
|
||||
'created_by' => auth()->user()->id
|
||||
]);
|
||||
@@ -104,49 +127,54 @@ class RequestLogController extends Controller
|
||||
}
|
||||
|
||||
$requestLogControllerInstance = new PrimeCenterRequestLog();
|
||||
$response = $requestLogControllerInstance->createNew($request);
|
||||
try {
|
||||
$response = $requestLogControllerInstance->createNew($request);
|
||||
|
||||
if($response->original['statusCode'] == 200)
|
||||
{
|
||||
//send email
|
||||
// Insert data notifications
|
||||
$emailTo = 'alarm.center@linksehat.com';
|
||||
$dataNotif = [
|
||||
'email' => $emailTo,
|
||||
'title' => 'Request LOG',
|
||||
'description' => 'Request LOG from Hospital Portal',
|
||||
'type' => 1,
|
||||
'isUnRead' => true,
|
||||
'created_by' => auth()->user()->id,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'updated_at' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
$sendNotif = Helper::insertNotification($dataNotif);
|
||||
// Send Email after insert notifications
|
||||
if($sendNotif)
|
||||
if($response->original['statusCode'] == 200)
|
||||
{
|
||||
//send to alarm
|
||||
$nameTo = 'Admin LinkSehat';
|
||||
$dataEmail = [
|
||||
//send email
|
||||
// Insert data notifications
|
||||
$emailTo = 'alarm.center@linksehat.com';
|
||||
$dataNotif = [
|
||||
'email' => $emailTo,
|
||||
'name' => $nameTo,
|
||||
'subject' => 'Request LOG from Hospital Portal'. ' '.date('Y-m-d H:i:s'),
|
||||
'body' => View::make('email/notif_email', ['name' => $nameTo, 'link' => 'https://primecenter.linksehat.com/'])->render(),
|
||||
'title' => 'Request LOG',
|
||||
'description' => 'Request LOG from Hospital Portal',
|
||||
'type' => 1,
|
||||
'isUnRead' => true,
|
||||
'created_by' => auth()->user()->id,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'updated_at' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
Helper::sendEmail($dataEmail);
|
||||
$sendNotif = Helper::insertNotification($dataNotif);
|
||||
// Send Email after insert notifications
|
||||
if($sendNotif)
|
||||
{
|
||||
//send to alarm
|
||||
$nameTo = 'Admin LinkSehat';
|
||||
$dataEmail = [
|
||||
'email' => $emailTo,
|
||||
'name' => $nameTo,
|
||||
'subject' => 'Request LOG from Hospital Portal'. ' '.date('Y-m-d H:i:s'),
|
||||
'body' => View::make('email/notif_email', ['name' => $nameTo, 'link' => 'https://primecenter.linksehat.com/'])->render(),
|
||||
];
|
||||
Helper::sendEmail($dataEmail);
|
||||
}
|
||||
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
|
||||
}
|
||||
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 500);
|
||||
else
|
||||
{
|
||||
return ApiResponse::apiResponse('Server Error 1', $data, trans('Message.server_error'), 500);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Tangani kesalahan di sini
|
||||
return ApiResponse::apiResponse('Server Error 2', $data, $e->getMessage(), 500);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Rollback transaksi jika terjadi kesalahan
|
||||
DB::rollBack();
|
||||
|
||||
// Handle error, bisa di-log atau dikembalikan sebagai response
|
||||
return ApiResponse::apiResponse('Server Error', $data, $e->getMessage(), 500);
|
||||
return ApiResponse::apiResponse('Server Error 3', $data, $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -158,6 +186,7 @@ class RequestLogController extends Controller
|
||||
|
||||
$results = DB::table('request_logs')
|
||||
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
|
||||
->where('request_logs.deleted_at', null)
|
||||
->when($request->input('search'), function ($query, $search) {
|
||||
$query->where(function ($query) use ($search) {
|
||||
$query->orWhere('request_logs.code', 'like', "%" . $search . "%")
|
||||
@@ -205,6 +234,10 @@ class RequestLogController extends Controller
|
||||
'members.name as full_name',
|
||||
'members.member_id as no_polis',
|
||||
'members.birth_date',
|
||||
'request_logs.service_code',
|
||||
'request_logs.specialities_id',
|
||||
'request_logs.dppj',
|
||||
'request_logs.log_type',
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN request_logs.status = "requested" THEN "requested"
|
||||
@@ -217,8 +250,11 @@ class RequestLogController extends Controller
|
||||
DB::raw('
|
||||
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
|
||||
'),
|
||||
'request_logs.submission_date')
|
||||
'request_logs.submission_date',
|
||||
'request_logs.approved_at')
|
||||
->paginate($limit);
|
||||
|
||||
|
||||
return response()->json(Helper::paginateResources($results));
|
||||
}
|
||||
|
||||
@@ -229,12 +265,14 @@ class RequestLogController extends Controller
|
||||
|
||||
$results = DB::table('request_logs')
|
||||
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
|
||||
->where('request_logs.deleted_at', null)
|
||||
->when($request->input('search'), function ($query, $search) {
|
||||
$query->where(function ($query) use ($search) {
|
||||
$query->orWhere('request_logs.code', 'like', "%" . $search . "%")
|
||||
->orWhere('members.name', 'like', "%" . $search . "%")
|
||||
->orWhere('request_logs.submission_date', 'like', "%" . $search . "%")
|
||||
->orWhere('request_logs.service_code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%");
|
||||
->orWhere('request_logs.discharge_date', 'like', "%" . $search . "%")
|
||||
->orWhereRaw('(SELECT services.name FROM services WHERE services.code = request_logs.service_code LIMIT 1) LIKE ?', ["%" . $search . "%"]);
|
||||
});
|
||||
})
|
||||
->when($request->has('orderBy'), function ($query) use ($request) {
|
||||
@@ -279,6 +317,7 @@ class RequestLogController extends Controller
|
||||
'members.id AS member_id',
|
||||
'request_logs.service_code',
|
||||
'members.birth_date',
|
||||
'request_logs.log_type',
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN request_logs.status_final_log = "requested" THEN "requested"
|
||||
@@ -289,12 +328,10 @@ class RequestLogController extends Controller
|
||||
END AS status
|
||||
'),
|
||||
'request_logs.submission_date',
|
||||
'request_logs.approved_final_log_at',
|
||||
'request_logs.discharge_date',
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN service_code = "OP" THEN "Outpatient"
|
||||
WHEN service_code = "IP" THEN "Inpatient"
|
||||
ELSE ""
|
||||
END AS service_type
|
||||
(SELECT services.name FROM services WHERE services.code = request_logs.service_code LIMIT 1) AS service_type
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
|
||||
@@ -309,13 +346,25 @@ class RequestLogController extends Controller
|
||||
|
||||
public function requestFinalLog(Request $request)
|
||||
{
|
||||
Helper::setCustomPHPIniSettings();
|
||||
$data = [
|
||||
'request_logs_id' => $request->request_logs_id
|
||||
'request_logs_id' => $request->request_logs_id,
|
||||
'discharge_date' => $request->discharge_date,
|
||||
];
|
||||
$validator = Validator::make($request->all(), [
|
||||
'request_logs_id' => 'required'
|
||||
'request_logs_id' => 'required',
|
||||
'discharge_date' => 'required',
|
||||
'service_code' => 'required',
|
||||
'result_files.*' => 'sometimes|file|max:10000',
|
||||
'diagnosa_files.*' => 'sometimes|file|max:10000',
|
||||
'kondisi_files.*' => 'sometimes|file|max:10000',
|
||||
], [
|
||||
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID'])
|
||||
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID']),
|
||||
'discharge_date.required' => trans('Validation.required',['attribute' => 'Discharge Date']),
|
||||
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
|
||||
'result_files.*.max' => trans('Validation.max.file', ['attribute' => 'Result Files', 'max' => '10 MB' ]),
|
||||
'diagnosa_files.*.max' => trans('Validation.max.file', ['attribute' => 'Diagnosis Files', 'max' => '10 MB' ]),
|
||||
'kondisi_files.*.max' => trans('Validation.max.file', ['attribute' => 'Condition Files', 'max' => '10 MB' ]),
|
||||
]);
|
||||
if ($validator->fails())
|
||||
{
|
||||
@@ -328,20 +377,27 @@ class RequestLogController extends Controller
|
||||
DB::table('request_logs')
|
||||
->where('request_logs.id', '=', $request->request_logs_id)
|
||||
->update([
|
||||
'status_final_log' => 'requested',
|
||||
'final_log' => 1
|
||||
'status_final_log' => $request->edit ? null : 'requested',
|
||||
'final_log' => $request->edit ? 0 : 1,
|
||||
'service_code' =>$request->service_code,
|
||||
'discharge_date' => $request->discharge_date,
|
||||
'dppj' => $request->dppj,
|
||||
'specialities_id' => $request->spescialis_id,
|
||||
'created_final_by'=> $request->edit ? null : auth()->user()->id,
|
||||
'created_final_at'=> $request->edit ? null : date('Y-m-d H:i:s'),
|
||||
]);
|
||||
if ($request->hasFile('result_files')) {
|
||||
foreach ($request->result_files as $file) {
|
||||
$pathFile = File::storeFile('final-log-result', $request->request_logs_id, $file);
|
||||
$fileData = File::storeFile('final-log-result', $request->request_logs_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type' => 'App\Models\RequestLog',
|
||||
'fileable_id' => $request->request_logs_id,
|
||||
'type' => 'final-log-result',
|
||||
'name' => File::getFileName('final-log-result', $request->request_logs_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -349,15 +405,16 @@ class RequestLogController extends Controller
|
||||
}
|
||||
if ($request->hasFile('diagnosa_files')) {
|
||||
foreach ($request->diagnosa_files as $file) {
|
||||
$pathFile = File::storeFile('final-log-diagnosis', $request->request_logs_id, $file);
|
||||
$fileData = File::storeFile('final-log-diagnosis', $request->request_logs_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type' => 'App\Models\RequestLog',
|
||||
'fileable_id' => $request->request_logs_id,
|
||||
'type' => 'final-log-diagnosis',
|
||||
'name' => File::getFileName('final-log-diagnosis', $request->request_logs_id, $file),
|
||||
'name' => $fileData['name'],
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -365,7 +422,7 @@ class RequestLogController extends Controller
|
||||
}
|
||||
if ($request->hasFile('kondisi_files')) {
|
||||
foreach ($request->kondisi_files as $file) {
|
||||
$pathFile = File::storeFile('final-log-kondisi', $request->request_logs_id, $file);
|
||||
$fileData = File::storeFile('final-log-kondisi', $request->request_logs_id, $file);
|
||||
File::updateOrCreate([
|
||||
'fileable_type' => 'App\Models\RequestLog',
|
||||
'fileable_id' => $request->request_logs_id,
|
||||
@@ -373,7 +430,8 @@ class RequestLogController extends Controller
|
||||
'name' => File::getFileName('final-log-kondisi', $request->request_logs_id, $file),
|
||||
'original_name' => $file->getClientOriginalName(),
|
||||
'extension' => $file->getClientOriginalExtension(),
|
||||
'path' => $pathFile,
|
||||
'source' => env('FILESYSTEM_DISK'),
|
||||
'path' => $fileData['path'],
|
||||
'created_by' => auth()->user()->id,
|
||||
'updated_by' => auth()->user()->id,
|
||||
]);
|
||||
@@ -432,12 +490,13 @@ class RequestLogController extends Controller
|
||||
'members.birth_date',
|
||||
'members.member_id',
|
||||
'members.gender',
|
||||
'corporate_employees.branch_code',
|
||||
DB::raw('
|
||||
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
|
||||
'),
|
||||
DB::raw('
|
||||
"LinkSehat" AS penjamin
|
||||
'),
|
||||
// DB::raw('
|
||||
// "LinkSehat" AS penjamin
|
||||
// '),
|
||||
DB::raw('
|
||||
(Select corporates.name FROM corporates
|
||||
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||
@@ -479,6 +538,7 @@ class RequestLogController extends Controller
|
||||
'members.members_effective_date AS mulai',
|
||||
'members.members_expire_date AS akhir'
|
||||
)
|
||||
->leftJoin('corporate_employees', 'corporate_employees.member_id', '=', 'members.id')
|
||||
->first();
|
||||
$data['namaKaryawan'] = '';
|
||||
if($dataMember->principal_id)
|
||||
@@ -501,11 +561,23 @@ class RequestLogController extends Controller
|
||||
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
|
||||
->where('organizations.id', '=', $dataRequestLog->organization_id)
|
||||
->where('addresses.addressable_type', '=', 'App\Models\Organization')
|
||||
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit')
|
||||
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit', 'organizations.corporate_id_partner')
|
||||
->first();
|
||||
|
||||
$data['rumahSakit'] = $dataRumahSakit;
|
||||
|
||||
//get penjamin
|
||||
$data['penjamin'] = 'LinkSehat';
|
||||
if(!empty($dataRumahSakit->corporate_id_partner))
|
||||
{
|
||||
$corporate_id_partners = explode(',', $dataRumahSakit->corporate_id_partner);
|
||||
$valueToCheck = $dataMember->id_perusahaan;
|
||||
|
||||
if (in_array($valueToCheck, $corporate_id_partners)) {
|
||||
$data['penjamin'] = $dataMember->nama_perusahaan;
|
||||
}
|
||||
}
|
||||
|
||||
$logoPerusahaan = DB::table('files')
|
||||
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
|
||||
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
|
||||
@@ -545,6 +617,49 @@ class RequestLogController extends Controller
|
||||
|
||||
$data['signatureAd'] = $signatureAd;
|
||||
|
||||
$namaPenjaminTtd = $dataMember->nama_perusahaan;
|
||||
|
||||
$isVale = ($logoPerusahaan->code ?? null) === "VALEIND";
|
||||
$ttdNama = '';
|
||||
$ttdJabatan = '';
|
||||
$ttdImage = null;
|
||||
|
||||
if ($isVale) {
|
||||
if (trim($data['penjamin']) === 'LinkSehat') {
|
||||
$ttdNama = 'Fariz Ariyadi';
|
||||
$ttdJabatan = 'Chief Executive Officer';
|
||||
$ttdImage = public_path('images/ttd_fariz.png');
|
||||
$namaPenjaminTtd = 'PT Link Medis Sehat';
|
||||
} else {
|
||||
if ($dataRequestLog->submission_date <= '2025-05-12') {
|
||||
$ttdNama = 'Dr. Hery Hermas, M.Kes';
|
||||
$ttdImage = public_path('images/ttd_dr_vale.png');
|
||||
} else {
|
||||
$ttdNama = 'dr. Irmawati Baso, S. Ked., MM';
|
||||
$ttdImage = public_path('images/ttd_dr_irma_2.png');
|
||||
}
|
||||
$ttdJabatan = 'Offsite Medical Treatment';
|
||||
}
|
||||
} else {
|
||||
$ttdNama = 'Fariz Ariyadi';
|
||||
$ttdJabatan = 'Chief Executive Officer';
|
||||
$ttdImage = public_path('images/ttd_fariz.png');
|
||||
}
|
||||
|
||||
$data['ttdNama'] = $ttdNama;
|
||||
$data['ttdJabatan'] = $ttdJabatan;
|
||||
$data['ttdImage'] = $ttdImage;
|
||||
|
||||
if (!$isVale) {
|
||||
$namaPenjaminTtd = 'Primayan Medicare';
|
||||
}
|
||||
|
||||
$data['namaPenjaminTtd'] = $namaPenjaminTtd;
|
||||
|
||||
if (!$isVale) {
|
||||
$data['penjamin'] = 'Primayan Medicare';
|
||||
}
|
||||
|
||||
$pdf = new Dompdf();
|
||||
|
||||
$options = new Options();
|
||||
@@ -555,25 +670,47 @@ class RequestLogController extends Controller
|
||||
|
||||
$pdf->setPaper('A4', 'portrait');
|
||||
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.req_log_page_1', $data);
|
||||
if (!$isVale) {
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.req_log_page_1_primayan', $data);
|
||||
|
||||
// Halaman 2
|
||||
// $html2 = view('pdf.req_log_page_2', $data);
|
||||
// Halaman 2
|
||||
// $html2 = view('pdf.req_log_page_2', $data);
|
||||
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
// $htmlCombined = $html1 . $html2;
|
||||
$htmlCombined = $html1;
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
// $htmlCombined = $html1 . $html2;
|
||||
$htmlCombined = $html1;
|
||||
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
return response($pdf->output(), 200, $headers);
|
||||
} else {
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.req_log_page_1', $data);
|
||||
|
||||
// Halaman 2
|
||||
// $html2 = view('pdf.req_log_page_2', $data);
|
||||
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
// $htmlCombined = $html1 . $html2;
|
||||
$htmlCombined = $html1;
|
||||
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
}
|
||||
}
|
||||
|
||||
public function downlodFinalLog($request_log_id)
|
||||
@@ -592,12 +729,13 @@ class RequestLogController extends Controller
|
||||
'members.birth_date',
|
||||
'members.member_id',
|
||||
'members.gender',
|
||||
'corporate_employees.branch_code',
|
||||
DB::raw('
|
||||
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
|
||||
'),
|
||||
DB::raw('
|
||||
"LinkSehat" AS penjamin
|
||||
'),
|
||||
// DB::raw('
|
||||
// "LinkSehat" AS penjamin
|
||||
// '),
|
||||
DB::raw('
|
||||
(Select corporates.name FROM corporates
|
||||
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
|
||||
@@ -639,6 +777,7 @@ class RequestLogController extends Controller
|
||||
'members.members_effective_date AS mulai',
|
||||
'members.members_expire_date AS akhir'
|
||||
)
|
||||
->leftJoin('corporate_employees', 'corporate_employees.member_id', '=', 'members.id')
|
||||
->first();
|
||||
$data['namaKaryawan'] = '';
|
||||
if($dataMember->principal_id)
|
||||
@@ -648,7 +787,11 @@ class RequestLogController extends Controller
|
||||
->select('members.name')
|
||||
->limit(1)
|
||||
->first();
|
||||
$data['namaKaryawan'] = $dataNamaKaryawan->name;
|
||||
if ($dataNamaKaryawan){
|
||||
$data['namaKaryawan'] = $dataNamaKaryawan->name;
|
||||
} else {
|
||||
$data['namaKaryawan'] = $dataMember->name;
|
||||
}
|
||||
}
|
||||
else{
|
||||
$data['namaKaryawan'] = $dataMember->name;
|
||||
@@ -660,6 +803,7 @@ class RequestLogController extends Controller
|
||||
|
||||
$dataClaimLog = DB::table('request_log_benefits')
|
||||
->where('request_log_benefits.request_log_id', '=', $request_log_id)
|
||||
->where('request_log_benefits.deleted_at', null)
|
||||
->select(
|
||||
'*',
|
||||
DB::raw('
|
||||
@@ -680,11 +824,23 @@ class RequestLogController extends Controller
|
||||
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
|
||||
->where('organizations.id', '=', $dataRequestLog->organization_id)
|
||||
->where('addresses.addressable_type', '=', 'App\Models\Organization')
|
||||
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit')
|
||||
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit', 'organizations.corporate_id_partner')
|
||||
->first();
|
||||
|
||||
$data['rumahSakit'] = $dataRumahSakit;
|
||||
|
||||
//get penjamin
|
||||
$data['penjamin'] = 'LinkSehat';
|
||||
if(!empty($dataRumahSakit->corporate_id_partner))
|
||||
{
|
||||
$corporate_id_partners = explode(',', $dataRumahSakit->corporate_id_partner);
|
||||
$valueToCheck = $dataMember->id_perusahaan;
|
||||
|
||||
if (in_array($valueToCheck, $corporate_id_partners)) {
|
||||
$data['penjamin'] = $dataMember->nama_perusahaan;
|
||||
}
|
||||
}
|
||||
|
||||
$logoPerusahaan = DB::table('files')
|
||||
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
|
||||
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
|
||||
@@ -711,19 +867,82 @@ class RequestLogController extends Controller
|
||||
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
|
||||
->where('files.fileable_type', '=', 'App\Models\Signature')
|
||||
->where('signatures.type', '=', 2)
|
||||
->where('signatures.user_id', '=', $dataRequestLog->approved_by)
|
||||
->where('signatures.user_id', '=', $dataRequestLog->approved_final_log_by)
|
||||
->select(
|
||||
'files.path',
|
||||
DB::raw('
|
||||
(Select persons.name FROM users
|
||||
LEFT JOIN persons ON users.person_id = persons.id
|
||||
WHERE users.id = "'.$dataRequestLog->approved_by.'" LIMIT 1) AS name_approve
|
||||
WHERE users.id = "'.$dataRequestLog->approved_final_log_by.'" LIMIT 1) AS name_approve
|
||||
')
|
||||
)
|
||||
->first();
|
||||
|
||||
$data['signatureAd'] = $signatureAd;
|
||||
|
||||
$namaPenjaminTtd = $dataMember->nama_perusahaan;
|
||||
|
||||
$isVale = ($logoPerusahaan->code ?? null) === "VALEIND";
|
||||
$ttdNama = '';
|
||||
$ttdJabatan = '';
|
||||
$ttdImage = null;
|
||||
|
||||
if ($isVale) {
|
||||
if (trim($data['penjamin']) === 'LinkSehat') {
|
||||
$ttdNama = 'Fariz Ariyadi';
|
||||
$ttdJabatan = 'Chief Executive Officer';
|
||||
$ttdImage = public_path('images/ttd_fariz.png');
|
||||
$namaPenjaminTtd = 'PT Link Medis Sehat';
|
||||
} else {
|
||||
if ($dataRequestLog->submission_date <= '2025-05-12') {
|
||||
$ttdNama = 'Dr. Hery Hermas, M.Kes';
|
||||
$ttdImage = public_path('images/ttd_dr_vale.png');
|
||||
} else {
|
||||
$ttdNama = 'dr. Irmawati Baso, S. Ked., MM';
|
||||
$ttdImage = public_path('images/ttd_dr_irma_2.png');
|
||||
}
|
||||
$ttdJabatan = 'Offsite Medical Treatment';
|
||||
}
|
||||
} else {
|
||||
$ttdNama = 'Fariz Ariyadi';
|
||||
$ttdJabatan = 'Chief Executive Officer';
|
||||
$ttdImage = public_path('images/ttd_fariz.png');
|
||||
}
|
||||
|
||||
$data['ttdNama'] = $ttdNama;
|
||||
$data['ttdJabatan'] = $ttdJabatan;
|
||||
$data['ttdImage'] = $ttdImage;
|
||||
|
||||
if (!$isVale) {
|
||||
$namaPenjaminTtd = 'Primayan Medicare';
|
||||
}
|
||||
|
||||
$data['namaPenjaminTtd'] = $namaPenjaminTtd;
|
||||
|
||||
if (!$isVale) {
|
||||
$data['penjamin'] = 'Primayan Medicare';
|
||||
}
|
||||
|
||||
$dataDiagnosis = [];
|
||||
if($dataRequestLog->diagnosis)
|
||||
{
|
||||
$dataDiagnosiCodes = explode(',', $dataRequestLog->diagnosis);
|
||||
foreach ($dataDiagnosiCodes as $diagnosisCode)
|
||||
{
|
||||
$diagnoisis = DB::table('icd')
|
||||
->where('icd.code', '=', $diagnosisCode)
|
||||
->select('icd.name', 'icd.code')
|
||||
->first();
|
||||
array_push($dataDiagnosis, $diagnoisis);
|
||||
}
|
||||
}
|
||||
|
||||
$data['dataDiagnosis'] = $dataDiagnosis;
|
||||
|
||||
if (($logoPerusahaan->code ?? null) !== "VALEIND") {
|
||||
$data['penjamin'] = 'Primayan Medicare';
|
||||
}
|
||||
|
||||
$pdf = new Dompdf();
|
||||
|
||||
$options = new Options();
|
||||
@@ -732,23 +951,150 @@ class RequestLogController extends Controller
|
||||
$options->set(['isRemoteEnabled' => true]);
|
||||
$pdf->setOptions($options);
|
||||
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.final_log_page_1', $data);
|
||||
if (!$isVale) {
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.final_log_page_1_primayan', $data);
|
||||
|
||||
// Halaman 2
|
||||
$html2 = view('pdf.final_log_page_2', $data);
|
||||
// Halaman 2
|
||||
$html2 = view('pdf.final_log_page_2_primayan', $data);
|
||||
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
$htmlCombined = $html1 . $html2;
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
$htmlCombined = $html1 . $html2;
|
||||
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
} else {
|
||||
// Halaman 1
|
||||
$html1 = view('pdf.final_log_page_1', $data);
|
||||
|
||||
// Halaman 2
|
||||
$html2 = view('pdf.final_log_page_2', $data);
|
||||
|
||||
// Gabung konten HTML dari dua tampilan
|
||||
$htmlCombined = $html1 . $html2;
|
||||
|
||||
$pdf->loadHtml($htmlCombined);
|
||||
$pdf->render();
|
||||
|
||||
$headers = [
|
||||
'Content-Type' => 'application/pdf',
|
||||
'Content-Disposition' => 'inline; filename="file.pdf"',
|
||||
];
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
}
|
||||
}
|
||||
|
||||
public function submitClaims(Request $request)
|
||||
{
|
||||
$data = [
|
||||
'selectedRows' => $request->selectedRows,
|
||||
];
|
||||
$validator = Validator::make($request->all(), [
|
||||
'selectedRows' => 'required'
|
||||
], [
|
||||
'selectedRows.required' => trans('Validation.required',['attribute' => 'Request Logs ID']),
|
||||
]);
|
||||
if ($validator->fails())
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($request->selectedRows as $request_logs_id) {
|
||||
$data_req_logs = DB::table('request_logs')
|
||||
->where('id', '=', $request_logs_id)
|
||||
->select('id', 'member_id', 'service_code')
|
||||
->first();
|
||||
|
||||
return response($pdf->output(), 200, $headers);
|
||||
$check_claim_requests = DB::table('claim_requests')
|
||||
->where('claim_requests.request_log_id', '=', $request_logs_id)
|
||||
->first();
|
||||
if(!$check_claim_requests) {
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
$code = $this->getNextCode($request_logs_id);
|
||||
$member = Member::find($data_req_logs->member_id);
|
||||
$requestLogData = RequestLog::where('id',$request_logs_id)->first();
|
||||
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
|
||||
$provideCode = $organization ? $organization->code : '';
|
||||
|
||||
$newClaimRequest = ClaimRequestService::storeClaimRequest(
|
||||
row: [],
|
||||
code: $code,
|
||||
member: $member,
|
||||
paymentType: 'cashless',
|
||||
serviceCode: $data_req_logs->service_code,
|
||||
requestLogID: $request_logs_id,
|
||||
organization_code: $provideCode,
|
||||
);
|
||||
// Log History
|
||||
$newClaimRequest->histories()->create([
|
||||
'title' => 'New Claim Requested',
|
||||
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
|
||||
'type' => 'info',
|
||||
'system_origin' => 'hospital-portal'
|
||||
]);
|
||||
|
||||
// Claim Log
|
||||
DB::table('claim_logs')
|
||||
->insert([
|
||||
'claim_request_id' => $newClaimRequest->id,
|
||||
'status' => 'requested',
|
||||
'date' => date('Y-m-d H:i:s'),
|
||||
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
|
||||
'system_origin' => 'hospital-portal',
|
||||
'created_by' => auth()->user()->id,
|
||||
'created_at' => date('Y-m-d H:i:s'),
|
||||
'updated_at'=> date('Y-m-d H:i:s'),
|
||||
]);
|
||||
DB::commit();
|
||||
} catch (\Exception $e) {
|
||||
DB::rollback();
|
||||
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200);
|
||||
}
|
||||
}
|
||||
|
||||
public static function getNextCode($request_log_id = 0)
|
||||
{
|
||||
$last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code'))
|
||||
->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"')
|
||||
->value('max_numeric_code');
|
||||
// $next_number = 1;
|
||||
if ($last_numeric_code) {
|
||||
// // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir
|
||||
// $parts = explode('-', $last_code);
|
||||
// $last_number = (int) end($parts);
|
||||
$next_number = $last_numeric_code + 1;
|
||||
} else {
|
||||
$next_number = 1;
|
||||
}
|
||||
return self::makeCode($next_number, $request_log_id);
|
||||
}
|
||||
|
||||
public static function makeCode($next_number, $request_log_id)
|
||||
{
|
||||
// Pastikan $next_number adalah integer positif
|
||||
$next_number = max(1, (int) $next_number);
|
||||
$requestLogData = RequestLog::where('id', $request_log_id)->first();
|
||||
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
|
||||
$provideCode = $organization ? $organization->code : '';
|
||||
$member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first();
|
||||
$sparator = '.';
|
||||
$date = date('ymd');
|
||||
// Menghasilkan kode dengan format yang diinginkan
|
||||
return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
|
||||
return self::$code_prefix . '.' . str_pad($next_number, 6, '0', STR_PAD_LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
721
Modules/HospitalPortal/Http/Controllers/ApotekController.php
Normal file
721
Modules/HospitalPortal/Http/Controllers/ApotekController.php
Normal file
@@ -0,0 +1,721 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\HospitalPortal\Http\Controllers;
|
||||
|
||||
use Illuminate\Contracts\Support\Renderable;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use App\Helpers\Helper;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Modules\HospitalPortal\Helpers\ApiResponse;
|
||||
use Modules\HospitalPortal\Helpers\GrabHelper;
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;
|
||||
|
||||
class ApotekController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
|
||||
|
||||
$results = DB::connection('oldlms')->table('tx_prescriptions')
|
||||
->join('tx_prescription_orders', 'tx_prescription_orders.nIDPrescription', '=', 'tx_prescriptions.nID')
|
||||
->join('tm_users', 'tm_users.nID', '=', 'tx_prescriptions.nIDUser')
|
||||
->when(auth()->user()->organization_id, function ($query, $organizationId) {
|
||||
$query->where('tx_prescription_orders.nIDApotek', '=', $organizationId);
|
||||
})
|
||||
->when($request->input('search'), function ($query, $search) {
|
||||
$query->where(function ($query) use ($search) {
|
||||
$query->orWhere('tx_prescriptions.sKodeResep', 'like', "%" . $search . "%")
|
||||
->orWhere('tm_users.sFirstName', 'like', "%" . $search . "%");
|
||||
});
|
||||
})
|
||||
->when($request->has('orderBy'), function ($query) use ($request) {
|
||||
$orderBy = $request->orderBy;
|
||||
$direction = $request->order ?? 'asc';
|
||||
|
||||
if($orderBy == 'apotek')
|
||||
{
|
||||
$orderBy = 'nIDApotek';
|
||||
}
|
||||
|
||||
$query->orderBy($orderBy, $direction);
|
||||
})
|
||||
->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) {
|
||||
$query->where(function ($query) use ($start_date) {
|
||||
$query->where('tx_prescriptions.dTanggalresep', '<', $start_date);
|
||||
});
|
||||
})
|
||||
->when($request->input('status'), function ($query, $status) {
|
||||
// Apply the filter if 'status' has a value
|
||||
if ($status !== 'all') {
|
||||
$query->where(function ($query) use ($status) {
|
||||
$query->where('tx_prescription_orders.sStatus', '=', $status);
|
||||
});
|
||||
}
|
||||
})
|
||||
->select(
|
||||
'tx_prescriptions.nID as id',
|
||||
'tx_prescription_orders.nID as nID_orders',
|
||||
'tx_prescriptions.nIDUser',
|
||||
'tx_prescriptions.sKodeResep as no_resep',
|
||||
'tx_prescriptions.dTanggalResep as tanggal',
|
||||
'tx_prescription_orders.nIDApotek',
|
||||
'tx_prescription_orders.sStatus as status',
|
||||
'tx_prescription_orders.sStatus',
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 72 THEN ""
|
||||
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 1 AND tx_prescription_orders.sStatus = "waiting_pharmacy" THEN "1"
|
||||
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 2 AND tx_prescription_orders.sStatus = "order_prepared" THEN "2"
|
||||
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 3 AND tx_prescription_orders.sStatus = "ready" THEN "3"
|
||||
ELSE ""
|
||||
END AS alert
|
||||
'),
|
||||
DB::raw('
|
||||
CASE
|
||||
WHEN tx_prescription_orders.sStatus = "waiting_pharmacy" THEN "Diterima"
|
||||
WHEN tx_prescription_orders.sStatus = "order_prepared" THEN "Siap Diambil"
|
||||
WHEN tx_prescription_orders.sStatus = "ready" THEN "Cari Kurir"
|
||||
WHEN tx_prescription_orders.sStatus = "failed" THEN "Cari Kurir"
|
||||
WHEN tx_prescription_orders.sStatus = "waiting_for_courir" THEN "Pesanan Diambil"
|
||||
WHEN tx_prescription_orders.sStatus = "package_picked_up" THEN "Sedang Diantar"
|
||||
WHEN tx_prescription_orders.sStatus = "package_on_delivery" THEN "Selesai"
|
||||
ELSE ""
|
||||
END AS button_accept'),
|
||||
DB::raw('CONCAT(
|
||||
COALESCE(tm_users.sFirstName, ""),
|
||||
" ",
|
||||
COALESCE(tm_users.sMiddleName, ""),
|
||||
" ",
|
||||
COALESCE(tm_users.sLastName, "")
|
||||
) as pasien'),
|
||||
DB::raw('
|
||||
(SELECT CONCAT(
|
||||
COALESCE(u.sFirstName, ""),
|
||||
" ",
|
||||
COALESCE(u.sMiddleName, ""),
|
||||
" ",
|
||||
COALESCE(u.sLastName, "")
|
||||
)
|
||||
FROM tm_dokter d
|
||||
LEFT JOIN tm_users u ON u.nID = d.nIDUser
|
||||
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS nama_dokter
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT s.sSpesialis
|
||||
FROM tm_dokter d
|
||||
LEFT JOIN tm_spesialis s ON s.nID = d.nIDSpesialis
|
||||
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS spesialis
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT t.sSIP
|
||||
FROM tm_dokter d
|
||||
LEFT JOIN tx_jadwal_dokter t ON t.nIDDokter = d.nID
|
||||
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS sip
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT u.sPhone
|
||||
FROM tm_dokter d
|
||||
LEFT JOIN tm_users u ON u.nID = d.nIDUser
|
||||
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS no_ponsel_dokter
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT tm_users_detail.dTanggalLahir
|
||||
FROM tm_users_detail
|
||||
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS tgl_lahir_pasien
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT CASE
|
||||
WHEN tm_users_detail.nIDJenisKelamin = 1 THEN "Male"
|
||||
ELSE "Female"
|
||||
END
|
||||
FROM tm_users_detail
|
||||
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS jenis_kelamin_pasien
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT CONCAT(tm_users_detail.sHeight, "/", tm_users_detail.sWeight)
|
||||
FROM tm_users_detail
|
||||
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS tinggi_berat
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT tm_users_insurance.sNoPolis
|
||||
FROM tm_users_insurance
|
||||
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
|
||||
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS no_polis
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT tm_insurance.sInsurance
|
||||
FROM tm_users_insurance
|
||||
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
|
||||
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS perusahaan_asuransi
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT tm_users_insurance.sCorporateName
|
||||
FROM tm_users_insurance
|
||||
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
|
||||
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS nama_perusahaan
|
||||
'),
|
||||
DB::raw('
|
||||
(SELECT tm_users_insurance.sProductCode
|
||||
FROM tm_users_insurance
|
||||
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
|
||||
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS kode_produk
|
||||
'),
|
||||
DB::raw('
|
||||
(
|
||||
SELECT
|
||||
CASE
|
||||
WHEN tm_users_insurance.sPlanCode = "A" THEN "Alba"
|
||||
WHEN tm_users_insurance.sPlanCode = "B" THEN "Blue"
|
||||
WHEN tm_users_insurance.sPlanCode = "S" THEN "Silver"
|
||||
WHEN tm_users_insurance.sPlanCode = "G" THEN "Gold"
|
||||
WHEN tm_users_insurance.sPlanCode = "P" THEN "Platinum"
|
||||
WHEN tm_users_insurance.sPlanCode = "D" THEN "Diamond"
|
||||
ELSE ""
|
||||
END AS kelas_asuransi
|
||||
FROM tm_users_insurance
|
||||
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
|
||||
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser
|
||||
LIMIT 1
|
||||
) AS kelas_asuransi
|
||||
'),
|
||||
DB::raw('
|
||||
(
|
||||
SELECT
|
||||
CASE
|
||||
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Husband" THEN "S"
|
||||
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Wife" THEN "I"
|
||||
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Child" THEN "A"
|
||||
ELSE "P"
|
||||
END AS tipe_member
|
||||
FROM tm_hubungan_keluarga
|
||||
WHERE tm_hubungan_keluarga.nID = tm_users.nIDHubunganKeluarga
|
||||
LIMIT 1
|
||||
) AS tipe_member
|
||||
'),
|
||||
'tx_prescription_orders.sAddress AS alamat_penerima',
|
||||
'tx_prescription_orders.sDeliveryMethod AS pengiriman',
|
||||
'tx_prescription_orders.nTotalPrice AS total_kirim',
|
||||
'tx_prescriptions.sNoRefProvider AS noref_dokter',
|
||||
DB::raw('DATE_ADD(tx_prescriptions.dTanggalResep, INTERVAL 1 DAY) as valid_tanggal'),
|
||||
'tx_prescriptions.sNomorPenjamin AS nomor_penjamin',
|
||||
DB::raw('
|
||||
(SELECT tx_livechat.dCreateOn
|
||||
FROM tx_livechat
|
||||
WHERE tx_livechat.nID = tx_prescriptions.nIDLivechat LIMIT 1) AS tgl_livechat
|
||||
'),
|
||||
'tx_prescriptions.sDiagnose as diagnosa',
|
||||
'tx_prescription_orders.nDeliveryID',
|
||||
'tx_prescription_orders.sDeliveryStatus'
|
||||
)
|
||||
->paginate($limit);
|
||||
|
||||
// Secret key for generating the token
|
||||
$secret_key = env('SECRET_KEY_LMS');
|
||||
|
||||
// Transform the results to include the download link
|
||||
$results->getCollection()->transform(function ($item) use ($secret_key) {
|
||||
// Generate the token with the timestamp
|
||||
$expiry_time = time() + 86400; // Token expiry time (1 day)
|
||||
$token = hash_hmac('sha256', $item->id . $expiry_time, $secret_key);
|
||||
|
||||
// Construct the download link
|
||||
$path = 'prescription/barcode-print-pdf/' . $item->id . '?token=' . urlencode($token) . '&expiry=' . $expiry_time;
|
||||
$host = $_SERVER['HTTP_HOST']; // This will give you the host like 'linksehat.dev' or 'linksehat.com'
|
||||
$base_url = "https://m.linksehat.dev/";
|
||||
// Check if the host contains '.dev'
|
||||
if (strpos($host, '.com') !== false) {
|
||||
$base_url = "https://m.linksehat.com/";
|
||||
}
|
||||
$item->link_download = $base_url.$path;
|
||||
|
||||
return $item;
|
||||
});
|
||||
|
||||
$apotekIds = $results->pluck(value: 'nIDApotek')->unique()->filter();
|
||||
$organizations = DB::connection('mysql')->table('organizations')
|
||||
->whereIn('id', $apotekIds)
|
||||
->pluck('name', 'id');
|
||||
$results->getCollection()->transform(function ($item) use ($organizations) {
|
||||
$item->apotek = $organizations->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
|
||||
return $item;
|
||||
});
|
||||
$apotek_phone = DB::connection('mysql')->table('organizations')
|
||||
// ->leftJoin('addresses', 'addresses.id','=', 'organizations.main_address_id')
|
||||
->whereIn('organizations.id', $apotekIds)
|
||||
->pluck('organizations.phone', 'organizations.id');
|
||||
$results->getCollection()->transform(function ($item) use ($apotek_phone) {
|
||||
$item->phone_apotek = $apotek_phone->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
|
||||
return $item;
|
||||
});
|
||||
// Transform results to include allergies
|
||||
$results->getCollection()->transform(function ($item) use ($organizations) {
|
||||
// Get the allergies for each user
|
||||
$allergies = $this->getAllergies($item->nIDUser);
|
||||
|
||||
// Concatenate the allergy description
|
||||
$alergi_desc = '';
|
||||
foreach ($allergies as $row) {
|
||||
$alergi_desc .= $row->sAlergi . ' - ' . $row->sKeterangan . ', ';
|
||||
}
|
||||
|
||||
// Set apotek and allergies data
|
||||
$item->apotek = $organizations->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
|
||||
$item->alergi_desc = rtrim($alergi_desc, ', '); // Remove the trailing comma
|
||||
|
||||
return $item;
|
||||
});
|
||||
// Extract unique Prescription IDs from the results
|
||||
$prescriptionIDs = $results->pluck('id')->unique()->filter();
|
||||
|
||||
// Fetch prescription items based on Prescription IDs
|
||||
$items = DB::connection('oldlms')->table('tx_prescription_items')
|
||||
->whereIn('nIDPrescription', $prescriptionIDs)
|
||||
->select('nIDPrescription', 'sItemName', 'sSigna', 'sTiming', 'sDuration', 'nQty', 'sNote')
|
||||
->get()
|
||||
->groupBy('nIDPrescription'); // Group items by their Prescription ID
|
||||
// Final transformation: Attach prescription items to each prescription
|
||||
$results->getCollection()->transform(function ($item) use ($items) {
|
||||
$item->prescription_items = $items->get($item->id, collect())->map(function ($prescriptionItem) {
|
||||
return [
|
||||
'sItemName' => $prescriptionItem->sItemName,
|
||||
'sSigna' => $prescriptionItem->sSigna,
|
||||
'sTiming' => $prescriptionItem->sTiming,
|
||||
'sDuration' => $prescriptionItem->sDuration,
|
||||
'nQty' => $prescriptionItem->nQty,
|
||||
'sNote' => $prescriptionItem->sNote,
|
||||
];
|
||||
});
|
||||
return $item;
|
||||
});
|
||||
return response()->json(Helper::paginateResources($results));
|
||||
}
|
||||
|
||||
public function getAllergies($nIDUser) {
|
||||
return DB::connection('oldlms')
|
||||
->table('tx_alergi_users as txa')
|
||||
->join('tm_alergi as ta', 'ta.nID', '=', 'txa.nIDAlergi')
|
||||
->select('ta.sAlergi', 'ta.sKeterangan')
|
||||
->where('txa.nIDUser', $nIDUser)
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
* @return Renderable
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
return view('hospitalportal::create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* @param Request $request
|
||||
* @return Renderable
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the specified resource.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
return view('hospitalportal::show');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
return view('hospitalportal::edit');
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
* @param Request $request
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$data = ['sStatus' => $request->sStatus];
|
||||
$validator = Validator::make($request->all(), [
|
||||
'sStatus' => 'required|string|max:255',
|
||||
], [
|
||||
'sStatus.required' => trans('Validation.required',['attribute' => 'Status']),
|
||||
]);
|
||||
|
||||
if ($validator->fails())
|
||||
{
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
else
|
||||
{
|
||||
try {
|
||||
// Define the valid transitions
|
||||
$valid_transitions = [
|
||||
'waiting_for_payment' => 'waiting_pharmacy',
|
||||
'waiting_pharmacy' => 'order_prepared',
|
||||
'order_prepared' => 'ready',
|
||||
'ready' => 'waiting_for_courir',
|
||||
'waiting_for_courir' => 'package_picked_up',
|
||||
'package_picked_up' => 'package_on_delivery',
|
||||
'package_on_delivery' => 'package_delivered'
|
||||
];
|
||||
|
||||
// Get the current status from the request
|
||||
$inputStatus = $request->sStatus;
|
||||
|
||||
// Check if the input status has a valid next status in the map
|
||||
if (isset($valid_transitions[$inputStatus])) {
|
||||
// Get the next status
|
||||
$status = $valid_transitions[$inputStatus];
|
||||
|
||||
// Start the transaction
|
||||
DB::connection('oldlms')->beginTransaction();
|
||||
|
||||
// Update the status in the database
|
||||
DB::connection('oldlms')->table('tx_prescription_orders')
|
||||
->where('tx_prescription_orders.nID', '=', $id)
|
||||
->update([
|
||||
'sStatus' => $status,
|
||||
'sUpdateBy' => auth()->user()->id,
|
||||
'dUpdateOn' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
// Insert the log
|
||||
$prescriptionOrder = DB::connection('oldlms')
|
||||
->table('tx_prescription_orders')
|
||||
->where('tx_prescription_orders.nID', '=', $id)
|
||||
->join('tx_delivery_orders', 'tx_delivery_orders.nIDPrescriptionOrder', '=', 'tx_prescription_orders.nID')
|
||||
->select('tx_prescription_orders.*', 'tx_delivery_orders.*', 'tx_delivery_orders.nID as nIDDelivery') // Add specific columns you want to select
|
||||
->first();
|
||||
|
||||
if ($prescriptionOrder) {
|
||||
$createdBy = $prescriptionOrder->sCreateBy;
|
||||
$nIDPrescription = $prescriptionOrder->nIDPrescription;
|
||||
$nIDDeliveryOrder = $prescriptionOrder->nIDDelivery;
|
||||
|
||||
// Insert data into the tx_delivery_log table
|
||||
DB::connection('oldlms')->table('tx_delivery_log')->insert([
|
||||
'sStatus' => $prescriptionOrder->sDeliveryStatus,
|
||||
'sStatusPrescription' => $status,
|
||||
'nIDDeliveryOrder' => $nIDDeliveryOrder,
|
||||
'nIDPrescription' => $nIDPrescription,
|
||||
'dCreatedOn' => now(),
|
||||
]);
|
||||
}
|
||||
|
||||
// Commit the transaction
|
||||
DB::connection('oldlms')->commit();
|
||||
|
||||
// Return success response
|
||||
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
|
||||
} else {
|
||||
// If the input status is not valid, return an error
|
||||
return ApiResponse::apiResponse('Invalid Status', $data, 'The input status is not valid.', 400);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// Rollback the transaction if an error occurs
|
||||
DB::connection('oldlms')->rollBack();
|
||||
|
||||
// Handle error, could log or return as response
|
||||
return ApiResponse::apiResponse('Server Error', $data, $e->getMessage(), 500);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public function getDriver(Request $request, $id)
|
||||
{
|
||||
$data = ['sStatus' => $request->sStatus];
|
||||
|
||||
// Validation
|
||||
$validator = Validator::make($request->all(), [
|
||||
'sStatus' => 'required|string|max:255',
|
||||
], [
|
||||
'sStatus.required' => trans('Validation.required', ['attribute' => 'Status']),
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
|
||||
}
|
||||
|
||||
try {
|
||||
// Fetch prescription data
|
||||
$prescriptions = DB::connection('oldlms')->table('tx_prescription_orders')
|
||||
->leftJoin('tx_prescriptions', 'tx_prescriptions.nID', '=', 'tx_prescription_orders.nIDPrescription')
|
||||
->where('tx_prescription_orders.nID', '=', $id)
|
||||
->select(
|
||||
'tx_prescriptions.nIDUser',
|
||||
'tx_prescriptions.nID as id_prescription',
|
||||
'tx_prescriptions.sKodeResep as merchantOrderID',
|
||||
'tx_prescription_orders.nIDApotek'
|
||||
)
|
||||
->first();
|
||||
|
||||
if (!$prescriptions) {
|
||||
return ApiResponse::apiResponse('Not Found', [], 'Prescription not found', 404);
|
||||
}
|
||||
|
||||
// Fetch prescription items (medicine data)
|
||||
$items = DB::connection('oldlms')->table('tx_prescription_items')
|
||||
->where('nIDPrescription', $prescriptions->id_prescription)
|
||||
->select('nIDPrescription', 'sItemName', 'nQty', 'nHarga')
|
||||
->get();
|
||||
|
||||
$packages = [];
|
||||
foreach ($items as $item) {
|
||||
$packages[] = [
|
||||
'name' => $item->sItemName,
|
||||
'description' => $item->sItemName,
|
||||
'quantity' => (float)$item->nQty,
|
||||
'price' => (float)$item->nHarga,
|
||||
'dimensions' => [
|
||||
'height' => 0,
|
||||
'width' => 0,
|
||||
'depth' => 0,
|
||||
'weight' => 0,
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
// Fetch pharmacy (apotek) data
|
||||
$apotek = DB::connection('mysql')->table('organizations')
|
||||
->leftJoin('addresses', 'addresses.id', '=', 'organizations.main_address_id')
|
||||
->where('organizations.id', '=', $prescriptions->nIDApotek)
|
||||
->select('organizations.name as nama_apotek',
|
||||
'addresses.text as alamat_apotek',
|
||||
'addresses.lat',
|
||||
'addresses.lng',
|
||||
'organizations.phone',
|
||||
'organizations.email')
|
||||
->first();
|
||||
|
||||
// Fetch patient (pasien) data
|
||||
$pasien = DB::connection('oldlms')->table('tm_users')
|
||||
->leftJoin('tm_users_detail', 'tm_users_detail.nIDuser', '=', 'tm_users.nID')
|
||||
->where('tm_users.nID', '=', $prescriptions->nIDUser)
|
||||
->select(
|
||||
DB::raw('CONCAT(
|
||||
COALESCE(tm_users.sFirstName, ""),
|
||||
" ",
|
||||
COALESCE(tm_users.sMiddleName, ""),
|
||||
" ",
|
||||
COALESCE(tm_users.sLastName, "")
|
||||
) as nama_pasien'),
|
||||
'tm_users.sFirstName as firstname',
|
||||
'tm_users.sLastName as lastname',
|
||||
'tm_users.sEmail as email',
|
||||
'tm_users.sPhone as phone',
|
||||
'tm_users_detail.sLatitude as latitude',
|
||||
'tm_users_detail.sLongitude as longitude',
|
||||
'tm_users_detail.sAlamatMap',
|
||||
DB::raw('(SELECT tm_provinsi.sProvinsi FROM tm_provinsi WHERE tm_provinsi.nID = tm_users_detail.nIDProvinsi LIMIT 1) AS provinsi'),
|
||||
DB::raw('(SELECT tm_kota.sKota FROM tm_kota WHERE tm_kota.nID = tm_users_detail.nIDKota LIMIT 1) AS kota'),
|
||||
DB::raw('(SELECT tm_kecamatan.sKecamatan FROM tm_kecamatan WHERE tm_kecamatan.nID = tm_users_detail.nIDKecamatan LIMIT 1) AS kecamatan'),
|
||||
DB::raw('(SELECT tm_kelurahan.sKelurahan FROM tm_kelurahan WHERE tm_kelurahan.nID = tm_users_detail.nIDKelurahan LIMIT 1) AS kelurahan'),
|
||||
DB::raw('(SELECT tm_kelurahan.nKodePos FROM tm_kelurahan WHERE tm_kelurahan.nID = tm_users_detail.nIDKelurahan LIMIT 1) AS kode_pos')
|
||||
)
|
||||
->first();
|
||||
|
||||
if (!$pasien) {
|
||||
return ApiResponse::apiResponse('Not Found', [], 'Patient not found', 404);
|
||||
}
|
||||
|
||||
if(!$pasien->email)
|
||||
{
|
||||
return ApiResponse::apiResponse('Not Found', [], 'Email Patient not found', 404);
|
||||
}
|
||||
|
||||
if(!$pasien->phone)
|
||||
{
|
||||
return ApiResponse::apiResponse('Not Found', [], 'Phone Patient not found', 404);
|
||||
}
|
||||
|
||||
// Use GrabHelper to handle the API calls
|
||||
$grabHelper = new GrabHelper();
|
||||
$token = $grabHelper->getToken();
|
||||
$serviceType = 'INSTANT';
|
||||
$body = json_encode([
|
||||
"merchantOrderID" => $prescriptions->merchantOrderID,
|
||||
"serviceType" => $serviceType,
|
||||
"vehicleType" => "BIKE",
|
||||
"codType" => "REGULAR",
|
||||
"paymentMethod" => "CASHLESS",
|
||||
"highValue" => false,
|
||||
"packages" => $packages,
|
||||
"origin" => [
|
||||
"address" => $apotek->alamat_apotek,
|
||||
"coordinates" => [
|
||||
"latitude" => (float)$apotek->lat,
|
||||
"longitude" => (float)$apotek->lng
|
||||
]
|
||||
],
|
||||
"destination" => [
|
||||
"address" => $pasien->sAlamatMap,
|
||||
"coordinates" => [
|
||||
"latitude" => (float)$pasien->latitude,
|
||||
"longitude" => (float)$pasien->longitude
|
||||
]
|
||||
],
|
||||
"recipient" => [
|
||||
"firstName" => $pasien->firstname,
|
||||
"lastName" => $pasien->lastname,
|
||||
"email" => $pasien->email,
|
||||
"phone" => $grabHelper->normalizePhoneNumber($pasien->phone),
|
||||
"smsEnabled" => true
|
||||
],
|
||||
"sender" => [
|
||||
"firstName" => $apotek->nama_apotek,
|
||||
"companyName" => $apotek->nama_apotek,
|
||||
"email" => $apotek->email,
|
||||
"phone" => $apotek->phone,
|
||||
"smsEnabled" => true
|
||||
],
|
||||
"schedule" => $grabHelper->getScheduleTimes()
|
||||
]);
|
||||
|
||||
// Create the delivery request
|
||||
$response = $grabHelper->createDelivery($token, $body);
|
||||
$data_grab = json_decode($response, true);
|
||||
|
||||
// Transaction to update status
|
||||
DB::connection('oldlms')->beginTransaction();
|
||||
|
||||
//insert to api logs
|
||||
$data_logs = [
|
||||
'sType' => 'out',
|
||||
'sContext' => 'grab',
|
||||
'sTarget' => 'deliveries/create-grab',
|
||||
'sRequest' => $body,
|
||||
'sResponse' => $response,
|
||||
'sCreateBy' => auth()->user()->id,
|
||||
'dCreateOn' => now(),
|
||||
];
|
||||
|
||||
DB::connection('oldlms')->table('api_logs')
|
||||
->insert($data_logs);
|
||||
|
||||
|
||||
DB::connection('oldlms')->table('tx_prescription_orders')
|
||||
->where('tx_prescription_orders.nID', '=', $id)
|
||||
->update([
|
||||
'nDeliveryID' => $data_grab['deliveryID'],
|
||||
'sDeliveryStatus' => $data_grab['status'],
|
||||
'sStatus' => 'waiting_for_courir',
|
||||
'sUpdateBy' => auth()->user()->id,
|
||||
'dUpdateOn' => now(),
|
||||
]);
|
||||
//insert to delivery order
|
||||
$tm_delivery_statuses = DB::connection('oldlms')->table('tm_delivery_statuses')
|
||||
->where('tm_delivery_statuses.sStatus', 'LIKE', '%' . $data_grab['status'] . '%')
|
||||
->where('tm_delivery_statuses.nIDDelivery', '=', 3)
|
||||
->select('tm_delivery_statuses.sStatusDescription')
|
||||
->first();
|
||||
$data_delivery_orders = [
|
||||
'nIDPrescriptionOrder' => $id,
|
||||
'sUUID' => $this->generateUuid($id),
|
||||
'nIDDelivery' => 3, //grab
|
||||
'sType' => $serviceType,
|
||||
'nOrderID' => $data_grab['deliveryID'],
|
||||
'nVehicleTypeID' => null,
|
||||
'sCreatedDateTime' => $data_grab['schedule']['pickupTimeFrom'],
|
||||
'sFinishDateTime' => $data_grab['schedule']['pickupTimeTo'],
|
||||
'sStatus' => $data_grab['status'],
|
||||
'sStatusDescription' => $tm_delivery_statuses->sStatusDescription,
|
||||
'sMatter' => 'medicine',
|
||||
'nTotalWeightKg' => 0,
|
||||
'nPaymentAmount' => $data_grab['quote']['amount'],
|
||||
'nDeliveryFeeAmount' => $data_grab['quote']['amount'],
|
||||
'sPaymentMethod' => 'cash',
|
||||
'sCreateBy' => auth()->user()->id,
|
||||
'dCreateOn' => now(),
|
||||
];
|
||||
// Use insertGetId to insert the data and get the last inserted ID
|
||||
$lastInsertId = DB::connection('oldlms')->table('tx_delivery_orders')->insertGetId($data_delivery_orders);
|
||||
$data_points = [
|
||||
'origin' => [
|
||||
'nIDDeliveryOrder' => $lastInsertId,
|
||||
'sUUID' => $this->generateUuid($lastInsertId),
|
||||
'nDeliveryID' => $data_grab['deliveryID'],
|
||||
'nPointID' => 1,
|
||||
'nType' => 1,
|
||||
'sAddress' => $data_grab['quote']['origin']['address'],
|
||||
'nLatitude' => $data_grab['quote']['origin']['coordinates']['latitude'] ?? null,
|
||||
'nLongitude' => $data_grab['quote']['origin']['coordinates']['longitude'] ?? null,
|
||||
'sName' => $data_grab['sender']['companyName'],
|
||||
'sPhone' => $data_grab['sender']['phone'],
|
||||
'sTrackingUrl' => null,
|
||||
'sCreateBy' => auth()->user()->id,
|
||||
'dCreateOn' => now(),
|
||||
],
|
||||
'destination' => [
|
||||
'nIDDeliveryOrder' => $lastInsertId,
|
||||
'sUUID' => $this->generateUuid($lastInsertId),
|
||||
'nDeliveryID' => $data_grab['deliveryID'],
|
||||
'nPointID' => 2,
|
||||
'nType' => 2,
|
||||
'sAddress' => $data_grab['quote']['destination']['address'],
|
||||
'nLatitude' => $data_grab['quote']['destination']['coordinates']['latitude'] ?? null,
|
||||
'nLongitude' => $data_grab['quote']['destination']['coordinates']['longitude'] ?? null,
|
||||
'sName' => $data_grab['recipient']['firstName'] . " " . $data_grab['recipient']['lastName'],
|
||||
'sPhone' => $data_grab['recipient']['phone'],
|
||||
'sTrackingUrl' => null,
|
||||
'sCreateBy' => auth()->user()->id,
|
||||
'dCreateOn' => now(),
|
||||
]
|
||||
];
|
||||
|
||||
foreach ($data_points as $value_point) {
|
||||
DB::connection('oldlms')->table('tx_delivery_order_points')->insert($value_point);
|
||||
}
|
||||
|
||||
DB::connection('oldlms')->commit();
|
||||
|
||||
// Return success response
|
||||
return ApiResponse::apiResponse("Success", $data_grab, trans('Message.success'), 200);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Rollback transaction on error
|
||||
DB::connection('oldlms')->rollBack();
|
||||
|
||||
return ApiResponse::apiResponse('Server Error', [], $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
* @param int $id
|
||||
* @return Renderable
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
public function generateUuid($id_prescription_order)
|
||||
{
|
||||
// Define the namespace (using DNS in this example)
|
||||
$namespace = Uuid::NAMESPACE_DNS;
|
||||
|
||||
$uuidV5 = Uuid::uuid5($namespace, $id_prescription_order);
|
||||
return $uuidV5->toString();
|
||||
}
|
||||
|
||||
}
|
||||
0
Modules/HospitalPortal/Http/Controllers/ClaimController.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Controllers/ClaimController.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Controllers/HospitalPortalController.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Controllers/HospitalPortalController.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/Authentication.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/Authentication.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/Authorization.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Middleware/Authorization.php
Normal file → Executable file
0
Modules/HospitalPortal/Http/Requests/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Http/Requests/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Providers/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Providers/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Providers/HospitalPortalServiceProvider.php
Normal file → Executable file
0
Modules/HospitalPortal/Providers/HospitalPortalServiceProvider.php
Normal file → Executable file
0
Modules/HospitalPortal/Providers/RouteServiceProvider.php
Normal file → Executable file
0
Modules/HospitalPortal/Providers/RouteServiceProvider.php
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/js/app.js
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/js/app.js
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/sass/app.scss
Normal file → Executable file
0
Modules/HospitalPortal/Resources/assets/sass/app.scss
Normal file → Executable file
0
Modules/HospitalPortal/Resources/lang/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/lang/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/index.blade.php
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/index.blade.php
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/layouts/master.blade.php
Normal file → Executable file
0
Modules/HospitalPortal/Resources/views/layouts/master.blade.php
Normal file → Executable file
0
Modules/HospitalPortal/Routes/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Routes/.gitkeep
Normal file → Executable file
71
Modules/HospitalPortal/Routes/api.php
Normal file → Executable file
71
Modules/HospitalPortal/Routes/api.php
Normal file → Executable file
@@ -6,9 +6,18 @@ use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\MemberController;
|
||||
use Modules\HospitalPortal\Http\Controllers\ClaimController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\NotificationController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
|
||||
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
|
||||
use Modules\Internal\Http\Controllers\Api\RequestLogController as RequestLogControllerInternal;
|
||||
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
|
||||
use Modules\Internal\Http\Controllers\Api\RequestLogMedicineController;
|
||||
|
||||
use Modules\HospitalPortal\Http\Controllers\ApotekController;
|
||||
use Modules\HospitalPortal\Http\Middleware\Authentication;
|
||||
use Modules\HospitalPortal\Http\Middleware\Authorization;
|
||||
use Modules\Internal\Http\Controllers\Api\NavigationController;
|
||||
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
|
||||
use Modules\Primaya\Http\Controllers\Api\MasterController;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -28,13 +37,50 @@ Route::prefix('v1')->group(function() {
|
||||
Route::post('login', 'login');
|
||||
});
|
||||
});
|
||||
|
||||
//Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
|
||||
//Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
|
||||
|
||||
Route::post('forget-password', [AuthController::class, 'forgetPassword']);
|
||||
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
|
||||
Route::post('verify-code', [AuthController::class, 'verifCode']);
|
||||
|
||||
Route::get('service-member/{id}', [AutocompleteController::class, 'serviceCode']);
|
||||
Route::get('specialis', [AutocompleteController::class, 'specialisList']);
|
||||
Route::get('diagnosis', [RequestLogControllerInternal::class, 'diagnosis']);
|
||||
|
||||
Route::middleware('auth:sanctum')->group(function () {
|
||||
|
||||
//dari Internal Prime center
|
||||
Route::get('customer-service/request', [RequestLogControllerInternal::class, 'index']);
|
||||
Route::post('customer-service/request', [RequestLogControllerInternal::class, 'createNew']);
|
||||
Route::put('customer-service/request/{id}', [RequestLogControllerInternal::class, 'update']);
|
||||
Route::get('customer-service/request/{id}', [RequestLogControllerInternal::class, 'show']);
|
||||
Route::put('customer-service/request/delete/{id}', [RequestLogControllerInternal::class, 'destroy']);
|
||||
Route::put('customer-service/request/final_log/{id}', [RequestLogControllerInternal::class, 'deleteFinalLog']);
|
||||
Route::get('customer-service/request/{id}/download', [RequestLogControllerInternal::class, 'generateRequestLog']);
|
||||
Route::post('customer-service/request/import', [RequestLogControllerInternal::class, 'importRequestLog']);
|
||||
Route::post('customer-service/request/import-invoice', [RequestLogControllerInternal::class, 'importInvoice']);
|
||||
Route::post('customer-service/request/exportFiledInvoice', [RequestLogControllerInternal::class, 'exportFiledInvoice']);
|
||||
Route::get('customer-service/request/data', [RequestLogControllerInternal::class, 'generateDataRequestLogExcel']);
|
||||
Route::post('customer-service/request/{id}/add_file', [RequestLogControllerInternal::class, 'requestFiles']);
|
||||
Route::post('customer-service/request/{id}/approval_files', [RequestLogControllerInternal::class, 'approvalFiles']);
|
||||
Route::post('customer-service/request/{id}/delete_file', [RequestLogControllerInternal::class, 'deleteFiles']);
|
||||
|
||||
Route::post('customer-service/request/final-log', [RequestLogControllerInternal::class, 'updateFinalLog']);
|
||||
|
||||
// insert benefit
|
||||
Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']);
|
||||
Route::post('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']);
|
||||
Route::put('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'update']);
|
||||
|
||||
// insert medicine
|
||||
Route::post('customer-service/request/medicine-data', [RequestLogMedicineController::class, 'store']);
|
||||
Route::delete('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'destroy']);
|
||||
Route::put('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'update']);
|
||||
// end prime center
|
||||
|
||||
// Navigation
|
||||
Route::get('navigations', [NavigationController::class, 'index']);
|
||||
|
||||
|
||||
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
|
||||
Route::get('/user', function (Request $request) {
|
||||
return $request->user();
|
||||
@@ -56,6 +102,7 @@ Route::prefix('v1')->group(function() {
|
||||
Route::post('request-final-log', 'requestFinalLog');
|
||||
Route::get('download-log/{request_log_id}', 'downlodLog');
|
||||
Route::get('download-final-log/{request_log_id}', 'downlodFinalLog');
|
||||
Route::post('submit-claims', 'submitClaims');
|
||||
});
|
||||
//Notification
|
||||
Route::controller(NotificationController::class)->group(function() {
|
||||
@@ -64,6 +111,9 @@ Route::prefix('v1')->group(function() {
|
||||
//Set read notification
|
||||
Route::post('set-read-notification', 'setReadNotification');
|
||||
});
|
||||
Route::get('get-prescription-orders',[ApotekController::class, 'index']);
|
||||
Route::put('put-prescription-orders/{id}',[ApotekController::class, 'update']);
|
||||
Route::put('put-driver-prescription-orders/{id}',[ApotekController::class, 'getDriver']);
|
||||
});
|
||||
// Request Final LOG
|
||||
Route::controller(RequestLogController::class)->group(function () {
|
||||
@@ -80,6 +130,21 @@ Route::prefix('v1')->group(function() {
|
||||
Route::get('get-claim-requests', [ClaimRequestController::class, 'get_claim_requests'])->name('claim-requests.get_claim_requests');
|
||||
Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests');
|
||||
Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']);
|
||||
|
||||
Route::get('organizations', [MasterController::class, 'organizations']);
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
Route::prefix('v1/bridging-service/ProviderOnline')->group(function () {
|
||||
Route::post('HeaderKey', [ProviderOnlineController::class, 'getHeaderKey']);
|
||||
Route::post('AddHeaderKey', [ProviderOnlineController::class, 'addHeaderKey']);
|
||||
Route::post('EligibilitasPeserta', [ProviderOnlineController::class, 'checkEligibilitasPeserta']);
|
||||
Route::post('Pendaftaran', [ProviderOnlineController::class, 'createPendaftaran']);
|
||||
Route::post('Pengesahan', [ProviderOnlineController::class, 'createPengesahan']);
|
||||
Route::post('RincianBiayaKlaim', [ProviderOnlineController::class, 'getRincianBiayaKlaim']);
|
||||
Route::post('StrukPendaftaran', [ProviderOnlineController::class, 'downloadStrukPendaftaran']);
|
||||
Route::post('StrukPengesahan', [ProviderOnlineController::class, 'downloadStrukPengesahan']);
|
||||
});
|
||||
|
||||
1
Modules/HospitalPortal/Routes/web.php
Normal file → Executable file
1
Modules/HospitalPortal/Routes/web.php
Normal file → Executable file
@@ -13,4 +13,5 @@
|
||||
|
||||
Route::prefix('hospitalportal')->group(function() {
|
||||
Route::get('/', 'HospitalPortalController@index');
|
||||
Route::get('download-log/{id}', 'HospitalPortalController@downloadLog');
|
||||
});
|
||||
|
||||
0
Modules/HospitalPortal/Tests/Feature/.gitkeep
Normal file → Executable file
0
Modules/HospitalPortal/Tests/Feature/.gitkeep
Normal file → Executable file
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user