667 Commits

Author SHA1 Message Date
c484c643f4 Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-16 09:10:01 +07:00
85b61e2d4c update tambah column diagnosis request log 2024-01-16 09:09:53 +07:00
Linksehat Staging Server
ce9c6b198f Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-15 14:14:49 +07:00
Linksehat Staging Server
17b1ac678c Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-15 14:12:57 +07:00
ivan-sim
0c5cab5904 Update TTD 2024-01-15 14:06:24 +07:00
ivan-sim
7f031e3a48 Update TTD 2024-01-15 13:38:00 +07:00
Linksehat Staging Server
4ef4f47d85 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-15 13:10:09 +07:00
ivan-sim
74b109ee58 Update TTD 2024-01-15 12:58:55 +07:00
248456881d tambah item benefit total 2024-01-15 12:02:18 +07:00
546534e5cc hide menu Claim Submit dan Claim Report 2024-01-15 11:13:44 +07:00
Linksehat Staging Server
d125d1bb38 [Production] Build 2024-01-14 12:06:54 +07:00
Muhammad Fajar
62d5dce772 [Clien Portal] Alarm Center - Service Monitoring 2024-01-14 11:35:44 +07:00
ivan-sim
d5d5584ffa Update 2024-01-14 01:48:07 +07:00
ivan-sim
092bc6188f Update ttd 2024-01-14 01:35:31 +07:00
Linksehat Staging Server
d659e8fd4e [Client Portal] - tambah feild item benefit di service monitoring (tb fajri) 2024-01-13 19:28:42 +07:00
Linksehat Staging Server
50fbdc02bc Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-13 18:19:21 +07:00
Linksehat Staging Server
0bda72da48 [Client Portal] Penyesuaian get data alarm center 2024-01-13 18:19:12 +07:00
Muhammad Fajar
26ac5c4cc7 [Client Portal] Fix Alarm Center Query 2024-01-13 15:01:37 +07:00
Linksehat Staging Server
30cfcce4af Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-13 14:49:36 +07:00
Muhammad Fajar
1661dfc123 [Client Portal] Fix Corporate Manage 2024-01-13 14:39:50 +07:00
Linksehat Staging Server
5baa18bf5f Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-13 14:27:12 +07:00
Muhammad Fajar
30fc2201bd [Client Portal] Fix Alarm Center Query 2024-01-13 14:26:31 +07:00
Linksehat Staging Server
bc7225e8cd Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-13 14:11:56 +07:00
Muhammad Fajar
e85c62de06 [Client Portal] Fix Alarm Center 2024-01-13 14:11:44 +07:00
Linksehat Staging Server
bf82c7e83a Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-13 14:00:05 +07:00
Muhammad Fajar
a42d444b82 [Client Portal] Alarm Center 2024-01-13 13:58:49 +07:00
Linksehat Staging Server
48f74d4d1a Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-13 10:54:51 +07:00
Linksehat Staging Server
f16e1510d8 update import benefit 2024-01-12 16:02:47 +07:00
Linksehat Staging Server
118aae8e6d update import request log 2024-01-12 15:23:32 +07:00
Linksehat Staging Server
d1465ae554 update bugs fix 2024-01-12 14:19:17 +07:00
Linksehat Staging Server
bb63e3c0c0 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-12 10:36:02 +07:00
13699a3f03 bugs fix request log 2024-01-12 09:34:15 +07:00
4fe9d768b2 update 2024-01-12 08:00:33 +07:00
86d68ae43b update bugs fix import request log 2024-01-12 06:56:54 +07:00
81fb10fbf0 fitur import request log dan final log 2024-01-12 06:46:10 +07:00
Muhammad Fajar
627b038e23 [Client Portal] Cleanup Corporate 2024-01-12 02:39:03 +07:00
Muhammad Fajar
e58290dbb7 [Client Portal] Fix Dashboard change url & first default corporate & table loading 2024-01-12 01:41:38 +07:00
Linksehat Staging Server
46eda07625 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-11 14:25:57 +07:00
Linksehat Staging Server
2bd20a5742 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-11 14:00:45 +07:00
Linksehat Staging Server
1d927c0ae6 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-11 13:41:00 +07:00
52f7cacfd8 update 2024-01-11 12:54:59 +07:00
339da7f136 update 2024-01-11 12:33:53 +07:00
2318a9d844 optimize 2024-01-11 12:01:02 +07:00
Linksehat Staging Server
dc3b79430e Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-11 10:22:17 +07:00
ec6b6679bb optimize import member 2024-01-11 10:20:32 +07:00
ivan-sim
209df80458 Update 2024-01-10 15:32:44 +07:00
ivan-sim
82f66151fc Update 2024-01-10 11:59:06 +07:00
Linksehat Staging Server
f53c47f277 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-10 11:37:26 +07:00
ivan-sim
0a2c617581 Update 2024-01-10 11:22:10 +07:00
a8686c07a7 update default 2024-01-10 10:54:14 +07:00
Linksehat Staging Server
d1fcc868a9 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-10 10:46:49 +07:00
322ee1501a update no identitas 2024-01-10 10:40:41 +07:00
Linksehat Staging Server
8860f83ec9 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-10 09:46:37 +07:00
Linksehat Staging Server
cb9a9f0c71 update 2024-01-10 09:45:15 +07:00
38d6abbd99 delete no identitas 2024-01-10 09:43:09 +07:00
Linksehat Staging Server
45ecad258d Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-10 08:50:07 +07:00
4b4611c9cc Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-10 08:47:32 +07:00
66f13fe134 comment auto approve request log 2024-01-10 08:47:17 +07:00
ivan-sim
3bf77ff6e4 Update Hospital Portal TTD 2024-01-09 13:34:19 +07:00
Linksehat Staging Server
57bdfb9727 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-09 11:21:59 +07:00
ba4aa586b3 update 2024-01-09 11:16:45 +07:00
Linksehat Staging Server
147b2619c4 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-09 09:32:05 +07:00
3a60aa5206 update 2024-01-09 09:24:16 +07:00
e2be94f0d0 tambah kolom provider di final log dan request log 2024-01-09 09:15:16 +07:00
Linksehat Staging Server
095a9212e3 update request log pdf 2024-01-08 17:13:32 +07:00
Linksehat Staging Server
88baf6be3d Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 17:04:16 +07:00
ivan-sim
b5862650cb Update Hospital portal 2024-01-08 16:49:45 +07:00
Linksehat Staging Server
834c6c9c0f Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 14:45:21 +07:00
ivan-sim
1afbcdfcb3 Update 2024-01-08 14:08:04 +07:00
Linksehat Staging Server
c148b6ebb5 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 13:27:32 +07:00
Linksehat Staging Server
046193d9e2 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 11:49:23 +07:00
Linksehat Staging Server
c02b2a80cc Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 11:48:15 +07:00
ivan-sim
ac6589e424 Update 2024-01-08 11:48:10 +07:00
Linksehat Staging Server
2de59a24c4 logo request log 2024-01-08 11:47:31 +07:00
ivan-sim
8f45808078 Update Hospital 2024-01-08 11:34:09 +07:00
Linksehat Staging Server
4a6454f88c Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-08 11:06:06 +07:00
ivan-sim
55f4aafadb Update Hospital Portal 2024-01-08 09:04:05 +07:00
2de9372308 update 2024-01-07 22:51:07 +07:00
2d3e482b76 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-07 22:47:21 +07:00
ivan-sim
390352d255 Update 2024-01-08 13:26:49 +07:00
e2f9efe952 update hide foto 2024-01-07 22:47:10 +07:00
2ae0f2d19b Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-07 22:26:01 +07:00
f05716756b update fix listing final log 2024-01-07 22:25:52 +07:00
Linksehat Staging Server
2d0ff3a5cb Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-07 13:04:11 +07:00
Linksehat Staging Server
3a394c8800 Merge remote-tracking branch 'origin' into origin/production 2024-01-07 13:01:31 +07:00
5c26076806 update request log 2024-01-07 12:03:55 +07:00
0bc965f96e update field pdf request log 2024-01-07 09:20:30 +07:00
Linksehat Staging Server
474ee19f2a update bugs fix detail final log 2024-01-07 09:08:00 +07:00
43991c1069 update bugs final log 2024-01-07 08:14:38 +07:00
Linksehat Staging Server
d057021ef9 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-07 07:51:45 +07:00
ivan-sim
7ae5775919 Update 2024-01-06 17:23:25 +07:00
Linksehat Staging Server
899f1436e5 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-06 16:31:30 +07:00
Linksehat Staging Server
4b412fa5d2 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-06 16:29:27 +07:00
c99bb1cc91 bugs fix filter 2024-01-06 16:03:02 +07:00
c7ca83bd57 update 2024-01-06 15:58:13 +07:00
8e8b123f08 update bux service monitoring 2024-01-06 15:52:27 +07:00
Linksehat Staging Server
887fa4aa71 typo 2024-01-06 15:49:04 +07:00
ed10e2ad4a bugs fix alarm center 2024-01-06 15:48:06 +07:00
ae9a1f70fc bugs fix tanggal start end date alarm center 2024-01-06 15:40:33 +07:00
Linksehat Staging Server
931245cae9 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-06 15:05:32 +07:00
7db0af3bef update fix member detail 2024-01-06 14:13:13 +07:00
Linksehat Staging Server
ece4e796da Client Portal Build 2024-01-06 13:58:03 +07:00
Muhammad Fajar
aacd93fe6a Fix Member name 2024-01-06 13:52:52 +07:00
Muhammad Fajar
eb662f7c34 Fix SQL & Member Eloquent 2024-01-06 13:52:41 +07:00
Muhammad Fajar
494c13aea8 test sql 2024-01-06 13:09:15 +07:00
Muhammad Fajar
46adf39a4a commit 2024-01-06 12:39:03 +07:00
Muhammad Fajar
8d0dd6fa38 Fix SQL User Profile Client Portal 2024-01-06 12:36:29 +07:00
5c5ad8bae7 update ecard dan enrolment 2 2024-01-06 12:35:58 +07:00
Muhammad Fajar
6c83a43696 Fix Getting Family 2024-01-06 12:33:45 +07:00
Muhammad Fajar
577be2ea63 Test Sql 2024-01-06 12:23:16 +07:00
Muhammad Fajar
b865802806 Client Portal - Fix Employee Data 2024-01-06 12:17:39 +07:00
Muhammad Fajar
562f3121c5 Fix Employee Data - Client Portal 2024-01-06 11:54:34 +07:00
Linksehat Staging Server
2e852f7203 Merge branch 'origin/production' of https://dev.sismedika.online/febio/aso into origin/production 2024-01-06 11:44:12 +07:00
Muhammad Fajar
23081382ce Client Portal - Employee Data 2024-01-06 11:40:40 +07:00
Linksehat Staging Server
fe71286728 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-06 11:38:35 +07:00
a9c48f63a4 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-06 11:24:19 +07:00
eb1f215bdb fixing recode mode 2, history member plan dan register 2024-01-06 11:24:11 +07:00
Linksehat Staging Server
37b8229fc2 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-06 09:59:46 +07:00
Linksehat Staging Server
214bf5b116 update ecard 2024-01-06 09:56:23 +07:00
ivan-sim
55d5d006e3 Update 2024-01-05 17:38:12 +07:00
ivan-sim
a9c68fffc9 Update 2024-01-05 17:28:49 +07:00
c899c40ef1 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-05 17:11:59 +07:00
ivan-sim
efdc0853d8 Update 2024-01-05 17:14:19 +07:00
f410b547db update 2024-01-05 17:11:50 +07:00
ivan-sim
63e684f363 Update 2024-01-05 17:08:42 +07:00
ivan-sim
9a14690bd7 Update 2024-01-05 17:06:45 +07:00
ivan-sim
38c94a32da Update 2024-01-05 17:04:15 +07:00
ivan-sim
f6d69b8e6f Update 2024-01-05 17:03:06 +07:00
ivan-sim
bc0d29f42a Update 2024-01-05 17:01:26 +07:00
251c8509be Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-05 16:48:14 +07:00
ivan-sim
f9075b2bd2 Update Revisi Hospital Portal 2024-01-05 16:55:07 +07:00
e45a4b6f7b update bugs fix record mode 2 2024-01-05 16:48:03 +07:00
7d729f295b Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-05 12:23:05 +07:00
87f2788cdd update bugs fix medicine, user record update-delete, user login 2024-01-05 12:22:56 +07:00
ivan-sim
723d4030ab Update insert 2024-01-04 15:34:39 +07:00
ivan-sim
cf3280cd7a Update add provider 2024-01-04 14:15:17 +07:00
Muhammad Fajar
f208f0b133 fix employee data export 2024-01-04 08:39:53 +07:00
Linksehat Staging Server
3580c93c02 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-04 06:36:47 +07:00
Linksehat Staging Server
2e7ab0e1a1 update ecard dan index claim submit 2024-01-04 06:33:32 +07:00
7c820547c0 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-03 17:06:15 +07:00
baabebe9ed update 2024-01-03 17:05:25 +07:00
82b155fd70 update 2024-01-03 17:03:49 +07:00
ivan-sim
b5afefd71d Update Export Members dan Hide client portal 2024-01-03 16:57:28 +07:00
Linksehat Staging Server
a157c41462 update client 2024-01-03 14:58:25 +07:00
ivan-sim
a9a342f6dd Update Add Provider 2024-01-03 14:37:15 +07:00
Linksehat Staging Server
0b79c76428 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-03 11:48:35 +07:00
Linksehat Staging Server
c68b1f3e61 update composer 2024-01-03 11:48:28 +07:00
Linksehat Staging Server
bdf1c664c5 update 2024-01-03 11:46:52 +07:00
700dbff199 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2024-01-03 11:41:32 +07:00
4e096715c5 update 2024-01-03 11:41:24 +07:00
Muhammad Fajar
290a18737d up 2024-01-03 10:42:22 +07:00
Linksehat Staging Server
2800da9255 Merge remote-tracking branch 'origin/staging' into origin/production 2024-01-03 15:02:22 +07:00
Linksehat Staging Server
f6258fb0df update 2024-01-03 10:27:15 +07:00
Muhammad Fajar
2839d537bd client portal update 2024-01-02 23:29:05 +07:00
ivan-sim
519c8e5ed8 Update FINAL LOG 2024-01-02 16:23:23 +07:00
ivan-sim
3a0c7fc06a Update LOG Awal 2024-01-02 15:47:10 +07:00
Linksehat Staging Server
4e988200b2 update 2024-01-02 14:05:48 +07:00
Muhammad Fajar
df4bd6946f hide notification dashboard & add search employee data 2024-01-02 11:31:39 +07:00
Muhammad Fajar
b7ff05bc87 hide notification 2024-01-02 08:56:26 +07:00
Linksehat Staging Server
4135da3103 client portal build 2024-01-01 01:58:18 +07:00
Muhammad Fajar
64ca019c2c remove client portal 2024-01-01 00:07:35 +07:00
Muhammad Fajar
96034d069a fix cleint portal employee-data, dashboard, hide notification 2023-12-31 23:44:43 +07:00
Linksehat Staging Server
ae884f8cd0 Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-30 09:32:07 +07:00
1660db5123 update 2023-12-30 09:29:41 +07:00
Linksehat Staging Server
9a011beb8c Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-30 08:29:31 +07:00
98233656d5 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-30 08:24:21 +07:00
2b2fae44fc update 2023-12-30 08:24:03 +07:00
9db32ef482 update 2023-12-30 08:23:01 +07:00
Linksehat Staging Server
2d7a5aba1b composer 2023-12-30 07:23:48 +07:00
Linksehat Staging Server
8741f4344f Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-30 07:21:43 +07:00
Linksehat Staging Server
dc3ee65f34 merge 2023-12-30 07:21:14 +07:00
7e836bd9f3 update dokumen log dan final log 2023-12-30 07:17:09 +07:00
Linksehat Staging Server
1aa984b7eb update 2023-12-29 17:47:11 +07:00
Linksehat Staging Server
6b57919bba Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-29 16:06:48 +07:00
ivan-sim
31baf87202 Update alamat users 2023-12-29 15:22:17 +07:00
37558d0198 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-29 14:51:57 +07:00
fe9101a881 update composer 2023-12-29 14:51:42 +07:00
Linksehat Staging Server
e7911cb7d5 Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-29 13:57:34 +07:00
ivan-sim
7c2df15a9f Update cetak final LOG 2023-12-29 13:35:06 +07:00
Linksehat Staging Server
f85f002a8e Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-29 09:09:23 +07:00
ivan-sim
2134de863a Update 2023-12-29 08:58:31 +07:00
62270b6847 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-28 15:51:11 +07:00
19e9e334e2 update ecard dan daily monitoring 2023-12-28 15:50:56 +07:00
ivan-sim
770da6c1f3 Update req log 2023-12-28 13:35:53 +07:00
ivan-sim
9dc60b9141 Update Req LOG Template 2023-12-27 16:11:07 +07:00
ivan-sim
841b319aeb test update2 2023-12-26 16:41:45 +07:00
ivan-sim
b5c8d8c3b6 test update1 2023-12-26 11:51:07 +07:00
ivan-sim
a2a65ec353 test update 2023-12-26 11:43:33 +07:00
ivan-sim
fd49cd9a12 Detail Claim 2023-12-26 10:44:12 +07:00
10f702f2f0 report dan design ecard 2023-12-25 09:54:15 +07:00
c3a4d948a6 Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-25 09:52:13 +07:00
5a439922d9 send email dan daily monitoring 2023-12-25 09:52:03 +07:00
Linksehat Staging Server
fd15e4f377 Merge remote-tracking branch 'origin/staging' into origin/production 2023-12-25 09:43:39 +07:00
ivan-sim
89f879cfcc Update image 2023-12-20 19:05:01 +07:00
ivan-sim
5702ea7a15 Add Column in Claim Request 2023-12-20 18:49:52 +07:00
Linksehat Staging Server
b48b6bfa3e Merge branch 'staging' of https://dev.sismedika.online/febio/aso into staging 2023-12-20 16:44:47 +07:00
ivan-sim
4defd4fa2f Update Claim, Final LOG, Request LOG 2023-12-20 16:27:57 +07:00
40371bd53a Update customer service 2023-12-19 08:56:18 +07:00
e76c480ce9 update final log 2023-12-12 14:35:12 +07:00
Linksehat Staging Server
f4f83b3c7b build 2023-12-07 10:44:41 +07:00
Linksehat Staging Server
f9b970fbd1 tb 2023-12-07 09:31:41 +07:00
Link Medis Sehat
6edf7311f3 tb 2023-12-07 09:29:02 +07:00
ivan-sim
c7d67467a2 Update Request LOG 2023-11-30 11:38:10 +07:00
91b7a10f86 update request log service 2023-11-30 09:05:49 +07:00
dc582244a5 update import/export excel request log 2023-11-29 16:22:00 +07:00
a208d5f11e update requst dan final log 2023-11-29 14:18:35 +07:00
Linksehat Staging Server
a04153fa2a bugs fix forget password 2023-11-23 11:20:08 +07:00
49afc1d28d forget password, reset password 2023-11-23 09:38:59 +07:00
ivan-sim
6d72b1b789 Update notifikasi send email 2023-11-21 12:07:51 +07:00
ivan-sim
0b211e12a4 Update Notification 2023-11-20 17:28:16 +07:00
ivan-sim
676e541385 Notification Hospital Portal 2023-11-20 16:36:27 +07:00
ivan-sim
13ef733010 Update Hospital Portal 2023-11-17 17:16:47 +07:00
Linksehat Staging Server
00b8fa763e Update Final LOG 2023-11-17 08:57:48 +07:00
Linksehat Staging Server
e3aacbb5d5 update import 2023-11-16 10:26:22 +07:00
8be552c141 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-16 10:24:20 +07:00
f5ebb303c6 update improvement 2023-11-16 10:24:17 +07:00
ivan-sim
77fdb46c46 Update pengecekan hospital corporate 2023-11-16 09:24:31 +07:00
0dc10587a8 cek all spesialis 2023-11-15 14:18:05 +07:00
ivan-sim
643fd2b6cd Update 2023-11-14 17:26:26 +07:00
ivan-sim
a1a235f1bb Update 2023-11-14 17:15:50 +07:00
ivan-sim
8f77d8bec0 Update service hospital dan prime center 2023-11-14 16:53:12 +07:00
Linksehat Staging Server
c3b140d1f8 improvement api mobile 2023-11-14 15:06:28 +07:00
c5e103fc57 improvement uat 1 2023-11-14 13:57:33 +07:00
7284354f47 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-13 15:21:48 +07:00
Linksehat Staging Server
d6831f3bfa update 2023-11-13 15:29:00 +07:00
d3c5bfb527 update 2023-11-13 15:21:45 +07:00
Linksehat Staging Server
db275c152d autolinking dan manual linking 2023-11-13 10:23:45 +07:00
Linksehat Staging Server
3a83f90ee3 update error message 2023-11-13 09:00:13 +07:00
Linksehat Staging Server
6bd48241f0 bugs fix avatar 2023-11-10 15:36:15 +07:00
Linksehat Staging Server
bc73088e4a bugs fix relation 2023-11-10 14:06:13 +07:00
Linksehat Staging Server
0c9f69aaad manual linking apps 2023-11-10 11:23:20 +07:00
134caa2d2c manual linking 2023-11-10 09:21:18 +07:00
2587650c2e autocomplete inactive 2023-11-10 09:16:21 +07:00
10e1dc72d7 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-09 17:25:21 +07:00
cea8b476e0 update fitur delete all import 2023-11-09 17:25:16 +07:00
Linksehat Staging Server
b8b308a89f update user model linksehat 2023-11-09 15:36:33 +07:00
Linksehat Staging Server
28fefd82e5 update bugs fix api mobile 2023-11-09 15:27:53 +07:00
3100a1a1b2 update 2023-11-09 14:30:16 +07:00
9a147f32da Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-09 14:30:07 +07:00
1fde7999a5 update 2023-11-09 14:29:58 +07:00
ivan-sim
7cd4f2c929 Update Hospitals Corporate Bisa Import 2023-11-09 11:36:10 +07:00
a9929ad7a2 update api dan template corporate 2023-11-09 11:32:09 +07:00
9c2677771c api update profile 2023-11-09 11:08:29 +07:00
1fcdc6a4b9 update bugs fix 2023-11-08 10:39:25 +07:00
ead5ac35f4 push 2023-11-08 10:19:32 +07:00
e3087e7cbb update origin cros 2023-11-08 09:43:54 +07:00
089fd62bf3 update cross origin 2023-11-08 09:23:36 +07:00
6176b21386 add user manager 2023-11-08 08:31:01 +07:00
8908400d50 bugs fix import claim 2023-11-07 13:18:58 +07:00
c329df499f bugs fix 2023-11-07 12:24:31 +07:00
16454d32cc typo status pernikahan 2023-11-07 12:13:57 +07:00
40ac4feeaa update change profile 2023-11-06 17:03:55 +07:00
1389875c8b Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-06 16:32:12 +07:00
e65c017685 update autocomplete 2023-11-06 16:32:06 +07:00
ivan-sim
754f2ab336 Update Edit History Hospital Care 2023-11-06 16:08:44 +07:00
f4e17d4aec update API profile member 2023-11-06 15:13:41 +07:00
4aa6eaa889 update api user dan export alamr center client 2023-11-06 13:19:05 +07:00
ivan-sim
23886c52d2 Update Claim Request Files 2023-11-03 15:42:56 +07:00
ivan-sim
ec3327b5af Update Upload File Request Dashboard PrimeCenter 2023-11-03 13:57:26 +07:00
korospace
79c8e475e8 finishing benefit configuration 2023-11-03 11:32:09 +07:00
sangpenciptajs
bc429b6d52 import rhf and reusable components from his v3 2023-11-03 08:49:18 +07:00
korospace
16449bd18b fix bug upload file claim request 2023-11-03 08:38:22 +07:00
korospace
186312bb6a Merge branch 'feature/dashboard-create-claim-request' into staging 2023-11-02 20:05:41 +07:00
korospace
bf8bb86857 finishing feature/dashboard-create-claim-request 2023-11-02 20:05:12 +07:00
korospace
22e3061564 progress 2 feature/dashboard-create-claim-request 2023-11-02 17:40:33 +07:00
cff928409d update 2023-11-01 22:47:17 +07:00
e24cb39ff3 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-11-01 22:47:06 +07:00
ivan-sim
c9a2acff35 Update Timeline 2023-11-02 13:17:11 +07:00
ivan-sim
d2e1bb93f0 Update Re-Open Claims 2023-11-02 11:37:35 +07:00
ivan-sim
5384f3ecf2 Update Claims 2023-11-02 11:19:59 +07:00
ivan-sim
01fcaf7181 Update Approve Claim 2023-11-02 10:35:58 +07:00
5b3cddf5fe merge claim detail 2023-11-01 22:46:59 +07:00
korospace
b934fb0727 progress 1 dashboard-create-claim-request 2023-10-31 18:29:05 +07:00
ivan-sim
cd1835d836 Update Claim Services 2023-10-31 12:01:59 +07:00
Linksehat Staging Server
924131534c Update claim services 2023-10-31 10:31:37 +07:00
Linksehat Staging Server
c6940ee83d Update Claims Services 2023-10-31 09:58:53 +07:00
ivan-sim
c38167a50a Claim Services 2023-10-31 09:28:29 +07:00
korospace
de476ad3be finishing slicing ui client benefit config 2023-10-30 18:32:50 +07:00
korospace
e34ec97d27 Merge branch 'feature/laboratorium-result' into staging 2023-10-30 11:02:59 +07:00
korospace
557b8713dd membuat rhf datepicker v2 2023-10-30 11:01:32 +07:00
4fec5df5e6 master formularium 2023-10-30 10:04:54 +07:00
019f4ae066 Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-10-30 10:02:19 +07:00
759e692465 add update function to master formularium 2023-10-30 09:59:03 +07:00
korospace
f625d4225f target blank untuk list dokumen laboratorium 2023-10-28 19:07:04 +07:00
korospace
b76a9b56f0 finishing part 1 2023-10-28 19:00:04 +07:00
korospace
b6095f1301 progress feature/laboratorium-result 2023-10-27 18:09:27 +07:00
korospace
08cf8b5c9b Merge branch 'feature/daily-monitoring' into staging 2023-10-27 16:05:02 +07:00
korospace
4ec2ca9bb2 memperbaiki handle error front end feature/daily-monitoring 2023-10-27 16:04:38 +07:00
korospace
1da3884fee Merge branch 'feature/daily-monitoring' into staging 2023-10-27 15:43:46 +07:00
korospace
0eff99c456 finishing part 2 2023-10-27 15:43:32 +07:00
korospace
f44e50c52b Merge branch 'feature/daily-monitoring' into staging 2023-10-27 15:30:08 +07:00
korospace
670f62328b membuat endpoint daily monitoring 2023-10-27 15:28:02 +07:00
korospace
0585f9f5f0 finishing part 1 2023-10-27 15:23:16 +07:00
239e95f5df add kolom active 2023-10-27 13:57:24 +07:00
495a73770e Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-27 09:31:28 +07:00
63af52cb85 update backend claim history hospital 2023-10-27 09:28:08 +07:00
ivan-sim
0c5960275c Update 2023-10-27 09:07:29 +07:00
adibwp
87864a496c Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-10-26 17:44:55 +07:00
adibwp
010e971b69 add list master formularium 2023-10-26 17:43:47 +07:00
ivan-sim
1c71edd3ed Detail Claim Management 2023-10-26 17:24:41 +07:00
ivan-sim
bf0001ced6 Update Logs Claim 2023-10-26 11:48:42 +07:00
a53a546f1f Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-26 11:35:32 +07:00
8d94ebf524 update bugs fix 2023-10-26 11:35:29 +07:00
ivan-sim
9188e0c882 Update 2023-10-26 11:08:17 +07:00
3ec7727981 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-26 10:33:53 +07:00
adcb4e508d update listing dan edit claim management 2023-10-26 10:32:43 +07:00
korospace
435afb6b61 Merge branch 'ui/master-diagnosis' into staging 2023-10-26 10:18:57 +07:00
korospace
995f1f76f8 finishing UI adjustment - 1 2023-10-26 10:17:17 +07:00
ivan-sim
39486af45c Update Claim Request 2023-10-26 10:09:57 +07:00
ivan-sim
053ef5f8e3 Detail Claim Request 2023-10-26 09:54:40 +07:00
adibwp
0abcaea006 Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-10-25 10:31:31 +07:00
adibwp
f91a8de670 update status function 2023-10-25 10:31:01 +07:00
fb099b352f Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-25 08:48:16 +07:00
2d5c870527 update 2023-10-25 08:47:13 +07:00
5265aecd05 tuning import. listing, edit 2023-10-25 08:46:42 +07:00
ivan-sim
06c4bf6930 Drug Update 2023-10-24 17:12:22 +07:00
ivan-sim
115c284f85 Drug Update 2023-10-24 16:47:30 +07:00
ivan-sim
134cdb072d Drug 2023-10-24 16:10:53 +07:00
adibwp
d7e1cc0a98 add create formularium func 2023-10-24 15:17:05 +07:00
adibwp
33d3bdab37 rebase 2023-10-23 17:12:05 +07:00
adibwp
14427c2d7f integrate data api to detail table 2023-10-23 17:10:55 +07:00
f53945e4a0 backend filter plan 2023-10-23 14:39:24 +07:00
78765225bc update status benefit dan exlusion 2023-10-21 12:04:24 +07:00
8a9870d7ae Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-21 11:09:07 +07:00
9c1f682adf update 2023-10-21 11:07:56 +07:00
ivan-sim
77175e979e Update Member & Hospital 2023-10-20 18:29:34 +07:00
ivan-sim
4708cb3cf8 Typo add hospital 2023-10-20 16:54:27 +07:00
ivan-sim
f8a7e3b2b9 Update Member & Hospital 2023-10-20 16:52:15 +07:00
korospace
9962f160f8 solve conflict 2023-10-20 15:47:18 +07:00
korospace
a1362b5362 finishing - tuning Diagnosis Exclusion 2023-10-20 15:40:30 +07:00
8373885df8 update 2023-10-20 12:31:14 +07:00
e0d68aa01a Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-20 11:22:13 +07:00
614156bbe7 update 2023-10-20 11:22:11 +07:00
ivan-sim
257af7ca9c Member & Hospital 2023-10-20 11:05:42 +07:00
Linksehat Staging Server
51deb0f810 update 2023-10-20 11:03:22 +07:00
Linksehat Staging Server
c380eccc56 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-20 10:54:41 +07:00
Linksehat Staging Server
64fcebdad0 package-lock 2023-10-20 10:54:03 +07:00
03afed696e update 2023-10-20 10:51:29 +07:00
f330607f14 backend formularium 2023-10-20 10:50:10 +07:00
adibwp
aa6df1bdae Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-10-20 09:20:18 +07:00
adibwp
39f7e16fa4 add create corporate formularium 2023-10-20 09:20:11 +07:00
d10b7da080 update 2023-10-20 09:05:02 +07:00
d75638df86 update 2023-10-20 09:04:02 +07:00
8df8269512 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-20 08:58:09 +07:00
853cb334ca update 2023-10-20 08:55:06 +07:00
a08aa05d1e Slicing service dan benefit 2023-10-20 08:51:41 +07:00
korospace
8a3b0f3d11 progress - membuat update activate 2023-10-19 15:12:08 +07:00
korospace
7134f0ff86 progress - membuat update activate 2023-10-19 15:09:14 +07:00
ivan-sim
031291b1f0 Update Devisions pada Prime Center 2023-10-18 08:25:47 +07:00
ivan-sim
7bd574db7d LMSN-218
Improve Slicing bagian detail dashboard di Corporate Prime Center
2023-10-17 10:49:51 +07:00
ivan-sim
f2e5a22c64 LMSN-217
Update slicing hospital portal
2023-10-16 16:21:47 +07:00
ivan-sim
827ce472ba LMSN-217
Improve Slicing tampilan pada hospital portal (List Claim, Detail, Search Member)
2023-10-16 09:55:24 +07:00
c3b745e23b update componen label 2023-10-13 16:15:52 +07:00
a694bc03f3 update claim submit 2023-10-13 10:57:42 +07:00
3e908471cf Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-13 10:47:26 +07:00
54019e998d update fitur alarm center 2023-10-13 10:47:22 +07:00
ivan-sim
44b1a153b1 LMSN-212
Update
2023-10-13 08:35:14 +07:00
ivan-sim
740d113bd0 LMSN-212
Update remove card employee data
2023-10-12 15:43:36 +07:00
ivan-sim
909231a697 LMSN-212
Update image not load
2023-10-12 15:07:15 +07:00
ivan-sim
c9cb5c20e2 LMSN-212
Update render error
2023-10-12 14:56:22 +07:00
ivan-sim
101056ead0 LMSN-212
Update sql
2023-10-12 14:51:54 +07:00
ivan-sim
b77c1e2c74 LMSN-212
Update sql
2023-10-12 14:48:04 +07:00
ivan-sim
6b931a904d LMSN-212
Client/User dapat melihat Claim Report di client portal
2023-10-12 14:38:16 +07:00
ivan-sim
c767c676f4 Update familymember 2023-10-10 13:29:42 +07:00
ivan-sim
ffdf5013fc LMSN-213
Update disbrusment hide dulu
2023-10-10 11:28:51 +07:00
Linksehat Staging Server
b1a109cc89 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-10 10:37:02 +07:00
Linksehat Staging Server
7f4901163c update name dokumen 2023-10-10 10:34:31 +07:00
ivan-sim
49dfb0d02b LMSN-213
Client/User dapat melihat List Claim dan Total Claim
2023-10-10 10:14:12 +07:00
a9e6a750ad Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-10 07:31:23 +07:00
b76739a86b update package json 2023-10-10 07:27:39 +07:00
lasteinsa
1700e8ebfb implement claim submit 2023-10-09 17:25:16 +07:00
b49f78858f update name 2023-10-09 16:12:11 +07:00
1a182aaf9e update bugs fix corporate 2023-10-09 14:10:03 +07:00
a8828b2d79 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-09 13:18:42 +07:00
d69b610c5f pengajuan claim 2023-10-09 13:18:38 +07:00
ivan-sim
4fc196e226 LMSN-191
hapus console log
2023-10-09 10:20:08 +07:00
ivan-sim
55b2945154 LMSN-191
Update
2023-10-09 10:16:23 +07:00
ivan-sim
7e917222aa LMSN-191
Update
2023-10-09 10:04:37 +07:00
ivan-sim
dcc25a02ce LMSN-191
Update
2023-10-09 09:59:46 +07:00
ivan-sim
1527d64033 LMSN-191
Update sort untuk end date
2023-10-09 09:27:29 +07:00
ivan-sim
9a5eb0e74b LMSN-191
Data corporate & member linking ke client portal
2023-10-09 09:15:35 +07:00
84cf41dba8 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-10-06 14:58:36 +07:00
5376873552 update 2023-10-06 14:57:33 +07:00
ivan-sim
271c8610e3 Update request date 2023-09-29 17:13:22 +07:00
1d11e06178 update 2023-09-29 14:41:34 +07:00
bb8ab6e9e4 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-29 14:40:05 +07:00
50762a0581 typo 2023-09-29 14:40:02 +07:00
Muhammad Fajar
f2414e6577 Update Claim Request 2023-09-29 14:17:38 +07:00
ivan-sim
c8afe73c46 Update text date 2023-09-29 14:04:09 +07:00
ivan-sim
e0b2dec912 Update tanggal claim report 2023-09-29 13:53:45 +07:00
ivan-sim
9df7c68ea5 Update Search Member Family 2023-09-29 11:29:09 +07:00
ivan-sim
2673f6fc8b LMSN-191
Update code yang kosong
2023-09-29 09:01:50 +07:00
601a8e5aff update claim management 2023-09-28 17:28:22 +07:00
0fd79b8284 update requeset 2023-09-28 16:00:36 +07:00
Muhammad Fajar
9b4579e8f1 fix claim report 2023-09-27 19:18:31 +07:00
Muhammad Fajar
52783b191a commit 2023-09-27 17:49:36 +07:00
ivan-sim
544eb32a81 LMSN-191
Data corporate & member linking ke client portal
2023-09-27 17:37:46 +07:00
Muhammad Fajar
1abb9b2539 add pdf custom file 2023-09-27 15:54:00 +07:00
Muhammad Fajar
c8dd135558 update uploading file claim report client portal 2023-09-27 15:48:59 +07:00
Muhammad Fajar
2f7a450d28 commit client portal 2023-09-27 15:39:20 +07:00
3f54e07fb5 update package 2023-09-27 15:10:52 +07:00
a83115ea65 update 2023-09-27 15:08:23 +07:00
a916dc4a44 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-27 15:04:37 +07:00
975c5169e3 update bugs upload file 2023-09-27 15:04:34 +07:00
Linksehat Staging Server
927700b528 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-27 12:07:56 +07:00
Linksehat Staging Server
5d614d604a update 2023-09-27 12:07:30 +07:00
23ce443b52 update input transaksi 2023-09-27 12:04:59 +07:00
4a6d11f5d3 update 2023-09-26 17:24:34 +07:00
8ef4de1157 penyesuiaan data claim 2023-09-26 17:23:00 +07:00
48ba75ffe3 update log 2023-09-26 11:16:39 +07:00
314c4ec5a2 update table 2023-09-26 10:10:28 +07:00
3059a4ae0e debug aso 2023-09-26 09:42:50 +07:00
78ad8d1538 update 2023-09-25 17:27:51 +07:00
cfb2943ed2 update code 2023-09-25 16:59:21 +07:00
3ddf40a608 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-25 16:40:29 +07:00
551bea37a1 update 2023-09-25 16:40:24 +07:00
Linksehat Staging Server
6c800bb716 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-25 16:25:28 +07:00
Linksehat Staging Server
b3188f0ca7 update 2023-09-25 16:25:10 +07:00
738392c143 Update Master Formularium dan Corporate formularium 2023-09-25 16:21:38 +07:00
72958019f1 update history corporate 2023-09-22 10:53:03 +07:00
969eb93509 update rename 2023-09-21 18:23:28 +07:00
e8c2396442 Update exclusion corporate setting 2023-09-21 18:06:34 +07:00
ae1b213ff0 update name 2023-09-21 11:54:40 +07:00
9fb0cc3eb6 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-21 11:33:03 +07:00
c262919449 update name 2023-09-21 11:32:59 +07:00
Linksehat Staging Server
7b2223545f Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-21 11:03:10 +07:00
Linksehat Staging Server
bddd076db0 update 2023-09-21 11:02:58 +07:00
0b354dcf22 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-21 10:56:09 +07:00
0f60176c35 update master icd 2023-09-21 10:55:57 +07:00
ivan-sim
c5043d56f0 LMSN-188
Update text T&C
2023-09-19 17:07:17 +07:00
ivan-sim
c03b628735 Bug case 2023-09-19 17:04:02 +07:00
ivan-sim
3224804424 Bug case 2023-09-19 17:01:11 +07:00
3ef29c1de6 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-19 16:27:32 +07:00
26fca92966 update active 2023-09-19 16:27:28 +07:00
Linksehat Staging Server
848ddb4d8a Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-19 15:01:26 +07:00
Linksehat Staging Server
fffd02d600 update 2023-09-19 15:01:17 +07:00
219aa35693 Merge branches 'staging' and 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-09-19 14:54:29 +07:00
7ee4a3ef38 Update fitur impor dan history exlusion 2023-09-19 14:54:19 +07:00
ivan-sim
25cb97250b LMSN-188
Update model files doc
2023-09-19 14:12:22 +07:00
ivan-sim
21e146da7e LMSN-188
LMS dapat upload dokumen TC corporate
2023-09-19 13:42:05 +07:00
ivan-sim
ed2d5ee90a Update logo 2023-09-18 09:04:33 +07:00
ivan-sim
6ed5983175 Update setBirthDate 2023-09-18 08:49:49 +07:00
ivan-sim
9c2956c733 Update locale language json 2023-09-18 08:23:23 +07:00
ivan-sim
08cd475d90 'update' 2023-09-15 13:29:24 +07:00
e8f90772de update 2023-09-15 11:25:23 +07:00
4a155b2b70 update exclusion 2023-09-15 11:20:27 +07:00
Linksehat Staging Server
c365e6b021 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-14 13:46:26 +07:00
9f3b59a634 bugs end chat 2023-09-14 13:45:12 +07:00
Linksehat Staging Server
450cf57339 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-14 13:31:34 +07:00
c0322eac3b update range report livechat 2023-09-14 13:30:35 +07:00
Linksehat Staging Server
a7c7a961c7 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-11 09:02:13 +07:00
e8fb41a57d update 2023-09-11 09:00:28 +07:00
Linksehat Staging Server
a64ed344ee Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-10 19:12:55 +07:00
5e8bcab6ac update time request 2023-09-10 19:06:17 +07:00
Linksehat Staging Server
fdb382f90b Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-10 07:22:43 +07:00
45d52ed655 update fix 2023-09-10 07:19:50 +07:00
afda88cea7 update 2023-09-10 07:16:12 +07:00
03e33fb375 update 2023-09-10 07:15:11 +07:00
115dfbda4d update 2023-09-10 07:14:02 +07:00
78e3211bdd update data 2023-09-10 07:11:10 +07:00
Linksehat Staging Server
690d2b2ed7 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-09 16:16:51 +07:00
f021d672a0 update time 2023-09-09 16:16:00 +07:00
23685cd87c update time 2023-09-09 15:56:57 +07:00
Linksehat Staging Server
ee20c120e2 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-09 15:46:28 +07:00
8287bff759 Update metode pembayaran 2023-09-09 15:42:51 +07:00
375a22ef69 report update 2023-09-09 14:01:59 +07:00
Linksehat Staging Server
4f33f2258a Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-09 12:36:30 +07:00
25b668ad2b update name 2023-09-09 10:42:43 +07:00
cff5dba314 Update Report Livechat 2023-09-09 10:36:01 +07:00
Linksehat Staging Server
4df8409e60 merge 2023-09-04 15:28:21 +07:00
Linksehat Staging Server
8011d117d6 Merge remote-tracking branch 'origin/staging' into origin/production 2023-09-04 15:07:09 +07:00
Linksehat Staging Server
4a8079e667 Merge commit ' into origin/production 2023-09-04 15:02:15 +07:00
Muhammad Fajar
ab194600c2 comment nIDAppointment 2023-09-04 14:22:56 +07:00
Lasteinsa
565c6cbbfc Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-09-04 13:34:35 +07:00
Lasteinsa
7051758b12 several changes 2023-09-04 13:34:04 +07:00
Muhammad Fajar
05f26145f8 update appointmentDetail null export 2023-09-04 11:15:41 +07:00
Muhammad Fajar
510269c9ee export excel livechat 2023-09-04 11:07:12 +07:00
Linksehat Staging Server
f7777954a4 corporate export 2023-09-01 16:02:54 +07:00
Linksehat Staging Server
df6b3f5c59 bugs fixs 2023-09-01 15:12:45 +07:00
Linksehat Staging Server
e0f3a38be0 report livechat 2023-08-31 16:39:03 +07:00
Muhammad Fajar
26b82db77b datetime to date filter 2023-08-31 15:54:01 +07:00
Lasteinsa
290de81ee8 list date 2023-08-31 14:28:37 +07:00
Lasteinsa
83de998900 format time 2023-08-31 14:27:37 +07:00
Lasteinsa
5db9121a16 Merge branch 'staging' of http://itcorp.primaya.id:3000/rajif/aso into staging 2023-08-31 13:45:58 +07:00
Lasteinsa
96ee80f681 several detail changes 2023-08-31 13:45:49 +07:00
Linksehat Staging Server
18d46f09c7 Update livechat 2023-08-31 13:42:04 +07:00
8f74be633e update 2023-08-31 11:36:10 +07:00
7df5586258 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-08-31 09:59:27 +07:00
42a116e9ac bugs fix division 2023-08-31 09:58:44 +07:00
Linksehat Staging Server
07589caba1 Merge remote-tracking branch 'refs/remotes/origin/staging' into staging 2023-08-30 17:43:19 +07:00
Linksehat Staging Server
fc52c7ece6 update 2023-08-30 17:41:59 +07:00
d3fb049c97 Update Bugs Fix Import 2023-08-30 17:39:35 +07:00
a5dd6dfca3 Merge branch 'staging' of itcorp.primaya.id:ra 2023-08-30 11:09:12 +07:00
2f336955ab merge 2023-08-30 11:08:01 +07:00
Linksehat Staging Server
a54708abb5 updated 2023-08-14 16:57:46 +07:00
Linksehat Staging Server
9057e5d00f update 2023-08-14 16:56:18 +07:00
kevin
db4b0193dd rating 2023-08-14 16:55:34 +07:00
kevin
f05a2c879e Merge remote-tracking branch 'refs/remotes/origin/staging' into staging 2023-08-09 09:40:49 +07:00
kevin
137b0a5fb6 test 2023-08-09 09:39:15 +07:00
kevin
3bfe8547a7 test 2023-08-09 09:34:40 +07:00
Linksehat Staging Server
0c673a4cfb Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:57:29 +07:00
ivan
8ecbcb1a5c Update 2023-07-31 16:56:50 +07:00
Linksehat Staging Server
cf4ce17ffc Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:46:08 +07:00
ivan
9327c6b45f update 2023-07-31 16:45:01 +07:00
Linksehat Staging Server
53bacd1397 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:25:49 +07:00
ivan
c1f34dcb26 Update 2023-07-31 16:25:22 +07:00
Linksehat Staging Server
b11829bc7e Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:15:46 +07:00
ivan
cfa44187c1 update 2023-07-31 16:12:24 +07:00
Linksehat Staging Server
73b9834fe9 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:10:09 +07:00
ivan
6b52078dc9 Update 2023-07-31 16:09:52 +07:00
Linksehat Staging Server
baf5fe7f89 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:07:40 +07:00
ivan
73416c3e46 Update 2023-07-31 16:07:05 +07:00
Linksehat Staging Server
7250d13455 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 16:03:53 +07:00
ivan
e87d7e334f Update 2023-07-31 16:02:39 +07:00
Linksehat Staging Server
6b6b0e5059 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 15:42:57 +07:00
ivan
b770de761a Update 2023-07-31 15:40:41 +07:00
Linksehat Staging Server
13315465b9 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 12:01:58 +07:00
ivan
c23defa5fc Update 2023-07-31 12:01:02 +07:00
Linksehat Staging Server
fce14eeb14 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 11:57:08 +07:00
ivan
2e78d99b5a Update 2023-07-31 11:56:52 +07:00
Linksehat Staging Server
62f57e8161 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 11:54:44 +07:00
ivan
d9ac3bfd60 Update 2023-07-31 11:54:31 +07:00
Linksehat Staging Server
3d2b08c104 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 11:51:35 +07:00
ivan
460e2e6c03 Update 2023-07-31 11:51:16 +07:00
Linksehat Staging Server
58ce71c561 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 11:48:23 +07:00
ivan
318d4437a6 Update 2023-07-31 11:47:35 +07:00
Linksehat Staging Server
4f0daaceff Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-31 11:34:01 +07:00
ivan
0a214723cb Update hospital-portal 2023-07-31 11:32:25 +07:00
Linksehat Staging Server
49fe9864cd Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 16:22:12 +07:00
ivan
786a0a24b3 update 2023-07-28 16:09:34 +07:00
Linksehat Staging Server
ba93c9cba6 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 16:00:47 +07:00
ivan
886d8e6321 Update 2023-07-28 16:00:25 +07:00
Linksehat Staging Server
3e9bba2941 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 15:34:54 +07:00
ivan
1b15a7428c Test language 2023-07-28 15:34:22 +07:00
Linksehat Staging Server
9c0109fd89 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 15:30:13 +07:00
ivan
d8e7ea771b Test load flag 2023-07-28 15:28:43 +07:00
Linksehat Staging Server
3cf302abe8 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 10:30:59 +07:00
c858b20028 delete debug firstname 2023-07-28 10:29:45 +07:00
Linksehat Staging Server
7e2cd73536 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-28 10:24:42 +07:00
dccd4f70b9 update real-time ke lms 2023-07-28 10:23:28 +07:00
Linksehat Staging Server
6201fbe2c8 update edit member 2023-07-27 11:32:09 +07:00
Linksehat Staging Server
bff6c1bc61 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 11:30:09 +07:00
24a4710318 actived comment 2023-07-27 11:29:55 +07:00
Linksehat Staging Server
6ced3a0f9f Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 11:21:50 +07:00
b763a2bec0 update 2023-07-27 11:21:08 +07:00
Linksehat Staging Server
5092569f48 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 10:47:22 +07:00
ivan
bcf801fdf1 update plan id 2023-07-27 10:46:39 +07:00
b2ae4a63c4 update plan id 2023-07-27 10:45:19 +07:00
ivan
51c5fe813f Search pada member belum bisa 2023-07-27 10:42:49 +07:00
Linksehat Staging Server
aed9d5d4ad Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 10:38:44 +07:00
ivan
d58ad05cbd Search pada member belum bisa 2023-07-27 10:38:30 +07:00
Linksehat Staging Server
0a8a8c94f3 Merge remote-tracking branch 'origin/staging' 2023-07-27 09:45:54 +07:00
Linksehat Staging Server
0eaae544d1 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 09:32:57 +07:00
cb7e0bb484 update bugs listing member 2023-07-27 09:32:17 +07:00
Linksehat Staging Server
055b0d234d Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-27 09:12:37 +07:00
ivan
bc949dcea7 Update where corporat_id yang terkomen 2023-07-27 09:11:34 +07:00
Linksehat Staging Server
396c05a4d2 update 2023-07-26 18:03:02 +07:00
Linksehat Staging Server
7240e9803e Merge branch 'master' of itcorp.primaya.id:rajif/aso 2023-07-26 17:58:02 +07:00
Linksehat Staging Server
4ff72d3819 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:47:40 +07:00
ivan
5127d8a73b Update 2023-07-26 17:47:28 +07:00
Linksehat Staging Server
7e21e20d0d Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:44:01 +07:00
ivan
2c3e720c83 update 2023-07-26 17:43:49 +07:00
Linksehat Staging Server
f26b5d2e9b Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:42:55 +07:00
ivan
ec5ef5eb87 Update 2023-07-26 17:42:44 +07:00
Linksehat Staging Server
4e6d4abb06 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:40:50 +07:00
ivan
8ea3a1d2e5 Update 2023-07-26 17:40:40 +07:00
Linksehat Staging Server
c011fc3c0d Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:38:52 +07:00
ivan
13d4fac65c Update 2023-07-26 17:38:33 +07:00
Linksehat Staging Server
bc1c209b07 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:35:29 +07:00
ivan
af9864d89f Update 2023-07-26 17:35:08 +07:00
eb3e3fa981 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:30:45 +07:00
Linksehat Staging Server
ebf2dc8c0f Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:29:39 +07:00
ivan
6f7e94e901 Update 2023-07-26 17:29:28 +07:00
875a932c23 update member 2023-07-26 17:28:28 +07:00
Linksehat Staging Server
af7dc0e122 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:28:17 +07:00
ivan
aa85d03ba8 Update 2023-07-26 17:28:07 +07:00
Linksehat Staging Server
8f4827efc0 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:27:06 +07:00
ivan
cae869f326 Update 2023-07-26 17:26:55 +07:00
Linksehat Staging Server
40aab73ca0 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:23:24 +07:00
ivan
621ce08924 Update 2023-07-26 17:22:57 +07:00
Linksehat Staging Server
6f1bba1c33 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:15:22 +07:00
ivan
0f3ab9d6b5 Update 2023-07-26 17:14:59 +07:00
Linksehat Staging Server
f89bd8423b Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-26 17:04:17 +07:00
ivan
96ed61c0b6 Update group by person_id 2023-07-26 17:02:40 +07:00
Linksehat Staging Server
b7a897a1c0 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-20 17:55:59 +07:00
ivan
e25f313b58 Update reload dataTable 2023-07-20 17:34:11 +07:00
ivan
23d75000b9 Update api url hospital-portal 2023-07-20 17:03:35 +07:00
ivan
59c56ae90f Update histori file MCU 2023-07-20 16:52:08 +07:00
Linksehat Staging Server
3726513af7 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-20 13:42:48 +07:00
ivan
4c8570b542 Update validation, dll Hospital-Portal 2023-07-20 11:51:44 +07:00
Linksehat Staging Server
033625c34e Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-18 14:56:18 +07:00
Muhammad Fajar
5632e9ff29 LMSN-36
Request - Fitur attachment MCU di Prime Center
2023-07-18 11:58:55 +07:00
Linksehat Staging Server
45661cdc78 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-07-11 11:57:07 +07:00
pajri
40da45c9ff update data di service monitoring, dan alarm center benefit summary 2023-07-07 10:30:17 +07:00
Linksehat Staging Server
7e9c6cf028 merger 2023-07-04 10:05:53 +07:00
Linksehat Staging Server
ae8925be0a merge 2023-07-04 10:05:05 +07:00
kevin
2157c14f8d Merge remote-tracking branch 'refs/remotes/origin/staging' into staging 2023-07-04 09:42:37 +07:00
kevin
c942856933 Prescription 2023-07-04 09:35:33 +07:00
Ivan Julian
46416cb6ac commit permission 2023-07-03 11:39:08 +07:00
12f8828f9f env local 2023-07-03 11:32:41 +07:00
ff89f2ac8b update aso 2023-06-19 10:50:29 +07:00
kevin
b05f052848 request 2023-06-16 10:26:56 +07:00
Linksehat Staging Server
2ffb62b564 Merge remote-tracking branch 'origin/staging' 2023-06-15 14:56:11 +07:00
b550349835 update 2023-06-15 14:55:23 +07:00
Linksehat Staging Server
5410404141 update 2023-06-15 11:38:47 +07:00
Linksehat Staging Server
dcd97386b0 Merge remote-tracking branch 'origin/staging' 2023-06-15 11:37:41 +07:00
914b9b0c94 update 2023-06-14 14:35:37 +07:00
4c59fd21b5 update 2023-06-14 11:10:04 +07:00
569d356b6b automatic linking 2023-06-14 10:47:11 +07:00
554d0048e7 update 2023-06-13 14:15:01 +07:00
dbdeed0d5b update 2023-06-13 13:42:06 +07:00
d49ef7d99e update 2023-06-13 13:31:35 +07:00
Linksehat Staging Server
1e8fa839f4 Merge remote-tracking branch 'origin/staging' 2023-06-13 11:39:11 +07:00
Linksehat Staging Server
6ab1adce5e add 2023-06-13 11:37:15 +07:00
8f532e655f update 2023-06-13 11:33:42 +07:00
cbc7dfdb99 update colom service code, policy id dan claim reques 2023-06-09 15:17:39 +07:00
40d4500651 tambah field payment type 2023-06-09 15:11:44 +07:00
kevin
3a8a7438ba update banyak 2023-06-09 13:52:54 +07:00
684e63cd6f update reason 2023-06-09 12:54:59 +07:00
1cebcdb8f8 update 2023-06-09 12:32:18 +07:00
1db1c20531 update claim 2023-06-09 12:29:29 +07:00
7182b0107c update 2023-06-09 12:26:34 +07:00
01727bd02b add export report 2023-06-09 12:00:51 +07:00
20c2bea127 claim request 2023-06-08 13:35:58 +07:00
f7e8cd550b Update limit dashboard 2023-06-08 13:03:37 +07:00
778d2b5bb5 Update Claim 2023-06-08 11:41:19 +07:00
afafed11d5 update kolom center 2023-06-07 09:32:44 +07:00
ff3ac11071 update icon history 2023-06-07 09:27:02 +07:00
7a83409028 Update reason benefit 2023-06-06 09:28:22 +07:00
4cc2ae24b8 add reason in corporate, plan, service 2023-06-05 09:01:43 +07:00
Linksehat Staging Server
4fb2bab64e build 2023-05-26 09:35:23 +07:00
10af60c4b4 update validasi 2023-05-25 11:04:48 +07:00
Fajar
d17513da44 build 2023-05-24 17:14:37 +07:00
Fajar
57125b06af disable show.tsx src/pages/claims 2023-05-24 17:10:26 +07:00
root
d999d86959 update 2023-05-24 16:55:56 +07:00
Linksehat Staging Server
fff9b7cb18 merge 2023-05-24 10:06:46 +07:00
Linksehat Staging Server
cb87cffbb5 merge 2023-05-24 10:02:13 +07:00
f7838352b0 update validasi benefit & plan 2023-05-24 09:56:47 +07:00
6f49e54631 update messsage 2023-05-22 16:30:34 +07:00
7c40b61a3c update lagi 2023-05-22 16:28:53 +07:00
726cf2e192 update validasi member 2023-05-22 15:00:35 +07:00
9f49f0e825 update bugs fixing doble log 2023-05-22 09:14:38 +07:00
a56182aed1 add column recode mode in data member list 2023-05-17 16:10:54 +07:00
e29e635cb6 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-17 15:43:10 +07:00
cde3ced75b download membership 2023-05-17 15:42:36 +07:00
Linksehat Staging Server
ed3474ac47 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-17 15:38:47 +07:00
Linksehat Staging Server
cf05966f96 merge 2023-05-17 15:38:07 +07:00
c82475da2f update 2023-05-17 15:35:24 +07:00
e057de3f62 update enrollment 2023-05-17 15:32:07 +07:00
b377625805 update 2023-05-17 15:22:07 +07:00
31423c255e Update 2023-05-17 15:19:24 +07:00
a10fa9db21 update validasi date terminated 2023-05-17 11:35:40 +07:00
3f40170043 update 2023-05-17 11:29:02 +07:00
da68ae3e05 add validasi import member ship 2023-05-17 09:16:42 +07:00
a454461449 update member 2023-05-15 14:31:39 +07:00
ca9ebdb3a1 update 2023-05-15 14:25:56 +07:00
02e84b262f update enrollment 2023-05-15 11:28:39 +07:00
414d9de369 update 2023-05-15 11:15:47 +07:00
ee0db6d2ab update 2023-05-15 11:12:54 +07:00
51fd8f57b3 migration 2023-05-15 11:11:58 +07:00
342725ebcc Update Validasi 2023-05-15 11:10:16 +07:00
Linksehat Staging Server
7d8e5800d1 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-10 16:33:02 +07:00
Linksehat Staging Server
a2eac07c67 Build 2023-05-10 16:32:58 +07:00
Linksehat Staging Server
079641e87b Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-10 11:04:12 +07:00
Linksehat Staging Server
e2d64faf55 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-08 11:20:06 +07:00
Linksehat Staging Server
2016ba1726 Merge branch 'staging' of itcorp.primaya.id:rajif/aso into staging 2023-05-08 08:51:08 +07:00
Linksehat Staging Server
ce024c2bcd merge 2023-05-08 08:50:15 +07:00
906 changed files with 91855 additions and 52196 deletions

83
.env-example Normal file
View File

@@ -0,0 +1,83 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:axfmcy3qUMuukm8emaW6G0x/7SS3wWcLITXo+YAyCps=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=aso_two
DB_USERNAME=mysql
DB_PASSWORD=password
OLDLMS_DB_CONNECTION=mysql
OLDLMS_DB_HOST=127.0.0.1
OLDLMS_DB_PORT=3306
OLDLMS_DB_DATABASE=linksehat
OLDLMS_DB_USERNAME=mysql
OLDLMS_DB_PASSWORD=password
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
#MAIL_DRIVER=smtp
#MAIL_HOST=smtp.gmail.com
#MAIL_PORT=587
#MAIL_USERNAME=tumbaltumbal11@gmail.com
#MAIL_PASSWORD="pxrrksphndlvkgca"
#MAIL_USERNAME=noreply@primayahospital.com
#MAIL_PASSWORD="eqplciswxchsaart"
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=b488d13fde4349
MAIL_PASSWORD=63b64761d270ba
MAIL_ENCRYPTION=tls
MAIL_ENCRYPTION=TLS
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID="app-id"
PUSHER_APP_KEY="app-key"
PUSHER_APP_SECRET="app-secret"
PUSHER_HOST=localhost
PUSHER_PORT=6001
PUSHER_SCHEME=http
# PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
LMS_API_URL="http://lmsapi.primaya.id"
DUITKU_MERCHANT_KEY=
DUITKU_MERCHANT_CODE=
DUITKU_IS_SANDBOX=TRUE
WKHTML_PDF_BINARY=/var/www/aso/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=

View File

@@ -1,59 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
OLDLMS_DB_CONNECTION=mysql
OLDLMS_DB_HOST=127.0.0.1
OLDLMS_DB_PORT=3306
OLDLMS_DB_DATABASE=linksehat
OLDLMS_DB_USERNAME=mysql
OLDLMS_DB_PASSWORD=password
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

View File

@@ -2,13 +2,21 @@
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use App\Models\Claim;
use App\Models\CorporateEmployee;
use App\Models\Icd;
use App\Models\ClaimHistoryCare;
use App\Models\Corporate;
use App\Services\ClaimService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimShowResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class ClaimController extends Controller
{
@@ -20,7 +28,7 @@ class ClaimController extends Controller
{
$claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id);
dd($claims);
// dd($claims);
return Helper::responseJson([
'count_requested' => 0,
@@ -133,4 +141,124 @@ class ClaimController extends Controller
{
//
}
public function export($corporate_id){
$corporate = Corporate::where('id', $corporate_id)->with(['currentPolicy'])->first();
$member_id = CorporateEmployee::where('corporate_id', $corporate_id)->get('member_id')->toArray();
// dd($member_id);
$claim = Claim::whereIn('member_id', $member_id)->with(['member', 'member.plans'])->get();
$data = [];
if (count( $claim) > 0){
$temp = [];
foreach($claim as $c) {
$diagnosis = ClaimHistoryCare::where('claim_id', 34)->with('icd')->get();
$diagnosisName = '';
if (count($diagnosis) > 0){
$tempDiagnosis = [];
foreach($diagnosis as $key => $d){
$diagnosis = Icd::where('id', $d['main_diagnosis_id'])->first();
array_push($tempDiagnosis, $diagnosis->name);
}
$diagnosisName = implode(", ", $tempDiagnosis);
}
$temp['id'] = $c['id'];
$temp['plan_id'] = $c['member']['plans'][0]['code'];
$temp['payor_id'] = $c['member']['payor_id'];
$temp['corporate_id'] = $corporate->name;
$temp['policy_number'] = $corporate->currentPolicy->code;
$temp['member_id'] = $c['member']['member_id'];
$temp['benefit_code'] = $c['benefit_code'];
$temp['benefit_desc'] = $c['benefit_desc'];
$temp['amount_incurred'] = $c['amount_incurred'];
$temp['amount_approved'] = $c['amount_approved'];
$temp['amount_not_approved'] = $c['amount_not_approved'];
$temp['excess_paid'] = $c['excess_paid'];
$temp['diganosis'] = $diagnosisName;
array_push($data, $temp);
}
$headers = [
['value' => 'Plan ID', 'cell' => 'A1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Payor ID', 'cell' => 'B1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Corporate ID', 'cell' => 'C1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Policy Number', 'cell' => 'D1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Member ID', 'cell' => 'E1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Code', 'cell' => 'F1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Desc', 'cell' => 'G1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Incurred', 'cell' => 'H1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Approved', 'cell' => 'I1', 'mergeCell' => false, 'mergeToCell' => ''],
['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);
}
$startFrom = 2;
foreach($data as $i => $d){
$sheet->setCellValue('A' . $startFrom, $d['plan_id'] ?? '-');
$sheet->setCellValue('B' . $startFrom, $d['payor_id'] ?? '-');
$sheet->setCellValue('C' . $startFrom, $d['corporate_id'] ?? '-');
$sheet->setCellValue('D' . $startFrom, $d['policy_number'] ?? '-');
$sheet->setCellValue('E' . $startFrom, $d['member_id'] ?? '-');
$sheet->setCellValue('F' . $startFrom, $d['benefit_code'] ?? '-');
$sheet->setCellValue('G' . $startFrom, $d['benefit_desc'] ?? '-');
$sheet->setCellValue('H' . $startFrom, $d['amount_incurred'] ?? '-');
$sheet->setCellValue('I' . $startFrom, $d['amount_approved'] ?? '-');
$sheet->setCellValue('J' . $startFrom, $d['amount_not_approved'] ?? '-');
$sheet->setCellValue('K' . $startFrom, $d['excess_paid'] ?? '-');
$sheet->setCellValue('L' . $startFrom, $d['diganosis'] ?? '-');
$startFrom++;
}
foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K'] as $header) {
if ($header === 'A') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px');
} elseif ($header === 'H' || $header === 'I') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px');
} else {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true);
}
}
$spreadsheet->getActiveSheet()->getStyle('A2:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$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
]);
}
}
}

View File

@@ -2,62 +2,275 @@
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\ClaimRequest;
use Modules\Client\Transformers\ClaimReport\ShowResources;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use App\Models\File;
use Illuminate\Http\Request;
class ClaimReportController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
public function claimStatus($corporateId)
{
$requesteds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->where('status', 'requested')
->get();
$approveds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'approved'))
->where('status', 'approved')
->get();
$rejecteds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'declined'))
->where('status', 'approved')
->get();
$disbrusments = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'disbrusmented'))
->where('status', 'approved')
->get();
return Helper::responseJson([
'requesteds' => count($requesteds),
'approveds' => count($approveds),
'rejecteds' => count($rejecteds),
'disbrusments' => count($disbrusments)
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function claimDetail($corporate_id, $claimRequestId)
{
//
$claimRequestId = Crypt::decrypt($claimRequestId);
$status = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
$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();
$results['documents'] = $documents;
return Helper::responseJson($results);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function requestFiles(Request $request, $corporate_id, $claim_id)
{
//
$claim_id = Crypt::decrypt($claim_id);
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function claimDetailHistory($corporate_id, $claimRequestId)
{
//
$claimRequestId = Crypt::decrypt($claimRequestId);
$member = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.code','members.member_id', 'members.name'
)
->first();
$results['member'] = $member;
$claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_items.nominal_ditagihkan',
'claim_items.nominal_dicover',
'benefits.description',
'claim_requests.submission_date'
)
->orderBy('claim_items.id', 'desc')
->get();
$results['claim_item'] = $claim_item;
$tot_claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
DB::raw('SUM(claim_items.nominal_ditagihkan) AS nominal_ditagihkan'),
DB::raw('SUM(claim_items.nominal_dicover) AS nominal_dicover'),
DB::raw('(SUM(claim_items.nominal_ditagihkan) - SUM(claim_items.nominal_dicover)) AS difference'),
)
->groupBy('claim_items.id')
->orderBy('claim_items.id', 'desc')
->first();
$results['tot_claim_item'] = $tot_claim_item;
return Helper::responseJson($results);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function show($corporateId, $claimRequestId)
{
//
$data = ClaimRequest::query()
->with([
'histories:historiable_type,historiable_id,title,description,created_at',
'member:id,person_id,name_prefix,name,name_suffix' => [
'person:id,name_prefix,name,name_suffix,gender'
],
'claim:id,status',
'claimResults',
'claimConditions',
'claimDiagnosis'
])
->find($claimRequestId, ['id', 'submission_date', 'member_id', 'claim_id', 'status']);
return Helper::responseJson(new ShowResources($data));
}
}

View File

@@ -0,0 +1,254 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Events\ClaimRequested;
use App\Helpers\Helper;
use App\Models\File;
use App\Models\Member;
use App\Models\ClaimRequest;
use App\Services\ClaimRequestService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class ClaimRequestController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = 'CP';
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)
{
$request->validate([
'member_id' => 'required|array',
'member_id.*' => 'required',
'service_code.*' => 'required|in:OP,IP'
]);
if ($request->member_id){
foreach($request->member_id as $key => $member_id){
$code = $this->getNextCode();
$member = Member::find($member_id);
DB::beginTransaction();
try {
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'reimbursement',
serviceCode: $request->service_code[$key],
);
// ClaimRequested::dispatch($newClaimRequest);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'client-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'),
]);
$storage_path = storage_path() . "/app/public";
$folder = "claim/";
if (is_dir($storage_path . "/" . $folder) == false) {
mkdir($storage_path . "/" . $folder, 0770, true);
}
if (isset($_FILES['laboratorium'])) {
foreach ($_FILES['laboratorium']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-result-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['laboratorium']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['laboratorium']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['laboratorium']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['prescription'])) {
foreach ($_FILES['prescription']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-diagnosis-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['prescription']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['prescription']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['prescription']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['invoice'])) {
foreach ($_FILES['invoice']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-kondisi-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['invoice']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['invoice']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['invoice']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
* 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)
{
//
}
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');
// $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;
}
return self::makeCode($next_number);
}
public static function makeCode($next_number)
{
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Member;
use App\Models\Corporate;
use App\Models\File;
use App\Services\CorporateMemberService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources;
use Modules\Client\Transformers\Dashboard\MemberResources as ClaimSubmitMemberResources;
use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources;
use Modules\Client\Transformers\Dashboard\MemberAlarmCenterResources as DashboardMemberAlarmResources;
use Modules\Client\Transformers\DataMemberResource;
use Illuminate\Support\Facades\DB;
class CorporateCurrentController extends Controller
{
public function __construct(public CorporateMemberService $corporateMemberService)
{
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
{
$corporates = Corporate::query()
->with('currentPolicy', 'subCorporates')
->withCount([
'employees',
'corporateBenefits',
'corporatePlans',
// 'claims'
])
// ->where('type', 'corporate')
->where('id', $id)
->paginate(1);
return $corporates;
}
public function update(Request $request, $id)
{
$validate = $request->validate([
'reason' => 'required',
]);
try {
DB::beginTransaction();
//karena pake formdata
$linkingRules = $request->linking_rules;
$linkingRules = explode(',', $linkingRules);
$corporate = Corporate::findOrFail($id);
$corporate->fill($request->all());
$corporate->linking_rules = $linkingRules;
$corporate->save();
if ($request->hasFile('logo')) {
$pathFileAvatar = File::storeFile('avatar', $corporate->id, $request->file('logo'));
$corporate->files()->updateOrCreate([
'type' => 'avatar',
'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')),
'extension' => $request->file('logo')->getClientOriginalExtension(),
'path' => $pathFileAvatar,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
return $corporate;
}
}

View File

@@ -37,7 +37,10 @@ class CorporateManageController extends Controller
*/
public function show($corporate_id)
{
//
$userLogin = Auth::user();
$corporate = $userLogin->managedCorporates()->where('corporates.id', $corporate_id)->first();
return response()->json($corporate);
}
/**

View File

@@ -3,18 +3,32 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Member;
use App\Models\Claim;
use App\Models\ClaimRequest;
use App\Models\RequestLog;
use App\Services\CorporateMemberService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources;
use Modules\Client\Transformers\AlarmCenter\DataListClaimMemberResource;
use Modules\Client\Transformers\AlarmCenter\DataServiceMonitoring;
use Modules\Client\Transformers\Dashboard\MemberResources as ClaimSubmitMemberResources;
use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources;
use Modules\Client\Transformers\Dashboard\MemberAlarmCenterResources as DashboardMemberAlarmResources;
use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as DashboardMemberEmployeeDataResources;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Modules\Client\Transformers\EmployeeData\UserProfile\DataMemberResource as EmployeeDataProfileMemberResource;
use Modules\Internal\Services\MemberEnrollmentService;
class CorporateMemberController extends Controller
{
public function __construct(public CorporateMemberService $corporateMemberService)
public $memberEnrollmentService;
public function __construct(public CorporateMemberService $corporateMemberService, MemberEnrollmentService $memberEnrollmentService)
{
$this->memberEnrollmentService = $memberEnrollmentService;
}
/**
@@ -24,18 +38,208 @@ class CorporateMemberController extends Controller
public function index(Request $request, $corporate_id)
{
switch ($request->input('type')) {
case 'employee-data':
$members = $this->corporateMemberService->getAllMemberEmployeeData($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberEmployeeDataResources::collection($members)));
case 'claim-report':
$members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
case 'claim-submit':
$members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
$members = $this->corporateMemberService->getAllMemberClaimSubmits($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimSubmitMemberResources::collection($members)));
case 'alarm-center':
$members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
case 'service-monitoring':
$members = $this->corporateMemberService->getAllEncounter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
default:
$members = $this->corporateMemberService->getAllMemberDashboards($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberResources::collection($members)));
}
}
public function show($corporate_id, $person_id)
{
$data = Member::query()
->with(['person'])
->where('person_id', $person_id)
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->firstOrFail();
// Get Families
$data->families = Member::query()
->with(['person'])
->where('principal_id', $data->member_id)
->get();
return response()->json(EmployeeDataProfileMemberResource::make($data));
}
public function generateMemberList($corporate_id)
{
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy'])
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
// Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['record_mode'], // Recode Mode
$item['record_type'], // Recode Type
$item['payor_id'], // Payor ID
$item['member_id'], // Member ID
$item['principal_id'], // Mapping ID
NULL, // Link Medis Member ID
$item['current_corporate']['code'] ?? null, // Corporate ID
$item['employeds'][0]['nik'] ?? null, // NIK
$item['division']['code'] ?? null, // Devision
$item['employeds'][0]['branch_code'] ?? null, // Branch Code
$item['bank_info'], // Bank Info
$item['language'], // Language
null, // Type of Work
$item['race'], // Race
$item['current_policy']['code'] ?? null, // Policy Number
$item['marital_status'], // Marital Status
$item['relation_with_principal'], // Relationship
str_replace('-', '', $item['members_effective_date']), // Member effective date
str_replace('-', '', $item['members_expire_date']), // Member expiry date
NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider
NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider
$item['bpjs_class'], // The Right Classes Room of BPJS Participants
NULL, // Name of Faskes
NULL, // Rule BPJSK
NULL, // Internal Use
$item['full_name'], // Member Name
$item['address1'], // Address1
$item['address2'], // Address2
$item['address3'], // Address3
$item['address4'], // Address4
$item['city'], // City
NULL, // State
$item['postal_code'], // Post Code
NULL, // Telephone - Mobile
NULL, // Telephone - Res
NULL, // Telephone - Office
$item['nric'], // NRIC
$item['passport_no'], // Passport No
$item['passport_country'], // Passport Country
$item['email'], // Email
$item['identification_code'], // Identification Code
$item['birth_date'], // Date of Birth
$item['gender_code'], // Sex
NULL, // Internal Use
$item['current_plan']['code'] ?? null, // Plan-ID
NULL, // Employment-Status
NULL, // Internal Use
NULL, // Internal Use
NULL, // Internal Use
str_replace('-', '', $item['terminated_date']), // Date Terminated
$item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks
NULL, // Internal Use
NULL, // Member Since
NULL, // Internal Use
$item['policy_in_force'], // Policy Inforce
NULL, // Member Suspended
str_replace('-', '', $item['activation_date']), // Activation Date
NULL, // Internal Use
$item['start_no_claim'], // StartNoClaim
$item['end_no_claim'], // EndNoClaim
NULL, // Option Mode
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// dd('test');
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
// dd($filePath);
// Mengembalikan response untuk mengunduh file
return Helper::responseJson([
'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
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'])
->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)))]);
}
public function serviceMonitoring(int $corporate_id, int $request_log_id)
{
$data = RequestLog::query()
->with([
'member:id,member_id,person_id,birth_date,email,name_prefix,name,name_suffix' => [
'currentCorporate',
'person:id,email,name_prefix,name,name_suffix,phone'
],
'organization:id,name',
'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'
],
'service:code,name',
])
->find($request_log_id, ['id', 'submission_date', 'discharge_date', 'member_id', 'service_code', 'organization_id']);
$dataBenefit = [];
if (count($data->requestLogBenefits) > 0) {
$totalIncurred = 0;
$totalApprove = 0;
$totalNotApporve = 0;
$totalExcess = 0;
foreach ($data->requestLogBenefits as $itemBenefit) {
$totalIncurred += $itemBenefit->amount_incurred;
$totalApprove += $itemBenefit->amount_approved;
$totalNotApporve += $itemBenefit->amount_not_approved;
$totalExcess += $itemBenefit->excess_paid;
}
$dataBenefit['totalIncurred'] = $totalIncurred;
$dataBenefit['totalApprove'] = $totalApprove;
$dataBenefit['totalNotApprove'] = $totalNotApporve;
$dataBenefit['totalExcess'] = $totalExcess;
}
$data->benefitTotal = $dataBenefit;
return Helper::responseJson(DataServiceMonitoring::make($data));
}
}

View File

@@ -18,7 +18,7 @@ class CorporatePolicyController extends Controller
public function index($corporate_id)
{
$currentCorporate = Auth::user()->managedCorporates()
->with(['currentPolicy', 'employees'])
->with(['currentPolicy'])
->find($corporate_id);
$data = LimitResources::make($currentCorporate);

View File

@@ -0,0 +1,68 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Models\Person;
use App\Models\Member;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class DataController extends Controller
{
public function show($id)
{
try {
$data = Person::findOrFail($id);
return response()->json($data);
} catch (\Exception $e) {
return response()->json(['error' => 'Member not found'], 404);
}
}
public function update(Request $request, $id)
{
try {
$data = Person::findOrFail($id);
$data->update($request->all());
return response()->json(['message' => 'Data updated successfully']);
} catch (\Exception $e) {
return response()->json(['error' => 'Failed to update data'], 500);
}
}
public function updateFamily(Request $request)
{
try {
// Ambil data keluarga dari payload
$familyData = $request->json()->all();
// Loop melalui data keluarga
foreach ($familyData as $familyMember) {
// Ambil ID anggota keluarga dari payload
$person_id = $familyMember['person_id'];
// Perbarui data anggota keluarga sesuai dengan payload
Member::where('person_id', $person_id)->update([
'name' => $familyMember['name'],
'email' => $familyMember['email'],
'relation_with_principal' => $familyMember['relation_with_principal'],
'birth_date' => $familyMember['birth_date'],
]);
Person::where('id', $person_id)->update([
'name' => $familyMember['name'],
'email' => $familyMember['email'],
'phone' => $familyMember['phone'],
'birth_date' => $familyMember['birth_date']
]);
}
// Respon sukses jika pembaruan berhasil
return response()->json([$person_id => 'Data keluarga berhasil diperbarui'], 200);
} catch (\Exception $e) {
// Tangani kesalahan jika ada yang terjadi
return response()->json(['error' => 'Gagal memperbarui data keluarga: ' . $e->getMessage()], 500);
}
}
}

View File

@@ -0,0 +1,93 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Models\Member;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class MemberController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
return Member::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('member_id', 'LIKE', '%' . $search . '%');
})
->with('currentPlan', 'currentCorporate')
->paginate();
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::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)
{
//
}
public function benefits($member_id)
{
$member = Member::findOrFail($member_id);
return response()->json($member->currentPlan->benefits()->select(['description', 'code', 'id'])->get());
}
}

View File

@@ -3,6 +3,7 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\CorporatePolicy;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -19,7 +20,7 @@ class TopUpController extends Controller
{
$data = Auth::user()
->managedCorporates()
->with(['currentPolicy', 'employees'])
->with(['currentPolicy'])
->withCount(['employees', 'claims' => function ($query) {
$query->where('claims.status', 'paid');
}])
@@ -33,9 +34,22 @@ class TopUpController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
public function store(Request $request, $corporate_id)
{
//
$data = $request->validate([
'topup' => 'required|numeric',
]);
$corporatePolicy = CorporatePolicy::query()->where('corporate_id', $corporate_id)->firstOrFail();
if (!$corporatePolicy) {
return response()->json(['message' => 'Corporate policy not found'], 404);
}
$corporatePolicy->total_premi += $data['topup'];
$corporatePolicy->save();
return response()->json(['message' => 'Amount added to total_premi successfully'], 200);
}
/**
@@ -48,6 +62,23 @@ class TopUpController extends Controller
return view('client::show');
}
public function get($corporate_id)
{
$data = CorporatePolicy::query()
->where('corporate_id', $corporate_id)
->with(['currentPolicy', 'employees'])
->withCount(['employees', 'claims' => function ($query) {
$query->where('claims.status', 'paid');
}])
->first();
if (!$data) {
return response()->json(['message' => 'Corporate policy not found'], 404);
}
return Helper::responseJson(TopUpLimitResources::make($data));
}
/**
* Update the specified resource in storage.
* @param Request $request

View File

@@ -4,10 +4,16 @@ use Modules\Client\Http\Controllers\Api\AuthController;
use Modules\Client\Http\Controllers\Api\CorporateDivisionController;
use Modules\Client\Http\Controllers\Api\CorporateManageController;
use Modules\Client\Http\Controllers\Api\CorporateMemberController;
use Modules\Client\Http\Controllers\Api\CorporateCurrentController;
use Modules\Client\Http\Controllers\Api\MemberController;
use Modules\Client\Http\Controllers\Api\CorporatePolicyController;
use Modules\Client\Http\Controllers\Api\UserController;
use Modules\Client\Http\Controllers\Api\ClaimController;
use Modules\Client\Http\Controllers\Api\TopUpController;
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;
/*
|--------------------------------------------------------------------------
@@ -30,19 +36,39 @@ Route::prefix('client')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('user', [UserController::class, 'index']);
Route::get('data/{id}', [DataController::class, 'show']);
Route::put('data/{id}', [DataController::class, 'update']);
Route::post('update-family', [DataController::class, 'updateFamily']);
Route::get('corporate-manage', [CorporateManageController::class, 'index']);
Route::get('corporate-manage/{corporate_id}', [CorporateManageController::class, 'show']);
Route::prefix('{corporate_id}')->group(function () {
Route::post('search-member', [MemberController::class, 'index']);
Route::get('policy', [CorporatePolicyController::class, 'index']);
Route::get('division', [CorporateDivisionController::class, 'index']);
Route::get('members', [CorporateMemberController::class, 'index']);
Route::get('members/{id}', [CorporateMemberController::class, 'show']);
Route::get('export-members/list', [CorporateMemberController::class, 'generateMemberList']);
Route::get('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']);
Route::get('service-monitoring/{request_log_id}', [CorporateMemberController::class, 'serviceMonitoring']);
Route::get('claims/status', [ClaimController::class, 'status']);
Route::get('claims', [ClaimController::class, 'index']);
Route::get('claims/export', [ClaimController::class, 'export']);
Route::get('claims/{claim_id}/encounters', [ClaimEncounterController::class, 'getEncounterData']);
Route::get('topup', [TopUpController::class, 'index']);
// Route::get('topup', [TopUpController::class, 'get']);
Route::post('topup', [TopUpController::class, 'store']);
});
Route::get('claim-report/claim-status', [ClaimReportController::class, 'claimStatus']);
Route::get('claim-report/detail/{id}', [ClaimReportController::class, 'claimDetail']);
Route::get('claim-report/detail-history/{id}', [ClaimReportController::class, 'claimDetailHistory']);
Route::post('claim-report/{id}/request-files', [ClaimReportController::class, 'requestFiles']);
Route::get('corporate', [CorporateCurrentController::class, 'index']);
Route::put('corporate-update', [CorporateCurrentController::class, 'update']);
});
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');
});
});

View File

@@ -0,0 +1,41 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Service;
class DataListClaimMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$serviceData = Service::where('code', $this->service_code)->first();
if ($serviceData) {
$serviceName = $serviceData->name;
} else {
$serviceName = $this->service_cod;
}
if ($this->status == 'approved' && $this->status_final_log ){
$status = 'Done';
} else if ($this->status == 'declined' || $this->status_final_log == 'declined') {
$status = 'Declined';
} else {
$status = 'Ongoing';
}
return [
'id' => $this->id,
'admission_date' => $this->submission_date ?? null,
'discharge_date' => $this->discharge_date ?? null,
'code' => $this->code ?? null,
'service_type' => $serviceName,
'status' => $status,
];
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
class DataServiceMonitoring extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'companyName' => $this->member->currentCorporate->name ?? null,
'serviceCode' => $this->service_code ?? 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),
'benefits' => collect($this->requestLogBenefits)->map(function ($requestLogBenefit) {
return [
'amountIncurred' => $requestLogBenefit->amount_incurred,
'amountApproved' => $requestLogBenefit->amount_approved,
'amountNotAprroved' => $requestLogBenefit->amount_not_approved,
'excessPaid' => $requestLogBenefit->excess_paid,
'description' => $requestLogBenefit->keterangan,
'name' => $requestLogBenefit->benefit->description,
];
})->all() ?? 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');
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($requestLogDailyMonitoring) {
return [
'time' => $requestLogDailyMonitoring->created_at->format('H:i') ?? null,
'status' => 'Done' ?? null,
'subject' => $requestLogDailyMonitoring->subject ?? null,
'bodyTemperature' => $requestLogDailyMonitoring->body_temperature ?? null,
'sistole' => $requestLogDailyMonitoring->sistole . 'mm[Hg]' ?? null,
'diastole' => $requestLogDailyMonitoring->diastole . 'mm[Hg]' ?? null,
'respirationRate' => $requestLogDailyMonitoring->respiration_rate . '/min' ?? null,
'analysis' => $requestLogDailyMonitoring->analysis ?? null,
'complaints' => $requestLogDailyMonitoring->complaints ?? null,
'plans' => $this->when($requestLogDailyMonitoring->requestLogMedicalPlans, collect($requestLogDailyMonitoring->requestLogMedicalPlans)
->map(function ($requestLogMedicalPlan) {
return [
'type' => $requestLogMedicalPlan->type,
'plan' => $requestLogMedicalPlan->plan
];
})
->sortBy('type')
->all()) ?? null,
];
})
->sortByDesc(function ($item) {
return $item['time'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null,
'laboratoriumResults' => $this->whenLoaded('requestLogDailyMonitorings', collect($this->requestLogDailyMonitorings)
->groupBy(function ($requestLogDailyMonitoring) {
return Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y');
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($requestLogDailyMonitoring) {
return [
'code' => $requestLogDailyMonitoring->code,
'date' => Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y') ?? null,
'examination' => $requestLogDailyMonitoring->examination ?? null,
'location' => $requestLogDailyMonitoring->provider ?? null,
];
})
->sortByDesc(function ($item) {
return $item['code'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Storage;
class ClaimReportFileShowResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'fileName' => $this->name,
'fileUrl' => url(Storage::url($this->path))
];
}
}

View File

@@ -3,6 +3,7 @@
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Crypt;
class MemberResources extends JsonResource
{
@@ -16,11 +17,13 @@ class MemberResources extends JsonResource
{
return [
'id' => $this->id,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
'division' => $this->division_name ?? '',
'submission_date' => '',
'status' => $this->active,
'code' => $this->code,
'member_id' => $this->member_id,
'full_name' => $this->full_name,
'division_name' => $this->division_name ?? '',
'status' => $this->status,
'claimRequestId' => Crypt::encrypt($this->claim_request_id),
'submission_date' => $this->submission_date,
];
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
class ShowResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'claimRequestId' => $this->id,
'claimId' => $this->claim_id,
'submissionDate' => $this->submission_date,
'histories' => $this->whenLoaded('histories'),
'fullName' => $this->whenLoaded('member', $this->member->full_name),
'status' => $this->status,
'files' => [
'claimResults' => ClaimReportFileShowResources::collection($this->whenLoaded('claimResults')),
'claimConditions' => ClaimReportFileShowResources::collection($this->whenLoaded('claimConditions')),
'claimDiagnosis' => ClaimReportFileShowResources::collection($this->whenLoaded('claimDiagnosis'))
]
];
}
}

View File

@@ -1,4 +1,4 @@
c<?php
<?php
namespace Modules\Client\Transformers;
@@ -25,7 +25,7 @@ class ClaimShowResource extends JsonResource
$itemData['nominal_dicover'] = $item['nominal_dicover'] ?? 0;
$itemData['nominal_ditagihkan'] = $item['nominal_ditagihkan'] ?? 0;
$itemData['nominal_total'] = $item['nominal_total'] ?? 0;
// For React Frotnend
$itemData['biaya_diajukan'] = $itemData['nominal_ditagihkan'];
$itemData['biaya_disetujui'] = $itemData['nominal_dicover'];
@@ -33,8 +33,12 @@ class ClaimShowResource extends JsonResource
return $itemData;
});
$data['primary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'primary';})->values();
$data['secondary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'secondary';})->values();
$data['primary_diagnosis'] = $this->diagnoses->filter(function ($diagnosis) {
return $diagnosis->type == 'primary';
})->values();
$data['secondary_diagnosis'] = $this->diagnoses->filter(function ($diagnosis) {
return $diagnosis->type == 'secondary';
})->values();
return $data;
}

View File

@@ -15,11 +15,12 @@ class MemberAlarmCenterResources extends JsonResource
{
return [
'id' => $this->id,
'personId' => $this->person_id,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
'service' => $this->service_code,
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'start_date' => $this->members_effective_date,
'end_date' => $this->members_expire_date,
'status' => $this->active,
];
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Modules\Client\Transformers\Dashboard;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberEmployeeDataResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'personId' => $this->person_id,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
// 'service' => $this->service_code,
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'status' => $this->active,
];
}
}

View File

@@ -14,6 +14,7 @@ class MemberResources extends JsonResource
*/
public function toArray($request)
{
// dd($this->currentPlans);
return [
'id' => $this->id,
'memberId' => $this->member_id,
@@ -25,6 +26,7 @@ class MemberResources extends JsonResource
'percentage' => (!empty($this->currentPlan->limit_rules ?? 0)) ? (($this->claims_sum_total_claim / $this->currentPlan->limit_rules) * 100) : 0
],
'status' => $this->active,
// 'service_type' => $this->currentPlans,
];
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace Modules\Client\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class DataMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
// return parent::toArray($request);
$data = [
'id' => $this->id,
'person_id' => $this->person_id,
'user_id' => $this->user_id,
'member_id' => $this->member_id,
'payor_id' => $this->payor_id,
'name_prefix' => $this->name_prefix,
'name' => $this->name,
'name_suffix' => $this->name_suffix,
'birth_date' => $this->birth_date,
'birth_place' => $this->person->birth_place,
'last_weight_kg' => $this->person->last_weight_kg,
'last_height_cm'=> $this->person->last_height_cm,
'phone' => $this->person->phone,
'nik' => $this->person->nik,
'religion' => $this->person->religion,
'marital_status' => $this->person->marital_status,
'last_education' => $this->person->last_education,
'current_employment' => $this->person->current_employment,
'main_address_id' => $this->person->currentAddress->text,
'family' => $this->family,
'claim_history' => $this->claim_history,
'gender' => $this->gender,
'language' => $this->language,
'race' => $this->race,
'record_type' => $this->record_type,
'principal_id' => $this->principal_id,
'relation_with_principal' => $this->relation_with_principal,
'bpjs_class' => $this->bpjs_class,
'nric' => $this->nric,
'email' => $this->email,
'bank_info' => $this->bank_info,
'agent_code' => $this->agent_code,
'address1' => $this->address1,
'address2' => $this->address2,
'address3' => $this->address3,
'address4' => $this->address4,
'city' => $this->city,
'state' => $this->state,
'postal_code' => $this->postal_code,
'record_mode' => $this->record_mode,
'telephone_mobile' => $this->telephone_mobile,
'telephone_res' => $this->telephone_res,
'telephone_office' => $this->telephone_office,
'passport_no' => $this->passport_no,
'passport_country' => $this->passport_country,
'identification_code' => $this->identification_code,
'pre_existing' => $this->pre_existing,
'bpjs_id' => $this->bpjs_id,
'endorsement_date' => $this->endorsement_date,
'members_effective_date' => $this->members_effective_date,
'members_expire_date' => $this->members_expire_date,
'activation_date' => $this->activation_date,
'terminated_date' => $this->terminated_date,
'remarks' => $this->remarks,
'policy_in_force' => $this->policy_in_force,
'start_no_claim' => $this->start_no_claim,
'end_no_claim' => $this->end_no_claim,
'active' => $this->active,
'reason' => $this->reason,
'total_claims' => $this->total_claims,
'full_name' => $this->full_name,
'age' => $this->age,
'gender_code' => $this->gender_code,
'limit' => [
'current' => $this->total_claims ?? 0,
'total' => (int)$this->currentPlan->limit_rules ?? 0,
'percentage' => (!empty($this->currentPlan->limit_rules ?? 0)) ? (($this->total_claims / $this->currentPlan->limit_rules) * 100) : 0
],
'benefits' => $this->currentPlan->benefits,
];
return $data;
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace Modules\Client\Transformers\EmployeeData\UserProfile;
use Illuminate\Http\Resources\Json\JsonResource;
class DataMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'person' => [
'name' => $this->full_name ?? null,
'weight' => $this->person->last_weight_kg ?? null,
'height' => $this->person->last_height_kg ?? null,
'placeOfBirth' => ucwords($this->person->birth_place) ?? null,
'dateOfBirth' => $this->birth_date ?? $this->person->birth_date,
'gender' => ucwords(strtolower($this->gender ?? $this->person->gender)),
'phoneNumber' => $this->person->phone ?? null,
'email' => $this->email ?? ($this->person->email ?? null),
'address' => $this->person->last_height_kg ?? null,
'idNumber' => $this->person->nik ?? null,
'religion' => ucwords(strtolower($this->person->religion)) ?? null,
'maritalStatus' => $this->marital_status,
'education' => ucwords(strtolower($this->person->last_education)) ?? null,
'occupation' => null,
],
'families' => collect($this->families)->map(function ($family) {
return [
'name' => $family->full_name ?? null,
'relationship' => $family->relationship ?? null,
'dateOfBirth' => $family->birth_date ?? $family->person->birth_date,
'email' => $this->email ?? ($this->person->email ?? null),
'phoneNumber' => $this->person->phone ?? null,
'status' => $this->status ?? null
];
})->all()
];
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\HospitalPortal\Helpers;
class ApiResponse
{
public static function apiResponse(string $status, array|object $data = null, string|array|object $message = null, int $statusCode)
{
if ($message instanceof \Illuminate\Support\MessageBag) {
$message = $message->first();
}
return response()->json([
'meta' => [
'status' => $status,
'code' => $statusCode,
'message' => $message
],
'data' => $data,
], $statusCode);
}
}

View File

@@ -12,33 +12,48 @@ use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
class AuthController extends Controller
{
public function login(Request $request)
{
$request->validate([
$data = [
'email' => $request->email,
'password' => $request->password
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required'
], [
'email.required' => trans('validation.required',['attribute' => 'Email']),
'email.email' => trans('validation.email'),
'password.required' => trans('validation.required',['attribute' => 'Password']),
]);
$user = User::query()
->where('email', $request->email)
->first();
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
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);
}
if (!Hash::check($request->password, $user->password)) {
return response(['message' => 'Password Salah'], 403);
if (!Hash::check($request->password, $user->password)) {
return ApiResponse::apiResponse('Bad Request', $data, trans('message.password'), 400);
}
$res_data = [
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
];
return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200);
}
return response([
'message' => 'Selamat Datang',
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
]);
}
public function logout(Request $request)

View File

@@ -16,6 +16,9 @@ use Illuminate\Routing\Controller;
use Modules\HospitalPortal\Transformers\ClaimRequestResource;
use Modules\HospitalPortal\Transformers\ClaimRequestShowResource;
use PDF;
use Illuminate\Support\Facades\DB;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\Validator;
class ClaimRequestController extends Controller
{
@@ -23,6 +26,7 @@ class ClaimRequestController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = 'CRQ-H';
public function index(request $request)
{
$claimRequests = ClaimRequest::query()
@@ -60,70 +64,93 @@ class ClaimRequestController extends Controller
*/
public function store(Request $request)
{
$request->validate([
$data = [
'request_logs_id' => $request->request_logs_id,
'member_id' => $request->member_id,
'service_code' => $request->service_code
];
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required',
'member_id' => 'required',
'service_code' => 'required|in:OP,IP'
'service_code' => 'required'
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Log ID']),
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code'])
]);
$member = Member::find($request->member_id);
$newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member, paymentType: 'reimbursement', serviceCode: $request->service_code);
ClaimRequested::dispatch($newClaimRequest);
// 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'
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
else
{
$check_claim_requests = DB::table('claim_requests')
->where('claim_requests.request_log_id', '=', $request->request_logs_id)
->first();
if(!$check_claim_requests)
{
try {
DB::beginTransaction();
$code = $this->getNextCode();
$member = Member::find($request->member_id);
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'reimbursement',
serviceCode: $request->service_code,
requestLogID: $request->request_logs_id,
);
// 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'),
]);
if ($request->hasFile('additional_files')) {
foreach ($request->additional_files as $file) {
$pathFile = File::storeFile('additional-files', $newClaimRequest->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,
]);
}
}
DB::commit();
return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
else
{
return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
@@ -137,7 +164,8 @@ class ClaimRequestController extends Controller
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
}
},
'files',
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -178,16 +206,260 @@ class ClaimRequestController extends Controller
{
$claimRequest = ClaimRequest::findOrFail($claim_request_id);
$service_code = $claimRequest->service_code;
if ($claimRequest->status != 'approved') {
throw new Exception("Belum Teverifikasi", 1);
}
$member = Member::findOrFail($claimRequest->member_id)
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($claim_request_id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'currentPolicy',
'currentPlan.corporateBenefits',
'currentPlan.corporateBenefits.benefit'
]);
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'claimRequest'));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
return $claimRequest;
}
public static function getNextCode()
{
$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);
}
public static function makeCode($next_number)
{
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function get_claim_requests(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('claim_requests.code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%")
->orWhere('members.member_id', 'like', "%" . $search . "%")
->orWhere('members.name', 'like', "%" . $search . "%")
->orWhere('corporate_divisions.name', 'like', "%" . $search . "%")
->orWhere('claim_requests.status', 'like', "%" . $search . "%")
->orWhere('claim_requests.submission_date', 'like', "%" . $search . "%")
->orWhere('claims.status', 'like', "%" . $search . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
$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('claim_requests.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('claim_requests.status', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'received');
}
if ($status === 'approved') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'approved');
}
if ($status === 'declined') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'declined');
}
});
})
->select(
'members.id',
'claim_requests.code',
'members.member_id',
'members.name as full_name',
'corporate_divisions.name AS division_name',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
'),
'claim_requests.id AS claim_request_id',
'claim_requests.submission_date',
DB::raw('
CASE
WHEN service_code = "OP" THEN "Outpatient"
WHEN service_code = "IP" THEN "Inpatient"
ELSE ""
END AS service_type
')
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function detail_claim_requests($claimRequestId)
{
$status = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
return Helper::responseJson($results);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
}

View File

@@ -7,6 +7,9 @@ use App\Models\Member;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
class MemberController extends Controller
{
@@ -16,26 +19,103 @@ class MemberController extends Controller
*/
public function search(Request $request)
{
$request->validate([
$data = [
'no_polis' => $request->no_polis,
'birth_date' => $request->birth_date
];
$validator = Validator::make($request->all(), [
'no_polis' => 'required',
'birth_date' => 'required'
], [
'no_polis.required' => trans('Validation.required',['attribute' => 'Member ID']),
'birth_date.required' => trans('Validation.required',['attribute' => 'Birth Date']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$members = DB::table('members')
->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id')
->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->where('members.member_id', '=', $request->no_polis)
->where('members.birth_date', '=', $request->birth_date)
->select(
'members.id',
'members.name',
'members.member_id',
'member_policies.policy_id',
'persons.nik',
'members.email',
'members.birth_date',
'members.gender',
'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal')
->first();
if($members)
{
$res_data['members'] = $members;
$member = Member::query()
->where('member_id', $request->no_polis)
->where('birth_date', $request->birth_date)
->with(['person', 'currentCorporate',
// 'currentCorporate.corporateServices' => function ($corporateService) {
// $corporateService->where('status', 'active');
// },
// 'currentCorporate.corporateServices.service'
// 'currentPlan.benefits',
// 'currentPlan.corporateBenefit.plan',
'currentPlan.corporateBenefits.benefit'
])
->firstOrFail();
$benefits = DB::table('member_plans')
->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id')
->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', '=', $members->id)
->select(
'benefits.description',
'benefits.code',
'corporate_benefits.corporate_id',
'plans.service_code'
)
->get();
$res_data['benefits'] = $benefits;
$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', $members->id)
->whereNull('member_plans.deleted_at')
->select('plans.service_code', 'services.name')
->get();
$res_data['services'] = $services;
// Group Services
$groupServices = [];
foreach ($res_data['benefits'] as $benefit) {
$serviceCode = $benefit->service_code;
$groupServices[$serviceCode][] = [
'description' => $benefit->description,
'code' => $benefit->code,
];
}
$res_data['groupServices'] = $groupServices;
$res_data['type'] = $request->type;
// Provider
$providers = DB::table('organizations')
->where('organizations.type', '=', 'hospital')
->select(
'organizations.id',
'organizations.name'
)
->get();
$res_data['providers'] = $providers;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404);
}
return Helper::responseJson($member);
}
}
}

View File

@@ -0,0 +1,87 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Claim;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class NotificationController extends Controller
{
public function getNotifications(Request $request, $user_id)
{
$data = [
'user_id' => $user_id,
];
if (!$user_id)
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
else
{
try {
$notifications = DB::table('notifications')
->join('notification_types', 'notification_types.id', '=', 'notifications.type')
->select(
'notifications.id',
'notifications.title',
'notifications.description',
'notifications.avatar',
'notification_types.type',
DB::raw('DATE_FORMAT(notifications.created_at, "%Y-%m-%dT%H:%i:%s.000+07:00") as createdAt'),
'notifications.isUnRead',
)
->where('user_id', '=', $user_id)
->orderBy('id', 'DESC')
->get();
$res_data['notifications'] = $notifications;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
catch (\Exception $e) {
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
public function setReadNotification(Request $request)
{
$data = [
'user_id' => $request->user_id,
'id' => $request->id,
'isUnRead'=> 0,
];
$validator = Validator::make($request->all(), [
'user_id' => 'required',
'id' => 'required'
], [
'user_id.required' => trans('Validation.required',['attribute' => 'Hospital ID']),
'id.required' => trans('Validation.required',['attribute' => 'ID']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
try {
DB::beginTransaction();
DB::table('notifications')
->where('notifications.id', '=', $request->id)
->update($data);
DB::commit();
return ApiResponse::apiResponse("Success", $data, trans('Message.read_notification'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
}

View File

@@ -0,0 +1,754 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers\Api;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
use Modules\Internal\Http\Controllers\Api\RequestLogController as primeCenterRequestLog;
use App\Helpers\Helper;
use App\Models\File;
use Dompdf\Dompdf;
use Dompdf\Options;
use Illuminate\Support\Facades\View;
class RequestLogController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
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
];
$validator = Validator::make($request->all(), [
'member_id' => 'required',
'service_code' => 'required'
], [
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
]);
if($request->organization_id)
{
$validator = Validator::make($request->all(), [
'organization_id' => 'required',
'member_id' => 'required',
'service_code' => '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']),
]);
}
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
//insert data to organization
try {
if(!$request->organization_id)
{
// Memulai transaksi
DB::beginTransaction();
// Membuat singkatan dari nama rumah sakit
$singkatan = "";
$words = explode(' ', $request->organization_name);
foreach ($words as $word) {
$singkatan .= strtoupper(substr($word, 0, 1));
}
// Membuat kode organisasi
$kodeOrganisasi = "ORG000" . $singkatan;
// Insert data ke tabel organizations
$organization_id = DB::table('organizations')
->insertGetId([
'name' => $request->organization_name,
'code' => $kodeOrganisasi,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
// Insert data ke tabel addresses
$address_id = DB::table('addresses')
->insertGetId([
'text'=> $request->address_provider,
'addressable_type' => 'App\Models\Organization',
'addressable_id' => $organization_id,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
// Update main_address_id di tabel organizations
DB::table('organizations')
->where('organizations.id', '=', $organization_id)
->update(['main_address_id' => $address_id]);
// Commit transaksi
DB::commit();
$request->merge(['organization_id' => $organization_id]);
}
$requestLogControllerInstance = new PrimeCenterRequestLog();
$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)
{
//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);
}
else
{
return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 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);
}
}
}
public function getRequestLog(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->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 . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
$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('request_logs.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('request_logs.status', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('request_logs.status', '=', 'approved');
}
if ($status === 'approved') {
$query->where('request_logs.status', '=', 'approved');
}
if ($status === 'declined') {
$query->where('request_logs.status', '=', 'declined');
}
});
})
->select(
'request_logs.id',
'request_logs.member_id',
'request_logs.final_log',
'request_logs.code',
'members.name as full_name',
'members.member_id as no_polis',
'members.birth_date',
DB::raw('
CASE
WHEN request_logs.status = "requested" THEN "requested"
WHEN request_logs.status = "approved" THEN "approved"
WHEN request_logs.status = "declined" THEN "declined"
WHEN request_logs.status = "reviewed" THEN "reviewed"
ELSE ""
END AS status
'),
DB::raw('
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
'),
'request_logs.submission_date')
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function getFinalLog(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->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') . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
$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('request_logs.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('request_logs.status_final_log', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('request_logs.status_final_log', '=', 'approved');
}
if ($status === 'approved') {
$query->where('request_logs.status_final_log', '=', 'approved');
}
if ($status === 'declined') {
$query->where('request_logs.status_final_log', '=', 'declined');
}
});
})
->where('request_logs.final_log', '=', 1)
->select(
'request_logs.id',
'request_logs.final_log',
'request_logs.code',
'members.name as full_name',
'members.member_id as no_polis',
'members.id AS member_id',
'request_logs.service_code',
'members.birth_date',
DB::raw('
CASE
WHEN request_logs.status_final_log = "requested" THEN "requested"
WHEN request_logs.status_final_log = "approved" THEN "approved"
WHEN request_logs.status_final_log = "declined" THEN "declined"
WHEN request_logs.status_final_log = "reviewed" THEN "reviewed"
ELSE ""
END AS status
'),
'request_logs.submission_date',
DB::raw('
CASE
WHEN service_code = "OP" THEN "Outpatient"
WHEN service_code = "IP" THEN "Inpatient"
ELSE ""
END AS service_type
'),
DB::raw('
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
'),
DB::raw('
(Select request_log_id FROM claim_requests WHERE claim_requests.request_log_id = request_logs.id LIMIT 1) AS check_claim
')
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function requestFinalLog(Request $request)
{
$data = [
'request_logs_id' => $request->request_logs_id
];
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required'
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID'])
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
try {
DB::beginTransaction();
DB::table('request_logs')
->where('request_logs.id', '=', $request->request_logs_id)
->update([
'status_final_log' => 'requested',
'final_log' => 1
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('final-log-kondisi', $request->request_logs_id, $file);
File::updateOrCreate([
'fileable_type' => 'App\Models\RequestLog',
'fileable_id' => $request->request_logs_id,
'type' => 'final-log-kondisi',
'name' => File::getFileName('final-log-kondisi', $request->request_logs_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
DB::commit();
//send email
// Insert data notifications
$emailTo = 'alarm.center@linksehat.com';
$dataNotif = [
'email' => $emailTo,
'title' => 'Request Final LOG',
'description' => 'Request Final 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)
{
//send to alarm
$nameTo = 'Admin LinkSehat';
$dataEmail = [
'email' => $emailTo,
'name' => $nameTo,
'subject' => 'Request Final 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);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
public function downlodLog($request_log_id)
{
$dataRequestLog = DB::table('request_logs')
->where('request_logs.id', '=', $request_log_id)
->first();
$data['dataRequestLog'] = $dataRequestLog;
$dataMember = DB::table('members')
->where('members.id', '=', $dataRequestLog->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 = "'.$dataRequestLog->service_code.'" LIMIT 1) AS jenis_perwatan
'),
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 = "'.$dataRequestLog->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();
$data['namaKaryawan'] = '';
if($dataMember->principal_id)
{
$dataNamaKaryawan = DB::table('members')
->where('members.member_id', '=', $dataMember->principal_id)
->select('members.name')
->first();
$data['namaKaryawan'] = $dataNamaKaryawan->name;
}
else{
$data['namaKaryawan'] = $dataMember->name;
}
$data['dataMember'] = $dataMember;
$data['request_logs'] = $dataRequestLog;
$dataRumahSakit = DB::table('organizations')
->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')
->first();
$data['rumahSakit'] = $dataRumahSakit;
$logoPerusahaan = DB::table('files')
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
->where('corporate_employees.member_id', '=', $dataMember->id)
->where('files.fileable_type', '=', 'App\Models\Corporate')
->select('files.path', 'corporates.code', 'corporates.name')
->orderBy('files.id', 'desc')
->first();
$data['logoPerusahaan'] = $logoPerusahaan;
$signatureDr = DB::table('signatures')
->leftJoin('corporate_manager', 'corporate_manager.user_id', '=', 'signatures.user_id')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 1)
->where('corporate_manager.corporate_id', '=', $dataMember->id_perusahaan)
->select('files.path')
->first();
$data['signatureDr'] = $signatureDr;
$signatureAd = DB::table('signatures')
->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)
->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
')
)
->first();
$data['signatureAd'] = $signatureAd;
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
$pdf->setPaper('A4', 'portrait');
// 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)
{
$dataRequestLog = DB::table('request_logs')
->where('request_logs.id', '=', $request_log_id)
->first();
$data['dataRequestLog'] = $dataRequestLog;
$dataMember = DB::table('members')
->where('members.id', '=', $dataRequestLog->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 = "'.$dataRequestLog->service_code.'" LIMIT 1) AS jenis_perwatan
'),
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 = "'.$dataRequestLog->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();
$data['namaKaryawan'] = '';
if($dataMember->principal_id)
{
$dataNamaKaryawan = DB::table('members')
->where('members.member_id', '=', $dataMember->principal_id)
->select('members.name')
->limit(1)
->first();
$data['namaKaryawan'] = $dataNamaKaryawan->name;
}
else{
$data['namaKaryawan'] = $dataMember->name;
}
$data['dataMember'] = $dataMember;
$data['request_logs'] = $dataRequestLog;
$dataClaimLog = DB::table('request_log_benefits')
->where('request_log_benefits.request_log_id', '=', $request_log_id)
->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();
$data['dataClaimLog'] = $dataClaimLog;
$dataRumahSakit = DB::table('organizations')
->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')
->first();
$data['rumahSakit'] = $dataRumahSakit;
$logoPerusahaan = DB::table('files')
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
->where('corporate_employees.member_id', '=', $dataMember->id)
->where('files.fileable_type', '=', 'App\Models\Corporate')
->select('files.path', 'corporates.code', 'corporates.name')
->orderBy('files.id', 'desc')
->first();
$data['logoPerusahaan'] = $logoPerusahaan;
$signatureDr = DB::table('signatures')
->leftJoin('corporate_manager', 'corporate_manager.user_id', '=', 'signatures.user_id')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 1)
->where('corporate_manager.corporate_id', '=', $dataMember->id_perusahaan)
->select('files.path')
->first();
$data['signatureDr'] = $signatureDr;
$signatureAd = DB::table('signatures')
->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)
->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
')
)
->first();
$data['signatureAd'] = $signatureAd;
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
// 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);
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace Modules\HospitalPortal\Http\Middleware;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace Modules\HospitalPortal\Http\Middleware;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authorization
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
$authorization = $request->header('Authorization');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate authorization
if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) {
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Authorization']), 401);
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json' && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

View File

@@ -5,6 +5,10 @@ use Modules\HospitalPortal\Http\Controllers\Api\AuthController;
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\RequestLogController;
use Modules\HospitalPortal\Http\Middleware\Authentication;
use Modules\HospitalPortal\Http\Middleware\Authorization;
/*
|--------------------------------------------------------------------------
@@ -16,29 +20,66 @@ use Modules\HospitalPortal\Http\Controllers\ClaimController;
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::prefix('v1')->group(function() {
Route::prefix('hospitalportal')->group(function () {
Route::prefix('hospitalportal')->group(function () {
Route::post('login', [AuthController::class, 'login'])->name('login');
Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
Route::middleware(Authentication::class)->group(function () {
Route::controller(AuthController::class)->group(function () {
Route::post('login', 'login');
});
});
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
//Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
//Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::get('claims', [ClaimController::class, 'index']);
Route::post('search-member', [MemberController::class, 'search']);
Route::middleware('auth:sanctum')->group(function () {
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
Route::get('claims', [ClaimController::class, 'index']);
Route::middleware(Authorization::class)->group(function () {
//Search Member
Route::controller(MemberController::class)->group(function () {
Route::post('search-member', 'search');
});
// Request LOG
Route::controller(RequestLogController::class)->group(function () {
Route::post('request-log', 'requestLog');
Route::get('get-request-log', 'getRequestLog');
Route::get('get-final-log', 'getFinalLog');
Route::post('request-final-log', 'requestFinalLog');
Route::get('download-log/{request_log_id}', 'downlodLog');
Route::get('download-final-log/{request_log_id}', 'downlodFinalLog');
});
//Notification
Route::controller(NotificationController::class)->group(function() {
//get notifications
Route::get('notifications/{user_id}', 'getNotifications');
//Set read notification
Route::post('set-read-notification', 'setReadNotification');
});
});
// Request Final LOG
Route::controller(RequestLogController::class)->group(function () {
Route::post('request-final-log', 'requestFinalLog');
});
// Claim Submit
Route::controller(ClaimRequestController::class)->group(function () {
Route::post('claim-requests', 'store');
});
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
// Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
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']);
});
});
});

View File

@@ -3,6 +3,7 @@
namespace Modules\HospitalPortal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestShowResource extends JsonResource
{
@@ -25,6 +26,12 @@ class ClaimRequestShowResource extends JsonResource
'histories' => $histories
];
}
// Map Files by type
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [Str::slug($file->type, '_') => $file];
});
$data['files_by_type'] = $filesGroupByType;
return $data;
}

View File

@@ -0,0 +1,91 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\AuditTrail;
use App\Models\ExclusionRules;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\AuditTrailResource;
class AuditTrailController extends Controller {
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
{
$audittrails = AuditTrail::query()
->where('model', '=', $request->model)
->where('model_id', '=', $id)
->latest()
->paginate(1000);
return response()->json(Helper::paginateResources(AuditTrailResource::collection($audittrails)));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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)
{
$appointments = Appointment::query()
->with('doctor.user', 'doctor.speciality', 'appointmentDetail', 'healthCare')
->where('nID', $id)
->first();
return response()->json(new AppointmentResource($appointments));
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::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)
{
//
}
}
?>

View File

@@ -4,27 +4,33 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Person;
use Crypt;
use Error;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use App\Helpers\Helper;
use Validator;
class AuthController extends Controller
{
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'email' => 'required',
'password' => 'required'
]);
$user = User::query()
->where('email', $request->email)
->first();
->where(function ($query) use ($request) {
$query->where('email', $request->email)
->orWhere('username', $request->email);
})
->first();
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
@@ -91,7 +97,7 @@ class AuthController extends Controller
Event(new ForgetPassword($user));
// Mail::to($user->email)->send(new SendVerifyEmail($user));
Mail::to($user->email)->send(new SendVerifyEmail($user));
return response()->json($user);
}
@@ -125,4 +131,47 @@ class AuthController extends Controller
]);
return response()->json($user);
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|unique:users,email',
'username' => 'required|unique:users,username',
'name' => 'required',
'password' => [
'required',
'min:5',
// 'regex:/.*[0-9].*/',
// 'regex:/.*[a-z].*/',
// 'regex:/.*[A-Z].*/',
]
], [
// 'password.regex' => "Password harus minimal 8 karakter, kombinasi huruf besar kecil dan angka"
])->validate();
try {
$user = User::create([
'email' => $request->email,
'username' => $request->username,
'password' => Hash::make($request->password),
]);
$person = Person::updateOrCreate(
[
'id' => $user->person_id
],
[
'name' => $request->name ?? null
]
);
$user->person_id = $person->id;
$user->save();
return response()->json($user);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi masalah ketika mendaftar'
]);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -4,15 +4,29 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\ClaimRequest;
use App\Models\Organization;
use App\Services\ClaimService;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\ClaimRequestResource;
use Modules\Internal\Transformers\ClaimRequestShowResource;
use Illuminate\Support\Facades\Storage;
use App\Services\ClaimRequestService;
use App\Exceptions\ImportRowException;
use App\Events\ClaimRequested;
use App\Models\File;
use App\Models\FilesMcu;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
class ClaimRequestController extends Controller
{
private static $code_prefix = 'CRQ-C';
/**
* Display a listing of the resource.
* @return Renderable
@@ -22,6 +36,9 @@ class ClaimRequestController extends Controller
$claimRequests = ClaimRequest::query()
->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->orderBy, function ($q, $orderBy) use ($request) {
if (in_array($orderBy, ['submission_date', 'code'])) {
@@ -34,7 +51,7 @@ class ClaimRequestController extends Controller
->when($request->status, function($q, $status) {
$q->where('status', $status);
})
->with(['member', 'files', 'service'])
->with(['member', 'files', 'service', 'member.currentPolicy'])
->paginate();
return Helper::paginateResources(ClaimRequestResource::collection($claimRequests));
@@ -50,13 +67,150 @@ class ClaimRequestController extends Controller
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
* Create New Calim Request
*
* Bagaskoro, BSD 03 November 2023
*/
public function store(Request $request)
public function createNew(Request $request)
{
//
$request->validate([
'member_id' => 'required|array',
'member_id.*' => 'required',
'service_code.*' => 'required|in:OP,IP'
]);
if ($request->member_id){
foreach($request->member_id as $key => $member_id){
$code = $this->getNextCode();
$member = Member::find($member_id);
DB::beginTransaction();
try {
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'reimbursement',
serviceCode: $request->service_code[$key],
);
ClaimRequested::dispatch($newClaimRequest);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'client-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'),
]);
$storage_path = storage_path() . "/app/public";
$folder = "claim/";
if (is_dir($storage_path . "/" . $folder) == false) {
mkdir($storage_path . "/" . $folder, 0770, true);
}
if (isset($_FILES['file_penunjang'])) {
foreach ($_FILES['file_penunjang']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-result-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_penunjang']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_penunjang']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_penunjang']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['file_diagnosa'])) {
foreach ($_FILES['file_diagnosa']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-diagnosis-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_diagnosa']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_diagnosa']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_diagnosa']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['file_kondisi'])) {
foreach ($_FILES['file_kondisi']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-kondisi-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_kondisi']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_kondisi']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_kondisi']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
}
return Helper::responseJson(status: 'success', statusCode: 201, message: 'Claim Request berhasil ajukan!', data: $request->toArray());
}
/**
@@ -71,7 +225,10 @@ class ClaimRequestController extends Controller
'histories' => function ($history) {
$history->latest();
},
'files'
'files',
'member',
'claim',
'organization',
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -95,7 +252,83 @@ class ClaimRequestController extends Controller
*/
public function update(Request $request, $id)
{
//
$claimRequest = ClaimRequest::findOrFail($id);
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
'member',
'claim',
'organization',
]);
$organization = Organization::where('code', $request->provider_code)->first();
if (!$organization) {
return response()->json(['error' => true, 'message' => 'Data tidak ditemukan'], 404);
}
$updateClaimRequest = ClaimRequestService::updateClaimRequest(organization_id: $organization->id, claim_request_id: $id);
ClaimRequested::dispatch($updateClaimRequest);
// Log History
$updateClaimRequest->histories()->create([
'title' => 'Update Claim Requested',
'description' => "Update Claim Requested for Member : {$claimRequest->member->member_id} - ({$claimRequest->member->full_name})",
'type' => 'update',
'system_origin' => 'prime-center'
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-result', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('claim-diagnosis', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('claim-kondisi', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $updateClaimRequest],
200);
}
/**
@@ -112,17 +345,17 @@ class ClaimRequestController extends Controller
{
$claimRequest = ClaimRequest::findOrFail($id);
$member = $claimRequest->member;
try {
// Create New Claim
$newClaim = ClaimService::storeClaim(member: $member, status: 'received', claimRequest: $claimRequest);
// Update Claim Request Status & Link with Claim
$claimRequest->status = 'approved';
$claimRequest->claim_id = $newClaim->id;
$claimRequest->save();
// Store Generated Documents LOG
$logContent = view('pdf.guaranted_leter', compact('member', 'claimRequest'));
$claimRequest->generatedDocuments()->create([
@@ -133,11 +366,408 @@ class ClaimRequestController extends Controller
'system_origin' => 'primecenter'
]);
} catch (\Exception $e) {
// Claim Log
DB::table('claim_logs')
->insert([
'claim_request_id' => $id,
'status' => 'reviewed',
'date' => date('Y-m-d H:i:s'),
'description' => "Claim Requested Successfully Reviewed",
'system_origin' => 'prime-center',
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at'=> date('Y-m-d H:i:s'),
]);
} catch (\Exception $e) {
return $e->getMessage();
}
return $claimRequest;
}
public function filesMcu(Request $request)
{
$request->validate([
'id' => 'required',
'memberid' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('claim-result', $request->id, $request->result_files);
$data = [
'memberid' => $request->id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesMcu::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file MemberID '.$request->memberid.', silahkan lihat dilaporan');
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan');
}
}
public function importClaim(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$fileWrite = Storage::disk('public')->path('temp/result-' . $file_name);
$fileRead = Storage::path('temp/' . $file_name);
$import = new ImportService();
$import->read($fileRead);
$import->write($fileWrite, 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if ($sheetIndex == 1) { // Rename First Sheet to Writer
$firstWriterSheet = $import->writer->getCurrentSheet();
$firstWriterSheet->setName($sheet->getName());
} else { // Add New Sheet to Writer
$nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent();
$nextWriterSheet->setName($sheet->getName());
}
$headers_map_to_table_fields = ClaimRequest::$doc_headers_to_field_map;
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace("/\r|\n/", " ", $title);
$title = preg_replace('/\xc2\xa0/', " ", $title);
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]]))
$row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
try { // Process the Row Data
$claimRequestService = new ClaimRequestService();
$claimRequestService->handleClaimRequestRow($row_data);
// Write Success Result to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName());
} catch (ImportRowException $e) {
// Write Data Validation Error to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
}
// catch (\Exception $e) {
// // throw new \Exception($e);
// // Write Server Error to File
// // $import->read($fileRead);
// // $import->write($fileWrite, 'xsls');
// dd( $e->getMessage());
// $import->addArrayToRow(array_merge($row_data, [
// 'Ingest Code' => 500,
// 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
// ]), $sheet->getName());
// }
}
}
}
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-' . $file_name),
'name' => 'result-' . $file_name,
]
];
}
public function claimRequestDetail($claimRequestId)
{
$status = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
'claim_requests.code',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
$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();
$results['documents'] = $documents;
$dialog_submits = DB::table('claim_requests')
->leftJoin('members', 'claim_requests.member_id','=', 'members.id')
->where('claim_requests.id', $claimRequestId)
->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status')
->first();
$results['dialog_submits'] = $dialog_submits;
return Helper::responseJson($results);
}
public function invoiceFiles(Request $request, $claim_id)
{
if ($request->hasFile('invoice_files')) {
foreach ($request->invoice_files as $file) {
$pathFile = File::storeFile('claim-invoice', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-invoice',
'name' => File::getFileName('claim-invoice', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if($request->date)
{
DB::table('claim_requests')
->where('id', $claim_id)
->update(['invoice_date' => $request->date]);
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
/**
* Get Claim Member - Infinite Scroll
*
* Bagaskoro, BSD 31 Oktober 2023
*/
public function getClaimMemberInfiniteScroll(Request $request)
{
$offset = 0;
$limit = 10;
$page = $request->get('page');
$keyword = $request->get('keyword');
if ($page > 1) {
$offset = ($page*$limit)-$limit;
}
$memberList = DB::table('members')
->select('id','member_id','name')
->where("name", "like", "%$keyword%")
->orWhere("member_id", "like", "%$keyword%")
->orderBy('created_at', 'asc')
->offset($offset)
->limit($limit)
->get();
$data = [];
if(count($memberList)>0){
$temp = [];
foreach($memberList as $d){
$serviceType = $this->getServiceMember($d->id);
$temp['id'] = $d->id;
$temp['member_id'] = $d->member_id;
$temp['name'] = $d->name;
$temp['service_type'] = $serviceType;
array_push($data, $temp);
}
}
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $data,
]
],200);
}
public function getServiceMember($id){
$service = DB::table('member_plans')
->select('plans.service_code as code', 'services.name')
->join('plans', 'member_plans.plan_id', '=', 'plans.id')
->join('services', 'plans.service_code', '=', 'services.code')
->where('member_id', $id)
->get()
->toArray();
return $service;
}
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');
// $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;
}
return self::makeCode($next_number);
}
public static function makeCode($next_number)
{
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$pathFile = 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),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
}

View File

@@ -20,10 +20,12 @@ class CorporateBenefitController extends Controller
$benefits = CorporateBenefit::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->paginate(0)
->with('benefit', 'plan')
->paginate(10)
->appends($request->all());
return $benefits;
}
public function activation(Request $request, $benefit_id)
{
$request->validate([
@@ -31,9 +33,9 @@ class CorporateBenefitController extends Controller
]);
// abort(404);
$benefit = CorporateBenefit::findOrFail($benefit_id);
$benefit->active = $request->active == '1';
$benefit = CorporateBenefit::find($benefit_id);
$benefit->active = $request->active == 1 ? 0 : 1;
$benefit->reason = $request->reason;
if ($benefit->save()) {
return response()->json([
@@ -107,18 +109,15 @@ class CorporateBenefitController extends Controller
{
$corporateBenefit = CorporateBenefit::findOrFail($id);
$request->validate([
'code' => [
'budget' => [
'required',
Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporateBenefit->id)
],
'name' => 'required'
]);
$corporateBenefit->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'budget' => $request->budget,
])->save();
return $corporateBenefit;

View File

@@ -19,11 +19,13 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use App\Models\File;
use Illuminate\Support\Facades\File as FacadesFile;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\CorporateService;
use App\Models\FilesDoc;
class CorporateController extends Controller
{
@@ -77,10 +79,11 @@ class CorporateController extends Controller
*/
public function store(Request $request)
{
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'code' => 'required|regex:/^[a-zA-Z0-9_]+$/',
'name' => 'required',
'payor_id' => 'required',
// 'logo' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -100,6 +103,7 @@ class CorporateController extends Controller
if ($request->has('policy_code') && !empty($request->policy_code)) {
$newCorporate->policies()->create([
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -117,9 +121,9 @@ class CorporateController extends Controller
$services = [
[
'id' => 1,
'name' => 'Out Patient',
'name' => 'Outpatient',
'code' => 'OP',
'description' => 'Out Patient',
'description' => 'Outpatient',
],
[
'id' => 2,
@@ -300,7 +304,8 @@ class CorporateController extends Controller
public function update(Request $request, $id)
{
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'code' => 'required|regex:/^[a-zA-Z0-9_]+$/',
'payor_id' => 'required',
'name' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -327,6 +332,7 @@ class CorporateController extends Controller
['id' => $request->policy_id],
[
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -375,13 +381,15 @@ class CorporateController extends Controller
public function activation(Request $request, $corporate_id)
{
$request->validate([
'active' => 'required'
'active' => 'required',
'reason' => 'required'
]);
// abort(404);
$corporate = Corporate::findOrFail($corporate_id);
$corporate->active = $request->active == '1';
$corporate->active = $request->active == 0 ? 1 : 0;
$corporate->reason = $request->reason;
if ($corporate->save()) {
return response()->json([
@@ -399,10 +407,11 @@ class CorporateController extends Controller
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$corporate = Corporate::with(['plans'])->findOrFail($corporate_id);
$fileWrite = Storage::disk('public')->path('temp/result-' . $file_name);
$fileRead = Storage::path('temp/' . $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/' . $file_name));
$import->write(Storage::disk('public')->path('temp/result-' . $file_name), 'xsls');
$import->read($fileRead);
$import->write($fileWrite, 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if (!in_array($sheet->getName(), ['Plan', 'Benefit'])) {
@@ -425,9 +434,11 @@ class CorporateController extends Controller
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow($result_headers);
}
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
@@ -442,12 +453,10 @@ class CorporateController extends Controller
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]]))
$row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
try { // Process the Row Data
$corporateService = new CorporateService();
if ($sheet->getName() == 'Plan') {
@@ -455,14 +464,17 @@ class CorporateController extends Controller
} else if ($sheet->getName() == 'Benefit') {
$corporateService->handleBenefitRow($corporate, $row_data);
}
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName());
} catch (ImportRowException $e) {
// Write Data Validation Error to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
@@ -470,6 +482,8 @@ class CorporateController extends Controller
} catch (\Exception $e) {
// throw new \Exception($e);
// Write Server Error to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
@@ -493,7 +507,18 @@ class CorporateController extends Controller
];
}
public function importDocumentExample($document_type)
public function deleteAllImportPlanBenefit(Request $request, $corporate_id){
$deleteBenefit = CorporateBenefit::where('corporate_id', $corporate_id)->delete();
$deletePlan = Plan::where('corporate_id', $corporate_id)->delete();
if ( $deleteBenefit && $deletePlan ){
return Helper::responseJson(data: [], message: 'Berhasil delete semua benefit');
} else {
return Helper::responseJson(data: [], message: 'Gagal delete semua benefit', statusCode:404);
}
}
public function importDocumentExample($document_type)
{
switch ($document_type) {
case 'plan-benefit':
@@ -507,17 +532,304 @@ class CorporateController extends Controller
'file_name' => "Corporate Membership Import.xlsx",
"file_url" => url('files/Corporate Membership Import.xlsx')
]);
break;
break;
case 'diagnosis-exclusion':
return Helper::responseJson([
'file_name' => "Corporate Exclusion Import.xlsx",
"file_url" => url('files/Corporate Exclusion Import.xlsx')
]);
break;
break;
case 'master-icd':
return Helper::responseJson([
'file_name' => "Template - ICD.xlsx",
"file_url" => url('files/Template - ICD.xlsx')
]);
break;
case 'master-formularium':
return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium.xlsx')
]);
break;
case 'master-formularium-corporate':
return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium - Corporate.xlsx')
]);
break;
case 'claim-request':
return Helper::responseJson([
'file_name' => "Template Format Claim.xlsx",
"file_url" => url('files/Template Format Claim.xlsx')
]);
break;
case 'request-log':
return Helper::responseJson([
'file_name' => "Template Update Status Request LOG.xlsx",
"file_url" => url('files/Template Update Status Request LOG.xlsx')
]);
break;
case 'template-request-log':
return Helper::responseJson([
'file_name' => "Template Import Request LOG.xlsx.xlsx",
"file_url" => url('files/Template Import Request LOG.xlsx.xlsx')
]);
break;
default:
return Helper::responseJson([], 'error', 404);
break;
}
}
public function dataPlanBenefit(Request $request, $corporate_id){
$file_name = 'Corporate Plan and Benefit';
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx'));
// Sheet 1
$writer->getCurrentSheet()->setName('Plans');
$headers_map_to_table_fields = Plan::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataPlans = Plan::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// $corporatePlan->where('corporate_id', $corporate_id);
// })
// ->with('corporatePlan')
->orderBy('corporate_plan_id', 'asc')
->get()->toArray();
foreach ($dataPlans as $index => $row){
$rowData = [
$row['service_code'], // Service
$row['corporate_plan_id'], // Plan
$row['code'], // Customer plans
$row['type'], // Plan Type
$row['start'], // Start Date of Plan
$row['end'], // End Date of Plan
$row['require_referral'], // Referral
$row['referral_source'], // Referral Source
$row['referral_duration'], // Referral Duration
$row['family_plan'], // Family Plan
$row['family_plan_share_rules'], // Family Sharing Overflow
$row['limit_rules'], // Plan Limit
$row['layer'], // Layer ID
$row['layer_conditions'], // Layer Condition
$row['budget_type'], // Budget Type
$row['budget_code'], // Budget Code
$row['budget_conditions'], // Budget Condition
$row['surgery_limit'], // Surgery
$row['non_surgery_limit'], // Non Surgery
$row['max_claim_limit'], // Max/Claim
$row['max_claim_count'], // Max Count of Claim
$row['area_limit'], // Area
$row['limit_shared_plans'], // Shared Plan
$row['limit_shared_plan_type'], // Shared Plan Type
$row['cashless_percentage'], // Cashless(%)
$row['reimbursement_percentage'], // Reimbursement(%)
$row['digital_percentage'], // Digital(%)
$row['co_share_m_percentage'], // CoShareM(%)
$row['co_share_s_percentage'], // CoShareS(%)
$row['co_share_c_percentage'], // CoShareC(%)
$row['cashless_deductible'], // Cashless Deductible
$row['cashless_deductible'], // Reimbursement Deductible
$row['digital_deductible'], // Digital Deductible
$row['co_share_m_deductible'], // DeductibleM
$row['co_share_s_deductible'], // DeductibleS
$row['co_share_c_deductible'], // DeductibleC
$row['co_share_deductible_condition'], // Co-share & Deductible Condition
$row['msc'], // MSC
$row['genders'], // Gender
$row['min_age'], // Min Age
$row['max_age'], // Max Age
$row['rule_of_excess'], // Rule of Excess
$row['max_excess_covered'], // Max Excess Covered
$row['prorate_type'], // Prorate Type
$row['prorate_lookup'], // Prorate Lookup
$row['currency'], // Currency
$row['max_surgery_reinstatement_days'], // Reinstatement days for Surgery NonSurgery
$row['max_surgery_periode_days'], // Max Periode of Surgery Non Surgery
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
// Menutup penulis
// Sheet 2
$writer->addNewSheetAndMakeItCurrent();
$writer->getCurrentSheet()->setName('Benefit');
$headers_map_to_table_fields = CorporateBenefit::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataBenfit = CorporateBenefit::query()
->where('corporate_id', $corporate_id)
->with('benefit', 'plan')
->orderBy('plan_id', 'asc')
->get()->toArray();
// dd($dataBenfit);
foreach($dataBenfit as $index => $row){
$rowData = [
$row['benefit']['service_code'] ?? NULL, // "Service",
$row['plan']['type'] ?? NULL, // "Plan",
$row['benefit']['code'] ?? NULL, // "Benefit Code",
$row['benefit']['code'] ?? NULL, // "Customer Benefit Code",
$row['benefit']['description'] ?? NULL, // "Detail Benefit",
$row['budget'], // "ASO/Budget",
$row['budget_conditions'], // "Budget Condition",
$row['budget_code'], // "Budget Code",
$row['primary_benefit_code'], // "Primary benefit",
$row['benefit_mode'], // "Benefit Mode",
$row['room_class_coverage'], // "Room Class",
$row['max_bed_coverage'], // "Max Bed",
$row['tolerance_parameter'], // "Tolerance Paramater",
$row['max_room_class'], // "Max. Room Class",
$row['limit_amount'], // "Limit Value",
$row['area_limit'], // "Area",
$row['shared_benefit'], // "Shared Benefit With",
$row['shared_benefit_type'], // "Shared Benefit Type",
$row['msc'], // "MSC",
$row['genders'], // "Gender",
$row['min_age'], // "Min Age",
$row['max_age'], // "Max Age",
$row['max_frequency_period'], // "Freq. Period",
$row['daily_frequency'], // "Daily Frequency",
$row['weekly_frequency'], // "Weekly Frequency",
$row['monthly_frequency'], // "Monthly Frequency",
$row['yearly_frequency'], // "Yearly Frequency",
$row['custom_frequency_days'], // "Custom Duration",
$row['custom_duration_value'], // "Custom Duration Value",
NULL, // "Cashless, Reimbursement",
$row['high_plan_factor'], // "High Plan Factor",
$row['pre_post_treatment'], // "Pre Post Treatment",
$row['pre_treatment_days'], // "Pre Treatment",
$row['post_treatment_days'], // "Post Treatment",
$row['layer_type_1'], // "Layer Type 1",
$row['layer_value_1'], // "Layer Value 1",
$row['layer_type_2'], // "Layer Type 2",
$row['layer_value_2'], // "Layer Value 2",
$row['cashless_percentage'], // "Cashless (%)",
$row['reimbursement_percentage'], // "Reimburse (%)",
$row['digital_percentage'], // "Digital (%)",
$row['co_share_m_percentage'], // "CoShareM (%)",
$row['co_share_s_percentage'], // "CoShareS (%)",
$row['co_share_c_deductible'], // "CoShareC (%)",
$row['cashless_deductible'], // "Cashless Deductible",
$row['reimbursement_deductible'], // "Reimbursement Deductible",
$row['digital_deductible'], // "Digital Deductible",
$row['co_share_m_deductible'], // "DeductibleM",
$row['co_share_s_deductible'], // "DeductibleS",
$row['co_share_c_deductible'], // "DeductibleC",
$row['prorate_type'], // "Prorate Type",
$row['prorate_lookup'], // "Prorate Lookup",
$row['max_days_for_disability'], // "Max Days for Disability",
$row['max_period_for_disability'], // "Max Periode of Disability",
$row['limit_free_tc'], // "Currency",
$row['currency'], // "Currency",
$row['show_benefit_item'], // "Show Benefit Item",
$row['show_benefit_value'], // "Show Benefit Value",
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
$writer->close();
return Helper::responseJson([
'file_name' => "Data Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporatePlan&BenefitImportData.xlsx')
]);
}
public function corporateCode(Request $request){
$corporates = Corporate::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('code', 'LIKE', '%' . $search . '%');
})
->with('currentPolicy', 'subCorporates')
->withCount([
'employees',
'corporateBenefits',
'corporatePlans',
// 'claims'
])
->where('active', 1)
->get()
->pluck('code');
return $corporates;
}
public function addFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('docs', $request->corporate_id, $request->result_files);
$data = [
'corporate_id' => $request->corporate_id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesDoc::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file '.$data['original_name']);
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan');
}
}
public function getFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'status_download')
->orderBy('id', 'desc')
//->limit(1)
->get();
if ($datas->isEmpty()) {
return Helper::responseJson(data: [], message: 'Tidak ada data');
}
return Helper::responseJson(data: $datas, message: 'Berhasil mendapatkan data');
}
public function updateStatusFilesDoc(Request $request)
{
$request->validate([
'status_download' => 'required',
'corporate_id' => 'required'
]);
$data_requests = [
'status_download' => $request->status_download
];
FilesDoc::where('corporate_id', $request->corporate_id)
->update($data_requests);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('status_download')
->orderBy('id', 'desc')
->limit(1)
->get();
return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active'));
}
}

View File

@@ -2,13 +2,25 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Exceptions\ImportRowException;
use App\Helpers\Helper;
use App\Models\CorporateFormularium;
use App\Models\Formularium;
use App\Models\FormulariumTemplate;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Transformers\CorporateFormulariumResource;
use Modules\Internal\Services\FormulariumService;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
class CorporateFormulariumController extends Controller
{
@@ -16,25 +28,24 @@ class CorporateFormulariumController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function __construct(FormulariumService $formulariumService)
{
$this->formulariumService = $formulariumService;
}
public function index(Request $request, $corporate_id)
{
$formulariums = Formularium::query()
->filter($request->all());
if (!empty($request->status) && $request->status == 'inactive') {
$formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
} else if (!empty($request->status) && $request->status == 'all') {
} else { // Active or Default
$formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
$corporateFormularium->where('corporate_id', $corporate_id);
});
}
$formulariums = $formulariums->with(['corporateFormulariums' => function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
}])
->withCount('items')
->paginate();
$formulariums = CorporateFormularium::query()
->where('corporate_id', $corporate_id)
->paginate(15);
// if (!empty($request->status) && $request->status == 'inactive') {
// $formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
// } else if (!empty($request->status) && $request->status == 'all') {
// } else { // Active or Default
// $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
// $corporateFormularium->where('corporate_id', $corporate_id);
// });
// }
return Helper::paginateResources(CorporateFormulariumResource::collection($formulariums));
}
@@ -42,9 +53,16 @@ class CorporateFormulariumController extends Controller
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
public function create(Request $request, $corporate_id)
{
return view('internal::create');
$data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel
$formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $formularium_template
];
return $respone;
}
/**
@@ -52,9 +70,36 @@ class CorporateFormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
public function store(Request $request, $corporate_id)
{
//
$request->validate([
'id' => 'required'
]);
$checkFormularium = FormulariumTemplate::find($request->id);
if (!$checkFormularium){
$respone = [
"status" => 404,
"message" => "data master formularium tidak ditemukan",
"data" => []
];
return $respone;
}
$newCorporateFormularium = CorporateFormularium::create([
'corporate_id' => $corporate_id,
'formularium_template_id' => $request->id,
'active' => 1
]);
if ($newCorporateFormularium){
$respone = [
"status" => 200,
"message" => "data berhasil disimpan"
];
return $respone;
}
return $newCorporatePlan;
}
/**
@@ -62,9 +107,15 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function show($id)
public function show(Request $request, $corporate_id, $id)
{
return view('internal::show');
$data = Formularium::where('formularium_template_id', $id)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $data
];
return $respone;
}
/**
@@ -72,9 +123,16 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function edit($id)
public function edit(Request $request, $corporate_id)
{
return view('internal::edit');
$data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel
$formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $formularium_template
];
return $respone;
}
/**
@@ -101,7 +159,7 @@ class CorporateFormulariumController extends Controller
public function updateStatus($corporate_id, $formularium_id , $status)
{
if ($status == 'activate') {
$corporateFormularium = CorporateFormularium::firstOrCreate([
$corporateFormularium = CorporateFormularium::updateOrCreate([
'corporate_id' => $corporate_id,
'formularium_id' => $formularium_id
], [
@@ -128,4 +186,213 @@ class CorporateFormulariumController extends Controller
]);
}
}
public function active(Request $request, $corporate_id, $id)
{
$corporateFormularium = CorporateFormularium::find($id);
$corporateFormularium->fill([
'active' => $request->active,
])->save();
$respone = [
"status" => 200,
"message" => 'data berhasil diedit',
"data" => $corporateFormularium
];
return $respone;
}
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
// dd($request->toArray());
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
// $importLog = $corporate->importLogs()->create([
// 'type' => 'diagnosis-exclusions',
// 'file_path' => $file,
// 'status' => 'pending',
// 'progress' => 0,
// ]);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
// $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
// Tambahkan 'Ingest Code' dan 'Ingest Note' ke akhir array
$doc_headers_indexes[] = 'Ingest Code';
$doc_headers_indexes[] = 'Ingest Note';
$import->addArrayToRow($doc_headers_indexes);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (empty($row_data['code'])){
throw new ImportRowException(__('Internal Code is REQUIRED'), 405, null, $row_data);
}
if (
// empty($row_data['code']) &&
// empty($row_data['description']) &&
empty($row_data['code']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$formulariums = Formularium::where('code', $row_data['code'])->first();
if ($formulariums){
$row_data['formularium_id'] = $formulariums->id;
} else {
throw new ImportRowException(__('Internal Code is Not Found'), 405, null, $row_data);
}
$formulariumService = new FormulariumService();
$formulariumService->handleFormuariumCorporateRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function generateFormulariumList(Request $request, $id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
// $data = Formularium::get()->toArray();
$formulariums = Formularium::query()
->filter($request->all());
// if (!empty($request->status) && $request->status == 'inactive') {
// $formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
// } else if (!empty($request->status) && $request->status == 'all') {
// } else { // Active or Default
// $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
// $corporateFormularium->where('corporate_id', $corporate_id);
// });
// }
$data = $formulariums->with(['corporateFormulariums' => function ($query) use ($id) {
$query->where('corporate_id', $id);
}])->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateFormulariumList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->formulariumService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['code'], // code
$item['name'], // name
$item['description'], // Description
$item['manufacturer'], // manufacturer
$item['category_name'], // category_name
$item['kategori_obat'], // kategori_obat
$item['uom'], // uom
$item['general_indication'], // Description
$item['composition'], // composition
$item['atc_code'], // atc_code
$item['class'], // class
$item['bpom_registration'], // bpom_registration
$item['classifications'], // classifications
$item['cat_for'], // cat_for
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateFormulariumList.xlsx');
return Helper::responseJson([
'file_name' => "Formularium List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateFormulariumList.xlsx')
]);
}
}

View File

@@ -0,0 +1,82 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\CorporateManager;
use Modules\Internal\Transformers\CorporateManageResource;
class CorporateManageController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$userCorporateManage = CorporateManager::with(['user', 'corporate'])->get();
return response()->json($userCorporateManage);
}
public function store(Request $request)
{
$request->validate([
'user_id' => [
'required',
],
'corporate_id' => 'required'
]);
$newCorporateManage = CorporateManager::create([
'corporate_id' => $request->corporate_id,
'user_id' => $request->user_id,
]);
return $newCorporateManage;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$updateCorporateManage = CorporateManager::findOrFail($id);
$request->validate([
'user_id' => [
'required',
],
'corporate_id' => 'required'
]);
$updateCorporateManage->fill([
'corporate_id' => $request->corporate_id,
'user_id' => $request->user_id,
])->save();
return $updateCorporateManage;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
// Soft delete model
$corporateManage = CorporateManager::find($id);
$corporateManage->delete();
return $corporateManage;
}
}

View File

@@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException;
use App\Helpers\Helper;
use App\Http\Resources\MemberDataTableResource;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\Member;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
@@ -15,8 +16,13 @@ use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Illuminate\Console\Command;
use Modules\Internal\Services\MemberEnrollmentService;
use PDF;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\File;
use Spatie\Browsershot\Browsershot;
class CorporateMemberController extends Controller
{
@@ -28,14 +34,11 @@ class CorporateMemberController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $corporate_id)
public function index(Request $request, $corporate_id )
{
$members = Member::query()
->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})
->joinCorporateEmployees('left')
->where('corporate_employees.corporate_id', $corporate_id)
->with([
'employeds',
'currentPolicy',
@@ -44,25 +47,46 @@ class CorporateMemberController extends Controller
// return $claim->whereBetween('requested_at', [now()->startOfYear(), now()->endOfYear()]);
// return $claim->used(now()->startOfYear(), now()->endOfYear());
},
'currentPlans',
'currentPlan',
'currentPlan.benefits'
// 'currentPlan' => function ($currentPlan) use ($service_code){
// return $currentPlan->where([
// 'plans.service_code' => $service_code
// ]);
// },
'currentPlan.benefits' => function ($benefit) use ($corporate_id){
return $benefit->where([
'corporate_benefits.active' => 1,
'corporate_benefits.corporate_id' => $corporate_id,
// 'corporate_benefits.plan_id' => $corporate_id,
]);
}
])
->when($request->input('search'), function (Builder $query, $search) {
$query->where(function (Builder $query) use ($search) {
$query->orWhere('members.member_id', 'like', "%" . $search . "%")
->orWhere('members.name', 'like', "%" . $search . "%");
});
})
->select('members.*')
->selectRaw('(SELECT GROUP_CONCAT(files_mcu.original_name SEPARATOR ", ") AS file_mcu_names from files_mcu WHERE files_mcu.memberid = members.id) AS file_mcu_names')
->paginate()
->appends($request->all());
return Helper::paginateResources(MemberDataTableResource::collection($members));
}
public function activation(Request $request, $member_id)
{
$request->validate([
'active' => 'required'
'active' => 'required',
'reason' => 'required',
]);
// abort(404);
$member = Member::findOrFail($member_id);
$member->active = $request->active == '1';
$member->active = $request->active;
$member->reason = $request->reason;
if ($member->save()) {
return response()->json([
@@ -135,6 +159,9 @@ class CorporateMemberController extends Controller
public function import(Request $request, $corporate_id)
{
// setting tambahan php
Helper::setCustomPHPIniSettings();
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
@@ -143,7 +170,7 @@ class CorporateMemberController extends Controller
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$reader = ReaderEntityFactory::createReaderFromFile(Storage::path('temp/' . $file_name));
$reader = ReaderEntityFactory::createXLSXReader(Storage::path('temp/' . $file_name));
$reader->open(Storage::path('temp/' . $file_name));
$writer = WriterEntityFactory::createXLSXWriter();
@@ -155,9 +182,10 @@ class CorporateMemberController extends Controller
$result_headers = $this->memberEnrollmentService->result_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRow($result_headers));
$writer->addRow($singleRow);
$imported_member_data = 0;
$failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
@@ -181,9 +209,7 @@ class CorporateMemberController extends Controller
}
try {
$rowResponse = $this->memberEnrollmentService->handleImportRow($corporate, $new_member_data);
// Write Success Result to File
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
@@ -215,11 +241,11 @@ class CorporateMemberController extends Controller
break; //only read first sheet
}
$reader->close();
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
@@ -234,16 +260,35 @@ class CorporateMemberController extends Controller
public function generateLog(Request $request, $member_id)
{
$member = Member::findOrFail($member_id)
->load([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
return $benefit->when($request->benefit_ids, function ($q, $ids) {
return $q->whereIn('benefit_id', $ids);
});
},
'currentPlan.corporateBenefits.benefit']);
$corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id');
// $member = Member::findOrFail($member_id)
// ->load([
// 'currentPlan',
// 'currentPolicy',
// 'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
// return $benefit->when($request->benefit_ids, function ($q, $ids) {
// $q->whereIn('benefit_id', $ids)
// ->where([
// 'corporate_benefits.active' => 1,
// 'corporate_benefits.corporate_id' => $corporate_id,
// ]);
// });
// },
// // 'currentPlan.corporateBenefits.benefit'
// ]);
$member = Member::with([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($query) use ($request, $corporate_id) {
$query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) {
$q->whereIn('benefit_id', $ids)
->where('active', 1)
->where('corporate_id', $corporate_id);
});
},
// 'currentPlan.corporateBenefits.benefit'
])->findOrFail($member_id);
$dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now();
@@ -251,4 +296,180 @@ class CorporateMemberController extends Controller
$pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission']));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
}
public function generateMemberList(Request $request, $corporate_id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy'])
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
// Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
// dd('test');
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [ $item['record_mode'], // Recode Mode
$item['record_type'], // Recode Type
$item['payor_id'], // Payor ID
$item['member_id'], // Member ID
$item['principal_id'], // Mapping ID
NULL, // Link Medis Member ID
$item['current_corporate']['code'] ?? null, // Corporate ID
$item['employeds'][0]['nik'] ?? null, // NIK
$item['division']['code'] ?? null, // Devision
$item['employeds'][0]['branch_code'] ?? null, // Branch Code
$item['bank_info'], // Bank Info
$item['language'], // Language
null, // Type of Work
$item['race'], // Race
$item['current_policy']['code'] ?? null, // Policy Number
$item['marital_status'], // Marital Status
$item['relation_with_principal'], // Relationship
str_replace('-', '',$item['members_effective_date']), // Member effective date
str_replace('-', '',$item['members_expire_date']), // Member expiry date
NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider
NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider
$item['bpjs_class'], // The Right Classes Room of BPJS Participants
NULL, // Name of Faskes
NULL, // Rule BPJSK
NULL, // Internal Use
$item['full_name'], // Member Name
$item['address1'], // Address1
$item['address2'], // Address2
$item['address3'], // Address3
$item['address4'], // Address4
$item['city'], // City
NULL, // State
$item['postal_code'], // Post Code
NULL, // Telephone - Mobile
NULL, // Telephone - Res
NULL, // Telephone - Office
$item['nric'], // NRIC
$item['passport_no'], // Passport No
$item['passport_country'], // Passport Country
$item['email'], // Email
$item['identification_code'], // Identification Code
$item['birth_date'], // Date of Birth
$item['gender_code'], // Sex
NULL, // Internal Use
$item['current_plan']['code'] ?? null, // Plan-ID
NULL, // Employment-Status
NULL, // Internal Use
NULL, // Internal Use
NULL,// Internal Use
str_replace('-', '',$item['terminated_date']), // Date Terminated
$item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks
NULL, // Internal Use
NULL,// Member Since
NULL,// Internal Use
$item['policy_in_force'], // Policy Inforce
NULL, // Member Suspended
str_replace('-', '',$item['activation_date']), // Activation Date
NULL, // Internal Use
$item['start_no_claim'], // StartNoClaim
$item['end_no_claim'], // EndNoClaim
NULL, // Option Mode
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// dd('test');
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
// dd($filePath);
// Mengembalikan response untuk mengunduh file
return Helper::responseJson([
'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
public function sendAllECard(Request $request, $corporate_id){
$members = Member::with([
'currentPlan',
'currentPolicy',
'currentCorporate',
// 'currentPlan.corporateBenefits.benefit'
])->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})->get();
$data = [];
$countSuccesSend = 0;
foreach($members as $member){
// Simpan file PDF ke direktori yang diinginkan
$pdfPath = storage_path('app/pdf/ecards/E-card-' . $member->name. '.pdf');
// Cek apakah file sudah ada
if (!File::exists($pdfPath)) {
$pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
$pdf->save($pdfPath);
}
$dataEmail = [
// 'email' => $member->email,
'email' => 'tbfajri',
'name' => $member->name,
'subject' => 'Digital E Card '. $member->name,
'body' => '<h1>Hi ' . $member->name . '</h1> <br> ini adalah uji coba kirim e-card' ,
'attach' => $pdfPath,
];
$sendEmail = Helper::sendEmailattachData($dataEmail);
if ($sendEmail === true){
$countSuccesSend ++;
File::delete($pdfPath);
} else {
$dataFaild = [
'email' => $member->email,
'name' => $member->name,
'message' => $sendEmail
];
array_push($data, $dataFaild);
}
}
$response = [
'data_fail_send' => count($data),
'message' => $data,
'data_succes_send' => $countSuccesSend,
];
return response()->json($response);
}
public function viewECard(Request $request, $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');
}
}

View File

@@ -25,6 +25,31 @@ class CorporatePlanController extends Controller
return $benefits;
}
public function filter(Request $request, $corporate_id){
$benefits = CorporatePlan::query()
->filter($request->all())
->where('corporate_id', $corporate_id);
// ->where('type', $request->type)
// ->where('code', $request->code);
if ($request->has('service_code') && is_array($request->service_code) && count($request->service_code) > 0) {
$benefits->whereIn('service_code', $request->service_code);
}
if ($request->has('type') && is_array($request->type) && count($request->type) > 0) {
$benefits->whereIn('type', $request->type);
}
if ($request->has('code') && is_array($request->code) && count($request->code) > 0) {
$benefits->whereIn('code', $request->code);
}
$benefits = $benefits->paginate(0)->appends($request->all());
return $benefits;
}
public function activation(Request $request, $plan_id)
{
$request->validate([
@@ -34,7 +59,8 @@ class CorporatePlanController extends Controller
// abort(404);
$plan = CorporatePlan::findOrFail($plan_id);
$plan->active = $request->active == '1';
$plan->active = $request->active == 1 ? 0 : 1;
$plan->reason = $request->reason;
if ($plan->save()) {
return response()->json([
@@ -109,21 +135,21 @@ class CorporatePlanController extends Controller
public function update(Request $request, $corporate_id, $id)
{
$corporatePlan = CorporatePlan::findOrFail($id);
$request->validate([
'code' => [
'required',
Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
// Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
],
'name' => 'required'
]);
$corporatePlan->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'description' => $request->description
'corporate_plan_id' => $request->plan,
'service_code' => $request->service,
'type' => $request->type,
'limit_rules' => $request->limit
])->save();
return $corporatePlan;
}

View File

@@ -136,6 +136,7 @@ class CorporateServiceController extends Controller
public function corporateServiceUpdate(Request $request, $corporate_id, $service_code)
{
// dd($request->all);
// $corporate = Corporate::findOrFail($corporate_id);
$corporateService = CorporateService::query()
->where('corporate_id', $corporate_id)
@@ -143,7 +144,8 @@ class CorporateServiceController extends Controller
// ->with('configs', 'service')
->first();
$corporateService->fill([
'status' => $request->status == 'active' ? 'active' : 'inactive'
'status' => $request->status == 'active' ? 'inactive' : 'active',
'reason' => $request->reason
]);
$corporateService->save();
@@ -152,8 +154,6 @@ class CorporateServiceController extends Controller
public function corporateServiceSpecialityUpdate(Request $request, $corporate_id, $service_code)
{
// return response()->json([$request->checked, $request->value, $request->speciality_id]);
$corporateService = CorporateService::query()
@@ -161,7 +161,6 @@ class CorporateServiceController extends Controller
->where('service_code', $service_code)
->first();
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $request->speciality_id,
@@ -191,6 +190,116 @@ class CorporateServiceController extends Controller
return response()->json($selected_specialities);
}
public function corporateServiceSpecialityAllUpdate(Request $request, $corporate_id, $service_code)
{
// return response()->json([$request->checked, $request->value, $request->speciality_id]);
$corporateService = CorporateService::query()
->where('corporate_id', $corporate_id)
->where('service_code', $service_code)
->first();
$specialities = Speciality::get()->toArray();
if ($specialities){
foreach($specialities as $s){
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
], [
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => $request->active
]);
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
], [
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => $request->active
]);
$corporateServiceSpecialityRule = CorporateServiceSpeciality::where('corporate_service_id', $corporateService->id)
->where('speciality_id', $s['id'])
->with('exclusions.rules')
->first();
// Exclusion Rules
if (empty($corporateServiceSpecialityRule)) {
$corporateServiceSpecialityRule = CorporateServiceSpeciality::create([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => false,
]);
$corporateServiceSpecialityRule->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
} else {
$corporateServiceSpecialityRule->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
}
$exclusion = $corporateServiceSpecialityRule->exclusions()->where('corporate_id', $corporate_id)->where('service_code', $service_code)->first();
// if($exclusion){
$exclusion_rule = $exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'msc',
], [
'name' => 'msc',
'values' => $request->active ? 'm,s,c' : '',
]);
$exclusion_rule = $exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'gender',
], [
'name' => 'gender',
'values' => $request->active ? 'male,female' : '',
]);
// }
}
}
$exclusion = $corporateServiceSpeciality->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
$selected_specialities = CorporateServiceSpeciality::query()
->where('corporate_service_id', $corporateService->id)
->where('active', true)
->with('speciality')
->get()
->pluck('speciality.name', 'speciality.id');
// return response()->json($selected_specialities);
return response()->json([
'selected_specialities' => $selected_specialities,
'service' => CorporateServiceConfigResource::make($corporateService),
]);
}
public function storeExclusion(Request $request, $corporate_id, $service_code)
{
@@ -225,12 +334,10 @@ class CorporateServiceController extends Controller
if ($request->type == 'msc') {
$value_input = $request->value;
$current_msc = $exclusion->rules()->where('name', 'msc')->first()->values ?? null;
if (!empty($current_msc)) {
$values = "";
if ($request->value == 'm' && $request->checked == "1") {
$values = $current_msc . "," . $value_input;
@@ -436,4 +543,6 @@ class CorporateServiceController extends Controller
'service' => CorporateServiceConfigResource::make($corporateService),
]);
}
}

View File

@@ -0,0 +1,410 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\DailyMonitoring;
use App\Models\RequestDailyMonitoring;
use App\Models\MedicalPlan;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use App\Models\File;
/**
* 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'
];
}
/**
* Member List
*/
public function GetMemberList()
{
$memberList = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->leftJoin('member_plans', 'request_logs.member_id', '=', 'member_plans.member_id')
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->select('members.member_id','members.name','members.members_effective_date AS startdate','members.members_expire_date AS enddate', 'request_logs.submission_date as addmision_date', 'organizations.name as provider' )
->where('request_logs.service_code', 'IP')
->where('request_logs.status_final_log', 'approved')
->groupBy('request_logs.member_id')
->orderBy('request_logs.created_at', 'desc')
->get();
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $memberList,
]
],200);
}
/**
* 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.status_final_log', 'approved')
->where("request_logs.member_id", "=", $memberDetail->id)
->orderBy("request_logs.created_at", "desc")
->get();
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')
->where('code', $request_code)
->first();
$detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '')
->orderBy("created_at", "desc")
->get();
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'detail_list'=> $detail_list,
]
],200);
}
/**
* 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,
'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',
'body_temperature' => 'required|numeric',
'sistole' => 'required|numeric',
'diastole' => 'required|numeric',
'respiration_rate' => 'required|numeric',
'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,
'subject' => $request->subject,
'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) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'confirmation-medical-letter',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $path,
]);
}
}
if ($request->medical_action_letter){
foreach ($request->medical_action_letter as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'medical-action-letter',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $path,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
foreach ($request->result as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $path,
]);
// $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);
}
}
/**
* 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);
}
}
}

View File

@@ -3,20 +3,40 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Icd;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class DiagnosisController extends Controller
{
public function __construct(IcdService $icdService)
{
$this->icdService = $icdService;
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function index(Request $request, $diagnosis_template_id)
{
$diagnosis = Icd::withTrashed()->filter($request->toArray())->paginate();
$diagnosis = Icd::query()
->filter($request->toArray())
->where('icd_template_id', '=', $diagnosis_template_id)
->orderBy('code', 'ASC')
->paginate(15);
return $diagnosis;
}
@@ -87,4 +107,178 @@ class DiagnosisController extends Controller
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'ICD_Code',
1 => 'Description',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['ICD_Code']) &&
empty($row_data['Description'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $diagnosis_id)
{
$request->validate([
'active' => 'required'
]);
$Icd = Icd::findOrFail($diagnosis_id);
$Icd->active = $request->active == '1';
if ($Icd->save()) {
return response()->json([
'icd' => $Icd,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request, $diagnosis_id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::where('icd_template_id', $diagnosis_id)->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateICDList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
// $item['rev'], // Rev
// $item['version'], // Version
$item['code'], // Code
// $item['parent_code'], // Parent Code
$item['name'], // Name
// $item['description'], // Description
// $item['active'] == 1 ? 'Active' : 'Inactive', // Status
// $item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateICDList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateICDList.xlsx')
]);
}
}

View File

@@ -7,6 +7,7 @@ use App\Helpers\Helper;
use App\Models\Corporate;
use App\Models\CorporateService;
use App\Models\Exclusion;
use App\Models\ExclusionImport;
use App\Models\Icd;
use App\Models\ImportLog;
use App\Services\ImportService;
@@ -17,6 +18,8 @@ use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\ExclusionService;
use Modules\Internal\Transformers\DiagnosisExclusionResource;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class DiagnosisExclusionController extends Controller
{
@@ -37,6 +40,22 @@ class DiagnosisExclusionController extends Controller
return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions));
}
public function listDiagnosis(Request $request, $corporate_id){
$exclusion = Exclusion::query()
->where('corporate_id', $corporate_id)
->where('type', 'diagnosis')
->where('deleted_at', null)
// ->with(['rules'])
->get('exclusionable_id')->toArray();
$icd = Icd::query()
->whereNotIn('id', $exclusion)
->limit(100)
->get()
->toArray();
return Helper::responseJson($icd);
}
/**
* Show the form for creating a new resource.
* @return Renderable
@@ -216,7 +235,13 @@ class DiagnosisExclusionController extends Controller
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
ExclusionImport::updateOrCreate([
'corporate_id' => $corporate_id
],[
'file_name' => $file_name,
'file_path' => 'temp/result-' . $file_name,
]);
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
@@ -268,6 +293,7 @@ class DiagnosisExclusionController extends Controller
$gender = implode(",", $gender);
$gender = trim($gender, ",");
$exclusion->rules()->corporate_id = $corporate_id;
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
@@ -293,7 +319,6 @@ class DiagnosisExclusionController extends Controller
'values' => $data['min_age'] ?? '',
]);
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'max_age',
@@ -320,4 +345,85 @@ class DiagnosisExclusionController extends Controller
// return $exclusions;
return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions));
}
/**
* Bagaskoro BSD 20-10-2023
*
* Fungsi untuk get detil exclusion
*/
public function detilExclusion(Request $request, $corporate_id, $id_exclusion)
{
$corporate = Corporate::query()
->with(['currentPolicy', 'plans'])
->withCount('corporatePlans')
->withCount('employees')
->findOrFail($corporate_id);
$plans = $corporate['plans']->map(function ($plan) {
return $plan['code'];
});
$exclusions = Exclusion::query()
->where('id', $id_exclusion)
->where('type', 'diagnosis')
->where('deleted_at', null)
->with(['rules'])
->get();
$exclusion = DiagnosisExclusionResource::collection($exclusions);
return response()->json([
'error' => false,
'messages' => "success",
'data' => [
'exclusion' => empty($exclusion) ? [] : $exclusion[0],
'plans' => $plans,
]
],200);
}
/**
* Bagaskoro BSD 19-10-2023
*
* Fungsi untuk update status active
*/
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',
'digits_between'=> ':attribute maximal :max digit minimal :min digit'
];
}
public function updateActivation(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'id' => 'required|exists:exclusions',
'active' => 'required|in:0,1',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'messages' => $validator->getMessageBag()
],400);
}
Exclusion::where('id', $request->id)->update([
'active' => $request->active == 1 ? 0 : 1,
'reason' => $request->reason
]);
return response()->json([
'error' => false,
'messages' => "status berhasil diupdate",
'data' => []
],200);
}
}

View File

@@ -0,0 +1,314 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Icd;
use App\Models\IcdTemplate;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class DiagnosisTemplateController extends Controller
{
public function index(Request $request)
{
if ($request->search){
return IcdTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = IcdTemplate::query()
// ->filter($request->toArray())
->orderBy('code', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required'
]);
$newDiagnosisTemplate = IcdTemplate::create($request->all());
return $newDiagnosisTemplate;
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
$IcdTemplate = IcdTemplate::findOrFail($id);
return $IcdTemplate;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$IcdTemplate = IcdTemplate::findOrFail($id);
$request->validate([
'name' => 'required'
]);
$IcdTemplate->fill([
// 'code' => $request->code,
'name' => $request->name,
'description' => $request->description,
'active' => $request->active,
])->save();
return $IcdTemplate;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function search(Request $request)
{
return IcdTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'parent_code',
2 => 'reff_exc',
3 => 'description_en',
4 => 'description_id',
5 => 'keywords',
6 => 'version',
7 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['code']) &&
empty($row_data['parent_code']) &&
empty($row_data['reff_exc']) &&
empty($row_data['description_en']) &&
empty($row_data['description_id']) &&
empty($row_data['keywords']) &&
empty($row_data['version']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $id)
{
$request->validate([
'active' => 'required'
]);
$Icd = IcdTemplate::findOrFail($id);
$Icd->active = $request->active == '1';
if ($Icd->save()) {
return response()->json([
'icd' => $Icd,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['rev'], // Rev
$item['version'], // Version
$item['code'], // Code
$item['parent_code'], // Parent Code
$item['name'], // Name
$item['description'], // Description
$item['active'] == 1 ? 'Active' : 'Inactive', // Status
$item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
}

View File

@@ -19,6 +19,7 @@ class DivisionController extends Controller
$benefits = CorporateDivision::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
@@ -52,6 +53,7 @@ class DivisionController extends Controller
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'description' => $request->description ? $request->description : null,
]);
return $newCorporatePlan;
@@ -91,8 +93,6 @@ class DivisionController extends Controller
$request->validate([
'code' => [
'required',
// Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
Rule::unique('corporate_divisions')->where('corporate_id', $corporate_id)
],
'name' => 'required'
]);
@@ -100,7 +100,7 @@ class DivisionController extends Controller
$corporatePlan->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'description' => $request->description,
])->save();
return $corporatePlan;

View File

@@ -0,0 +1,103 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use App\Models\OLDLMS\DoctorRating;
class DoctorRatingController extends Controller
{
/**
* Display a listing of the resource.
* @param int|null $id
* @return \Illuminate\Http\JsonResponse
*/
public function index($id = null)
{
$query = DoctorRating::query();
if ($id !== null) {
$query->where('nID', $id);
}
$doctorRatings = $query->with([
'user' => function ($query) {
$query->select('nID', 'sFirstName'); // Select only necessary columns
}
])
->select('nIDUser', 'nIDDokter', 'nRating', 'sNotes', 'dCreateOn')
->get();
// $prescriptions->toArray();
// dd($prescriptions);
return response()->json($doctorRatings);
// return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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)
{
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::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)
{
//
}
}

View File

@@ -6,6 +6,8 @@ use App\Models\Drug;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Maatwebsite\Excel\Facades\Excel;
class DrugController extends Controller
{
@@ -15,8 +17,11 @@ class DrugController extends Controller
*/
public function index(Request $request)
{
$drugs = Drug::withTrashed()->filter($request->toArray())->paginate();
$drugs = Drug::query()
->filter($request->all())
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
return $drugs;
}
@@ -79,4 +84,110 @@ class DrugController extends Controller
{
//
}
public function activation(Request $request, $drug_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required',
]);
$drug = Drug::findOrFail($drug_id);
$drug->active = $request->active;
$drug->reason = $request->reason;
if ($drug->save()) {
return response()->json([
'hostpital' => $drug,
'message' => 'Status Updated Successfully'
]);
}
}
public function downloadTemplate()
{
return Helper::responseJson([
'file_name' => "Template - Drugs.xlsx",
"file_url" => url('files/Template - Drugs.xlsx')
]);
}
public function import(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$data = Excel::toArray([], $file);
$processedData = $this->processCategoryNames($data);
$importedRows = 0;
$failedRows = [];
foreach ($processedData as $row) {
try {
Drug::create(
[
'name' => $row['name'],
'code' => $row['code'],
'generic_name' => $row['generic_name'],
'description' => $row['description'],
'mims_class' => $row['mims_class'],
'indications' => $row['indications'],
'atc_code' => $row['atc_code'],
'segmentation' => $row['segmentation'],
'type' => $row['type'],
'dosage' => $row['dosage'],
'remark' => $row['remark'],
]
);
$importedRows++;
} catch (\Exception $e) {
$failedRows[] = $row;
}
}
$response = [
'message' => 'File uploaded and data saved to database',
'data' => [
'total_success_row' => $importedRows,
'total_failed_row' => count($failedRows),
'failed_rows' => $failedRows,
],
];
return response()->json($response);
}
return response()->json(['error' => 'No file uploaded.']);
}
private function processCategoryNames($data)
{
$header = [];
$row = [];
for ($i = 1; $i < count($data[0]); $i++) {
$row[] = $data[0][$i];
$header[] = $data[0][0];
}
$filed = [];
foreach ($header[0] as $value)
{
$modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value)));
$modelColumn = str_replace(['*', ' '], '', $modelColumn);
if($modelColumn)
{
$filed[] = $modelColumn;
}
}
$result = [];
foreach ($row as $subarray) {
$trimmedSubarray = [];
for ($i = 0; $i < count($filed); $i++) {
$trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null;
}
$result[] = $trimmedSubarray;
}
return $result;
}
}

View File

@@ -3,9 +3,21 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Formularium;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\FormulariumService;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
class FormulariumController extends Controller
{
@@ -13,10 +25,27 @@ class FormulariumController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function __construct(FormulariumService $formulariumService)
{
$formulariums = Formularium::withTrashed()->withCount('items')->filter($request->toArray())->paginate();
$this->formulariumService = $formulariumService;
}
public function index(Request $request, $id)
{
if ($request->search) {
return Formularium::when($request->search ?? null, function ($formularium) use ($request, $id) {
$formularium->where('formularium_template_id', $id)
->where('name', 'LIKE', '%' . $request->search . '%')
->orWhere('code', 'LIKE', '%' . $request->search . '%');
})->paginate(15);
}
else {
$formulariums = Formularium::query()
// ->filter($request->toArray())
->where('formularium_template_id', $id)
->orderBy('name', 'ASC')
->paginate(15);
return $formulariums;
}
return $formulariums;
}
@@ -34,7 +63,7 @@ class FormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
public function store(Request $request, $id)
{
$request->validate([
'name' => 'required|string|max:255',
@@ -87,7 +116,7 @@ class FormulariumController extends Controller
//
}
public function import(Request $request)
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
@@ -95,7 +124,6 @@ class FormulariumController extends Controller
// dd($request->toArray());
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$corporate = Corporate::findOrFail($corporate_id);
// $importLog = $corporate->importLogs()->create([
// 'type' => 'diagnosis-exclusions',
@@ -107,7 +135,6 @@ class FormulariumController extends Controller
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
@@ -130,16 +157,19 @@ class FormulariumController extends Controller
$row_data = [];
$row_map = [
0 => 'code',
1 => 'description',
2 => 'ip_exclusion',
3 => 'op_exclusion',
4 => 'de_exclusion',
5 => 'ma_exclusion',
6 => 'sp_exclusion',
7 => 'pre_exist_exclusion',
8 => 'op_de_exclusion',
9 => 'keterangan',
10 => 'maternity_waiting'
1 => 'name',
2 => 'description',
3 => 'manufacturer',
4 => 'category_name',
5 => 'kategori_obat',
6 => 'uom',
7 => 'general_indication',
8 => 'composition',
9 => 'atc_code',
10 => 'class',
11 => 'bpom_registration',
12 => 'classifications',
13 => 'cat_for',
];
foreach ($row->getCells() as $header_index => $cell) {
@@ -157,20 +187,27 @@ class FormulariumController extends Controller
if (
// empty($row_data['code']) &&
// empty($row_data['description']) &&
empty($row_data['ip_exclusion']) &&
empty($row_data['op_exclusion']) &&
empty($row_data['de_exclusion']) &&
empty($row_data['ma_exclusion']) &&
empty($row_data['sp_exclusion']) &&
empty($row_data['pre_exis_exclusion']) &&
empty($row_data['op_de_exclusion']) &&
empty($row_data['maternity_waiting'])) {
empty($row_data['code']) &&
empty($row_data['name']) &&
empty($row_data['description']) &&
empty($row_data['manufacturer']) &&
empty($row_data['category_name']) &&
empty($row_data['kategori_obat']) &&
empty($row_data['uom']) &&
empty($row_data['general_indication']) &&
empty($row_data['composition']) &&
empty($row_data['atc_code']) &&
empty($row_data['class']) &&
empty($row_data['bpom_registration']) &&
empty($row_data['classifications']) &&
empty($row_data['cat_for'])
) {
continue;
}
// Save the Row
$exclusionService = new ExclusionService();
$exclusionService->handleDiagnosisExclusionRow($corporate, $row_data);
$formulariumService = new FormulariumService();
$formulariumService->handleFormuariumTemplateRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
@@ -211,4 +248,64 @@ class FormulariumController extends Controller
]
];
}
public function generateFormulariumList(Request $request)
{
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Formularium::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateFormulariumList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->formulariumService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['code'], // code
$item['name'], // name
$item['description'], // Description
$item['manufacturer'], // manufacturer
$item['category_name'], // category_name
$item['kategori_obat'], // kategori_obat
$item['uom'], // uom
$item['general_indication'], // Description
$item['composition'], // composition
$item['atc_code'], // atc_code
$item['class'], // class
$item['bpom_registration'], // bpom_registration
$item['classifications'], // classifications
$item['cat_for'], // cat_for
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateFormulariumList.xlsx');
return Helper::responseJson([
'file_name' => "Formularium List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateFormulariumList.xlsx')
]);
}
}

View File

@@ -0,0 +1,316 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Formularium;
use App\Models\FormulariumTemplate;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class FormulariumTemplateController extends Controller
{
public function index(Request $request)
{
if ($request->search){
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = FormulariumTemplate::query()
// ->filter($request->toArray())
->orderBy('name', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required'
]);
$newDiagnosisTemplate = FormulariumTemplate::create($request->all());
return $newDiagnosisTemplate;
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
$FormulariumTemplate = FormulariumTemplate::findOrFail($id);
return $FormulariumTemplate;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$FormulariumTemplate = FormulariumTemplate::findOrFail($id);
$request->validate([
'name' => 'required'
]);
$FormulariumTemplate->fill([
// 'code' => $request->code,
'name' => $request->name,
'description' => $request->description,
'active' => $request->active,
])->save();
return $FormulariumTemplate;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function search(Request $request)
{
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'parent_code',
2 => 'reff_exc',
3 => 'description_en',
4 => 'description_id',
5 => 'keywords',
6 => 'version',
7 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['code']) &&
empty($row_data['parent_code']) &&
empty($row_data['reff_exc']) &&
empty($row_data['description_en']) &&
empty($row_data['description_id']) &&
empty($row_data['keywords']) &&
empty($row_data['version']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $id)
{
$request->validate([
'active' => 'required'
]);
$formulariumTemplate = FormulariumTemplate::find($id);
$formulariumTemplate->active = $request->active == 1 ? 0 : 1;
if ($formulariumTemplate->save()) {
return response()->json([
'data' => $formulariumTemplate,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['rev'], // Rev
$item['version'], // Version
$item['code'], // Code
$item['parent_code'], // Parent Code
$item['name'], // Name
$item['description'], // Description
$item['active'] == 1 ? 'Active' : 'Inactive', // Status
$item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
}

View File

@@ -0,0 +1,266 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\CorporateHospital;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use Maatwebsite\Excel\Facades\Excel;
class HospitalController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $corporate_id)
{
$datas = CorporateHospital::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
return $datas;
}
public function activation(Request $request, $hospital_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required',
]);
// abort(404);
$hostpital = CorporateHospital::findOrFail($hospital_id);
$hostpital->active = $request->active;
$hostpital->reason = $request->reason;
if ($hostpital->save()) {
return response()->json([
'hostpital' => $hostpital,
'message' => 'Status Updated Successfully'
]);
}
}
public function dataHospital(Request $request, $corporate_id)
{
$data = DB::table('organizations')
->where('type', 'hospital')
->where('status', 'active')
->orderBy('id', 'desc')
->get();
return $data;
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request, $corporate_id)
{
$request->validate([
'corporate_id' => 'required',
'code' => 'required',
'name' => 'required',
'organization_id' => 'required',
]);
$newCorporateHospital = CorporateHospital::create([
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'organization_id' => $request->organization_id,
'description' => $request->description ? $request->description : null,
]);
return $newCorporateHospital;
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($corporate_id, $id)
{
$corporatePlan = CorporateDivision::findOrFail($id);
return $corporatePlan;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $corporate_id, $id)
{
$corporatePlan = CorporateHospital::findOrFail($id);
$request->validate([
'corporate_id' => 'required',
'code' => 'required',
'name' => 'required',
'organization_id' => 'required',
]);
$corporatePlan->fill([
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'organization_id' => $request->organization_id,
'description' => $request->description ? $request->description : null,
])->save();
return $corporatePlan;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function downloadTemplate()
{
return Helper::responseJson([
'file_name' => "Template - Hospitals.xlsx",
"file_url" => url('files/Template - Hospitals.xlsx')
]);
}
public function import(Request $request, $corporate_id)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$data = Excel::toArray([], $file);
$processedData = $this->processCategoryNames($data);
$importedRows = 0;
$failedRows = [];
foreach ($processedData as $row) {
$q_check = DB::table('corporate_hospitals')
->where('code', '=', $row['code'])
->select('code')
->first();
$q = DB::table('organizations')
->where('code', '=', $row['code'])
->where('type', '=', 'hospital')
->where('status', '=', 'active')
->select('id', 'code', 'name')
->first();
try {
if($q_check)
{
DB::table('corporate_hospitals')
->where('code','=', $q_check->code)
->update(
[
'corporate_id' => $corporate_id,
'code' => $q->code,
'name' => $q->name,
'organization_id' => $q->id,
'description' => $request->description ? $request->description : null,
'updated_by' =>auth()->user()->id,
'updated_at' => date('Y-m-d H:i:s'),
]
);
}
else
{
CorporateHospital::create(
[
'corporate_id' => $corporate_id,
'code' => $q->code,
'name' => $q->name,
'organization_id' => $q->id,
'description' => $request->description ? $request->description : null,
]
);
}
$importedRows++;
} catch (\Exception $e) {
$failedRows[] = $row;
}
}
$response = [
'message' => 'File uploaded and data saved to database',
'data' => [
'total_success_row' => $importedRows,
'total_failed_row' => count($failedRows),
'failed_rows' => $failedRows,
],
];
return response()->json($response);
}
return response()->json(['error' => 'No file uploaded.']);
}
private function processCategoryNames($data)
{
$header = [];
$row = [];
for ($i = 1; $i < count($data[0]); $i++) {
$row[] = $data[0][$i];
$header[] = $data[0][0];
}
$filed = [];
foreach ($header[0] as $value)
{
$modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value)));
$modelColumn = str_replace(['*', ' '], '', $modelColumn);
if($modelColumn)
{
$filed[] = $modelColumn;
}
}
$result = [];
foreach ($row as $subarray) {
$trimmedSubarray = [];
for ($i = 0; $i < count($filed); $i++) {
$trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null;
}
$result[] = $trimmedSubarray;
}
return $result;
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\File;
use App\Models\LaboratoriumResult;
use App\Models\MedicalPlan;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
/**
* Bagaskoro BSD 28-10-2023
*
* Controller untuk laboratorium result
*/
class LaboratoriumResultController 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'
];
}
/**
* Detail Lab Result List - by claim_code
*/
public function GetDetailLabResultList(Request $request, $claim_code)
{
// 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', empty($claim_request)==false ? $claim_request->id : '')
->first();
$detail_list = LaboratoriumResult::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']);
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'lab_result_list'=> $detail_list,
]
],200);
}
/**
* Add Detail Lab Result List
*/
public function AddDetailLabResultList(Request $request, $claim_code)
{
$request->merge(['claim_code' => $claim_code]);
// validation rule
$validator = Validator::make($request->all(),[
'claim_code' => 'required|exists:claim_requests,code',
'date' => 'required',
'location' => 'required',
'examination' => 'required',
'lab_result_file' => '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 lab result
$db_response = LaboratoriumResult::create([
'claim_id' => $claim->id,
'date' => $request->date,
'location' => $request->location,
'examination' => $request->examination,
]);
// insert file result
foreach ($request->lab_result_file as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => '',
]);
$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);
}
}
}

View File

@@ -55,8 +55,8 @@ class PaymentController extends Controller
// });
$appointments = $appointments->where(function($q) use ($request) {
$q->where('dAgreeOn', '>=', $request->appointment_start)
->where('dAgreeOn', '<=', $request->appointment_end);
$q->where('dCreateOn', '>=', $request->appointment_start)
->where('dCreateOn', '<=', $request->appointment_end);
});
}

View File

@@ -4,10 +4,16 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\Livechat;
use App\Models\OLDLMS\Appointment;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Transformers\LivechatResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class LivechatController extends Controller
{
@@ -15,34 +21,29 @@ class LivechatController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index()
public function index(Request $request)
{
$livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare')
->where('nIDAppointment', '!=', null)->where('nIDAppointment', '!=', '')
->latest()
->paginate(15);
$startDate = $request->startDate;
$endDate = $request->endDate;
$livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare');
// ->where('nIDAppointment', '!=', null)
// ->where('nIDAppointment', '!=', '');
if ($startDate) {
$livechat = $livechat->where('dCreateOn', '>=', $startDate);
}
if ($endDate) {
$endDate = date('Y-m-d', strtotime($endDate . ' +1 day'));
$livechat = $livechat->where('dCreateOn', '<', $endDate);
}
$livechat = $livechat->latest()->paginate(15);
return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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
@@ -57,34 +58,159 @@ class LivechatController extends Controller
return response()->json(new LivechatResource($livechat));
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
public function export(Request $request)
{
return view('internal::edit');
}
$startDate = $request->has('startDate') ? $request->input('startDate') : '';
$endDate = $request->has('endDate') ? $request->input('endDate') : '';
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
$liveChats = Livechat::with('user:nID,sFirstName,sLastName,sEmail,sPhone,nIDUser', 'doctor:nID,nIDSpesialis,nIDUser', 'doctor.user:nID,sFirstName,sLastName', 'appointment:nID,sPaymentStatus,sPaymentMethod', 'appointment.appointmentDetail:nID,nIDAppointment,dTanggalAppointment,tTimeAppointment', 'healthCare:nID,sHealthCare')
->where(function (Builder $query) use ($startDate, $endDate) {
// $query->where('nIDAppointment', '!=', null);
// $query->where('nIDAppointment', '!=', '');
if ($startDate) {
$query->where('dCreateOn', '>=', $startDate);
}
if ($endDate) {
$endDate = date('Y-m-d', strtotime($endDate . ' +1 day'));
$query->where('dCreateOn', '<', $endDate);
}
})
->orderBy('nID', 'desc')
->get(['nID', 'nIDUser', 'nIDDokter', 'nIDHealthCare', 'nIDAppointment', 'sStatus', 'sMediaDokter', 'sMedia', 'dCreateOn']);
$headers = [
['value' => 'No', 'cell' => 'A1', 'mergeCell' => true, 'mergeToCell' => 'A2'],
['value' => 'Kode TC', 'cell' => 'B1', 'mergeCell' => true, 'mergeToCell' => 'B2'],
['value' => 'Tanggal', 'cell' => 'C1', 'mergeCell' => true, 'mergeToCell' => 'C2'],
['value' => 'Waktu', 'cell' => 'D1', 'mergeCell' => true, 'mergeToCell' => 'D2'],
['value' => 'Faskes', 'cell' => 'E1', 'mergeCell' => true, 'mergeToCell' => 'E2'],
['value' => 'Nama Dokter', 'cell' => 'F1', 'mergeCell' => true, 'mergeToCell' => 'F2'],
['value' => 'Spesialis', 'cell' => 'G1', 'mergeCell' => true, 'mergeToCell' => 'G2'],
['value' => 'Chat Via App/Website', 'cell' => 'H1', 'mergeCell' => true, 'mergeToCell' => 'I1'],
['value' => 'Pasien', 'cell' => 'H2', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Dokter', 'cell' => 'I2', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'nIDUser', 'cell' => 'J1', 'mergeCell' => true, 'mergeToCell' => 'J2'],
['value' => 'Nama Pasien', 'cell' => 'K1', 'mergeCell' => true, 'mergeToCell' => 'K2'],
['value' => 'No Telepon Pasien', 'cell' => 'L1', 'mergeCell' => true, 'mergeToCell' => 'L2'],
['value' => 'Email Pasien', 'cell' => 'M1', 'mergeCell' => true, 'mergeToCell' => 'M2'],
['value' => 'Status', 'cell' => 'N1', 'mergeCell' => true, 'mergeToCell' => 'N2'],
['value' => 'Record Type', 'cell' => 'O1', 'mergeCell' => true, 'mergeToCell' => 'O2'],
['value' => 'nID Principal', 'cell' => 'P1', 'mergeCell' => true, 'mergeToCell' => 'P2'],
['value' => 'Metode Pembayaran', 'cell' => 'Q1', 'mergeCell' => true, 'mergeToCell' => 'Q2'],
];
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
$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);
}
$startFrom = 3;
foreach ($liveChats as $indexLiveChat => $liveChat) {
$phone = $liveChat->user->sPhone ?? '-';
$status = $liveChat->sStatus;
$nIDUser = $liveChat->user->nIDUser ?? 0; // Principal or Dependent
$paymentMethod = $liveChat->appointment ? Helper::sPaymentMethod($liveChat->appointment->sPaymentMethod) : 'N/A';
$fullNameDoctor = '-';
if ($liveChat->doctor->user !== null) {
$fullNameDoctor = '';
if ($liveChat->doctor->user->detail !== null) {
if ($liveChat->doctor->user->detail->sTitlePrefix !== null) {
$fullNameDoctor .= $liveChat->doctor->user->detail->sTitlePrefix . '. ';
}
if ($liveChat->doctor->user->full_name !== null) {
$fullNameDoctor .= $liveChat->doctor->user->full_name . ' ';
}
if ($liveChat->doctor->user->detail->sTitleSuffix !== null) {
$fullNameDoctor .= $liveChat->doctor->user->detail->sTitleSuffix;
}
}
}
$recordType = 'P';
if ($nIDUser){
$recordType = 'D';
}
switch ($status) {
case 0:
$statusLivechat = "Request TC";
break;
case 1:
$statusLivechat = "Accepted by Doctor but User not Payment";
break;
case 2:
$statusLivechat = "Payment Success";
break;
case 3:
$statusLivechat = "Decline by Doctor";
break;
case 4:
$statusLivechat = "Payment Expired";
break;
default:
$statusLivechat = "Cancel by Patient";
}
$sheet->setCellValue('A' . $startFrom, $indexLiveChat + 1);
$sheet->setCellValue('B' . $startFrom, $liveChat->nID ?? '-');
$sheet->setCellValue('C' . $startFrom, Carbon::parse($liveChat->dCreateOn)->format('d-m-Y'));
$sheet->setCellValue('D' . $startFrom, Carbon::parse($liveChat->dCreateOn)->format('H:i:s'));
// $sheet->setCellValue('D' . $startFrom, Carbon::parse($liveChat->dRequestTime)->format('H:i:s'));
$sheet->setCellValue('E' . $startFrom, $liveChat->healthCare->sHealthCare ?? '-');
$sheet->setCellValue('F' . $startFrom, $fullNameDoctor);
$sheet->setCellValue('G' . $startFrom, $liveChat->doctor->speciality->sSpesialis ?? '-');
$sheet->setCellValue('H' . $startFrom, $liveChat->sMedia ?? '-');
$sheet->setCellValue('I' . $startFrom, $liveChat->sMediaDokter ?? '-');
$sheet->setCellValue('J' . $startFrom, $liveChat->user->nID ?? '-');
$sheet->setCellValue('K' . $startFrom, $liveChat->user->full_name ?? '-');
$sheet->setCellValue('L' . $startFrom, preg_replace('/(\d{3})(\d{4})(\d{3})/', '$1$2$3', $phone));
$sheet->setCellValue('M' . $startFrom, $liveChat->user->sEmail ?? '-');
$sheet->setCellValue('N' . $startFrom, $statusLivechat);
$sheet->setCellValue('O' . $startFrom, $recordType);
$sheet->setCellValue('P' . $startFrom, $nIDUser ?? '-');
$sheet->setCellValue('Q' . $startFrom, $paymentMethod ?? '-');
$startFrom++;
}
foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'O', 'P'] as $header) {
if ($header === 'A') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px');
} elseif ($header === 'H' || $header === 'I') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px');
} else {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true);
}
}
$spreadsheet->getActiveSheet()->getStyle('A3:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$sheet->getDefaultRowDimension()->setRowHeight(-1);
$sheet->setTitle('Live Chat Report');
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$content = ob_get_contents();
ob_end_clean();
$fileName = 'result-' . now()->getPreciseTimestamp(3) . '-livechat-report.xlsx';
Storage::disk('public')->put('temp/' . $fileName, $content);
$fileUrl = url('storage/temp/' . $fileName);
return Helper::responseJson([
"file_url" => $fileUrl
]);
}
}

View File

@@ -13,10 +13,14 @@ class MemberController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index()
public function index(Request $request)
{
return Member::query()
->with('currentPlan')
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('member_id', 'LIKE', '%' . $search . '%');
})
->with('currentPlan', 'currentCorporate')
->paginate();
}

View File

@@ -120,7 +120,6 @@ class PlanController extends Controller
$result_headers = array_keys($headers_map_to_table_fields);
array_push($result_headers, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
die('fuck');
$imported_plan_data = 0;
$failed_plan_data = [];

View File

@@ -0,0 +1,96 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\OLDLMS\Prescription;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
class PrescriptionController extends Controller
{
/**
* Display a listing of the resource.
* @param int|null $id
* @return \Illuminate\Http\JsonResponse
*/
public function index($id = null)
{
$query = Prescription::query();
if ($id !== null) {
$query->where('nID', $id);
}
$prescriptions = $query->select('nID','nIDLiveChat', 'nIDLiveChatSummary', 'nIDDokter', 'sDokterName', 'dTanggalResep', 'sSource', 'nIDUser', 'sKodeResep', 'sDiagnose', 'sStatus')
->get();
// $prescriptions->toArray();
// dd($prescriptions);
return response()->json($prescriptions);
// return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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)
{
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::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)
{
//
}
}

View File

@@ -0,0 +1,145 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLogBenefit;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class RequestLogBenefitController extends Controller
{
public function index(Request $request)
{
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$customMessages = [
'required' => 'Kolom :attribute wajib diisi.',
'numeric' => 'Kolom :attribute harus berupa angka.',
];
$validator = Validator::make($request->all(), [
'benefit_data' => 'required|array',
'benefit_data.*' => 'required',
], $customMessages);
if ($validator->fails()) {
return Helper::responseJson([],'error', 400, $validator->errors());
} else {
$benefitData = $request->benefit_data;
if (count($benefitData)>0){
// BeginTransaction
DB::beginTransaction();
foreach($benefitData as $key => $value){
$data = [
'request_log_id' => $value['request_log_id'],
'benefit_id' => $value['benefit_id'],
'amount_incurred' => $value['amount_incurred'],
'amount_approved' => $value['amount_approved'],
'amount_not_approved' => $value['amount_not_approved'],
'excess_paid' => $value['excess_paid'],
'keterangan' => $value['keterangan'],
'created_by' => auth()->user()->id,
];
// Insert Data
try {
RequestLogBenefit::create($data);
} catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
DB::commit();
return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray());
};
}
$requestLogBenefit = RequestLogBenefit::insert($data);
return $requestLogBenefit;
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$requestLogBenefit = requestLogBenefit::findOrFail($id);
$requestLogBenefit->amount_approved = $request->amount_approved;
$requestLogBenefit->amount_incurred = $request->amount_incurred;
$requestLogBenefit->amount_not_approved = $request->amount_not_approved;
$requestLogBenefit->excess_paid = $request->excess_paid;
$requestLogBenefit->keterangan = $request->keterangan;
$requestLogBenefit->updated_by = auth()->user()->id;
$requestLogBenefit->updated_at = Carbon::now();
$requestLogBenefit->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLogBenefit],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
$requestLogBenefit = RequestLogBenefit::findOrFail($id);
$requestLogBenefit->delete();
}
}

View File

@@ -0,0 +1,837 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLog;
use App\Models\Organization;
use App\Services\ClaimService;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\RequestLogResource;
use Modules\Internal\Transformers\RequestLogShowResource;
use Illuminate\Support\Facades\Storage;
use App\Exceptions\ImportRowException;
use App\Events\RequestLoged;
use Carbon\Carbon;
use Maatwebsite\Excel\Facades\Excel;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Exception;
use PDF;
use App\Models\File;
use App\Models\FilesMcu;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
use Modules\Internal\Services\RequestLogService;
use App\Services\RequestLogService as AppRequestLogService;
class RequestLogController extends Controller
{
private static $code_prefix = 'LOG';
/**
* Display a listing of the resource.
* @return Renderable
*/
public function __construct()
{
$this->requestLogService = New RequestLogService;
}
public function index(Request $request)
{
$requestLog = RequestLog::query()
->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->orderBy, function ($q, $orderBy) use ($request) {
if (in_array($orderBy, ['submission_date', 'code'])) {
$q->orderBy($orderBy, $request->order);
}
})
->when(empty($request->orderBy), function ($q) {
$q->orderBy('created_at', 'desc');
})
->when($request->final_log, function($q, $final_log) {
$q->where('final_log', $final_log);
})
->when($request->service_code, function($q, $service_code) {
if ($service_code == 'IP'){ // Penjagaan sementara agar ini hanya muncul di inpatient monitoring
$q->where('service_code', $service_code);
} else {
$q->where('service_code', '!=', 'IP'); // Dan selain IP muncul di final LOG
}
})
// ->where('status', $request->status)
->with(['member', 'files', 'service', 'member.currentPolicy'])
->paginate();
return Helper::paginateResources(RequestLogResource::collection($requestLog));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Create New Request Request
*
* Tb, BSD 28 November 2023
*/
public function createNew(Request $request)
{
$request->validate([
'member_id' => 'required',
'service_code' => 'required',
]);
if ($request->member_id){
$code = $this->getNextCode($request);
$member = Member::find($request->member_id);
$memberValid = false;
if ($member){
if (($member->members_effective_date <= date('Y-m-d')) &&
($member->members_expire_date >= date('Y-m-d')) &&
($member->active == 1) &&
($member->suspended == 'N')
){
DB::beginTransaction();
try {
$newRequestLog = AppRequestLogService::storeRequestLog(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
submissionDate: null,
// status: 'approved',
status: 'requested', // di nonaktifkan dulu auto approved
organization_id: $request->organization_id,
source: $request->source
);
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
} else {
DB::beginTransaction();
try {
$newRequestLog = AppRequestLogService::storeRequestLog(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
submissionDate: null,
status: 'requested',
organization_id: $request->organization_id,
source: $request->source
);
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
// return Helper::responseJson(status: 'failed', statusCode: 500, message: 'Member Not Valid');
}
}
}
return Helper::responseJson(status: 'success', statusCode: 200, message: 'Request LOG berhasil ajukan!', data: $request->toArray());
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
$claimRequest = RequestLog::findOrFail($id);
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
'member',
'member.currentPlan' => function($memberPlan) {
$memberPlan->join('request_logs', 'request_logs.service_code', '=', 'plans.service_code');
},
// 'member.current_policy',
'claim',
'organization',
]);
return Helper::responseJson(data: RequestLogShowResource::make($claimRequest));
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$requestLog = RequestLog::findOrFail($id);
$requestLog->keterangan = $request->keterangan;
$requestLog->hak_kamar_pasien = $request->hak_kamar_pasien;
$requestLog->penempatan_kamar = $request->penempatan_kamar;
$requestLog->catatan = $request->catatan;
$requestLog->status = $request->status;
$requestLog->approved_by = auth()->user()->id;
$requestLog->approved_at = Carbon::now();
$requestLog->save();
// update nirc member
$member = Member::findOrFail($requestLog->member_id);
$member->nric = $request->no_identitas;
$member->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLog],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
/**
* Generate Request LOG PDF
*/
public function generateRequestLog($id)
{
$requestLog = RequestLog::find($id);
$service_code = $requestLog->service_code;
if ($requestLog->status != 'approved') {
return response()->json([
'error' => true,
'message' => 'LOG Belum Terverifikasi',
'data' => $requestLog],
200);
}
$member = Member::findOrFail($requestLog->member_id)
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'currentPolicy',
'currentPlan.corporateBenefits',
'currentPlan.corporateBenefits.benefit'
]);
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'requestLog'));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
return $requestLog;
}
/**
* Generate Export Excel Request LOG
*/
public function generateDataRequestLogExcel(){
$file_name = 'Data Request LOG';
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/Data Request LOG.xlsx'));
// Sheet 1
$writer->getCurrentSheet()->setName('Data');
$headers_map_to_table_fields = RequestLog::$listing_data_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataRequestLog = RequestLog::query()
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// $corporatePlan->where('corporate_id', $corporate_id);
// })
->with('member')
->orderBy('id', 'desc')
->get()->toArray();
// dd($dataRequestLog);
foreach ($dataRequestLog as $index => $row){
$serviceType = $this->getServiceName($row['service_code']);
$rowData = [
$row['id'], // id
$row['code'], // code
$row['member']['name'], // name
$row['submission_date'], // submission date
$serviceType, // service type
$row['payment_type_name'], // service type
$row['status'], // service type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
$writer->close();
return Helper::responseJson([
'file_name' => "Data Request Log " . date('Y-m-d h:i:s'),
"file_url" => url('files/Data Request LOG.xlsx')
]);
}
/**
* Submit Request LOG to Final LOG
*/
public function updateFinalLog(Request $request)
{
$id = $request->id;
$requestLog = RequestLog::findOrFail($id);
$status = $request->status ?? 'requested';
// Update Request LOG untuk lanjut ke Final LOG
$requestLog->catatan = $request->catatan;
$requestLog->final_log = 1;
$requestLog->status_final_log = $status;
$requestLog->approved_final_log_by = auth()->user()->id;
$requestLog->approved_final_log_at = Carbon::now();
$requestLog->save();
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('final-log-result', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-result',
'name' => File::getFileName('final-log-result', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('final-log-diagnosis', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-diagnosis',
'name' => File::getFileName('final-log-diagnosis', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('final-log-kondisi', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-kondisi',
'name' => File::getFileName('final-log-kondisi', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLog],
200);
}
public function updateStatus($id)
{
$requestLog = RequestLog::findOrFail($id);
$member = $requestLog->member;
try {
// Update Request LOG Status & Link with Claim
$requestLog->status = 'approved';
$requestLog->save();
// Store Generated Documents LOG
$logContent = view('pdf.guaranted_leter', compact('member', 'requestLog'));
$requestLog->generatedDocuments()->create([
'type' => 'guarantee_letter',
'title' => 'Guarantee Letter for '. $member->full_name,
'document_type' => 'type',
'html_content' => $logContent,
'system_origin' => 'primecenter'
]);
} catch (\Exception $e) {
return $e->getMessage();
}
return $claimRequest;
}
public function filesMcu(Request $request)
{
$request->validate([
'id' => 'required',
'memberid' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('claim-result', $request->id, $request->result_files);
$data = [
'memberid' => $request->id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesMcu::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file MemberID '.$request->memberid.', silahkan lihat dilaporan');
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan');
}
}
public function importRequestLog(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$reader = ReaderEntityFactory::createXLSXReader(Storage::path('temp/' . $file_name));
$reader->open(Storage::path('temp/' . $file_name));
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile(Storage::disk('public')->path('temp/result-' . $file_name));
$headers_map_to_table_fields = $this->requestLogService->doc_headers_to_field_map;
// Write Header to File with certain Format from MemberEnrollmentService::$result_doc_headers
$result_headers = $this->requestLogService->listing_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRow($result_headers));
$writer->addRow($singleRow);
$imported_member_data = 0;
$failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
// Clear up the string and remove all spaces
$title = $cell->getValue();
$title = preg_replace("/\r|\n/", " ", $title);
$title = preg_replace('/\xc2\xa0/', " ", $title);
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
} else { // Next Row Should be Data
// Collecting Values from table rows and map it to correct fields
$requestLog = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]])) {
$requestLog[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
}
try {
$rowResponse = $this->requestLogService->handleImportRow($requestLog);
// Write Success Result to File
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
$imported_member_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
// try {
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($requestLog));
$writer->addRow($singleRow);
// } catch (\Exception $e) {
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $requestLog];
// }
} catch (\Exception $e) {
// Write Server Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($requestLog));
$writer->addRow($singleRow);
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage()];
}
}
}
break; //only read first sheet
}
$reader->close();
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
'failed_row' => $failed_member_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-' . $file_name),
'name' => 'result-' . $file_name,
]
];
}
public function claimRequestDetail($claimRequestId)
{
$status = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
'claim_requests.code',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
$documents = DB::table('files')
->where('fileable_type', 'App\Models\RequestLog')
->where('fileable_id', $claimRequestId)
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type')
->orderBy('id', 'desc')
->get();
$results['documents'] = $documents;
$dialog_submits = DB::table('claim_requests')
->leftJoin('members', 'claim_requests.member_id','=', 'members.id')
->where('claim_requests.id', $claimRequestId)
->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status')
->first();
$results['dialog_submits'] = $dialog_submits;
return Helper::responseJson($results);
}
public function invoiceFiles(Request $request, $claim_id)
{
if ($request->hasFile('invoice_files')) {
foreach ($request->invoice_files as $file) {
$pathFile = File::storeFile('claim-invoice', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-invoice',
'name' => File::getFileName('claim-invoice', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if($request->date)
{
DB::table('claim_requests')
->where('id', $claim_id)
->update(['invoice_date' => $request->date]);
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
/**
* Get Claim Member - Infinite Scroll
*
* Bagaskoro, BSD 31 Oktober 2023
*/
public function getClaimMemberInfiniteScroll(Request $request)
{
$offset = 0;
$limit = 10;
$page = $request->get('page');
$keyword = $request->get('keyword');
if ($page > 1) {
$offset = ($page*$limit)-$limit;
}
$memberList = DB::table('members')
->select('id','member_id','name')
->where("name", "like", "%$keyword%")
->orWhere("member_id", "like", "%$keyword%")
->orderBy('created_at', 'asc')
->offset($offset)
->limit($limit)
->get();
$data = [];
if(count($memberList)>0){
$temp = [];
foreach($memberList as $d){
$serviceType = $this->getServiceMember($d->id);
$temp['id'] = $d->id;
$temp['member_id'] = $d->member_id;
$temp['name'] = $d->name;
$temp['service_type'] = $serviceType;
array_push($data, $temp);
}
}
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $data,
]
],200);
}
public function getServiceMember($id){
$service = DB::table('member_plans')
->select('plans.service_code as code', 'services.name')
->join('plans', 'member_plans.plan_id', '=', 'plans.id')
->join('services', 'plans.service_code', '=', 'services.code')
->where('member_id', $id)
->get()
->toArray();
return $service;
}
public function getServiceName($code){
$service = DB::table('services')
->select('name')
->where('code', $code)
->get()
->first();
return $service->name;
}
public static function getNextCode(Request $request)
{
// $last_number = RequestLog::max('code');
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1);
// return self::makeCode($next_number);
$source = $request->source == 'client-portal' ? 'C' : 'H';
$organization = Organization::where(['id' => $request->organization_id, 'type' => 'hospital'])->first('code');
$provideCode = $organization ? $organization->code : '';
$member = Member::with('currentCorporate')->where(['id' => $request->member_id])->first();
$data = [
'source' => $source,
'provideCode' => $provideCode,
'date' => date('ymd'),
'policy' => $member->currentPolicy->code,
'member_code' => $member->member_id,
];
$last_numeric_code = RequestLog::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, $data);
}
public static function makeCode($next_number, $data)
{
$sparator = '.';
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
}

View File

@@ -0,0 +1,136 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLogMedicine;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class RequestLogMedicineController extends Controller
{
public function index(Request $request)
{
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$customMessages = [
'required' => 'Kolom :attribute wajib diisi.',
'numeric' => 'Kolom :attribute harus berupa angka.',
];
$validator = Validator::make($request->all(), [
'medicine' => 'required|array',
'medicine.*' => 'required',
], $customMessages);
if ($validator->fails()) {
return Helper::responseJson([],'error', 400, $validator->errors());
} else {
$medicine = $request->medicine;
if (count($medicine)>0){
// BeginTransaction
DB::beginTransaction();
foreach($medicine as $key => $value){
$data = [
'request_log_id' => $value['request_log_id'],
'medicine' => $value['medicine_name'],
'price' => $value['medicine_price'],
];
// Insert Data
try {
RequestLogMedicine::create($data);
} catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
DB::commit();
return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray());
};
}
$requestLogMedicine = RequestLogMedicine::insert($data);
return $requestLogMedicine;
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$requestLogBenefit = requestLogBenefit::findOrFail($id);
$requestLogBenefit->amount_approved = $request->amount_approved;
$requestLogBenefit->amount_incurred = $request->amount_incurred;
$requestLogBenefit->amount_not_approved = $request->amount_not_approved;
$requestLogBenefit->excess_paid = $request->excess_paid;
$requestLogBenefit->keterangan = $request->keterangan;
$requestLogBenefit->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLogBenefit],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
$RequestLogMedicine = RequestLogMedicine::findOrFail($id);
$RequestLogMedicine->delete();
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Service;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class ServiceController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$service = Service::orderBy('name', 'ASC')->get();
if (empty($service)) {
return response(['message' => 'Tidak ada data'], 404);
} else {
return response(['message' => 'Data ditemukan', "status" => 200, 'data' => $service]);
}
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::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('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::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)
{
//
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Models\User;
class UserManagemet extends Controller
{
public function index(Request $request){
$user = User::all();
return Helper::responseJson(data: $user);
}
}

View File

@@ -12,6 +12,7 @@ use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Modules\Internal\Transformers\EncounterResource;
class ClaimEncounterController extends Controller
{
/**
@@ -31,6 +32,13 @@ class ClaimEncounterController extends Controller
{
return view('internal::create');
}
public function getAllData()
{
$encounters = Encounter::with('claim.member')->get();
return Helper::responseJson(data: EncounterResource::collection($encounters), message: 'Data berhasil diambil');
}
/**
* Store a newly created resource in storage.
@@ -255,6 +263,22 @@ class ClaimEncounterController extends Controller
}
}
public function xcounters($claim_id)
{
$claim = Claim::findOrFail($claim_id);
$encounters = $claim->encounters()->get();
return response()->json($encounters);
}
public function getEncounterData($encounter_id)
{
$encounter = Encounter::with('claim.member')->findOrFail($encounter_id);
return Helper::responseJson(data: EncounterResource::make($encounter), message: 'Data berhasil diambil');
}
/**
* Remove the specified resource from storage.
* @param int $id

View File

@@ -8,6 +8,9 @@ use Modules\Internal\Http\Controllers\Api\BenefitController;
use Modules\Internal\Http\Controllers\Api\CityController;
use Modules\Internal\Http\Controllers\Api\ClaimController;
use Modules\Internal\Http\Controllers\Api\ClaimRequestController;
use Modules\Internal\Http\Controllers\Api\RequestLogController;
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
use Modules\Internal\Http\Controllers\Api\RequestLogMedicineController;
use Modules\Internal\Http\Controllers\Api\CorporateBenefitController;
use Modules\Internal\Http\Controllers\Api\CorporateController;
use Modules\Internal\Http\Controllers\Api\CorporateFormulariumController;
@@ -15,12 +18,16 @@ use Modules\Internal\Http\Controllers\Api\CorporateMemberController;
use Modules\Internal\Http\Controllers\Api\CorporatePlanController;
use Modules\Internal\Http\Controllers\Api\CorporateServiceController;
use Modules\Internal\Http\Controllers\Api\DiagnosisController;
use Modules\Internal\Http\Controllers\Api\DiagnosisTemplateController;
use Modules\Internal\Http\Controllers\Api\DiagnosisExclusionController;
use Modules\Internal\Http\Controllers\Api\DistrictController;
use Modules\Internal\Http\Controllers\Api\DivisionController;
use Modules\Internal\Http\Controllers\Api\HospitalController;
use Modules\Internal\Http\Controllers\Api\DoctorController;
use Modules\Internal\Http\Controllers\Api\DoctorRatingController;
use Modules\Internal\Http\Controllers\Api\DrugController;
use Modules\Internal\Http\Controllers\Api\FormulariumController;
use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController;
use Modules\Internal\Http\Controllers\Api\Linksehat\PaymentController;
use Modules\Internal\Http\Controllers\Api\LivechatController;
use Modules\Internal\Http\Controllers\Api\MemberController;
@@ -28,10 +35,17 @@ use Modules\Internal\Http\Controllers\Api\OptionController;
use Modules\Internal\Http\Controllers\Api\OrganizationController;
use Modules\Internal\Http\Controllers\Api\PlanController;
use Modules\Internal\Http\Controllers\Api\ProvinceController;
use Modules\Internal\Http\Controllers\Api\ServiceController;
use Modules\Internal\Http\Controllers\Api\PrescriptionController;
use Modules\Internal\Http\Controllers\Api\SpecialityController;
use Modules\Internal\Http\Controllers\Api\VillageController;
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
use Modules\Internal\Http\Controllers\Api\DailyMonitoringController;
use Modules\Internal\Http\Controllers\Api\LaboratoriumResultController;
use Modules\Internal\Http\Controllers\Api\CorporateManageController;
use Modules\Internal\Http\Controllers\ClaimEncounterController;
/*
|--------------------------------------------------------------------------
| API Routes
@@ -47,6 +61,7 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController;
Route::prefix('internal')->group(function () {
Route::post('login', [AuthController::class, 'login'])->name('login');
Route::post('register', [AuthController::class, 'register'])->name('register');
Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
@@ -66,11 +81,16 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
Route::put('corporates/{corporate_id}/activation', [CorporateController::class, 'activation']);
Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']);
Route::post('corporates/{corporate_id}/delete-import-plan-benefit', [CorporateController::class, 'deleteAllImportPlanBenefit']);
Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']);
Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']);
Route::get('corporates/{corporate_id}/payor_id', [CorporateController::class, 'corporatePayorId']);
Route::get('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'index']);
Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']);
Route::get('corporates/{corporate_id}/corporate-plans/{id}/edit', [CorporatePlanController::class, 'edit']);
Route::put('corporates/{corporate_id}/corporate-plans/{id}', [CorporatePlanController::class, 'update']);
Route::post('corporates/{corporate_id}/corporate-plans/filter', [CorporatePlanController::class, 'filter']);
Route::put('plans/{plan_id}/activation', [CorporatePlanController::class, 'activation']);
Route::get('corporates/{corporate_id}/plans', [PlanController::class, 'index']);
@@ -90,13 +110,27 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/{corporate_id}/divisions/{id}/edit', [DivisionController::class, 'edit']);
Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']);
Route::get('corporates/{corporate_id}/hospitals', [HospitalController::class, 'index']);
Route::put('hospitals/{hospital_id}/activation', [HospitalController::class, 'activation']);
Route::get('corporates/{corporate_id}/hospitals/data', [HospitalController::class, 'dataHospital']);
Route::post('corporates/{corporate_id}/hospitals/save', [HospitalController::class, 'store']);
Route::put('corporates/{corporate_id}/hospitals/{id}/edit', [HospitalController::class, 'update']);
Route::get('corporates/hospitals/download-template', [HospitalController::class, 'downloadTemplate']);
Route::post('corporates/{corporate_id}/hospitals/import', [HospitalController::class, 'import']);
Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']);
Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']);
Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']);
Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']);
Route::get('corporates/{corporate_id}/diagnosis', [DiagnosisExclusionController::class, 'listDiagnosis']);
Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
Route::get('corporates/{corporate_id}/diagnosis-exclusions/{id_exclusion}', [DiagnosisExclusionController::class, 'detilExclusion']); // By Bagaskoro, get detil exclusion
Route::post('corporates/{corporate_id}/diagnosis-exclusions/store', [DiagnosisExclusionController::class, 'storeExclusion']);
Route::put('corporates/diagnosis-exclusions/update_activation', [DiagnosisExclusionController::class, 'updateActivation']); // By Bagaskoro, edit status aktif
Route::delete('diagnosis-exclusions/{id}', [DiagnosisExclusionController::class, 'destroy']);
Route::post('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
@@ -105,20 +139,88 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceIndex']);
Route::put('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities', [CorporateServiceController::class, 'corporateServiceSpecialityUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities-all', [CorporateServiceController::class, 'corporateServiceSpecialityAllUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities/exclusion', [CorporateServiceController::class, 'storeExclusion']);
Route::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']);
Route::get('corporates/{corporate_id}/formulariums/{formularium_id}', [CorporateFormulariumController::class, 'show']);
Route::get('corporates/{corporate_id}/formulariums-create', [CorporateFormulariumController::class, 'create']);
Route::post('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'store']);
Route::get('corporates/{corporate_id}/formulariums/list', [CorporateFormulariumController::class, 'generateFormulariumList']);
Route::post('corporates/{corporate_id}/formulariums/import', [CorporateFormulariumController::class, 'import']);
Route::put('corporates/{corporate_id}/formulariums-update-status/{id}', [CorporateFormulariumController::class, 'active']);
Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']);
Route::controller(CorporateController::class)->group(function () {
Route::post('add-files-doc', 'addFilesDoc');
Route::post('get-files-doc', 'getFilesDoc');
Route::post('update-status-files-doc', 'updateStatusFilesDoc');
});
// Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
Route::get('master/diagnosis', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']);
// Audittrail
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
Route::prefix('case_management')->group(function () {
Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']);
Route::get('claimlist/{member_id}', [DailyMonitoringController::class, 'GetClaimList']);
// Daily Monitoring
Route::prefix('daily_monitoring')->group(function () {
Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']);
Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']);
Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']);
Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']);
});
// Laboratorium Result
Route::prefix('laboratorium_result')->group(function () {
Route::get('detail/{claim_code}/list', [LaboratoriumResultController::class, 'GetDetailLabResultList']);
Route::post('detail/{claim_code}/add', [LaboratoriumResultController::class, 'AddDetailLabResultList']);
});
});
Route::prefix('user_management')->group(function () {
Route::get('/', [CorporateManageController::class, 'index']);
Route::post('/', [CorporateManageController::class, 'store']);
Route::post('/{id}', [CorporateManageController::class, 'update']);
Route::post('/delete/{id}', [CorporateManageController::class, 'destroy']);
});
Route::get('master/diagnosis-template', [DiagnosisTemplateController::class, 'index']);
Route::get('master/diagnosis-template/search', [DiagnosisTemplateController::class, 'search']);
Route::post('master/diagnosis-template/store', [DiagnosisTemplateController::class, 'store']);
Route::put('master/diagnosis-template/{id}/activation', [DiagnosisTemplateController::class, 'activation']);
Route::get('master/diagnosis-template/{id}/edit', [DiagnosisTemplateController::class, 'edit']);
Route::put('master/diagnosis-template/{id}/update', [DiagnosisTemplateController::class, 'update']);
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('master/diagnosis/{diagnosis_template_id}', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/{diagnosis_template_id}/search', [DiagnosisController::class, 'search']);
Route::post('master/diagnosis/{diagnosis_template_id}/import', [DiagnosisController::class, 'import']);
Route::get('master/diagnosis/{diagnosis_template_id}/list', [DiagnosisController::class, 'generateIcdList']);
Route::put('master/diagnosis/{diagnosis_template_id}/activation', [DiagnosisController::class, 'activation']);
Route::get('master/drugs', [DrugController::class, 'index']);
Route::get('master/formulariums', [FormulariumController::class, 'index']);
Route::post('master/formulariums', [FormulariumController::class, 'store']);
Route::post('master/formulariums/import', [FormulariumController::class, 'import']);
Route::put('master/drugs/{drug_id}/activation', [DrugController::class, 'activation']);
Route::get('master/drugs/download-template', [DrugController::class, 'downloadTemplate']);
Route::post('master/drugs/import', [DrugController::class, 'import']);
Route::get('members', [MemberController::class, 'index']);
Route::get('members/{member_id}/benefits', [MemberController::class, 'benefits']);
@@ -133,26 +235,85 @@ Route::prefix('internal')->group(function () {
Route::post('claims/{id}/decline', [ClaimController::class, 'decline'])->name('claim.decline');
Route::post('claims/{id}/approve', [ClaimController::class, 'approve'])->name('claim.approve');
Route::post('claims/{id}/re-open', [ClaimController::class, 'reOpen'])->name('claim.re-open');
Route::post('claims/{id}/carehistory', [ClaimController::class, 'storeHistoryCare']);
Route::post('claims/carehistory/{id}/update', [ClaimController::class, 'updateHistoryCare']);
Route::get('claims/carehistory/{id}', [ClaimController::class, 'showHistoryCare']);
Route::post('claims/carehistory/approval', [ClaimController::class, 'approvalHistoryCare']);
Route::post('claims', [ClaimController::class, 'store']);
Route::get('claims/{id}', [ClaimController::class, 'show']);
Route::put('claims/{id}', [ClaimController::class, 'update']);
Route::get('claims/{id}/edit', [ClaimController::class, 'edit']);
Route::post('check-limit', [ClaimController::class, 'checkLimit']);
Route::get('claims/1/data-claim', [ClaimController::class, 'dataClaimReport']);
Route::get('claims/detail/{id}', [ClaimController::class, 'getDetailClaims']);
Route::post('claims/request-documents', [ClaimController::class, 'requestDocuments']);
Route::get('claims/get-services/{id}', [ClaimController::class, 'getServices']);
Route::post('claims/save-services', [ClaimController::class, 'saveServices']);
Route::get('claims/{id}/benefit-configuration', [ClaimController::class, 'getBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023
Route::put('claims/benefit-configuration/edit/{id}', [ClaimController::class, 'editBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023
Route::get('customer-service/request', [RequestLogController::class, 'index']);
Route::post('customer-service/request', [RequestLogController::class, 'createNew']);
Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']);
Route::get('customer-service/request/{id}', [RequestLogController::class, 'show']);
Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']);
Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']);
Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']);
Route::post('customer-service/request/final-log', [RequestLogController::class, 'updateFinalLog']);
// insert benefit
Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']);
Route::delete('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']);
Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']);
Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']);
Route::resource('organizations', OrganizationController::class);
Route::resource('appointments', AppointmentController::class);
Route::get('live-chat/export', [LivechatController::class, 'export']);
Route::resource('live-chat', LivechatController::class);
Route::get('prescription', [PrescriptionController::class, 'index']);
Route::get('prescription/{id}', [PrescriptionController::class, 'index']);
Route::get('doctorrating', [DoctorRatingController::class, 'index']);
Route::get('doctorrating/{id}', [PrescriptionController::class, 'index']);
Route::resource('doctors', DoctorController::class);
Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']);
Route::get('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']);
Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']);
Route::controller(ClaimRequestController::class)->group(function () {
Route::post('files-mcu', 'filesMcu');
});
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023
Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023
Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update');
Route::post('claim-requests/import', [ClaimRequestController::class, 'importClaim'])->name('claim-requests.importClaim');
Route::get('claim-requests/detail/{id}', [ClaimRequestController::class, 'claimRequestDetail']);
Route::post('claim-requests/{id}/invoice-files', [ClaimRequestController::class, 'invoiceFiles']);
Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']);
Route::get('claim-requests/service/{id}', [ClaimRequestController::class, 'getServiceMember']);
});
Route::get('province', [ProvinceController::class, 'index']);
Route::get('service', [ServiceController::class, 'index']);
Route::get('city', [CityController::class, 'index']);
Route::get('district', [DistrictController::class, 'index']);
Route::get('village', [VillageController::class, 'index']);

View File

@@ -6,27 +6,131 @@ use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\CorporateBenefit;
use App\Models\CorporatePolicy;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class CorporateService
{
protected function validatePlanRow($row)
/*
Refer to Coverage code :
MEDIVAC = Medical evacuation
MSO = Medical second opinion
PAC = Personal Assistant Concierge
OPDE = Outpatient Dental
IP=Inpatient
OP=Outpatient
MA=Maternity
ANC = Ante/Post Natal Care
DE=Dental
GL=Glasses
SP=Special Treatment
PF=Pooled Fund
MCU=Medical Check Up
KB-VACC = Family Planning/Vaccination
LAB = Test Diagnostic
PHAR = Pharmacy
**/
protected $service_code = ['MEDIVAC', 'MSO', 'PAC', 'OPDE', 'IP', 'OP', 'MA', 'ANC', 'DE', 'GL', 'SP', 'PF', 'MCU', 'KB-VACC', 'LAB', 'PHAR'];
protected function corporatePlansId($corporate_id){
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans_id = [];
if($plans){
foreach($plans as $plan){
array_push($current_corporate_plans_id,$plan['corporate_plan_id']);
}
}
return $current_corporate_plans_id;
}
protected function validatePlanRow($row, $corporate_id)
{
// $corporate_policy = CorporatePolicy::where('corporate_id', $corporateId)->get();
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans = $this->corporatePlansId($corporate_id);
$plan_code = [1, 2, 3, 4];
$prorate_type = [0, 1, 2];
$family_plan = ['F', 'S', 'N'];
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
] ), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'code' => $row['service_code']
]), 0, null, $row);
}
if (empty($row['corporate_plan_id'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Plan'
]), 0, null, $row);
} else if(!in_array($row['corporate_plan_id'], $current_corporate_plans)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plans',
// 'code' => $row['corporate_plan_id']
// ]), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('plan.CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Customer Plan'
]), 0, null, $row);
}
if (empty($row['type'])) {
throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
if (!in_array($row['type'], $plan_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Plan Type',
'code' => $row['type']
]), 0, null, $row);
} else if ($row['type'] == 2 && $row['limit_rules'] != 999999999){
throw new ImportRowException(__('plan.LIMIT_PLAN'), 0, null, $row);
}
// if (!empty($row['start'])) {
// throw new ImportRowException(__('plan.REQUIRED', [
// 'attribute' => 'Start Date of Plan'
// ]), 0, null, $row);
// }
// if (empty($row['type'])) {
// throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
// } else if (!in_array($row['type'],$plan_code)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan Type',
// 'code' => $row['code']
// ]), 0, null, $row);
// }
if (!empty($row['family_plan']) && !in_array($row['family_plan'],$family_plan)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Family Plan',
'code' => $row['family_plan']
]), 0, null, $row);
}
if (!empty($row['prorate_type']) && !in_array($row['prorate_type'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Prorate Type',
'code' => $row['prorate_type']
]), 0, null, $row);
}
if (!empty($row['prorate_lookup']) && !in_array($row['prorate_lookup'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Prorate Lookup',
'code' => $row['prorate_lookup']
]), 0, null, $row);
}
if (empty($row['limit_rules'])) {
throw new ImportRowException(__('plan.PLAN_LIMIT_REQUIRED'), 0, null, $row);
} else {
}
if (empty($row['msc'])) {
@@ -34,12 +138,13 @@ class CorporateService
}
}
public function handlePlanRow(Corporate $corporate, $row)
{
try {
$plan_data = $row;
$this->validatePlanRow($plan_data, $corporate->id);
$plan_data["corporate_id"] = $corporate->id;
$this->validatePlanRow($plan_data);
$plan = $corporate->plans()->updateOrCreate([
'corporate_plan_id' => $plan_data['corporate_plan_id'],
// 'active' => 0,
@@ -51,68 +156,111 @@ class CorporateService
}
}
protected function validateBenefitRow($row)
protected function validateBenefitRow($row, $corporate_id)
{
$max_frequence = 7;
$budget_aso = [1,2];
$current_corporate_plans = $this->corporatePlansId($corporate_id);
if (empty($row['service_code'])) {
throw new ImportRowException(__('benefit.SERVICE_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
]), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'code' => $row['service_code']
]), 0, null, $row);
}
if (empty($row['plan_code'])) {
throw new ImportRowException(__('benefit.PLAN_CODE_REQUIRED'), 0, null, $row);
} else if (!in_array($row['plan_code'], $current_corporate_plans)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan',
// 'code' => $row['plan_code']
// ]), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('benefit.BENEFIT_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Benefit Code'
]), 0, null, $row);
}
if (empty($row['corporate_benefit_code'])) {
throw new ImportRowException(__('benefit.CUSTOMER_BENEFIT_CODE_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('Customer Benefit Code Required', [
'attribute' => 'Customer Benefit Code'
]), 0, null, $row);
}
if (empty($row['description'])) {
throw new ImportRowException(__('benefit.DESCRIPTION_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Description'
]), 0, null, $row);
}
if (empty($row['limit_amount'])) {
throw new ImportRowException(__('benefit.LIMIT_AMOUNT_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Limit Amount'
]), 0, null, $row);
}
if (empty($row['msc'])) {
throw new ImportRowException(__('benefit.MSC_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'MSC'
]), 0, null, $row);
}
if (empty($row['genders'])) {
throw new ImportRowException(__('benefit.GENDER_REQUIRED'), 0, null, $row);
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Gender'
]), 0, null, $row);
}
if (!empty($row['max_frequency_period']) && $row['max_frequency_period'] >= $max_frequence){ // jenis frequence
throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
}
if (!empty($row['budget']) && !in_array($budget_aso)) {
throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
}
// if (empty($row['limit_free_tc'])){
// throw new ImportRowException(__('plan.REQUIRED', [
// 'attribute' => 'Limit Free TC'
// ]), 0, null, $row);
// }
}
public function handleBenefitRow(Corporate $corporate, $row)
{
try {
$row['limit_free_tc'] = 0;
$benefit_data = $row;
$this->validateBenefitRow($benefit_data, $corporate->id);
$benefit_data["corporate_id"] = $corporate->id;
$this->validateBenefitRow($benefit_data);
$plan = $corporate->plans()
->where('corporate_plan_id', $benefit_data['plan_code'])
->first();
// $corporate->plans->where('corporate_plan_id', $benefit_data['plan_code'])->first();
$benefit_data['plan_code'] = $plan->id;
$benefit = Benefit::updateOrCreate([
'code' => $benefit_data['code'],
'service_code' => $plan->service_code,
], [
'code' => $benefit_data['code'],
'service_code' => $plan->service_code,
'active' => 1,
'description' => $benefit_data['description'],
]);
$corporateBenefit = $corporate->corporateBenefits()->updateOrCreate([
'benefit_id' => $benefit->id,
'plan_id' => $plan->id
'plan_id' => $plan->id,
'corporate_id' => $corporate->id,
], $benefit_data);
return $corporateBenefit;
} catch (\Exception $e) {
// dd($e->getMessage());
throw $e;
}
}

View File

@@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Icd;
use App\Models\Exclusion;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
@@ -13,23 +14,21 @@ class ExclusionService
{
protected function validateDiagnosisExclusionRow($row)
{
// if (empty($row['service_code'])) {
// throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
// }
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.REQUIRED'), 0, null, $row);
}
}
public function handleDiagnosisExclusionRow(Corporate $corporate, $row)
{
try {
$this->validateDiagnosisExclusionRow($row);
if (!empty($row['ip_exclusion'])) {
$excl_array = explode('|', $row['ip_exclusion']);
if ($excl_array[0] == '3') {
$icd = Icd::where('code', $row['code'])->first();
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'service_code' => 'IP',
'type' => 'diagnosis'
]);
@@ -89,7 +88,8 @@ class ExclusionService
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'type' => 'diagnosis'
'type' => 'diagnosis',
'active' => 1
]);
if (!empty($excl_array[1])) { //msc
@@ -130,11 +130,35 @@ class ExclusionService
]);
}
if (!empty($excl_array[5])) { //plans
$exclusion->rules()->create([
'name' => 'plan',
'values' => $excl_array[5]
]);
$codePlan = explode(',', $excl_array[5]);
collect($codePlan)->each(function ($codePlan) use ($corporate, $exclusion) {
$isCodeplan = Plan::where(['code' => $codePlan, 'corporate_id' => $corporate->id])->first();
if (!$isCodeplan) {
throw new ImportRowException(__('codePlan.NOT_FOUND'), 0, NULL, $codePlan);
}
$exclusion->rules()->create([
'name' => 'plan',
'values' => $codePlan
]);
});
}
} else if (!$excl_array[0]){
$icd = Icd::where(['code' => $row['code']])->first();
if (!$icd) {
throw new ImportRowException(__('icd.NOT_FOUND'), 0, NULL, $row);
}
// Cari entitas Exclusion yang sesuai dengan kriteria tertentu
$exclusion = Exclusion::where([
'corporate_id' => $corporate->id,
'exclusionable_id' => $icd->id,
])->first();
// Jika entitas ditemukan, perbarui nilai 'active' menjadi 0
if ($exclusion) {
$exclusion->update(['active' => 0]);
}
}
}
@@ -144,7 +168,7 @@ class ExclusionService
$icd = Icd::where('code', $row['code'])->first();
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'service_code' => 'DE',
'type' => 'diagnosis'
]);
@@ -196,7 +220,6 @@ class ExclusionService
if (!empty($row['ma_exclusion'])) {
$excl_array = explode('|', $row['ma_exclusion']);
dd($excl_array);
if ($excl_array[0]) {
}
}

View File

@@ -7,10 +7,11 @@ use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Drug;
use App\Models\Formularium;
use App\Models\CorporateFormularium;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class CorporateService
class FormulariumService
{
protected function validateFormulariumRow($row)
{
@@ -45,4 +46,75 @@ class CorporateService
throw $e;
}
}
public function handleFormuariumTemplateRow($row, $id)
{
try {
$formularium = Formularium::updateOrCreate(
[
'code' => $row['code'],
'formularium_template_id' => $id
],
[
'code' => $row['code'],
'name' => $row['name'],
'description' => $row['description'],
'manufacturer' => $row['manufacturer'],
'category_name' => $row['category_name'],
'kategori_obat' => $row['kategori_obat'],
'uom' => $row['uom'],
'composition' => $row['composition'],
'general_indication' => $row['general_indication'],
'atc_code' => $row['atc_code'],
'class' => $row['class'],
'bpom_registration' => $row['bpom_registration'],
'classifications' => $row['classifications'],
'cat_for' => $row['cat_for'],
'formularium_template_id' => $id,
]);
return $formularium;
} catch (\Exception $e) {
throw $e;
}
}
public function handleFormuariumCorporateRow($row, $id)
{
try {
$formularium = CorporateFormularium::updateOrCreate(
[
'formularium_id' => $row['formularium_id'],
'corporate_id' => $id
],
[
'formularium_id' => $row['formularium_id'],
'corporate_id' => $id,
'active' => $row['active']
]);
return $formularium;
} catch (\Exception $e) {
throw $e;
}
}
public $listing_doc_headers = [
"Internal Code",
"Name",
"Description",
"Manufacturer",
"Category Name",
"Kategori Obat",
"UOM",
"Composition",
"General Indication",
"ATC Code",
"Class",
"BPOM Registration",
"Classifications",
"Cat For (O = obat, VS = Vitamin Suplemen, H=herbal, M=makanan, etc) ",
];
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Modules\Internal\Services;
use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Icd;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class IcdService
{
protected function validateDiagnosisExclusionRow($row)
{
if (empty($row['ICD_Code'])) {
throw new ImportRowException(__('ICD_Code is REQUIRED'), 0, null, $row);
}
}
public function handleIcdRow($row, $id)
{
try {
$this->validateDiagnosisExclusionRow($row);
$icd = Icd::updateOrCreate([
'code' => $row['ICD_Code']
], [
"code" => $row['ICD_Code'],
"parent_code" => null,
"rev" => '',
"name" => $row['Description'] ?? null,
"version" => null,
"active" => 1,
"icd_template_id" => $id,
]);
return true;
} catch (\Exception $e) {
throw $e;
}
}
public $listing_doc_headers = [
// "Rev",
// "Version",
"Code",
// "Parent Code",
// "Name",
"Description",
// "Status",
// "Type"
];
}

View File

@@ -7,11 +7,17 @@ use App\Helpers\Helper;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\CorporateDivision;
use App\Models\CorporatePolicy;
use App\Models\CorporatePlan;
use App\Models\Member;
use App\Models\MemberPolicy;
use App\Models\MemberPlan;
use App\Models\Person;
use App\Models\Plan;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use App\Models\OLDLMS\UserInsuranceDetail;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Carbon\Carbon;
@@ -26,7 +32,7 @@ class MemberEnrollmentService
"Payor ID" => "payor_id",
"Member ID" => "member_id",
"Mapping ID" => "principal_id",
"Halodoc Member ID" => "halodoc_member_id",
"LinkSehat Member ID" => "halodoc_member_id",
"Corporate ID" => "corporate_id",
"NIK" => "nik",
"Division" => "division_name",
@@ -50,7 +56,7 @@ class MemberEnrollmentService
"Agent Code / intermediary code" => "agent_code",
"Member Name" => "name",
"Address1" => "address1",
"Address 1" => "address1",
// "Address 1" => "address1",
"Address2" => "address2",
"Address3" => "address3",
"Address4" => "address4",
@@ -90,12 +96,13 @@ class MemberEnrollmentService
"Member Suspended" => "member_suspended",
"Activation Date" => "activation_date",
"Internal Use" => "internal_use_6",
"Date Terminated" => "date_terminated",
"StartNoClaim" => "start_no_claim",
"EndNoClaim" => "end_no_claim",
"Option Mode" => "option_mode",
"Policy Inforce" => "policy_in_force",
"Renewal activation date" => "renewal_activation_date",
"Renewal Activation Date" => "renewal_activation_date",
// "Renewal Activation Date" => "renewal_activation_date",
"Ingestion Code" => "ingestion_code", // TODO I think this should not be here because if user uploading result then ingestion code and status will be filled
"Ingestion Status" => "ingestion_status",
];
@@ -106,7 +113,7 @@ class MemberEnrollmentService
"payor_id" => "Payor ID",
"member_id" => "Member ID",
"principal_id" => "Mapping ID",
"halodoc_member_id" => "Halodoc Member ID",
"halodoc_member_id" => "LinkSehat Member ID",
"corporate_id" => "Corporate ID",
"nik" => "NIK",
"division_name" => "Division",
@@ -129,7 +136,7 @@ class MemberEnrollmentService
"agent_code" => "Agent Code / intermediary code",
"name" => "Member Name",
"address1" => "Address1",
"address1" => "Address 1",
// "address1" => "Address 1",
"address2" => "Address2",
"address3" => "Address3",
"address4" => "Address4",
@@ -168,17 +175,18 @@ class MemberEnrollmentService
"start_no_claim" => "StartNoClaim",
"end_no_claim" => "EndNoClaim",
"option_mode" => "Option Mode",
"renewal_activation_date" => "Renewal Activation Date",
// "renewal_activation_date" => "Renewal Activation Date",
"ingestion_code" => "Ingestion Code",
"ingestion_status" => "Ingestion Status",
];
public $result_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"Halodoc Member ID",
"LinkSehat Member ID",
"Corporate ID",
"NIK",
"Division",
@@ -201,7 +209,7 @@ class MemberEnrollmentService
"Internal Use",
"Member Name",
"Address1",
"Address 1",
// "Address 1",
"Address2",
"Address3",
"Address4",
@@ -239,22 +247,127 @@ class MemberEnrollmentService
"StartNoClaim",
"EndNoClaim",
"Option Mode",
"Renewal Activation Date",
// "Renewal Activation Date",
"Ingestion Code",
"Ingestion Status",
];
public $listing_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"LinkSehat Member ID",
"Corporate ID",
"NIK",
"Division",
"Branch Code",
"Bank Info",
"Language",
"Type of work",
"Race",
"Policy Number",
// "Policy No.",
"Marital Status",
"Relationship",
"Member's Effective Date",
"Member's Expiry Date",
"Faskes FKTP (First Level Provider) or Individual preferred provider",
"Faskes FKRTL (Next Level Provider) or Individual group preferred provider",
"The Right Classes Room of BPJS Participants",
"Name of Faskes",
"Rule BPJSK",
"Internal Use",
"Member Name",
"Address1",
// "Address 1",
"Address2",
"Address3",
"Address4",
"City",
"State",
"Post Code",
"Telephone - Mobile",
"Telephone - Res",
"Telephone - Office",
"NRIC",
"Passport No",
"Passport Country",
"Email",
"Identification Code",
"Date of Birth",
"Sex",
"Internal Use",
"Plan-ID",
"Employment-Status",
"Internal Use",
"Internal Use",
"Internal Use",
"Date Terminated",
"Pre Existing",
"BPJS ID",
"Endorsement Date",
"Remarks",
"Internal Use",
"Member Since",
"Internal Use",
"Policy Inforce",
"Member Suspended",
"Activation Date",
"Internal Use",
"StartNoClaim",
"EndNoClaim",
"Option Mode",
// "Renewal Activation Date",
// "Ingestion Code",
// "Ingestion Status",
];
public $doc_headers_send_email = [
"Name",
"Email",
"Message"
];
public function __construct(Member $member)
{
app()->setLocale('en');
$this->member = $member;
}
public function dateParser($date_from_row) {
return is_string($date_from_row) ? Carbon::parse(strtotime($date_from_row)) : Carbon::parse($date_from_row);
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('Y-m-d');
} else if ($date_from_row != null) {
return date('Y-m-d', strtotime($date_from_row));
} else {
return null;
}
}
public function validateDate($dateString, $dateFormat = 'Ymd'){
$date = DateTime::createFromFormat($dateFormat, $dateString);
if ($date && ($date->format($dateFormat) == $dateString)) {
return true;
} else {
return false;
}
}
protected function validateRow($row)
{
$title =[
'member_effective_date' => 'Member Effective Date',
'member_expiry_date' => 'Member Expired Date',
'activation_date' => 'Activation Date',
'date_of_birth' => 'Date of Birth',
'date_terminated' => 'Date Terminated',
];
if (empty($row['record_type'])) {
throw new ImportRowException(__('enrollment.RECORD_TYPE_REQUIRED'), 0, null, $row);
}
@@ -267,6 +380,10 @@ class MemberEnrollmentService
throw new ImportRowException(__('enrollment.MEMBER_ID_REQUIRED'), 0, null, $row);
}
if (empty($row['plan_id'])) {
throw new ImportRowException(__('Plan ID Required'), 0, null, $row);
}
if ($row['record_type'] == 'P') {
if (!empty($row['principal_id'])) {
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_NOT_REQUIRED'), 0, null, $row);
@@ -278,9 +395,31 @@ class MemberEnrollmentService
}
if ($row['record_type'] == 'D') {
$member = Member::query()
->where('member_id', $row['principal_id'])
// ->whereHas('employeds', function ($query) use ($corporate) {
// $query->where('corporate_id', $corporate->id);
// })
->first();
if(empty($member)){
// throw new ImportRowException(__('enrollment.PRINCIPAL_NOT_IN_MEMBER_ID'), 0, null, $row);
} else {
// if ($member['record_type'] != 'P'){
// throw new ImportRowException(__('enrollment.PRINCIPAL_ID_NOT_SAME_MEMBER_ID'), 0, null, $row);
// }
}
if (empty($row['principal_id'])) {
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_REQUIRED'), 0, null, $row);
}
// if (empty($row['relationship_with_principal'])){
// throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_REQUIRED'), 0, null, $row);
// }
// if (!empty($row['relationship_with_principal']) && !in_array($row['relationship_with_principal'], ['H', 'W', 'D', 'S'])){
// throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_NOT_VALID'), 0, null, $row);
// }
}
// TODO RECORD BCA ONLY
@@ -293,85 +432,141 @@ class MemberEnrollmentService
// throw new ImportRowException(__('enrollment.BRANCH_CODE_NOT_REQUIRED'), 0, null, $row);
// }
if (!empty($row['language']) && !in_array($row['language'], ['M', 'E', 'C', 'I', 'O'])) {
throw new ImportRowException(__('enrollment.INVALID_LANGUAGE'), 0, null, $row);
}
// if (!empty($row['language']) && !in_array($row['language'], ['M', 'E', 'C', 'I', 'O'])) {
// throw new ImportRowException(__('enrollment.INVALID_LANGUAGE'), 0, null, $row);
// }
if (!empty($row['type_of_work']) && !in_array($row['type_of_work'], ['0', '1', '2', '3'])) {
throw new ImportRowException(__('enrollment.INVALID_TYPE_OF_WORK'), 0, null, $row);
}
// if (!empty($row['type_of_work']) && !in_array($row['type_of_work'], ['0', '1', '2', '3'])) {
// throw new ImportRowException(__('enrollment.INVALID_TYPE_OF_WORK'), 0, null, $row);
// }
if (!empty($row['race']) && !in_array($row['race'], ['M', 'C', 'I', 'O'])) {
throw new ImportRowException(__('enrollment.INVALID_RACE'), 0, null, $row);
}
// if (!empty($row['race']) && !in_array($row['race'], ['M', 'C', 'I', 'O'])) {
// throw new ImportRowException(__('enrollment.INVALID_RACE'), 0, null, $row);
// }
if (empty($row['policy_number'])) {
throw new ImportRowException(__('enrollment.POLICY_NUMBER_REQUIRED'), 0, null, $row);
}
if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
}
// if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
// throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
// }
// TODO EFFECTIVE DATE VALIDATION
if (empty($row['member_effective_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EFFECTIVE_REQUIRED'), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
// if(!$this->validateDate($row['member_effective_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['member_effective_date']
// ]), 0, null, $row);
// }
if (empty($row['member_expiry_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EXPIRY_REQUIRED'), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
// if(!$this->validateDate($row['member_expiry_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['member_expiry_date']
// ]), 0, null, $row);
// }
// TODO EFFECTIVE DATE VALIDATION
// if (empty($row['activation_date'])) {
// throw new ImportRowException(__('enrollment.ACTIVATION_DATE_REQUIRED'), 0, null, $row);
// }
// if(!empty($row['activation_date'])){
// if(!$this->validateDate($row['activation_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['activation_date']
// ]), 0, null, $row);
// }
// }
// TODO FKTP VALIDATION
// TODO FKRTL VALIDATION
if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
}
// if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
// throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
// }
if (empty($row['name'])) {
throw new ImportRowException(__('enrollment.NAME_REQUIRED'), 0, null, $row);
}
if (
!empty($row['telephone_mobile'])
&& !(substr($row['telephone_mobile'], 0, 4) == '+628' || substr($row['telephone_mobile'], 0, 3) == '628')
) {
throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
}
// if (!Helper::validatePhoneNumber($row['telephone_mobile'])){
// throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
// }
if (
!empty($row['email'])
&& !filter_var($row['email'], FILTER_VALIDATE_EMAIL)
) {
throw new ImportRowException(__('enrollment.EMAIL_INVALID'), 0, null, $row);
}
// if (
// !empty($row['telephone_mobile'])
// && !(substr($row['telephone_mobile'], 0, 4) == '+628' || substr($row['telephone_mobile'], 0, 3) == '628')
// ) {
// throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
// }
if (empty($row['date_of_birth'])) {
throw new ImportRowException(__('enrollment.DATE_OF_BIRTH_REQUIRED'), 0, null, $row);
}
// if (
// !empty($row['email'])
// && !filter_var($row['email'], FILTER_VALIDATE_EMAIL)
// ) {
// throw new ImportRowException(__('enrollment.EMAIL_INVALID'), 0, null, $row);
// }
// if (empty($row['date_of_birth'])) {
// throw new ImportRowException(__('enrollment.DATE_OF_BIRTH_REQUIRED'), 0, null, $row);
// }
// if(!$this->validateDate($row['date_of_birth'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['date_of_birth']
// ]), 0, null, $row);
// }
// if (empty($row['date_terminated'])) {
// throw new ImportRowException(__('enrollment.DATE_OF_TERMINATED'), 0, null, $row);
// }
// if (!empty($row['date_terminated'])) {
// if(!$this->validateDate($row['date_terminated'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['date_terminated']
// ]), 0, null, $row);
// }
// }
// TODO DOB FORMAT VALIDATION
if (empty($row['sex'])) {
throw new ImportRowException(__('enrollment.SEX_REQUIRED'), 0, null, $row);
}
// if (empty($row['sex'])) {
// throw new ImportRowException(__('enrollment.SEX_REQUIRED'), 0, null, $row);
// }
// if (!in_array($row['sex'], ['F', 'M'])){
// throw new ImportRowException(__('enrollment.SEX_CODE_NOT_VALID'), 0, null, $row);
// }
}
public function handleImportRow(Corporate $corporate, $row)
{
try {
$activation_date = NULL;
if (!empty($row['activation_date'])){
$activation_date = $row['activation_date'];
}
$date_terminated = NULL;
if(!empty($row['date_terminated'])){
$date_terminated = $row['date_terminated'];
}
$member_data = [
"name" => $row['name'] ?? null,
"member_id" => $row['member_id'] ?? null,
"payor_id" => $row['payor_id'] ?? null,
"nik" => $row['nik'] ?? null,
// "birth_date" => $row['date_of_birth'] ? date("Y-m-d",$row['date_of_birth']) : null,
"birth_date" => $this->dateParser($row['date_of_birth']),
"gender" => Helper::genderNormalization($row['sex']),
// "language" => $row['language'] ?? null,
// "race" => $row['race'] ?? null,
"language" => $row['language'] ?? null,
"race" => $row['race'] ?? null,
"marital_status" => $row['marital_status'] ?? null,
"record_type" => $row['record_type'] ?? null,
"record_mode" => $row['record_mode'] ?? null,
"principal_id" => $row['principal_id'] ?? null,
"relation_with_principal" => $row['relationship_with_principal'] ?? null,
"bpjs_class" => $row['bpjs_class'] ?? null,
@@ -396,23 +591,137 @@ class MemberEnrollmentService
"policy_in_force" => $row['policy_in_force'] ?? null,
"start_no_claim" => $row['start_no_claim'] ?? null,
"end_no_claim" => $row['end_no_claim'] ?? null,
];
"plan_id" => $row['plan_id'] ?? null,
"members_effective_date" => $row['member_effective_date'] ?? null,
"members_expire_date" => $row['member_expiry_date'] ?? null,
"activation_date" => $activation_date,
"terminated_date" => $date_terminated,
"telephone_mobile" => $row['telephone_mobile'] ?? null,
"telephone_res" => $row['telephone_res'] ?? null,
"telephone_office" => $row['telephone_office'] ?? null,
"suspended" => $row['member_suspended'] ?? null,
"active" => $row['employment_status'] == 'INACTIVE' ? 0 : 1,
"employee_status" => $row['employment_status']
];
// $this->validateRow($row);
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) {
throw new ImportRowException(__('enrollment.POLICY_NUMBER_NOT_MATCH', [
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
// validasi member efektif date range date in periode date coroporate
// $member_effective_date = date("Y-m-d", strtotime($row['member_effective_date']));
// $date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
$member_effective_date = $this->dateParser($row['member_effective_date']);
$date_terminated = $this->dateParser($row['date_terminated']);
if(!empty($row['activation_date'])){
// $activation_date = date("Y-m-d", strtotime($row['activation_date']));
// if (($activation_date == $date_terminated) && ($activation_date == $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Activation Date',
// 'date' => $activation_date,
// 'date_param2' => 'Member Effective Date',
// 'start' => $activation_date
// ]), 0, null, $row);
// }
}
if (!empty($row['date_terminated'])){
// $date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
// if($date_terminated){
// if ($date_terminated <= $member_effective_date && ($date_terminated != $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Date Terminated Date',
// 'date' => $date_terminated,
// 'date_param2' => 'Member Effective Date',
// 'start' => $member_effective_date
// ]), 0, null, $row);
// }
// }
}
// validasi member expried date range date in periode date coroporate
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// validasi member expried date must less date member effective
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// if ($member_effective_date <= $corporate->currentPolicy->start && ($member_effective_date != $corporate->currentPolicy->start)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'Start Period Date',
// 'start' => $corporate->currentPolicy->start
// ]), 0, null, $row);
// }
// if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'End Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'End Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($members_expire_date <= $corporate->currentPolicy->start && ($members_expire_date != $corporate->currentPolicy->start) ) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'Start Period Date',
// 'start' => $corporate->currentPolicy->start
// ]), 0, null, $row);
// }
// if ($members_expire_date >= $corporate->currentPolicy->end && ($members_expire_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'END Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($members_expire_date <= $member_effective_date && ($members_expire_date != $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'Member Effective Date',
// 'start' => $member_effective_date
// ]), 0, null, $row);
// }
if($corporate->code != $row['corporate_id']){
throw new ImportRowException(__('enrollment.CORPORATE_CODE_NOT_MATCH', [
'corporate_id' => $row['corporate_id']
]), 0, null, $row);
}
switch ($row['record_mode']) {
case "1": // New Member
$this->validateRow($row);
$member = Member::query()
->where('member_id', $row['member_id'])
// ->whereHas('employeds', function ($query) use ($corporate) {
// $query->where('corporate_id', $corporate->id);
// })
->first();
// Validate If Exist Member
if ($member) {
$person = Person::updateOrCreate(
@@ -421,10 +730,11 @@ class MemberEnrollmentService
],
[
'name' => $row['name'] ?? null,
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'birth_date' => $this->dateParser($row['date_of_birth']) ?? null,
'gender' => Helper::genderNormalization($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile'] ?? null
]
);
$member->person_id = $person->id;
@@ -450,29 +760,40 @@ class MemberEnrollmentService
// Validate If Plan Exist
// TODO validate corporate plan
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
$plans = explode(",",$row['plan_id']);
if (count($plans) > 0) {
foreach($plans as $d){
$plan = Plan::query()
->where('code', $d)
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
}
} else {
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
}
$this->validateRow($row);
try {
DB::beginTransaction();
$member->fill($member_data);
if ($member->save()) {
$person = Person::create([
'name' => $row['name'],
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'birth_date' => $this->dateParser($row['date_of_birth']) ?? null,
'gender' => Helper::genderNormalization($row['sex']) ?? '-',
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile'],
]);
$member->person_id = $person->id;
$member->save();
@@ -484,6 +805,7 @@ class MemberEnrollmentService
'end' => $this->dateParser($row['member_expiry_date']),
'status' => 'active'
]);
$memberPolicy->save();
if (!empty($row['division_name'])) {
@@ -499,7 +821,7 @@ class MemberEnrollmentService
$division_id = $division->id;
}
}
// Bisa disini penyebab data dobel
$member->employeds()->create([
'corporate_id' => $corporate->id,
'branch_code' => $row['branch_code'],
@@ -507,13 +829,41 @@ class MemberEnrollmentService
'nik' => $row['nik'],
'status' => $row['employment_status']
]);
// Bisa disini penyebab data dobel
$plans = explode(",",$row['plan_id']);
if (count($plans) > 0) {
foreach($plans as $d){
$plan = Plan::query()
->where('code', $d)
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
} else {
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
DB::commit();
} catch (\Exception $e) {
@@ -522,11 +872,13 @@ class MemberEnrollmentService
}
break;
case "2": // Member Information Update (Without Replacement Card)
$this->validateRow($row);
$member = Member::query()
->where('member_id', $row['member_id'])
->first();
// Validate If Exist Member
// // Validate If Exist Member
if (!$member) {
throw new ImportRowException(__('enrollment.MEMBER_NOT_FOUND', [
'member_id' => $row['member_id'],
@@ -534,13 +886,195 @@ class MemberEnrollmentService
]), 0, null, $row);
}
$person = Person::updateOrCreate(
[
'id' => $member->person_id
],
[
'name' => $row['name'] ?? null,
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile']
]
);
$member->person_id = $person->id;
$member->name = $row['name'];
$member->employee_status = $row['employment_status'];
$member->gender = Helper::genderPerson($row['sex']);
$member->relation_with_principal = $row['relationship_with_principal'];
$member->marital_status = $row['marital_status'];
$member->birth_date = $this->dateParser($row['date_of_birth']);
$member->save();
try {
DB::beginTransaction();
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
->where('member_id', $row['member_id'])
->with('member')
->first();
// Pengecekan jika ada perubahan di plan
// $plan = Plan::query()
// ->where('code', $row['plan_id'])
// ->first();
// if ($plan){
// $memberPlan = MemberPlan::query()
// ->where('member_id', $member->id)
// ->first();
// $memberPlan->plan_id = $plan->id;
// $memberPlan->save();
// }
// // Pengecekan jika ada perubahan di plan
// $plan = Plan::query()
// ->where('code', $row['plan_id'])
// ->first();
// if ($plan){
// $memberPlan = MemberPlan::query()
// ->where('member_id', $member->id)
// ->first();
// $memberPlan->plan_id = $plan->id;
// $memberPlan->save();
// }
// Hapus Member plan terkait
$delete = MemberPlan::where('member_id', $member->id)->delete();
//Update plan
$plans = explode(",",$row['plan_id']);
if (count($plans) > 0) {
foreach($plans as $d){
$plan = Plan::query()
->where('code', $d)
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->updateOrCreate([
'member_id' => $member->id,
'plan_id' => $plan->id,
],
[
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
} else {
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->updateOrCreate([
'member_id' => $member->id,
'plan_id' => $plan->id,
],
[
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
// end update plan
// Update jika ada perubahaan di ASO maka akan teriflek ke LMS juga
$userInsuranceLms = UserInsurance::query()
->where('sNoPolis', $row['member_id'])
->first();
if ($userInsuranceLms){
$userInsuranceLms->sNamaPeserta = $row['name'];
$userInsuranceLms->dStartDate = $row['member_effective_date'];
$userInsuranceLms->dExpireDate = $row['member_expiry_date'];
$nIDUser = $userInsuranceLms->nIDUser;
UserInsurance::updateOrCreate(
['nIDUser' => $nIDUser],
[
'sNamaPeserta' => $row['name'],
'dStartDate' => $row['member_effective_date'],
'dExpireDate' => $row['member_expiry_date'],
'dTanggalLahir' => $row['date_of_birth'] ? $this->dateParser($row['date_of_birth']) : null,
// 'nNoKTP' => $row['nric'] ?? ,
]
);
/* Lihat ID Marital status di table tm_status_pernikahan Linksehat */
if ($row['relationship_with_principal'] == 'H'){
$sMartialStatus= 6;
$nIDHubunganKeluarga = 3;
} else if ($row['relationship_with_principal'] == 'W'){
$sMartialStatus = 7;
$nIDHubunganKeluarga = 4;
} else if ($row['relationship_with_principal'] == 'S'){
$sMartialStatus = 4;
$nIDHubunganKeluarga = 5;
} else if ($row['relationship_with_principal'] == 'D'){
$sMartialStatus = 5;
$nIDHubunganKeluarga = 5;
} else {
$sMartialStatus = 0;
$nIDHubunganKeluarga = 0;
}
if($row['sex'] == 'M'){
$nIDJenisKelamin = 1;
} else {
$nIDJenisKelamin = 2;
};
// $ip_address = $CI->_prepare_ip($CI->input->ip_address());
$name = explode(" ", $row['name']);
// First name
$first_name = isset($name[0]) ? $name[0] : '';
// Middle name
$middle_name = isset($name[1]) ? $name[1] : '';
// Last name
$last_name = '';
if (count($name) > 2) {
$last_name = implode(" ", array_slice($name, 2));
}
$userLms = User::updateOrCreate(
[
'nID' => $nIDUser // Kondisi untuk mencari data dengan 'nID' yang sesuai dengan $nIDUser
],
[
'sFirstName' => $first_name,
'sLastName' => $middle_name . ' ' .$last_name, // Ubah ini dengan variabel yang sesuai dengan nama belakang (last name)
'sPhone' => $row['telephone_mobile'],
'sEmail' => str_replace(' ', '', $row['email']),
'nIDHubunganKeluarga' => $nIDHubunganKeluarga !== 0 ? $nIDHubunganKeluarga : null,
'dUpdateOn' => date('Y-m-d H:i:s'),
]
);
$userLmsDetail = UserDetail::updateOrCreate(
[
'nIDUser' => $nIDUser
],
[
'nIDUser' => $nIDUser,
// 'dTanggalLahir' => $row['date_of_birth'],
'dTanggalLahir' => $this->dateParser($row['date_of_birth']),
'dCreateOn' => date('Y-m-d H:i:s'),
'sMartialStatus' => $sMartialStatus != 0 ? $sMartialStatus : null,
'nIDJenisKelamin' => $nIDJenisKelamin,
'sCreateBy' => $nIDUser,
'sKTP' => $row['nric'] ?? null,
]
);
}
if (!$memberPolicy) {
throw new ImportRowException(__('enrollment.MEMBER_NOT_EXISTS', [
'member_id' => $row['member_id'],
@@ -561,6 +1095,14 @@ class MemberEnrollmentService
}
$memberPolicy->member->save();
$member->save();
// update informasi person
$person = Person::query()
->where('id', $member->person_id)
->first();
$person->fill($member_data);
$person->save();
DB::commit();
} catch (\Exception $e) {
DB::rollback();
@@ -580,6 +1122,7 @@ class MemberEnrollmentService
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
$this->validateRow($row);
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
@@ -696,7 +1239,7 @@ class MemberEnrollmentService
// if (empty($row["option_mode"])) {
// throw new ImportRowException(__('enrollment.OPTION_MODE_INVALID_FORMAT', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -709,7 +1252,7 @@ class MemberEnrollmentService
// // Validate
// if ( !in_array($option_mode[0], ['P', 'D']) || empty($corp_code) || empty($policy_number) || empty($member_id) ) {
// throw new ImportRowException(__('enrollment.OPTION_MODE_INVALID_FORMAT', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -771,7 +1314,7 @@ class MemberEnrollmentService
// $memberPolicy->member->record_type == $row['record_type']
// ) {
// throw new ImportRowException(__('enrollment.UNIQUE_CHANGE_PRINCIPAL_INVALID', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -784,7 +1327,7 @@ class MemberEnrollmentService
// $memberPolicy->member->payor_id == $row['payor_id']
// ) {
// throw new ImportRowException(__('enrollment.UNIQUE_CHANGE_DEPENDANT_INVALID', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -1024,10 +1567,10 @@ class MemberEnrollmentService
$value = $row_data[$this->doc_headers_to_field_map[$header]] ?? null;
if (is_string($value)) {
$cells[] = WriterEntityFactory::createCell($value);
}
}
else if ($value instanceof DateTime) {
$cells[] = WriterEntityFactory::createCell(Carbon::parse($value)->format('Ymd'));
}
}
else {
$cells[] = WriterEntityFactory::createCell($value);
}
@@ -1036,6 +1579,17 @@ class MemberEnrollmentService
return $cells;
}
// This validation for range date in period corporate // validasi untuk range tanggal dalam period corporate yang ditentukan
public function validateRangePeriode($dates){
$date = date("Y-m-d", strtotime($dates));
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->start <= $date) {
}
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->end >= $date) {
dd($corporate->currentPolicy->end, $dates);
}
}
// This returning row with format or order as it is
public function makeResultRow($row_data)
{

View File

@@ -0,0 +1,284 @@
<?php
namespace Modules\Internal\Services;
use App\Exceptions\ImportRowException;
use App\Models\Member;
use App\Models\Benefit;
use App\Models\RequestLog;
use App\Models\RequestLogBenefit;
use App\Models\Corporate;
use App\Models\Service;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Carbon\Carbon;
use DateTime;
use DB;
class RequestLogService
{
private static $code_prefix = 'LOG';
public $doc_headers_to_field_map = [
"Date Of Request" => "submission_date",
"Date Addmission" => "submission_date",
"Member ID Peserta" => "member_id",
"Type of patient" => "service",
"Provider Name" => "organization_id",
"End Of Claim Numbers" => "code",
"Remarks" => "keterangan",
"Diagnosis" => "catatan",
"Tgl Billing dari RS" => "approved_final_log_at",
"Benefit Item" => "benefit_id",
"Total Billing" => "total_billing",
"Amount Approval" => "amount_approval",
"Amount Not Approval" => "amount_not_approval",
"QC 1" => "status_final_log",
"Ingestion Code" => "ingestion_code", // TODO I think this should not be here because if user uploading result then ingestion code and status will be filled
"Ingestion Status" => "ingestion_status",
];
public $field_to_doc_headers_map = [
"submission_date" => "Date Of Request",
"submission_date" => "Date Addmission",
"member_id" => "Member ID Peserta",
"service" => "Type of patient",
"organization_id" => "Provider Name",
"code" => "End Of Claim Numbers",
"keterangan" => "Remarks",
"catatan" => "Diagnosis",
"approved_final_log_at" => "Tgl Billing dari RS",
"benefit_id" => "Benefit Item",
"total_billing" => "Total Billing",
"amount_approval" => "Amount Approval",
"amount_not_approval" => "Amount Not Approval",
"status_final_log" => "QC 1" ,
"ingestion_code" => "Ingestion Code",
"ingestion_status" => "Ingestion Status",
];
public $result_doc_headers = [
"Date Of Request",
"Date Addmission",
"Member ID Peserta",
"Type of patient",
"Provider Name",
"End Of Claim Numbers",
"Remarks",
"Diagnosis",
"Tgl Billing dari RS",
"Benefit Item",
"Total Billing",
"Amount Approval",
"Amount Not Approval",
"QC 1",
"Ingestion Code",
"Ingestion Status",
];
public $listing_doc_headers = [
"Date Of Request",
"Date Addmission",
"Member ID Peserta",
"Type of patient",
"Provider Name",
"End Of Claim Numbers",
"Remarks",
"Diagnosis",
"Tgl Billing dari RS",
"Benefit Item",
"Total Billing",
"Amount Approval",
"Amount Not Approval",
"QC 1",
"Ingestion Code",
"Ingestion Status",
];
public function dateParser($date_from_row) {
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('Y-m-d');
} else if ($date_from_row != null) {
return date('Y-m-d', strtotime($date_from_row));
} else {
return null;
}
}
public function dateParserCode($date_from_row) {
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('ymd');
} else if ($date_from_row != null) {
return date('ymd', strtotime($date_from_row));
} else {
return null;
}
}
public function handleImportRow($row)
{
try {
// Memulai transaksi
DB::beginTransaction();
$member = Member::with('currentCorporate')->where(['member_id' => $row['member_id']])->first();
// // Validate If Exist Member
if (!$member) {
throw new ImportRowException(__('MEMBER_NOT_FOUND', [
'member_id' => $row['member_id'],
]), 0, null, $row);
}
// Membuat singkatan dari nama rumah sakit
$singkatan = "";
$words = explode(' ', $row['organization_id']);
foreach ($words as $word) {
$singkatan .= strtoupper(substr($word, 0, 1));
}
// Membuat kode organisasi
$kodeOrganisasi = "ORG000" . $singkatan;
// Insert data ke tabel organizations
$organization = DB::table('organizations')->where('code', $kodeOrganisasi)->first();
// dd( $organization);
if ($organization) {
$organization_id = $organization->id;
} else {
$organization_id = DB::table('organizations')
->insertGetId([
'name' => $row['organization_id'],
'code' => $kodeOrganisasi,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
}
$data = [
'source' => 'H',
'provideCode' => $kodeOrganisasi ,
'date' => $this->dateParserCode($row['submission_date']),
'policy' => $member->currentPolicy->code,
'member_code' => $row['member_id']
];
$code = $this->makeCode($row['code'], $data);
$status = $row['status_final_log'] == 'Y' ? 'approved' : 'requested';
$service = Service::where('name', $row['service'])->first();
if ($service){
$serviceCode = $service->code;
} else {
$serviceCode = 'Unk';
}
$benefit = Benefit::where('code', $row['benefit_id'])->first();
if (!$benefit){
$statusFinalLog = 'requested';
$final_log = 0;
} else {
$statusFinalLog = $status;
$final_log = 1;
}
$requestLog = RequestLog::updateOrCreate(
[
'code' => $code
],
[
'code' => $code,
'member_id' => $member->id,
'submission_date' => $row['submission_date'],
'discharge_date' => $row['submission_date'],
'payment_type' => 'cashless',
'status' => $status,
'status_final_log' => $statusFinalLog,
'final_log' =>$final_log,
'import_system' =>TRUE,
'catatan' => $row['catatan'],
'policy_id' => $member->currentPolicy->id ?? null,
'organization_id' => $organization_id,
'service_code' => $serviceCode,
'approved_final_log_at' => $row['approved_final_log_at'],
]);
if ($benefit) { // jika tidak ada benefit nya maka belum ngisi benefit nya
RequestLogBenefit::updateOrCreate(
[
'request_log_id' => $requestLog->id,
],
[
'request_log_id' => $requestLog->id,
'benefit_id' => $benefit->id,
'amount_incurred' => $row['total_billing'],
'amount_approved' => $row['amount_approval'],
'amount_not_approved' => $row['amount_not_approval'],
'excess_paid' => $row['amount_not_approval'],
'created_by' => auth()->user()->id,
]);
}
// Commit transaksi
DB::commit();
} catch (\Exception $e) {
DB::rollback();
throw new ImportRowException($e->getMessage(), $e->getCode(), $e, $row);
}
$row['ingestion_code'] = "200";
$row['ingestion_status'] = "SUCCESS";
return $row;
}
// This returning row with format or order as it is
public function makeResultRow($row_data)
{
$cells = [];
foreach ($row_data as $cellValue) {
$cells[] = WriterEntityFactory::createCell($cellValue);
}
return $cells;
}
// This returning row with format or order following $result_doc_headers
public function makeResultRowWithResultFormat($row_data)
{
$cells = [];
foreach ($this->result_doc_headers as $header) {
$value = $row_data[$this->doc_headers_to_field_map[$header]] ?? null;
if (is_string($value)) {
$cells[] = WriterEntityFactory::createCell($value);
}
else if ($value instanceof DateTime) {
$cells[] = WriterEntityFactory::createCell(Carbon::parse($value)->format('Ymd'));
}
else {
$cells[] = WriterEntityFactory::createCell($value);
}
}
return $cells;
}
public function makeCode($next_number, $data)
{
$sparator = '.';
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
class AuditTrailResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$audit_trail = [
'id' => $this->id,
'old_values' => json_decode($this->old_values),
'new_values' => json_decode($this->new_values),
'action' => $this->action,
'user_id' => $this->user->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
return $audit_trail;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\Benefit;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimEditResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$value = parent::toArray($request);
$data['id'] = $value['id'];
$data['plan_id'] = $value['plan'] ? $value['plan']['code'] : '-';
$data['payor_id'] = $value['member'] ? $value['member']['current_corporate']['payor_id'] : '-';
$data['corporate_id'] = $value['member'] ? $value['member']['current_corporate']['code'] : '-';
$data['policy_number'] = $value['member'] ? $value['member']['current_policy']['code'] : '-';
$data['member_id'] = $value['member'] ? $value['member']['member_id'] : '-';
// $data['benefit_code'] = $value['benefit'] ? $value['benefit']['code'] : '-';
// $data['benefit_desc'] = $value['benefit'] ? $value['benefit']['description'] : '-';
$data['benefit_code'] = $value['benefit_code'];
$data['benefit_desc'] = $value['benefit_desc'];
$data['amount_incurred'] = $value['amount_incurred'];
$data['amount_approved'] = $value['amount_approved'];
$data['amount_not_approved'] = $value['amount_not_approved'];
$data['excess_paid'] = $value['excess_paid'];
return $data;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\DiagnosisSecondaryClaimHistoryCare;
use App\Models\Icd;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimHistoryCareResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$claim = parent::toArray($request);
$secondaryDiagnosis = DiagnosisSecondaryClaimHistoryCare::where('claim_history_care_id', $claim['id'])->with(['icd'])->get()->toArray();
$data = [
'id' => $claim['id'],
'service_code' => $claim['service_code'],
'admission_date' => $claim['admission_date'],
'discharge_date' => $claim['discharge_date'],
'claim_id' => $claim['claim_id'],
'organization_id' => $claim['organization_id'],
'organization_name' => $claim['organization'] ? $claim['organization']['name'] : '-',
'practitioner_id' => $claim['practitioner_id'],
'practitioner_name' => $claim['practitioner'] ? $claim['practitioner']['person']['name'] : '-',
'medical_record_number' => $claim['medical_record_number'],
'symptoms' => $claim['symptoms'],
'sign' => $claim['sign'],
'main_diagnosis_id' => $claim['main_diagnosis_id'],
'main_diagnosis_name' => $claim['icd'] ? $claim['icd']['name'] : '-',
'status' => $claim['status'],
'secondary_diagnosis' => $secondaryDiagnosis,
];
return $data;
}
}

View File

@@ -3,6 +3,7 @@
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestResource extends JsonResource
{
@@ -15,7 +16,7 @@ class ClaimRequestResource extends JsonResource
public function toArray($request)
{
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [$file->type => $file];
return [Str::slug($file->type, '_') => $file];
});
$data = [
@@ -24,7 +25,7 @@ class ClaimRequestResource extends JsonResource
'submission_date' => $this->submission_date,
'member' => $this->member,
'status' => $this->status ?? 'unknown',
'service_name' => $this->service->name,
'service_name' => $this->service ? $this->service->name : '',
'payment_type' => $this->payment_type,
'payment_type_name' => $this->payment_type_name,
'files_by_type' => $filesGroupByType

View File

@@ -3,6 +3,9 @@
namespace Modules\Internal\Transformers;
use App\Models\Benefit;
use App\Models\CorporateEmployee;
use App\Models\ClaimRequest;
use App\Models\Icd;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimShowResource extends JsonResource
@@ -15,34 +18,55 @@ class ClaimShowResource extends JsonResource
*/
public function toArray($request)
{
$data = parent::toArray($request);
// $data['']
$data['benefit_items'] = $this->items
->filter(function ($item) {
return $item->claim_itemable_type == Benefit::class;
})
->map(function ($item) {
$itemData = $item->claim_itemable->toArray();
$itemData['nominal_dicover'] = $item['nominal_dicover'] ?? 0;
$itemData['nominal_ditagihkan'] = $item['nominal_ditagihkan'] ?? 0;
$itemData['nominal_total'] = $item['nominal_total'] ?? 0;
// For React Frotnend
$itemData['biaya_diajukan'] = $itemData['nominal_ditagihkan'];
$itemData['biaya_disetujui'] = $itemData['nominal_dicover'];
$claim = parent::toArray($request);
return $itemData;
});
$member_data = CorporateEmployee::where('member_id', $claim['member_id'])->first();
$claim_request = ClaimRequest::where('id', $claim['claim_request_id'])->first();
$data['primary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'primary';})->values();
$data['secondary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'secondary';})->values();
$data['encounters'] = $this->encounters->map(function($encounter) {
$encounterData = EncounterResource::make($encounter);
return $encounterData;
});
// $memberDiagnosisHistories = $this->member->
$data = [
'id' => $claim['id'],
'uuid' => $claim['uuid'],
'code' => $claim['code'],
'claim_request_id' => $claim['claim_request_id'],
'member_id' => $claim['member_id'],
'currency' => $claim['currency'],
'total_claim' => $claim['total_claim'],
'plan_id' => $claim['plan_id'],
'benefit_id' => $claim['benefit_id'],
'organization_id' => $claim['organization_id'],
'benefit_code' => $claim['benefit_code'],
'benefit_desc' => $claim['benefit_desc'],
'amount_incurred' => $claim['amount_incurred'],
'amount_approved' => $claim['amount_approved'],
'amount_not_approved' => $claim['amount_not_approved'],
'excess_paid' => $claim['excess_paid'],
'final_encounter_id' => $claim['final_encounter_id'],
'status' => $claim['status'],
'created_at' => $claim['created_at'],
'corporate_id' => $member_data->corporate_id,
'service_code' => $claim_request->service_code
// "uuid" => "9a59bff7-857f-4e48-8c6b-242ad1286395"
// "" => "CLM-00035"
// "" => 66
// "member_id" => 3
// "" => "IDR"
// "" => null
// "" => 1
// "" => null
// "" => 0
// "benefit_code" => ""
// "benefit_desc" => "erwraf"
// "" => 10000
// "" => 123000
// "amount_not_approved" => 122000
// "excess_paid" => 230000
// "final_encounter_id" => null
// "status" => "received"
// "created_at" => "2023-10-12T09:23:54.000000Z"
];
// $data['benefit_items'] = $this->items
$data['history_hospital_care'] = $claim['history_hospital_care'];
// $data['main_diagnosis']
return $data;
}

View File

@@ -16,11 +16,10 @@ class CorporateFormulariumResource extends JsonResource
{
return [
'id' => $this->id,
'code' => $this->code,
'name' => $this->name,
'items_count' => $this->items_count,
'status' => $this->corporateFormulariums->count() ? 'active' : 'inactive',
'corporate_formulariums' => $this->coporateFormulariums,
'formulaurium_category_id' => $this->formularium_template->id,
'category' => $this->formularium_template->name,
'description' => $this->formularium_template->description,
'active' => $this->active == 1 ? 'Active' : 'Inactive',
];
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class CorporateManageResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$data = [];
// dd($this);
// if(count($this) > 0){
$temp = [];
foreach($this as $d){
dd($d);
// $temp['user'] = []
}
// }
return $data;
}
}

View File

@@ -41,38 +41,97 @@ class CorporateServiceConfigResource extends JsonResource
];
$list_msc = $this->corporateServiceSpecialities->map(function ($speciality) {
return explode(',', $speciality->exclusions->first()->rules->where('name', 'msc')->first()->values ?? '');
})->map(function ($item) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'msc')->first();
if ($rules) {
$values = $rules->values ?? '';
$item = explode(',', $values);
} else {
// Handle case where 'rules' with name 'msc' is not found
$item = [];
}
} else {
// Handle case where 'exclusions' is not found
$item = [];
}
return [
'm' => in_array('m', $item),
's' => in_array('s', $item),
'c' => in_array('c', $item),
];
});
$list_gender = $this->corporateServiceSpecialities->map(function ($speciality) {
// dd($speciality->exclusions->first()->rules);
return explode(',', $speciality->exclusions->first()->rules->where('name', 'gender')->first()->values ?? '');
})->map(function ($item) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'gender')->first();
if ($rules) {
$values = $rules->values ?? '';
$item = explode(',', $values);
} else {
// Handle case where 'rules' with name 'gender' is not found
$item = [];
}
} else {
// Handle case where 'exclusions' is not found
$item = [];
}
return [
'male' => in_array('male', $item),
'female' => in_array('female', $item),
];
});
$min_age = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'min_age')->first()->values ?? '';
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'min_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
});
$max_age = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'max_age')->first()->values ?? '';
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'max_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
});
$plan = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'plan')->first()->values ?? null;
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'plan')->first();
if ($rules) {
return $rules->values ?? null;
}
}
return null;
});
$data['exclusions'] = $data['exclusions']->map(function ($item, $key) use (
$list_msc,
$list_gender,

View File

@@ -21,6 +21,7 @@ class DiagnosisExclusionResource extends JsonResource
'diagnosis_type' => $this->exclusionable->type,
'service_code' => $this->service_code,
'type' => $this->type,
'active' => $this->active,
'rules' => $this->rules->mapToGroups(function ($item, $key) {
return [$item['name'] => $item['values']];
})

View File

@@ -4,6 +4,7 @@ namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Helpers\Helper;
class LivechatResource extends JsonResource
{
@@ -17,13 +18,19 @@ class LivechatResource extends JsonResource
{
$livechat = [
'id' => $this->nID,
'doctor_name' => isset($this->doctor->user->sFirstName) ? $this->doctor->user->sFirstName . ' ' . $this->doctor->user->sLastName : null,
'doctor_name' => isset($this->doctor->user->sFirstName) ? $this->doctor->user->detail->sTitlePrefix . '. ' . $this->doctor->user->sFirstName . ' ' . $this->doctor->user->sLastName . ' ' . $this->doctor->user->detail->sTitleSuffix : null,
'pasien_name' => isset($this->user->sFirstName) ? $this->user->sFirstName . ' ' . $this->user->sLastName : null,
'pasien_phone' => isset($this->user->sPhone) ? $this->user->sPhone : '-',
'pasien_email' => isset($this->user->sEmail) ? $this->user->sEmail : '-',
'speciality' => $this->doctor->speciality->sKeterangan ?? null,
'health_care' => $this->healthCare->sHealthCare ?? null,
'date_appointment' => Carbon::parse($this->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y')
. ' ' . $this->appointment->appointmentDetail->tTimeAppointment ?? null,
'status_appointment' => $this->appointment->status_name ?? null,
'date_created' => Carbon::parse($this->appointment->dCreateOn)->format('d-m-Y H:i:s') ?? null,
'date_appointment' => $this->appointment !== null ?
Carbon::parse($this->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y')
. ' ' . $this->appointment->appointmentDetail->tTimeAppointment :
null,
'status_appointment' => $this->appointment->paymentStatus ?? null,
'date_created' => Carbon::parse($this->dCreateOn)->format('d-m-Y') ?? null,
'time_request' => Carbon::parse($this->dCreateOn)->format('H:i:s') ?? null,
'patient_media' => $this->sMedia ?? null,
'doctor_media' => $this->sMediaDokter ?? null,
'appointment_media' => $this->appointment->sMedia ?? null,
@@ -46,11 +53,12 @@ class LivechatResource extends JsonResource
$livechat['duration'] = $data_duration;
$payment_detail = null;
if ($this->appointment->appointmentDetail->sPaymentDetails != null) {
if ($this->appointment !== null && $this->appointment->appointmentDetail->sPaymentDetails !== null) {
$payment_detail = [
'payment_type' => $this->appointment->appointmentDetail->sPaymentDetails['payment_type'],
'transaction_time' => $this->appointment->appointmentDetail->sPaymentDetails['transaction_time'],
'gross_amount' => $this->appointment->appointmentDetail->sPaymentDetails['gross_amount'],
'gross_amount' => Helper::formatRupiah($this->appointment->appointmentDetail->sPaymentDetails['gross_amount']),
'currency' => $this->appointment->appointmentDetail->sPaymentDetails['currency'],
'status_message' => $this->appointment->appointmentDetail->sPaymentDetails['status_message'],
];

View File

@@ -0,0 +1,40 @@
<?php
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
use App\Models\Organization;
class RequestLogResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [Str::slug($file->type, '_') => $file];
});
$provider = Organization::where('id', $this->organization_id)->first();
$data = [
'id' => $this->id,
'code' => $this->code,
'submission_date' => $this->submission_date,
'member_name' => $this->member->name,
'status' => $this->status ?? 'unknown',
'provider' => $provider ? $provider->name : '-',
'status_final_log' => $this->status_final_log ?? 'unknown',
'service_name' => $this->service ? $this->service->name : '',
'payment_type' => $this->payment_type,
'payment_type_name' => $this->payment_type_name,
'files_by_type' => $filesGroupByType
];
return $data;
}
}

View File

@@ -0,0 +1,122 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\Plan;
use App\Models\CorporateBenefit;
use App\Models\MemberPlan;
use App\Models\CorporateService;
use App\Models\RequestLogBenefit;
use App\Models\RequestLogMedicine;
use App\Models\Organization;
use App\Models\Exclusion;
use App\Models\Icd;
use App\Helpers\Helper;
use App\Models\CorporatePolicy;
use Illuminate\Http\Resources\Json\JsonResource;
class RequestLogShowResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$requestLog = parent::toArray($request);
$corporateId = $requestLog['member']['current_plan']['corporate_id'] ?? 0;
$member_id = $requestLog['member_id'];
$planMember = MemberPlan::where('member_id', $member_id)->get('plan_id');
$planId = Plan::whereIn('id', $planMember)->where('service_code', $requestLog['service_code'])->first();
$benefit = CorporateBenefit::with('benefit')->where('plan_id', $planId->id)->get()->toArray();
$benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $requestLog['id'])->get()->toArray();
$medicineDetailLog = RequestLogMedicine::where('request_log_id', $requestLog['id'])->get()->toArray();
$provider = Organization::where('id', $requestLog['organization_id'])->first();
if ($provider){
$providerName = $provider->name;
} else {
$providerName = '-';
}
$benefitData = [];
if (count($benefit)){
foreach($benefit as $data){
array_push($benefitData, $data['benefit']);
}
}
// Medicine
$medicineData = [];
if (count($medicineDetailLog)){
foreach($medicineDetailLog as $data){
array_push($medicineData, $data);
}
}
// Service Rule
$corporateService = CorporateService::query()
->where('corporate_id', $corporateId)
->where('service_code', $requestLog['service_code'])
->with(['configs'])
->first();
$config = [];
if ($corporateService) {
$config = $corporateService->configs->pluck('value', 'name')->toArray();
}
// Exclusion Service or diagnosis
$exclusions = Exclusion::query()
->where('corporate_id', $corporateId)
->where('type', 'diagnosis')
->with(['exclusionable', 'rules'])
->get()->toArray();
// Policy Number
$policyNumber = CorporatePolicy::query()
->where('corporate_id', $corporateId)
->first();
$data = [
'id' => $requestLog['id'],
'code' => $requestLog['code'],
'member_id' => $requestLog['member']['member_id'],
'policy_number' =>$policyNumber->code ? $policyNumber->code : '-',
'name' => $requestLog['member']['name'],
'date_of_birth' => $requestLog['member']['birth_date'],
'gender' => $requestLog['member']['gender'],
'marital_status' => $requestLog['member']['status_marital'],
'member_type' => Helper::memberType($requestLog['member']['record_type']),
'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-',
'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($requestLog['member']['principal_id']) : '-',
'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']),
'submission_date' => $requestLog['submission_date'],
'service_type' => Helper::serviceName($requestLog['service_code']),
'claim_method' => $requestLog['payment_type'],
'status' => $requestLog['status'],
'status_final_log' => $requestLog['status_final_log'],
'benefit' => $benefitData,
'benefit_data' => $benefitDetailLog,
'config_service' => $config,
'exclusion' => $exclusions,
'medicine' => $medicineData,
'files' => $requestLog['files'],
'provider' => $providerName,
'no_identitas' => $requestLog['member']['nric'],
'keterangan' => $requestLog['keterangan'],
'hak_kamar_pasien' => $requestLog['hak_kamar_pasien'],
'penempatan_kamar' => $requestLog['penempatan_kamar'],
'catatan' => $requestLog['catatan'],
];
return $data;
}
}

View File

@@ -5,126 +5,172 @@ namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\User;
use App\Models\OLDLMS\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Laravel\Socialite\Facades\Socialite;
use Modules\Linksehat\Transformers\UserProfileResource;
use Modules\Linksehat\Transformers\User\UserProfileResource;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Http;
use Validator;
class AuthController extends Controller
{
public function otpRequest(Request $request)
{
$request->validate([
// 'phone' => 'required'
'phone_or_email' => 'required'
]);
private $url;
if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) {
$user = User::updateOrCreate([
'email' => $request->phone_or_email
], [
'email' => $request->phone_or_email,
'otp' => rand(1000, 9999),
'otp_created_at' => now()
]);
$person = Person::query()->create([
'owner_user_id' => $user->id,
'email' => $request->phone_or_email,
'created_by' => $user->id,
]);
User::query()->find($user->id)->update([
'person_id' => $person->id
]);
} else {
$user = User::updateOrCreate([
'phone' => $request->phone_or_email
], [
'phone' => $request->phone_or_email,
'otp' => rand(1000, 9999),
'otp_created_at' => now()
]);
$person = Person::query()->create([
'owner_user_id' => $user->id,
'phone' => $request->phone_or_email,
'created_by' => $user->id,
]);
User::query()->find($user->id)->update([
'person_id' => $person->id
]);
}
if (!$user) {
$message = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? "User dengan alamat email " . $request->phone_or_email . " tidak ditemukan" : "User dengan nomor telepon " . $request->phone_or_email . " tidak ditemukan";
return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message);
}
// TODO Send the OTP
if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) {
// Send Email
} else {
// Send Whatsapp
}
return Helper::responseJson(message: 'OTP Terkirim');
public function __construct() {
$this->url = $_ENV['LMS_APP_URL'];
}
public function login(Request $request)
{
{
$request->validate([
// 'email' => 'email',
// 'password' => 'required_with:email',
'phone_or_email' => 'required',
// 'phone' => '',
// 'otp' => 'required_with:phone',
'phone_or_email' => 'required',
'otp' => 'required'
'password' => 'required',
// 'otp' => 'required'
]);
$loginType = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone';
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'login', [
'sEmail' => $request->phone_or_email,
'sPassword' => $request->password,
'sRemember' => $request->remember
]);
if ($loginType == 'email') {
$user = User::query()
->where('email', $request->phone_or_email)
->first();
}
if ($loginType == 'phone') {
$user = User::query()
->where('phone', $request->phone_or_email)
->first();
}
if (!isset($user) || empty($user)) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
if ($loginType == 'email') {
if ($request->otp != $user->otp) {
return response(['message' => 'OTP Salah, Silahkan Cek Kembali Email Anda'], 403);
}
} else if ($loginType == 'phone') {
if ($request->otp != $user->otp) {
return response(['message' => 'OTP Salah'], 403);
}
$response = $response->json();
if ($response['success']){
$user = User::with('detail')
->where('sEmail', $request->phone_or_email)
->first();
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
} else {
return response(['message' => 'Mode Login Tidak Dikenal'], 403);
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function forgetPassword(Request $request){
$request->validate([
'email' => 'required|email',
]);
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'forgot_password', [
'sEmail' => $request->email,
]);
$response = $response->json();
if ($response['success']){
return Helper::responseJson(
data: [],
message: 'Message has been sent.'
);
} else {
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function resetPassword(Request $request){
$request->validate([
'email' => 'required|email',
'code' => 'required',
'password' => 'required',
]);
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'reset_password', [
'sCode' => $request->code,
'sEmail' => $request->email,
'sPassword' => $request->password,
]);
$response = $response->json();
if ($response['success']){
return Helper::responseJson(
data: [],
message: 'Password telah di reset'
);
} else {
return response(['message' => $response['message']], 403);
};
}
public function loginPhone(Request $request)
{
$request->validate([
'phone_or_email' => 'required',
'otp' => 'required',
]);
$user = User::with('detail')
->where([
'sPhone' => $request->phone_or_email,
'sVerificationCode' => $request->otp
])
->first();
if ($user){
$updateVericationCode = User::with('detail')
->where([
'sPhone' => $request->phone_or_email,
'sVerificationCode' => $request->otp
])->update([
'sVerificationCode' => null,
]);
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
} else {
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function otpRequest(Request $request)
{
$user = User::with('detail')
->where('sPhone', $request->phone_or_email)
->first();
if ($user){
// Request OTP ke API linksehat
$response = Http::post($this->url.'generate_code', [
'sPhone' => $request->phone_or_email
]);
$response = $response->json();
return Helper::responseJson(
data: [
'otp' => $response['message'],
],
message: 'Kode OTP'
);
} else {
return Helper::responseJson(
data: [
'otp' => null,
],
message: 'Nomor tidak ditemukan'
);
}
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
}
public function register(Request $request)
@@ -163,6 +209,7 @@ class AuthController extends Controller
return Helper::responseJson(message: 'Behasil Logout.');
}
public function mockOtp(Request $request)
{
$request->validate([

View File

@@ -0,0 +1,97 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\User;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Modules\Linksehat\Transformers\User\ShowProfileResource;
use Illuminate\Support\Facades\DB;
class AutocompleteController extends Controller {
public function maritalStatus(){
$maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->get()->toArray();
$data = [];
if ($maritalStatus){
$temp = [];
foreach($maritalStatus as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sStatusPernikahan;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function bloodType() {
$bloodType = DB::connection('oldlms')->table('tm_golongan_darah')->get()->toArray();
$data = [];
if ($bloodType){
$temp = [];
foreach($bloodType as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sGolonganDarah;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function relationship() {
$relation = DB::connection('oldlms')->table('tm_hubungan_keluarga')->get()->toArray();
$data = [];
if ($relation){
$temp = [];
foreach($relation as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sHubunganKeluarga;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function corporate(Request $request) {
$search = $request->search;
$corporate = DB::table('corporates')
->where('active', 1)
->where(function ($query) use ($search) {
$query->where('name', 'like', "%$search%")
->orWhere('code', 'like', "%$search%");
})
->get()
->toArray();
$data['company'] = [];
if ($corporate){
$temp = [];
foreach($corporate as $d){
$temp['id'] = $d->id;
$temp['name'] = $d->name;
$temp['linking_rule'] = json_decode($d->linking_rules);
array_push($data['company'], $temp);
}
}
return Helper::responseJson($data);
}
}

View File

@@ -0,0 +1,138 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\Corporate;
use App\Models\Member;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserInsurance;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Laravel\Socialite\Facades\Socialite;
use Modules\Linksehat\Transformers\User\UserProfileResource;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\OLDLMS\MemberResource;
use App\Rules\NikRule;
class LinkingController extends Controller
{
private $url;
public function __construct() {
$this->url = $_ENV['LMS_APP_URL'];
}
public function linkingValidate(Request $request)
{
$validator = Validator::make($request->all(), [
'corporate_id' => 'required',
'user_id' => 'required',
]);
// $request->validate($validationRules);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$corporate = Corporate::findOrFail($request->corporate_id);
// Make Validation from Linking Rules
$linkingRulesArr = $corporate->linking_rules->toArray();
$validationRules = [];
foreach ($linkingRulesArr as $field) {
$rules = ['required']; // Default is required if in the linking_rules
if ($field == 'email') {
$rules[] = 'email';
}
if ($field == 'nric') {
$rules[] = new NikRule;
}
$validationRules[$field] = $rules;
}
$validator = Validator::make($request->all(),$validationRules);
// $request->validate($validationRules);
if ($validator->fails()) {
return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 422, status: 'error');
}
$member = Member::query()
->when(in_array('nric', $linkingRulesArr), function($q) use ($request) {
$q->where('nric', $request->nric);
})
->when(in_array('member_id', $linkingRulesArr), function($q) use ($request) {
$q->where('member_id', $request->member_id);
})
->when(in_array('name', $linkingRulesArr), function($q) use ($request) {
$q->where('name', $request->name);
})
->when(in_array('dob', $linkingRulesArr), function($q) use ($request) {
$q->where('birth_date', $request->dob);
})
->when(in_array('phone', $linkingRulesArr), function($q) use ($request) {
$q->whereHas('person', function ($person) use ($request) {
$person->where('phone', $request->phone);
});
})
->when(in_array('email', $linkingRulesArr), function($q) use ($request) {
$q->where('email', $request->email);
})
->when(in_array('nik', $linkingRulesArr), function($q) use ($request) {
$q->whereHas('employeds', function ($employed) use ($request) {
$employed->where('corporate_id', $request->corporate_id)
->where('nik', $request->nik);
});
})
->with([
'memberPlans' => function ($memberPlan) {
$memberPlan->latest();
},
])
->first();
if ($member) {
// Insert into database linksehat
$insurance = UserInsurance::updateOrCreate(
[
'nIDUser' => $request->user_id,
],
[
'nIDUser' => $request->user_id,
'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'],
'sNoPolis' => $member->member_id,
'sNamaPeserta' => $member->fullName,
'sKartuPeserta' => '',
'sLayanan' => 'RJ,TC',
'dStartDate' => $member->members_effective_date,
'dExpireDate' => $member->members_expire_date,
'dTanggalLahir' => $member->birth_date,
'nNoKTP' => $member->nric != '' ? $member->nric : 0 ,
'sIsConfrimed' => 1,
'sStatus' => 1,
]);
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 404, status: 'error');
}
public function card($member_id){
$member = Member::where('member_id', $member_id)->get()->first();
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
}

View File

@@ -3,12 +3,16 @@
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\User;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Modules\Linksehat\Transformers\UserProfileResource;
use Modules\Linksehat\Transformers\User\ShowProfileResource;
use Modules\Linksehat\Transformers\User\UserProfileResource;
class ProfileController extends Controller
{
@@ -16,11 +20,11 @@ class ProfileController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index()
public function index(Request $request, $id)
{
$user = Auth::user()->load('person');
$user = User::with(['detail'])->where('nID', $id)->get()->first();
return Helper::responseJson(new UserProfileResource($user));
return Helper::responseJson(new ShowProfileResource($user));
}
/**
@@ -70,58 +74,90 @@ class ProfileController extends Controller
*/
public function update(Request $request)
{
$request->validate([
'nik' => 'numeric',
'name_prefix' => '',
'name' => '',
'name_suffix' => '',
'gender' => 'in:P,L',
'birth_date' => 'sometimes:date',
// 'is_deceased' => '',
'deceased_at' => 'sometimes:date',
'marital_status' => 'in:S,M,C',
'preferred_lang' => 'in:id,en'
$validator = Validator::make($request->all(), [
'id' => 'required',
'first_name' => 'required',
'last_name' => 'required',
'date_of_birth' => 'required',
// 'email' => 'required',
]);
$user = Auth::user();
if ($user->person) { // Update Profile
$user->person->fill($request->only([
'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status'
]))->save();
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
if ($request->has('preferred_lang')) {
$user->metas()->updateOrCreate([
'type' => 'preferred_lang'
], [
'system' => 'default',
'type' => 'preferred_lang',
'value' => $request->preferred_lang,
]);
}
} else { // Create If Not Exist
$newPerson = array_merge(
$request->only([
'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status'
]),
['user_owner_id' => $user->id]
);
$newPerson = $user->person()->create($newPerson);
$user->person_id = $newPerson->id;
$user->save();
$user = User::find($request->id);
$userDetail = UserDetail::where('nIDUser', $request->id)->first();
// Array asosiatif yang menghubungkan field dengan nama kolom di tabel
$userFields = [
'first_name' => 'sFirstName',
'last_name' => 'sLastName',
'phone' => 'sPhone',
'email' => 'sEmail',
'relationship' => 'nIDHubunganKeluarga',
];
if ($request->has('preferred_lang')) {
$user->metas()->updateOrCreate([
'type' => 'preferred_lang'
], [
'system' => 'default',
'type' => 'preferred_lang',
'value' => $request->preferred_lang,
]);
$userDetailFields = [
'date_of_birth' => 'dTanggalLahir',
'gender' => 'nIDJenisKelamin',
'blood_type' => 'nIDGolonganDarah',
'marital_status' => 'sMartialStatus',
'weight' => 'sWeight',
'height' => 'sHeight',
];
// Update user data
foreach ($userFields as $requestField => $column) {
if ($request->filled($requestField)) {
$user->update([$column => $request->$requestField]);
}
}
$user = User::find($user->id); // ReLoad User Data
return Helper::responseJson(['users' => new UserProfileResource($user)]);
// Update user detail
if($userDetail){
foreach ($userDetailFields as $requestField => $column) {
if ($request->filled($requestField)) {
$userDetail->update([$column => $request->$requestField]);
}
}
} else {
UserDetail::create([
'nIDUser' => $request->id,
'dTanggalLahir' => $request->date_of_birth,
'nIDJenisKelamin' => $request->gender,
'nIDGolonganDarah' => $request->blood_type,
'sMartialStatus' => $request->marital_status,
'sWeight' => $request->weight,
'sHeight' => $request->height,
]);
}
// poto profile
// if ($request->hasFile('avatar')) {
// $pathFileAvatar = File::storeFile('photo_profile_lms', $newCorporate->id, $request->file('avatar'));
// $newCorporate->files()->updateOrCreate([
// 'type' => 'photo_profile_lms',
// 'name' => File::getFileName('photo_profile_lms', $newCorporate->id, $request->file('avatar')),
// 'extension' => $request->file('avatar')->getClientOriginalExtension(),
// 'path' => $pathFileAvatar,
// 'created_by' => auth()->user()->id,
// 'updated_by' => auth()->user()->id,
// ]);
// }
$data['data'] = [
'status' => 200,
'message' => 'data berhasil di edit',
'error' => 'false'
];
return response()->json($data);
}
/**
@@ -133,4 +169,17 @@ class ProfileController extends Controller
{
//
}
public function changeProfile($id){
$user = User::with('detail')
->where('nID', $id)
->first();
return Helper::responseJson(
data: [
// 'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
}
}

View File

@@ -3,6 +3,7 @@
use Modules\Linksehat\Http\Controllers\Api\AppointmentController;
use Modules\Linksehat\Http\Controllers\Api\AuthController;
use Modules\Linksehat\Http\Controllers\Api\DashboardController;
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
use Modules\Linksehat\Http\Controllers\Api\DoctorController;
use Modules\Linksehat\Http\Controllers\Api\HospitalController;
use Modules\Linksehat\Http\Controllers\Api\NotificationTokenController;
@@ -10,6 +11,7 @@ use Modules\Linksehat\Http\Controllers\Api\PersonController;
use Modules\Linksehat\Http\Controllers\Api\ProfileController;
use Modules\Linksehat\Http\Controllers\Api\SearchController;
use Modules\Linksehat\Http\Controllers\Api\SpecialityController;
use Modules\Linksehat\Http\Controllers\Api\LinkingController;
/*
|--------------------------------------------------------------------------
@@ -35,7 +37,11 @@ Route::prefix('linksehat')->group(function () {
Route::post('otp-request', 'otpRequest');
Route::post('mock-otp', 'mockOtp');
Route::post('login', 'login');
Route::post('logout', 'logout');
Route::post('login-phone', 'loginPhone');
Route::post('register', 'register');
Route::post('forget-password', 'forgetPassword');
Route::post('reset-password', 'resetPassword');
Route::get('social-login/{provider}', 'redirectSocialLogin');
Route::get('social-login/{provider}/callback', 'handleSocialLoginCallback');
});
@@ -59,11 +65,22 @@ Route::prefix('linksehat')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::get('profile', [ProfileController::class, 'index'])->name('profile');
Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile');
Route::get('change-profile/{id}', [ProfileController::class, 'changeProfile'])->name('change-profile');
Route::post('profile', [ProfileController::class, 'update'])->name('profile.update');
Route::post('notification-tokens/delete/{id}', [NotificationTokenController::class, 'destroy'])->name('profile.delete.token');
Route::post('notification-tokens', [NotificationTokenController::class, 'store'])->name('profile.store.token');
Route::apiResource('appointment', AppointmentController::class);
Route::apiResource('families', PersonController::class)->except(['destroy']);
Route::get('autocomplete/marital_status', [AutocompleteController::class, 'maritalStatus']);
Route::get('autocomplete/blood_type', [AutocompleteController::class, 'bloodType']);
Route::get('autocomplete/relationship', [AutocompleteController::class, 'relationship']);
Route::get('autocomplete/corporate', [AutocompleteController::class, 'corporate']);
Route::post('manual-linking', [LinkingController::class, 'linkingValidate']);
Route::get('card/{member_id}', [LinkingController::class, 'card']);
});
});

View File

@@ -0,0 +1,90 @@
<?php
namespace Modules\Linksehat\Transformers\User;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use DB;
class ShowProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $connection = 'oldlms';
public function toArray($request)
{
// Principal
if ($this->detail){
switch ($this->detail->nIDGolonganDarah) {
case 1:
$goldar = 'A';
break;
case 2:
$goldar = 'B';
break;
case 3:
$goldar = 'AB';
break;
case 4:
$goldar = 'O';
break;
default:
$goldar = '-';
break;
}
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
// Marital Status
$maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->where('nID', $this->detail->sMartialStatus)->first('sStatusPernikahan');
// Hubungan Keluarga
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
// dd( $this->detail->nIDGolonganDarah);
$sWeight = $this->detail->sWeight ? $this->detail->sWeight : 0;
$sHeight = $this->detail->sHeight ? $this->detail->sHeight : 0;
$nIDJenisKelamin = $this->detail->nIDJenisKelamin == 1 ? 'Male' : 'Female';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
$goldar = '-';
$relationship = false;
$maritalStatus = false;
$sWeight = 0;
$sHeight = 0;
$nIDJenisKelamin = false;
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
$userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first();
$memberId = Null;
if($userInsurance){
$memberId = $userInsurance->sNoPolis;
}
return [
'id' => $this->nID,
'first_name' => $this->sFirstName,
'last_name' => $this->sLastName,
'date_of_birth' => $this->detail ? $this->detail->dTanggalLahir : null,
'avatar' => $avatar,
'gender' => $nIDJenisKelamin ? $nIDJenisKelamin : '-',
'phone' => $this->sPhone,
'email' => $this->sEmail,
'blood_type' => $goldar,
'marital_status' => $maritalStatus ? $maritalStatus->sStatusPernikahan : '-',
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'weight' => $sWeight,
'height' => $sHeight,
'member_id' => $memberId,
];
}
}

View File

@@ -0,0 +1,174 @@
<?php
namespace Modules\Linksehat\Transformers\User;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use App\Models\Member;
use App\Models\Person;
use App\Models\CorporateEmployee;
use App\Models\Corporate;
use Illuminate\Support\Facades\Auth;
use DB;
class UserProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $connection = 'oldlms';
public function toArray($request)
{
$memberProfile = User::with('detail')->where('nIDUser', $this->nID)->get()->toArray();
$dataMemberProfile = [];
$userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first();
$memberId = null;
$linking = false;
if($userInsurance){
$memberId = $userInsurance->sNoPolis;
$linking = true;
} else {
$member = Member::where('email', $this->sEmail)->get()->first();
$person = Person::where('phone', $this->sPhone)->get()->first();
if ($member || $person){ // Autolinking
$corporateEmployee = CorporateEmployee::where('member_id', $member->id)->get()->first(); // cek corporate id empolyee/member
if ($corporateEmployee){
$corporate = Corporate::findOrFail($corporateEmployee->corporate_id)->automatic_linking; // cek autocomplete
if ($corporate){
if($member) {
// Insert into database linksehat
$insurance = UserInsurance::updateOrCreate(
[
'nIDUser' => $this->nID,
],
[
'nIDUser' => $this->nID,
'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'],
'sNoPolis' => $member->member_id,
'sNamaPeserta' => $member->fullName,
'sKartuPeserta' => '',
'sLayanan' => 'RJ,TC',
'dStartDate' => $member->members_effective_date,
'dExpireDate' => $member->members_expire_date,
'dTanggalLahir' => $member->birth_date,
'nNoKTP' => $member->nric != '' ? $member->nric : 0 ,
'sIsConfrimed' => 1,
'sStatus' => 1,
]);
$message = $member->currentPolicy->corporate->welcome_message;
$linking = true;
$memberId = $member->member_id;
}
}
}
}
};
if (count($memberProfile) > 0){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $this->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $this->nID,
'name' => $this->sFirstName . ' ' . $this->sLastName,
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
} else {
$nID = $this->nIDUser ? $this->nIDUser : $this->nID;
if ($nID){
$memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray();
$dataMember = User::with('detail')->where('nID', $nID)->get()->first();
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
$avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $dataMember->nID,
'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName,
'relationship' => 'Me',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
if (count($memberProfile) > 0){
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship->sHubunganKeluarga,
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
}
} else {
}
}
// Principal
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
return [
'id' => $this->nID,
'full_name' => $this->sFirstName . ' '. $this->sLastName,
'avatar' => $avatar,
'member_type' => $this->nIDUser ? 'Dependent' : 'Principal',
'member_profile' => $dataMemberProfile,
'member_id' => $memberId,
'linking' => $linking,
];
}
}

View File

@@ -1,36 +0,0 @@
<?php
namespace Modules\Linksehat\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class UserProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'email' => $this->email,
'phone' => $this->phone,
'email_verified_at' => $this->email_verified_at,
'nik' => $this->person->nik ?? null,
'name_prefix' => $this->person->name_prefix ?? null,
'name' => $this->person->name ?? null,
'name_suffix' => $this->person->name_suffix ?? null,
'full_name' => $this->person->full_name ?? null,
'gender' => $this->person->gender ?? null,
'birth_date' => $this->person->birth_date ?? null,
'age' => $this->person->age ?? null,
'is_deceased' => $this->person->is_deceased ?? null,
'deceased_at' => $this->person->deceased_at ?? null,
'marital_status' => $this->person->marital_status ?? null,
'preferred_lang' => $this->meta->preferred_lang ?? 'id',
];
}
}

View File

@@ -24,9 +24,24 @@ class MemberBuilder extends Builder
public function joinCorporateEmployees(string $value = 'join'): static
{
// return match ($value) {
// 'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'),
// 'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
// };
return match ($value) {
'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'),
'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
'join' => $this->join('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
}),
'left' => $this->leftJoin('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
}),
'right' => $this->rightJoin('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
})
};
}
@@ -40,11 +55,31 @@ class MemberBuilder extends Builder
public function joinClaimRequests(string $value = 'join'): static
{
// return match ($value) {
// 'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
// 'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
// // 'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id')
// 'right' => $this->rightJoin('claim_requests', function ($join) {
// $join->on('members.id', '=', 'claim_requests.member_id')
// ->orWhere('members.principal_id', '=', 'claim_requests.member_id');
// })
// };
return match ($value) {
'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id')
'join' => $this->join('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
}),
'left' => $this->leftJoin('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
}),
'right' => $this->rightJoin('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
})
};
}
public function joinMemberPlans(string $value = 'join'): static

View File

@@ -6,11 +6,16 @@ use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use PHPMailer\PHPMailer\PHPMailer;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
use App\Models\Service;
class Helper
{
public static function genderNormalization($anyGenderCode)
public static function genderNormalization($anyGenderCode = '-')
{
if ($anyGenderCode == 'M') {
return 'male';
} else if ($anyGenderCode == 'F') {
@@ -20,7 +25,20 @@ class Helper
} else if ($anyGenderCode == 'U') {
return 'unknown';
} else {
return null;
return '-';
}
}
public static function maritalNormalization($code)
{
if ($code == 'M') {
return 'Married';
} else if ($code == 'D') {
return 'Divorced';
} else if ($code == 'S') {
return 'Single';
} else {
return '-';
}
}
@@ -35,10 +53,48 @@ class Helper
} else if ($anyGenderCode == 'U') {
return 'unknown';
} else {
return null;
return '-';
}
}
public static function memberType($code)
{
if ($code == 'P') {
return 'Principal';
} else if ($code == 'D') {
return 'Dependent';
} else {
'-';
}
}
public static function relationWithPrincipal($code)
{
if ($code == 'H') {
return 'Husbund';
} else if ($code == 'W') {
return 'Wife';
} else if ($code == 'S') {
return 'Son';
} else if ($code == 'D') {
return 'Daughter';
} else {
'-';
}
}
public static function principalName($code)
{
$principalName = Member::where('member_id', $code)->get()->first();
return $principalName->name;
}
public static function serviceName($code)
{
$serviceName = Service::where('code', $code)->get()->first();
return $serviceName->name;
}
public static function paginateResources($resource)
{
return [
@@ -184,4 +240,161 @@ class Helper
'data' => $data,
], $statusCode);
}
public static function validatePhoneNumber($phoneNumber)
{
// Menghapus semua karakter selain angka dan +
$cleanedNumber = preg_replace('/[^0-9+]/', '', $phoneNumber);
// Memeriksa apakah nomor telepon hanya terdiri dari angka dan +
if ($cleanedNumber == $phoneNumber) {
// Nomor telepon valid
return true;
} else {
// Nomor telepon tidak valid
return false;
}
}
public static function formatRupiah($angka)
{
return "Rp " . number_format($angka, 0, ',', '.');
}
public static function sPaymentMethod($id)
{
$sPaymentMethod = [
1 => 'Pribadi',
2 => 'On-Site Payment',
3 => 'OVO',
4 => 'Asuransi',
5 => 'Voucher',
6 => 'ASO'
];
return $sPaymentMethod[$id];
}
public static function formatDateDB($date)
{
$convertedDate = Carbon::createFromFormat('d-m-Y', $date)->format('Y-m-d H:i:s');
return $convertedDate;
}
public static function formatDateOnly($date)
{
// Membuat objek Carbon dengan tanggal asli dan zona waktu UTC
$carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC');
// Mengonversi tanggal ke zona waktu yang diinginkan
$carbonDate->setTimezone('Asia/Jakarta');
$convertedDate = $carbonDate->toDateString();
return $convertedDate;
}
public static function formatTimeOnly($date)
{
// Membuat objek Carbon dengan tanggal asli dan zona waktu UTC
$carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC');
// Mengonversi tanggal ke zona waktu yang diinginkan
$carbonDate->setTimezone('Asia/Jakarta');
$convertedDate = $carbonDate->toTimeString();
return $convertedDate;
}
public static function insertNotification($data = array())
{
try {
DB::beginTransaction();
DB::table('notifications')->insert($data);
DB::commit();
return true;
} catch (\Exception $e) {
DB::rollback();
return $e->getMessage();
}
}
public static function sendEmail($data = array())
{
// Buat instance PHPMailer
$mail = new PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = env('EMAIL');
$mail->Password = env('PW_EMAIL');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
// Penerima email
$mail->setFrom(env('EMAIL'), env('NAME_EMAIL'));
$mail->addAddress($data['email'], $data['name']);
// Konten email
$mail->isHTML(true);
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
// Kirim email
$mail->send();
return true;
} catch (\Exception $e) {
dd($e);
return ($mail->ErrorInfo);
return false;
}
}
public static function sendEmailattachData($data = array())
{
// Buat instance PHPMailer
$mail = new PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = env('EMAIL');
$mail->Password = env('PW_EMAIL');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
// Penerima email
$mail->setFrom(env('EMAIL'), env('NAME_EMAIL'));
$mail->addAddress($data['email'], $data['name']);
// Konten email
$mail->isHTML(true);
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
$mail->addAttachment($data['attach'], 'e-card.pdf');
// Kirim email
$mail->send();
return true;
} catch (\Exception $e) {
dd($mail->ErrorInfo);
return ($mail->ErrorInfo);
return false;
}
}
public static function setCustomPHPIniSettings()
{
ini_set('max_execution_time', '-1'); // Waktu untuk execution suatu function atau script
ini_set('post_max_size', '32M'); // Batas post Yang di Upload
ini_set('upload_max_filesize', '10M'); // Batas File yang di Upload
ini_set('max_input_time ', '-1'); // Batas max time menunggu input max 5 menit
ini_set('memory_limit', '256M');
}
}

View File

@@ -261,6 +261,27 @@ class MembershipController extends Controller
return Helper::responseJson(data: MemberResource::make($member));
}
public function automaticLinking(Request $request)
{
$member = Member::query()
->when(in_array('email', $linkingRulesArr), function($q) use ($request) {
$q->where('email', $request->email);
})
->with([
'memberPlans' => function ($memberPlan) {
$memberPlan->latest();
},
])
->first();
if ($member) {
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
}
public function removeInsurance($email)
{
$user = User::where('sEmail', $email)->firstOrFail();

View File

@@ -2,7 +2,9 @@
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Auth;
class Authenticate extends Middleware
{
@@ -18,4 +20,13 @@ class Authenticate extends Middleware
return route('login');
}
}
public function handle($request, Closure $next, ...$guards)
{
if (Auth::guard('sanctum')->guest()) {
return response()->json(['error' => 'Bearer Authorization is required'], 401);
}
return parent::handle($request, $next, ...$guards);
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
$data = parent::toArray($request);
$data['claim_grouped_by_status'] = $this->claims->groupBy('status');
$data['total_claims'] = [
'draft' => count($data['claim_grouped_by_status']['draft'] ?? []),
'requested' => count($data['claim_grouped_by_status']['requested'] ?? []),
'received' => count($data['claim_grouped_by_status']['received'] ?? []),
'approved' => count($data['claim_grouped_by_status']['approved'] ?? []),
'paid' => count($data['claim_grouped_by_status']['paid'] ?? []),
'declined' => count($data['claim_grouped_by_status']['declined'] ?? [])
];
// $data = ['fuck' => 'you'];
return $data;
}
}

View File

@@ -3,8 +3,10 @@
namespace App\Http\Resources\OLDLMS;
use App\Services\ClaimService;
use App\Models\Corporate;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberResource extends JsonResource
{
/**
@@ -17,29 +19,21 @@ class MemberResource extends JsonResource
{
// $data = parent::toArray($request);
$currentMemberPlan = $this->memberPlans?->first();
$limitTelecon = $currentMemberPlan->plan->limit_telecon ?? null;
$limitTelecon = $this->totalUsage >= 6 ? null : $limitTelecon;
$data = [
'id' => $this->id,
'member_name' => $this->full_name,
'member_id' => $this->member_id,
'birth_date' => $this->birth_date,
'email' => $this->email,
'phone' => $this->person->phone ?? null,
'full_name' => $this->full_name,
'nric' => $this->nric,
'plan' => $currentMemberPlan ? [
'code' => $currentMemberPlan->plan->code ?? null,
'start' => $currentMemberPlan->start,
'end' => $currentMemberPlan->end,
'limit' => $this->currentPlan->limit_rules
] : null,
'policy_code' => $this->currentPolicy?->code ?? null,
'corporate' => [
'code' => $this->currentPolicy?->corporate->code ?? null,
'name' => $this->currentPolicy?->corporate->name,
'welcome_message' => $this->currentPolicy?->corporate->welcome_message,
'help_text' => $this->currentPolicy?->corporate?->help_text,
'avatar_url' => $this->currentpolicy?->corporate?->avatar_url
],
'limit_usage' => $this->totalUsage ?? null
'policy_holder' => $this->currentPolicy->corporate->name,
'policy_number' => $this->currentPolicy->code ?? null,
'date_of_birth' => $this->birth_date,
'gender' => $this->gender,
'start_date' => $this->members_effective_date,
'corporate_logo' => $_ENV['LMS_APP_STORAGE'] . $this->corporateLogo,
'valid_until' => $this->members_expire_date,
];
return $data;
}

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