diff --git a/.env b/.env new file mode 100644 index 000000000..d4e31d19a --- /dev/null +++ b/.env @@ -0,0 +1,10 @@ +DBDRIVER=mysql +MYSQLHOST=localhost +MYSQLUSER=root +MYSQLPASSWORD= +MYSQLDATABASE=mlite +MYSQLPORT=3306 +APPURL=http://localhost:8000/uploads +MULTIAPP= +MULTIAPP_REDIRECT= +DEV_MODE=false diff --git a/.gitignore b/.gitignore index f55cc9c0c..de38332b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +.trae/ config.php admin/tmp admin/pla.php @@ -7,11 +8,17 @@ websocket uploads vendor __vendor -systems/data/database.sdb +app_amati/ +systems/data/*.sdb webapps backup/ plugins/apotek_online plugins/simrsp +# plugins/mini_pacs/*.sh +# plugins/mini_pacs/*.json +# plugins/mini_pacs/worklist_monitor.php +# plugins/mini_pacs/receiver.php +# plugins/mini_pacs/systemd/* config.php themes/mlite systems/lib/jasperphp @@ -21,31 +28,49 @@ plugins/utd/www plugins/lisensi assets/easyui plugins/desktop -plugins/crud_generator +plugins/sia plugins/kasir plugins/dokter_radiologi plugins/dokter_ulun plugins/reg_periksa -plugins/khanza plugins/___siap_insulin plugins/siap_insulin plugins/pasien_galleries plugins/cssd +plugins/orthanc/docker jasperphp plugins/utd/Site.php plugins/utd/view/adonan.html websocket -plugins/khanza.zip plugins/website_ausy -plugins/khanza +plugins/rsgmgha +plugins/verifikasi_klaim plugins/pasien_galleries # plugins/log_antrian_taskid +mobile-react/node_modules +frontend-react/node_modules +frontend-react/dist +frontend-react/node_modules/* +frontend-react/dist/* -.env +#docker/ +docker/mysql* +docker/orthanc/orthanc-db/* +docker/orthanc/dummy-dicom/* +docker/.trae +docker/nginx/conf.d/* +docker/dns/dnsmasq.log +docker/www/* + +# .env logs/ config.php #workerman.php composer.lock backups themes/atilamedika +.vercel +api/ +docker/.env +mobile-react/node_modules/.package-lock.json \ No newline at end of file diff --git a/.htaccess b/.htaccess index 9728d1073..30c608345 100644 --- a/.htaccess +++ b/.htaccess @@ -2,7 +2,7 @@ Options -Indexes # Prevent visitors from viewing files directly - + Order allow,deny Deny from all diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..481ba9ccf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,25 @@ +# Changelog + +## [2026-04-07] + +### Added +- VClaim: Tambah alur pembaruan tanggal-pulang SEP (endpoint baru `updatetglplg2`) + modal UI `plugins/vclaim/view/admin/sep_pulang.html`. +- VClaim: Tambah endpoint `spridata` untuk mengambil detail SPRI berdasarkan `no_surat` (dipakai untuk memuat data ke form). +- VClaim: Tambah aksi Update/Delete SPRI dari form SPRI (menggunakan endpoint update & delete VClaim). +- VClaim: Tambah aksi Update/Delete Kontrol dari form Kontrol (menggunakan endpoint update & delete VClaim). +- VClaim: Tambah menu SEP Internal di menu. + +### Changed +- VClaim: Tambah tombol “Pulang” di riwayat SEP (ditampilkan untuk `jnsPelayanan == 1`) dan muat modal tanggal-pulang. +- VClaim: Perbaiki alur input SEP (isi otomatis No. MR dari data peserta, buat otomatis No. Rujukan saat kosong, dan izinkan klik No. SEP di riwayat untuk mengisi No. Rujukan). +- VClaim: Perbarui permintaan tanggal-pulang menggunakan HTTP `PUT` (bukan `DELETE`) dan terima nilai dari input. +- VClaim: Tingkatkan UX SPRI (tambah field No Surat + mode Update/Delete setelah memilih item, dan buat baris No Rawat bisa diklik untuk memuat data ke form). + +### Fixed +- VClaim: Perkuat penanganan pesan kesalahan saat respons BPJS null/tidak valid (fallback ke “Unknown error”). +- VClaim: Perbaiki kesalahan kecil dan pengutipan token sesi di beberapa URL AJAX (mis. label “Faskes” dan pengutipan token). + +## [2026-04-08] + +### Changed +- VClaim: Perubahan header dan body request pada aproval SEP \ No newline at end of file diff --git a/MLITE.postman_collection.json b/MLITE.postman_collection.json new file mode 100644 index 000000000..c0cead3d9 --- /dev/null +++ b/MLITE.postman_collection.json @@ -0,0 +1,7371 @@ +{ + "info": { + "name": "mLITE API", + "description": "Collection for mLITE API", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "Login", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "var jsonData = pm.response.json();", + "if (jsonData.token) {", + " pm.collectionVariables.set(\"token\", jsonData.token);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text", + "description": "API Key wajib disertakan untuk validasi akses Layer 1" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"{{username}}\",\n \"password\": \"{{password}}\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/login", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "login" + ] + }, + "description": "Mendapatkan Token JWT untuk Frontend/Mobile App. \n\nKeamanan Layer 1: Aplikasi diverifikasi via X-Api-Key.\nKeamanan Layer 2: End-User diverifikasi via Username & Password di body.\n(API Key bebas digunakan untuk meloginkan End-User mana saja sesuai tabel mlite_users)." + }, + "response": [] + }, + { + "name": "Dashboard", + "item": [ + { + "name": "Doctor Dashboard", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/dashboard/stats", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "dashboard", + "stats" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Pasien", + "item": [ + { + "name": "List Pasien", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/list?page={{page}}&per_page={{per_page}}&s={{s}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "list" + ], + "query": [ + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "per_page", + "value": "{{per_page}}" + }, + { + "key": "s", + "value": "{{s}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Pasien", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/show/{{no_rkm_medis}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "show", + "{{no_rkm_medis}}" + ] + } + }, + "response": [] + }, + { + "name": "Riwayat Perawatan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/riwayatperawatan/{{no_rkm_medis}}?no_rawat={{no_rawat}}&detail=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "riwayatperawatan", + "{{no_rkm_medis}}" + ], + "query": [ + { + "key": "no_rawat", + "value": "{{no_rawat}}" + }, + { + "key": "detail", + "value": "false" + } + ] + } + }, + "response": [] + }, + { + "name": "Create Pasien", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"nm_pasien\": \"Pasien Baru\",\n \"no_ktp\": \"1234567890123456\",\n \"jk\": \"L\",\n \"tgl_lahir\": \"1990-01-01\",\n \"alamat\": \"Jl. Contoh No. 1\",\n \"no_tlp\": \"08123456789\",\n \"kd_pj\": \"UMUM\",\n \"no_rkm_medis\": \"{{no_rkm_medis}}\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update Pasien", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"nm_pasien\": \"Pasien Update\",\n \"alamat\": \"Jl. Update No. 2\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/update/{{no_rkm_medis}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "update", + "{{no_rkm_medis}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Pasien", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/pasien/delete/{{no_rkm_medis}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "pasien", + "delete", + "{{no_rkm_medis}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Rawat Jalan", + "item": [ + { + "name": "List Rawat Jalan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/list?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Rawat Jalan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/show/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "show", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Rawat Jalan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rkm_medis\": \"000001\",\n \"kd_poli\": \"IGD\",\n \"kd_dokter\": \"D00001\",\n \"kd_pj\": \"UMU\",\n \"tgl_registrasi\": \"2025-01-01\",\n \"jam_reg\": \"08:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update Rawat Jalan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_poli\": \"POLI01\",\n \"kd_dokter\": \"D00002\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/update/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "update", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Rawat Jalan", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/delete/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "delete", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Show SOAP Rawat Jalan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/showsoap/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "showsoap", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save SOAP Rawat Jalan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"suhu_tubuh\": \"36.5\",\n \"tensi\": \"120/80\",\n \"nadi\": \"80\",\n \"respirasi\": \"20\",\n \"tinggi\": \"170\",\n \"berat\": \"60\",\n \"gcs\": \"E4V5M6\",\n \"keluhan\": \"Demam\",\n \"pemeriksaan\": \"Suhu badan tinggi\",\n \"alergi\": \"-\",\n \"lingkar_perut\": \"80\",\n \"rtl\": \"Istirahat\",\n \"penilaian\": \"Demam berdarah\",\n \"instruksi\": \"Minum obat\",\n \"evaluasi\": \"Baik\",\n \"nip\": \"D00001\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/savesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "savesoap" + ] + } + }, + "response": [] + }, + { + "name": "Delete SOAP Rawat Jalan", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deletesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deletesoap" + ] + } + }, + "response": [] + }, + { + "name": "Show Detail Rawat Jalan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/showdetail/tindakan/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "showdetail", + "tindakan", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Detail Rawat Jalan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"tindakan\",\n \"jml_tindakan\": \"1\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"T001\",\n \"provider\": \"rawat_jl_dr\",\n \"kode_provider\": \"D00001\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Delete Detail Rawat Jalan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"tindakan\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"T001\",\n \"provider\": \"rawat_jl_dr\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Save Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_penyakit\": \"A00.0\",\n \"status\": \"Ralan\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/savediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "savediagnosa" + ] + } + } + }, + { + "name": "Delete Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_penyakit\": \"A00.0\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deletediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deletediagnosa" + ] + } + } + }, + { + "name": "Save Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"status\": \"Ralan\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/saveprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "saveprosedur" + ] + } + } + }, + { + "name": "Delete Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deleteprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deleteprosedur" + ] + } + } + }, + { + "name": "Save Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/savecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "savecatatan" + ] + } + } + }, + { + "name": "Delete Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\",\n \"tanggal\": \"2025-01-01\",\n \"jam\": \"12:00:00\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deletecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deletecatatan" + ] + } + } + }, + { + "name": "Save Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/saveberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "saveberkas" + ] + } + } + }, + { + "name": "Delete Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deleteberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deleteberkas" + ] + } + } + }, + { + "name": "Save Resume", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"diagnosa_utama\": \"Demam Berdarah\",\n \"diagnosa_sekunder\": \"Tifus\",\n \"jalannya_penyakit\": \"Demam 3 hari...\",\n \"terapi\": \"Paracetamol 3x1\",\n \"kondisi_pulang\": \"Hidup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/saveresume", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "saveresume" + ] + } + } + }, + { + "name": "Delete Resume", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_dokter\": \"D001\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deleteresume", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deleteresume" + ] + } + } + }, + { + "name": "Save Rujukan Internal", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_poli\": \"P001\",\n \"kd_dokter\": \"D001\",\n \"catatan\": \"Mohon konsul bedah\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/saverujukaninternal", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "saverujukaninternal" + ] + } + } + }, + { + "name": "Delete Rujukan Internal", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_poli\": \"P001\",\n \"kd_dokter\": \"D001\",\n \"catatan\": \"Mohon konsul bedah\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deleterujukaninternal", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deleterujukaninternal" + ] + } + } + }, + { + "name": "Save Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/savelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "savelaporanoperasi" + ] + } + } + }, + { + "name": "Delete Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_jalan/deletelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_jalan", + "deletelaporanoperasi" + ] + } + } + } + ] + }, + { + "name": "Website", + "item": [ + { + "name": "List Website News", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/website/list?draw=1&start=0&length=10&search=", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "website", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Website News", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/website/show/{{news_id}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "website", + "show", + "{{news_id}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Website News", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"title\": \"Judul Berita API\",\n \"content\": \"Isi berita dari API\",\n \"intro\": \"Ringkasan berita\",\n \"status\": 2,\n \"comments\": 1,\n \"markdown\": 0,\n \"published_at\": \"2026-05-01 10:00:00\",\n \"tags\": [\"api\", \"website\"]\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/website/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "website", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update Website News", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"title\": \"Judul Berita API (Update)\",\n \"intro\": \"Ringkasan update\",\n \"status\": 2,\n \"tags\": [\"api\", \"update\"]\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/website/update/{{news_id}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "website", + "update", + "{{news_id}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Website News", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/website/delete/{{news_id}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "website", + "delete", + "{{news_id}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Presensi", + "item": [ + { + "name": "List Presensi", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/presensi/list", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "presensi", + "list" + ] + } + } + }, + { + "name": "Show Presensi", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/presensi/show?tanggal={{tanggal}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "presensi", + "show" + ], + "query": [ + { + "key": "tanggal", + "value": "{{tanggal}}" + } + ] + } + } + }, + { + "name": "Clock In", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"shift\": \"Pagi\",\n \"photo\": \"\",\n \"lat\": \"-6.200000\",\n \"lng\": \"106.816666\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/presensi/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "presensi", + "create" + ] + } + } + }, + { + "name": "Clock Out", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/presensi/update", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "presensi", + "update" + ] + } + } + }, + { + "name": "Delete Presensi", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"jam_datang\": \"2023-01-01 08:00:00\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/presensi/delete", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "presensi", + "delete" + ] + } + } + } + ] + }, + { + "name": "IGD", + "item": [ + { + "name": "List IGD", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/list?tgl_awal={{tgl_awal}}&tgl_akhir={{tgl_akhir}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Detail IGD", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/show/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "show", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Create IGD", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rkm_medis\": \"123456\",\n \"kd_poli\": \"IGD\",\n \"kd_dokter\": \"D001\",\n \"kd_pj\": \"A01\",\n \"tgl_registrasi\": \"2024-01-01\",\n \"jam_reg\": \"08:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update IGD", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"stts\": \"Sudah\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/update/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "update", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete IGD", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/delete/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "delete", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Show SOAP", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/showsoap/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "showsoap", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save SOAP", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2024-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"suhu_tubuh\": \"36.5\",\n \"tensi\": \"120/80\",\n \"nadi\": \"80\",\n \"respirasi\": \"20\",\n \"tinggi\": \"170\",\n \"berat\": \"65\",\n \"gcs\": \"E4V5M6\",\n \"keluhan\": \"Sakit kepala\",\n \"pemeriksaan\": \"Keadaan umum baik\",\n \"alergi\": \"-\",\n \"lingkar_perut\": \"-\",\n \"rtl\": \"Istirahat\",\n \"penilaian\": \"-\",\n \"instruksi\": \"-\",\n \"evaluasi\": \"-\",\n \"nip\": \"-\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savesoap" + ] + } + }, + "response": [] + }, + { + "name": "Delete SOAP", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2024-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletesoap" + ] + } + }, + "response": [] + }, + { + "name": "Show Tindakan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/showdetail/tindakan/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "showdetail", + "tindakan", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Tindakan", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"tindakan\",\n \"jml_tindakan\": \"1\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2024-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"kd_jenis_prw\": \"T001\",\n \"provider\": \"rawat_jl_dr\",\n \"kode_provider\": \"D001\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Delete Tindakan", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"provider\": \"rawat_jl_dr\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"T001\",\n \"tgl_perawatan\": \"2024-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Show Obat", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/igd/showdetail/obat/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "showdetail", + "obat", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Obat", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"obat\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2024-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"kd_jenis_prw\": \"OB001\",\n \"jml\": \"10\",\n \"aturan_pakai\": \"3x1\",\n \"kode_provider\": \"D001\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Delete Obat", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kode_brng\": \"OB001\",\n \"tgl_peresepan\": \"2024-01-01\",\n \"jam_peresepan\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Save Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_penyakit\": \"A00.1\",\n \"status\": \"Ralan\",\n \"prioritas\": \"1\",\n \"status_penyakit\": \"Lama\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savediagnosa" + ] + } + }, + "response": [] + }, + { + "name": "Delete Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_penyakit\": \"A00.1\",\n \"prioritas\": \"1\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletediagnosa" + ] + } + }, + "response": [] + }, + { + "name": "Save Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"status\": \"Ralan\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/saveprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "saveprosedur" + ] + } + } + }, + { + "name": "Delete Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deleteprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deleteprosedur" + ] + } + } + }, + { + "name": "Save Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savecatatan" + ] + } + } + }, + { + "name": "Delete Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\",\n \"tanggal\": \"2025-01-01\",\n \"jam\": \"12:00:00\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletecatatan" + ] + } + } + }, + { + "name": "Save Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/saveberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "saveberkas" + ] + } + } + }, + { + "name": "Delete Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deleteberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deleteberkas" + ] + } + } + }, + { + "name": "Save Resume", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"diagnosa_utama\": \"Demam Berdarah\",\n \"diagnosa_sekunder\": \"Tifus\",\n \"jalannya_penyakit\": \"Demam 3 hari...\",\n \"terapi\": \"Paracetamol 3x1\",\n \"kondisi_pulang\": \"Hidup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/saveresume", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "saveresume" + ] + } + } + }, + { + "name": "Save Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/savelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "savelaporanoperasi" + ] + } + } + }, + { + "name": "Delete Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/igd/deletelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "igd", + "deletelaporanoperasi" + ] + } + } + } + ] + }, + { + "name": "Rawat Inap", + "item": [ + { + "name": "List Rawat Inap", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/list?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Rawat Inap", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/show/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "show", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Rawat Inap", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_kamar\": \"K001\",\n \"kd_dokter\": \"D00001\",\n \"lama\": \"1\",\n \"diagnosa_awal\": \"Demam\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update Rawat Inap", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_kamar\": \"K002\",\n \"stts_pulang\": \"-\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/update/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "update", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Rawat Inap", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/delete/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "delete", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Detail Kamar Inap", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"tindakan\",\n \"jml_tindakan\": \"1\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"T001\",\n \"provider\": \"rawat_inap_dr\",\n \"kode_provider\": \"D00001\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Show Detail Kamar Inap", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/showdetail/tindakan/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "showdetail", + "tindakan", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Detail Kamar Inap", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"tindakan\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"T001\",\n \"provider\": \"rawat_inap_dr\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Show SOAP Kamar Inap", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/showsoap/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "showsoap", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save SOAP Kamar Inap", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2025-12-29\",\n \"jam_rawat\": \"18:30:00\",\n \"suhu_tubuh\": \"36\",\n \"tensi\": \"120/80\",\n \"nadi\": \"80\",\n \"respirasi\": \"20\",\n \"tinggi\": \"170\",\n \"berat\": \"60\",\n \"spo2\": \"98\",\n \"gcs\": \"12\",\n \"kesadaran\": \"Sopor\",\n \"keluhan\": \"Demam\",\n \"pemeriksaan\": \"Suhu badan tinggi\",\n \"alergi\": \"-\",\n \"rtl\": \"Istirahat\",\n \"instruksi\": \"Minum obat\",\n \"evaluasi\": \"Baik\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/savesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "savesoap" + ] + } + }, + "response": [] + }, + { + "name": "Delete SOAP Kamar Inap", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deletesoap", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deletesoap" + ] + } + }, + "response": [] + }, + { + "name": "Save Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_penyakit\": \"A00.0\",\n \"status\": \"Ranap\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/savediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "savediagnosa" + ] + } + } + }, + { + "name": "Delete Diagnosa", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kd_penyakit\": \"A00.0\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deletediagnosa", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deletediagnosa" + ] + } + } + }, + { + "name": "Save Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"status\": \"Ranap\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/saveprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "saveprosedur" + ] + } + } + }, + { + "name": "Delete Prosedur", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"kode\": \"89.01\",\n \"prioritas\": 1\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deleteprosedur", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deleteprosedur" + ] + } + } + }, + { + "name": "Save Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/savecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "savecatatan" + ] + } + } + }, + { + "name": "Delete Catatan", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"catatan\": \"Pasien perlu istirahat cukup\",\n \"tanggal\": \"2025-01-01\",\n \"jam\": \"12:00:00\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deletecatatan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deletecatatan" + ] + } + } + }, + { + "name": "Save Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/saveberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "saveberkas" + ] + } + } + }, + { + "name": "Delete Berkas", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"judul\": \"Hasil Lab Luar\",\n \"deskripsi\": \"http://link-to-file.com/file.pdf\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deleteberkas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deleteberkas" + ] + } + } + }, + { + "name": "Save Resume", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"diagnosa_utama\": \"Demam Berdarah\",\n \"diagnosa_sekunder\": \"Tifus\",\n \"jalannya_penyakit\": \"Demam 3 hari...\",\n \"terapi\": \"Paracetamol 3x1\",\n \"kondisi_pulang\": \"Hidup\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/saveresume", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "saveresume" + ] + } + } + }, + { + "name": "Save Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/savelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "savelaporanoperasi" + ] + } + } + }, + { + "name": "Delete Laporan Operasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"2023/01/01/000001\",\n \"tanggal\": \"2023-01-01\",\n \"jam\": \"10:00:00\",\n \"operator\": \"D001\",\n \"laporan\": \"Operasi berjalan lancar\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/admin/api/rawat_inap/deletelaporanoperasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "rawat_inap", + "deletelaporanoperasi" + ] + } + } + } + ] + }, + { + "name": "Laboratorium", + "item": [ + { + "name": "List Laboratorium", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/list?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Laboratorium", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/show/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "show", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rkm_medis\": \"000001\",\n \"tgl_registrasi\": \"2025-01-01\",\n \"jam_reg\": \"08:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/save", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "save" + ] + } + }, + "response": [] + }, + { + "name": "Update Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_dokter\": \"D00002\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/update/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "update", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Laboratorium", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/delete/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "delete", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Detail Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"laboratorium\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"PK0001\",\n \"jml_tindakan\": 1,\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"kode_provider\": \"D00001\",\n \"status\": \"Ralan\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Delete Detail Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"PK0001\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Show Detail Laboratorium", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/showdetail/{{status}}/{{no_rawat}}/{{noorder}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "showdetail", + "{{status}}", + "{{no_rawat}}", + "{{noorder}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Nilai Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_periksa\": \"2025-01-01\",\n \"jam\": \"10:00:00\",\n \"id_template\": \"1\",\n \"value\": \"Normal\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/savenilai", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "savenilai" + ] + } + }, + "response": [] + }, + { + "name": "Save Keterangan Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_periksa\": \"2025-01-01\",\n \"jam\": \"10:00:00\",\n \"id_template\": \"1\",\n \"value\": \"Catat tambahan\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/saveketerangan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "saveketerangan" + ] + } + }, + "response": [] + }, + { + "name": "Save Validasi Laboratorium", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"noorder\": \"PR0001\",\n \"tgl_permintaan\": \"2025-01-01\",\n \"jam_permintaan\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/laboratorium/savevalidasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "laboratorium", + "savevalidasi" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Radiologi", + "item": [ + { + "name": "List Radiologi", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/list?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Radiologi", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/show/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "show", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rkm_medis\": \"000001\",\n \"tgl_registrasi\": \"2025-01-01\",\n \"jam_reg\": \"08:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/save", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "save" + ] + } + }, + "response": [] + }, + { + "name": "Update Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_dokter\": \"D00002\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/update/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "update", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Radiologi", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/delete/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "delete", + "{{no_rawat}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Detail Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kat\": \"radiologi\",\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"PR0001\",\n \"jml_tindakan\": 1,\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\",\n \"kode_provider\": \"D00001\",\n \"status\": \"Ralan\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/savedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "savedetail" + ] + } + }, + "response": [] + }, + { + "name": "Delete Detail Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"kd_jenis_prw\": \"PR0001\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/deletedetail", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "deletedetail" + ] + } + }, + "response": [] + }, + { + "name": "Show Detail Radiologi", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/showdetail/{{status}}/{{no_rawat}}/{{noorder}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "showdetail", + "{{status}}", + "{{no_rawat}}", + "{{noorder}}" + ] + } + }, + "response": [] + }, + { + "name": "Save Hasil Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_periksa\": \"2025-01-01\",\n \"jam\": \"10:00:00\",\n \"hasil\": \"Tampak normal batas jantung dan paru\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/savehasil", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "savehasil" + ] + } + }, + "response": [] + }, + { + "name": "Delete Hasil Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"tgl_perawatan\": \"2025-01-01\",\n \"jam_rawat\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/deletehasil", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "deletehasil" + ] + } + }, + "response": [] + }, + { + "name": "Save Validasi Radiologi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"noorder\": \"PR0001\",\n \"tgl_permintaan\": \"2025-01-01\",\n \"jam_permintaan\": \"10:00:00\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/radiologi/savevalidasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "radiologi", + "savevalidasi" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Vedika", + "item": [ + { + "name": "List Vedika", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/list?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31&type=ralan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "list" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "type", + "value": "ralan", + "description": "ralan / ranap" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "List Vedika Lengkap", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/lengkap?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31&type=ralan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "lengkap" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "type", + "value": "ralan", + "description": "ralan / ranap" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "List Vedika Pengajuan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/pengajuan?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31&type=ralan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "pengajuan" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "type", + "value": "ralan", + "description": "ralan / ranap" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "List Vedika Perbaikan", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/perbaikan?draw=1&start=0&length=10&tgl_awal=2025-01-01&tgl_akhir=2025-12-31&type=ralan", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "perbaikan" + ], + "query": [ + { + "key": "draw", + "value": "1" + }, + { + "key": "start", + "value": "0" + }, + { + "key": "length", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2025-01-01" + }, + { + "key": "tgl_akhir", + "value": "2025-12-31" + }, + { + "key": "type", + "value": "ralan", + "description": "ralan / ranap" + }, + { + "key": "search", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Vedika", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/show/{{nosep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "show", + "{{nosep}}" + ] + } + }, + "response": [] + }, + { + "name": "Create Vedika", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"nosep\": \"00001\",\n \"no_rawat\": \"2023/01/01/000001\",\n \"no_rkm_medis\": \"000001\",\n \"catatan\": \"Berkas lengkap\",\n \"status\": \"Verifikasi\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/create", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "create" + ] + } + }, + "response": [] + }, + { + "name": "Update Vedika", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"catatan\": \"Revisi berkas\",\n \"status\": \"Pending\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/update/{{nosep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "update", + "{{nosep}}" + ] + } + }, + "response": [] + }, + { + "name": "Delete Vedika", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/vedika/delete/{{nosep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "vedika", + "delete", + "{{nosep}}" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Master", + "description": "\n\n#### Modul Master menyediakan endpoint list/simpan/hapus data master.\n\n### Endpoint\n- **List Data (GET)**: `{{baseUrl}}/admin/api/master/list/{table}`\n- **Simpan Data (POST)**: `{{baseUrl}}/admin/api/master/save/{table}`\n- **Hapus Data (DELETE)**: `{{baseUrl}}/admin/api/master/delete/{table}`\n\n### Perilaku Endpoint\n- `list/{table}`: bersifat generic untuk tabel yang ada di database (kecuali tabel sensitif yang diblokir).\n- `save/{table}` dan `delete/{table}`: hanya bisa untuk tabel yang sudah terdaftar handler-nya di modul `plugins/master`.\n- Jika tabel belum didukung handler, API mengembalikan: `Table not allowed or not found`.\n\n### Parameter Pencarian (GET)\n- `page`: Nomor halaman (default: 1)\n- `per_page`: Jumlah record per halaman (default: 10)\n- `s`: Kata kunci pencarian (string)\n- `col`: Nama kolom spesifik untuk pencarian (opsional)\n\n### Catatan Keamanan\n- Tabel sensitif seperti `mlite_api_key` diblokir.\n\n### Contoh `{table}`\n- Data dasar: `dokter`, `petugas`, `poliklinik`, `bangsal`, `kamar`, `databarang`\n- Layanan: `jns_perawatan`, `jns_perawatan_inap`, `jns_perawatan_lab`, `jns_perawatan_radiologi`\n- Biodata: `bahasa`, `suku_bangsa`, `cacat_fisik`, `pendidikan`, `personal_pasien`\n- Diagnosis/prosedur: `penyakit` (ICD-10), `icd9` (ICD-9)", + "item": [ + { + "name": "List Master Data", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/master/list/dokter?page={{page}}&per_page={{per_page}}&s={{s}}&col=", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "master", + "list", + "dokter" + ], + "query": [ + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "per_page", + "value": "{{per_page}}" + }, + { + "key": "s", + "value": "{{s}}" + }, + { + "key": "col", + "value": "" + } + ] + } + }, + "response": [] + }, + { + "name": "Create Master Data", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_dokter\": \"D00001\",\n \"nm_dokter\": \"Dr. Contoh\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/master/save/dokter", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "master", + "save", + "dokter" + ] + } + }, + "response": [] + }, + { + "name": "Delete Master Data", + "request": { + "method": "DELETE", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"kd_dokter\": \"D00001\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/master/delete/dokter", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "master", + "delete", + "dokter" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Apotek Ralan", + "item": [ + { + "name": "Resep List", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/reseplist?page={{page}}&per_page={{per_page}}&s={{s}}&tgl_awal={{tgl_awal}}&tgl_akhir={{tgl_akhir}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "reseplist" + ], + "query": [ + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "per_page", + "value": "{{per_page}}" + }, + { + "key": "s", + "value": "{{s}}" + }, + { + "key": "tgl_awal", + "value": "{{tgl_awal}}" + }, + { + "key": "tgl_akhir", + "value": "{{tgl_akhir}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Detail", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/showdetail/{{category}}/{{no_rawat}}?no_resep={{no_resep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "showdetail", + "{{category}}", + "{{no_rawat}}" + ], + "query": [ + { + "key": "no_resep", + "value": "{{no_resep}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validasi Resep", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/validasi/{{no_rawat}}?no_resep={{no_resep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "validasi", + "{{no_rawat}}" + ], + "query": [ + { + "key": "no_resep", + "value": "{{no_resep}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Save Validasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"no_resep\": \"{{no_resep}}\",\n \"jumlah\": {},\n \"aturan_pakai\": {}\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/savevalidasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "savevalidasi" + ] + } + }, + "response": [] + }, + { + "name": "Simpan Obat Resep", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_resep\": \"{{no_resep}}\",\n \"kode_brng\": \"{{kode_brng}}\",\n \"jml\": \"10\",\n \"aturan_pakai\": \"3x1\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/simpanobatresep", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "simpanobatresep" + ] + } + }, + "response": [] + }, + { + "name": "Simpan Racikan Resep", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_resep\": \"{{no_resep}}\",\n \"no_racik\": \"1\",\n \"nama_racik\": \"Racikan 1\",\n \"kd_racik\": \"R01\",\n \"jml_dr\": \"10\",\n \"aturan_pakai\": \"3x1\",\n \"keterangan\": \"-\",\n \"items\": [\n {\n \"kode_brng\": \"B01\",\n \"kandungan\": \"10mg\",\n \"jml\": \"5\"\n }\n ]\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ralan/simpanracikanresep", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ralan", + "simpanracikanresep" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Apotek Ranap", + "item": [ + { + "name": "Resep List", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/reseplist?page={{page}}&per_page={{per_page}}&s={{s}}&tgl_awal={{tgl_awal}}&tgl_akhir={{tgl_akhir}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "reseplist" + ], + "query": [ + { + "key": "page", + "value": "{{page}}" + }, + { + "key": "per_page", + "value": "{{per_page}}" + }, + { + "key": "s", + "value": "{{s}}" + }, + { + "key": "tgl_awal", + "value": "{{tgl_awal}}" + }, + { + "key": "tgl_akhir", + "value": "{{tgl_akhir}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Show Detail", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/showdetail/{{category}}/{{no_rawat}}?no_resep={{no_resep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "showdetail", + "{{category}}", + "{{no_rawat}}" + ], + "query": [ + { + "key": "no_resep", + "value": "{{no_resep}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Validasi Resep", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/validasi/{{no_rawat}}?no_resep={{no_resep}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "validasi", + "{{no_rawat}}" + ], + "query": [ + { + "key": "no_resep", + "value": "{{no_resep}}" + } + ] + } + }, + "response": [] + }, + { + "name": "Save Validasi", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_rawat\": \"{{no_rawat}}\",\n \"no_resep\": \"{{no_resep}}\",\n \"jumlah\": {},\n \"aturan_pakai\": {}\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/savevalidasi", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "savevalidasi" + ] + } + }, + "response": [] + }, + { + "name": "Simpan Obat Resep", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_resep\": \"{{no_resep}}\",\n \"kode_brng\": \"{{kode_brng}}\",\n \"jml\": \"10\",\n \"aturan_pakai\": \"3x1\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/simpanobatresep", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "simpanobatresep" + ] + } + }, + "response": [] + }, + { + "name": "Simpan Racikan Resep", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"no_resep\": \"{{no_resep}}\",\n \"no_racik\": \"1\",\n \"nama_racik\": \"Racikan 1\",\n \"kd_racik\": \"R01\",\n \"jml_dr\": \"10\",\n \"aturan_pakai\": \"3x1\",\n \"keterangan\": \"-\",\n \"items\": [\n {\n \"kode_brng\": \"B01\",\n \"kandungan\": \"10mg\",\n \"jml\": \"5\"\n }\n ]\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/apotek_ranap/simpanracikanresep", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "apotek_ranap", + "simpanracikanresep" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Kasir", + "item": [ + { + "name": "Billing List (Rawat Jalan)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_jalan/billinglist?page=1&per_page=10&tgl_awal=2024-01-01&tgl_akhir=2024-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_jalan", + "billinglist" + ], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "per_page", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2024-01-01" + }, + { + "key": "tgl_akhir", + "value": "2024-12-31" + } + ] + } + } + }, + { + "name": "Billing Detail (Rawat Jalan)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_jalan/billingdetail/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_jalan", + "billingdetail", + "{{no_rawat}}" + ] + } + } + }, + { + "name": "Billing (Rawat Jalan)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_jalan/billing/{{no_rawat}}?all=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_jalan", + "billing", + "{{no_rawat}}" + ], + "query": [ + { + "key": "all", + "value": "false", + "description": "true/false" + } + ] + } + } + }, + { + "name": "Billing List (Rawat Inap)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_inap/billinglist?page=1&per_page=10&tgl_awal=2024-01-01&tgl_akhir=2024-12-31", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_inap", + "billinglist" + ], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "per_page", + "value": "10" + }, + { + "key": "tgl_awal", + "value": "2024-01-01" + }, + { + "key": "tgl_akhir", + "value": "2024-12-31" + } + ] + } + } + }, + { + "name": "Billing Detail (Rawat Inap)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_inap/billingdetail/{{no_rawat}}", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_inap", + "billingdetail", + "2024/01/01/000001" + ] + } + } + }, + { + "name": "Billing (Rawat Inap)", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + }, + { + "key": "X-Username-Permission", + "value": "{{username_permission}}", + "type": "text" + }, + { + "key": "X-Password-Permission", + "value": "{{password_permission}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/kasir_rawat_inap/billing/{{no_rawat}}?all=false", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "kasir_rawat_inap", + "billing", + "{{no_rawat}}" + ], + "query": [ + { + "key": "all", + "value": "false", + "description": "true/false" + } + ] + } + } + } + ] + }, + { + "name": "Users", + "item": [ + { + "name": "Save User", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"username\": \"testuser\",\n \"fullname\": \"Test User\",\n \"password\": \"password123\",\n \"email\": \"test@example.com\",\n \"role\": \"staff\",\n \"cap\": \"ANG,APT\",\n \"access\": \"pasien,rawat_jalan\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/users/save", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "users", + "save" + ] + } + }, + "response": [] + }, + { + "name": "Delete User", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"id\": \"3\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/users/delete", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "users", + "delete" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Settings", + "item": [ + { + "name": "Get Settings", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/settings/settings", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "settings", + "settings" + ] + } + }, + "response": [] + }, + { + "name": "Save Settings", + "request": { + "method": "POST", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}", + "type": "text" + }, + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"nama_instansi\": \"RS Baru\",\n \"alamat\": \"Jl. Baru No. 1\"\n}" + }, + "url": { + "raw": "{{baseUrl}}/admin/api/settings/saveSettings", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "admin", + "api", + "settings", + "saveSettings" + ] + } + }, + "response": [] + } + ] + }, + { + "name": "Mini PACS", + "item": [ + { + "name": "Study List", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/mini_pacs/studylist?page=1&per_page=10&s=" + } + } + }, + { + "name": "Study Detail", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/mini_pacs/studydetail/{{study_id}}" + } + } + }, + { + "name": "Series Detail", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/mini_pacs/seriesdetail/{{series_id}}" + } + } + }, + { + "name": "Download DICOM", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/mini_pacs/instancedicom/{{instance_id}}" + } + } + }, + { + "name": "Get Thumbnail", + "request": { + "method": "GET", + "header": [ + { + "key": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "key": "Authorization", + "value": "Bearer {{token}}" + } + ], + "url": { + "raw": "{{baseUrl}}/admin/api/mini_pacs/instancejpg/{{instance_id}}" + } + } + } + ] + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "https://mlite.up.railway.app", + "type": "string" + }, + { + "key": "apiKey", + "value": "YOUR_API_KEY_HERE", + "type": "string" + }, + { + "key": "username", + "value": "admin", + "type": "string" + }, + { + "key": "password", + "value": "admin", + "type": "string" + }, + { + "key": "token", + "value": "", + "type": "string" + }, + { + "key": "s", + "value": "", + "type": "string" + }, + { + "key": "page", + "value": "1", + "type": "string" + }, + { + "key": "per_page", + "value": "10", + "type": "string" + }, + { + "key": "no_rkm_medis", + "value": "000001", + "type": "string" + }, + { + "key": "no_rawat", + "value": "", + "type": "string" + }, + { + "key": "username_permission", + "value": "DR001", + "type": "string" + }, + { + "key": "password_permission", + "value": "12345678", + "type": "string" + }, + { + "key": "tgl_awal", + "value": "2025-01-01", + "type": "string" + }, + { + "key": "tgl_akhir", + "value": "2027-01-01", + "type": "string" + } + ] +} diff --git a/README.md b/README.md index b448426c1..58a1938be 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Codename: Ataaka
+ Codename: Sabrina

# mLITE @@ -12,73 +12,93 @@ Panel kontrol dan tampilan default sepenuhnya responsif, yang membuatnya dapat d Masih banyak fitur-fitur tersembunyi untuk kebutuhan pengembangan. Silahkan jelajahi!! - -Kebutuhan Sistem ----------------- +## Kebutuhan Sistem Persyaratan sistem untuk mLITE sangat sederhana, sehingga setiap server modern sudah cukup. Berikut persyaratan minimal yang diperlukan -+ Apache 2.2+ dengan `mod_rewrite` atau Nginx -+ PHP versi 7.0 - 8.1 -+ MySQL atau MariaDB +- Apache 2.2+ dengan `mod_rewrite` atau Nginx +- PHP versi 7.4 - 8.3+ +- MySQL atau MariaDB Konfigurasi PHP harus memiliki ekstensi berikut: -+ dom -+ gd -+ mbstring -+ pdo -+ zip -+ cURL +- dom +- gd +- mbstring +- pdo +- zip +- cURL -Pemasangan ----------- +## Pemasangan ### Pemasangan menggunakan composer. + 1. Install composer di server/PC dan jalankan perintah composer untuk pemasangan paket utama dan independensi ``` $ composer create-project basoro/mlite ``` -2. Buat folder `uploads`, `tmp/` dan `admin/tmp`. Beberapa server mungkin memerlukan izin tambahan `chmod 777` untuk direktori dan file tersebut. - -3. Sesuaikan pengaturan di config.php - +1. Buat folder `uploads`, `tmp/` dan `admin/tmp`. Beberapa server mungkin memerlukan izin tambahan `chmod 777` untuk direktori dan file tersebut. +2. Sesuaikan pengaturan di .env +3. Buat database baru di MySQL/MariaDB dan import file `mlite_db.sql` 4. Buka browser Anda dan navigasikan ke alamat tempat file mLITE berada. - 5. Silahkan login dengan Username: admin dan Password: admin ### Pemasangan Manual -1. Unduh versi terbaru [mLITE] (https://github.com/basoro/mlite). - -2. Ekstrak semua file dari paket terkompresi dan kemudian transfer ke direktori lokal atau server. Biasanya, file diunggah ke `www`,` htdocs` atau `public_html`. +1. Unduh versi terbaru \[mLITE] (). +2. Ekstrak semua file dari paket terkompresi dan kemudian transfer ke direktori lokal atau server. Biasanya, file diunggah ke `www`, ` htdocs` atau `public_html`. 3. Install composer di server/PC dan jalankan perintah composer untuk pemasangan independensi + ``` $ composer install ``` -4. Buat folder `uploads`, `tmp/` dan `admin/tmp`. Beberapa server mungkin memerlukan izin tambahan `chmod 777` untuk direktori dan file tersebut. +1. Buat folder `uploads`, `tmp/` dan `admin/tmp`. Beberapa server mungkin memerlukan izin tambahan `chmod 777` untuk direktori dan file tersebut. +2. Sesuaikan pengaturan di .env +3. Buat database baru di MySQL/MariaDB dan import file `mlite_db.sql` (tambahkan sql-mode = '' pada my.cnf atau jalankan perintah berikut) + +``` +$ sed -i "/user=mysql/a sql-mode = ''" /etc/my.cnf +``` + +1. Buka browser Anda dan navigasikan ke alamat tempat file mLITE berada. +2. Silahkan login dengan Username: admin dan Password: admin + +### Pemasangan menggunakan docker. + +1. Download file release terbaru \[mLITE] atau lakukan git clone. + +``` +$ git clone https://github.com/basoro/mlite.git +``` + +Sesuaikan environment variable di .env seperti port APP dan MySQL dari default ke port yang anda inginkan (atau biarkan defautl saja). -5. Sesuaikan pengaturan di config.php +1. Jalankan perintah docker-compose -6. Buka browser Anda dan navigasikan ke alamat tempat file mLITE berada. +``` +$ cd mlite/docker && docker-compose build && docker-compose up -d +``` + +1. Buka browser Anda dan navigasikan ke alamat URL\_ADDRESS:8088. +2. Silahkan login dengan Username: admin dan Password: admin -7. Silahkan login dengan Username: admin dan Password: admin +## Catatan: -#### Catatan: Untuk setiap kali update, silahkan jalankan perintah + ``` $ composer update ``` -Ini untuk menambahkan dependensi baru pada aplikasi +Ini untuk menambahkan dependensi baru pada aplikasi -### Peringatan! +## Peringatan! -+ Untuk pengguna Apache, pastikan file `.htaccess` juga ada di server. Tanpanya mLITE tidak akan berfungsi. -+ Untuk pengguna Nginx, tambahkan konfigurasi berikut di pengaturan nginx.conf (atau sejenisnya) +- Untuk pengguna Apache, pastikan file `.htaccess` juga ada di server. Tanpanya mLITE tidak akan berfungsi. +- Untuk pengguna Nginx, tambahkan konfigurasi berikut di pengaturan nginx.conf (atau sejenisnya) ```bash location / { @@ -93,6 +113,11 @@ location ^~ /systems/data/ { return 403; } +location ~* \.(sdb|txt|env|md)$ { + deny all; + return 403; +} + location /admin { index index.php; try_files $uri $uri/ /admin/index.php?$args; @@ -114,6 +139,11 @@ location ^~ /lite/systems/data/ { return 403; } +location ~* \.(sdb|txt|env|md)$ { + deny all; + return 403; +} + location /lite/admin { index index.php; try_files $uri $uri/ /lite/admin/index.php?$args; @@ -121,8 +151,11 @@ location /lite/admin { ``` Untuk masuk ke panel administrasi, tambahkan `/admin/` di akhir URL. + #### Login: `admin` Kata sandi: `admin` + Ini harus diubah segera setelah login untuk alasan keamanan. Juga dapat mengganti nama direktori dengan panel administrasi. (Anda perlu mengubahnya pada `config.php`) ## Demo -Demo dan Info lebih lanjut di https://mlite.id + +Untuk Demo dan Info lebih lanjut di diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..034e84803 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/admin/index.php b/admin/index.php index 903da2953..5ccd2ce51 100644 --- a/admin/index.php +++ b/admin/index.php @@ -1,67 +1,392 @@ 0) + ob_end_clean(); + http_response_code(200); + exit; + } + + // Handle HTTPS forwarding with strict comparison + if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { + $_SERVER['HTTPS'] = 'on'; + } + if (!defined('BASE_DIR')) { + define('BASE_DIR', __DIR__ . '/..'); + } + require_once('../config.php'); + + // if (!file_exists(BASE_DIR . '/.env')) { + // header('Location: /install.php'); + // exit; + // } -require_once('../systems/lib/Autoloader.php'); -//ob_start(base64_decode('XFN5c3RlbXNcTWFpbjo6dmVyaWZ5TGljZW5zZQ==')); + if (DEV_MODE) { + error_reporting(E_ALL); + ini_set('display_errors', '1'); + } else { + error_reporting(0); + ini_set('display_errors', '0'); + } + + require_once('../systems/lib/Autoloader.php'); + //ob_start(base64_decode('XFN5c3RlbXNcTWFpbjo6dmVyaWZ5TGljZW5zZQ==')); + + $core = new Systems\Admin; + + // Register API routes available regardless of login state + $core->router->set('api/login', function () use ($core) { + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $apiUser = $core->checkAuth('POST'); + $input = json_decode(file_get_contents('php://input'), true); + $username = $input['username'] ?? $_POST['username'] ?? ''; + $password = $input['password'] ?? $_POST['password'] ?? ''; + + $user = $core->db('mlite_users')->where('username', $username)->oneArray(); + if ($user && password_verify($password, $user['password'])) { + $payload = [ + 'iss' => url(), + 'sub' => $user['id'], + 'username' => $user['username'] + ]; + $token = \Systems\Lib\Jwt::encode($payload, JWT_SECRET); + header('Content-Type: application/json'); + echo json_encode([ + 'token' => $token, + 'fullname' => htmlspecialchars($user['fullname'] ?? $user['username'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') + ]); + } else { + header('Content-Type: application/json'); + http_response_code(401); + echo json_encode(['error' => 'Invalid credentials']); + } + exit; + } + }); -$core = new Systems\Admin; + $core->router->set('api/(:str)/(:str)(:any)', function ($module, $method, $params) use ($core) { + // 1. Verifikasi kredensial aplikasi klien via API Key atau Sesi + $apiUser = $core->checkAuth(strtoupper($_SERVER['REQUEST_METHOD'])); -if ($core->loginCheck()) { - $core->loadModules(); + $token = null; + if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Bearer\s(\S+)/', $_SERVER['HTTP_AUTHORIZATION'], $m)) { + $token = $m[1]; + } elseif (function_exists('getallheaders')) { + $headers = getallheaders(); + $auth = $headers['Authorization'] ?? $headers['authorization'] ?? null; + if ($auth && preg_match('/Bearer\s(\S+)/', $auth, $m)) { + $token = $m[1]; + } + } + $payload = $token ? \Systems\Lib\Jwt::verify($token, JWT_SECRET) : false; + $loggedIn = $core->loginCheck(); - $core->router->set('(:str)/(:str)(:any)', function ($module, $method, $params) use ($core) { - $core->createNav($module, $method); - if ($params) { - $core->loadModule($module, $method, explode('/', trim($params, '/'))); + $core->loadModules(); + $moduleObj = $core->module->{$module}; + if (!$moduleObj) { + header('Content-Type: application/json'); + http_response_code(404); + echo json_encode(['error' => 'Module not found']); + exit; + } + $access = 'all'; + if ($loggedIn) { + $access = $core->getUserInfo('access'); + } elseif ($payload) { + $uid = $payload['sub'] ?? 0; + $urow = $core->db('mlite_users')->where('id', $uid)->oneArray(); + $access = $urow['access'] ?? ''; + } else { + $urow = $core->db('mlite_users')->where('username', $apiUser)->oneArray(); + $access = $urow['access'] ?? ''; + } + if (!($access == 'all' || in_array($module, explode(',', (string) $access)))) { + header('Content-Type: application/json'); + http_response_code(403); + echo json_encode(['error' => 'Forbidden']); + exit; + } + $args = $params ? explode('/', trim($params, '/')) : []; + $apiMethod = 'api' . ucfirst($method); + $anyMethod = 'any' . ucfirst($method); + $httpMethod = strtolower($_SERVER['REQUEST_METHOD']) . ucfirst($method); + if (method_exists($moduleObj, $apiMethod)) { + $result = $moduleObj->{$apiMethod}(...array_values($args)); + } elseif (method_exists($moduleObj, $httpMethod)) { + $result = $moduleObj->{$httpMethod}(...array_values($args)); + } elseif (method_exists($moduleObj, $anyMethod)) { + $result = $moduleObj->{$anyMethod}(...array_values($args)); } else { - $core->loadModule($module, $method); + header('Content-Type: application/json'); + http_response_code(404); + echo json_encode(['error' => 'Method not found']); + exit; } + header('Content-Type: application/json'); + if (is_array($result) || is_object($result)) { + echo json_encode($result); + } else { + echo json_encode(['data' => $result]); + } + exit; }); - $core->router->execute(); - $core->drawTheme('index.html'); - $core->module->finishLoop(); -} else { - if (isset($_POST['login'])) { - if ($core->login($_POST['username'], $_POST['password'], isset($_POST['remember_me']))) { - if (count($arrayURL = parseURL()) > 1) { - $url = array_merge([ADMIN], $arrayURL); - redirect(url($url)); + // Execute API route early if requested + $__path = $core->router->execute(true); + + // daftar API yang TIDAK lewat API umum + $excludedApiPrefixes = [ + 'api/manage', + 'api/notifikasi', + 'api/settingsapam', + 'api/paymentduitku', + 'api/settingskey', + 'api/saveSettingsApam', + 'api/saveSettingsKey', + ]; + + $skipApi = false; + foreach ($excludedApiPrefixes as $prefix) { + if (strpos($__path, $prefix) === 0) { + $skipApi = true; + break; + } + } + + if (!$skipApi && strpos($__path, 'api/') === 0) { + $core->router->execute(); + return; + } + + + if ($core->loginCheck()) { + $core->loadModules(); + + $core->router->set('(:str)/(:str)(:any)', function ($module, $method, $params) use ($core) { + $core->createNav($module, $method); + if ($params) { + $core->loadModule($module, $method, explode('/', trim($params, '/'))); + } else { + $core->loadModule($module, $method); } - if(MULTI_APP) { - if(!empty(MULTI_APP_REDIRECT)) { - redirect(url([ADMIN, MULTI_APP_REDIRECT, 'main'])); + }); + + $core->router->execute(); + $core->drawTheme('index.html'); + $core->module->finishLoop(); + } else { + if (isset($_GET['cancel_otp'])) { + unset($_SESSION['mlite_otp_pending']); + unset($_SESSION['mlite_otp_user_id']); + unset($_SESSION['mlite_otp_remember_me']); + redirect(url([ADMIN])); + } + + if (isset($_POST['verify_otp']) && isset($_SESSION['mlite_otp_pending'])) { + $otp_code = trim($_POST['otp_code'] ?? ''); + $uid = $_SESSION['mlite_otp_user_id'] ?? 0; + $userRow = $core->db('mlite_users')->where('id', $uid)->oneArray(); + + if ($userRow && $userRow['otp_code'] === $otp_code && strtotime($userRow['otp_expires']) >= time()) { + // OTP Valid + unset($_SESSION['mlite_otp_pending']); + unset($_SESSION['mlite_otp_user_id']); + + $_SESSION['mlite_user']= $userRow['id']; + $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(6)); + $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT']; + $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR']; + + if (isset($_SESSION['mlite_otp_remember_me'])) { + $token = str_gen(64, "1234567890qwertyuiop[]asdfghjkl;zxcvbnm,./"); + $isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') + || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower((string) $_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https'); + $core->db('mlite_remember_me')->save(['user_id' => $userRow['id'], 'token' => $token, 'expiry' => time()+60*60*24*30]); + setcookie('mlite_remember', $userRow['id'] . ':' . $token, [ + 'expires' => time() + 60 * 60 * 24 * 365, + 'path' => '/', + 'secure' => $isHttps, + 'httponly' => true, + 'samesite' => 'Lax', + ]); + unset($_SESSION['mlite_otp_remember_me']); + } + + $arrayURL = parseURL(); + if ($arrayURL && count($arrayURL) > 1) { + $url = array_merge([ADMIN], $arrayURL); + redirect(url($url)); + } + if (!empty($_SESSION['mlite_force_change'])) { + redirect(url([ADMIN, 'profil', 'ganti_pass'])); + } + if (MULTI_APP) { + if (!empty(MULTI_APP_REDIRECT)) { + redirect(url([ADMIN, MULTI_APP_REDIRECT, 'main'])); + } else { + redirect(url([ADMIN, 'dashboard', 'main'])); + } } else { redirect(url([ADMIN, 'dashboard', 'main'])); } } else { - redirect(url([ADMIN, 'dashboard', 'main'])); + $core->setNotify('failure', 'Kode OTP tidak valid atau telah kedaluwarsa.'); } } + + if (isset($_POST['login'])) { + if ($core->login($_POST['username'], $_POST['password'], isset($_POST['remember_me']))) { + if (isset($_SESSION['mlite_otp_pending'])) { + $core->setNotify('success', 'Harap masukkan 6-digit kode OTP yang telah dikirim ke WhatsApp Anda.'); + } else { + $arrayURL = parseURL(); + if ($arrayURL && count($arrayURL) > 1) { + $url = array_merge([ADMIN], $arrayURL); + redirect(url($url)); + } + if (!empty($_SESSION['mlite_force_change'])) { + redirect(url([ADMIN, 'profil', 'ganti_pass'])); + } + if (MULTI_APP) { + if (!empty(MULTI_APP_REDIRECT)) { + redirect(url([ADMIN, MULTI_APP_REDIRECT, 'main'])); + } else { + redirect(url([ADMIN, 'dashboard', 'main'])); + } + } else { + redirect(url([ADMIN, 'dashboard', 'main'])); + } + } + } + } + if (MULTI_APP) { + if (!empty(MULTI_APP_REDIRECT)) { + echo $core->tpl->draw(MODULES . '/' . MULTI_APP_REDIRECT . '/view/login.html', true); + } else { + $core->drawTheme('login.html'); + } + } else { + $core->drawTheme('login.html'); + } + } - if(MULTI_APP) { - if(!empty(MULTI_APP_REDIRECT)) { - echo $core->tpl->draw(MODULES.'/'.MULTI_APP_REDIRECT.'/view/login.html', true); - } else { - $core->drawTheme('login.html'); - } + +} catch (Throwable $e) { + // Tangkap khusus error ketidakadaan tabel untuk tidak di redirect melainkan dimunculkan sebagai notifikasi + $errMsg = $e->getMessage(); + $isMissingTable = (strpos($errMsg, 'Base table or view not found') !== false || strpos($errMsg, 'no such table') !== false || strpos($errMsg, 'Unknown database') !== false); + + // Check if this is an AJAX request expecting JSON + $isAjaxRequest = ( + (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest') || + (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) || + (isset($_SERVER['CONTENT_TYPE']) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) + ); + + if ($isAjaxRequest) { + $error = 'Database connection failed'; + $message = 'Please check database configuration and ensure MySQL server is running'; + $debug = []; + + if ($isMissingTable) { + $error = 'Table / Database Not Found'; + $message = $errMsg; + } elseif ($e->getCode() == 23000) { + $message = $e->getMessage(); + } + + if (defined('DEV_MODE') && DEV_MODE) { + $error = 'System Error'; + $message = $e->getMessage(); + $debug = [ + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'trace' => explode("\n", $e->getTraceAsString()) + ]; + } + + // Return HTML error response for AJAX requests (e.g. for modal content or alerts) + header('Content-Type: text/html'); + $debug_html = ''; + if (!empty($debug)) { + $debug_html .= '
'; + $debug_html .= 'File: ' . htmlspecialchars($debug['file']) . ' on line ' . $debug['line'] . ''; + $debug_html .= '
'; + $debug_html .= '
' . htmlspecialchars(implode("\n", $debug['trace'])) . '
'; + $debug_html .= '
'; + } + + echo ''; } else { - $core->drawTheme('login.html'); - } + // Return HTML error for regular requests + $title = 'System Error'; + $content = '

Please contact administrator.

'; + $debug_info = ''; + + if ($isMissingTable) { + $title = 'Database Error'; + $content = '
Warning:
' . htmlspecialchars($errMsg) . '
'; + $content .= '

Sepertinya tabel yang hendak diakses tidak tersedia di database. Anda mungkin tidak menginstal plugin secara menyeluruh, atau modul belum menyediakan tabel tersebut.

'; + } + + if (defined('DEV_MODE') && DEV_MODE) { + $content .= '
Error: ' . htmlspecialchars($e->getMessage()) . '
'; + $debug_info = '
'; + $debug_info .= '

File: ' . htmlspecialchars($e->getFile()) . ' on line ' . $e->getLine() . '

'; + $debug_info .= '

Stack Trace:

'; + $debug_info .= '
' . htmlspecialchars($e->getTraceAsString()) . '
'; + $debug_info .= '
'; + } + + echo ' + + + ' . $title . ' + + + +
+

' . $title . '

+ ' . $content . ' + ' . $debug_info . ' +
+

mLITE Healthcare System © ' . date('Y') . '

+
+
+ + '; + } } -ob_end_flush(); +// Safe buffer handling for PHP 8+ +if (ob_get_level() > 0) { + ob_end_flush(); +} diff --git a/assets/css/atilamedika.min.css b/assets/css/atilamedika.min.css new file mode 100644 index 000000000..93f83666b --- /dev/null +++ b/assets/css/atilamedika.min.css @@ -0,0 +1 @@ +@import url("mlite.min.css");body{background-color:#fff7f2;color:#14332d}a{color:#f08a54}a:hover,a:focus{color:#d9733d}.text-primary{color:#0f3d34}a.text-primary:hover,a.text-primary:focus{color:#0b2f29}.bg-primary{background-color:#0f3d34}a.bg-primary:hover,a.bg-primary:focus{background-color:#0b2f29}.btn-primary{background-color:#0f3d34;border-color:#0f3d34}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-color:#0b2f29;border-color:#0b2f29}.btn-warning{background-color:#f08a54;border-color:#f08a54}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-color:#d9733d;border-color:#d9733d}.label-primary{background-color:#0f3d34}.label-warning{background-color:#f08a54}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#0f3d34;border-color:#0f3d34}.navbar-default{background-color:#0f3d34;border-color:#0f3d34}.navbar-default .navbar-brand,.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus,.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#f08a54}.panel-primary>.panel-heading{background-color:#0f3d34;border-color:#0f3d34;color:#fff}.panel-primary{border-color:#0f3d34}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{border-top-color:#0f3d34}.form-control:focus{border-color:#f08a54;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(240,138,84,.35);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(240,138,84,.35)} diff --git a/assets/css/fixedColumns.dataTables.min.css b/assets/css/fixedColumns.dataTables.min.css new file mode 100644 index 000000000..ce934fdfc --- /dev/null +++ b/assets/css/fixedColumns.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable thead tr>.dtfc-fixed-left,table.dataTable thead tr>.dtfc-fixed-right,table.dataTable tfoot tr>.dtfc-fixed-left,table.dataTable tfoot tr>.dtfc-fixed-right{top:0;bottom:0;z-index:3;background-color:white}table.dataTable tbody tr>.dtfc-fixed-left,table.dataTable tbody tr>.dtfc-fixed-right{z-index:1;background-color:white}div.dtfc-left-top-blocker,div.dtfc-right-top-blocker{background-color:white}html.dark table.dataTable thead tr>.dtfc-fixed-left,html.dark table.dataTable thead tr>.dtfc-fixed-right,html.dark table.dataTable tfoot tr>.dtfc-fixed-left,html.dark table.dataTable tfoot tr>.dtfc-fixed-right{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-left,html.dark table.dataTable tbody tr>.dtfc-fixed-right{background-color:var(--dt-html-background)}html.dark div.dtfc-left-top-blocker,html.dark div.dtfc-right-top-blocker{background-color:var(--dt-html-background)} diff --git a/assets/css/jquery.contextMenu.min.css b/assets/css/jquery.contextMenu.min.css new file mode 100644 index 000000000..6c45c063a --- /dev/null +++ b/assets/css/jquery.contextMenu.min.css @@ -0,0 +1,16 @@ +@charset "UTF-8";/*! + * jQuery contextMenu - Plugin for simple contextMenu handling + * + * Version: v2.9.2 + * + * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF) + * Web: http://swisnl.github.io/jQuery-contextMenu/ + * + * Copyright (c) 2011-2020 SWIS BV and contributors + * + * Licensed under + * MIT License http://www.opensource.org/licenses/mit-license + * + * Date: 2020-05-13T13:55:37.023Z + */@-webkit-keyframes cm-spin{0%{-webkit-transform:translateY(-50%) rotate(0);transform:translateY(-50%) rotate(0)}100%{-webkit-transform:translateY(-50%) rotate(359deg);transform:translateY(-50%) rotate(359deg)}}@-o-keyframes cm-spin{0%{-webkit-transform:translateY(-50%) rotate(0);-o-transform:translateY(-50%) rotate(0);transform:translateY(-50%) rotate(0)}100%{-webkit-transform:translateY(-50%) rotate(359deg);-o-transform:translateY(-50%) rotate(359deg);transform:translateY(-50%) rotate(359deg)}}@keyframes cm-spin{0%{-webkit-transform:translateY(-50%) rotate(0);-o-transform:translateY(-50%) rotate(0);transform:translateY(-50%) rotate(0)}100%{-webkit-transform:translateY(-50%) rotate(359deg);-o-transform:translateY(-50%) rotate(359deg);transform:translateY(-50%) rotate(359deg)}}@font-face{font-family:context-menu-icons;font-style:normal;font-weight:400;src:url(font/context-menu-icons.eot?33lxn);src:url(font/context-menu-icons.eot?33lxn#iefix) format("embedded-opentype"),url(font/context-menu-icons.woff2?33lxn) format("woff2"),url(font/context-menu-icons.woff?33lxn) format("woff"),url(font/context-menu-icons.ttf?33lxn) format("truetype")}.context-menu-icon-add:before{content:"\EA01"}.context-menu-icon-copy:before{content:"\EA02"}.context-menu-icon-cut:before{content:"\EA03"}.context-menu-icon-delete:before{content:"\EA04"}.context-menu-icon-edit:before{content:"\EA05"}.context-menu-icon-loading:before{content:"\EA06"}.context-menu-icon-paste:before{content:"\EA07"}.context-menu-icon-quit:before{content:"\EA08"}.context-menu-icon::before{position:absolute;top:50%;left:0;width:2em;font-family:context-menu-icons;font-size:1em;font-style:normal;font-weight:400;line-height:1;color:#2980b9;text-align:center;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.context-menu-icon.context-menu-hover:before{color:#fff}.context-menu-icon.context-menu-disabled::before{color:#bbb}.context-menu-icon.context-menu-icon-loading:before{-webkit-animation:cm-spin 2s infinite;-o-animation:cm-spin 2s infinite;animation:cm-spin 2s infinite}.context-menu-icon.context-menu-icon--fa{display:list-item;font-family:inherit;line-height:inherit}.context-menu-icon.context-menu-icon--fa::before{position:absolute;top:50%;left:0;width:2em;font-family:FontAwesome;font-size:1em;font-style:normal;font-weight:400;line-height:1;color:#2980b9;text-align:center;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.context-menu-icon.context-menu-icon--fa.context-menu-hover:before{color:#fff}.context-menu-icon.context-menu-icon--fa.context-menu-disabled::before{color:#bbb}.context-menu-icon.context-menu-icon--fa5{display:list-item;font-family:inherit;line-height:inherit}.context-menu-icon.context-menu-icon--fa5 i,.context-menu-icon.context-menu-icon--fa5 svg{position:absolute;top:.3em;left:.5em;color:#2980b9}.context-menu-icon.context-menu-icon--fa5.context-menu-hover>i,.context-menu-icon.context-menu-icon--fa5.context-menu-hover>svg{color:#fff}.context-menu-icon.context-menu-icon--fa5.context-menu-disabled i,.context-menu-icon.context-menu-icon--fa5.context-menu-disabled svg{color:#bbb}.context-menu-list{position:absolute;display:inline-block;min-width:13em;max-width:26em;padding:.25em 0;margin:.3em;font-family:inherit;font-size:inherit;list-style-type:none;background:#fff;border:1px solid #bebebe;border-radius:.2em;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.5);box-shadow:0 2px 5px rgba(0,0,0,.5)}.context-menu-item{position:relative;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;padding:.2em 2em;color:#2f2f2f;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff}.context-menu-separator{padding:0;margin:.35em 0;border-bottom:1px solid #e6e6e6}.context-menu-item>label>input,.context-menu-item>label>textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.context-menu-item.context-menu-hover{color:#fff;cursor:pointer;background-color:#2980b9}.context-menu-item.context-menu-disabled{color:#bbb;cursor:default;background-color:#fff}.context-menu-input.context-menu-hover{color:#2f2f2f;cursor:default}.context-menu-submenu:after{position:absolute;top:50%;right:.5em;z-index:1;width:0;height:0;content:'';border-color:transparent transparent transparent #2f2f2f;border-style:solid;border-width:.25em 0 .25em .25em;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}.context-menu-item.context-menu-input{padding:.3em .6em}.context-menu-input>label>*{vertical-align:top}.context-menu-input>label>input[type=checkbox],.context-menu-input>label>input[type=radio]{position:relative;top:.12em;margin-right:.4em}.context-menu-input>label{margin:0}.context-menu-input>label,.context-menu-input>label>input[type=text],.context-menu-input>label>select,.context-menu-input>label>textarea{display:block;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.context-menu-input>label>textarea{height:7em}.context-menu-item>.context-menu-list{top:.3em;right:-.3em;display:none}.context-menu-item.context-menu-visible>.context-menu-list{display:block}.context-menu-accesskey{text-decoration:underline} +/*# sourceMappingURL=jquery.contextMenu.min.css.map */ diff --git a/assets/css/sketchy.min.css b/assets/css/sketchy.min.css new file mode 100644 index 000000000..4c2d84e8c --- /dev/null +++ b/assets/css/sketchy.min.css @@ -0,0 +1,6738 @@ +/* +The MIT License (MIT) +Copyright (c) 2011-2015 Twitter, Inc +Copyright (c) 2014-2015 Jan Dittrich + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +/*set path to bootstrap*/ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + } + body { + margin: 0; + } + article, + aside, + details, + figcaption, + figure, + footer, + header, + hgroup, + main, + menu, + nav, + section, + summary { + display: block; + } + audio, + canvas, + progress, + video { + display: inline-block; + vertical-align: baseline; + } + audio:not([controls]) { + display: none; + height: 0; + } + [hidden], + template { + display: none; + } + a { + background-color: transparent; + } + a:active, + a:hover { + outline: 0; + } + abbr[title] { + border-bottom: 1px dotted; + } + b, + strong { + font-weight: bold; + } + dfn { + font-style: italic; + } + h1 { + font-size: 2em; + margin: 0.67em 0; + } + mark { + background: #ff0; + color: #000; + } + small { + font-size: 80%; + } + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sup { + top: -0.5em; + } + sub { + bottom: -0.25em; + } + img { + border: 0; + } + svg:not(:root) { + overflow: hidden; + } + figure { + margin: 1em 40px; + } + hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + } + pre { + overflow: auto; + } + code, + kbd, + pre, + samp { + font-family: monospace, monospace; + font-size: 1em; + } + button, + input, + optgroup, + select, + textarea { + color: inherit; + font: inherit; + margin: 0; + } + button { + overflow: visible; + } + button, + select { + text-transform: none; + } + button, + html input[type="button"], + input[type="reset"], + input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; + } + button[disabled], + html input[disabled] { + cursor: default; + } + button::-moz-focus-inner, + input::-moz-focus-inner { + border: 0; + padding: 0; + } + input { + line-height: normal; + } + input[type="checkbox"], + input[type="radio"] { + box-sizing: border-box; + padding: 0; + } + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + height: auto; + } + input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + } + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + } + legend { + border: 0; + padding: 0; + } + textarea { + overflow: auto; + } + optgroup { + font-weight: bold; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + td, + th { + padding: 0; + } + /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + @media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } + } + @font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); + } + .glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + .glyphicon-asterisk:before { + content: "\2a"; + } + .glyphicon-plus:before { + content: "\2b"; + } + .glyphicon-euro:before, + .glyphicon-eur:before { + content: "\20ac"; + } + .glyphicon-minus:before { + content: "\2212"; + } + .glyphicon-cloud:before { + content: "\2601"; + } + .glyphicon-envelope:before { + content: "\2709"; + } + .glyphicon-pencil:before { + content: "\270f"; + } + .glyphicon-glass:before { + content: "\e001"; + } + .glyphicon-music:before { + content: "\e002"; + } + .glyphicon-search:before { + content: "\e003"; + } + .glyphicon-heart:before { + content: "\e005"; + } + .glyphicon-star:before { + content: "\e006"; + } + .glyphicon-star-empty:before { + content: "\e007"; + } + .glyphicon-user:before { + content: "\e008"; + } + .glyphicon-film:before { + content: "\e009"; + } + .glyphicon-th-large:before { + content: "\e010"; + } + .glyphicon-th:before { + content: "\e011"; + } + .glyphicon-th-list:before { + content: "\e012"; + } + .glyphicon-ok:before { + content: "\e013"; + } + .glyphicon-remove:before { + content: "\e014"; + } + .glyphicon-zoom-in:before { + content: "\e015"; + } + .glyphicon-zoom-out:before { + content: "\e016"; + } + .glyphicon-off:before { + content: "\e017"; + } + .glyphicon-signal:before { + content: "\e018"; + } + .glyphicon-cog:before { + content: "\e019"; + } + .glyphicon-trash:before { + content: "\e020"; + } + .glyphicon-home:before { + content: "\e021"; + } + .glyphicon-file:before { + content: "\e022"; + } + .glyphicon-time:before { + content: "\e023"; + } + .glyphicon-road:before { + content: "\e024"; + } + .glyphicon-download-alt:before { + content: "\e025"; + } + .glyphicon-download:before { + content: "\e026"; + } + .glyphicon-upload:before { + content: "\e027"; + } + .glyphicon-inbox:before { + content: "\e028"; + } + .glyphicon-play-circle:before { + content: "\e029"; + } + .glyphicon-repeat:before { + content: "\e030"; + } + .glyphicon-refresh:before { + content: "\e031"; + } + .glyphicon-list-alt:before { + content: "\e032"; + } + .glyphicon-lock:before { + content: "\e033"; + } + .glyphicon-flag:before { + content: "\e034"; + } + .glyphicon-headphones:before { + content: "\e035"; + } + .glyphicon-volume-off:before { + content: "\e036"; + } + .glyphicon-volume-down:before { + content: "\e037"; + } + .glyphicon-volume-up:before { + content: "\e038"; + } + .glyphicon-qrcode:before { + content: "\e039"; + } + .glyphicon-barcode:before { + content: "\e040"; + } + .glyphicon-tag:before { + content: "\e041"; + } + .glyphicon-tags:before { + content: "\e042"; + } + .glyphicon-book:before { + content: "\e043"; + } + .glyphicon-bookmark:before { + content: "\e044"; + } + .glyphicon-print:before { + content: "\e045"; + } + .glyphicon-camera:before { + content: "\e046"; + } + .glyphicon-font:before { + content: "\e047"; + } + .glyphicon-bold:before { + content: "\e048"; + } + .glyphicon-italic:before { + content: "\e049"; + } + .glyphicon-text-height:before { + content: "\e050"; + } + .glyphicon-text-width:before { + content: "\e051"; + } + .glyphicon-align-left:before { + content: "\e052"; + } + .glyphicon-align-center:before { + content: "\e053"; + } + .glyphicon-align-right:before { + content: "\e054"; + } + .glyphicon-align-justify:before { + content: "\e055"; + } + .glyphicon-list:before { + content: "\e056"; + } + .glyphicon-indent-left:before { + content: "\e057"; + } + .glyphicon-indent-right:before { + content: "\e058"; + } + .glyphicon-facetime-video:before { + content: "\e059"; + } + .glyphicon-picture:before { + content: "\e060"; + } + .glyphicon-map-marker:before { + content: "\e062"; + } + .glyphicon-adjust:before { + content: "\e063"; + } + .glyphicon-tint:before { + content: "\e064"; + } + .glyphicon-edit:before { + content: "\e065"; + } + .glyphicon-share:before { + content: "\e066"; + } + .glyphicon-check:before { + content: "\e067"; + } + .glyphicon-move:before { + content: "\e068"; + } + .glyphicon-step-backward:before { + content: "\e069"; + } + .glyphicon-fast-backward:before { + content: "\e070"; + } + .glyphicon-backward:before { + content: "\e071"; + } + .glyphicon-play:before { + content: "\e072"; + } + .glyphicon-pause:before { + content: "\e073"; + } + .glyphicon-stop:before { + content: "\e074"; + } + .glyphicon-forward:before { + content: "\e075"; + } + .glyphicon-fast-forward:before { + content: "\e076"; + } + .glyphicon-step-forward:before { + content: "\e077"; + } + .glyphicon-eject:before { + content: "\e078"; + } + .glyphicon-chevron-left:before { + content: "\e079"; + } + .glyphicon-chevron-right:before { + content: "\e080"; + } + .glyphicon-plus-sign:before { + content: "\e081"; + } + .glyphicon-minus-sign:before { + content: "\e082"; + } + .glyphicon-remove-sign:before { + content: "\e083"; + } + .glyphicon-ok-sign:before { + content: "\e084"; + } + .glyphicon-question-sign:before { + content: "\e085"; + } + .glyphicon-info-sign:before { + content: "\e086"; + } + .glyphicon-screenshot:before { + content: "\e087"; + } + .glyphicon-remove-circle:before { + content: "\e088"; + } + .glyphicon-ok-circle:before { + content: "\e089"; + } + .glyphicon-ban-circle:before { + content: "\e090"; + } + .glyphicon-arrow-left:before { + content: "\e091"; + } + .glyphicon-arrow-right:before { + content: "\e092"; + } + .glyphicon-arrow-up:before { + content: "\e093"; + } + .glyphicon-arrow-down:before { + content: "\e094"; + } + .glyphicon-share-alt:before { + content: "\e095"; + } + .glyphicon-resize-full:before { + content: "\e096"; + } + .glyphicon-resize-small:before { + content: "\e097"; + } + .glyphicon-exclamation-sign:before { + content: "\e101"; + } + .glyphicon-gift:before { + content: "\e102"; + } + .glyphicon-leaf:before { + content: "\e103"; + } + .glyphicon-fire:before { + content: "\e104"; + } + .glyphicon-eye-open:before { + content: "\e105"; + } + .glyphicon-eye-close:before { + content: "\e106"; + } + .glyphicon-warning-sign:before { + content: "\e107"; + } + .glyphicon-plane:before { + content: "\e108"; + } + .glyphicon-calendar:before { + content: "\e109"; + } + .glyphicon-random:before { + content: "\e110"; + } + .glyphicon-comment:before { + content: "\e111"; + } + .glyphicon-magnet:before { + content: "\e112"; + } + .glyphicon-chevron-up:before { + content: "\e113"; + } + .glyphicon-chevron-down:before { + content: "\e114"; + } + .glyphicon-retweet:before { + content: "\e115"; + } + .glyphicon-shopping-cart:before { + content: "\e116"; + } + .glyphicon-folder-close:before { + content: "\e117"; + } + .glyphicon-folder-open:before { + content: "\e118"; + } + .glyphicon-resize-vertical:before { + content: "\e119"; + } + .glyphicon-resize-horizontal:before { + content: "\e120"; + } + .glyphicon-hdd:before { + content: "\e121"; + } + .glyphicon-bullhorn:before { + content: "\e122"; + } + .glyphicon-bell:before { + content: "\e123"; + } + .glyphicon-certificate:before { + content: "\e124"; + } + .glyphicon-thumbs-up:before { + content: "\e125"; + } + .glyphicon-thumbs-down:before { + content: "\e126"; + } + .glyphicon-hand-right:before { + content: "\e127"; + } + .glyphicon-hand-left:before { + content: "\e128"; + } + .glyphicon-hand-up:before { + content: "\e129"; + } + .glyphicon-hand-down:before { + content: "\e130"; + } + .glyphicon-circle-arrow-right:before { + content: "\e131"; + } + .glyphicon-circle-arrow-left:before { + content: "\e132"; + } + .glyphicon-circle-arrow-up:before { + content: "\e133"; + } + .glyphicon-circle-arrow-down:before { + content: "\e134"; + } + .glyphicon-globe:before { + content: "\e135"; + } + .glyphicon-wrench:before { + content: "\e136"; + } + .glyphicon-tasks:before { + content: "\e137"; + } + .glyphicon-filter:before { + content: "\e138"; + } + .glyphicon-briefcase:before { + content: "\e139"; + } + .glyphicon-fullscreen:before { + content: "\e140"; + } + .glyphicon-dashboard:before { + content: "\e141"; + } + .glyphicon-paperclip:before { + content: "\e142"; + } + .glyphicon-heart-empty:before { + content: "\e143"; + } + .glyphicon-link:before { + content: "\e144"; + } + .glyphicon-phone:before { + content: "\e145"; + } + .glyphicon-pushpin:before { + content: "\e146"; + } + .glyphicon-usd:before { + content: "\e148"; + } + .glyphicon-gbp:before { + content: "\e149"; + } + .glyphicon-sort:before { + content: "\e150"; + } + .glyphicon-sort-by-alphabet:before { + content: "\e151"; + } + .glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; + } + .glyphicon-sort-by-order:before { + content: "\e153"; + } + .glyphicon-sort-by-order-alt:before { + content: "\e154"; + } + .glyphicon-sort-by-attributes:before { + content: "\e155"; + } + .glyphicon-sort-by-attributes-alt:before { + content: "\e156"; + } + .glyphicon-unchecked:before { + content: "\e157"; + } + .glyphicon-expand:before { + content: "\e158"; + } + .glyphicon-collapse-down:before { + content: "\e159"; + } + .glyphicon-collapse-up:before { + content: "\e160"; + } + .glyphicon-log-in:before { + content: "\e161"; + } + .glyphicon-flash:before { + content: "\e162"; + } + .glyphicon-log-out:before { + content: "\e163"; + } + .glyphicon-new-window:before { + content: "\e164"; + } + .glyphicon-record:before { + content: "\e165"; + } + .glyphicon-save:before { + content: "\e166"; + } + .glyphicon-open:before { + content: "\e167"; + } + .glyphicon-saved:before { + content: "\e168"; + } + .glyphicon-import:before { + content: "\e169"; + } + .glyphicon-export:before { + content: "\e170"; + } + .glyphicon-send:before { + content: "\e171"; + } + .glyphicon-floppy-disk:before { + content: "\e172"; + } + .glyphicon-floppy-saved:before { + content: "\e173"; + } + .glyphicon-floppy-remove:before { + content: "\e174"; + } + .glyphicon-floppy-save:before { + content: "\e175"; + } + .glyphicon-floppy-open:before { + content: "\e176"; + } + .glyphicon-credit-card:before { + content: "\e177"; + } + .glyphicon-transfer:before { + content: "\e178"; + } + .glyphicon-cutlery:before { + content: "\e179"; + } + .glyphicon-header:before { + content: "\e180"; + } + .glyphicon-compressed:before { + content: "\e181"; + } + .glyphicon-earphone:before { + content: "\e182"; + } + .glyphicon-phone-alt:before { + content: "\e183"; + } + .glyphicon-tower:before { + content: "\e184"; + } + .glyphicon-stats:before { + content: "\e185"; + } + .glyphicon-sd-video:before { + content: "\e186"; + } + .glyphicon-hd-video:before { + content: "\e187"; + } + .glyphicon-subtitles:before { + content: "\e188"; + } + .glyphicon-sound-stereo:before { + content: "\e189"; + } + .glyphicon-sound-dolby:before { + content: "\e190"; + } + .glyphicon-sound-5-1:before { + content: "\e191"; + } + .glyphicon-sound-6-1:before { + content: "\e192"; + } + .glyphicon-sound-7-1:before { + content: "\e193"; + } + .glyphicon-copyright-mark:before { + content: "\e194"; + } + .glyphicon-registration-mark:before { + content: "\e195"; + } + .glyphicon-cloud-download:before { + content: "\e197"; + } + .glyphicon-cloud-upload:before { + content: "\e198"; + } + .glyphicon-tree-conifer:before { + content: "\e199"; + } + .glyphicon-tree-deciduous:before { + content: "\e200"; + } + .glyphicon-cd:before { + content: "\e201"; + } + .glyphicon-save-file:before { + content: "\e202"; + } + .glyphicon-open-file:before { + content: "\e203"; + } + .glyphicon-level-up:before { + content: "\e204"; + } + .glyphicon-copy:before { + content: "\e205"; + } + .glyphicon-paste:before { + content: "\e206"; + } + .glyphicon-alert:before { + content: "\e209"; + } + .glyphicon-equalizer:before { + content: "\e210"; + } + .glyphicon-king:before { + content: "\e211"; + } + .glyphicon-queen:before { + content: "\e212"; + } + .glyphicon-pawn:before { + content: "\e213"; + } + .glyphicon-bishop:before { + content: "\e214"; + } + .glyphicon-knight:before { + content: "\e215"; + } + .glyphicon-baby-formula:before { + content: "\e216"; + } + .glyphicon-tent:before { + content: "\26fa"; + } + .glyphicon-blackboard:before { + content: "\e218"; + } + .glyphicon-bed:before { + content: "\e219"; + } + .glyphicon-apple:before { + content: "\f8ff"; + } + .glyphicon-erase:before { + content: "\e221"; + } + .glyphicon-hourglass:before { + content: "\231b"; + } + .glyphicon-lamp:before { + content: "\e223"; + } + .glyphicon-duplicate:before { + content: "\e224"; + } + .glyphicon-piggy-bank:before { + content: "\e225"; + } + .glyphicon-scissors:before { + content: "\e226"; + } + .glyphicon-bitcoin:before { + content: "\e227"; + } + .glyphicon-btc:before { + content: "\e227"; + } + .glyphicon-xbt:before { + content: "\e227"; + } + .glyphicon-yen:before { + content: "\00a5"; + } + .glyphicon-jpy:before { + content: "\00a5"; + } + .glyphicon-ruble:before { + content: "\20bd"; + } + .glyphicon-rub:before { + content: "\20bd"; + } + .glyphicon-scale:before { + content: "\e230"; + } + .glyphicon-ice-lolly:before { + content: "\e231"; + } + .glyphicon-ice-lolly-tasted:before { + content: "\e232"; + } + .glyphicon-education:before { + content: "\e233"; + } + .glyphicon-option-horizontal:before { + content: "\e234"; + } + .glyphicon-option-vertical:before { + content: "\e235"; + } + .glyphicon-menu-hamburger:before { + content: "\e236"; + } + .glyphicon-modal-window:before { + content: "\e237"; + } + .glyphicon-oil:before { + content: "\e238"; + } + .glyphicon-grain:before { + content: "\e239"; + } + .glyphicon-sunglasses:before { + content: "\e240"; + } + .glyphicon-text-size:before { + content: "\e241"; + } + .glyphicon-text-color:before { + content: "\e242"; + } + .glyphicon-text-background:before { + content: "\e243"; + } + .glyphicon-object-align-top:before { + content: "\e244"; + } + .glyphicon-object-align-bottom:before { + content: "\e245"; + } + .glyphicon-object-align-horizontal:before { + content: "\e246"; + } + .glyphicon-object-align-left:before { + content: "\e247"; + } + .glyphicon-object-align-vertical:before { + content: "\e248"; + } + .glyphicon-object-align-right:before { + content: "\e249"; + } + .glyphicon-triangle-right:before { + content: "\e250"; + } + .glyphicon-triangle-left:before { + content: "\e251"; + } + .glyphicon-triangle-bottom:before { + content: "\e252"; + } + .glyphicon-triangle-top:before { + content: "\e253"; + } + .glyphicon-console:before { + content: "\e254"; + } + .glyphicon-superscript:before { + content: "\e255"; + } + .glyphicon-subscript:before { + content: "\e256"; + } + .glyphicon-menu-left:before { + content: "\e257"; + } + .glyphicon-menu-right:before { + content: "\e258"; + } + .glyphicon-menu-down:before { + content: "\e259"; + } + .glyphicon-menu-up:before { + content: "\e260"; + } + * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + *:before, + *:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + } + body { + font-family: "Comic Neue", "Comic Sans MS", "Comic Sans"; + font-size: 14px; + line-height: 1.42857143; + color: #000000; + background-color: #ffffff; + } + input, + button, + select, + textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + a { + color: #4d7ecb; + text-decoration: none; + } + a:hover, + a:focus { + color: #2e599d; + text-decoration: underline; + } + a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } + figure { + margin: 0; + } + img { + vertical-align: middle; + } + .img-responsive, + .thumbnail > img, + .thumbnail a > img, + .carousel-inner > .item > img, + .carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + } + .img-rounded { + border-radius: 3px; + } + .img-thumbnail { + padding: 4px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 2px; + -webkit-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; + } + .img-circle { + border-radius: 50%; + } + hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; + } + .sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + } + .sr-only-focusable:active, + .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } + [role="button"] { + cursor: pointer; + } + h1, + h2, + h3, + h4, + h5, + h6, + .h1, + .h2, + .h3, + .h4, + .h5, + .h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; + } + h1 small, + h2 small, + h3 small, + h4 small, + h5 small, + h6 small, + .h1 small, + .h2 small, + .h3 small, + .h4 small, + .h5 small, + .h6 small, + h1 .small, + h2 .small, + h3 .small, + h4 .small, + h5 .small, + h6 .small, + .h1 .small, + .h2 .small, + .h3 .small, + .h4 .small, + .h5 .small, + .h6 .small { + font-weight: normal; + line-height: 1; + color: #777777; + } + h1, + .h1, + h2, + .h2, + h3, + .h3 { + margin-top: 20px; + margin-bottom: 10px; + } + h1 small, + .h1 small, + h2 small, + .h2 small, + h3 small, + .h3 small, + h1 .small, + .h1 .small, + h2 .small, + .h2 .small, + h3 .small, + .h3 .small { + font-size: 65%; + } + h4, + .h4, + h5, + .h5, + h6, + .h6 { + margin-top: 10px; + margin-bottom: 10px; + } + h4 small, + .h4 small, + h5 small, + .h5 small, + h6 small, + .h6 small, + h4 .small, + .h4 .small, + h5 .small, + .h5 .small, + h6 .small, + .h6 .small { + font-size: 75%; + } + h1, + .h1 { + font-size: 36px; + } + h2, + .h2 { + font-size: 30px; + } + h3, + .h3 { + font-size: 24px; + } + h4, + .h4 { + font-size: 18px; + } + h5, + .h5 { + font-size: 14px; + } + h6, + .h6 { + font-size: 12px; + } + p { + margin: 0 0 10px; + } + .lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; + } + @media (min-width: 768px) { + .lead { + font-size: 21px; + } + } + small, + .small { + font-size: 85%; + } + mark, + .mark { + background-color: #fcf8e3; + padding: .2em; + } + .text-left { + text-align: left; + } + .text-right { + text-align: right; + } + .text-center { + text-align: center; + } + .text-justify { + text-align: justify; + } + .text-nowrap { + white-space: nowrap; + } + .text-lowercase { + text-transform: lowercase; + } + .text-uppercase { + text-transform: uppercase; + } + .text-capitalize { + text-transform: capitalize; + } + .text-muted { + color: #777777; + } + .text-primary { + color: #4d7ecb; + } + a.text-primary:hover { + color: #3465b1; + } + .text-success { + color: #3c763d; + } + a.text-success:hover { + color: #2b542c; + } + .text-info { + color: #31708f; + } + a.text-info:hover { + color: #245269; + } + .text-warning { + color: #8a6d3b; + } + a.text-warning:hover { + color: #66512c; + } + .text-danger { + color: #a94442; + } + a.text-danger:hover { + color: #843534; + } + .bg-primary { + color: #fff; + background-color: #4d7ecb; + } + a.bg-primary:hover { + background-color: #3465b1; + } + .bg-success { + background-color: #dff0d8; + } + a.bg-success:hover { + background-color: #c1e2b3; + } + .bg-info { + background-color: #d9edf7; + } + a.bg-info:hover { + background-color: #afd9ee; + } + .bg-warning { + background-color: #fcf8e3; + } + a.bg-warning:hover { + background-color: #f7ecb5; + } + .bg-danger { + background-color: #f2dede; + } + a.bg-danger:hover { + background-color: #e4b9b9; + } + .page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; + } + ul, + ol { + margin-top: 0; + margin-bottom: 10px; + } + ul ul, + ol ul, + ul ol, + ol ol { + margin-bottom: 0; + } + .list-unstyled { + padding-left: 0; + list-style: none; + } + .list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; + } + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } + dl { + margin-top: 0; + margin-bottom: 20px; + } + dt, + dd { + line-height: 1.42857143; + } + dt { + font-weight: bold; + } + dd { + margin-left: 0; + } + @media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } + } + abbr[title], + abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; + } + .initialism { + font-size: 90%; + text-transform: uppercase; + } + blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; + } + blockquote p:last-child, + blockquote ul:last-child, + blockquote ol:last-child { + margin-bottom: 0; + } + blockquote footer, + blockquote small, + blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777777; + } + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: '\2014 \00A0'; + } + .blockquote-reverse, + blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; + } + .blockquote-reverse footer:before, + blockquote.pull-right footer:before, + .blockquote-reverse small:before, + blockquote.pull-right small:before, + .blockquote-reverse .small:before, + blockquote.pull-right .small:before { + content: ''; + } + .blockquote-reverse footer:after, + blockquote.pull-right footer:after, + .blockquote-reverse small:after, + blockquote.pull-right small:after, + .blockquote-reverse .small:after, + blockquote.pull-right .small:after { + content: '\00A0 \2014'; + } + address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; + } + code, + kbd, + pre, + samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + } + code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 2px; + } + kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 1px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } + pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 2px; + } + pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } + .pre-scrollable { + max-height: 340px; + overflow-y: scroll; + } + .container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; + } + @media (min-width: 768px) { + .container { + width: 750px; + } + } + @media (min-width: 992px) { + .container { + width: 970px; + } + } + @media (min-width: 1200px) { + .container { + width: 1170px; + } + } + .container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; + } + .row { + margin-left: -15px; + margin-right: -15px; + } + .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + } + .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; + } + .col-xs-12 { + width: 100%; + } + .col-xs-11 { + width: 91.66666667%; + } + .col-xs-10 { + width: 83.33333333%; + } + .col-xs-9 { + width: 75%; + } + .col-xs-8 { + width: 66.66666667%; + } + .col-xs-7 { + width: 58.33333333%; + } + .col-xs-6 { + width: 50%; + } + .col-xs-5 { + width: 41.66666667%; + } + .col-xs-4 { + width: 33.33333333%; + } + .col-xs-3 { + width: 25%; + } + .col-xs-2 { + width: 16.66666667%; + } + .col-xs-1 { + width: 8.33333333%; + } + .col-xs-pull-12 { + right: 100%; + } + .col-xs-pull-11 { + right: 91.66666667%; + } + .col-xs-pull-10 { + right: 83.33333333%; + } + .col-xs-pull-9 { + right: 75%; + } + .col-xs-pull-8 { + right: 66.66666667%; + } + .col-xs-pull-7 { + right: 58.33333333%; + } + .col-xs-pull-6 { + right: 50%; + } + .col-xs-pull-5 { + right: 41.66666667%; + } + .col-xs-pull-4 { + right: 33.33333333%; + } + .col-xs-pull-3 { + right: 25%; + } + .col-xs-pull-2 { + right: 16.66666667%; + } + .col-xs-pull-1 { + right: 8.33333333%; + } + .col-xs-pull-0 { + right: auto; + } + .col-xs-push-12 { + left: 100%; + } + .col-xs-push-11 { + left: 91.66666667%; + } + .col-xs-push-10 { + left: 83.33333333%; + } + .col-xs-push-9 { + left: 75%; + } + .col-xs-push-8 { + left: 66.66666667%; + } + .col-xs-push-7 { + left: 58.33333333%; + } + .col-xs-push-6 { + left: 50%; + } + .col-xs-push-5 { + left: 41.66666667%; + } + .col-xs-push-4 { + left: 33.33333333%; + } + .col-xs-push-3 { + left: 25%; + } + .col-xs-push-2 { + left: 16.66666667%; + } + .col-xs-push-1 { + left: 8.33333333%; + } + .col-xs-push-0 { + left: auto; + } + .col-xs-offset-12 { + margin-left: 100%; + } + .col-xs-offset-11 { + margin-left: 91.66666667%; + } + .col-xs-offset-10 { + margin-left: 83.33333333%; + } + .col-xs-offset-9 { + margin-left: 75%; + } + .col-xs-offset-8 { + margin-left: 66.66666667%; + } + .col-xs-offset-7 { + margin-left: 58.33333333%; + } + .col-xs-offset-6 { + margin-left: 50%; + } + .col-xs-offset-5 { + margin-left: 41.66666667%; + } + .col-xs-offset-4 { + margin-left: 33.33333333%; + } + .col-xs-offset-3 { + margin-left: 25%; + } + .col-xs-offset-2 { + margin-left: 16.66666667%; + } + .col-xs-offset-1 { + margin-left: 8.33333333%; + } + .col-xs-offset-0 { + margin-left: 0%; + } + @media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0%; + } + } + @media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0%; + } + } + @media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0%; + } + } + table { + background-color: transparent; + } + caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; + } + th { + text-align: left; + } + .table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; + } + .table > thead > tr > th, + .table > tbody > tr > th, + .table > tfoot > tr > th, + .table > thead > tr > td, + .table > tbody > tr > td, + .table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #dddddd; + } + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; + } + .table > caption + thead > tr:first-child > th, + .table > colgroup + thead > tr:first-child > th, + .table > thead:first-child > tr:first-child > th, + .table > caption + thead > tr:first-child > td, + .table > colgroup + thead > tr:first-child > td, + .table > thead:first-child > tr:first-child > td { + border-top: 0; + } + .table > tbody + tbody { + border-top: 2px solid #dddddd; + } + .table .table { + background-color: #ffffff; + } + .table-condensed > thead > tr > th, + .table-condensed > tbody > tr > th, + .table-condensed > tfoot > tr > th, + .table-condensed > thead > tr > td, + .table-condensed > tbody > tr > td, + .table-condensed > tfoot > tr > td { + padding: 5px; + } + .table-bordered { + border: 1px solid #dddddd; + } + .table-bordered > thead > tr > th, + .table-bordered > tbody > tr > th, + .table-bordered > tfoot > tr > th, + .table-bordered > thead > tr > td, + .table-bordered > tbody > tr > td, + .table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; + } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td { + border-bottom-width: 2px; + } + .table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; + } + .table-hover > tbody > tr:hover { + background-color: #f5f5f5; + } + table col[class*="col-"] { + position: static; + float: none; + display: table-column; + } + table td[class*="col-"], + table th[class*="col-"] { + position: static; + float: none; + display: table-cell; + } + .table > thead > tr > td.active, + .table > tbody > tr > td.active, + .table > tfoot > tr > td.active, + .table > thead > tr > th.active, + .table > tbody > tr > th.active, + .table > tfoot > tr > th.active, + .table > thead > tr.active > td, + .table > tbody > tr.active > td, + .table > tfoot > tr.active > td, + .table > thead > tr.active > th, + .table > tbody > tr.active > th, + .table > tfoot > tr.active > th { + background-color: #f5f5f5; + } + .table-hover > tbody > tr > td.active:hover, + .table-hover > tbody > tr > th.active:hover, + .table-hover > tbody > tr.active:hover > td, + .table-hover > tbody > tr:hover > .active, + .table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; + } + .table > thead > tr > td.success, + .table > tbody > tr > td.success, + .table > tfoot > tr > td.success, + .table > thead > tr > th.success, + .table > tbody > tr > th.success, + .table > tfoot > tr > th.success, + .table > thead > tr.success > td, + .table > tbody > tr.success > td, + .table > tfoot > tr.success > td, + .table > thead > tr.success > th, + .table > tbody > tr.success > th, + .table > tfoot > tr.success > th { + background-color: #dff0d8; + } + .table-hover > tbody > tr > td.success:hover, + .table-hover > tbody > tr > th.success:hover, + .table-hover > tbody > tr.success:hover > td, + .table-hover > tbody > tr:hover > .success, + .table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; + } + .table > thead > tr > td.info, + .table > tbody > tr > td.info, + .table > tfoot > tr > td.info, + .table > thead > tr > th.info, + .table > tbody > tr > th.info, + .table > tfoot > tr > th.info, + .table > thead > tr.info > td, + .table > tbody > tr.info > td, + .table > tfoot > tr.info > td, + .table > thead > tr.info > th, + .table > tbody > tr.info > th, + .table > tfoot > tr.info > th { + background-color: #d9edf7; + } + .table-hover > tbody > tr > td.info:hover, + .table-hover > tbody > tr > th.info:hover, + .table-hover > tbody > tr.info:hover > td, + .table-hover > tbody > tr:hover > .info, + .table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; + } + .table > thead > tr > td.warning, + .table > tbody > tr > td.warning, + .table > tfoot > tr > td.warning, + .table > thead > tr > th.warning, + .table > tbody > tr > th.warning, + .table > tfoot > tr > th.warning, + .table > thead > tr.warning > td, + .table > tbody > tr.warning > td, + .table > tfoot > tr.warning > td, + .table > thead > tr.warning > th, + .table > tbody > tr.warning > th, + .table > tfoot > tr.warning > th { + background-color: #fcf8e3; + } + .table-hover > tbody > tr > td.warning:hover, + .table-hover > tbody > tr > th.warning:hover, + .table-hover > tbody > tr.warning:hover > td, + .table-hover > tbody > tr:hover > .warning, + .table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; + } + .table > thead > tr > td.danger, + .table > tbody > tr > td.danger, + .table > tfoot > tr > td.danger, + .table > thead > tr > th.danger, + .table > tbody > tr > th.danger, + .table > tfoot > tr > th.danger, + .table > thead > tr.danger > td, + .table > tbody > tr.danger > td, + .table > tfoot > tr.danger > td, + .table > thead > tr.danger > th, + .table > tbody > tr.danger > th, + .table > tfoot > tr.danger > th { + background-color: #f2dede; + } + .table-hover > tbody > tr > td.danger:hover, + .table-hover > tbody > tr > th.danger:hover, + .table-hover > tbody > tr.danger:hover > td, + .table-hover > tbody > tr:hover > .danger, + .table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; + } + .table-responsive { + overflow-x: auto; + min-height: 0.01%; + } + @media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } + } + fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; + } + legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; + } + label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; + } + input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + input[type="radio"], + input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; + } + input[type="file"] { + display: block; + } + input[type="range"] { + display: block; + width: 100%; + } + select[multiple], + select[size] { + height: auto; + } + input[type="file"]:focus, + input[type="radio"]:focus, + input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } + output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + } + .form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 2px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + } + .form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + } + .form-control::-moz-placeholder { + color: #777777; + opacity: 1; + } + .form-control:-ms-input-placeholder { + color: #777777; + } + .form-control::-webkit-input-placeholder { + color: #777777; + } + .form-control[disabled], + .form-control[readonly], + fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; + } + .form-control[disabled], + fieldset[disabled] .form-control { + cursor: not-allowed; + } + textarea.form-control { + height: auto; + } + input[type="search"] { + -webkit-appearance: none; + } + @media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } + } + .form-group { + margin-bottom: 15px; + } + .radio, + .checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + } + .radio label, + .checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; + } + .radio input[type="radio"], + .radio-inline input[type="radio"], + .checkbox input[type="checkbox"], + .checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; + } + .radio + .radio, + .checkbox + .checkbox { + margin-top: -5px; + } + .radio-inline, + .checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; + } + .radio-inline + .radio-inline, + .checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; + } + input[type="radio"][disabled], + input[type="checkbox"][disabled], + input[type="radio"].disabled, + input[type="checkbox"].disabled, + fieldset[disabled] input[type="radio"], + fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; + } + .radio-inline.disabled, + .checkbox-inline.disabled, + fieldset[disabled] .radio-inline, + fieldset[disabled] .checkbox-inline { + cursor: not-allowed; + } + .radio.disabled label, + .checkbox.disabled label, + fieldset[disabled] .radio label, + fieldset[disabled] .checkbox label { + cursor: not-allowed; + } + .form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; + min-height: 34px; + } + .form-control-static.input-lg, + .form-control-static.input-sm { + padding-left: 0; + padding-right: 0; + } + .input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 1px; + } + select.input-sm { + height: 30px; + line-height: 30px; + } + textarea.input-sm, + select[multiple].input-sm { + height: auto; + } + .form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 1px; + } + select.form-group-sm .form-control { + height: 30px; + line-height: 30px; + } + textarea.form-group-sm .form-control, + select[multiple].form-group-sm .form-control { + height: auto; + } + .form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + min-height: 32px; + } + .input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 3px; + } + select.input-lg { + height: 46px; + line-height: 46px; + } + textarea.input-lg, + select[multiple].input-lg { + height: auto; + } + .form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 3px; + } + select.form-group-lg .form-control { + height: 46px; + line-height: 46px; + } + textarea.form-group-lg .form-control, + select[multiple].form-group-lg .form-control { + height: auto; + } + .form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + min-height: 38px; + } + .has-feedback { + position: relative; + } + .has-feedback .form-control { + padding-right: 42.5px; + } + .form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; + } + .input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; + } + .input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; + } + .has-success .help-block, + .has-success .control-label, + .has-success .radio, + .has-success .checkbox, + .has-success .radio-inline, + .has-success .checkbox-inline, + .has-success.radio label, + .has-success.checkbox label, + .has-success.radio-inline label, + .has-success.checkbox-inline label { + color: #3c763d; + } + .has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + } + .has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + } + .has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; + } + .has-success .form-control-feedback { + color: #3c763d; + } + .has-warning .help-block, + .has-warning .control-label, + .has-warning .radio, + .has-warning .checkbox, + .has-warning .radio-inline, + .has-warning .checkbox-inline, + .has-warning.radio label, + .has-warning.checkbox label, + .has-warning.radio-inline label, + .has-warning.checkbox-inline label { + color: #8a6d3b; + } + .has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + } + .has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + } + .has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; + } + .has-warning .form-control-feedback { + color: #8a6d3b; + } + .has-error .help-block, + .has-error .control-label, + .has-error .radio, + .has-error .checkbox, + .has-error .radio-inline, + .has-error .checkbox-inline, + .has-error.radio label, + .has-error.checkbox label, + .has-error.radio-inline label, + .has-error.checkbox-inline label { + color: #a94442; + } + .has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + } + .has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + } + .has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; + } + .has-error .form-control-feedback { + color: #a94442; + } + .has-feedback label ~ .form-control-feedback { + top: 25px; + } + .has-feedback label.sr-only ~ .form-control-feedback { + top: 0; + } + .help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #404040; + } + @media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } + } + .form-horizontal .radio, + .form-horizontal .checkbox, + .form-horizontal .radio-inline, + .form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; + } + .form-horizontal .radio, + .form-horizontal .checkbox { + min-height: 27px; + } + .form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; + } + @media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; + } + } + .form-horizontal .has-feedback .form-control-feedback { + right: 15px; + } + @media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.3px; + } + } + @media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } + } + .btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + border-radius: 2px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .btn:focus, + .btn:active:focus, + .btn.active:focus, + .btn.focus, + .btn:active.focus, + .btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + } + .btn:hover, + .btn:focus, + .btn.focus { + color: #333333; + text-decoration: none; + } + .btn:active, + .btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + } + .btn.disabled, + .btn[disabled], + fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + } + .btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; + } + .btn-default:hover, + .btn-default:focus, + .btn-default.focus, + .btn-default:active, + .btn-default.active, + .open > .dropdown-toggle.btn-default { + color: #333333; + background-color: #e6e6e6; + border-color: #adadad; + } + .btn-default:active, + .btn-default.active, + .open > .dropdown-toggle.btn-default { + background-image: none; + } + .btn-default.disabled, + .btn-default[disabled], + fieldset[disabled] .btn-default, + .btn-default.disabled:hover, + .btn-default[disabled]:hover, + fieldset[disabled] .btn-default:hover, + .btn-default.disabled:focus, + .btn-default[disabled]:focus, + fieldset[disabled] .btn-default:focus, + .btn-default.disabled.focus, + .btn-default[disabled].focus, + fieldset[disabled] .btn-default.focus, + .btn-default.disabled:active, + .btn-default[disabled]:active, + fieldset[disabled] .btn-default:active, + .btn-default.disabled.active, + .btn-default[disabled].active, + fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; + } + .btn-default .badge { + color: #ffffff; + background-color: #333333; + } + .btn-primary { + color: #ffffff; + background-color: #4d7ecb; + border-color: #3a70c5; + } + .btn-primary:hover, + .btn-primary:focus, + .btn-primary.focus, + .btn-primary:active, + .btn-primary.active, + .open > .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #3465b1; + border-color: #2c5596; + } + .btn-primary:active, + .btn-primary.active, + .open > .dropdown-toggle.btn-primary { + background-image: none; + } + .btn-primary.disabled, + .btn-primary[disabled], + fieldset[disabled] .btn-primary, + .btn-primary.disabled:hover, + .btn-primary[disabled]:hover, + fieldset[disabled] .btn-primary:hover, + .btn-primary.disabled:focus, + .btn-primary[disabled]:focus, + fieldset[disabled] .btn-primary:focus, + .btn-primary.disabled.focus, + .btn-primary[disabled].focus, + fieldset[disabled] .btn-primary.focus, + .btn-primary.disabled:active, + .btn-primary[disabled]:active, + fieldset[disabled] .btn-primary:active, + .btn-primary.disabled.active, + .btn-primary[disabled].active, + fieldset[disabled] .btn-primary.active { + background-color: #4d7ecb; + border-color: #3a70c5; + } + .btn-primary .badge { + color: #4d7ecb; + background-color: #ffffff; + } + .btn-success { + color: #ffffff; + background-color: #d5e0a7; + border-color: #ccd994; + } + .btn-success:hover, + .btn-success:focus, + .btn-success.focus, + .btn-success:active, + .btn-success.active, + .open > .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #c3d381; + border-color: #b6c967; + } + .btn-success:active, + .btn-success.active, + .open > .dropdown-toggle.btn-success { + background-image: none; + } + .btn-success.disabled, + .btn-success[disabled], + fieldset[disabled] .btn-success, + .btn-success.disabled:hover, + .btn-success[disabled]:hover, + fieldset[disabled] .btn-success:hover, + .btn-success.disabled:focus, + .btn-success[disabled]:focus, + fieldset[disabled] .btn-success:focus, + .btn-success.disabled.focus, + .btn-success[disabled].focus, + fieldset[disabled] .btn-success.focus, + .btn-success.disabled:active, + .btn-success[disabled]:active, + fieldset[disabled] .btn-success:active, + .btn-success.disabled.active, + .btn-success[disabled].active, + fieldset[disabled] .btn-success.active { + background-color: #d5e0a7; + border-color: #ccd994; + } + .btn-success .badge { + color: #d5e0a7; + background-color: #ffffff; + } + .btn-info { + color: #ffffff; + background-color: #c6c6c6; + border-color: #b9b9b9; + } + .btn-info:hover, + .btn-info:focus, + .btn-info.focus, + .btn-info:active, + .btn-info.active, + .open > .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #adadad; + border-color: #9b9b9b; + } + .btn-info:active, + .btn-info.active, + .open > .dropdown-toggle.btn-info { + background-image: none; + } + .btn-info.disabled, + .btn-info[disabled], + fieldset[disabled] .btn-info, + .btn-info.disabled:hover, + .btn-info[disabled]:hover, + fieldset[disabled] .btn-info:hover, + .btn-info.disabled:focus, + .btn-info[disabled]:focus, + fieldset[disabled] .btn-info:focus, + .btn-info.disabled.focus, + .btn-info[disabled].focus, + fieldset[disabled] .btn-info.focus, + .btn-info.disabled:active, + .btn-info[disabled]:active, + fieldset[disabled] .btn-info:active, + .btn-info.disabled.active, + .btn-info[disabled].active, + fieldset[disabled] .btn-info.active { + background-color: #c6c6c6; + border-color: #b9b9b9; + } + .btn-info .badge { + color: #c6c6c6; + background-color: #ffffff; + } + .btn-warning { + color: #ffffff; + background-color: #f2edac; + border-color: #efe896; + } + .btn-warning:hover, + .btn-warning:focus, + .btn-warning.focus, + .btn-warning:active, + .btn-warning.active, + .open > .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ebe380; + border-color: #e6dd61; + } + .btn-warning:active, + .btn-warning.active, + .open > .dropdown-toggle.btn-warning { + background-image: none; + } + .btn-warning.disabled, + .btn-warning[disabled], + fieldset[disabled] .btn-warning, + .btn-warning.disabled:hover, + .btn-warning[disabled]:hover, + fieldset[disabled] .btn-warning:hover, + .btn-warning.disabled:focus, + .btn-warning[disabled]:focus, + fieldset[disabled] .btn-warning:focus, + .btn-warning.disabled.focus, + .btn-warning[disabled].focus, + fieldset[disabled] .btn-warning.focus, + .btn-warning.disabled:active, + .btn-warning[disabled]:active, + fieldset[disabled] .btn-warning:active, + .btn-warning.disabled.active, + .btn-warning[disabled].active, + fieldset[disabled] .btn-warning.active { + background-color: #f2edac; + border-color: #efe896; + } + .btn-warning .badge { + color: #f2edac; + background-color: #ffffff; + } + .btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; + } + .btn-danger:hover, + .btn-danger:focus, + .btn-danger.focus, + .btn-danger:active, + .btn-danger.active, + .open > .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #c9302c; + border-color: #ac2925; + } + .btn-danger:active, + .btn-danger.active, + .open > .dropdown-toggle.btn-danger { + background-image: none; + } + .btn-danger.disabled, + .btn-danger[disabled], + fieldset[disabled] .btn-danger, + .btn-danger.disabled:hover, + .btn-danger[disabled]:hover, + fieldset[disabled] .btn-danger:hover, + .btn-danger.disabled:focus, + .btn-danger[disabled]:focus, + fieldset[disabled] .btn-danger:focus, + .btn-danger.disabled.focus, + .btn-danger[disabled].focus, + fieldset[disabled] .btn-danger.focus, + .btn-danger.disabled:active, + .btn-danger[disabled]:active, + fieldset[disabled] .btn-danger:active, + .btn-danger.disabled.active, + .btn-danger[disabled].active, + fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; + } + .btn-danger .badge { + color: #d9534f; + background-color: #ffffff; + } + .btn-link { + color: #4d7ecb; + font-weight: normal; + border-radius: 0; + } + .btn-link, + .btn-link:active, + .btn-link.active, + .btn-link[disabled], + fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + } + .btn-link, + .btn-link:hover, + .btn-link:focus, + .btn-link:active { + border-color: transparent; + } + .btn-link:hover, + .btn-link:focus { + color: #2e599d; + text-decoration: underline; + background-color: transparent; + } + .btn-link[disabled]:hover, + fieldset[disabled] .btn-link:hover, + .btn-link[disabled]:focus, + fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; + } + .btn-lg, + .btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 3px; + } + .btn-sm, + .btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 1px; + } + .btn-xs, + .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 1px; + } + .btn-block { + display: block; + width: 100%; + } + .btn-block + .btn-block { + margin-top: 5px; + } + input[type="submit"].btn-block, + input[type="reset"].btn-block, + input[type="button"].btn-block { + width: 100%; + } + .fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + } + .fade.in { + opacity: 1; + } + .collapse { + display: none; + } + .collapse.in { + display: block; + } + tr.collapse.in { + display: table-row; + } + tbody.collapse.in { + display: table-row-group; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; + } + .caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + } + .dropup, + .dropdown { + position: relative; + } + .dropdown-toggle:focus { + outline: 0; + } + .dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 2px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; + } + .dropdown-menu.pull-right { + right: 0; + left: auto; + } + .dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; + } + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; + } + .dropdown-menu > li > a:hover, + .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; + } + .dropdown-menu > .active > a, + .dropdown-menu > .active > a:hover, + .dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #4d7ecb; + } + .dropdown-menu > .disabled > a, + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + color: #777777; + } + .dropdown-menu > .disabled > a:hover, + .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; + } + .open > .dropdown-menu { + display: block; + } + .open > a { + outline: 0; + } + .dropdown-menu-right { + left: auto; + right: 0; + } + .dropdown-menu-left { + left: 0; + right: auto; + } + .dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777777; + white-space: nowrap; + } + .dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; + } + .pull-right > .dropdown-menu { + right: 0; + left: auto; + } + .dropup .caret, + .navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid; + content: ""; + } + .dropup .dropdown-menu, + .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } + @media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } + } + .btn-group, + .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; + } + .btn-group > .btn, + .btn-group-vertical > .btn { + position: relative; + float: left; + } + .btn-group > .btn:hover, + .btn-group-vertical > .btn:hover, + .btn-group > .btn:focus, + .btn-group-vertical > .btn:focus, + .btn-group > .btn:active, + .btn-group-vertical > .btn:active, + .btn-group > .btn.active, + .btn-group-vertical > .btn.active { + z-index: 2; + } + .btn-group .btn + .btn, + .btn-group .btn + .btn-group, + .btn-group .btn-group + .btn, + .btn-group .btn-group + .btn-group { + margin-left: -1px; + } + .btn-toolbar { + margin-left: -5px; + } + .btn-toolbar .btn-group, + .btn-toolbar .input-group { + float: left; + } + .btn-toolbar > .btn, + .btn-toolbar > .btn-group, + .btn-toolbar > .input-group { + margin-left: 5px; + } + .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; + } + .btn-group > .btn:first-child { + margin-left: 0; + } + .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + .btn-group > .btn:last-child:not(:first-child), + .btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .btn-group > .btn-group { + float: left; + } + .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; + } + .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, + .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .btn-group .dropdown-toggle:active, + .btn-group.open .dropdown-toggle { + outline: 0; + } + .btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + } + .btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + } + .btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + } + .btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; + } + .btn .caret { + margin-left: 0; + } + .btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; + } + .dropup .btn-lg .caret { + border-width: 0 5px 5px; + } + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group, + .btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + .btn-group-vertical > .btn-group > .btn { + float: none; + } + .btn-group-vertical > .btn + .btn, + .btn-group-vertical > .btn + .btn-group, + .btn-group-vertical > .btn-group + .btn, + .btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } + .btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; + } + .btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 2px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 2px; + border-top-right-radius: 0; + border-top-left-radius: 0; + } + .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; + } + .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, + .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + } + .btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + } + .btn-group-justified > .btn, + .btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + .btn-group-justified > .btn-group .btn { + width: 100%; + } + .btn-group-justified > .btn-group .dropdown-menu { + left: auto; + } + [data-toggle="buttons"] > .btn input[type="radio"], + [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], + [data-toggle="buttons"] > .btn input[type="checkbox"], + [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; + } + .input-group { + position: relative; + display: table; + border-collapse: separate; + } + .input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; + } + .input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; + } + .input-group-lg > .form-control, + .input-group-lg > .input-group-addon, + .input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 3px; + } + select.input-group-lg > .form-control, + select.input-group-lg > .input-group-addon, + select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; + } + textarea.input-group-lg > .form-control, + textarea.input-group-lg > .input-group-addon, + textarea.input-group-lg > .input-group-btn > .btn, + select[multiple].input-group-lg > .form-control, + select[multiple].input-group-lg > .input-group-addon, + select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; + } + .input-group-sm > .form-control, + .input-group-sm > .input-group-addon, + .input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 1px; + } + select.input-group-sm > .form-control, + select.input-group-sm > .input-group-addon, + select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; + } + textarea.input-group-sm > .form-control, + textarea.input-group-sm > .input-group-addon, + textarea.input-group-sm > .input-group-btn > .btn, + select[multiple].input-group-sm > .form-control, + select[multiple].input-group-sm > .input-group-addon, + select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; + } + .input-group-addon, + .input-group-btn, + .input-group .form-control { + display: table-cell; + } + .input-group-addon:not(:first-child):not(:last-child), + .input-group-btn:not(:first-child):not(:last-child), + .input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; + } + .input-group-addon, + .input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; + } + .input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 2px; + } + .input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 1px; + } + .input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 3px; + } + .input-group-addon input[type="radio"], + .input-group-addon input[type="checkbox"] { + margin-top: 0; + } + .input-group .form-control:first-child, + .input-group-addon:first-child, + .input-group-btn:first-child > .btn, + .input-group-btn:first-child > .btn-group > .btn, + .input-group-btn:first-child > .dropdown-toggle, + .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), + .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + } + .input-group-addon:first-child { + border-right: 0; + } + .input-group .form-control:last-child, + .input-group-addon:last-child, + .input-group-btn:last-child > .btn, + .input-group-btn:last-child > .btn-group > .btn, + .input-group-btn:last-child > .dropdown-toggle, + .input-group-btn:first-child > .btn:not(:first-child), + .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + } + .input-group-addon:last-child { + border-left: 0; + } + .input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; + } + .input-group-btn > .btn { + position: relative; + } + .input-group-btn > .btn + .btn { + margin-left: -1px; + } + .input-group-btn > .btn:hover, + .input-group-btn > .btn:focus, + .input-group-btn > .btn:active { + z-index: 2; + } + .input-group-btn:first-child > .btn, + .input-group-btn:first-child > .btn-group { + margin-right: -1px; + } + .input-group-btn:last-child > .btn, + .input-group-btn:last-child > .btn-group { + margin-left: -1px; + } + .nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; + } + .nav > li { + position: relative; + display: block; + } + .nav > li > a { + position: relative; + display: block; + padding: 10px 15px; + } + .nav > li > a:hover, + .nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + .nav > li.disabled > a { + color: #777777; + } + .nav > li.disabled > a:hover, + .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; + } + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus { + background-color: #eeeeee; + border-color: #4d7ecb; + } + .nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; + } + .nav > li > a > img { + max-width: none; + } + .nav-tabs { + border-bottom: 1px solid #dddddd; + } + .nav-tabs > li { + float: left; + margin-bottom: -1px; + } + .nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 2px 2px 0 0; + } + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; + } + .nav-tabs > li.active > a, + .nav-tabs > li.active > a:hover, + .nav-tabs > li.active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; + } + .nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; + } + .nav-tabs.nav-justified > li { + float: none; + } + .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + .nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; + } + @media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } + } + .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 2px; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; + } + @media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 2px 2px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } + } + .nav-pills > li { + float: left; + } + .nav-pills > li > a { + border-radius: 2px; + } + .nav-pills > li + li { + margin-left: 2px; + } + .nav-pills > li.active > a, + .nav-pills > li.active > a:hover, + .nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #4d7ecb; + } + .nav-stacked > li { + float: none; + } + .nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; + } + .nav-justified { + width: 100%; + } + .nav-justified > li { + float: none; + } + .nav-justified > li > a { + text-align: center; + margin-bottom: 5px; + } + .nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; + } + @media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } + } + .nav-tabs-justified { + border-bottom: 0; + } + .nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 2px; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; + } + @media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 2px 2px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } + } + .tab-content > .tab-pane { + display: none; + } + .tab-content > .active { + display: block; + } + .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; + } + .navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; + } + @media (min-width: 768px) { + .navbar { + border-radius: 2px; + } + } + @media (min-width: 768px) { + .navbar-header { + float: left; + } + } + .navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; + } + .navbar-collapse.in { + overflow-y: auto; + } + @media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } + } + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 340px; + } + @media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } + } + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; + } + @media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } + } + .navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; + } + @media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + } + @media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } + } + .navbar-fixed-top { + top: 0; + border-width: 0 0 1px; + } + .navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; + } + .navbar-brand { + float: left; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; + height: 50px; + } + .navbar-brand:hover, + .navbar-brand:focus { + text-decoration: none; + } + .navbar-brand > img { + display: block; + } + @media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } + } + .navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 2px; + } + .navbar-toggle:focus { + outline: 0; + } + .navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; + } + .navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; + } + @media (min-width: 768px) { + .navbar-toggle { + display: none; + } + } + .navbar-nav { + margin: 7.5px -15px; + } + .navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; + } + @media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } + } + @media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } + } + .navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; + } + @media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } + } + @media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } + } + @media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + } + .navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + } + .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 2px; + border-top-left-radius: 2px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + .navbar-btn { + margin-top: 8px; + margin-bottom: 8px; + } + .navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; + } + .navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; + } + .navbar-text { + margin-top: 15px; + margin-bottom: 15px; + } + @media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } + } + @media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } + } + .navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; + } + .navbar-default .navbar-brand { + color: #777777; + } + .navbar-default .navbar-brand:hover, + .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; + } + .navbar-default .navbar-text { + color: #777777; + } + .navbar-default .navbar-nav > li > a { + color: #777777; + } + .navbar-default .navbar-nav > li > a:hover, + .navbar-default .navbar-nav > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav > .active > a, + .navbar-default .navbar-nav > .active > a:hover, + .navbar-default .navbar-nav > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav > .disabled > a, + .navbar-default .navbar-nav > .disabled > a:hover, + .navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + .navbar-default .navbar-toggle { + border-color: #dddddd; + } + .navbar-default .navbar-toggle:hover, + .navbar-default .navbar-toggle:focus { + background-color: #dddddd; + } + .navbar-default .navbar-toggle .icon-bar { + background-color: #888888; + } + .navbar-default .navbar-collapse, + .navbar-default .navbar-form { + border-color: #e7e7e7; + } + .navbar-default .navbar-nav > .open > a, + .navbar-default .navbar-nav > .open > a:hover, + .navbar-default .navbar-nav > .open > a:focus { + background-color: #e7e7e7; + color: #555555; + } + @media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } + } + .navbar-default .navbar-link { + color: #777777; + } + .navbar-default .navbar-link:hover { + color: #333333; + } + .navbar-default .btn-link { + color: #777777; + } + .navbar-default .btn-link:hover, + .navbar-default .btn-link:focus { + color: #333333; + } + .navbar-default .btn-link[disabled]:hover, + fieldset[disabled] .navbar-default .btn-link:hover, + .navbar-default .btn-link[disabled]:focus, + fieldset[disabled] .navbar-default .btn-link:focus { + color: #cccccc; + } + .navbar-inverse { + background-color: #222222; + border-color: #080808; + } + .navbar-inverse .navbar-brand { + color: #777777; + } + .navbar-inverse .navbar-brand:hover, + .navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-text { + color: #777777; + } + .navbar-inverse .navbar-nav > li > a { + color: #777777; + } + .navbar-inverse .navbar-nav > li > a:hover, + .navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav > .active > a, + .navbar-inverse .navbar-nav > .active > a:hover, + .navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav > .disabled > a, + .navbar-inverse .navbar-nav > .disabled > a:hover, + .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + .navbar-inverse .navbar-toggle { + border-color: #333333; + } + .navbar-inverse .navbar-toggle:hover, + .navbar-inverse .navbar-toggle:focus { + background-color: #333333; + } + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; + } + .navbar-inverse .navbar-collapse, + .navbar-inverse .navbar-form { + border-color: #101010; + } + .navbar-inverse .navbar-nav > .open > a, + .navbar-inverse .navbar-nav > .open > a:hover, + .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #080808; + color: #ffffff; + } + @media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #777777; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } + } + .navbar-inverse .navbar-link { + color: #777777; + } + .navbar-inverse .navbar-link:hover { + color: #ffffff; + } + .navbar-inverse .btn-link { + color: #777777; + } + .navbar-inverse .btn-link:hover, + .navbar-inverse .btn-link:focus { + color: #ffffff; + } + .navbar-inverse .btn-link[disabled]:hover, + fieldset[disabled] .navbar-inverse .btn-link:hover, + .navbar-inverse .btn-link[disabled]:focus, + fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444444; + } + .breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 2px; + } + .breadcrumb > li { + display: inline-block; + } + .breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #cccccc; + } + .breadcrumb > .active { + color: #777777; + } + .pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 2px; + } + .pagination > li { + display: inline; + } + .pagination > li > a, + .pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + line-height: 1.42857143; + text-decoration: none; + color: #4d7ecb; + background-color: #ffffff; + border: 1px solid #dddddd; + margin-left: -1px; + } + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + } + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + } + .pagination > li > a:hover, + .pagination > li > span:hover, + .pagination > li > a:focus, + .pagination > li > span:focus { + color: #2e599d; + background-color: #eeeeee; + border-color: #dddddd; + } + .pagination > .active > a, + .pagination > .active > span, + .pagination > .active > a:hover, + .pagination > .active > span:hover, + .pagination > .active > a:focus, + .pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #4d7ecb; + border-color: #4d7ecb; + cursor: default; + } + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #777777; + background-color: #ffffff; + border-color: #dddddd; + cursor: not-allowed; + } + .pagination-lg > li > a, + .pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + } + .pagination-lg > li:first-child > a, + .pagination-lg > li:first-child > span { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + } + .pagination-lg > li:last-child > a, + .pagination-lg > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + } + .pagination-sm > li > a, + .pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + } + .pagination-sm > li:first-child > a, + .pagination-sm > li:first-child > span { + border-bottom-left-radius: 1px; + border-top-left-radius: 1px; + } + .pagination-sm > li:last-child > a, + .pagination-sm > li:last-child > span { + border-bottom-right-radius: 1px; + border-top-right-radius: 1px; + } + .pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; + } + .pager li { + display: inline; + } + .pager li > a, + .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; + } + .pager li > a:hover, + .pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; + } + .pager .next > a, + .pager .next > span { + float: right; + } + .pager .previous > a, + .pager .previous > span { + float: left; + } + .pager .disabled > a, + .pager .disabled > a:hover, + .pager .disabled > a:focus, + .pager .disabled > span { + color: #777777; + background-color: #ffffff; + cursor: not-allowed; + } + .label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; + } + a.label:hover, + a.label:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + } + .label:empty { + display: none; + } + .btn .label { + position: relative; + top: -1px; + } + .label-default { + background-color: #777777; + } + .label-default[href]:hover, + .label-default[href]:focus { + background-color: #5e5e5e; + } + .label-primary { + background-color: #4d7ecb; + } + .label-primary[href]:hover, + .label-primary[href]:focus { + background-color: #3465b1; + } + .label-success { + background-color: #d5e0a7; + } + .label-success[href]:hover, + .label-success[href]:focus { + background-color: #c3d381; + } + .label-info { + background-color: #c6c6c6; + } + .label-info[href]:hover, + .label-info[href]:focus { + background-color: #adadad; + } + .label-warning { + background-color: #f2edac; + } + .label-warning[href]:hover, + .label-warning[href]:focus { + background-color: #ebe380; + } + .label-danger { + background-color: #d9534f; + } + .label-danger[href]:hover, + .label-danger[href]:focus { + background-color: #c9302c; + } + .badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; + } + .badge:empty { + display: none; + } + .btn .badge { + position: relative; + top: -1px; + } + .btn-xs .badge, + .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; + } + a.badge:hover, + a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; + } + .list-group-item.active > .badge, + .nav-pills > .active > a > .badge { + color: #4d7ecb; + background-color: #ffffff; + } + .list-group-item > .badge { + float: right; + } + .list-group-item > .badge + .badge { + margin-right: 5px; + } + .nav-pills > li > a > .badge { + margin-left: 3px; + } + .jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; + } + .jumbotron h1, + .jumbotron .h1 { + color: inherit; + } + .jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; + } + .jumbotron > hr { + border-top-color: #d5d5d5; + } + .container .jumbotron, + .container-fluid .jumbotron { + border-radius: 3px; + } + .jumbotron .container { + max-width: 100%; + } + @media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } + } + .thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 2px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; + } + .thumbnail > img, + .thumbnail a > img { + margin-left: auto; + margin-right: auto; + } + a.thumbnail:hover, + a.thumbnail:focus, + a.thumbnail.active { + border-color: #4d7ecb; + } + .thumbnail .caption { + padding: 9px; + color: #000000; + } + .alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 2px; + } + .alert h4 { + margin-top: 0; + color: inherit; + } + .alert .alert-link { + font-weight: bold; + } + .alert > p, + .alert > ul { + margin-bottom: 0; + } + .alert > p + p { + margin-top: 5px; + } + .alert-dismissable, + .alert-dismissible { + padding-right: 35px; + } + .alert-dismissable .close, + .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } + .alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; + } + .alert-success hr { + border-top-color: #c9e2b3; + } + .alert-success .alert-link { + color: #2b542c; + } + .alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; + } + .alert-info hr { + border-top-color: #a6e1ec; + } + .alert-info .alert-link { + color: #245269; + } + .alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; + } + .alert-warning hr { + border-top-color: #f7e1b5; + } + .alert-warning .alert-link { + color: #66512c; + } + .alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; + } + .alert-danger hr { + border-top-color: #e4b9c0; + } + .alert-danger .alert-link { + color: #843534; + } + @-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } + } + @keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } + } + .progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 2px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + } + .progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #4d7ecb; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; + } + .progress-striped .progress-bar, + .progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; + } + .progress.active .progress-bar, + .progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; + } + .progress-bar-success { + background-color: #d5e0a7; + } + .progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + } + .progress-bar-info { + background-color: #c6c6c6; + } + .progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + } + .progress-bar-warning { + background-color: #f2edac; + } + .progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + } + .progress-bar-danger { + background-color: #d9534f; + } + .progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + } + .media { + margin-top: 15px; + } + .media:first-child { + margin-top: 0; + } + .media, + .media-body { + zoom: 1; + overflow: hidden; + } + .media-body { + width: 10000px; + } + .media-object { + display: block; + } + .media-right, + .media > .pull-right { + padding-left: 10px; + } + .media-left, + .media > .pull-left { + padding-right: 10px; + } + .media-left, + .media-right, + .media-body { + display: table-cell; + vertical-align: top; + } + .media-middle { + vertical-align: middle; + } + .media-bottom { + vertical-align: bottom; + } + .media-heading { + margin-top: 0; + margin-bottom: 5px; + } + .media-list { + padding-left: 0; + list-style: none; + } + .list-group { + margin-bottom: 20px; + padding-left: 0; + } + .list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; + } + .list-group-item:first-child { + border-top-right-radius: 2px; + border-top-left-radius: 2px; + } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + } + a.list-group-item { + color: #555555; + } + a.list-group-item .list-group-item-heading { + color: #333333; + } + a.list-group-item:hover, + a.list-group-item:focus { + text-decoration: none; + color: #555555; + background-color: #f5f5f5; + } + .list-group-item.disabled, + .list-group-item.disabled:hover, + .list-group-item.disabled:focus { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; + } + .list-group-item.disabled .list-group-item-heading, + .list-group-item.disabled:hover .list-group-item-heading, + .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; + } + .list-group-item.disabled .list-group-item-text, + .list-group-item.disabled:hover .list-group-item-text, + .list-group-item.disabled:focus .list-group-item-text { + color: #777777; + } + .list-group-item.active, + .list-group-item.active:hover, + .list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #4d7ecb; + border-color: #4d7ecb; + } + .list-group-item.active .list-group-item-heading, + .list-group-item.active:hover .list-group-item-heading, + .list-group-item.active:focus .list-group-item-heading, + .list-group-item.active .list-group-item-heading > small, + .list-group-item.active:hover .list-group-item-heading > small, + .list-group-item.active:focus .list-group-item-heading > small, + .list-group-item.active .list-group-item-heading > .small, + .list-group-item.active:hover .list-group-item-heading > .small, + .list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; + } + .list-group-item.active .list-group-item-text, + .list-group-item.active:hover .list-group-item-text, + .list-group-item.active:focus .list-group-item-text { + color: #ebf0f9; + } + .list-group-item-success { + color: #3c763d; + background-color: #dff0d8; + } + a.list-group-item-success { + color: #3c763d; + } + a.list-group-item-success .list-group-item-heading { + color: inherit; + } + a.list-group-item-success:hover, + a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; + } + a.list-group-item-success.active, + a.list-group-item-success.active:hover, + a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; + } + .list-group-item-info { + color: #31708f; + background-color: #d9edf7; + } + a.list-group-item-info { + color: #31708f; + } + a.list-group-item-info .list-group-item-heading { + color: inherit; + } + a.list-group-item-info:hover, + a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; + } + a.list-group-item-info.active, + a.list-group-item-info.active:hover, + a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; + } + .list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; + } + a.list-group-item-warning { + color: #8a6d3b; + } + a.list-group-item-warning .list-group-item-heading { + color: inherit; + } + a.list-group-item-warning:hover, + a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; + } + a.list-group-item-warning.active, + a.list-group-item-warning.active:hover, + a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; + } + .list-group-item-danger { + color: #a94442; + background-color: #f2dede; + } + a.list-group-item-danger { + color: #a94442; + } + a.list-group-item-danger .list-group-item-heading { + color: inherit; + } + a.list-group-item-danger:hover, + a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; + } + a.list-group-item-danger.active, + a.list-group-item-danger.active:hover, + a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; + } + .list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; + } + .list-group-item-text { + margin-bottom: 0; + line-height: 1.3; + } + .panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 2px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + } + .panel-body { + padding: 15px; + } + .panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 1px; + border-top-left-radius: 1px; + } + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; + } + .panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; + } + .panel-title > a, + .panel-title > small, + .panel-title > .small, + .panel-title > small > a, + .panel-title > .small > a { + color: inherit; + } + .panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 1px; + border-bottom-left-radius: 1px; + } + .panel > .list-group, + .panel > .panel-collapse > .list-group { + margin-bottom: 0; + } + .panel > .list-group .list-group-item, + .panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; + } + .panel > .list-group:first-child .list-group-item:first-child, + .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 1px; + border-top-left-radius: 1px; + } + .panel > .list-group:last-child .list-group-item:last-child, + .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 1px; + border-bottom-left-radius: 1px; + } + .panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; + } + .list-group + .panel-footer { + border-top-width: 0; + } + .panel > .table, + .panel > .table-responsive > .table, + .panel > .panel-collapse > .table { + margin-bottom: 0; + } + .panel > .table caption, + .panel > .table-responsive > .table caption, + .panel > .panel-collapse > .table caption { + padding-left: 15px; + padding-right: 15px; + } + .panel > .table:first-child, + .panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 1px; + border-top-left-radius: 1px; + } + .panel > .table:first-child > thead:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 1px; + border-top-right-radius: 1px; + } + .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 1px; + } + .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 1px; + } + .panel > .table:last-child, + .panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 1px; + border-bottom-left-radius: 1px; + } + .panel > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + } + .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 1px; + } + .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 1px; + } + .panel > .panel-body + .table, + .panel > .panel-body + .table-responsive, + .panel > .table + .panel-body, + .panel > .table-responsive + .panel-body { + border-top: 1px solid #dddddd; + } + .panel > .table > tbody:first-child > tr:first-child th, + .panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; + } + .panel > .table-bordered, + .panel > .table-responsive > .table-bordered { + border: 0; + } + .panel > .table-bordered > thead > tr > th:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, + .panel > .table-bordered > tbody > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, + .panel > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-bordered > thead > tr > td:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, + .panel > .table-bordered > tbody > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, + .panel > .table-bordered > tfoot > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .panel > .table-bordered > thead > tr > th:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, + .panel > .table-bordered > tbody > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, + .panel > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-bordered > thead > tr > td:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, + .panel > .table-bordered > tbody > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, + .panel > .table-bordered > tfoot > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .panel > .table-bordered > thead > tr:first-child > td, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, + .panel > .table-bordered > tbody > tr:first-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, + .panel > .table-bordered > thead > tr:first-child > th, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, + .panel > .table-bordered > tbody > tr:first-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; + } + .panel > .table-bordered > tbody > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, + .panel > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-bordered > tbody > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, + .panel > .table-bordered > tfoot > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; + } + .panel > .table-responsive { + border: 0; + margin-bottom: 0; + } + .panel-group { + margin-bottom: 20px; + } + .panel-group .panel { + margin-bottom: 0; + border-radius: 2px; + } + .panel-group .panel + .panel { + margin-top: 5px; + } + .panel-group .panel-heading { + border-bottom: 0; + } + .panel-group .panel-heading + .panel-collapse > .panel-body, + .panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #dddddd; + } + .panel-group .panel-footer { + border-top: 0; + } + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; + } + .panel-default { + border-color: #dddddd; + } + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; + } + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #dddddd; + } + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; + } + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #dddddd; + } + .panel-primary { + border-color: #4d7ecb; + } + .panel-primary > .panel-heading { + color: #ffffff; + background-color: #4d7ecb; + border-color: #4d7ecb; + } + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #4d7ecb; + } + .panel-primary > .panel-heading .badge { + color: #4d7ecb; + background-color: #ffffff; + } + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #4d7ecb; + } + .panel-success { + border-color: #d6e9c6; + } + .panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; + } + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; + } + .panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; + } + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; + } + .panel-info { + border-color: #bce8f1; + } + .panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; + } + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; + } + .panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; + } + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; + } + .panel-warning { + border-color: #faebcc; + } + .panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; + } + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; + } + .panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; + } + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; + } + .panel-danger { + border-color: #ebccd1; + } + .panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; + } + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; + } + .panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; + } + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; + } + .embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; + } + .embed-responsive-16by9 { + padding-bottom: 56.25%; + } + .embed-responsive-4by3 { + padding-bottom: 75%; + } + .well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 2px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + } + .well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); + } + .well-lg { + padding: 24px; + border-radius: 3px; + } + .well-sm { + padding: 9px; + border-radius: 1px; + } + .close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); + } + .close:hover, + .close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); + } + button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } + .modal-open { + overflow: hidden; + } + .modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; + } + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + } + .modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } + .modal-open .modal { + overflow-x: hidden; + overflow-y: auto; + } + .modal-dialog { + position: relative; + width: auto; + margin: 10px; + } + .modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 3px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; + } + .modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; + } + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); + } + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); + } + .modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.42857143px; + } + .modal-header .close { + margin-top: -2px; + } + .modal-title { + margin: 0; + line-height: 1.42857143; + } + .modal-body { + position: relative; + padding: 15px; + } + .modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; + } + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; + } + .modal-footer .btn-group .btn + .btn { + margin-left: -1px; + } + .modal-footer .btn-block + .btn-block { + margin-left: 0; + } + .modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; + } + @media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } + } + @media (min-width: 992px) { + .modal-lg { + width: 900px; + } + } + .tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Comic Neue", "Comic Sans MS", "Comic Sans"; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + } + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); + } + .tooltip.top { + margin-top: -3px; + padding: 5px 0; + } + .tooltip.right { + margin-left: 3px; + padding: 0 5px; + } + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; + } + .tooltip.left { + margin-left: -3px; + padding: 0 5px; + } + .tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 2px; + } + .tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + .tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; + } + .tooltip.top-left .tooltip-arrow { + bottom: 0; + right: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; + } + .tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; + } + .tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; + } + .tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; + } + .tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; + } + .tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; + } + .tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; + } + .popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Comic Neue", "Comic Sans MS", "Comic Sans"; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 3px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; + } + .popover.top { + margin-top: -10px; + } + .popover.right { + margin-left: 10px; + } + .popover.bottom { + margin-top: 10px; + } + .popover.left { + margin-left: -10px; + } + .popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 2px 2px 0 0; + } + .popover-content { + padding: 9px 14px; + } + .popover > .arrow, + .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } + .popover > .arrow { + border-width: 11px; + } + .popover > .arrow:after { + border-width: 10px; + content: ""; + } + .popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; + } + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; + } + .popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + } + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; + } + .popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; + } + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; + } + .popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); + } + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; + } + .carousel { + position: relative; + } + .carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + } + .carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; + } + .carousel-inner > .item > img, + .carousel-inner > .item > a > img { + line-height: 1; + } + @media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + -moz-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; + } + } + .carousel-inner > .active, + .carousel-inner > .next, + .carousel-inner > .prev { + display: block; + } + .carousel-inner > .active { + left: 0; + } + .carousel-inner > .next, + .carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; + } + .carousel-inner > .next { + left: 100%; + } + .carousel-inner > .prev { + left: -100%; + } + .carousel-inner > .next.left, + .carousel-inner > .prev.right { + left: 0; + } + .carousel-inner > .active.left { + left: -100%; + } + .carousel-inner > .active.right { + left: 100%; + } + .carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + } + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + } + .carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + } + .carousel-control:hover, + .carousel-control:focus { + outline: 0; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); + } + .carousel-control .icon-prev, + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + } + .carousel-control .icon-prev, + .carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + line-height: 1; + font-family: serif; + } + .carousel-control .icon-prev:before { + content: '\2039'; + } + .carousel-control .icon-next:before { + content: '\203a'; + } + .carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + } + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + } + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; + } + .carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + } + .carousel-caption .btn { + text-shadow: none; + } + @media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } + } + .clearfix:before, + .clearfix:after, + .dl-horizontal dd:before, + .dl-horizontal dd:after, + .container:before, + .container:after, + .container-fluid:before, + .container-fluid:after, + .row:before, + .row:after, + .form-horizontal .form-group:before, + .form-horizontal .form-group:after, + .btn-toolbar:before, + .btn-toolbar:after, + .btn-group-vertical > .btn-group:before, + .btn-group-vertical > .btn-group:after, + .nav:before, + .nav:after, + .navbar:before, + .navbar:after, + .navbar-header:before, + .navbar-header:after, + .navbar-collapse:before, + .navbar-collapse:after, + .pager:before, + .pager:after, + .panel-body:before, + .panel-body:after, + .modal-footer:before, + .modal-footer:after { + content: " "; + display: table; + } + .clearfix:after, + .dl-horizontal dd:after, + .container:after, + .container-fluid:after, + .row:after, + .form-horizontal .form-group:after, + .btn-toolbar:after, + .btn-group-vertical > .btn-group:after, + .nav:after, + .navbar:after, + .navbar-header:after, + .navbar-collapse:after, + .pager:after, + .panel-body:after, + .modal-footer:after { + clear: both; + } + .center-block { + display: block; + margin-left: auto; + margin-right: auto; + } + .pull-right { + float: right !important; + } + .pull-left { + float: left !important; + } + .hide { + display: none !important; + } + .show { + display: block !important; + } + .invisible { + visibility: hidden; + } + .text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; + } + .hidden { + display: none !important; + } + .affix { + position: fixed; + } + @-ms-viewport { + width: device-width; + } + .visible-xs, + .visible-sm, + .visible-md, + .visible-lg { + display: none !important; + } + .visible-xs-block, + .visible-xs-inline, + .visible-xs-inline-block, + .visible-sm-block, + .visible-sm-inline, + .visible-sm-inline-block, + .visible-md-block, + .visible-md-inline, + .visible-md-inline-block, + .visible-lg-block, + .visible-lg-inline, + .visible-lg-inline-block { + display: none !important; + } + @media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } + } + @media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } + } + @media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } + } + @media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } + } + @media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } + } + @media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } + } + @media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } + } + @media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } + } + @media (max-width: 767px) { + .hidden-xs { + display: none !important; + } + } + @media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } + } + @media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } + } + @media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } + } + .visible-print { + display: none !important; + } + @media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } + } + .visible-print-block { + display: none !important; + } + @media print { + .visible-print-block { + display: block !important; + } + } + .visible-print-inline { + display: none !important; + } + @media print { + .visible-print-inline { + display: inline !important; + } + } + .visible-print-inline-block { + display: none !important; + } + @media print { + .visible-print-inline-block { + display: inline-block !important; + } + } + @media print { + .hidden-print { + display: none !important; + } + } + /*our custom variable*/ + /*our customizations beyond variables*/ + /*fonts*/ + @font-face { + font-family: 'Redacted Script'; + src: url('../fonts/redacted-script-bold.woff2') format('woff2'), url('../fonts/redacted-script-bold.woff') format('woff'); + font-weight: 700; + font-style: normal; + } + @font-face { + font-family: 'Redacted Script'; + src: url('../fonts/redacted-script-light.woff2') format('woff2'), url('../fonts/redacted-script-light.woff') format('woff'); + font-weight: 200; + font-style: normal; + } + @font-face { + font-family: 'Redacted Script'; + src: url('../fonts/redacted-script-regular.woff2') format('woff2'), url('../fonts/redacted-script-regular.woff') format('woff'); + font-weight: 400; + font-style: normal; + } + @font-face { + font-family: 'Comic Neue'; + src: url('../fonts/ComicNeue-Regular.woff2') format('woff2'), url('../fonts/ComicNeue-Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; + } + @font-face { + font-family: 'Comic Neue'; + src: url('../fonts/ComicNeue-Bold.woff2') format('woff2'), url('../fonts/ComicNeue-Bold.woff') format('woff'); + font-weight: 700; + font-style: normal; + } + @font-face { + font-family: 'Comic Neue'; + src: url('../fonts/ComicNeue-Regular-Oblique.woff2') format('woff2'), url('../fonts/ComicNeue-Regular-Oblique.woff') format('woff'); + font-weight: 400; + font-style: italic; + } + @font-face { + font-family: 'Comic Neue'; + src: url('../fonts/ComicNeue-Bold-Oblique.woff2') format('woff2'), url('../fonts/ComicNeue-Bold-Oblique.woff') format('woff'); + font-weight: 700; + font-style: italic; + } + /*mixins*/ + .borderMixin { + border-width: 2px; + border-style: solid; + border-radius: 2px; + border-color: black; + } + .blackWhiteMixin { + background-color: white; + color: black; + } + .radiusNormMixin { + border-radius: 2px; + } + /*use redacted for paragraphs...*/ + p { + font-family: "Redacted Script", "Comic Neue", "Comic Sans MS", "Comic Sans"; + } + /*...but not for buttons, and not for inputs and nav (which should be in divs anyway)*/ + p .btn, + p .input-group, + p .nav { + font-family: "Comic Neue", "Comic Sans MS", "Comic Sans"; + } + .btn { + border-width: 2px; + border-style: solid; + border-radius: 2px; + border-color: black; + box-shadow: 4px 4px rgba(0, 0, 0, 0.5); + font-weight: bold; + } + .btn.active { + box-shadow: none; + background-color: #2e599d; + border-top: 4px solid black; + border-left: 4px solid black; + border-bottom: none; + border-right: none; + } + .lable { + border-radius: 2px; + } + .img-thumbnail, + .list-group-item, + list-group-item.active, + .panel { + border-width: 2px; + border-style: solid; + border-radius: 2px; + border-color: black; + background-color: white; + color: black; + } + .well, + .jumbotron, + .list-group-item.active { + border-width: 2px; + border-style: solid; + border-radius: 2px; + border-color: black; + } + .page-header { + border-bottom: 2px #000; + } + .nav-tabs { + border-bottom: 2px solid #000; + } + .nav-tabs > li { + margin-bottom: -2px; + } + .nav-tabs > li.active > a, + .nav-tabs > li.active > a:hover, + .nav-tabs > li.active > a:focus { + border-color: #000 #000; + border-image: none; + border-style: solid; + border-width: 1px; + color: #000; + cursor: default; + } + .navbar-default, + .pager li > a, + .pager li > span { + border-width: 2px; + border-style: solid; + border-radius: 2px; + border-color: black; + } + .progress { + box-shadow: none; + } + .btn-success, + .btn-info, + .btn-warning, + .btn-danger, + .panel-success, + .panel-warning, + .panel-info, + .panel-danger, + .lable-success, + .lable-info, + .lable-warning, + .lable-danger { + color: black; + } + .navbar-default .navbar-nav > .active > a, + .navbar-default .navbar-nav > .active > a:hover, + .navbar-default .navbar-nav > .active > a:focus { + background-color: gray; + color: white; + } + /*when using comic neue, bold font wight should be used for controls */ + .navbar, + .nav, + .btn, + .dropdown, + form { + font-weight: bold; + } + /*set path to bootstrap*/ + \ No newline at end of file diff --git a/assets/fonts/ComicNeue-Bold.ttf b/assets/fonts/ComicNeue-Bold.ttf new file mode 100644 index 000000000..dc9a6d552 Binary files /dev/null and b/assets/fonts/ComicNeue-Bold.ttf differ diff --git a/assets/fonts/ComicNeue-BoldItalic.ttf b/assets/fonts/ComicNeue-BoldItalic.ttf new file mode 100644 index 000000000..882ef3bdb Binary files /dev/null and b/assets/fonts/ComicNeue-BoldItalic.ttf differ diff --git a/assets/fonts/ComicNeue-Italic.ttf b/assets/fonts/ComicNeue-Italic.ttf new file mode 100644 index 000000000..9626d8f57 Binary files /dev/null and b/assets/fonts/ComicNeue-Italic.ttf differ diff --git a/assets/fonts/ComicNeue-Light.ttf b/assets/fonts/ComicNeue-Light.ttf new file mode 100644 index 000000000..85c82bbdd Binary files /dev/null and b/assets/fonts/ComicNeue-Light.ttf differ diff --git a/assets/fonts/ComicNeue-LightItalic.ttf b/assets/fonts/ComicNeue-LightItalic.ttf new file mode 100644 index 000000000..8329c4fc4 Binary files /dev/null and b/assets/fonts/ComicNeue-LightItalic.ttf differ diff --git a/assets/fonts/ComicNeue-Regular.ttf b/assets/fonts/ComicNeue-Regular.ttf new file mode 100644 index 000000000..d454f4693 Binary files /dev/null and b/assets/fonts/ComicNeue-Regular.ttf differ diff --git a/assets/fonts/RedactedScript-Bold.woff2 b/assets/fonts/RedactedScript-Bold.woff2 new file mode 100644 index 000000000..d9f894154 Binary files /dev/null and b/assets/fonts/RedactedScript-Bold.woff2 differ diff --git a/assets/fonts/RedactedScript-Light.woff2 b/assets/fonts/RedactedScript-Light.woff2 new file mode 100644 index 000000000..51df0f4ad Binary files /dev/null and b/assets/fonts/RedactedScript-Light.woff2 differ diff --git a/assets/fonts/RedactedScript-Regular.woff2 b/assets/fonts/RedactedScript-Regular.woff2 new file mode 100644 index 000000000..27e57dc42 Binary files /dev/null and b/assets/fonts/RedactedScript-Regular.woff2 differ diff --git a/assets/img/ataaka.png b/assets/img/ataaka.png index d223d6cf2..1ef1c347b 100644 Binary files a/assets/img/ataaka.png and b/assets/img/ataaka.png differ diff --git a/assets/img/atilamedika.png b/assets/img/atilamedika.png new file mode 100644 index 000000000..7a4f9db9f Binary files /dev/null and b/assets/img/atilamedika.png differ diff --git a/assets/img/bootstrap.png b/assets/img/bootstrap.png index da9344f70..92a22950f 100644 Binary files a/assets/img/bootstrap.png and b/assets/img/bootstrap.png differ diff --git a/assets/img/cerulean.png b/assets/img/cerulean.png index 15100fc65..f6a4fff7f 100644 Binary files a/assets/img/cerulean.png and b/assets/img/cerulean.png differ diff --git a/assets/img/cosmo.png b/assets/img/cosmo.png index c71d7a65e..265c5b11a 100644 Binary files a/assets/img/cosmo.png and b/assets/img/cosmo.png differ diff --git a/assets/img/cyborg.png b/assets/img/cyborg.png index cd89625b7..7f03c8840 100644 Binary files a/assets/img/cyborg.png and b/assets/img/cyborg.png differ diff --git a/assets/img/darkly.png b/assets/img/darkly.png index 5a411f3e4..6c33ffcd6 100644 Binary files a/assets/img/darkly.png and b/assets/img/darkly.png differ diff --git a/assets/img/flatly.png b/assets/img/flatly.png index 2c64a0db3..e4816e01f 100644 Binary files a/assets/img/flatly.png and b/assets/img/flatly.png differ diff --git a/assets/img/journal.png b/assets/img/journal.png index 530ad3bdc..c4a2a1444 100644 Binary files a/assets/img/journal.png and b/assets/img/journal.png differ diff --git a/assets/img/lumen.png b/assets/img/lumen.png index ad0745add..1582e1f92 100644 Binary files a/assets/img/lumen.png and b/assets/img/lumen.png differ diff --git a/assets/img/mlite.png b/assets/img/mlite.png index 5f1d29f0f..7a4f9db9f 100644 Binary files a/assets/img/mlite.png and b/assets/img/mlite.png differ diff --git a/assets/img/paper.png b/assets/img/paper.png index 070d6d813..1d0402dcf 100644 Binary files a/assets/img/paper.png and b/assets/img/paper.png differ diff --git a/assets/img/readable.png b/assets/img/readable.png index 24a6d9f7b..06d20b1a0 100644 Binary files a/assets/img/readable.png and b/assets/img/readable.png differ diff --git a/assets/img/sandstone.png b/assets/img/sandstone.png index fccee55d7..cb99702d7 100644 Binary files a/assets/img/sandstone.png and b/assets/img/sandstone.png differ diff --git a/assets/img/simplex.png b/assets/img/simplex.png index 754e8c540..f98c0daf3 100644 Binary files a/assets/img/simplex.png and b/assets/img/simplex.png differ diff --git a/assets/img/sketchy.png b/assets/img/sketchy.png new file mode 100644 index 000000000..8ac8f74da Binary files /dev/null and b/assets/img/sketchy.png differ diff --git a/assets/img/slate.png b/assets/img/slate.png index b6cc60893..859756a40 100644 Binary files a/assets/img/slate.png and b/assets/img/slate.png differ diff --git a/assets/img/spacelab.png b/assets/img/spacelab.png index cba6be2e9..347c9bba6 100644 Binary files a/assets/img/spacelab.png and b/assets/img/spacelab.png differ diff --git a/assets/img/superhero.png b/assets/img/superhero.png index 0432902ff..d4b658062 100644 Binary files a/assets/img/superhero.png and b/assets/img/superhero.png differ diff --git a/assets/img/united.png b/assets/img/united.png index 9e0ebac8a..b7aa043a7 100644 Binary files a/assets/img/united.png and b/assets/img/united.png differ diff --git a/assets/img/yeti.png b/assets/img/yeti.png index 97bb7bad8..aa0a73b8a 100644 Binary files a/assets/img/yeti.png and b/assets/img/yeti.png differ diff --git a/assets/jscripts/chart.js b/assets/jscripts/chart.js new file mode 100644 index 000000000..c0f9743ee --- /dev/null +++ b/assets/jscripts/chart.js @@ -0,0 +1,20 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/chart.js@4.4.3/dist/chart.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * Chart.js v4.4.3 + * https://www.chartjs.org + * (c) 2024 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class xt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var bt=new xt; +/*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function xe(t,e){return me(t).getPropertyValue(e)}const be=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=be[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=t&&ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};fe()&&(window.addEventListener("test",null,e),window.removeEventListener("test",null,e))}catch(t){}return t}();function Pe(t,e){const i=xe(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e)||"constructor"===e)return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const xi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,bi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(xi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(bi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hb||l(n,x,p)&&0!==r(n,x),v=()=>!b||0===r(o,p)||l(o,x,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==x&&(b=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,x=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tji(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),"y",i.intersect,s)}};const qi=["left","top","right","bottom"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Zi(Ki(e,"left"),!0),n=Zi(Ki(e,"right")),o=Zi(Ki(e,"top"),!0),a=Zi(Ki(e,"bottom")),r=Gi(e,"x"),l=Gi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const hs="$chartjs",cs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ds=t=>null===t||""===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t&&t.canvas&&t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const xs=new Map;let bs=0;function _s(){const t=window.devicePixelRatio;t!==bs&&(bs=t,xs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){xs.size||window.addEventListener("resize",_s),xs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){xs.delete(t),xs.size||window.removeEventListener("resize",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t&&t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ds(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(ds(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=t&&ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps="transparent",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(bt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>"reset"===t||"none"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,"x")),o=e.yAxisID=l(i.yAxisID,Fs(t,"y")),a=e.rAxisID=l(i.rAxisID,Fs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e)){const t=this._cachedMeta;this._data=function(t,e){const{iScale:i,vScale:s}=e,n="x"===i.axis?"x":"y",o="x"===s.axis?"x":"y",a=Object.keys(t),r=new Array(a.length);let l,h,c;for(l=0,h=a.length;l0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,x=function(t){return Ae(i,t,p)};let b,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)b=x(this.bottom),w=this.bottom-u,S=b-m,D=x(t.top)+m,O=t.bottom;else if("bottom"===a)b=x(this.top),D=t.top,O=x(t.bottom)-m,w=b+m,S=this.top+u;else if("left"===a)b=x(this.right),M=this.right-u,k=b-m,P=x(t.left)+m,C=t.right;else if("right"===a)b=x(this.left),P=t.left,C=x(t.right)-m,M=b+m,k=this.left+u;else if("x"===e){if("center"===a)b=x((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=b+m,S=w+u}else if("y"===e){if("center"===a)b=x((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];b=x(this.chart.scales[t].getPixelForValue(e))}M=b-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_0&&(o-=s/2)}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}x.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return x}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return"top"===t?"left":"right";let i="center";return"start"===e.align?i="left":"end"===e.align?i="right":"inner"===e.align&&(i="inner"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return"left"===e?s?(l=this.right+n,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l+=a)):(l=this.right-o,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l=this.left)):"right"===e?s?(l=this.left+n,"near"===i?r="right":"center"===i?(r="center",l-=a/2):(r="left",l-=a)):(l=this.left+o,"near"===i?r="left":"center"===i?(r="center",l+=a/2):(r="right",l=this.right)):r="right",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return"left"===e||"right"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:"top"===e||"bottom"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,"datasets",!0),this.elements=new Qs(Hs,"elements"),this.plugins=new Qs(Object,"plugins"),this.scales=new Qs(Js,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function rn(t){if("x"===t||"y"===t||"r"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,"x",i[0])||hn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=b(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),b(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];b(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class xn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=bn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=bn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function bn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).some((e=>S(t[e])));const yn=["top","bottom","left","right","chartArea"];function vn(t,e){return"top"===t||"bottom"===t||-1===yn.indexOf(t)&&"x"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version="4.4.3";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new xn(e),n=Sn(t),o=Dn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(bt.listen(this,"complete",wn),bt.listen(this,"progress",kn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return bt.stop(this),this}resize(t,e){bt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,"left"),right:On(i,e,"right"),top:On(s,e,"top"),bottom:On(s,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),bt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),x=g(C,h,d),b=g(C+E,c,u);s=(p-x)/2,n=(m-b)/2,o=-(p+x)/2,a=-(m+b)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),x=(i.width-o)/f,b=(i.height-o)/g,_=Math.max(Math.min(x,b)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(x-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);x=Math.max(Math.min(x,h),o),d=x+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(x))}if(x===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;x+=t,u-=t}return{size:u,base:x,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=x?g:{};if(i=b){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),x||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:$n,RadarController:class extends Ns{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>x,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),b||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,x=n-p-f,{outerStart:b,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,x-m),M=d-b,w=d-_,k=m+b/M,S=x-_/w,P=u+y,D=u+v,O=m+y/P,A=x-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,x+E)}const i=Xn(D,x,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,x+E,A+Math.PI)}const s=(x-v/u+(m+y/u))/2;if(t.arc(a,r,u,x-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),b>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,b,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[b(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[b(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(x*m+e)/++x):(_(),t.lineTo(e,i),u=s,x=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io="function"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,x=!s(a),b=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!x&&!b)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),x&&b&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=x?a:M,w=b?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(x&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return b&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):b&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class bo extends xo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=xo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){xo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e||0===e&&this.min<0){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&this.min>=0&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),b(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id="category";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:bo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id="timeseries";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Yo=$o.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const x=[],b=e+i-1,_=t[e].x,y=t[b].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&x.push({...t[e],x:p}),s!==u&&s!==i&&x.push({...t[s],x:p})}o>0&&i!==u&&x.push(t[i]),x.push(a),h=e,m=0,f=g=l,c=d=u=o}}return x}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&"beforeDatasetDraw"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const xa=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class ba extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=xa(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=xa(o,d),x=this.isHorizontal(),b=this._computeTitleHeight();f=x?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+b,line:0}:{x:this.left+c,y:ft(n,this.top+b+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),x?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+b+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,x?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),x)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var Ma={id:"title",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:"subtitle",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=new Set,n=0,o=0;for(e=0,i=t.length;et+e))/s.size,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i-1?t.split("\n"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,x=0,b=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(b+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),b){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(b-g)*l.lineHeight+(b-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){x=Math.max(x,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),x+=p.width,{width:x,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,"beforeLabel",this,t))),Pa(e.lines,Fa(n,"label",this,t)),Pa(e.after,Da(Fa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,"beforeFooter",this,t),n=Fa(i,"footer",this,t),o=Fa(i,"afterFooter",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,"labelColor",this,e)),n.push(Fa(i,"labelPointStyle",this,e)),o.push(Fa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,x,b,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,b=_+o,y=_-o):(p=d+f,m=p+o,b=_-o,y=_+o),x=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(b=u,_=b-o,p=m-o,x=m+o):(b=u+g,_=b+o,p=m+o,x=m-o),y=b),{x1:p,x2:m,x3:x,y1:b,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let x,b,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e.filter((t=>this.chart.data.datasets[t.datasetIndex]&&void 0!==this.chart.getDatasetMeta(t.datasetIndex).controller.getParsed(t.index)));const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:"tooltip",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:za},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=bt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,"undefined"!=typeof window&&(window.Chart=An),An})); +//# sourceMappingURL=chart.umd.js.map diff --git a/assets/jscripts/dataTables-id.json b/assets/jscripts/dataTables-id.json new file mode 100644 index 000000000..0977513d4 --- /dev/null +++ b/assets/jscripts/dataTables-id.json @@ -0,0 +1,248 @@ +{ + "aria": { + "paginate": { + "first": "Pertama", + "last": "Terakhir", + "next": "Selanjutnya", + "previous": "Sebelumnya" + } + }, + "autoFill": { + "cancel": "Batal", + "fill": "Isi semua sel dengan %d<\/i>", + "fillHorizontal": "Isi sel secara horizontal", + "fillVertical": "Isi sel secara vertikal", + "info": "" + }, + "buttons": { + "collection": "Kumpulan ", + "colvis": "Visibilitas Kolom", + "colvisRestore": "Kembalikan visibilitas", + "copy": "Salin", + "copyKeys": "Tekan ctrl atau u2318 + C untuk menyalin tabel ke papan klip.

Untuk membatalkan, klik pesan ini atau tekan esc.", + "copySuccess": { + "_": "%d baris disalin ke papan klip", + "1": "satu baris disalin ke papan klip" + }, + "copyTitle": "Salin ke Papan klip", + "createState": "Tambahkan Data", + "csv": "CSV", + "excel": "Excel", + "pageLength": { + "_": "Tampilkan %d baris", + "-1": "Tampilkan semua baris" + }, + "pdf": "PDF", + "print": "Cetak", + "removeAllStates": "Hapus Semua Data", + "removeState": "Hapus Data", + "renameState": "Rubah Nama", + "savedStates": "SImpan Data", + "stateRestore": "Publihkan Data", + "updateState": "Perbaharui data" + }, + "datetime": { + "amPm": { + "0": "am", + "1": "pm" + }, + "hours": "Jam", + "minutes": "Menit", + "months": { + "0": "Januari", + "1": "Februari", + "10": "November", + "11": "Desember", + "2": "Maret", + "3": "April", + "4": "Mei", + "5": "Juni", + "6": "Juli", + "7": "Agustus", + "8": "September", + "9": "Oktober" + }, + "next": "Selanjutnya", + "previous": "Sebelumnya", + "seconds": "Detik", + "unknown": "-", + "weekdays": { + "0": "Min", + "1": "Sen", + "2": "Sel", + "3": "Rab", + "4": "Kam", + "5": "Jum", + "6": "Sab" + } + }, + "decimal": "", + "editor": { + "close": "Tutup", + "create": { + "button": "Tambah", + "submit": "Tambah", + "title": "Tambah inputan baru" + }, + "edit": { + "button": "Edit", + "submit": "Edit", + "title": "Edit inputan" + }, + "error": { + "system": "Terjadi kesalahan pada system. (Informasi Selebihnya<\/a>)." + }, + "multi": { + "info": "Item yang dipilih berisi nilai yang berbeda untuk input ini. Untuk mengedit dan mengatur semua item untuk input ini ke nilai yang sama, klik atau tekan di sini, jika tidak maka akan mempertahankan nilai masing-masing.", + "noMulti": "Masukan ini dapat diubah satu per satu, tetapi bukan bagian dari grup.", + "restore": "Batalkan Perubahan", + "title": "Beberapa Nilai" + }, + "remove": { + "button": "Hapus", + "confirm": { + "_": "Apakah Anda yakin untuk menghapus %d baris?", + "1": "Apakah Anda yakin untuk menghapus 1 baris?" + }, + "submit": "Hapus", + "title": "Hapus inputan" + } + }, + "emptyTable": "Tidak ada data yang tersedia pada tabel ini", + "info": "Menampilkan _START_ sampai _END_ dari _TOTAL_ entri", + "infoEmpty": "Menampilkan 0 sampai 0 dari 0 entri", + "infoFiltered": "(disaring dari _MAX_ entri keseluruhan)", + "infoPostFix": "", + "infoThousands": ",", + "lengthMenu": "Tampilkan _MENU_ entri", + "loadingRecords": "Sedang memuat...", + "processing": "Sedang memproses...", + "search": "Cari:", + "searchBuilder": { + "add": "Tambah Kondisi", + "button": { + "_": "Cari Builder (%d)", + "0": "Cari Builder" + }, + "clearAll": "Bersihkan Semua", + "condition": "Kondisi", + "conditions": { + "array": { + "contains": "Berisi", + "empty": "Kosong", + "equals": "Sama dengan", + "not": "Tidak", + "notEmpty": "Tidak kosong", + "without": "Tanpa" + }, + "date": { + "after": "Setelah", + "before": "Sebelum", + "between": "Diantara", + "empty": "Kosong", + "equals": "Sama dengan", + "not": "Tidak sama", + "notBetween": "Tidak diantara", + "notEmpty": "Tidak kosong" + }, + "number": { + "between": "Di antara", + "empty": "Kosong", + "equals": "Sama dengan", + "gt": "Lebih besar dari", + "gte": "Lebih besar atau sama dengan", + "lt": "Lebih kecil dari", + "lte": "Lebih kecil atau sama dengan", + "not": "Tidak sama", + "notBetween": "Tidak di antara", + "notEmpty": "Tidak kosong" + }, + "string": { + "contains": "Berisi", + "empty": "Kosong", + "endsWith": "Diakhiri dengan", + "equals": "Sama dengan", + "not": "Tidak sama", + "notContains": "Tidak Berisi", + "notEmpty": "Tidak kosong", + "notEndsWith": "Tidak diakhiri Dengan", + "notStartsWith": "Tidak diawali Dengan", + "startsWith": "Diawali dengan" + } + }, + "data": "Data", + "deleteTitle": "Hapus filter", + "leftTitle": "Ke Kiri", + "logicAnd": "Dan", + "logicOr": "Atau", + "rightTitle": "Ke Kanan", + "title": { + "_": "Cari Builder (%d)", + "0": "Cari Builder" + }, + "value": "Nilai" + }, + "searchPanes": { + "clearMessage": "Bersihkan", + "collapse": { + "_": "Panel Pencarian (%d)", + "0": "Panel Pencarian" + }, + "collapseMessage": "Ciutkan", + "count": "{total}", + "countFiltered": "{shown} ({total})", + "emptyPanes": "Tidak Ada Panel Pencarian", + "loadMessage": "Memuat Panel Pencarian", + "showMessage": "Tampilkan", + "title": "Saringan Aktif - %d" + }, + "searchPlaceholder": "", + "select": { + "cells": { + "_": "%d sel dipilih", + "0": "", + "1": "1 sel dipilih" + }, + "columns": { + "_": "%d kolom dipilih", + "0": "", + "1": "1 kolom dirpilih" + }, + "rows": { + "_": "%d baris dipilih", + "0": "", + "1": "1 baris dipilih" + } + }, + "stateRestore": { + "creationModal": { + "button": "Buat", + "columns": { + "search": "Pencarian Kolom", + "visible": "Visibilitas Kolom" + }, + "name": "Nama:", + "order": "Penyortiran", + "paging": "Nomor Halaman", + "scroller": "Posisi Skrol", + "search": "Pencarian", + "searchBuilder": "Cari Builder", + "select": "Pemilihan", + "title": "Buat State Baru", + "toggleLabel": "Termasuk:" + }, + "duplicateError": "Nama State ini sudah ada.", + "emptyError": "Nama tidak boleh kosong.", + "emptyStates": "Tidak ada State yang disimpan.", + "removeConfirm": "Apakah Anda yakin ingin menghapus %s?", + "removeError": "Gagal menghapus State.", + "removeJoiner": "dan", + "removeSubmit": "Hapus", + "removeTitle": "Penghapusan State", + "renameButton": "Ganti Nama", + "renameLabel": "Nama Baru untuk %s:", + "renameTitle": "Ganti nama State" + }, + "thousands": ".", + "zeroRecords": "Tidak ditemukan data yang sesuai" +} \ No newline at end of file diff --git a/assets/jscripts/dataTables.fixedColumns.min.js b/assets/jscripts/dataTables.fixedColumns.min.js new file mode 100644 index 000000000..f8202b8ee --- /dev/null +++ b/assets/jscripts/dataTables.fixedColumns.min.js @@ -0,0 +1,4 @@ +/*! FixedColumns 4.3.0 + * © SpryMedia Ltd - datatables.net/license + */ +!function(e){var i,o;"function"==typeof define&&define.amd?define(["jquery","datatables.net"],function(t){return e(t,window,document)}):"object"==typeof exports?(i=require("jquery"),o=function(t,s){s.fn.dataTable||require("datatables.net")(t,s)},"undefined"==typeof window?module.exports=function(t,s){return t=t||window,s=s||i(t),o(t,s),e(s,0,t.document)}:(o(window,i),module.exports=e(i,window,window.document))):e(jQuery,window,document)}(function(o,t,s,F){"use strict";var A,i,e,l,d=o.fn.dataTable;function r(t,s){var e=this;if(i&&i.versionCheck&&i.versionCheck("1.10.0"))return t=new i.Api(t),this.classes=A.extend(!0,{},r.classes),this.c=A.extend(!0,{},r.defaults,s),s&&s.left!==F||this.c.leftColumns===F||(this.c.left=this.c.leftColumns),s&&s.right!==F||this.c.rightColumns===F||(this.c.right=this.c.rightColumns),this.s={barWidth:0,dt:t,rtl:"rtl"===A("body").css("direction")},s={bottom:"0px",display:"block",position:"absolute",width:this.s.barWidth+1+"px"},this.dom={leftBottomBlocker:A("
").css(s).css("left",0).addClass(this.classes.leftBottomBlocker),leftTopBlocker:A("
").css(s).css({left:0,top:0}).addClass(this.classes.leftTopBlocker),rightBottomBlocker:A("
").css(s).css("right",0).addClass(this.classes.rightBottomBlocker),rightTopBlocker:A("
").css(s).css({right:0,top:0}).addClass(this.classes.rightTopBlocker)},this.s.dt.settings()[0]._bInitComplete?(this._addStyles(),this._setKeyTableListener()):t.one("init.dt.dtfc",function(){e._addStyles(),e._setKeyTableListener()}),t.on("column-sizing.dt.dtfc",function(){return e._addStyles()}),t.settings()[0]._fixedColumns=this,t.on("destroy",function(){return e._destroy()}),this;throw new Error("FixedColumns requires DataTables 1.10 or newer")}function h(t,s){void 0===s&&(s=null);t=new d.Api(t),s=s||t.init().fixedColumns||d.defaults.fixedColumns;new e(t,s)}return r.prototype.left=function(t){return t!==F?(0<=t&&t<=this.s.dt.columns().count()&&(this.c.left=t,this._addStyles()),this):this.c.left},r.prototype.right=function(t){return t!==F?(0<=t&&t<=this.s.dt.columns().count()&&(this.c.right=t,this._addStyles()),this):this.c.right},r.prototype._addStyles=function(){this.s.dt.settings()[0].oScroll.sY&&(s=A(this.s.dt.table().node()).closest("div.dataTables_scrollBody")[0],e=this.s.dt.settings()[0].oBrowser.barWidth,s.offsetWidth-s.clientWidth>=e?this.s.barWidth=e:this.s.barWidth=0,this.dom.rightTopBlocker.css("width",this.s.barWidth+1),this.dom.leftTopBlocker.css("width",this.s.barWidth+1),this.dom.rightBottomBlocker.css("width",this.s.barWidth+1),this.dom.leftBottomBlocker.css("width",this.s.barWidth+1));for(var t=null,s=this.s.dt.column(0).header(),e=null,i=(null!==s&&(e=(s=A(s)).outerHeight()+1,t=A(s.closest("div.dataTables_scroll")).css("position","relative")),this.s.dt.column(0).footer()),o=null,l=(null!==i&&(o=(i=A(i)).outerHeight(),null===t)&&(t=A(i.closest("div.dataTables_scroll")).css("position","relative")),this.s.dt.columns().data().toArray().length),d=0,r=0,h=A(this.s.dt.table().node()).children("tbody").children("tr"),n=0,a=new Map,c=0;c=l-this.c.right){if(A(this.s.dt.table().node()).addClass(this.classes.tableFixedRight),t.addClass(this.classes.tableFixedRight),c+1+ye.left)&&(l=r.scrollLeft(),r.scrollLeft(l-(e.left-(d.left+o))))}),this.s.dt.on("draw.dt.dtfc",function(){h._addStyles()}),this.s.dt.on("column-reorder.dt.dtfc",function(){h._addStyles()}),this.s.dt.on("column-visibility.dt.dtfc",function(t,s,e,i,o){o&&!s.bDestroying&&setTimeout(function(){h._addStyles()},50)})},r.version="4.3.0",r.classes={fixedLeft:"dtfc-fixed-left",fixedRight:"dtfc-fixed-right",leftBottomBlocker:"dtfc-left-bottom-blocker",leftTopBlocker:"dtfc-left-top-blocker",rightBottomBlocker:"dtfc-right-bottom-blocker",rightTopBlocker:"dtfc-right-top-blocker",tableFixedLeft:"dtfc-has-left",tableFixedRight:"dtfc-has-right"},r.defaults={i18n:{button:"FixedColumns"},left:1,right:0},e=r,i=(A=o).fn.dataTable,o.fn.dataTable.FixedColumns=e,o.fn.DataTable.FixedColumns=e,(l=d.Api.register)("fixedColumns()",function(){return this}),l("fixedColumns().left()",function(t){var s=this.context[0];return t!==F?(s._fixedColumns.left(t),this):s._fixedColumns.left()}),l("fixedColumns().right()",function(t){var s=this.context[0];return t!==F?(s._fixedColumns.right(t),this):s._fixedColumns.right()}),d.ext.buttons.fixedColumns={action:function(t,s,e,i){o(e).attr("active")?(o(e).removeAttr("active").removeClass("active"),s.fixedColumns().left(0),s.fixedColumns().right(0)):(o(e).attr("active","true").addClass("active"),s.fixedColumns().left(i.config.left),s.fixedColumns().right(i.config.right))},config:{left:1,right:0},init:function(t,s,e){t.settings()[0]._fixedColumns===F&&h(t.settings(),e),o(s).attr("active","true").addClass("active"),t.button(s).text(e.text||t.i18n("buttons.fixedColumns",t.settings()[0]._fixedColumns.c.i18n.button))},text:null},o(s).on("plugin-init.dt",function(t,s){"dt"!==t.namespace||!s.oInit.fixedColumns&&!d.defaults.fixedColumns||s._fixedColumns||h(s,null)}),d}); \ No newline at end of file diff --git a/assets/jscripts/jquery.contextMenu.min.js b/assets/jscripts/jquery.contextMenu.min.js new file mode 100644 index 000000000..d9a3516e2 --- /dev/null +++ b/assets/jscripts/jquery.contextMenu.min.js @@ -0,0 +1,2 @@ +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?e(require("jquery")):e(jQuery)}(function(m){"use strict";var a;m.support.htmlMenuitem="HTMLMenuItemElement"in window,m.support.htmlCommand="HTMLCommandElement"in window,m.support.eventSelectstart="onselectstart"in document.documentElement,m.ui&&m.widget||(m.cleanData=(a=m.cleanData,function(e){var t,n,o;for(o=0;null!=e[o];o++){n=e[o];try{(t=m._data(n,"events"))&&t.remove&&m(n).triggerHandler("remove")}catch(e){}}a(e)}));var c=null,d=!1,p=m(window),f=0,h={},x={},v={},g={selector:null,appendTo:null,trigger:"right",autoHide:!1,delay:200,reposition:!0,hideOnSecondTrigger:!1,selectableSubMenu:!1,classNames:{hover:"context-menu-hover",disabled:"context-menu-disabled",visible:"context-menu-visible",notSelectable:"context-menu-not-selectable",icon:"context-menu-icon",iconEdit:"context-menu-icon-edit",iconCut:"context-menu-icon-cut",iconCopy:"context-menu-icon-copy",iconPaste:"context-menu-icon-paste",iconDelete:"context-menu-icon-delete",iconAdd:"context-menu-icon-add",iconQuit:"context-menu-icon-quit",iconLoadingClass:"context-menu-icon-loading"},determinePosition:function(e){if(m.ui&&m.ui.position)e.css("display","block").position({my:"center top",at:"center bottom",of:this,offset:"0 5",collision:"fit"}).css("display","none");else{var t=this.offset();t.top+=this.outerHeight(),t.left+=this.outerWidth()/2-e.outerWidth()/2,e.css(t)}},position:function(e,t,n){var o;if(t||n){if("maintain"===t&&"maintain"===n)o=e.$menu.position();else{var a=e.$menu.offsetParent().offset();o={top:n-a.top,left:t-a.left}}var s=p.scrollTop()+p.height(),i=p.scrollLeft()+p.width(),c=e.$menu.outerHeight(),l=e.$menu.outerWidth();o.top+c>s&&(o.top-=c),o.top<0&&(o.top=0),o.left+l>i&&(o.left-=l),o.left<0&&(o.left=0),e.$menu.css(o)}else e.determinePosition.call(this,e.$menu)},positionSubmenu:function(e){if(void 0!==e)if(m.ui&&m.ui.position)e.css("display","block").position({my:"left top-5",at:"right top",of:this,collision:"flipfit fit"}).css("display","");else{var t={top:-9,left:this.outerWidth()-5};e.css(t)}},zIndex:1,animation:{duration:50,show:"slideDown",hide:"slideUp"},events:{preShow:m.noop,show:m.noop,hide:m.noop,activated:m.noop},callback:null,items:{}},s={timer:null,pageX:null,pageY:null},b={abortevent:function(e){e.preventDefault(),e.stopImmediatePropagation()},contextmenu:function(e){var t=m(this);if(!1!==e.data.events.preShow(t,e)&&("right"===e.data.trigger&&(e.preventDefault(),e.stopImmediatePropagation()),!("right"!==e.data.trigger&&"demand"!==e.data.trigger&&e.originalEvent||!(void 0===e.mouseButton||!e.data||"left"===e.data.trigger&&0===e.mouseButton||"right"===e.data.trigger&&2===e.mouseButton)||t.hasClass("context-menu-active")||t.hasClass("context-menu-disabled")))){if(c=t,e.data.build){var n=e.data.build(c,e);if(!1===n)return;if(e.data=m.extend(!0,{},g,e.data,n||{}),!e.data.items||m.isEmptyObject(e.data.items))throw window.console&&(console.error||console.log).call(console,"No items specified to show in contextMenu"),new Error("No Items specified");e.data.$trigger=c,$.create(e.data)}$.show.call(t,e.data,e.pageX,e.pageY)}},click:function(e){e.preventDefault(),e.stopImmediatePropagation(),m(this).trigger(m.Event("contextmenu",{data:e.data,pageX:e.pageX,pageY:e.pageY}))},mousedown:function(e){var t=m(this);c&&c.length&&!c.is(t)&&c.data("contextMenu").$menu.trigger("contextmenu:hide"),2===e.button&&(c=t.data("contextMenuActive",!0))},mouseup:function(e){var t=m(this);t.data("contextMenuActive")&&c&&c.length&&c.is(t)&&!t.hasClass("context-menu-disabled")&&(e.preventDefault(),e.stopImmediatePropagation(),(c=t).trigger(m.Event("contextmenu",{data:e.data,pageX:e.pageX,pageY:e.pageY}))),t.removeData("contextMenuActive")},mouseenter:function(e){var t=m(this),n=m(e.relatedTarget),o=m(document);n.is(".context-menu-list")||n.closest(".context-menu-list").length||c&&c.length||(s.pageX=e.pageX,s.pageY=e.pageY,s.data=e.data,o.on("mousemove.contextMenuShow",b.mousemove),s.timer=setTimeout(function(){s.timer=null,o.off("mousemove.contextMenuShow"),(c=t).trigger(m.Event("contextmenu",{data:s.data,pageX:s.pageX,pageY:s.pageY}))},e.data.delay))},mousemove:function(e){s.pageX=e.pageX,s.pageY=e.pageY},mouseleave:function(e){var t=m(e.relatedTarget);if(!t.is(".context-menu-list")&&!t.closest(".context-menu-list").length){try{clearTimeout(s.timer)}catch(e){}s.timer=null}},layerClick:function(a){var s,i,c=m(this).data("contextMenuRoot"),l=a.button,r=a.pageX,u=a.pageY,d=void 0===r;a.preventDefault(),setTimeout(function(){if(d)null!=c&&null!==c.$menu&&void 0!==c.$menu&&c.$menu.trigger("contextmenu:hide");else{var e,t="left"===c.trigger&&0===l||"right"===c.trigger&&2===l;if(document.elementFromPoint&&c.$layer){if(c.$layer.hide(),null!==(s=document.elementFromPoint(r-p.scrollLeft(),u-p.scrollTop()))&&s.isContentEditable){var n=document.createRange(),o=window.getSelection();n.selectNode(s),n.collapse(!0),o.removeAllRanges(),o.addRange(n)}m(s).trigger(a),c.$layer.show()}if(c.hideOnSecondTrigger&&t&&null!==c.$menu&&void 0!==c.$menu)c.$menu.trigger("contextmenu:hide");else{if(c.reposition&&t)if(document.elementFromPoint){if(c.$trigger.is(s))return void c.position.call(c.$trigger,c,r,u)}else if(i=c.$trigger.offset(),e=m(window),i.top+=e.scrollTop(),i.top<=a.pageY&&(i.left+=e.scrollLeft(),i.left<=a.pageX&&(i.bottom=i.top+c.$trigger.outerHeight(),i.bottom>=a.pageY&&(i.right=i.left+c.$trigger.outerWidth(),i.right>=a.pageX))))return void c.position.call(c.$trigger,c,r,u);s&&t&&c.$trigger.one("contextmenu:hidden",function(){m(s).contextMenu({x:r,y:u,button:l})}),null!=c&&null!==c.$menu&&void 0!==c.$menu&&c.$menu.trigger("contextmenu:hide")}}},50)},keyStop:function(e,t){t.isInput||e.preventDefault(),e.stopPropagation()},key:function(e){var t={};c&&(t=c.data("contextMenu")||{}),void 0===t.zIndex&&(t.zIndex=0);var n=0,o=function(e){""!==e.style.zIndex?n=e.style.zIndex:null!==e.offsetParent&&void 0!==e.offsetParent?o(e.offsetParent):null!==e.parentElement&&void 0!==e.parentElement&&o(e.parentElement)};if(o(e.target),!(t.$menu&&parseInt(n,10)>parseInt(t.$menu.css("zIndex"),10))){switch(e.keyCode){case 9:case 38:if(b.keyStop(e,t),t.isInput){if(9===e.keyCode&&e.shiftKey)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!==t.$menu&&void 0!==t.$menu&&t.$menu.trigger("prevcommand"));if(38===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault()}else if(9!==e.keyCode||e.shiftKey)return void(null!==t.$menu&&void 0!==t.$menu&&t.$menu.trigger("prevcommand"));break;case 40:if(b.keyStop(e,t),!t.isInput)return void(null!==t.$menu&&void 0!==t.$menu&&t.$menu.trigger("nextcommand"));if(9===e.keyCode)return e.preventDefault(),t.$selected&&t.$selected.find("input, textarea, select").blur(),void(null!==t.$menu&&void 0!==t.$menu&&t.$menu.trigger("nextcommand"));if(40===e.keyCode&&"checkbox"===t.$selected.find("input, textarea, select").prop("type"))return void e.preventDefault();break;case 37:if(b.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;if(t.$selected.parent().hasClass("context-menu-root"))break;var a=t.$selected.parent().parent();return t.$selected.trigger("contextmenu:blur"),void(t.$selected=a);case 39:if(b.keyStop(e,t),t.isInput||!t.$selected||!t.$selected.length)break;var s=t.$selected.data("contextMenu")||{};if(s.$menu&&t.$selected.hasClass("context-menu-submenu"))return t.$selected=null,s.$selected=null,void s.$menu.trigger("nextcommand");break;case 35:case 36:return t.$selected&&t.$selected.find("input, textarea, select").length?void 0:((t.$selected&&t.$selected.parent()||t.$menu).children(":not(."+t.classNames.disabled+", ."+t.classNames.notSelectable+")")[36===e.keyCode?"first":"last"]().trigger("contextmenu:focus"),void e.preventDefault());case 13:if(b.keyStop(e,t),t.isInput){if(t.$selected&&!t.$selected.is("textarea, select"))return void e.preventDefault();break}return void(void 0!==t.$selected&&null!==t.$selected&&t.$selected.trigger("mouseup"));case 32:case 33:case 34:return void b.keyStop(e,t);case 27:return b.keyStop(e,t),void(null!==t.$menu&&void 0!==t.$menu&&t.$menu.trigger("contextmenu:hide"));default:var i=String.fromCharCode(e.keyCode).toUpperCase();if(t.accesskeys&&t.accesskeys[i])return void t.accesskeys[i].$node.trigger(t.accesskeys[i].$menu?"contextmenu:focus":"mouseup")}e.stopPropagation(),void 0!==t.$selected&&null!==t.$selected&&t.$selected.trigger(e)}},prevItem:function(e){e.stopPropagation();var t=m(this).data("contextMenu")||{},n=m(this).data("contextMenuRoot")||{};if(t.$selected){var o=t.$selected;(t=t.$selected.parent().data("contextMenu")||{}).$selected=o}for(var a=t.$menu.children(),s=t.$selected&&t.$selected.prev().length?t.$selected.prev():a.last(),i=s;s.hasClass(n.classNames.disabled)||s.hasClass(n.classNames.notSelectable)||s.is(":hidden");)if((s=s.prev().length?s.prev():a.last()).is(i))return;t.$selected&&b.itemMouseleave.call(t.$selected.get(0),e),b.itemMouseenter.call(s.get(0),e);var c=s.find("input, textarea, select");c.length&&c.focus()},nextItem:function(e){e.stopPropagation();var t=m(this).data("contextMenu")||{},n=m(this).data("contextMenuRoot")||{};if(t.$selected){var o=t.$selected;(t=t.$selected.parent().data("contextMenu")||{}).$selected=o}for(var a=t.$menu.children(),s=t.$selected&&t.$selected.next().length?t.$selected.next():a.first(),i=s;s.hasClass(n.classNames.disabled)||s.hasClass(n.classNames.notSelectable)||s.is(":hidden");)if((s=s.next().length?s.next():a.first()).is(i))return;t.$selected&&b.itemMouseleave.call(t.$selected.get(0),e),b.itemMouseenter.call(s.get(0),e);var c=s.find("input, textarea, select");c.length&&c.focus()},focusInput:function(){var e=m(this).closest(".context-menu-item"),t=e.data(),n=t.contextMenu,o=t.contextMenuRoot;o.$selected=n.$selected=e,o.isInput=n.isInput=!0},blurInput:function(){var e=m(this).closest(".context-menu-item").data(),t=e.contextMenu;e.contextMenuRoot.isInput=t.isInput=!1},menuMouseenter:function(){m(this).data().contextMenuRoot.hovering=!0},menuMouseleave:function(e){var t=m(this).data().contextMenuRoot;t.$layer&&t.$layer.is(e.relatedTarget)&&(t.hovering=!1)},itemMouseenter:function(e){var t=m(this),n=t.data(),o=n.contextMenu,a=n.contextMenuRoot;a.hovering=!0,e&&a.$layer&&a.$layer.is(e.relatedTarget)&&(e.preventDefault(),e.stopImmediatePropagation()),(o.$menu?o:a).$menu.children("."+a.classNames.hover).trigger("contextmenu:blur").children(".hover").trigger("contextmenu:blur"),t.hasClass(a.classNames.disabled)||t.hasClass(a.classNames.notSelectable)?o.$selected=null:t.trigger("contextmenu:focus")},itemMouseleave:function(e){var t=m(this),n=t.data(),o=n.contextMenu,a=n.contextMenuRoot;if(a!==o&&a.$layer&&a.$layer.is(e.relatedTarget))return void 0!==a.$selected&&null!==a.$selected&&a.$selected.trigger("contextmenu:blur"),e.preventDefault(),e.stopImmediatePropagation(),void(a.$selected=o.$selected=o.$node);o&&o.$menu&&o.$menu.hasClass("context-menu-visible")||t.trigger("contextmenu:blur")},itemClick:function(e){var t,n=m(this),o=n.data(),a=o.contextMenu,s=o.contextMenuRoot,i=o.contextMenuKey;if(!(!a.items[i]||n.is("."+s.classNames.disabled+", .context-menu-separator, ."+s.classNames.notSelectable)||n.is(".context-menu-submenu")&&!1===s.selectableSubMenu)){if(e.preventDefault(),e.stopImmediatePropagation(),m.isFunction(a.callbacks[i])&&Object.prototype.hasOwnProperty.call(a.callbacks,i))t=a.callbacks[i];else{if(!m.isFunction(s.callback))return;t=s.callback}!1!==t.call(s.$trigger,i,s,e)?s.$menu.trigger("contextmenu:hide"):s.$menu.parent().length&&$.update.call(s.$trigger,s)}},inputClick:function(e){e.stopImmediatePropagation()},hideMenu:function(e,t){var n=m(this).data("contextMenuRoot");$.hide.call(n.$trigger,n,t&&t.force)},focusItem:function(e){e.stopPropagation();var t=m(this),n=t.data(),o=n.contextMenu,a=n.contextMenuRoot;t.hasClass(a.classNames.disabled)||t.hasClass(a.classNames.notSelectable)||(t.addClass([a.classNames.hover,a.classNames.visible].join(" ")).parent().find(".context-menu-item").not(t).removeClass(a.classNames.visible).filter("."+a.classNames.hover).trigger("contextmenu:blur"),o.$selected=a.$selected=t,o&&o.$node&&o.$node.hasClass("context-menu-submenu")&&o.$node.addClass(a.classNames.hover),o.$node&&a.positionSubmenu.call(o.$node,o.$menu))},blurItem:function(e){e.stopPropagation();var t=m(this),n=t.data(),o=n.contextMenu,a=n.contextMenuRoot;o.autoHide&&t.removeClass(a.classNames.visible),t.removeClass(a.classNames.hover),o.$selected=null}},$={show:function(n,e,t){var o=m(this),a={};if(m("#context-menu-layer").trigger("mousedown"),n.$trigger=o,!1!==n.events.show.call(o,n))if(!1!==$.update.call(o,n)){if(n.position.call(o,n,e,t),n.zIndex){var s=n.zIndex;"function"==typeof n.zIndex&&(s=n.zIndex.call(o,n)),a.zIndex=function(e){for(var t=0,n=e;t=Math.max(t,parseInt(n.css("z-index"),10)||0),(n=n.parent())&&n.length&&!(-1<"html body".indexOf(n.prop("nodeName").toLowerCase())););return t}(o)+s}$.layer.call(n.$menu,n,a.zIndex),n.$menu.find("ul").css("zIndex",a.zIndex+1),n.$menu.css(a)[n.animation.show](n.animation.duration,function(){o.trigger("contextmenu:visible"),$.activated(n),n.events.activated(n)}),o.data("contextMenu",n).addClass("context-menu-active"),m(document).off("keydown.contextMenu").on("keydown.contextMenu",b.key),n.autoHide&&m(document).on("mousemove.contextMenuAutoHide",function(e){var t=o.offset();t.right=t.left+o.outerWidth(),t.bottom=t.top+o.outerHeight(),!n.$layer||n.hovering||e.pageX>=t.left&&e.pageX<=t.right&&e.pageY>=t.top&&e.pageY<=t.bottom||setTimeout(function(){n.hovering||null===n.$menu||void 0===n.$menu||n.$menu.trigger("contextmenu:hide")},50)})}else c=null;else c=null},hide:function(t,e){var n=m(this);if(t=t||(n.data("contextMenu")||{}),e||!t.events||!1!==t.events.hide.call(n,t)){if(n.removeData("contextMenu").removeClass("context-menu-active"),t.$layer){setTimeout((o=t.$layer,function(){o.remove()}),10);try{delete t.$layer}catch(e){t.$layer=null}}var o;c=null,t.$menu.find("."+t.classNames.hover).trigger("contextmenu:blur"),t.$selected=null,t.$menu.find("."+t.classNames.visible).removeClass(t.classNames.visible),m(document).off(".contextMenuAutoHide").off("keydown.contextMenu"),t.$menu&&t.$menu[t.animation.hide](t.animation.duration,function(){t.build&&(t.$menu.remove(),m.each(t,function(e){switch(e){case"ns":case"selector":case"build":case"trigger":return!0;default:t[e]=void 0;try{delete t[e]}catch(e){}return!0}})),setTimeout(function(){n.trigger("contextmenu:hidden")},10)})}},create:function(r,u){function d(e){var t=m("");if(e._accesskey)e._beforeAccesskey&&t.append(document.createTextNode(e._beforeAccesskey)),m("").addClass("context-menu-accesskey").text(e._accesskey).appendTo(t),e._afterAccesskey&&t.append(document.createTextNode(e._afterAccesskey));else if(e.isHtmlName){if(void 0!==e.accesskey)throw new Error("accesskeys are not compatible with HTML names and cannot be used together in the same item");t.html(e.name)}else t.text(e.name);return t}void 0===u&&(u=r),r.$menu=m('
    ').addClass(r.className||"").data({contextMenu:r,contextMenuRoot:u}),r.dataAttr&&m.each(r.dataAttr,function(e,t){r.$menu.attr("data-"+r.key,t)}),m.each(["callbacks","commands","inputs"],function(e,t){r[t]={},u[t]||(u[t]={})}),u.accesskeys||(u.accesskeys={}),m.each(r.items,function(n,o){var e=m('
  • ').addClass(o.className||""),t=null,a=null;if(e.on("click",m.noop),"string"!=typeof o&&"cm_separator"!==o.type||(o={type:"cm_seperator"}),o.$node=e.data({contextMenu:r,contextMenuRoot:u,contextMenuKey:n}),void 0!==o.accesskey)for(var s,i=function(e){for(var t,n=e.split(/\s+/),o=[],a=0;t=n[a];a++)t=t.charAt(0).toUpperCase(),o.push(t);return o}(o.accesskey),c=0;s=i[c];c++)if(!u.accesskeys[s]){var l=(u.accesskeys[s]=o).name.match(new RegExp("^(.*?)("+s+")(.*)$","i"));l&&(o._beforeAccesskey=l[1],o._accesskey=l[2],o._afterAccesskey=l[3]);break}if(o.type&&v[o.type])v[o.type].call(e,o,r,u),m.each([r,u],function(e,t){t.commands[n]=o,!m.isFunction(o.callback)||void 0!==t.callbacks[n]&&void 0!==r.type||(t.callbacks[n]=o.callback)});else{switch("cm_seperator"===o.type?e.addClass("context-menu-separator "+u.classNames.notSelectable):"html"===o.type?e.addClass("context-menu-html "+u.classNames.notSelectable):"sub"!==o.type&&o.type?(t=m("").appendTo(e),d(o).appendTo(t),e.addClass("context-menu-input"),r.hasTypes=!0,m.each([r,u],function(e,t){t.commands[n]=o,t.inputs[n]=o})):o.items&&(o.type="sub"),o.type){case"cm_seperator":break;case"text":a=m('').attr("name","context-menu-input-"+n).val(o.value||"").appendTo(t);break;case"textarea":a=m('').attr("name","context-menu-input-"+n).val(o.value||"").appendTo(t),o.height&&a.height(o.height);break;case"checkbox":a=m('').attr("name","context-menu-input-"+n).val(o.value||"").prop("checked",!!o.selected).prependTo(t);break;case"radio":a=m('').attr("name","context-menu-input-"+o.radio).val(o.value||"").prop("checked",!!o.selected).prependTo(t);break;case"select":a=m('').attr("name","context-menu-input-"+n).appendTo(t),o.options&&(m.each(o.options,function(e,t){m("").val(e).text(t).appendTo(a)}),a.val(o.selected));break;case"sub":d(o).appendTo(e),o.appendTo=o.$node,e.data("contextMenu",o).addClass("context-menu-submenu"),o.callback=null,"function"==typeof o.items.then?$.processPromises(o,u,o.items):$.create(o,u);break;case"html":m(o.html).appendTo(e);break;default:m.each([r,u],function(e,t){t.commands[n]=o,!m.isFunction(o.callback)||void 0!==t.callbacks[n]&&void 0!==r.type||(t.callbacks[n]=o.callback)}),d(o).appendTo(e)}o.type&&"sub"!==o.type&&"html"!==o.type&&"cm_seperator"!==o.type&&(a.on("focus",b.focusInput).on("blur",b.blurInput),o.events&&a.on(o.events,r)),o.icon&&(m.isFunction(o.icon)?o._icon=o.icon.call(this,this,e,n,o):"string"!=typeof o.icon||"fab "!==o.icon.substring(0,4)&&"fas "!==o.icon.substring(0,4)&&"fad "!==o.icon.substring(0,4)&&"far "!==o.icon.substring(0,4)&&"fal "!==o.icon.substring(0,4)?"string"==typeof o.icon&&"fa-"===o.icon.substring(0,3)?o._icon=u.classNames.icon+" "+u.classNames.icon+"--fa fa "+o.icon:o._icon=u.classNames.icon+" "+u.classNames.icon+"-"+o.icon:(e.addClass(u.classNames.icon+" "+u.classNames.icon+"--fa5"),o._icon=m('')),"string"==typeof o._icon?e.addClass(o._icon):e.prepend(o._icon))}o.$input=a,o.$label=t,e.appendTo(r.$menu),!r.hasTypes&&m.support.eventSelectstart&&e.on("selectstart.disableTextSelect",b.abortevent)}),r.$node||r.$menu.css("display","none").addClass("context-menu-root"),r.$menu.appendTo(r.appendTo||document.body)},resize:function(e,t){var n;e.css({position:"absolute",display:"block"}),e.data("width",(n=e.get(0)).getBoundingClientRect?Math.ceil(n.getBoundingClientRect().width):e.outerWidth()+1),e.css({position:"static",minWidth:"0px",maxWidth:"100000px"}),e.find("> li > ul").each(function(){$.resize(m(this),!0)}),t||e.find("ul").addBack().css({position:"",display:"",minWidth:"",maxWidth:""}).outerWidth(function(){return m(this).data("width")})},update:function(i,c){var l=this;void 0===c&&(c=i,$.resize(i.$menu));var r=!1;return i.$menu.children().each(function(){var e,t=m(this),n=t.data("contextMenuKey"),o=i.items[n],a=m.isFunction(o.disabled)&&o.disabled.call(l,n,c)||!0===o.disabled;if((e=m.isFunction(o.visible)?o.visible.call(l,n,c):void 0===o.visible||!0===o.visible)&&(r=!0),t[e?"show":"hide"](),t[a?"addClass":"removeClass"](c.classNames.disabled),m.isFunction(o.icon)){t.removeClass(o._icon);var s=o.icon.call(this,l,t,n,o);"string"==typeof s?t.addClass(s):t.prepend(s)}if(o.type)switch(t.find("input, select, textarea").prop("disabled",a),o.type){case"text":case"textarea":o.$input.val(o.value||"");break;case"checkbox":case"radio":o.$input.val(o.value||"").prop("checked",!!o.selected);break;case"select":o.$input.val((0===o.selected?"0":o.selected)||"")}o.$menu&&$.update.call(l,o,c)&&(r=!0)}),r},layer:function(e,t){var n=e.$layer=m('
    ').css({height:p.height(),width:p.width(),display:"block",position:"fixed","z-index":t-1,top:0,left:0,opacity:0,filter:"alpha(opacity=0)","background-color":"#000"}).data("contextMenuRoot",e).appendTo(document.body).on("contextmenu",b.abortevent).on("mousedown",b.layerClick);return void 0===document.body.style.maxWidth&&n.css({position:"absolute",height:m(document).height()}),n},processPromises:function(e,t,n){function o(e,t,n){void 0===n?(n={error:{name:"No items and no error item",icon:"context-menu-icon context-menu-icon-quit"}},window.console&&(console.error||console.log).call(console,'When you reject a promise, provide an "items" object, equal to normal sub-menu items')):"string"==typeof n&&(n={error:{name:n}}),a(e,t,n)}function a(e,t,n){void 0!==t.$menu&&t.$menu.is(":visible")&&(e.$node.removeClass(t.classNames.iconLoadingClass),e.items=n,$.create(e,t,!0),$.update(e,t),t.positionSubmenu.call(e.$node,e.$menu))}e.$node.addClass(t.classNames.iconLoadingClass),n.then(function(e,t,n){void 0===n&&o(void 0),a(e,t,n)}.bind(this,e,t),o.bind(this,e,t))},activated:function(e){var t=e.$menu,n=t.offset(),o=m(window).height(),a=m(window).scrollTop(),s=t.height();oa+o)&&t.css({top:a+"px"})}};function l(e){return e.id&&m('label[for="'+e.id+'"]').val()||e.name}m.fn.contextMenu=function(e){var t=this,n=e;if(0=8.0", "nullpunkt/lz-string-php": "^1.3", "phpseclib/phpseclib": "~3.0.36", "phpmailer/phpmailer": "^6.9.1", - "mpdf/mpdf": "^8.2.4", - "workerman/workerman": "^4.0" + "mpdf/mpdf": "^8.2", + "workerman/workerman": "^4.0", + "mpdf/qrcode": "^1.2", + "halaxa/json-machine": "^1.2" }, "license": "MIT", "authors": [ diff --git a/composer.lock b/composer.lock deleted file mode 100644 index e2213577e..000000000 --- a/composer.lock +++ /dev/null @@ -1,845 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "20c2f07f7c77adf3ce0889ec9d1e47bf", - "packages": [ - { - "name": "mpdf/mpdf", - "version": "v8.2.4", - "source": { - "type": "git", - "url": "https://github.com/mpdf/mpdf.git", - "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/mpdf/zipball/9e3ff91606fed11cd58a130eabaaf60e56fdda88", - "reference": "9e3ff91606fed11cd58a130eabaaf60e56fdda88", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "ext-mbstring": "*", - "mpdf/psr-http-message-shim": "^1.0 || ^2.0", - "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", - "myclabs/deep-copy": "^1.7", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "setasign/fpdi": "^2.1" - }, - "require-dev": { - "mockery/mockery": "^1.3.0", - "mpdf/qrcode": "^1.1.0", - "squizlabs/php_codesniffer": "^3.5.0", - "tracy/tracy": "~2.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-bcmath": "Needed for generation of some types of barcodes", - "ext-xml": "Needed mainly for SVG manipulation", - "ext-zlib": "Needed for compression of embedded resources, such as fonts" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Mpdf\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-only" - ], - "authors": [ - { - "name": "Matěj Humpál", - "role": "Developer, maintainer" - }, - { - "name": "Ian Back", - "role": "Developer (retired)" - } - ], - "description": "PHP library generating PDF files from UTF-8 encoded HTML", - "homepage": "https://mpdf.github.io", - "keywords": [ - "pdf", - "php", - "utf-8" - ], - "support": { - "docs": "http://mpdf.github.io", - "issues": "https://github.com/mpdf/mpdf/issues", - "source": "https://github.com/mpdf/mpdf" - }, - "funding": [ - { - "url": "https://www.paypal.me/mpdf", - "type": "custom" - } - ], - "time": "2024-06-14T16:06:41+00:00" - }, - { - "name": "mpdf/psr-http-message-shim", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/mpdf/psr-http-message-shim.git", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f", - "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", - "shasum": "" - }, - "require": { - "psr/http-message": "^2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Mpdf\\PsrHttpMessageShim\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - }, - { - "name": "Nigel Cunningham", - "email": "nigel.cunningham@technocrat.com.au" - } - ], - "description": "Shim to allow support of different psr/message versions.", - "support": { - "issues": "https://github.com/mpdf/psr-http-message-shim/issues", - "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1" - }, - "time": "2023-10-02T14:34:03+00:00" - }, - { - "name": "mpdf/psr-log-aware-trait", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/mpdf/psr-log-aware-trait.git", - "reference": "a633da6065e946cc491e1c962850344bb0bf3e78" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78", - "reference": "a633da6065e946cc491e1c962850344bb0bf3e78", - "shasum": "" - }, - "require": { - "psr/log": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Mpdf\\PsrLogAwareTrait\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Dorison", - "email": "mark@chromatichq.com" - }, - { - "name": "Kristofer Widholm", - "email": "kristofer@chromatichq.com" - } - ], - "description": "Trait to allow support of different psr/log versions.", - "support": { - "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", - "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0" - }, - "time": "2023-05-03T06:19:36+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.12.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2024-06-12T14:39:25+00:00" - }, - { - "name": "nullpunkt/lz-string-php", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nullpunkt/lz-string-php.git", - "reference": "bf4ae48f8a164bc6e95f5e7a2c6da45907ac3ba9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nullpunkt/lz-string-php/zipball/bf4ae48f8a164bc6e95f5e7a2c6da45907ac3ba9", - "reference": "bf4ae48f8a164bc6e95f5e7a2c6da45907ac3ba9", - "shasum": "" - }, - "require": { - "php": ">=5.4" - }, - "require-dev": { - "monolog/monolog": "^1.17", - "phpunit/phpunit": "~9.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "LZCompressor\\": "src/LZCompressor" - } - }, - "notification-url": "https://packagist.org/downloads/", - "authors": [ - { - "name": "Tobias Seipke", - "email": "tobias.seipke@gmail.com", - "homepage": "https://github.com/nullpunkt" - }, - { - "name": "Juhász Ádám", - "email": "juhasz.adam@virgo.hu", - "homepage": "https://github.com/JuhaszAdam" - } - ], - "description": "PHP Class implementation of LZ-String javascript.", - "support": { - "issues": "https://github.com/nullpunkt/lz-string-php/issues", - "source": "https://github.com/nullpunkt/lz-string-php/tree/1.3.0" - }, - "time": "2021-06-17T07:52:00+00:00" - }, - { - "name": "paragonie/constant_time_encoding", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", - "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", - "shasum": "" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "phpunit/phpunit": "^9", - "vimeo/psalm": "^4|^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" - }, - "time": "2024-05-08T12:36:18+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "" - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2020-10-15T08:29:30+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.9.1", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "039de174cd9c17a8389754d3b877a2ed22743e18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18", - "reference": "039de174cd9c17a8389754d3b877a2ed22743e18", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/annotations": "^1.2.6 || ^1.13.3", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", - "yoast/phpunit-polyfills": "^1.0.4" - }, - "suggest": { - "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "ext-openssl": "Needed for secure SMTP sending and DKIM signing", - "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", - "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2023-11-25T22:23:28+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "3.0.39", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", - "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1|^2|^3", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" - }, - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2024-06-24T06:27:33+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "psr/log", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" - }, - "time": "2021-07-14T16:46:02+00:00" - }, - { - "name": "setasign/fpdi", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/Setasign/FPDI.git", - "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6db878129ec6c7e141316ee71872923e7f1b7ad", - "reference": "a6db878129ec6c7e141316ee71872923e7f1b7ad", - "shasum": "" - }, - "require": { - "ext-zlib": "*", - "php": "^5.6 || ^7.0 || ^8.0" - }, - "conflict": { - "setasign/tfpdf": "<1.31" - }, - "require-dev": { - "phpunit/phpunit": "~5.7", - "setasign/fpdf": "~1.8.6", - "setasign/tfpdf": "~1.33", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "~6.2" - }, - "suggest": { - "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." - }, - "type": "library", - "autoload": { - "psr-4": { - "setasign\\Fpdi\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Slabon", - "email": "jan.slabon@setasign.com", - "homepage": "https://www.setasign.com" - }, - { - "name": "Maximilian Kresse", - "email": "maximilian.kresse@setasign.com", - "homepage": "https://www.setasign.com" - } - ], - "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", - "homepage": "https://www.setasign.com/fpdi", - "keywords": [ - "fpdf", - "fpdi", - "pdf" - ], - "support": { - "issues": "https://github.com/Setasign/FPDI/issues", - "source": "https://github.com/Setasign/FPDI/tree/v2.6.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", - "type": "tidelift" - } - ], - "time": "2023-12-11T16:03:32+00:00" - }, - { - "name": "workerman/workerman", - "version": "v4.1.15", - "source": { - "type": "git", - "url": "https://github.com/walkor/workerman.git", - "reference": "afc8242fc769ab7cf22eb4ac22b97cb59d465e4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/walkor/workerman/zipball/afc8242fc769ab7cf22eb4ac22b97cb59d465e4e", - "reference": "afc8242fc769ab7cf22eb4ac22b97cb59d465e4e", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "suggest": { - "ext-event": "For better performance. " - }, - "type": "library", - "autoload": { - "psr-4": { - "Workerman\\": "./" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "walkor", - "email": "walkor@workerman.net", - "homepage": "http://www.workerman.net", - "role": "Developer" - } - ], - "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", - "homepage": "http://www.workerman.net", - "keywords": [ - "asynchronous", - "event-loop" - ], - "support": { - "email": "walkor@workerman.net", - "forum": "http://wenda.workerman.net/", - "issues": "https://github.com/walkor/workerman/issues", - "source": "https://github.com/walkor/workerman", - "wiki": "http://doc.workerman.net/" - }, - "funding": [ - { - "url": "https://opencollective.com/workerman", - "type": "open_collective" - }, - { - "url": "https://www.patreon.com/walkor", - "type": "patreon" - } - ], - "time": "2024-02-19T02:10:39+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.6.0" -} diff --git a/config.php b/config.php index 3c0a1f4f4..bb344fe37 100644 --- a/config.php +++ b/config.php @@ -1,21 +1,75 @@ =')) { - exit("mLITE requires at least PHP 7.0"); +// mLITE - Kompatibel dengan PHP 7.4 - 8.3+ +if (!version_compare(PHP_VERSION, '8.0.0', '>=')) { + exit("mLITE requires at least PHP 8.0.0 (Current: " . PHP_VERSION . ")"); } -define('DBHOST', 'localhost'); -define('DBPORT', '3306'); -define('DBUSER', 'root'); -define('DBPASS', ''); -define('DBNAME', 'mlite'); +function env(string $key, $default = null) +{ + return $_ENV[$key] ?? $_SERVER[$key] ?? $default; +} + +// Simple .env loader (PHP 8.3 safe, no putenv) +if (file_exists(BASE_DIR . '/.env')) { + $lines = file(BASE_DIR . '/.env', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + + foreach ($lines as $line) { + $line = trim($line); + + // Skip komentar & baris kosong + if ($line === '' || str_starts_with($line, '#')) { + continue; + } + + if (!str_contains($line, '=')) { + continue; + } + + [$name, $value] = explode('=', $line, 2); + $name = trim($name); + $value = trim($value); + + // Hapus tanda kutip jika ada + $value = trim($value, "\"'"); + + if (!isset($_ENV[$name]) && !isset($_SERVER[$name])) { + $_ENV[$name] = $value; + $_SERVER[$name] = $value; + } + } +} + + +// Database Driver: 'mysql' or 'sqlite' +define('DBDRIVER', env('DBDRIVER') ?: ''); + +if (DBDRIVER == 'sqlite') { + $db_host = ''; + $db_user = ''; + $db_pass = ''; + $db_name = BASE_DIR . '/systems/data/mlite.sdb'; + $db_port = ''; +} else { + $db_host = env('MYSQLHOST') ?: 'localhost'; + $db_user = env('MYSQLUSER') ?: 'root'; + $db_pass = env('MYSQLPASSWORD') ?: ''; + $db_name = env('MYSQLDATABASE') ?: 'mlite'; + $db_port = env('MYSQLPORT') ?: '3306'; +} + +define('DBHOST', $db_host); +define('DBPORT', $db_port); +define('DBUSER', $db_user); +define('DBPASS', $db_pass); +define('DBNAME', $db_name); // URL Webapps -define('WEBAPPS_URL', 'http://mlite.loc/uploads'); +define('WEBAPPS_URL', env('APPURL') ?: 'http://localhost:8000/uploads'); // Sesuaikan http://mlite.loc dengan domain atau IP Address server define('WEBAPPS_PATH', BASE_DIR . '/uploads'); // Multi APP -define('MULTI_APP', false); -#define('MULTI_APP_REDIRECT', 'dokter_ulun'); +define('MULTI_APP', env('MULTIAPP') ?: 'false'); +define('MULTI_APP_REDIRECT', env('MULTIAPP_REDIRECT') ?: ''); // Admin cat name define('ADMIN', 'admin'); @@ -33,7 +87,7 @@ define('FILE_LOCK', false); // Basic modules -define('BASIC_MODULES', serialize([ +define('BASIC_MODULES', json_encode([ 9 => 'settings', 0 => 'dashboard', 1 => 'master', @@ -44,10 +98,12 @@ 6 => 'farmasi', 8 => 'users', 7 => 'modules', - 10 => 'wagateway' + 10 => 'wagateway' ])); -// Developer mode -define('DEV_MODE', false); +// Developer mode, mendukung `DEV_MODE` dan key lama `DEVMODE` di .env +define('DEV_MODE', filter_var(env('DEV_MODE', env('DEVMODE', true)), FILTER_VALIDATE_BOOLEAN)); + +define('JWT_SECRET', 'mlite_secret_key_change_me'); ?> diff --git a/docker/.env b/docker/.env new file mode 100644 index 000000000..2518c38e0 --- /dev/null +++ b/docker/.env @@ -0,0 +1,22 @@ +# Database Configuration +DB_DRIVER=mysql +DB_HOST=mysql +DB_PORT=3306 +DB_ROOT_PASSWORD=rootpassword123 +DB_DATABASE=mlite_db +DB_USERNAME=mlite +DB_PASSWORD=mlite +# Application Configuration +# APP_PORT=8080 # gunakan jika ingin mengakses nginx dari luar container +# DB_EXTERNAL_PORT=3308 # gunakan jika ingin mengakses mysql dari luar container + +APPURL=http://localhost:8000/uploads +MULTIAPP= +MULTIAPP_REDIRECT= +DEVMODE= + + + +# Docker Compose Profiles +# Biarkan kosong jika menggunakan SQLite. Isi dengan 'mysql_enabled' jika ingin menggunakan container MySQL +COMPOSE_PROFILES=mysql_enabled diff --git a/docker/config.php b/docker/config.php deleted file mode 100644 index 250b8afaa..000000000 --- a/docker/config.php +++ /dev/null @@ -1,53 +0,0 @@ -=')) { - exit("mLITE requires at least PHP 7.0"); -} - -define('DBHOST', '172.17.0.1'); -define('DBPORT', '3308'); -define('DBUSER', 'mlite_db'); -define('DBPASS', 'mlite_db'); -define('DBNAME', 'mlite_db'); - -// URL Webapps -define('WEBAPPS_URL', $_SERVER['SERVER_ADDR'].'/uploads'); -define('WEBAPPS_PATH', BASE_DIR . '/uploads'); - -// Admin cat name -define('ADMIN', 'admin'); - -// Multi APP -define('MULTI_APP', false); -define('MULTI_APP_REDIRECT', ''); - -// Themes path -define('THEMES', BASE_DIR . '/themes'); - -// Modules path -define('MODULES', BASE_DIR . '/plugins'); - -// Uploads path -define('UPLOADS', BASE_DIR . '/uploads'); - -// Lock files -define('FILE_LOCK', false); - -// Basic modules -define('BASIC_MODULES', serialize([ - 9 => 'settings', - 0 => 'dashboard', - 1 => 'master', - 2 => 'pasien', - 3 => 'rawat_jalan', - 4 => 'kasir_rawat_jalan', - 5 => 'kepegawaian', - 6 => 'farmasi', - 8 => 'users', - 7 => 'modules', - 10 => 'wagateway' -])); - -// Developer mode -define('DEV_MODE', true); - -?> \ No newline at end of file diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index c1e10505f..4e50311c3 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -5,43 +5,69 @@ services: context: . dockerfile: nginx.Dockerfile image: nginx:alpine - ports: - - 8085:80 + # ports: + # - ${APP_PORT}:80 # gunakan jika ingin mengakses nginx dari luar container networks: - internal volumes: - - .:/var/www/html/ + - ../:/var/www/html/ + - php_backups:/var/www/html/backups + - php_uploads:/var/www/html/uploads + - php_systems_data:/var/www/html/systems/data - ./logs/nginx:/var/log/nginx/ depends_on: - php php: - image: php:8.1-fpm-alpine + image: php:8.3-fpm-alpine user: root build: context: . dockerfile: php.Dockerfile networks: - internal + environment: + - DBDRIVER=${DB_DRIVER} + - MYSQLHOST=${DB_HOST} + - MYSQLPORT=${DB_PORT} + - MYSQLUSER=${DB_USERNAME} + - MYSQLPASSWORD=${DB_PASSWORD} + - MYSQLDATABASE=${DB_DATABASE} volumes: - - .:/var/www/html/ - depends_on: - - mysql + - ../:/var/www/html/ + - php_backups:/var/www/html/backups + - php_uploads:/var/www/html/uploads + - php_systems_data:/var/www/html/systems/data + command: sh -c "composer install && mkdir -p /var/www/html/backups /var/www/html/uploads /var/www/html/systems/data /var/www/html/tmp /var/www/html/admin/tmp && chmod -R 777 /var/www/html/backups /var/www/html/uploads /var/www/html/systems/data /var/www/html/tmp /var/www/html/admin/tmp && php-fpm" mysql: - image: mysql:5.7.22 + image: mysql:8.0 + command: --sql-mode="" restart: always + profiles: + - mysql_enabled environment: - MYSQL_ROOT_PASSWORD: rootpassword123 - MYSQL_DATABASE: mlite_db - ports: - - 3308:3306 + MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} + MYSQL_DATABASE: ${DB_DATABASE} + MYSQL_USER: ${DB_USERNAME} + MYSQL_PASSWORD: ${DB_PASSWORD} + # ports: + # - ${DB_EXTERNAL_PORT}:3306 #gunakan jika ingin mengakses mysql dari luar container expose: - - 3308 + - 3306 + networks: + - internal volumes: - - ./mysql:/var/lib/mysql - - ./db:/docker-entrypoint-initdb.d + - mysql_data:/var/lib/mysql + - ../mlite_db.sql:/docker-entrypoint-initdb.d/init.sql networks: internal: - driver: bridge \ No newline at end of file + driver: bridge + +volumes: + php_backups: + php_uploads: + php_systems_data: + php_plugins: + mysql_data: \ No newline at end of file diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf index 821523fdb..1272754b6 100644 --- a/docker/nginx/default.conf +++ b/docker/nginx/default.conf @@ -1,7 +1,9 @@ server { listen 0.0.0.0:80; - root /var/www/html/mlite; + root /var/www/html; + client_max_body_size 100M; + location / { index index.php; diff --git a/docker/php.Dockerfile b/docker/php.Dockerfile index 3acd2c6c8..fbcd38f29 100644 --- a/docker/php.Dockerfile +++ b/docker/php.Dockerfile @@ -8,31 +8,30 @@ RUN apk add libpng-dev RUN apk add --no-cache mysql-client msmtp perl wget procps shadow libzip libpng libjpeg-turbo libwebp freetype icu +# Install dcmtk from edge testing repository for mini_pacs support +RUN apk add --no-cache dcmtk --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/ + + RUN apk add --no-cache --virtual build-essentials \ icu-dev icu-libs zlib-dev g++ make automake autoconf libzip-dev \ - libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev && \ + libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev oniguruma-dev linux-headers && \ docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg --with-webp && \ docker-php-ext-install gd && \ docker-php-ext-install mysqli && \ docker-php-ext-install pdo_mysql && \ + apk add --no-cache sqlite-dev && \ + docker-php-ext-install pdo_sqlite && \ docker-php-ext-install intl && \ docker-php-ext-install opcache && \ docker-php-ext-install exif && \ docker-php-ext-install zip && \ + docker-php-ext-install bcmath && \ + docker-php-ext-install mbstring && \ + docker-php-ext-install pcntl && \ apk del build-essentials && rm -rf /usr/src/php* -WORKDIR /var/www/html - -RUN wget https://getcomposer.org/composer-stable.phar -O /usr/local/bin/composer && chmod +x /usr/local/bin/composer -RUN php /usr/local/bin/composer create-project basoro/mlite mlite - -COPY config.php mlite/config.php - -RUN mkdir -p mlite/uploads -RUN mkdir -p mlite/tmp -RUN mkdir -p mlite/admin -RUN mkdir -p mlite/admin/tmp +# Install Composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN chmod -R 777 mlite/uploads -RUN chmod -R 777 mlite/tmp -RUN chmod -R 777 mlite/admin/tmp +WORKDIR /var/www/html + diff --git a/docs/index.md b/docs/index.md index 061326bb7..4e5df0a1b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,7 @@ Instruksi Umum ============== -mLITE adalah sistem manajemen kesehatan yang sederhana, ringan dan cepat. Pertama kali dirilis pada Mei 2019. Versi gratis dari aplikasi ini dibagikan di bawah [lisensi](/lisensi) yang mengharuskan meninggalkan informasi tentang penulis dan tautan balik. Dengan dokumentasi ini Anda akan belajar cara menginstal, mengkonfigurasi, dan membuat modul dan tema Anda sendiri. +mLITE adalah sistem manajemen kesehatan yang sederhana, ringan dan cepat. Pertama kali dirilis pada Mei 2019. Versi gratis dari aplikasi ini dibagikan di bawah [https://github.com/basoro/mlite?tab=GPL-3.0-1-ov-file](/lisensi) yang mengharuskan meninggalkan informasi tentang penulis dan tautan balik. Dengan dokumentasi ini Anda akan belajar cara menginstal, mengkonfigurasi, dan membuat modul dan tema Anda sendiri. Dokumentasi dibagi menjadi beberapa bagian. Yang pertama adalah untuk instruksi umum, yang kedua untuk pengembang forntend dan yang terakhir untuk pengembang backend. @@ -12,7 +12,7 @@ Persyaratan Persyaratan sistem untuk mLITE sangat sederhana, jadi setiap server modern sudah mencukupi. + Apache 2.2+ or Nginx dengan `mod_rewrite` -+ PHP version 7.0+ ++ PHP version 7.4+ + MySQL Server 5.5+ + Akses ke MySQL dan SQLite @@ -290,7 +290,8 @@ File paling penting untuk setiap modul. Ini berisi informasi dasar dan instruksi 'description' => 'Lorem ipsum....', 'author' => 'Basoro', 'version' => '1.0', - 'compatibility' => '2022*', // Kesesuaian dengan versi mLITE + 'category' => 'main', + 'compatibility' => '6.0.0*', // Kesesuaian dengan versi mLITE 'icon' => 'bolt', 'pages' => ['Contoh' => 'contoh'], // Berfungsi sebagai halaman (opsional) 'install' => function() use($core) // Perintah install diff --git a/index.php b/index.php index 4ba2c10f8..07f1553e6 100644 --- a/index.php +++ b/index.php @@ -1,21 +1,65 @@ getMessage()); + http_response_code(500); + $message = 'System Error. Please contact administrator.'; + + // Auto-rescue untuk lingkungan PaaS (Papuyu/Docker) jika .env terbuat tapi database belum di-import + $errMsg = $e->getMessage(); + if (strpos($errMsg, 'Base table or view not found') !== false || strpos($errMsg, 'no such table') !== false || strpos($errMsg, 'Unknown database') !== false) { + header('Location: /install.php'); + exit; + } + + $response = ['status' => 'error', 'message' => $message]; + + if (DEV_MODE) { + $devMessage = preg_replace('/`[^`]+`\./', '', $e->getMessage()); + $response['message'] .= ' Detail: ' . $devMessage; + $response['debug'] = [ + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'trace' => explode("\n", $e->getTraceAsString()) + ]; + } + + echo json_encode($response); + exit; +} ob_end_flush(); diff --git a/install.php b/install.php new file mode 100644 index 000000000..e14593820 --- /dev/null +++ b/install.php @@ -0,0 +1,584 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + @chmod($outputFile, 0666); + + $pdo->exec("PRAGMA synchronous = OFF"); + $pdo->exec("PRAGMA journal_mode = MEMORY"); + $pdo->exec("PRAGMA strict = OFF"); + + $sqlContent = file_get_contents($inputFile); + + $sqlContent = preg_replace('/^--.*$/m', '', $sqlContent); + $sqlContent = preg_replace('/^\/\*.*\*\/$/m', '', $sqlContent); + $sqlContent = preg_replace('/^SET .*$/m', '', $sqlContent); + + $statements = preg_split('/;\s*\n/', $sqlContent); + + foreach ($statements as $statement) { + $statement = trim($statement); + if (empty($statement)) + continue; + + if (stripos($statement, 'CREATE TABLE') === 0) { + processCreateTable($pdo, $statement); + } elseif (stripos($statement, 'INSERT INTO') === 0) { + processInsert($pdo, $statement); + } + } + + // Create .env + $envData = "DBDRIVER=sqlite\n"; + file_put_contents($envFile, $envData); + + $success = "SQLite Database successfully generated!"; + // header('Location: /'); + // exit; + + + } catch (Exception $e) { + $error = $e->getMessage(); + } + } elseif ($driver === 'mysql') { + $host = $_POST['db_host'] ?? 'localhost'; + $port = $_POST['db_port'] ?? '3306'; + $dbName = $_POST['db_name'] ?? 'mlite'; + $user = $_POST['db_user'] ?? 'root'; + $pass = $_POST['db_pass'] ?? ''; + + try { + ini_set('memory_limit', '1G'); + + // Connect to MySQL server without DB first + $dsnServer = "mysql:host=$host;port=$port;charset=utf8mb4"; + $pdoServer = new PDO($dsnServer, $user, $pass); + $pdoServer->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + // Create database if not exists + $pdoServer->exec("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); + + // Connect to the specific database + $dsn = "mysql:host=$host;port=$port;dbname=$dbName;charset=utf8mb4"; + $pdo = new PDO($dsn, $user, $pass); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + // Check if tables exist + $stmt = $pdo->query("SHOW TABLES"); + if ($stmt->rowCount() > 0) { + throw new Exception("Database sudah ada datanya. Silakan gunakan database yang kosong atau hapus tabel terlebih dahulu."); + } + + // Execute SQL Dump + $inputFile = $baseDir . '/mlite_db.sql'; + $sqlContent = file_get_contents($inputFile); + + // Turn off foreign key checks for import + $pdo->exec("SET foreign_key_checks = 0;"); + + // Clean up to basic statements + $sqlContent = preg_replace('/^--.*$/m', '', $sqlContent); + $sqlContent = preg_replace('/^\/\*.*\*\/$/m', '', $sqlContent); + + // Multi statement queries can be heavy, splitting by ; + $statements = preg_split('/;\s*\n/', $sqlContent); + foreach ($statements as $statement) { + $statement = trim($statement); + if (empty($statement)) + continue; + $pdo->exec($statement); + } + + $pdo->exec("SET foreign_key_checks = 1;"); + + // Create .env + $envData = "DBDRIVER=mysql\n"; + $envData .= "MYSQLHOST=$host\n"; + $envData .= "MYSQLPORT=$port\n"; + $envData .= "MYSQLDATABASE=$dbName\n"; + $envData .= "MYSQLUSER=$user\n"; + $envData .= "MYSQLPASSWORD=$pass\n"; + + file_put_contents($envFile, $envData); + + $success = "MySQL Database successfully installed!"; + // header('Location: /'); + // exit; + } catch (Exception $e) { + $error = $e->getMessage(); + } + } +} + +// Helper Functions for SQLite parsing +function processCreateTable($pdo, $sql) +{ + if (!preg_match('/CREATE TABLE `?(\w+)`?/i', $sql, $matches)) + return; + $tableName = $matches[1]; + + if (!preg_match('/\((.*)\)[^\)]*$/s', $sql, $matches)) + return; + $body = $matches[1]; + + $pkColumn = null; + if (preg_match('/PRIMARY KEY\s*\(`?([^`\)]+)`?\)/', $body, $matches)) { + $pkColumn = $matches[1]; + if (strpos($pkColumn, ',') !== false) { + $pkColumn = null; + } + } + + $lines = explode("\n", $body); + $columnDefs = []; + $constraints = []; + $indexes = []; + + foreach ($lines as $line) { + $line = trim($line); + if ($line === '' || $line === ')') + continue; + if (substr($line, -1) === ',') + $line = substr($line, 0, -1); + + if (preg_match('/^(?:UNIQUE )?KEY `?(\w+)`?\s*\((.*)\)/i', $line, $m)) { + $isUnique = (stripos($line, 'UNIQUE') === 0); + $indexName = $m[1]; + $cols = str_replace('`', '', $m[2]); + $cols = preg_replace('/\(\d+\)/', '', $cols); + $indexes[] = "CREATE " . ($isUnique ? "UNIQUE " : "") . "INDEX IF NOT EXISTS `idx_{$tableName}_{$indexName}` ON `$tableName` ($cols)"; + continue; + } + + if (stripos($line, 'PRIMARY KEY') === 0) { + if (!$pkColumn) { + $line = preg_replace('/\s+USING\s+\w+/i', '', $line); + $constraints[] = $line; + } + continue; + } + + if (stripos($line, 'CONSTRAINT') === 0) { + $line = preg_replace('/CONSTRAINT `\w+`/', '', $line); + $line = preg_replace('/ON UPDATE CURRENT_TIMESTAMP/i', '', $line); + $constraints[] = $line; + continue; + } + + if (preg_match('/^`?(\w+)`?\s+(.*)$/', $line, $m)) { + $colName = $m[1]; + $def = $m[2]; + + $def = preg_replace('/int\(\d+\)/i', 'INTEGER', $def); + $def = preg_replace('/tinyint\(\d+\)/i', 'INTEGER', $def); + $def = preg_replace('/smallint\(\d+\)/i', 'INTEGER', $def); + $def = preg_replace('/bigint\(\d+\)/i', 'INTEGER', $def); + $def = preg_replace('/double(\(.*\))?/i', 'REAL', $def); + $def = preg_replace('/float(\(.*\))?/i', 'REAL', $def); + $def = preg_replace('/decimal(\(.*\))?/i', 'REAL', $def); + $def = preg_replace('/varchar\(\d+\)/i', 'TEXT', $def); + $def = preg_replace('/char\(\d+\)/i', 'TEXT', $def); + $def = preg_replace('/text/i', 'TEXT', $def); + $def = preg_replace('/longtext/i', 'TEXT', $def); + $def = preg_replace('/mediumtext/i', 'TEXT', $def); + $def = preg_replace('/enum\(.*\)/i', 'TEXT', $def); + $def = preg_replace('/set\(.*\)/i', 'TEXT', $def); + $def = preg_replace('/date/i', 'TEXT', $def); + $def = preg_replace('/datetime/i', 'TEXT', $def); + $def = preg_replace('/time/i', 'TEXT', $def); + $def = preg_replace('/timestamp/i', 'TEXT', $def); + $def = preg_replace('/blob/i', 'BLOB', $def); + $def = preg_replace('/longblob/i', 'BLOB', $def); + + if (stripos($def, 'AUTO_INCREMENT') !== false) { + $def = str_ireplace('AUTO_INCREMENT', '', $def); + if ($colName === $pkColumn) { + $def = preg_replace('/(int|integer)\s+(not\s+null)?/i', 'INTEGER PRIMARY KEY AUTOINCREMENT', $def); + } + } + + $def = str_ireplace('UNSIGNED', '', $def); + $def = str_ireplace('ZEROFILL', '', $def); + $def = preg_replace('/ON\s+UPDATE\s+CURRENT_TIMESTAMP/i', '', $def); + $def = str_ireplace('CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP', $def); + + if ($colName === $pkColumn && stripos($def, 'PRIMARY KEY') === false) { + $def .= ' PRIMARY KEY'; + } + + $columnDefs[] = "`$colName` $def"; + } + } + + $createSql = "CREATE TABLE `$tableName` (\n" . implode(",\n", array_merge($columnDefs, $constraints)) . "\n)"; + + try { + $pdo->exec($createSql); + } catch (PDOException $e) { + } + + foreach ($indexes as $idxSql) { + try { + $pdo->exec($idxSql); + } catch (PDOException $e) { + } + } +} + +function processInsert($pdo, $sql) +{ + $sql = str_replace('\\"', '##DQ##', $sql); + $sql = str_replace("'", "''", $sql); + $sql = str_replace('"', "'", $sql); + $sql = str_replace('##DQ##', '"', $sql); + $sql = str_replace('\\\\', '\\', $sql); + + try { + $pdo->exec($sql); + } catch (PDOException $e) { + } +} + +?> + + + + + + + + mLITE Installer + + + + + +
    +
    +

    Instalasi database sedang berjalan... +

    +
    + +
    + + + + + \ No newline at end of file diff --git a/mlite_db.sql b/mlite_db.sql index 565b7eb38..c90693977 100644 --- a/mlite_db.sql +++ b/mlite_db.sql @@ -1,21 +1,14 @@ -# ************************************************************ -# Host: localhost (MySQL 5.7.44) -# Database: mlite -# Generation Time: 2024-12-01 05:02:39 +0000 -# ************************************************************ +-- CREATE DATABASE IF NOT EXISTS `mlite`; -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -SET NAMES utf8mb4; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +-- USE `mlite`; -# Dump of table aturan_pakai -# ------------------------------------------------------------ +SET sql_mode = ''; + + +SET foreign_key_checks = 0; + CREATE TABLE `aturan_pakai` ( `tgl_perawatan` date NOT NULL DEFAULT '0000-00-00', @@ -28,34 +21,20 @@ CREATE TABLE `aturan_pakai` ( KEY `kode_brng` (`kode_brng`), CONSTRAINT `aturan_pakai_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `aturan_pakai_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bahasa_pasien -# ------------------------------------------------------------ CREATE TABLE `bahasa_pasien` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nama_bahasa` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `nama_bahasa` (`nama_bahasa`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; - -LOCK TABLES `bahasa_pasien` WRITE; -/*!40000 ALTER TABLE `bahasa_pasien` DISABLE KEYS */; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -INSERT INTO `bahasa_pasien` (`id`, `nama_bahasa`) -VALUES - (1,'-'); -/*!40000 ALTER TABLE `bahasa_pasien` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `bahasa_pasien` VALUES ("1","-"); -# Dump of table bangsal -# ------------------------------------------------------------ - CREATE TABLE `bangsal` ( `kd_bangsal` char(5) NOT NULL, `nm_bangsal` varchar(30) DEFAULT NULL, @@ -63,57 +42,33 @@ CREATE TABLE `bangsal` ( PRIMARY KEY (`kd_bangsal`), KEY `nm_bangsal` (`nm_bangsal`), KEY `status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `bangsal` WRITE; -/*!40000 ALTER TABLE `bangsal` DISABLE KEYS */; - -INSERT INTO `bangsal` (`kd_bangsal`, `nm_bangsal`, `status`) -VALUES - ('-','-','1'), - ('ANG','Anggrek','1'), - ('APT','Apotek','1'), - ('GF','Gudang Farmasi','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `bangsal` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `bangsal` VALUES ("-","-","1"), +("ANG","Anggrek","1"), +("APT","Apotek","1"), +("GF","Gudang Farmasi","1"); -# Dump of table bank -# ------------------------------------------------------------ CREATE TABLE `bank` ( `namabank` varchar(50) NOT NULL, PRIMARY KEY (`namabank`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `bank` WRITE; -/*!40000 ALTER TABLE `bank` DISABLE KEYS */; - -INSERT INTO `bank` (`namabank`) -VALUES - ('-'), - ('T'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `bank` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `bank` VALUES ("-"), +("T"); -# Dump of table barcode -# ------------------------------------------------------------ CREATE TABLE `barcode` ( - `id` int(11) NOT NULL, + `id` int NOT NULL, `barcode` varchar(25) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `barcode` (`barcode`), CONSTRAINT `barcode_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table beri_obat_operasi -# ------------------------------------------------------------ CREATE TABLE `beri_obat_operasi` ( `no_rawat` varchar(17) NOT NULL, @@ -128,12 +83,8 @@ CREATE TABLE `beri_obat_operasi` ( KEY `jumlah` (`jumlah`), CONSTRAINT `beri_obat_operasi_ibfk_2` FOREIGN KEY (`kd_obat`) REFERENCES `obatbhp_ok` (`kd_obat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `beri_obat_operasi_ibfk_3` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table berkas_digital_perawatan -# ------------------------------------------------------------ CREATE TABLE `berkas_digital_perawatan` ( `no_rawat` varchar(17) NOT NULL, @@ -143,31 +94,17 @@ CREATE TABLE `berkas_digital_perawatan` ( KEY `kode` (`kode`), CONSTRAINT `berkas_digital_perawatan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `berkas_digital_perawatan_ibfk_2` FOREIGN KEY (`kode`) REFERENCES `master_berkas_digital` (`kode`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bidang -# ------------------------------------------------------------ CREATE TABLE `bidang` ( `nama` varchar(15) NOT NULL, PRIMARY KEY (`nama`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `bidang` WRITE; -/*!40000 ALTER TABLE `bidang` DISABLE KEYS */; - -INSERT INTO `bidang` (`nama`) -VALUES - ('-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `bidang` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `bidang` VALUES ("-"); -# Dump of table booking_operasi -# ------------------------------------------------------------ CREATE TABLE `booking_operasi` ( `no_rawat` varchar(17) DEFAULT NULL, @@ -186,12 +123,8 @@ CREATE TABLE `booking_operasi` ( CONSTRAINT `booking_operasi_ibfk_2` FOREIGN KEY (`kode_paket`) REFERENCES `paket_operasi` (`kode_paket`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `booking_operasi_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `booking_operasi_ibfk_4` FOREIGN KEY (`kd_ruang_ok`) REFERENCES `ruang_ok` (`kd_ruang_ok`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table booking_periksa -# ------------------------------------------------------------ CREATE TABLE `booking_periksa` ( `no_booking` varchar(17) NOT NULL, @@ -208,24 +141,16 @@ CREATE TABLE `booking_periksa` ( UNIQUE KEY `tanggal` (`tanggal`,`no_telp`), KEY `kd_poli` (`kd_poli`), CONSTRAINT `booking_periksa_ibfk_1` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table booking_periksa_balasan -# ------------------------------------------------------------ CREATE TABLE `booking_periksa_balasan` ( `no_booking` varchar(17) NOT NULL, `balasan` varchar(200) DEFAULT NULL, PRIMARY KEY (`no_booking`), CONSTRAINT `booking_periksa_balasan_ibfk_1` FOREIGN KEY (`no_booking`) REFERENCES `booking_periksa` (`no_booking`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table booking_periksa_diterima -# ------------------------------------------------------------ CREATE TABLE `booking_periksa_diterima` ( `no_booking` varchar(17) NOT NULL, @@ -234,12 +159,8 @@ CREATE TABLE `booking_periksa_diterima` ( KEY `no_rkm_medis` (`no_rkm_medis`), CONSTRAINT `booking_periksa_diterima_ibfk_1` FOREIGN KEY (`no_booking`) REFERENCES `booking_periksa` (`no_booking`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `booking_periksa_diterima_ibfk_2` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table booking_registrasi -# ------------------------------------------------------------ CREATE TABLE `booking_registrasi` ( `tanggal_booking` date DEFAULT NULL, @@ -250,7 +171,7 @@ CREATE TABLE `booking_registrasi` ( `kd_poli` varchar(5) DEFAULT NULL, `no_reg` varchar(8) DEFAULT NULL, `kd_pj` char(3) DEFAULT NULL, - `limit_reg` int(1) DEFAULT NULL, + `limit_reg` int DEFAULT NULL, `waktu_kunjungan` datetime DEFAULT NULL, `status` enum('Terdaftar','Belum','Batal','Dokter Berhalangan') DEFAULT NULL, PRIMARY KEY (`no_rkm_medis`,`tanggal_periksa`), @@ -262,24 +183,16 @@ CREATE TABLE `booking_registrasi` ( CONSTRAINT `booking_registrasi_ibfk_2` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `booking_registrasi_ibfk_3` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `booking_registrasi_ibfk_4` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bpjs_prb -# ------------------------------------------------------------ CREATE TABLE `bpjs_prb` ( `no_sep` varchar(40) NOT NULL, `prb` varchar(50) DEFAULT NULL, PRIMARY KEY (`no_sep`), CONSTRAINT `bpjs_prb_ibfk_1` FOREIGN KEY (`no_sep`) REFERENCES `bridging_sep` (`no_sep`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_rujukan_bpjs -# ------------------------------------------------------------ CREATE TABLE `bridging_rujukan_bpjs` ( `no_sep` varchar(40) NOT NULL, @@ -299,12 +212,8 @@ CREATE TABLE `bridging_rujukan_bpjs` ( PRIMARY KEY (`no_rujukan`), KEY `no_sep` (`no_sep`), CONSTRAINT `bridging_rujukan_bpjs_ibfk_1` FOREIGN KEY (`no_sep`) REFERENCES `bridging_sep` (`no_sep`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_sep -# ------------------------------------------------------------ CREATE TABLE `bridging_sep` ( `no_sep` varchar(40) NOT NULL DEFAULT '', @@ -362,12 +271,8 @@ CREATE TABLE `bridging_sep` ( PRIMARY KEY (`no_sep`), KEY `no_rawat` (`no_rawat`), CONSTRAINT `bridging_sep_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_sep_internal -# ------------------------------------------------------------ CREATE TABLE `bridging_sep_internal` ( `no_sep` varchar(40) NOT NULL DEFAULT '', @@ -426,12 +331,8 @@ CREATE TABLE `bridging_sep_internal` ( KEY `no_sep` (`no_sep`), CONSTRAINT `bridging_sep_internal_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `bridging_sep_internal_ibfk_2` FOREIGN KEY (`no_sep`) REFERENCES `bridging_sep` (`no_sep`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_srb_bpjs -# ------------------------------------------------------------ CREATE TABLE `bridging_srb_bpjs` ( `no_sep` varchar(40) NOT NULL, @@ -448,12 +349,8 @@ CREATE TABLE `bridging_srb_bpjs` ( `saran` varchar(100) DEFAULT NULL, PRIMARY KEY (`no_sep`,`no_srb`), CONSTRAINT `bridging_srb_bpjs_ibfk_1` FOREIGN KEY (`no_sep`) REFERENCES `bridging_sep` (`no_sep`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_surat_kontrol_bpjs -# ------------------------------------------------------------ CREATE TABLE `bridging_surat_kontrol_bpjs` ( `no_sep` varchar(40) DEFAULT NULL, @@ -467,12 +364,8 @@ CREATE TABLE `bridging_surat_kontrol_bpjs` ( PRIMARY KEY (`no_surat`), KEY `bridging_surat_kontrol_bpjs_ibfk_1` (`no_sep`), CONSTRAINT `bridging_surat_kontrol_bpjs_ibfk_1` FOREIGN KEY (`no_sep`) REFERENCES `bridging_sep` (`no_sep`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table bridging_surat_pri_bpjs -# ------------------------------------------------------------ CREATE TABLE `bridging_surat_pri_bpjs` ( `no_rawat` varchar(17) DEFAULT NULL, @@ -489,33 +382,36 @@ CREATE TABLE `bridging_surat_pri_bpjs` ( PRIMARY KEY (`no_surat`), KEY `no_rawat` (`no_rawat`), CONSTRAINT `bridging_surat_pri_bpjs_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table cacat_fisik -# ------------------------------------------------------------ CREATE TABLE `cacat_fisik` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nama_cacat` varchar(30) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `nama_cacat` (`nama_cacat`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -LOCK TABLES `cacat_fisik` WRITE; -/*!40000 ALTER TABLE `cacat_fisik` DISABLE KEYS */; -INSERT INTO `cacat_fisik` (`id`, `nama_cacat`) -VALUES - (1,'-'); +INSERT INTO `cacat_fisik` VALUES ("1","-"); -/*!40000 ALTER TABLE `cacat_fisik` ENABLE KEYS */; -UNLOCK TABLES; +CREATE TABLE `catatan_adime_gizi` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `asesmen` TEXT DEFAULT NULL, + `diagnosis` TEXT DEFAULT NULL, + `intervensi` TEXT DEFAULT NULL, + `monitoring` TEXT DEFAULT NULL, + `evaluasi` TEXT DEFAULT NULL, + `instruksi` TEXT DEFAULT NULL, + `nip` varchar(20) DEFAULT NULL, + PRIMARY KEY (`no_rawat`,`tanggal`) USING BTREE, + KEY `nip` (`nip`) USING BTREE, + CONSTRAINT `catatan_adime_gizi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `catatan_adime_gizi_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table catatan_perawatan -# ------------------------------------------------------------ CREATE TABLE `catatan_perawatan` ( `tanggal` date DEFAULT NULL, @@ -527,12 +423,66 @@ CREATE TABLE `catatan_perawatan` ( KEY `kd_dokter` (`kd_dokter`), CONSTRAINT `catatan_perawatan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `catatan_perawatan_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `data_tb` ( + `no_rawat` varchar(17) NOT NULL, + `id_tb_03` varchar(30) DEFAULT NULL, + `id_periode_laporan` enum('1=Januari - Maret','2=April - Juni','3=Juli - September','4=Oktober - Desember') DEFAULT NULL, + `tanggal_buat_laporan` datetime DEFAULT NULL, + `tahun_buat_laporan` year DEFAULT NULL, + `kd_wasor` int DEFAULT NULL, + `noregkab` int DEFAULT NULL, + `id_propinsi` varchar(15) DEFAULT NULL, + `kd_kabupaten` varchar(15) DEFAULT NULL, + `id_kecamatan` varchar(15) DEFAULT NULL, + `id_kelurahan` varchar(15) DEFAULT NULL, + `nama_rujukan` enum('Inisiatif pasien/Keluarga','Anggota Masyarakat/Kader','Faskes','Dokter Praktek Mandiri','Poli lain','Lain-lain') DEFAULT NULL, + `sebutkan1` varchar(100) DEFAULT NULL, + `tipe_diagnosis` enum('Terkonfirmasi bakteriologis','Terdiagnosis klinis') DEFAULT NULL, + `klasifikasi_lokasi_anatomi` enum('Paru','Ekstraparu') DEFAULT NULL, + `klasifikasi_riwayat_pengobatan` enum('Baru','Kambuh','Diobati setelah gagal','Diobati Setelah Putus Berobat','Lain-lain','Riwayat Pengobatan Sebelumnya Tidak Diketahui','Pindahan') DEFAULT NULL, + `klasifikasi_status_hiv` enum('Positif','Negatif','Tidak diketahui') DEFAULT NULL, + `total_skoring_anak` enum('1','2','3','4','5','6','7','8','9','10','11','12','13','Tidak dilakukan') DEFAULT NULL, + `konfirmasiSkoring5` enum('Uji Tuberkulin Positif','Ada Kontak TB Paru','Uji Tuberkulin Negatif','Tidak Ada Kontak TB Paru') DEFAULT NULL, + `konfirmasiSkoring6` enum('Ada Kontak TB Paru','Tidak Ada','Tidak Jelas Kontak TB Paru') DEFAULT NULL, + `tanggal_mulai_pengobatan` date DEFAULT NULL, + `paduan_oat` TEXT DEFAULT NULL, + `sumber_obat` enum('Program TB','Bayar Sendiri','Asuransi','Lain-lain') DEFAULT NULL, + `sebutkan` TEXT DEFAULT NULL, + `sebelum_pengobatan_hasil_mikroskopis` enum('Negatif','1-19','1+','2+','3+','Tidak dilakukan') DEFAULT NULL, + `sebelum_pengobatan_hasil_tes_cepat` enum('Rif sensitif','Rif resisten','Negatif','Rif Indeterminated','Invalid','Error','No Result','Tidak dilakukan') DEFAULT NULL, + `sebelum_pengobatan_hasil_biakan` enum('Negatif','1-19 BTA','1+','2+','3+','4+','NTM','Kontaminasi','Tidak dilakukan') DEFAULT NULL, + `noreglab_bulan_2` varchar(15) DEFAULT NULL, + `hasil_mikroskopis_bulan_2` enum('Negatif','1-19','1+','2+','3+','Tidak dilakukan') DEFAULT NULL, + `noreglab_bulan_3` varchar(15) DEFAULT NULL, + `hasil_mikroskopis_bulan_3` enum('Negatif','1-19','1+','2+','3+','Tidak dilakukan') DEFAULT NULL, + `noreglab_bulan_5` varchar(15) DEFAULT NULL, + `hasil_mikroskopis_bulan_5` enum('Negatif','1-19','1+','2+','3+','Tidak dilakukan') DEFAULT NULL, + `akhir_pengobatan_noreglab` varchar(15) DEFAULT NULL, + `akhir_pengobatan_hasil_mikroskopis` enum('Negatif','1-19','1+','2+','3+','Tidak dilakukan') DEFAULT NULL, + `tanggal_hasil_akhir_pengobatan` date DEFAULT NULL, + `hasil_akhir_pengobatan` enum('Belum','Sembuh','Pengobatan Lengkap','Lost To Follow Up','Meninggal','Gagal','Pindah','') DEFAULT NULL, + `tanggal_dianjurkan_tes` date DEFAULT NULL, + `tanggal_tes_hiv` date DEFAULT NULL, + `hasil_tes_hiv` enum('Reaktif','Non Reaktif','Indeterminated') DEFAULT NULL, + `ppk` enum('Ya','Tidak') DEFAULT NULL, + `art` enum('Ya','Tidak') DEFAULT NULL, + `tb_dm` enum('Ya','Tidak') DEFAULT NULL, + `terapi_dm` enum('OHO','Inj. Insulin','') DEFAULT NULL, + `pindah_ro` enum('Ya','Tidak') DEFAULT NULL, + `status_pengobatan` enum('Sesuai Standar','Tidak Sesuai Standar') DEFAULT NULL, + `foto_toraks` enum('Positif','Negatif','Tidak Dilakukan') DEFAULT NULL, + `toraks_tdk_dilakukan` enum('Tidak dilakukan','Setelah terapi antibioka non OAT: tidak ada perbaikan Klinis, ada faktor resiko TB, dan atas pertimbangan dokter','Setelah terapi antibioka non OAT: ada Perbaikan Klinis') DEFAULT NULL, + `keterangan` varchar(100) DEFAULT NULL, + `kode_icd_x` varchar(15) DEFAULT NULL, + PRIMARY KEY (`no_rawat`), + KEY `kode_icd_x` (`kode_icd_x`), + CONSTRAINT `data_tb_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `data_tb_ibfk_2` FOREIGN KEY (`kode_icd_x`) REFERENCES `penyakit` (`kd_penyakit`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table databarang -# ------------------------------------------------------------ CREATE TABLE `databarang` ( `kode_brng` varchar(15) NOT NULL DEFAULT '', @@ -591,42 +541,36 @@ CREATE TABLE `databarang` ( CONSTRAINT `databarang_ibfk_5` FOREIGN KEY (`kode_kategori`) REFERENCES `kategori_barang` (`kode`) ON UPDATE CASCADE, CONSTRAINT `databarang_ibfk_6` FOREIGN KEY (`kode_golongan`) REFERENCES `golongan_barang` (`kode`) ON UPDATE CASCADE, CONSTRAINT `databarang_ibfk_7` FOREIGN KEY (`kode_satbesar`) REFERENCES `kodesatuan` (`kode_sat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `databarang` WRITE; -/*!40000 ALTER TABLE `databarang` DISABLE KEYS */; - -INSERT INTO `databarang` (`kode_brng`, `nama_brng`, `kode_satbesar`, `kode_sat`, `letak_barang`, `dasar`, `h_beli`, `ralan`, `kelas1`, `kelas2`, `kelas3`, `utama`, `vip`, `vvip`, `beliluar`, `jualbebas`, `karyawan`, `stokminimal`, `kdjns`, `isi`, `kapasitas`, `expire`, `status`, `kode_industri`, `kode_kategori`, `kode_golongan`) -VALUES - ('B00001','Paracetamol 500mg','-','-','-',5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,100,'-',10,500,'2024-06-10','1','-','-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `databarang` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `databarang` VALUES ("B00001","Paracetamol 500mg","-","-","-","5000","5000","5000","5000","5000","5000","5000","5000","5000","5000","5000","5000","100","-","10","500","2024-06-10","1","-","-","-"); -# Dump of table departemen -# ------------------------------------------------------------ CREATE TABLE `departemen` ( `dep_id` char(4) NOT NULL, `nama` varchar(25) NOT NULL, PRIMARY KEY (`dep_id`), KEY `nama` (`nama`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -LOCK TABLES `departemen` WRITE; -/*!40000 ALTER TABLE `departemen` DISABLE KEYS */; -INSERT INTO `departemen` (`dep_id`, `nama`) -VALUES - ('-','-'); +INSERT INTO `departemen` VALUES ("-","-"); -/*!40000 ALTER TABLE `departemen` ENABLE KEYS */; -UNLOCK TABLES; +CREATE TABLE `detail_obat_racikan` ( + `tgl_perawatan` date NOT NULL, + `jam` time NOT NULL, + `no_rawat` varchar(17) NOT NULL, + `no_racik` varchar(2) NOT NULL, + `kode_brng` varchar(15) NOT NULL, + PRIMARY KEY (`tgl_perawatan`,`jam`,`no_rawat`,`no_racik`,`kode_brng`), + KEY `no_rawat` (`no_rawat`), + KEY `kode_brng` (`kode_brng`), + CONSTRAINT `detail_obat_racikan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, + CONSTRAINT `detail_obat_racikan_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table detail_pemberian_obat -# ------------------------------------------------------------ CREATE TABLE `detail_pemberian_obat` ( `tgl_perawatan` date NOT NULL DEFAULT '0000-00-00', @@ -658,19 +602,15 @@ CREATE TABLE `detail_pemberian_obat` ( CONSTRAINT `detail_pemberian_obat_ibfk_3` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `detail_pemberian_obat_ibfk_4` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `detail_pemberian_obat_ibfk_5` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table detail_periksa_lab -# ------------------------------------------------------------ CREATE TABLE `detail_periksa_lab` ( `no_rawat` varchar(17) NOT NULL, `kd_jenis_prw` varchar(15) NOT NULL, `tgl_periksa` date NOT NULL, `jam` time NOT NULL, - `id_template` int(11) NOT NULL, + `id_template` int NOT NULL, `nilai` varchar(200) NOT NULL, `nilai_rujukan` varchar(30) NOT NULL, `keterangan` varchar(60) NOT NULL, @@ -701,18 +641,14 @@ CREATE TABLE `detail_periksa_lab` ( CONSTRAINT `detail_periksa_lab_ibfk_10` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `detail_periksa_lab_ibfk_11` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_lab` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `detail_periksa_lab_ibfk_12` FOREIGN KEY (`id_template`) REFERENCES `template_laboratorium` (`id_template`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table diagnosa_pasien -# ------------------------------------------------------------ CREATE TABLE `diagnosa_pasien` ( `no_rawat` varchar(17) NOT NULL, `kd_penyakit` varchar(10) NOT NULL, `status` enum('Ralan','Ranap') NOT NULL, - `prioritas` tinyint(4) NOT NULL, + `prioritas` tinyint NOT NULL, `status_penyakit` enum('Lama','Baru') DEFAULT NULL, PRIMARY KEY (`no_rawat`,`kd_penyakit`,`status`), KEY `kd_penyakit` (`kd_penyakit`), @@ -721,12 +657,8 @@ CREATE TABLE `diagnosa_pasien` ( KEY `no_rawat` (`no_rawat`), CONSTRAINT `diagnosa_pasien_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `diagnosa_pasien_ibfk_2` FOREIGN KEY (`kd_penyakit`) REFERENCES `penyakit` (`kd_penyakit`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table dokter -# ------------------------------------------------------------ CREATE TABLE `dokter` ( `kd_dokter` varchar(20) NOT NULL, @@ -760,21 +692,11 @@ CREATE TABLE `dokter` ( KEY `status` (`status`), CONSTRAINT `dokter_ibfk_2` FOREIGN KEY (`kd_sps`) REFERENCES `spesialis` (`kd_sps`) ON UPDATE CASCADE, CONSTRAINT `dokter_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `pegawai` (`nik`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `dokter` WRITE; -/*!40000 ALTER TABLE `dokter` DISABLE KEYS */; - -INSERT INTO `dokter` (`kd_dokter`, `nm_dokter`, `jk`, `tmp_lahir`, `tgl_lahir`, `gol_drh`, `agama`, `almt_tgl`, `no_telp`, `stts_nikah`, `kd_sps`, `alumni`, `no_ijn_praktek`, `status`) -VALUES - ('DR001','dr. Ataaka Muhammad','L','Barabai','2000-09-18','O','Islam','Barabai','-','MENIKAH','UMUM','UI','-','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `dokter` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `dokter` VALUES ("DR001","dr. Ataaka Muhammad","L","Barabai","2000-09-18","O","Islam","Barabai","-","MENIKAH","UMUM","UI","-","1"); -# Dump of table dpjp_ranap -# ------------------------------------------------------------ CREATE TABLE `dpjp_ranap` ( `no_rawat` varchar(17) NOT NULL, @@ -783,67 +705,39 @@ CREATE TABLE `dpjp_ranap` ( KEY `dpjp_ranap_ibfk_2` (`kd_dokter`), CONSTRAINT `dpjp_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `dpjp_ranap_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table emergency_index -# ------------------------------------------------------------ CREATE TABLE `emergency_index` ( `kode_emergency` varchar(3) NOT NULL, `nama_emergency` varchar(200) DEFAULT NULL, - `indek` tinyint(4) DEFAULT NULL, + `indek` tinyint DEFAULT NULL, PRIMARY KEY (`kode_emergency`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `emergency_index` WRITE; -/*!40000 ALTER TABLE `emergency_index` DISABLE KEYS */; - -INSERT INTO `emergency_index` (`kode_emergency`, `nama_emergency`, `indek`) -VALUES - ('-','-',1); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `emergency_index` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `emergency_index` VALUES ("-","-","1"); -# Dump of table gambar_radiologi -# ------------------------------------------------------------ CREATE TABLE `gambar_radiologi` ( `no_rawat` varchar(17) NOT NULL, `tgl_periksa` date NOT NULL, `jam` time NOT NULL, - `lokasi_gambar` varchar(500) NOT NULL, + `lokasi_gambar` varchar(255) NOT NULL, PRIMARY KEY (`no_rawat`,`tgl_periksa`,`jam`,`lokasi_gambar`), CONSTRAINT `gambar_radiologi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table golongan_barang -# ------------------------------------------------------------ CREATE TABLE `golongan_barang` ( `kode` char(4) NOT NULL, `nama` varchar(30) DEFAULT NULL, PRIMARY KEY (`kode`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `golongan_barang` WRITE; -/*!40000 ALTER TABLE `golongan_barang` DISABLE KEYS */; - -INSERT INTO `golongan_barang` (`kode`, `nama`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `golongan_barang` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `golongan_barang` VALUES ("-","-"); -# Dump of table gudangbarang -# ------------------------------------------------------------ CREATE TABLE `gudangbarang` ( `kode_brng` varchar(15) NOT NULL, @@ -857,12 +751,8 @@ CREATE TABLE `gudangbarang` ( KEY `kd_bangsal` (`kd_bangsal`) USING BTREE, CONSTRAINT `gudangbarang_ibfk_1` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `gudangbarang_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table hasil_radiologi -# ------------------------------------------------------------ CREATE TABLE `hasil_radiologi` ( `no_rawat` varchar(17) NOT NULL, @@ -872,24 +762,16 @@ CREATE TABLE `hasil_radiologi` ( PRIMARY KEY (`no_rawat`,`tgl_periksa`,`jam`), KEY `no_rawat` (`no_rawat`), CONSTRAINT `hasil_radiologi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table icd9 -# ------------------------------------------------------------ CREATE TABLE `icd9` ( `kode` varchar(8) NOT NULL, `deskripsi_panjang` varchar(250) DEFAULT NULL, `deskripsi_pendek` varchar(40) DEFAULT NULL, PRIMARY KEY (`kode`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table industrifarmasi -# ------------------------------------------------------------ CREATE TABLE `industrifarmasi` ( `kode_industri` char(5) NOT NULL DEFAULT '', @@ -902,21 +784,11 @@ CREATE TABLE `industrifarmasi` ( KEY `alamat` (`alamat`), KEY `kota` (`kota`), KEY `no_telp` (`no_telp`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `industrifarmasi` WRITE; -/*!40000 ALTER TABLE `industrifarmasi` DISABLE KEYS */; - -INSERT INTO `industrifarmasi` (`kode_industri`, `nama_industri`, `alamat`, `kota`, `no_telp`) -VALUES - ('-','-','-','-','0'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `industrifarmasi` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `industrifarmasi` VALUES ("-","-","-","-","0"); -# Dump of table inventaris -# ------------------------------------------------------------ CREATE TABLE `inventaris` ( `no_inventaris` varchar(30) NOT NULL, @@ -939,20 +811,16 @@ CREATE TABLE `inventaris` ( KEY `no_box` (`no_box`), CONSTRAINT `inventaris_ibfk_1` FOREIGN KEY (`kode_barang`) REFERENCES `inventaris_barang` (`kode_barang`) ON UPDATE CASCADE, CONSTRAINT `inventaris_ibfk_2` FOREIGN KEY (`id_ruang`) REFERENCES `inventaris_ruang` (`id_ruang`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_barang -# ------------------------------------------------------------ CREATE TABLE `inventaris_barang` ( `kode_barang` varchar(20) NOT NULL, `nama_barang` varchar(60) DEFAULT NULL, - `jml_barang` int(11) DEFAULT NULL, + `jml_barang` int DEFAULT NULL, `kode_produsen` varchar(10) DEFAULT NULL, `id_merk` varchar(10) DEFAULT NULL, - `thn_produksi` year(4) DEFAULT NULL, + `thn_produksi` year DEFAULT NULL, `isbn` varchar(20) DEFAULT NULL, `id_kategori` char(10) DEFAULT NULL, `id_jenis` char(10) DEFAULT NULL, @@ -969,48 +837,32 @@ CREATE TABLE `inventaris_barang` ( CONSTRAINT `inventaris_barang_ibfk_6` FOREIGN KEY (`id_merk`) REFERENCES `inventaris_merk` (`id_merk`) ON UPDATE CASCADE, CONSTRAINT `inventaris_barang_ibfk_7` FOREIGN KEY (`id_kategori`) REFERENCES `inventaris_kategori` (`id_kategori`) ON UPDATE CASCADE, CONSTRAINT `inventaris_barang_ibfk_8` FOREIGN KEY (`id_jenis`) REFERENCES `inventaris_jenis` (`id_jenis`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_jenis -# ------------------------------------------------------------ CREATE TABLE `inventaris_jenis` ( `id_jenis` char(10) NOT NULL, `nama_jenis` varchar(40) DEFAULT NULL, PRIMARY KEY (`id_jenis`), KEY `nama_jenis` (`nama_jenis`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_kategori -# ------------------------------------------------------------ CREATE TABLE `inventaris_kategori` ( `id_kategori` char(10) NOT NULL, `nama_kategori` varchar(40) DEFAULT NULL, PRIMARY KEY (`id_kategori`), KEY `nama_kategori` (`nama_kategori`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_merk -# ------------------------------------------------------------ CREATE TABLE `inventaris_merk` ( `id_merk` varchar(10) NOT NULL, `nama_merk` varchar(40) NOT NULL, PRIMARY KEY (`id_merk`), KEY `nama_merk` (`nama_merk`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_peminjaman -# ------------------------------------------------------------ CREATE TABLE `inventaris_peminjaman` ( `peminjam` varchar(50) NOT NULL DEFAULT '', @@ -1027,12 +879,8 @@ CREATE TABLE `inventaris_peminjaman` ( KEY `status_pinjam` (`status_pinjam`) USING BTREE, CONSTRAINT `inventaris_peminjaman_ibfk_1` FOREIGN KEY (`no_inventaris`) REFERENCES `inventaris` (`no_inventaris`) ON UPDATE CASCADE, CONSTRAINT `inventaris_peminjaman_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_produsen -# ------------------------------------------------------------ CREATE TABLE `inventaris_produsen` ( `kode_produsen` varchar(10) NOT NULL, @@ -1047,45 +895,27 @@ CREATE TABLE `inventaris_produsen` ( KEY `no_telp` (`no_telp`), KEY `email` (`email`), KEY `website_produsen` (`website_produsen`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table inventaris_ruang -# ------------------------------------------------------------ CREATE TABLE `inventaris_ruang` ( `id_ruang` varchar(5) NOT NULL, `nama_ruang` varchar(40) NOT NULL, PRIMARY KEY (`id_ruang`), KEY `nama_ruang` (`nama_ruang`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table jabatan -# ------------------------------------------------------------ CREATE TABLE `jabatan` ( `kd_jbtn` char(4) NOT NULL DEFAULT '', `nm_jbtn` varchar(25) DEFAULT NULL, PRIMARY KEY (`kd_jbtn`), KEY `nm_jbtn` (`nm_jbtn`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jabatan` WRITE; -/*!40000 ALTER TABLE `jabatan` DISABLE KEYS */; - -INSERT INTO `jabatan` (`kd_jbtn`, `nm_jbtn`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jabatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jabatan` VALUES ("-","-"); -# Dump of table jadwal -# ------------------------------------------------------------ CREATE TABLE `jadwal` ( `kd_dokter` varchar(20) NOT NULL, @@ -1093,7 +923,7 @@ CREATE TABLE `jadwal` ( `jam_mulai` time NOT NULL DEFAULT '00:00:00', `jam_selesai` time DEFAULT NULL, `kd_poli` char(5) DEFAULT NULL, - `kuota` int(11) DEFAULT NULL, + `kuota` int DEFAULT NULL, PRIMARY KEY (`kd_dokter`,`hari_kerja`,`jam_mulai`), KEY `kd_dokter` (`kd_dokter`), KEY `kd_poli` (`kd_poli`), @@ -1101,16 +931,12 @@ CREATE TABLE `jadwal` ( KEY `jam_selesai` (`jam_selesai`), CONSTRAINT `jadwal_ibfk_1` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `jadwal_ibfk_2` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table jadwal_pegawai -# ------------------------------------------------------------ CREATE TABLE `jadwal_pegawai` ( - `id` int(11) NOT NULL, - `tahun` year(4) NOT NULL, + `id` int NOT NULL, + `tahun` year NOT NULL, `bulan` enum('01','02','03','04','05','06','07','08','09','10','11','12') NOT NULL, `h1` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10','') NOT NULL, `h2` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10','') NOT NULL, @@ -1155,16 +981,12 @@ CREATE TABLE `jadwal_pegawai` ( KEY `h18` (`h18`), KEY `h9` (`h9`), CONSTRAINT `jadwal_pegawai_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table jadwal_tambahan -# ------------------------------------------------------------ CREATE TABLE `jadwal_tambahan` ( - `id` int(11) NOT NULL, - `tahun` year(4) NOT NULL, + `id` int NOT NULL, + `tahun` year NOT NULL, `bulan` enum('01','02','03','04','05','06','07','08','09','10','11','12') NOT NULL, `h1` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10','') NOT NULL, `h2` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10','') NOT NULL, @@ -1199,15 +1021,11 @@ CREATE TABLE `jadwal_tambahan` ( `h31` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10','') NOT NULL, PRIMARY KEY (`id`,`tahun`,`bulan`), CONSTRAINT `jadwal_tambahan_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table jam_jaga -# ------------------------------------------------------------ CREATE TABLE `jam_jaga` ( - `no_id` int(11) NOT NULL AUTO_INCREMENT, + `no_id` int NOT NULL AUTO_INCREMENT, `dep_id` char(4) NOT NULL, `shift` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10') NOT NULL, `jam_masuk` time NOT NULL, @@ -1219,43 +1037,29 @@ CREATE TABLE `jam_jaga` ( KEY `jam_masuk` (`jam_masuk`), KEY `jam_pulang` (`jam_pulang`), CONSTRAINT `jam_jaga_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `departemen` (`dep_id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table jam_masuk -# ------------------------------------------------------------ CREATE TABLE `jam_masuk` ( `shift` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10') NOT NULL, `jam_masuk` time NOT NULL, `jam_pulang` time NOT NULL, PRIMARY KEY (`shift`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jam_masuk` WRITE; -/*!40000 ALTER TABLE `jam_masuk` DISABLE KEYS */; - -INSERT INTO `jam_masuk` (`shift`, `jam_masuk`, `jam_pulang`) -VALUES - ('Pagi','06:00:00','16:00:00'), - ('Pagi2','08:00:00','14:00:00'), - ('Pagi3','10:00:00','17:00:00'), - ('Siang','14:00:00','08:00:00'), - ('Siang2','14:00:00','21:00:00'), - ('Malam','20:00:00','02:00:00'), - ('Midle Siang1','00:00:00','06:00:00'), - ('Midle Siang3','00:00:00','00:00:00'), - ('Midle Siang4','04:00:00','16:00:00'), - ('Midle Malam1','00:00:00','06:00:00'), - ('Midle Malam5','22:00:00','07:00:00'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jam_masuk` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jam_masuk` VALUES ("Pagi","06:00:00","16:00:00"), +("Pagi2","08:00:00","14:00:00"), +("Pagi3","10:00:00","17:00:00"), +("Siang","14:00:00","08:00:00"), +("Siang2","14:00:00","21:00:00"), +("Malam","20:00:00","02:00:00"), +("Midle Siang1","00:00:00","06:00:00"), +("Midle Siang3","00:00:00","00:00:00"), +("Midle Siang4","04:00:00","16:00:00"), +("Midle Malam1","00:00:00","06:00:00"), +("Midle Malam5","22:00:00","07:00:00"); -# Dump of table jenis -# ------------------------------------------------------------ CREATE TABLE `jenis` ( `kdjns` char(4) NOT NULL, @@ -1264,45 +1068,25 @@ CREATE TABLE `jenis` ( PRIMARY KEY (`kdjns`), KEY `nama` (`nama`), KEY `keterangan` (`keterangan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jenis` WRITE; -/*!40000 ALTER TABLE `jenis` DISABLE KEYS */; - -INSERT INTO `jenis` (`kdjns`, `nama`, `keterangan`) -VALUES - ('-','-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jenis` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jenis` VALUES ("-","-","-"); -# Dump of table jnj_jabatan -# ------------------------------------------------------------ CREATE TABLE `jnj_jabatan` ( `kode` varchar(10) NOT NULL, `nama` varchar(50) NOT NULL, `tnj` double NOT NULL, - `indek` tinyint(4) NOT NULL, + `indek` tinyint NOT NULL, PRIMARY KEY (`kode`), KEY `nama` (`nama`), KEY `tnj` (`tnj`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jnj_jabatan` WRITE; -/*!40000 ALTER TABLE `jnj_jabatan` DISABLE KEYS */; - -INSERT INTO `jnj_jabatan` (`kode`, `nama`, `tnj`, `indek`) -VALUES - ('-','-',0,1); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jnj_jabatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jnj_jabatan` VALUES ("-","-","0","1"); -# Dump of table jns_perawatan -# ------------------------------------------------------------ CREATE TABLE `jns_perawatan` ( `kd_jenis_prw` varchar(15) NOT NULL, @@ -1338,21 +1122,11 @@ CREATE TABLE `jns_perawatan` ( CONSTRAINT `jns_perawatan_ibfk_1` FOREIGN KEY (`kd_kategori`) REFERENCES `kategori_perawatan` (`kd_kategori`) ON UPDATE CASCADE, CONSTRAINT `jns_perawatan_ibfk_2` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE, CONSTRAINT `jns_perawatan_ibfk_3` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jns_perawatan` WRITE; -/*!40000 ALTER TABLE `jns_perawatan` DISABLE KEYS */; - -INSERT INTO `jns_perawatan` (`kd_jenis_prw`, `nm_perawatan`, `kd_kategori`, `material`, `bhp`, `tarif_tindakandr`, `tarif_tindakanpr`, `kso`, `menejemen`, `total_byrdr`, `total_byrpr`, `total_byrdrpr`, `kd_pj`, `kd_poli`, `status`) -VALUES - ('RJ001','Pemeriksaan rutin','-',0,0,50000,0,0,0,50000,0,50000,'-','-','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jns_perawatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jns_perawatan` VALUES ("RJ001","Pemeriksaan rutin","-","0","0","50000","0","0","0","50000","0","50000","-","-","1"); -# Dump of table jns_perawatan_inap -# ------------------------------------------------------------ CREATE TABLE `jns_perawatan_inap` ( `kd_jenis_prw` varchar(15) NOT NULL, @@ -1389,21 +1163,11 @@ CREATE TABLE `jns_perawatan_inap` ( CONSTRAINT `jns_perawatan_inap_ibfk_7` FOREIGN KEY (`kd_kategori`) REFERENCES `kategori_perawatan` (`kd_kategori`) ON UPDATE CASCADE, CONSTRAINT `jns_perawatan_inap_ibfk_8` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE, CONSTRAINT `jns_perawatan_inap_ibfk_9` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jns_perawatan_inap` WRITE; -/*!40000 ALTER TABLE `jns_perawatan_inap` DISABLE KEYS */; - -INSERT INTO `jns_perawatan_inap` (`kd_jenis_prw`, `nm_perawatan`, `kd_kategori`, `material`, `bhp`, `tarif_tindakandr`, `tarif_tindakanpr`, `kso`, `menejemen`, `total_byrdr`, `total_byrpr`, `total_byrdrpr`, `kd_pj`, `kd_bangsal`, `status`, `kelas`) -VALUES - ('RI001','Pasang Infus','-',0,0,0,25000,0,0,0,25000,25000,'-','-','1','Kelas 1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jns_perawatan_inap` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jns_perawatan_inap` VALUES ("RI001","Pasang Infus","-","0","0","0","25000","0","0","0","25000","25000","-","-","1","Kelas 1"); -# Dump of table jns_perawatan_lab -# ------------------------------------------------------------ CREATE TABLE `jns_perawatan_lab` ( `kd_jenis_prw` varchar(15) NOT NULL, @@ -1433,21 +1197,11 @@ CREATE TABLE `jns_perawatan_lab` ( KEY `menejemen` (`menejemen`), KEY `status` (`status`), CONSTRAINT `jns_perawatan_lab_ibfk_1` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jns_perawatan_lab` WRITE; -/*!40000 ALTER TABLE `jns_perawatan_lab` DISABLE KEYS */; - -INSERT INTO `jns_perawatan_lab` (`kd_jenis_prw`, `nm_perawatan`, `bagian_rs`, `bhp`, `tarif_perujuk`, `tarif_tindakan_dokter`, `tarif_tindakan_petugas`, `kso`, `menejemen`, `total_byr`, `kd_pj`, `status`, `kelas`, `kategori`) -VALUES - ('LAB001','Pemeriksaan Darah',0,0,0,100000,0,0,0,100000,'-','1','Kelas 1','PK'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jns_perawatan_lab` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jns_perawatan_lab` VALUES ("LAB001","Pemeriksaan Darah","0","0","0","100000","0","0","0","100000","-","1","Kelas 1","PK"); -# Dump of table jns_perawatan_radiologi -# ------------------------------------------------------------ CREATE TABLE `jns_perawatan_radiologi` ( `kd_jenis_prw` varchar(15) NOT NULL, @@ -1476,42 +1230,22 @@ CREATE TABLE `jns_perawatan_radiologi` ( KEY `menejemen` (`menejemen`), KEY `status` (`status`), CONSTRAINT `jns_perawatan_radiologi_ibfk_1` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `jns_perawatan_radiologi` WRITE; -/*!40000 ALTER TABLE `jns_perawatan_radiologi` DISABLE KEYS */; - -INSERT INTO `jns_perawatan_radiologi` (`kd_jenis_prw`, `nm_perawatan`, `bagian_rs`, `bhp`, `tarif_perujuk`, `tarif_tindakan_dokter`, `tarif_tindakan_petugas`, `kso`, `menejemen`, `total_byr`, `kd_pj`, `status`, `kelas`) -VALUES - ('RAD001','Thorax',0,0,0,150000,0,0,0,150000,'-','1','Kelas 1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `jns_perawatan_radiologi` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `jns_perawatan_radiologi` VALUES ("RAD001","Thorax","0","0","0","150000","0","0","0","150000","-","1","Kelas 1"); -# Dump of table kabupaten -# ------------------------------------------------------------ CREATE TABLE `kabupaten` ( - `kd_kab` int(11) NOT NULL AUTO_INCREMENT, + `kd_kab` int NOT NULL, `nm_kab` varchar(60) NOT NULL, PRIMARY KEY (`kd_kab`), UNIQUE KEY `nm_kab` (`nm_kab`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kabupaten` WRITE; -/*!40000 ALTER TABLE `kabupaten` DISABLE KEYS */; - -INSERT INTO `kabupaten` (`kd_kab`, `nm_kab`) -VALUES - (1,'-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kabupaten` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kabupaten` VALUES ("1","-"); -# Dump of table kamar -# ------------------------------------------------------------ CREATE TABLE `kamar` ( `kd_kamar` varchar(15) NOT NULL, @@ -1527,22 +1261,12 @@ CREATE TABLE `kamar` ( KEY `kelas` (`kelas`), KEY `statusdata` (`statusdata`), CONSTRAINT `kamar_ibfk_1` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kamar` WRITE; -/*!40000 ALTER TABLE `kamar` DISABLE KEYS */; - -INSERT INTO `kamar` (`kd_kamar`, `kd_bangsal`, `trf_kamar`, `status`, `kelas`, `statusdata`) -VALUES - ('ANG01','ANG',100000,'KOSONG','Kelas 1','1'), - ('ANG02','ANG',100000,'KOSONG','Kelas 1','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kamar` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kamar` VALUES ("ANG01","ANG","100000","KOSONG","Kelas 1","1"), +("ANG02","ANG","100000","KOSONG","Kelas 1","1"); -# Dump of table kamar_inap -# ------------------------------------------------------------ CREATE TABLE `kamar_inap` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -1569,32 +1293,18 @@ CREATE TABLE `kamar_inap` ( KEY `trf_kamar` (`trf_kamar`), CONSTRAINT `kamar_inap_ibfk_2` FOREIGN KEY (`kd_kamar`) REFERENCES `kamar` (`kd_kamar`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `kamar_inap_ibfk_3` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table kategori_barang -# ------------------------------------------------------------ CREATE TABLE `kategori_barang` ( `kode` char(4) NOT NULL, `nama` varchar(30) DEFAULT NULL, PRIMARY KEY (`kode`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kategori_barang` WRITE; -/*!40000 ALTER TABLE `kategori_barang` DISABLE KEYS */; - -INSERT INTO `kategori_barang` (`kode`, `nama`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kategori_barang` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kategori_barang` VALUES ("-","-"); -# Dump of table kategori_penyakit -# ------------------------------------------------------------ CREATE TABLE `kategori_penyakit` ( `kd_ktg` varchar(8) NOT NULL, @@ -1603,124 +1313,64 @@ CREATE TABLE `kategori_penyakit` ( PRIMARY KEY (`kd_ktg`), KEY `nm_kategori` (`nm_kategori`), KEY `ciri_umum` (`ciri_umum`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kategori_penyakit` WRITE; -/*!40000 ALTER TABLE `kategori_penyakit` DISABLE KEYS */; - -INSERT INTO `kategori_penyakit` (`kd_ktg`, `nm_kategori`, `ciri_umum`) -VALUES - ('-','-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kategori_penyakit` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kategori_penyakit` VALUES ("-","-","-"); -# Dump of table kategori_perawatan -# ------------------------------------------------------------ CREATE TABLE `kategori_perawatan` ( `kd_kategori` char(5) NOT NULL, `nm_kategori` varchar(30) DEFAULT NULL, PRIMARY KEY (`kd_kategori`), KEY `nm_kategori` (`nm_kategori`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kategori_perawatan` WRITE; -/*!40000 ALTER TABLE `kategori_perawatan` DISABLE KEYS */; - -INSERT INTO `kategori_perawatan` (`kd_kategori`, `nm_kategori`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kategori_perawatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kategori_perawatan` VALUES ("-","-"); -# Dump of table kecamatan -# ------------------------------------------------------------ CREATE TABLE `kecamatan` ( - `kd_kec` int(11) NOT NULL AUTO_INCREMENT, + `kd_kec` int NOT NULL, `nm_kec` varchar(60) NOT NULL, PRIMARY KEY (`kd_kec`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kecamatan` WRITE; -/*!40000 ALTER TABLE `kecamatan` DISABLE KEYS */; - -INSERT INTO `kecamatan` (`kd_kec`, `nm_kec`) -VALUES - (1,'-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kecamatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kecamatan` VALUES ("1","-"); -# Dump of table kelompok_jabatan -# ------------------------------------------------------------ CREATE TABLE `kelompok_jabatan` ( `kode_kelompok` varchar(3) NOT NULL, `nama_kelompok` varchar(100) DEFAULT NULL, - `indek` tinyint(4) DEFAULT NULL, + `indek` tinyint DEFAULT NULL, PRIMARY KEY (`kode_kelompok`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kelompok_jabatan` WRITE; -/*!40000 ALTER TABLE `kelompok_jabatan` DISABLE KEYS */; - -INSERT INTO `kelompok_jabatan` (`kode_kelompok`, `nama_kelompok`, `indek`) -VALUES - ('-','-',1); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kelompok_jabatan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kelompok_jabatan` VALUES ("-","-","1"); -# Dump of table kelurahan -# ------------------------------------------------------------ CREATE TABLE `kelurahan` ( `kd_kel` varchar(11) NOT NULL, `nm_kel` varchar(60) NOT NULL, PRIMARY KEY (`kd_kel`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kelurahan` WRITE; -/*!40000 ALTER TABLE `kelurahan` DISABLE KEYS */; - -INSERT INTO `kelurahan` (`kd_kel`, `nm_kel`) -VALUES - ('1','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kelurahan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kelurahan` VALUES ("1","-"); -# Dump of table kodesatuan -# ------------------------------------------------------------ CREATE TABLE `kodesatuan` ( `kode_sat` char(4) NOT NULL, `satuan` varchar(30) DEFAULT NULL, PRIMARY KEY (`kode_sat`), KEY `satuan` (`satuan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `kodesatuan` WRITE; -/*!40000 ALTER TABLE `kodesatuan` DISABLE KEYS */; - -INSERT INTO `kodesatuan` (`kode_sat`, `satuan`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `kodesatuan` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `kodesatuan` VALUES ("-","-"); -# Dump of table laporan_operasi -# ------------------------------------------------------------ CREATE TABLE `laporan_operasi` ( `no_rawat` varchar(17) NOT NULL, @@ -1733,12 +1383,8 @@ CREATE TABLE `laporan_operasi` ( `laporan_operasi` text NOT NULL, PRIMARY KEY (`no_rawat`,`tanggal`), CONSTRAINT `laporan_operasi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table maping_dokter_dpjpvclaim -# ------------------------------------------------------------ CREATE TABLE `maping_dokter_dpjpvclaim` ( `kd_dokter` varchar(20) NOT NULL, @@ -1746,12 +1392,8 @@ CREATE TABLE `maping_dokter_dpjpvclaim` ( `nm_dokter_bpjs` varchar(50) DEFAULT NULL, PRIMARY KEY (`kd_dokter`) USING BTREE, CONSTRAINT `maping_dokter_dpjpvclaim_ibfk_1` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table maping_dokter_pcare -# ------------------------------------------------------------ CREATE TABLE `maping_dokter_pcare` ( `kd_dokter` varchar(20) NOT NULL, @@ -1759,12 +1401,8 @@ CREATE TABLE `maping_dokter_pcare` ( `nm_dokter_pcare` varchar(50) DEFAULT NULL, PRIMARY KEY (`kd_dokter`) USING BTREE, CONSTRAINT `maping_dokter_pcare_ibfk_1` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table maping_poli_bpjs -# ------------------------------------------------------------ CREATE TABLE `maping_poli_bpjs` ( `kd_poli_rs` varchar(5) NOT NULL, @@ -1773,12 +1411,8 @@ CREATE TABLE `maping_poli_bpjs` ( PRIMARY KEY (`kd_poli_rs`), UNIQUE KEY `kd_poli_bpjs` (`kd_poli_bpjs`) USING BTREE, CONSTRAINT `maping_poli_bpjs_ibfk_1` FOREIGN KEY (`kd_poli_rs`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table maping_poliklinik_pcare -# ------------------------------------------------------------ CREATE TABLE `maping_poliklinik_pcare` ( `kd_poli_rs` char(5) NOT NULL, @@ -1786,97 +1420,65 @@ CREATE TABLE `maping_poliklinik_pcare` ( `nm_poli_pcare` varchar(50) DEFAULT NULL, PRIMARY KEY (`kd_poli_rs`) USING BTREE, CONSTRAINT `maping_poliklinik_pcare_ibfk_1` FOREIGN KEY (`kd_poli_rs`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table master_aturan_pakai -# ------------------------------------------------------------ CREATE TABLE `master_aturan_pakai` ( `aturan` varchar(150) NOT NULL, PRIMARY KEY (`aturan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `master_aturan_pakai` WRITE; -/*!40000 ALTER TABLE `master_aturan_pakai` DISABLE KEYS */; - -INSERT INTO `master_aturan_pakai` (`aturan`) -VALUES - ('3 x 1 Sehari'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `master_aturan_pakai` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `master_aturan_pakai` VALUES ("3 x 1 Sehari"); -# Dump of table master_berkas_digital -# ------------------------------------------------------------ CREATE TABLE `master_berkas_digital` ( `kode` varchar(10) NOT NULL, `nama` varchar(100) DEFAULT NULL, PRIMARY KEY (`kode`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `master_berkas_digital` WRITE; -/*!40000 ALTER TABLE `master_berkas_digital` DISABLE KEYS */; - -INSERT INTO `master_berkas_digital` (`kode`, `nama`) -VALUES - ('DIG001','Berkas Digital'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `master_berkas_digital` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `master_berkas_digital` VALUES ("DIG001","Berkas Digital"); -# Dump of table master_masalah_keperawatan -# ------------------------------------------------------------ CREATE TABLE `master_masalah_keperawatan` ( `kode_masalah` varchar(3) NOT NULL, `nama_masalah` varchar(100) DEFAULT NULL, PRIMARY KEY (`kode_masalah`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table metode_racik -# ------------------------------------------------------------ CREATE TABLE `metode_racik` ( `kd_racik` varchar(3) NOT NULL, `nm_racik` varchar(30) NOT NULL, PRIMARY KEY (`kd_racik`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `metode_racik` WRITE; -/*!40000 ALTER TABLE `metode_racik` DISABLE KEYS */; - -INSERT INTO `metode_racik` (`kd_racik`, `nm_racik`) -VALUES - ('1','Puyer'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `metode_racik` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `metode_racik` VALUES ("1","Puyer"); -# Dump of table mlite_akun_kegiatan -# ------------------------------------------------------------ CREATE TABLE `mlite_akun_kegiatan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `kegiatan` varchar(200) DEFAULT NULL, `kd_rek` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +INSERT INTO `mlite_akun_kegiatan` VALUES +(1,'Penerimaan Pasien Rawat Jalan','4101'), +(2,'Penerimaan Pasien Rawat Inap','4102'), +(3,'Penerimaan Penjualan Obat & BHP','4103'), +(4,'Penerimaan Laboratorium','4104'), +(5,'Penerimaan Radiologi','4105'), +(6,'Pembayaran Gaji Karyawan','5101'), +(7,'Pembelian Obat & BHP','5201'), +(8,'Pembayaran Biaya Operasional','5301'); -# Dump of table mlite_antrian_loket -# ------------------------------------------------------------ CREATE TABLE `mlite_antrian_loket` ( - `kd` int(50) NOT NULL AUTO_INCREMENT, + `kd` int NOT NULL AUTO_INCREMENT, `type` varchar(50) NOT NULL, `noantrian` varchar(50) NOT NULL, `no_rkm_medis` varchar(50) DEFAULT NULL, @@ -1886,12 +1488,8 @@ CREATE TABLE `mlite_antrian_loket` ( `status` varchar(10) NOT NULL DEFAULT '0', `loket` varchar(10) NOT NULL DEFAULT '0', PRIMARY KEY (`kd`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_antrian_referensi -# ------------------------------------------------------------ CREATE TABLE `mlite_antrian_referensi` ( `tanggal_periksa` date NOT NULL, @@ -1902,24 +1500,16 @@ CREATE TABLE `mlite_antrian_referensi` ( `jenis_kunjungan` varchar(10) NOT NULL, `status_kirim` varchar(20) DEFAULT NULL, `keterangan` varchar(250) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_antrian_referensi_batal -# ------------------------------------------------------------ CREATE TABLE `mlite_antrian_referensi_batal` ( `tanggal_batal` date NOT NULL, `nomor_referensi` varchar(50) NOT NULL, `kodebooking` varchar(100) NOT NULL, `keterangan` varchar(250) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_antrian_referensi_taskid -# ------------------------------------------------------------ CREATE TABLE `mlite_antrian_referensi_taskid` ( `tanggal_periksa` date NOT NULL, @@ -1928,47 +1518,271 @@ CREATE TABLE `mlite_antrian_referensi_taskid` ( `waktu` varchar(50) NOT NULL, `status` varchar(20) DEFAULT NULL, `keterangan` varchar(250) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_apamregister -# ------------------------------------------------------------ CREATE TABLE `mlite_apamregister` ( `nama_lengkap` varchar(225) NOT NULL, `email` varchar(225) NOT NULL, `nomor_ktp` varchar(225) NOT NULL, `nomor_telepon` varchar(225) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_billing -# ------------------------------------------------------------ +CREATE TABLE `mlite_api_key` ( + `id` int NOT NULL AUTO_INCREMENT, + `api_key` text, + `username` varchar(100) NOT NULL, + `method` varchar(100) NOT NULL, + `ip_range` varchar(100) DEFAULT NULL, + `exp_time` datetime NOT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `mlite_api_key_ibfk_1` (`username`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_apotek_online_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) NOT NULL, + `noresep` varchar(50) DEFAULT NULL, + `tanggal_kirim` datetime NOT NULL, + `status` enum('success','error') NOT NULL, + `response_resep` text, + `response_obat` text, + `request` text, + `user` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `no_rawat` (`no_rawat`) USING BTREE, + KEY `tanggal_kirim` (`tanggal_kirim`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_apotek_online_maping_obat` ( + `kode_brng` varchar(40) NOT NULL, + `kd_obat_bpjs` varchar(20) NOT NULL, + `nama_obat_bpjs` varchar(200) NOT NULL, + PRIMARY KEY (`kode_brng`) USING BTREE, + KEY `kd_obat_bpjs` (`kd_obat_bpjs`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_apotek_online_resep_response_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) DEFAULT NULL, + `no_sep_kunjungan` varchar(50) DEFAULT NULL, + `no_kartu` varchar(20) DEFAULT NULL, + `nama` varchar(100) DEFAULT NULL, + `faskes_asal` varchar(20) DEFAULT NULL, + `no_apotik` varchar(30) DEFAULT NULL, + `no_resep` varchar(20) DEFAULT NULL, + `tgl_resep` date DEFAULT NULL, + `kd_jns_obat` varchar(5) DEFAULT NULL, + `by_tag_rsp` varchar(10) DEFAULT NULL, + `by_ver_rsp` varchar(10) DEFAULT NULL, + `tgl_entry` date DEFAULT NULL, + `meta_code` varchar(10) DEFAULT NULL, + `meta_message` text, + `raw_response` text, + `tanggal_simpan` datetime DEFAULT CURRENT_TIMESTAMP, + `user` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_no_rawat` (`no_rawat`) USING BTREE, + KEY `idx_no_sep_kunjungan` (`no_sep_kunjungan`) USING BTREE, + KEY `idx_no_resep` (`no_resep`) USING BTREE, + KEY `idx_tanggal_simpan` (`tanggal_simpan`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_apotek_online_sep_data` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_sep` varchar(50) NOT NULL, + `faskes_asal_resep` varchar(20) DEFAULT NULL, + `nm_faskes_asal_resep` varchar(100) DEFAULT NULL, + `no_kartu` varchar(20) DEFAULT NULL, + `nama_peserta` varchar(100) DEFAULT NULL, + `jns_kelamin` char(1) DEFAULT NULL, + `tgl_lahir` date DEFAULT NULL, + `pisat` varchar(10) DEFAULT NULL, + `kd_jenis_peserta` varchar(10) DEFAULT NULL, + `nm_jenis_peserta` varchar(50) DEFAULT NULL, + `kode_bu` varchar(20) DEFAULT NULL, + `nama_bu` varchar(50) DEFAULT NULL, + `tgl_sep` date DEFAULT NULL, + `tgl_plg_sep` date DEFAULT NULL, + `jns_pelayanan` varchar(10) DEFAULT NULL, + `nm_diag` varchar(200) DEFAULT NULL, + `poli` varchar(50) DEFAULT NULL, + `flag_prb` char(1) DEFAULT NULL, + `nama_prb` varchar(100) DEFAULT NULL, + `kode_dokter` varchar(20) DEFAULT NULL, + `nama_dokter` varchar(100) DEFAULT NULL, + `tanggal_simpan` datetime NOT NULL, + `user_simpan` varchar(50) DEFAULT NULL, + `raw_response` text, + `no_rawat` varchar(17) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `no_sep` (`no_sep`) USING BTREE, + KEY `no_kartu` (`no_kartu`) USING BTREE, + KEY `nama_peserta` (`nama_peserta`) USING BTREE, + KEY `tanggal_simpan` (`tanggal_simpan`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + CREATE TABLE `mlite_billing` ( - `id_billing` int(11) NOT NULL AUTO_INCREMENT, + `id_billing` int NOT NULL AUTO_INCREMENT, `kd_billing` varchar(100) NOT NULL, `no_rawat` varchar(17) NOT NULL, - `jumlah_total` int(100) NOT NULL, - `potongan` int(100) NOT NULL, - `jumlah_harus_bayar` int(100) NOT NULL, - `jumlah_bayar` int(100) NOT NULL, + `jumlah_total` int NOT NULL, + `potongan` int NOT NULL, + `jumlah_harus_bayar` int NOT NULL, + `jumlah_bayar` int NOT NULL, `tgl_billing` date NOT NULL, `jam_billing` time NOT NULL, - `id_user` int(11) NOT NULL, + `id_user` int NOT NULL, `keterangan` varchar(100) NOT NULL, PRIMARY KEY (`id_billing`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `mlite_billing_pembayaran` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) NOT NULL, + `tgl_bayar` date NOT NULL, + `jam_bayar` time NOT NULL, + `metode` varchar(30) NOT NULL DEFAULT 'Tunai', + `jumlah_bayar` double NOT NULL DEFAULT 0, + `id_user` int(11) DEFAULT NULL, + `keterangan` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_billing_pembayaran_rawat` (`no_rawat`), + KEY `idx_billing_pembayaran_tgl` (`tgl_bayar`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + +CREATE TABLE `mlite_billing_pembayaran_detail` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pembayaran_id` int(11) NOT NULL, + `kelompok` varchar(30) NOT NULL, + `jumlah_alokasi` double NOT NULL DEFAULT 0, + `ref_modul` varchar(30) DEFAULT NULL, + `kd_jenis_prw` varchar(15) DEFAULT NULL, + `tgl_periksa` date DEFAULT NULL, + `jam` time DEFAULT NULL, + `status_periksa` varchar(10) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_billing_pembayaran_detail_pembayaran` (`pembayaran_id`), + KEY `idx_billing_pembayaran_detail_kelompok` (`kelompok`), + CONSTRAINT `fk_billing_pembayaran_detail_header` FOREIGN KEY (`pembayaran_id`) REFERENCES `mlite_billing_pembayaran` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + +CREATE TABLE `mlite_bpjs_emr_device` ( + `id` INT NOT NULL AUTO_INCREMENT, + `device_id` VARCHAR(50) NOT NULL, + `nama_alkes` VARCHAR(150) NOT NULL, + `kategori` varchar(50) DEFAULT 'tindakan', + `kode_produk` VARCHAR(100) DEFAULT NULL, + `keterangan` TEXT DEFAULT NULL, + `manufacturer` VARCHAR(255) DEFAULT NULL, + `manufacture_date` DATE DEFAULT NULL, + `expiration_date` DATE DEFAULT NULL, + `model` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_device_id` (`device_id`), + KEY `idx_nama_alkes` (`nama_alkes`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `mlite_bpjs_emr_logs` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_sep` varchar(50) DEFAULT NULL, + `no_rawat` varchar(50) DEFAULT NULL, + `payload_json` longtext, + `payload_encrypted` longtext, + `response` longtext, + `status` varchar(20) DEFAULT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_mapping_lab` ( + `id_template` varchar(20) NOT NULL, + `loinc_code` varchar(20) NOT NULL, + `loinc_display` varchar(255) DEFAULT NULL, + `master_device_id` int DEFAULT NULL, + `focal_device_code` varchar(255) DEFAULT NULL, + `focal_device_display` varchar(255) DEFAULT NULL, + `focal_device_action` varchar(20) DEFAULT NULL, + KEY `idx_mapping_lab_master_device` (`master_device_id`), + PRIMARY KEY (`id_template`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_mapping_radiologi` ( + `kd_jenis_prw` varchar(20) NOT NULL, + `standard_code` varchar(20) NOT NULL, + `standard_display` varchar(255) DEFAULT NULL, + `system` varchar(100) DEFAULT NULL, + `master_device_id` int DEFAULT NULL, + `focal_device_code` varchar(255) DEFAULT NULL, + `focal_device_display` varchar(255) DEFAULT NULL, + `focal_device_action` varchar(20) DEFAULT NULL, + KEY `idx_mapping_rad_master_device` (`master_device_id`), + PRIMARY KEY (`kd_jenis_prw`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_mapping_prosedur` ( + `kd_jenis_prw` varchar(20) NOT NULL, + `snomed_code` varchar(20) NOT NULL, + `snomed_display` varchar(255) DEFAULT NULL, + `master_device_id` int DEFAULT NULL, + `focal_device_code` varchar(255) DEFAULT NULL, + `focal_device_display` varchar(255) DEFAULT NULL, + `focal_device_action` varchar(20) DEFAULT NULL, + KEY `idx_mapping_proc_master_device` (`master_device_id`), + PRIMARY KEY (`kd_jenis_prw`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_mapping_prosedur_ranap` ( + `kd_jenis_prw` varchar(20) NOT NULL, + `snomed_code` varchar(20) NOT NULL, + `snomed_display` varchar(255) DEFAULT NULL, + `master_device_id` int DEFAULT NULL, + `focal_device_code` varchar(255) DEFAULT NULL, + `focal_device_display` varchar(255) DEFAULT NULL, + `focal_device_action` varchar(20) DEFAULT NULL, + KEY `idx_mapping_proc_ranap_master_device` (`master_device_id`), + PRIMARY KEY (`kd_jenis_prw`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_mapping_operasi` ( + `kode_paket` varchar(20) NOT NULL, + `snomed_code` varchar(20) NOT NULL, + `snomed_display` varchar(255) DEFAULT NULL, + `master_device_id` int DEFAULT NULL, + `focal_device_code` varchar(255) DEFAULT NULL, + `focal_device_display` varchar(255) DEFAULT NULL, + `focal_device_action` varchar(20) DEFAULT NULL, + KEY `idx_mapping_operasi_master_device` (`master_device_id`), + PRIMARY KEY (`kode_paket`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_bpjs_emr_mapping_obat` ( + `kode_brng` varchar(20) NOT NULL, + `code` varchar(20) NOT NULL, + PRIMARY KEY (`kode_brng`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_bpjs_emr_uuid_condition` ( + `kd_penyakit` varchar(15) NOT NULL, + `uuid` varchar(200) NULL DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_bridging_pcare -# ------------------------------------------------------------ CREATE TABLE `mlite_bridging_pcare` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `no_rawat` text NOT NULL, `no_rkm_medis` text, `tgl_daftar` text, @@ -2024,18 +1838,92 @@ CREATE TABLE `mlite_bridging_pcare` ( `id_user` text NOT NULL, `tgl_input` text NOT NULL, `status_kirim` text NOT NULL, + `kode_alergi_makanan` text, + `nama_alergi_makanan` text, + `kode_alergi_udara` text, + `nama_alergi_udara` text, + `kode_alergi_obat` text, + `nama_alergi_obat` text, + `kode_prognosa` text, + `nama_prognosa` text, + `terapi_obat` text, + `terapi_non_obat` text, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_crud_permissions` ( + `id` int NOT NULL AUTO_INCREMENT, + `user` varchar(100) NOT NULL, + `module` varchar(100) NOT NULL, + `can_create` varchar(10) NOT NULL DEFAULT 'true', + `can_read` varchar(10) NOT NULL DEFAULT 'true', + `can_update` varchar(10) NOT NULL DEFAULT 'true', + `can_delete` varchar(10) NOT NULL DEFAULT 'true', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `user` (`user`,`module`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_farmasi_pengajuan_obat` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `no_pengajuan` varchar(30) NOT NULL, + `tanggal_pengajuan` date NOT NULL, + `kode_brng` varchar(15) NOT NULL, + `jumlah` int(11) NOT NULL DEFAULT '0', + `status` varchar(20) NOT NULL DEFAULT 'Menunggu', + `catatan` text, + `dibuat_oleh` varchar(100) DEFAULT '-', + `disetujui_oleh` varchar(100) DEFAULT NULL, + `disetujui_at` datetime DEFAULT NULL, + `created_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_no_pengajuan` (`no_pengajuan`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_farmasi_pemesanan_obat` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `no_pemesanan` varchar(30) NOT NULL, + `no_pengajuan` varchar(30) NOT NULL, + `pengajuan_id` int(11) NOT NULL, + `kode_brng` varchar(15) NOT NULL, + `tanggal_pemesanan` date NOT NULL, + `supplier_kode` text, + `supplier` varchar(255) NOT NULL, + `jumlah_pengajuan` int(11) NOT NULL DEFAULT '0', + `jumlah_pesan` int(11) NOT NULL DEFAULT '0', + `status_pemesanan` varchar(20) NOT NULL DEFAULT 'Draft', + `catatan` text, + `dibuat_oleh` varchar(100) DEFAULT '-', + `created_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_no_pemesanan` (`no_pemesanan`), + KEY `idx_no_pengajuan_pemesanan` (`no_pengajuan`), + KEY `idx_pengajuan_id` (`pengajuan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_farmasi_penerimaan_obat` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pemesanan_id` int(11) NOT NULL, + `tanggal_penerimaan` date NOT NULL, + `jumlah_terima` int(11) NOT NULL DEFAULT '0', + `jenis_pembayaran` varchar(10) NOT NULL DEFAULT 'Cash', + `tanggal_jatuh_tempo` date DEFAULT NULL, + `nomor_faktur` varchar(100) DEFAULT NULL, + `catatan` text, + `dibuat_oleh` varchar(100) DEFAULT '-', + `created_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_pemesanan_id` (`pemesanan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_detailjurnal -# ------------------------------------------------------------ CREATE TABLE `mlite_detailjurnal` ( `no_jurnal` varchar(20) DEFAULT NULL, `kd_rek` varchar(15) DEFAULT NULL, - `arus_kas` int(10) NOT NULL, + `arus_kas` int NOT NULL, `debet` double NOT NULL, `kredit` double NOT NULL, KEY `no_jurnal` (`no_jurnal`), @@ -2044,15 +1932,117 @@ CREATE TABLE `mlite_detailjurnal` ( KEY `kredit` (`kredit`), CONSTRAINT `mlite_detailjurnal_ibfk_1` FOREIGN KEY (`no_jurnal`) REFERENCES `mlite_jurnal` (`no_jurnal`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `mlite_detailjurnal_ibfk_2` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +-- Detail jurnal 2025 +-- JU-2025-001: Penerimaan Q1 Jan (D=75jt, K=75jt) +INSERT INTO `mlite_detailjurnal` VALUES +('JU-2025-001','1101',0,75000000,0), +('JU-2025-001','4101',0,0,30000000), +('JU-2025-001','4102',0,0,20000000), +('JU-2025-001','4103',0,0,15000000), +('JU-2025-001','4104',0,0,5000000), +('JU-2025-001','4105',0,0,5000000), +-- JU-2025-002: Pembayaran Gaji Jan (D=23jt, K=23jt) +('JU-2025-002','5101',0,10000000,0), +('JU-2025-002','5102',0,8000000,0), +('JU-2025-002','5103',0,5000000,0), +('JU-2025-002','1101',0,0,23000000), +-- JU-2025-003: Penerimaan Q2 Apr (D=90jt, K=90jt) +('JU-2025-003','1101',0,90000000,0), +('JU-2025-003','4101',0,0,35000000), +('JU-2025-003','4102',0,0,25000000), +('JU-2025-003','4103',0,0,20000000), +('JU-2025-003','4104',0,0,5000000), +('JU-2025-003','4105',0,0,5000000), +-- JU-2025-004: Pembayaran Biaya Q2 (D=50jt, K=50jt) +('JU-2025-004','5101',0,10000000,0), +('JU-2025-004','5102',0,8000000,0), +('JU-2025-004','5103',0,5000000,0), +('JU-2025-004','5201',0,25000000,0), +('JU-2025-004','5301',0,2000000,0), +('JU-2025-004','1101',0,0,50000000), +-- JU-2025-005: Penerimaan Q3 Jul (D=85jt, K=85jt) +('JU-2025-005','1101',0,85000000,0), +('JU-2025-005','4101',0,0,30000000), +('JU-2025-005','4102',0,0,25000000), +('JU-2025-005','4103',0,0,18000000), +('JU-2025-005','4104',0,0,7000000), +('JU-2025-005','4105',0,0,5000000), +-- JU-2025-006: Pembayaran Biaya Q3 (D=45jt, K=45jt) +('JU-2025-006','5101',0,10000000,0), +('JU-2025-006','5102',0,8000000,0), +('JU-2025-006','5103',0,5000000,0), +('JU-2025-006','5201',0,20000000,0), +('JU-2025-006','5301',0,2000000,0), +('JU-2025-006','1101',0,0,45000000), +-- JU-2025-007: Penerimaan Q4 Okt (D=95jt, K=95jt) +('JU-2025-007','1101',0,95000000,0), +('JU-2025-007','4101',0,0,35000000), +('JU-2025-007','4102',0,0,30000000), +('JU-2025-007','4103',0,0,18000000), +('JU-2025-007','4104',0,0,7000000), +('JU-2025-007','4105',0,0,5000000), +-- JU-2025-008: Pembayaran Biaya Q4 (D=47jt, K=47jt) +('JU-2025-008','5101',0,10000000,0), +('JU-2025-008','5102',0,8000000,0), +('JU-2025-008','5103',0,5000000,0), +('JU-2025-008','5201',0,22000000,0), +('JU-2025-008','5301',0,2000000,0), +('JU-2025-008','1101',0,0,47000000), +-- JU-2025-009: Penyesuaian Penyusutan Akhir Tahun (D=15jt, K=15jt) +('JU-2025-009','5401',0,15000000,0), +('JU-2025-009','1601',0,0,5000000), +('JU-2025-009','1701',0,0,7000000), +('JU-2025-009','1801',0,0,3000000), +-- Detail jurnal 2026 +-- JU-2026-001: Penerimaan Jan 2026 (D=80jt, K=80jt) +('JU-2026-001','1101',0,80000000,0), +('JU-2026-001','4101',0,0,30000000), +('JU-2026-001','4102',0,0,25000000), +('JU-2026-001','4103',0,0,15000000), +('JU-2026-001','4104',0,0,5000000), +('JU-2026-001','4105',0,0,5000000), +-- JU-2026-002: Pembayaran Biaya Jan 2026 (D=45.5jt, K=45.5jt) +('JU-2026-002','5101',0,10000000,0), +('JU-2026-002','5102',0,8000000,0), +('JU-2026-002','5103',0,5000000,0), +('JU-2026-002','5201',0,20000000,0), +('JU-2026-002','5301',0,2500000,0), +('JU-2026-002','1101',0,0,45500000), +-- JU-2026-003: Penerimaan Feb 2026 (D=75jt, K=75jt) +('JU-2026-003','1101',0,75000000,0), +('JU-2026-003','4101',0,0,28000000), +('JU-2026-003','4102',0,0,22000000), +('JU-2026-003','4103',0,0,14000000), +('JU-2026-003','4104',0,0,6000000), +('JU-2026-003','4105',0,0,5000000), +-- JU-2026-004: Pembayaran Biaya Feb 2026 (D=41.6jt, K=41.6jt) +('JU-2026-004','5101',0,10000000,0), +('JU-2026-004','5102',0,8000000,0), +('JU-2026-004','5103',0,5000000,0), +('JU-2026-004','5201',0,18000000,0), +('JU-2026-004','5302',0,600000,0), +('JU-2026-004','1101',0,0,41600000), +-- JU-2026-005: Penerimaan Mar 2026 (D=85jt, K=85jt) +('JU-2026-005','1101',0,85000000,0), +('JU-2026-005','4101',0,0,32000000), +('JU-2026-005','4102',0,0,27000000), +('JU-2026-005','4103',0,0,16000000), +('JU-2026-005','4104',0,0,5000000), +('JU-2026-005','4105',0,0,5000000), +-- JU-2026-006: Pembayaran Biaya Mar 2026 (D=48.1jt, K=48.1jt) +('JU-2026-006','5101',0,10000000,0), +('JU-2026-006','5102',0,8000000,0), +('JU-2026-006','5103',0,5000000,0), +('JU-2026-006','5201',0,22000000,0), +('JU-2026-006','5301',0,2500000,0), +('JU-2026-006','5302',0,600000,0), +('JU-2026-006','1101',0,0,48100000); -# Dump of table mlite_duitku -# ------------------------------------------------------------ CREATE TABLE `mlite_duitku` ( - `id` int(10) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `tanggal` datetime NOT NULL, `no_rkm_medis` varchar(15) NOT NULL, `paymentUrl` varchar(255) NOT NULL, @@ -2066,46 +2056,77 @@ CREATE TABLE `mlite_duitku` ( KEY `reference` (`reference`), KEY `mlite_duitku_ibfk_1` (`no_rkm_medis`), CONSTRAINT `mlite_duitku_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_fenton -# ------------------------------------------------------------ -CREATE TABLE `mlite_fenton` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `usia_kehamilan` int(11) NOT NULL, - `tgl_lahir` date NOT NULL, - `berat_badan` float NOT NULL, - `lingkar_kepala` int(11) NOT NULL, - `panjang_badan` int(11) NOT NULL, - `petugas` varchar(60) NOT NULL, - `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `deleted_at` timestamp NULL DEFAULT NULL, +CREATE TABLE `mlite_eklaim_logs` ( + `id` int NOT NULL AUTO_INCREMENT, + `nomor_sep` varchar(30) NOT NULL, + `method` varchar(100) DEFAULT NULL, + `request_data` longtext, + `response_data` longtext, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `status` int DEFAULT '1', + `username` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_esignatures` ( + `id` int NOT NULL AUTO_INCREMENT, + `ref_type` varchar(50) NOT NULL, + `ref_id` varchar(50) NOT NULL, + `signer_role` varchar(50) NOT NULL, + `signer_id` varchar(50) NOT NULL, + `signer_name` varchar(255) NOT NULL, + `signature_path` varchar(255) NOT NULL, + `signature_hash` varchar(255) NOT NULL, + `chain_hash` varchar(255) DEFAULT NULL, + `signed_at` datetime NOT NULL, + `ip_address` varchar(45) NOT NULL, + `user_agent` varchar(255) NOT NULL, + `legal_basis` text, + `audit_json` text, + PRIMARY KEY (`id`), + KEY `ref_idx` (`ref_type`,`ref_id`), + KEY `hash_idx` (`signature_hash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_geolocation_presensi -# ------------------------------------------------------------ CREATE TABLE `mlite_geolocation_presensi` ( - `id` int(11) NOT NULL, + `id` int NOT NULL, `tanggal` date DEFAULT NULL, `latitude` varchar(200) NOT NULL, `longitude` varchar(200) NOT NULL, KEY `mlite_geolocation_presensi_ibfk_1` (`id`), CONSTRAINT `mlite_geolocation_presensi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_idr_codes` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(20) NOT NULL, + `code2` varchar(20) NOT NULL, + `description` text, + `system` varchar(50) DEFAULT NULL, + `validcode` tinyint(1) DEFAULT NULL, + `accpdx` char(1) DEFAULT NULL, + `asterisk` tinyint(1) DEFAULT NULL, + `im` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_inacbg_codes` ( + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL, + `code2` varchar(50) NOT NULL, + `description` text, + `system` varchar(100) DEFAULT NULL, + `validcode` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_jurnal -# ------------------------------------------------------------ CREATE TABLE `mlite_jurnal` ( `no_jurnal` varchar(20) NOT NULL, @@ -2119,96 +2140,457 @@ CREATE TABLE `mlite_jurnal` ( KEY `tgl_jurnal` (`tgl_jurnal`), KEY `jenis` (`jenis`), KEY `keterangan` (`keterangan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +INSERT INTO `mlite_jurnal` VALUES +('JU-2025-001','BKT-2025-001','2025-01-15','U','Penerimaan Kasir Rawat Jalan','Penerimaan pendapatan layanan Q1 Januari 2025. Diposting oleh Administrator.'), +('JU-2025-002','BKT-2025-002','2025-01-31','U','Pembayaran Gaji Karyawan','Pembayaran gaji seluruh karyawan bulan Januari 2025. Diposting oleh Administrator.'), +('JU-2025-003','BKT-2025-003','2025-04-15','U','Penerimaan Kasir Q2','Penerimaan pendapatan layanan Q2 April 2025. Diposting oleh Administrator.'), +('JU-2025-004','BKT-2025-004','2025-04-30','U','Pembayaran Biaya Operasional Q2','Pembayaran biaya operasional bulan April 2025. Diposting oleh Administrator.'), +('JU-2025-005','BKT-2025-005','2025-07-15','U','Penerimaan Kasir Q3','Penerimaan pendapatan layanan Q3 Juli 2025. Diposting oleh Administrator.'), +('JU-2025-006','BKT-2025-006','2025-07-31','U','Pembayaran Biaya Operasional Q3','Pembayaran biaya operasional bulan Juli 2025. Diposting oleh Administrator.'), +('JU-2025-007','BKT-2025-007','2025-10-15','U','Penerimaan Kasir Q4','Penerimaan pendapatan layanan Q4 Oktober 2025. Diposting oleh Administrator.'), +('JU-2025-008','BKT-2025-008','2025-10-31','U','Pembayaran Biaya Operasional Q4','Pembayaran biaya operasional bulan Oktober 2025. Diposting oleh Administrator.'), +('JU-2025-009','BKT-2025-009','2025-12-31','P','Penyesuaian Akhir Tahun 2025','Jurnal penyesuaian beban penyusutan aset tetap tahun 2025. Diposting oleh Administrator.'), +('JU-2026-001','BKT-2026-001','2026-01-15','U','Penerimaan Kasir Januari 2026','Penerimaan pendapatan layanan bulan Januari 2026. Diposting oleh Administrator.'), +('JU-2026-002','BKT-2026-002','2026-01-31','U','Pembayaran Biaya Januari 2026','Pembayaran biaya operasional bulan Januari 2026. Diposting oleh Administrator.'), +('JU-2026-003','BKT-2026-003','2026-02-15','U','Penerimaan Kasir Februari 2026','Penerimaan pendapatan layanan bulan Februari 2026. Diposting oleh Administrator.'), +('JU-2026-004','BKT-2026-004','2026-02-28','U','Pembayaran Biaya Februari 2026','Pembayaran biaya operasional bulan Februari 2026. Diposting oleh Administrator.'), +('JU-2026-005','BKT-2026-005','2026-03-15','U','Penerimaan Kasir Maret 2026','Penerimaan pendapatan layanan bulan Maret 2026. Diposting oleh Administrator.'), +('JU-2026-006','BKT-2026-006','2026-03-31','U','Pembayaran Biaya Maret 2026','Pembayaran biaya operasional bulan Maret 2026. Diposting oleh Administrator.'); + + +CREATE TABLE `mlite_kasir_shift` ( + `id_shift` int NOT NULL AUTO_INCREMENT, + `user_id` varchar(64) NOT NULL, + `waktu_buka` datetime NOT NULL, + `waktu_tutup` datetime DEFAULT NULL, + `kas_awal` decimal(14,2) DEFAULT '0.00', + `kas_akhir` decimal(14,2) DEFAULT '0.00', + `total_transaksi` decimal(14,2) DEFAULT '0.00', + `selisih` decimal(14,2) DEFAULT '0.00', + `keterangan` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id_shift`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_login_attempts -# ------------------------------------------------------------ CREATE TABLE `mlite_login_attempts` ( `ip` text, - `attempts` int(100) NOT NULL, - `expires` int(100) NOT NULL DEFAULT '0' -) ENGINE=MyISAM DEFAULT CHARSET=utf8; + `attempts` int NOT NULL, + `expires` int NOT NULL DEFAULT '0' +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; + + +INSERT INTO `mlite_login_attempts` VALUES ("127.0.0.1","0","0"); + + +CREATE TABLE `mlite_loinc_lab` ( + `No` int(11) DEFAULT NULL, + `Kategori` text, + `NamaPemeriksaan` text, + `PermintaanHasil` text, + `Spesimen` text, + `TipeHasilPemeriksaan` text, + `Satuan` text, + `MetodeAnalisis` text, + `Code` varchar(20) NOT NULL, + `Display` text, + `Component` text, + `Property` text, + `Timing` text, + `System` text, + `Scale` text, + `Method` text, + `UnitOfMeasure` text, + `CodeSystem` text, + PRIMARY KEY (`Code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_loinc_radiologi` ( + `No` text, + `Kategori` text, + `NamaPemeriksaan` text, + `PermintaanHasil` text, + `Code` varchar(100) NOT NULL, + `Display` text, + `Component` text, + `Property` text, + `Timing` text, + `System` text, + `Scale` text, + `Method` text, + `UnitOfMeasure` text, + `CodeSystem` text, + `BodySiteCode` text, + `BodySiteDisplay` text, + `BodySiteCodeSystem` text, + PRIMARY KEY (`Code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_kfa` ( + `kode_kfa` varchar(50) NOT NULL, + `nama_kfa` text, + `kode_bahan` varchar(50) DEFAULT NULL, + `nama_bahan` text, + `numerator` varchar(10) DEFAULT NULL, + `satuan_num` varchar(10) DEFAULT NULL, + `denominator` varchar(10) DEFAULT NULL, + `satuan_den` varchar(10) DEFAULT NULL, + `nama_satuan_den` varchar(10) DEFAULT NULL, + `kode_sediaan` varchar(50) DEFAULT NULL, + `nama_sediaan` varchar(100) DEFAULT NULL, + `type` enum('obat','alkes') NOT NULL DEFAULT 'obat', + PRIMARY KEY (`kode_kfa`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_modules -# ------------------------------------------------------------ -CREATE TABLE `mlite_modules` ( +CREATE TABLE `mlite_clinical_pathway` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `kode_cp` varchar(30) NOT NULL, + `nama_cp` varchar(150) NOT NULL, + `jenis_layanan` enum('Ralan','Ranap') NOT NULL DEFAULT 'Ranap', + `target_los` int(11) NOT NULL DEFAULT 0, + `target_tarif` double NOT NULL DEFAULT 0, + `confidence_score` decimal(5,2) NOT NULL DEFAULT 0.00, + `evidence_note` text, + `guideline_note` text, + `aktif` enum('Ya','Tidak') NOT NULL DEFAULT 'Ya', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `kode_cp` (`kode_cp`), + KEY `nama_cp` (`nama_cp`), + KEY `jenis_layanan` (`jenis_layanan`), + KEY `aktif` (`aktif`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_diagnosis` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_id` int(11) NOT NULL, + `kd_penyakit` varchar(10) NOT NULL, + `prioritas` tinyint(4) NOT NULL DEFAULT 1, + `tipe` enum('Utama','Sekunder') NOT NULL DEFAULT 'Utama', + PRIMARY KEY (`id`), + UNIQUE KEY `cp_diagnosis_unique` (`clinical_pathway_id`,`kd_penyakit`,`tipe`), + KEY `kd_penyakit` (`kd_penyakit`), + CONSTRAINT `fk_cp_diagnosis_cp` FOREIGN KEY (`clinical_pathway_id`) REFERENCES `mlite_clinical_pathway` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_cp_diagnosis_penyakit` FOREIGN KEY (`kd_penyakit`) REFERENCES `penyakit` (`kd_penyakit`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_day` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_id` int(11) NOT NULL, + `hari_ke` int(11) NOT NULL, + `label_hari` varchar(100) DEFAULT NULL, + `tujuan_harian` text, + PRIMARY KEY (`id`), + UNIQUE KEY `cp_day_unique` (`clinical_pathway_id`,`hari_ke`), + CONSTRAINT `fk_cp_day_cp` FOREIGN KEY (`clinical_pathway_id`) REFERENCES `mlite_clinical_pathway` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_activity` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_day_id` int(11) NOT NULL, + `kategori` enum('Assessment','Laboratorium','Radiologi','Obat','Tindakan','Nutrisi','Edukasi','Monitoring','Outcome') NOT NULL, + `uraian_kegiatan` varchar(255) DEFAULT NULL, + `sumber_tabel` varchar(50) DEFAULT NULL, + `item_kode` varchar(50) DEFAULT NULL, + `item_nama` varchar(255) NOT NULL, + `keterangan` text, + `evidence_frequency` int(11) NOT NULL DEFAULT 0, + `evidence_percentage` decimal(5,2) NOT NULL DEFAULT 0.00, + `evidence_status` enum('Wajib','Direkomendasikan','Opsional') NOT NULL DEFAULT 'Opsional', + `wajib` enum('Ya','Tidak') NOT NULL DEFAULT 'Ya', + `urutan` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `clinical_pathway_day_id` (`clinical_pathway_day_id`), + KEY `kategori` (`kategori`), + KEY `item_kode` (`item_kode`), + CONSTRAINT `fk_cp_activity_day` FOREIGN KEY (`clinical_pathway_day_id`) REFERENCES `mlite_clinical_pathway_day` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_patient` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) NOT NULL, + `clinical_pathway_id` int(11) NOT NULL, + `kd_penyakit` varchar(10) DEFAULT NULL, + `tanggal_mulai` datetime NOT NULL, + `tanggal_selesai` datetime DEFAULT NULL, + `status` enum('Draft','Aktif','Selesai','Drop') NOT NULL DEFAULT 'Aktif', + `auto_generated` enum('Ya','Tidak') NOT NULL DEFAULT 'Ya', + PRIMARY KEY (`id`), + UNIQUE KEY `no_rawat` (`no_rawat`), + KEY `clinical_pathway_id` (`clinical_pathway_id`), + KEY `kd_penyakit` (`kd_penyakit`), + KEY `status` (`status`), + CONSTRAINT `fk_cp_patient_reg` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_cp_patient_cp` FOREIGN KEY (`clinical_pathway_id`) REFERENCES `mlite_clinical_pathway` (`id`) ON UPDATE CASCADE, + CONSTRAINT `fk_cp_patient_penyakit` FOREIGN KEY (`kd_penyakit`) REFERENCES `penyakit` (`kd_penyakit`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_execution` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_patient_id` int(11) NOT NULL, + `clinical_pathway_activity_id` int(11) NOT NULL, + `hari_ke` int(11) NOT NULL, + `tanggal_rencana` date DEFAULT NULL, + `tanggal_realisasi` datetime DEFAULT NULL, + `status` enum('Planned','Completed','Missed','Variance') NOT NULL DEFAULT 'Planned', + `sumber_data` varchar(50) DEFAULT NULL, + `sumber_referensi` varchar(100) DEFAULT NULL, + `petugas` varchar(20) DEFAULT NULL, + `catatan` text, + PRIMARY KEY (`id`), + UNIQUE KEY `cp_exec_unique` (`clinical_pathway_patient_id`,`clinical_pathway_activity_id`,`hari_ke`), + KEY `clinical_pathway_activity_id` (`clinical_pathway_activity_id`), + KEY `status` (`status`), + KEY `tanggal_rencana` (`tanggal_rencana`), + CONSTRAINT `fk_cp_execution_patient` FOREIGN KEY (`clinical_pathway_patient_id`) REFERENCES `mlite_clinical_pathway_patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_cp_execution_activity` FOREIGN KEY (`clinical_pathway_activity_id`) REFERENCES `mlite_clinical_pathway_activity` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_variance` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_patient_id` int(11) NOT NULL, + `clinical_pathway_execution_id` int(11) DEFAULT NULL, + `kategori_variance` enum('Diagnosis','LOS','Obat','Tindakan','Lab','Radiologi','Nutrisi','Edukasi','Outcome','Administrasi') NOT NULL, + `penyebab` varchar(255) DEFAULT NULL, + `deskripsi` text NOT NULL, + `severity` enum('Rendah','Sedang','Tinggi') NOT NULL DEFAULT 'Sedang', + `tanggal_variance` datetime NOT NULL, + `status_tindak_lanjut` enum('Open','Closed') NOT NULL DEFAULT 'Open', + PRIMARY KEY (`id`), + KEY `clinical_pathway_patient_id` (`clinical_pathway_patient_id`), + KEY `clinical_pathway_execution_id` (`clinical_pathway_execution_id`), + KEY `kategori_variance` (`kategori_variance`), + CONSTRAINT `fk_cp_variance_patient` FOREIGN KEY (`clinical_pathway_patient_id`) REFERENCES `mlite_clinical_pathway_patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `fk_cp_variance_execution` FOREIGN KEY (`clinical_pathway_execution_id`) REFERENCES `mlite_clinical_pathway_execution` (`id`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_compliance` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_patient_id` int(11) NOT NULL, + `planned_activity` int(11) NOT NULL DEFAULT 0, + `completed_activity` int(11) NOT NULL DEFAULT 0, + `missed_activity` int(11) NOT NULL DEFAULT 0, + `compliance_percentage` decimal(5,2) NOT NULL DEFAULT 0.00, + `kategori_kepatuhan` enum('Sangat Patuh','Patuh','Kurang Patuh','Tidak Patuh') NOT NULL DEFAULT 'Tidak Patuh', + `last_calculated_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `clinical_pathway_patient_id` (`clinical_pathway_patient_id`), + CONSTRAINT `fk_cp_compliance_patient` FOREIGN KEY (`clinical_pathway_patient_id`) REFERENCES `mlite_clinical_pathway_patient` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_audit` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `clinical_pathway_patient_id` int(11) DEFAULT NULL, + `clinical_pathway_id` int(11) DEFAULT NULL, + `aksi` varchar(100) NOT NULL, + `referensi` varchar(100) DEFAULT NULL, + `deskripsi` text, + `user_aksi` varchar(50) DEFAULT NULL, + `created_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `clinical_pathway_patient_id` (`clinical_pathway_patient_id`), + KEY `clinical_pathway_id` (`clinical_pathway_id`), + KEY `aksi` (`aksi`), + CONSTRAINT `fk_cp_audit_patient` FOREIGN KEY (`clinical_pathway_patient_id`) REFERENCES `mlite_clinical_pathway_patient` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT `fk_cp_audit_cp` FOREIGN KEY (`clinical_pathway_id`) REFERENCES `mlite_clinical_pathway` (`id`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_clinical_pathway_cppt_template` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `kd_penyakit` varchar(10) NOT NULL, + `ppra` varchar(100) NOT NULL, + `subjective` text NOT NULL, + `objective` text NOT NULL, + `assessment` text NOT NULL, + `plan` text NOT NULL, + `aktif` enum('Ya','Tidak') NOT NULL DEFAULT 'Ya', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `cppt_template_kd_penyakit_ppra` (`kd_penyakit`,`ppra`), + KEY `cppt_template_aktif` (`aktif`), + CONSTRAINT `fk_cppt_template_penyakit` FOREIGN KEY (`kd_penyakit`) REFERENCES `penyakit` (`kd_penyakit`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_mini_pacs_instance` ( + `id` int NOT NULL AUTO_INCREMENT, + `series_id` int NOT NULL, + `sop_instance_uid` varchar(100) NOT NULL, + `file_path` TEXT NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_sop_instance` (`sop_instance_uid`), + KEY `fk_series_id` (`series_id`), + CONSTRAINT `fk_mlite_mini_pacs_instance_series` FOREIGN KEY (`series_id`) REFERENCES `mlite_mini_pacs_series` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_mini_pacs_instance_metadata` ( `id` int(11) NOT NULL AUTO_INCREMENT, + `instance_id` int(11) NOT NULL, + `tag` varchar(20) NOT NULL, + `name` varchar(255) DEFAULT NULL, + `value` text, + PRIMARY KEY (`id`), + KEY `idx_instance_id` (`instance_id`), + KEY `idx_tag` (`tag`), + CONSTRAINT `fk_pacs_instance_metadata` FOREIGN KEY (`instance_id`) REFERENCES `mlite_mini_pacs_instance` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_mini_pacs_series` ( + `id` int NOT NULL AUTO_INCREMENT, + `study_id` int NOT NULL, + `series_instance_uid` varchar(100) NOT NULL, + `series_description` text, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_series_instance` (`series_instance_uid`), + KEY `fk_study_id` (`study_id`), + CONSTRAINT `fk_mlite_mini_pacs_series_study` FOREIGN KEY (`study_id`) REFERENCES `mlite_mini_pacs_study` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_mini_pacs_study` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) NOT NULL, + `study_instance_uid` varchar(100) NOT NULL, + `study_date` datetime DEFAULT NULL, + `modality` varchar(10) DEFAULT NULL, + `description` text, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_study_instance` (`study_instance_uid`), + KEY `fk_no_rawat` (`no_rawat`), + CONSTRAINT `fk_mlite_mini_pacs_study_no_rawat` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_mini_pacs_worklist_status` ( + `noorder` varchar(20) NOT NULL, + `pulled_at` datetime DEFAULT NULL, + `notified` tinyint(1) DEFAULT 0, + PRIMARY KEY (`noorder`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_modules` ( + `id` int NOT NULL AUTO_INCREMENT, `dir` text, `sequence` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -LOCK TABLES `mlite_modules` WRITE; -/*!40000 ALTER TABLE `mlite_modules` DISABLE KEYS */; - -INSERT INTO `mlite_modules` (`id`, `dir`, `sequence`) -VALUES - (1,'settings','9'), - (2,'dashboard','0'), - (3,'master','1'), - (4,'pasien','2'), - (5,'rawat_jalan','3'), - (6,'kasir_rawat_jalan','4'), - (7,'kepegawaian','5'), - (8,'farmasi','6'), - (9,'users','8'), - (10,'modules','7'), - (11,'wagateway','10'), - (12,'apotek_ralan','11'), - (13,'dokter_ralan','12'), - (14,'igd','13'), - (15,'dokter_igd','14'), - (16,'laboratorium','15'), - (17,'radiologi','16'), - (18,'icd_10','17'), - (19,'rawat_inap','18'), - (20,'apotek_ranap','19'), - (21,'dokter_ranap','20'), - (22,'kasir_rawat_inap','21'), - (23,'operasi','22'), - (24,'anjungan','23'), - (25,'api','24'), - (26,'jkn_mobile','25'), - (27,'vclaim','26'), - (28,'keuangan','27'), - (29,'manajemen','28'), - (30,'presensi','29'), - (31,'vedika','30'), - (32,'profil','31'), - (33,'orthanc','32'), - (34,'veronisa','33'), - (35,'icd_9','34'); - -/*!40000 ALTER TABLE `mlite_modules` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_notifications -# ------------------------------------------------------------ +) ENGINE=MyISAM AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4; + + +INSERT INTO `mlite_modules` VALUES ("1","settings","9"), +("2","dashboard","0"), +("3","master","1"), +("4","pasien","2"), +("5","rawat_jalan","3"), +("6","kasir_rawat_jalan","4"), +("7","kepegawaian","5"), +("8","farmasi","6"), +("9","users","8"), +("10","modules","7"), +("11","wagateway","10"), +("12","apotek_ralan","11"), +("36","afm","31"), +("14","igd","13"), +("15","dokter_igd","14"), +("16","laboratorium","15"), +("17","radiologi","16"), +("18","rawat_inap","17"), +("19","apotek_ranap","18"), +("20","dokter_ranap","19"), +("21","kasir_rawat_inap","20"), +("22","operasi","21"), +("23","anjungan","22"), +("24","api","23"), +("25","jkn_mobile","24"), +("26","vclaim","25"), +("27","keuangan","26"), +("28","manajemen","27"), +("29","presensi","28"), +("30","vedika","29"), +("31","profil","30"), +("32","orthanc","31"), +("37","bpjs_emr","32"), +("38","bridging_hfis","33"), +("39","dokter_ralan","34"), +("54","esignature","48"), +("41","icare","36"), +("42","inventaris","37"), +("43","jasa_medis","38"), +("44","laporan","39"), +("45","veronisa","40"), +("46","mlite_api_key","41"), +("47","mlite_logs","42"), +("48","penjualan","43"), +("49","satu_sehat","44"), +("50","sertisign","45"), +("51","surat","46"), +("52","utd","47"); + + +CREATE TABLE `mlite_news` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(225) NOT NULL, + `slug` varchar(225) NOT NULL, + `user_id` int NOT NULL, + `content` text NOT NULL, + `intro` text, + `cover_photo` text, + `status` int NOT NULL, + `comments` int DEFAULT '1', + `markdown` int DEFAULT '0', + `published_at` int DEFAULT '0', + `updated_at` int NOT NULL, + `created_at` int NOT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_news_tags` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(225) DEFAULT NULL, + `slug` varchar(225) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_news_tags_relationship` ( + `news_id` int NOT NULL, + `tag_id` int NOT NULL, + KEY `mlite_news_tags_relationship_ibfk_1` (`news_id`) USING BTREE, + KEY `tag_id` (`tag_id`) USING BTREE, + CONSTRAINT `mlite_news_tags_relationship_ibfk_1` FOREIGN KEY (`news_id`) REFERENCES `mlite_news` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `mlite_news_tags_relationship_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `mlite_news_tags` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + CREATE TABLE `mlite_notifications` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `judul` varchar(250) NOT NULL, `pesan` text NOT NULL, - `tanggal` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `tanggal` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `no_rkm_medis` varchar(255) NOT NULL, `status` varchar(250) NOT NULL DEFAULT 'unread', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_odontogram -# ------------------------------------------------------------ CREATE TABLE `mlite_odontogram` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `no_rkm_medis` text NOT NULL, `pemeriksaan` text, `kondisi` text, @@ -2216,15 +2598,11 @@ CREATE TABLE `mlite_odontogram` ( `id_user` text NOT NULL, `tgl_input` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_ohis -# ------------------------------------------------------------ CREATE TABLE `mlite_ohis` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `no_rkm_medis` text NOT NULL, `d_16` text, `d_11` text, @@ -2245,12 +2623,8 @@ CREATE TABLE `mlite_ohis` ( `id_user` text NOT NULL, `tgl_input` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_pendaftaran_oral_diagnostic -# ------------------------------------------------------------ CREATE TABLE `mlite_pendaftaran_oral_diagnostic` ( `no_reg` varchar(8) DEFAULT NULL, @@ -2268,7 +2642,7 @@ CREATE TABLE `mlite_pendaftaran_oral_diagnostic` ( `stts_daftar` enum('-','Lama','Baru') NOT NULL, `status_lanjut` enum('Ralan','Ranap') NOT NULL, `kd_pj` char(3) NOT NULL, - `umurdaftar` int(11) DEFAULT NULL, + `umurdaftar` int DEFAULT NULL, `sttsumur` enum('Th','Bl','Hr') DEFAULT NULL, `status_bayar` enum('Sudah Bayar','Belum Bayar') NOT NULL, `status_poli` enum('Lama','Baru') NOT NULL, @@ -2283,12 +2657,8 @@ CREATE TABLE `mlite_pendaftaran_oral_diagnostic` ( CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_6` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE, CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_7` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_pengaduan -# ------------------------------------------------------------ CREATE TABLE `mlite_pengaduan` ( `id` varchar(15) NOT NULL, @@ -2298,15 +2668,11 @@ CREATE TABLE `mlite_pengaduan` ( PRIMARY KEY (`id`), KEY `no_rkm_medis` (`no_rkm_medis`), CONSTRAINT `mlite_pengaduan_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_pengaduan_detail -# ------------------------------------------------------------ CREATE TABLE `mlite_pengaduan_detail` ( - `id` int(10) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `pengaduan_id` varchar(15) NOT NULL, `tanggal` datetime NOT NULL, `no_rkm_medis` varchar(15) NOT NULL, @@ -2314,637 +2680,195 @@ CREATE TABLE `mlite_pengaduan_detail` ( PRIMARY KEY (`id`) USING BTREE, KEY `pengaduan_detail_ibfk_1` (`pengaduan_id`), CONSTRAINT `mlite_pengaduan_detail_ibfk_1` FOREIGN KEY (`pengaduan_id`) REFERENCES `mlite_pengaduan` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_penjualan` ( + `id` int NOT NULL AUTO_INCREMENT, + `nama_pembeli` varchar(100) DEFAULT NULL, + `alamat_pembeli` varchar(100) DEFAULT NULL, + `nomor_telepon` varchar(50) DEFAULT NULL, + `email` varchar(50) DEFAULT NULL, + `tanggal` date NOT NULL, + `jam` time NOT NULL, + `id_user` varchar(50) NOT NULL, + `keterangan` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -# Dump of table mlite_penilaian_awal_keperawatan_gigi -# ------------------------------------------------------------ -CREATE TABLE `mlite_penilaian_awal_keperawatan_gigi` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `bmi` varchar(10) NOT NULL, - `keluhan_utama` varchar(150) NOT NULL DEFAULT '', - `riwayat_penyakit` enum('Tidak Ada','Diabetes Melitus','Hipertensi','Penyakit Jantung','HIV','Hepatitis','Haemophilia','Lain-lain') DEFAULT NULL, - `ket_riwayat_penyakit` varchar(30) NOT NULL, - `alergi` varchar(25) NOT NULL DEFAULT '', - `riwayat_perawatan_gigi` enum('Tidak','Ya, Kapan') NOT NULL, - `ket_riwayat_perawatan_gigi` varchar(50) NOT NULL DEFAULT '', - `kebiasaan_sikat_gigi` enum('1x','2x','3x','Mandi','Setelah Makan','Sebelum Tidur') NOT NULL, - `kebiasaan_lain` enum('Tidak ada','Minum kopi/teh','Minum alkohol','Bruxism','Menggigit pensil','Mengunyah 1 sisi rahang','Merokok','Lain-lain') DEFAULT NULL, - `ket_kebiasaan_lain` varchar(30) NOT NULL, - `obat_yang_diminum_saatini` varchar(100) DEFAULT NULL, - `alat_bantu` enum('Tidak','Ya') NOT NULL, - `ket_alat_bantu` varchar(30) NOT NULL, - `prothesa` enum('Tidak','Ya') NOT NULL, - `ket_pro` varchar(50) NOT NULL, - `status_psiko` enum('Tenang','Takut','Cemas','Depresi','Lain-lain') NOT NULL, - `ket_psiko` varchar(70) NOT NULL, - `hub_keluarga` enum('Baik','Tidak Baik') NOT NULL, - `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, - `ket_tinggal` varchar(40) NOT NULL, - `ekonomi` enum('Baik','Cukup','Kurang') NOT NULL, - `budaya` enum('Tidak Ada','Ada') NOT NULL, - `ket_budaya` varchar(50) NOT NULL, - `edukasi` enum('Pasien','Keluarga') NOT NULL, - `ket_edukasi` varchar(50) NOT NULL, - `berjalan_a` enum('Ya','Tidak') NOT NULL, - `berjalan_b` enum('Ya','Tidak') NOT NULL, - `berjalan_c` enum('Ya','Tidak') NOT NULL, - `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, - `lapor` enum('Ya','Tidak') NOT NULL, - `ket_lapor` varchar(15) NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `lokasi` varchar(50) NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `frekuensi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat','Tidak ada nyeri','Lain-lain') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `pada_dokter` enum('Tidak','Ya') NOT NULL, - `ket_dokter` varchar(15) NOT NULL, - `kebersihan_mulut` enum('Baik','Cukup','Kurang') NOT NULL, - `mukosa_mulut` enum('Normal','Pigmentasi','Radang') NOT NULL, - `karies` enum('Ada','Tidak') NOT NULL, - `karang_gigi` enum('Ada','Tidak') NOT NULL, - `gingiva` enum('Normal','Radang') NOT NULL, - `palatum` enum('Normal','Radang') NOT NULL, - `rencana` varchar(200) NOT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_gigi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_gigi_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_penjualan_barang` ( + `id` int NOT NULL AUTO_INCREMENT, + `nama_barang` varchar(100) DEFAULT NULL, + `stok` varchar(100) DEFAULT NULL, + `harga` varchar(100) DEFAULT NULL, + `keterangan` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_penjualan_billing` ( + `id` int NOT NULL AUTO_INCREMENT, + `id_penjualan` int NOT NULL, + `jumlah_total` int NOT NULL, + `potongan` int DEFAULT NULL, + `jumlah_harus_bayar` int NOT NULL, + `jumlah_bayar` int NOT NULL, + `tanggal` date NOT NULL, + `jam` time NOT NULL, + `id_user` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -# Dump of table mlite_penilaian_awal_keperawatan_ralan -# ------------------------------------------------------------ -CREATE TABLE `mlite_penilaian_awal_keperawatan_ralan` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `gcs` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `bmi` varchar(10) NOT NULL, - `keluhan_utama` varchar(150) NOT NULL DEFAULT '', - `rpd` varchar(100) NOT NULL DEFAULT '', - `rpk` varchar(100) NOT NULL, - `rpo` varchar(100) NOT NULL, - `alergi` varchar(25) NOT NULL DEFAULT '', - `alat_bantu` enum('Tidak','Ya') NOT NULL, - `ket_bantu` varchar(50) NOT NULL DEFAULT '', - `prothesa` enum('Tidak','Ya') NOT NULL, - `ket_pro` varchar(50) NOT NULL, - `adl` enum('Mandiri','Dibantu') NOT NULL, - `status_psiko` enum('Tenang','Takut','Cemas','Depresi','Lain-lain') NOT NULL, - `ket_psiko` varchar(70) NOT NULL, - `hub_keluarga` enum('Baik','Tidak Baik') NOT NULL, - `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, - `ket_tinggal` varchar(40) NOT NULL, - `ekonomi` enum('Baik','Cukup','Kurang') NOT NULL, - `budaya` enum('Tidak Ada','Ada') NOT NULL, - `ket_budaya` varchar(50) NOT NULL, - `edukasi` enum('Pasien','Keluarga') NOT NULL, - `ket_edukasi` varchar(50) NOT NULL, - `berjalan_a` enum('Ya','Tidak') NOT NULL, - `berjalan_b` enum('Ya','Tidak') NOT NULL, - `berjalan_c` enum('Ya','Tidak') NOT NULL, - `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, - `lapor` enum('Ya','Tidak') NOT NULL, - `ket_lapor` varchar(15) NOT NULL, - `sg1` enum('Tidak','Tidak Yakin','Ya, 1-5 Kg','Ya, 6-10 Kg','Ya, 11-15 Kg','Ya, >15 Kg') NOT NULL, - `nilai1` enum('0','1','2','3','4') NOT NULL, - `sg2` enum('Ya','Tidak') NOT NULL, - `nilai2` enum('0','1') NOT NULL, - `total_hasil` tinyint(4) NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `provokes` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, - `ket_provokes` varchar(40) NOT NULL, - `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, - `ket_quality` varchar(50) NOT NULL, - `lokasi` varchar(50) NOT NULL, - `menyebar` enum('Tidak','Ya') NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `pada_dokter` enum('Tidak','Ya') NOT NULL, - `ket_dokter` varchar(15) NOT NULL, - `rencana` varchar(200) NOT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ralan_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_penjualan_detail` ( + `id` int NOT NULL AUTO_INCREMENT, + `id_penjualan` int NOT NULL, + `id_barang` varchar(100) NOT NULL, + `nama_barang` varchar(100) NOT NULL, + `harga` int NOT NULL, + `jumlah` int NOT NULL, + `harga_total` int NOT NULL, + `tanggal` date NOT NULL, + `jam` time NOT NULL, + `id_user` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; +CREATE TABLE `mlite_query_logs` ( + `id` int NOT NULL AUTO_INCREMENT, + `sql_text` text NOT NULL, + `bindings` text, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `error_message` text, + `username` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_penilaian_awal_keperawatan_ranap -# ------------------------------------------------------------ -CREATE TABLE `mlite_penilaian_awal_keperawatan_ranap` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `ket_informasi` varchar(30) NOT NULL, - `tiba_diruang_rawat` enum('Jalan Tanpa Bantuan','Kursi Roda','Brankar') NOT NULL, - `kasus_trauma` enum('Trauma','Non Trauma') DEFAULT NULL, - `cara_masuk` enum('Poli','IGD','Lain-lain') NOT NULL, - `rps` varchar(300) NOT NULL, - `rpd` varchar(100) NOT NULL, - `rpk` varchar(100) NOT NULL, - `rpo` varchar(100) NOT NULL, - `riwayat_pembedahan` varchar(40) NOT NULL, - `riwayat_dirawat_dirs` varchar(40) NOT NULL, - `alat_bantu_dipakai` enum('Kacamata','Prothesa','Alat Bantu Dengar','Lain-lain') NOT NULL, - `riwayat_kehamilan` enum('Tidak','Ya') NOT NULL, - `riwayat_kehamilan_perkiraan` varchar(30) NOT NULL, - `riwayat_tranfusi` varchar(40) NOT NULL, - `riwayat_alergi` varchar(40) NOT NULL, - `riwayat_merokok` enum('Tidak','Ya') NOT NULL, - `riwayat_merokok_jumlah` varchar(5) NOT NULL, - `riwayat_alkohol` enum('Tidak','Ya') NOT NULL, - `riwayat_alkohol_jumlah` varchar(5) NOT NULL, - `riwayat_narkoba` enum('Tidak','Ya') NOT NULL, - `riwayat_olahraga` enum('Tidak','Ya') NOT NULL, - `pemeriksaan_mental` varchar(40) NOT NULL, - `pemeriksaan_keadaan_umum` enum('Baik','Sedang','Buruk') NOT NULL, - `pemeriksaan_gcs` varchar(10) NOT NULL, - `pemeriksaan_td` varchar(8) NOT NULL, - `pemeriksaan_nadi` varchar(5) NOT NULL, - `pemeriksaan_rr` varchar(5) NOT NULL, - `pemeriksaan_suhu` varchar(5) NOT NULL, - `pemeriksaan_spo2` varchar(5) NOT NULL, - `pemeriksaan_bb` varchar(5) NOT NULL, - `pemeriksaan_tb` varchar(5) NOT NULL, - `pemeriksaan_susunan_kepala` enum('TAK','Hydrocephalus','Hematoma','Lain-lain') NOT NULL, - `pemeriksaan_susunan_wajah` enum('TAK','Asimetris','Kelainan Kongenital') NOT NULL, - `pemeriksaan_susunan_leher` enum('TAK','Kaku Kuduk','Pembesaran Thyroid','Pembesaran KGB') NOT NULL, - `pemeriksaan_susunan_kejang` enum('TAK','Kuat','Ada') NOT NULL, - `pemeriksaan_susunan_sensorik` enum('TAK','Sakit Nyeri','Rasa kebas') NOT NULL, - `pemeriksaan_kardiovaskuler_denyut_nadi` enum('Teratur','Tidak Teratur') NOT NULL, - `pemeriksaan_kardiovaskuler_sirkulasi` enum('Akral Hangat','Akral Dingin','Edema') NOT NULL, - `pemeriksaan_kardiovaskuler_pulsasi` enum('Kuat','Lemah','Lain-lain') NOT NULL, - `pemeriksaan_respirasi_pola_nafas` enum('Normal','Bradipnea','Tachipnea') NOT NULL, - `pemeriksaan_respirasi_retraksi` enum('Tidak Ada','Ringan','Berat') NOT NULL, - `pemeriksaan_respirasi_suara_nafas` enum('Vesikuler','Wheezing','Rhonki') NOT NULL, - `pemeriksaan_respirasi_volume_pernafasan` enum('Normal','Hiperventilasi','Hipoventilasi') NOT NULL, - `pemeriksaan_respirasi_jenis_pernafasan` enum('Pernafasan Dada','Alat Bantu Pernafasaan') NOT NULL, - `pemeriksaan_respirasi_irama_nafas` enum('Teratur','Tidak Teratur') NOT NULL, - `pemeriksaan_respirasi_batuk` enum('Tidak','Ya : Produktif','Ya : Non Produktif') NOT NULL, - `pemeriksaan_gastrointestinal_mulut` enum('TAK','Stomatitis','Mukosa Kering','Bibir Pucat','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_gigi` enum('TAK','Karies','Goyang','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_lidah` enum('TAK','Kotor','Gerak Asimetris','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_tenggorokan` enum('TAK','Gangguan Menelan','Sakit Menelan','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_abdomen` enum('Supel','Asictes',' Tegang','Nyeri Tekan/Lepas','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_peistatik_usus` enum('TAK','Tidak Ada Bising Usus','Hiperistaltik') NOT NULL, - `pemeriksaan_gastrointestinal_anus` enum('TAK','Atresia Ani') NOT NULL, - `pemeriksaan_neurologi_pengelihatan` enum('TAK','Ada Kelainan') NOT NULL, - `pemeriksaan_neurologi_alat_bantu_penglihatan` enum('Tidak','Kacamata','Lensa Kontak') NOT NULL, - `pemeriksaan_neurologi_pendengaran` enum('TAK','Berdengung','Nyeri','Tuli','Keluar Cairan','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_bicara` enum('Jelas','Tidak Jelas') NOT NULL, - `pemeriksaan_neurologi_sensorik` enum('TAK','Sakit Nyeri','Rasa Kebas','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_motorik` enum('TAK','Hemiparese','Tetraparese','Tremor','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_kekuatan_otot` enum('Kuat','Lemah') NOT NULL, - `pemeriksaan_integument_warnakulit` enum('Pucat','Sianosis','Normal','Lain-lain') NOT NULL, - `pemeriksaan_integument_turgor` enum('Baik','Sedang','Buruk') NOT NULL, - `pemeriksaan_integument_kulit` enum('Normal','Rash/Kemerahan','Luka','Memar','Ptekie','Bula') NOT NULL, - `pemeriksaan_integument_dekubitas` enum('Tidak Ada','Usia > 65 tahun','Obesitas','Imobilisasi','Paraplegi/Vegetative State','Dirawat Di HCU','Penyakit Kronis (DM, CHF, CKD)','Inkontinentia Uri/Alvi') NOT NULL, - `pemeriksaan_muskuloskletal_pergerakan_sendi` enum('Bebas','Terbatas') NOT NULL, - `pemeriksaan_muskuloskletal_kekauatan_otot` enum('Baik','Lemah','Tremor') NOT NULL, - `pemeriksaan_muskuloskletal_nyeri_sendi` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_muskuloskletal_oedema` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_muskuloskletal_fraktur` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_eliminasi_bab_frekuensi_jumlah` varchar(5) NOT NULL, - `pemeriksaan_eliminasi_bab_frekuensi_durasi` varchar(10) NOT NULL, - `pemeriksaan_eliminasi_bab_konsistensi` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bab_warna` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bak_frekuensi_jumlah` varchar(5) NOT NULL, - `pemeriksaan_eliminasi_bak_frekuensi_durasi` varchar(10) NOT NULL, - `pemeriksaan_eliminasi_bak_warna` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bak_lainlain` varchar(30) NOT NULL, - `pola_aktifitas_makanminum` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_mandi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_eliminasi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_berpakaian` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_berpindah` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_nutrisi_frekuesi_makan` varchar(3) NOT NULL, - `pola_nutrisi_jenis_makanan` varchar(20) NOT NULL, - `pola_nutrisi_porsi_makan` varchar(3) NOT NULL, - `pola_tidur_lama_tidur` varchar(3) NOT NULL, - `pola_tidur_gangguan` enum('Tidak Ada Gangguan','Insomnia') NOT NULL, - `pengkajian_fungsi_kemampuan_sehari` enum('Mandiri','Bantuan Minimal','Bantuan Sebagian','Ketergantungan Total') NOT NULL, - `pengkajian_fungsi_aktifitas` enum('Tirah Baring','Duduk','Berjalan') NOT NULL, - `pengkajian_fungsi_berjalan` enum('TAK','Penurunan Kekuatan/ROM','Paralisis','Sering Jatuh','Deformitas','Hilang Keseimbangan','Riwayat Patah Tulang','Lain-lain') NOT NULL, - `pengkajian_fungsi_ambulasi` enum('Walker','Tongkat','Kursi Roda','Tidak Menggunakan') NOT NULL, - `pengkajian_fungsi_ekstrimitas_atas` enum('TAK','Lemah','Oedema','Tidak Simetris','Lain-lain') NOT NULL, - `pengkajian_fungsi_ekstrimitas_bawah` enum('TAK','Varises','Oedema','Tidak Simetris','Lain-lain') NOT NULL, - `pengkajian_fungsi_menggenggam` enum('Tidak Ada Kesulitan','Terakhir','Lain-lain') NOT NULL, - `pengkajian_fungsi_koordinasi` enum('Tidak Ada Kesulitan','Ada Masalah') NOT NULL, - `pengkajian_fungsi_kesimpulan` enum('Ya (Co DPJP)','Tidak (Tidak Perlu Co DPJP)') NOT NULL, - `riwayat_psiko_kondisi_psiko` enum('Tidak Ada Masalah','Marah','Takut','Depresi','Cepat Lelah','Cemas','Gelisah','Sulit Tidur','Lain-lain') NOT NULL, - `riwayat_psiko_gangguan_jiwa` enum('Ya','Tidak') NOT NULL, - `riwayat_psiko_perilaku` enum('Tidak Ada Masalah','Perilaku Kekerasan','Gangguan Efek','Gangguan Memori','Halusinasi','Kecenderungan Percobaan Bunuh Diri','Lain-lain') NOT NULL, - `riwayat_psiko_hubungan_keluarga` enum('Harmonis','Kurang Harmonis','Tidak Harmonis','Konflik Besar') NOT NULL, - `riwayat_psiko_tinggal` enum('Sendiri','Orang Tua','Suami/Istri','Keluarga','Lain-lain') NOT NULL, - `riwayat_psiko_nilai_kepercayaan` enum('Tidak Ada','Ada') NOT NULL, - `riwayat_psiko_pendidikan_pj` enum('-','TS','TK','SD','SMP','SMA','SLTA/SEDERAJAT','D1','D2','D3','D4','S1','S2','S3') NOT NULL, - `riwayat_psiko_edukasi_diberikan` enum('Pasien','Keluarga') NOT NULL, - `penilaian_nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `penilaian_nyeri_penyebab` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, - `penilaian_nyeri_kualitas` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, - `penilaian_nyeri_lokasi` varchar(50) NOT NULL, - `penilaian_nyeri_menyebar` enum('Tidak','Ya') NOT NULL, - `penilaian_nyeri_skala` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `penilaian_nyeri_waktu` varchar(5) NOT NULL, - `penilaian_nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, - `penilaian_nyeri_diberitahukan_dokter` enum('Tidak','Ya') NOT NULL, - `penilaian_nyeri_jam_diberitahukan_dokter` varchar(10) NOT NULL, - `penilaian_jatuhmorse_skala1` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai1` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala2` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai2` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala3` enum('Tidak Ada/Kursi Roda/Perawat/Tirah Baring','Tongkat/Alat Penopang','Berpegangan Pada Perabot') DEFAULT NULL, - `penilaian_jatuhmorse_nilai3` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala4` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai4` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala5` enum('Normal/Tirah Baring/Imobilisasi','Lemah','Terganggu') DEFAULT NULL, - `penilaian_jatuhmorse_nilai5` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala6` enum('Sadar Akan Kemampuan Diri Sendiri','Sering Lupa Akan Keterbatasan Yang Dimiliki') DEFAULT NULL, - `penilaian_jatuhmorse_nilai6` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_totalnilai` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala1` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai1` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala2` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai2` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala3` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai3` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala4` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai4` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala5` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai5` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala6` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai6` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala7` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai7` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala8` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai8` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala9` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai9` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala10` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai10` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala11` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai11` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_totalnilai` tinyint(4) DEFAULT NULL, - `skrining_gizi1` enum('Tidak ada penurunan berat badan','Tidak yakin/ tidak tahu/ terasa baju lebih longgar','Ya 1-5 kg','Ya 6-10 kg','Ya 11-15 kg','Ya > 15 kg') DEFAULT NULL, - `nilai_gizi1` int(11) DEFAULT NULL, - `skrining_gizi2` enum('Tidak','Ya') DEFAULT NULL, - `nilai_gizi2` int(11) DEFAULT NULL, - `nilai_total_gizi` double DEFAULT NULL, - `skrining_gizi_diagnosa_khusus` enum('Tidak','Ya') DEFAULT NULL, - `skrining_gizi_diketahui_dietisen` enum('Tidak','Ya') DEFAULT NULL, - `skrining_gizi_jam_diketahui_dietisen` varchar(10) DEFAULT NULL, - `rencana` varchar(200) DEFAULT NULL, - `nip1` varchar(20) NOT NULL, - `nip2` varchar(20) NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip1` (`nip1`) USING BTREE, - KEY `nip2` (`nip2`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_2` FOREIGN KEY (`nip1`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_3` FOREIGN KEY (`nip2`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_rekening` ( + `kd_rek` varchar(15) NOT NULL DEFAULT '', + `nm_rek` varchar(100) DEFAULT NULL, + `tipe` enum('N','M','R') DEFAULT NULL, + `balance` enum('D','K') DEFAULT NULL, + `level` enum('0','1') DEFAULT NULL, + PRIMARY KEY (`kd_rek`), + KEY `nm_rek` (`nm_rek`), + KEY `tipe` (`tipe`), + KEY `balance` (`balance`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +INSERT INTO `mlite_rekening` VALUES +-- Aktiva Lancar (tipe N, balance D) +('1101','Kas Umum','N','D','1'), +('1102','Kas Kasir Rawat Jalan','N','D','1'), +('1103','Kas Kasir Rawat Inap','N','D','1'), +('1104','Kas Farmasi','N','D','1'), +('1105','Kas Kecil','N','D','1'), +('1201','Bank BRI','N','D','1'), +('1301','Piutang BPJS','N','D','1'), +('1302','Piutang Pasien Umum','N','D','1'), +('1401','Persediaan Obat & BHP','N','D','1'), +-- Aktiva Tetap (tipe N, balance D) +('1601','Gedung & Bangunan','N','D','1'), +('1701','Peralatan Medis','N','D','1'), +('1801','Kendaraan','N','D','1'), +('1901','Inventaris Kantor','N','D','1'), +-- Hutang Lancar (tipe N, balance K) +('2101','Hutang Usaha','N','K','1'), +('2102','Hutang Gaji','N','K','1'), +-- Hutang Jangka Panjang (tipe N, balance K) +('2201','Hutang Bank','N','K','1'), +-- Modal (tipe M, balance K) +('3101','Modal Disetor','M','K','1'), +('3201','Laba Ditahan','M','K','1'), +-- Pendapatan (tipe R, balance K) +('4101','Pendapatan Rawat Jalan','R','K','1'), +('4102','Pendapatan Rawat Inap','R','K','1'), +('4103','Pendapatan Obat & BHP','R','K','1'), +('4104','Pendapatan Laboratorium','R','K','1'), +('4105','Pendapatan Radiologi','R','K','1'), +('4201','Pendapatan Lain-lain','R','K','1'), +-- Beban (tipe R, balance D) +('5101','Beban Gaji Dokter','R','D','1'), +('5102','Beban Gaji Paramedis','R','D','1'), +('5103','Beban Gaji Karyawan','R','D','1'), +('5201','Beban Obat & BHP','R','D','1'), +('5301','Beban Listrik','R','D','1'), +('5302','Beban Air & Kebersihan','R','D','1'), +('5401','Beban Penyusutan','R','D','1'), +('5501','Beban Administrasi Umum','R','D','1'); -# Dump of table mlite_penilaian_medis_igd -# ------------------------------------------------------------ +CREATE TABLE `mlite_rekeningtahun` ( + `thn` year NOT NULL, + `kd_rek` varchar(15) NOT NULL DEFAULT '', + `saldo_awal` double NOT NULL, + PRIMARY KEY (`thn`,`kd_rek`), + KEY `kd_rek` (`kd_rek`), + KEY `saldo_awal` (`saldo_awal`), + CONSTRAINT `mlite_rekeningtahun_ibfk_1` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -CREATE TABLE `mlite_penilaian_medis_igd` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(100) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(100) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `leher` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `ekg` text NOT NULL, - `rad` text NOT NULL, - `lab` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_igd_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_igd_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_medis_ralan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_medis_ralan` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(30) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(50) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `penunjang` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - `konsulrujuk` varchar(1000) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_ralan_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_medis_ranap -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_medis_ranap` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(100) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(100) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `jantung` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `paru` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `lab` text NOT NULL, - `rad` text NOT NULL, - `penunjang` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - `edukasi` varchar(1000) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_ranap_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_ulang_nyeri -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_ulang_nyeri` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `provokes` enum('Proses Penyakit','Benturan','Lain-lain','-') NOT NULL, - `ket_provokes` varchar(40) NOT NULL, - `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain','-') NOT NULL, - `ket_quality` varchar(50) NOT NULL, - `lokasi` varchar(50) NOT NULL, - `menyebar` enum('Tidak','Ya') NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat','-') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `manajemen_nyeri` varchar(1000) DEFAULT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`,`tanggal`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_ulang_nyeri_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_ulang_nyeri_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penjualan -# ------------------------------------------------------------ +-- Saldo awal akun per tahun (N = Neraca, M = Modal) +-- Verifikasi: Total Aktiva 2025 = 1.420.000.000, Total Pasiva 2025 = 1.420.000.000 +INSERT INTO `mlite_rekeningtahun` VALUES +(2025,'1101',50000000), +(2025,'1201',200000000), +(2025,'1301',75000000), +(2025,'1302',15000000), +(2025,'1401',80000000), +(2025,'1601',500000000), +(2025,'1701',300000000), +(2025,'1801',150000000), +(2025,'1901',50000000), +(2025,'2101',25000000), +(2025,'2102',20000000), +(2025,'2201',200000000), +(2025,'3101',800000000), +(2025,'3201',375000000), +-- Verifikasi: Total Aktiva 2026 = 1.585.000.000, Total Pasiva 2026 = 1.585.000.000 +(2026,'1101',230000000), +(2026,'1201',200000000), +(2026,'1301',75000000), +(2026,'1302',15000000), +(2026,'1401',80000000), +(2026,'1601',495000000), +(2026,'1701',293000000), +(2026,'1801',147000000), +(2026,'1901',50000000), +(2026,'2101',25000000), +(2026,'2102',20000000), +(2026,'2201',200000000), +(2026,'3101',800000000), +(2026,'3201',540000000); -CREATE TABLE `mlite_penjualan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nama_pembeli` varchar(100) DEFAULT NULL, - `alamat_pembeli` varchar(100) DEFAULT NULL, - `nomor_telepon` varchar(50) DEFAULT NULL, - `email` varchar(50) DEFAULT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - `keterangan` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_penjualan_barang -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_barang` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nama_barang` varchar(100) DEFAULT NULL, - `stok` varchar(100) DEFAULT NULL, - `harga` varchar(100) DEFAULT NULL, - `keterangan` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_penjualan_billing -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_billing` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `id_penjualan` int(11) NOT NULL, - `jumlah_total` int(100) NOT NULL, - `potongan` int(100) DEFAULT NULL, - `jumlah_harus_bayar` int(100) NOT NULL, - `jumlah_bayar` int(100) NOT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_penjualan_detail -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_detail` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `id_penjualan` int(11) NOT NULL, - `id_barang` int(11) NOT NULL, - `nama_barang` varchar(100) NOT NULL, - `harga` int(11) NOT NULL, - `jumlah` int(100) NOT NULL, - `harga_total` int(11) NOT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_peta_mukosa_rongga_mulut -# ------------------------------------------------------------ - -CREATE TABLE `mlite_peta_mukosa_rongga_mulut` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kelainan` text, - `gambar` text, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_peta_mukosa_rongga_mulut_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_peta_mukosa_rongga_mulut_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_rekening -# ------------------------------------------------------------ - -CREATE TABLE `mlite_rekening` ( - `kd_rek` varchar(15) NOT NULL DEFAULT '', - `nm_rek` varchar(100) DEFAULT NULL, - `tipe` enum('N','M','R') DEFAULT NULL, - `balance` enum('D','K') DEFAULT NULL, - `level` enum('0','1') DEFAULT NULL, - PRIMARY KEY (`kd_rek`), - KEY `nm_rek` (`nm_rek`), - KEY `tipe` (`tipe`), - KEY `balance` (`balance`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_rekeningtahun -# ------------------------------------------------------------ - -CREATE TABLE `mlite_rekeningtahun` ( - `thn` year(4) NOT NULL, - `kd_rek` varchar(15) NOT NULL DEFAULT '', - `saldo_awal` double NOT NULL, - PRIMARY KEY (`thn`,`kd_rek`), - KEY `kd_rek` (`kd_rek`), - KEY `saldo_awal` (`saldo_awal`), - CONSTRAINT `mlite_rekeningtahun_ibfk_1` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_remember_me -# ------------------------------------------------------------ CREATE TABLE `mlite_remember_me` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `token` text, - `user_id` int(10) NOT NULL, - `expiry` int(100) NOT NULL, + `user_id` int NOT NULL, + `expiry` int NOT NULL, PRIMARY KEY (`id`), KEY `mlite_remember_me_ibfk_1` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; +CREATE TABLE `mlite_rujukan_internal_poli` ( + `no_rawat` varchar(17) NOT NULL, + `kd_dokter` varchar(20) NOT NULL, + `kd_poli` varchar(5) DEFAULT NULL, + `isi_rujukan` text, + `jawab_rujukan` text, + PRIMARY KEY (`no_rawat`,`kd_dokter`) USING BTREE, + KEY `kd_dokter` (`kd_dokter`) USING BTREE, + KEY `kd_poli` (`kd_poli`) USING BTREE, + CONSTRAINT `mlite_rujukan_internal_poli_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `mlite_rujukan_internal_poli_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `mlite_rujukan_internal_poli_ibfk_3` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_satu_sehat_departemen -# ------------------------------------------------------------ CREATE TABLE `mlite_satu_sehat_departemen` ( `dep_id` char(4) NOT NULL, @@ -2952,12 +2876,8 @@ CREATE TABLE `mlite_satu_sehat_departemen` ( PRIMARY KEY (`dep_id`), UNIQUE KEY `id_organisasi_satusehat` (`id_organisasi_satusehat`), CONSTRAINT `mlite_satu_sehat_departemen_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `departemen` (`dep_id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_satu_sehat_lokasi -# ------------------------------------------------------------ CREATE TABLE `mlite_satu_sehat_lokasi` ( `kode` char(5) NOT NULL, @@ -2971,25 +2891,67 @@ CREATE TABLE `mlite_satu_sehat_lokasi` ( UNIQUE KEY `id_lokasi_satusehat` (`id_lokasi_satusehat`), KEY `id_organisasi_satusehat` (`id_organisasi_satusehat`), CONSTRAINT `mlite_satu_sehat_lokasi_ibfk_2` FOREIGN KEY (`id_organisasi_satusehat`) REFERENCES `mlite_satu_sehat_departemen` (`id_organisasi_satusehat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `mlite_satu_sehat_mapping_lab` ( + `id_template` int NOT NULL, + `kd_jenis_prw` varchar(15) DEFAULT NULL, + `code` varchar(15) DEFAULT NULL, + `system` varchar(100) NOT NULL, + `display` varchar(80) DEFAULT NULL, + `sampel_code` varchar(15) NOT NULL, + `sampel_system` varchar(100) NOT NULL, + `sampel_display` varchar(80) NOT NULL, + PRIMARY KEY (`id_template`) USING BTREE, + CONSTRAINT `mlite_satu_sehat_mapping_lab_ibfk_1` FOREIGN KEY (`id_template`) REFERENCES `template_laboratorium` (`id_template`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_satu_sehat_mapping_obat` ( + `kode_brng` varchar(15) NOT NULL DEFAULT '', + `kode_kfa` varchar(50) DEFAULT NULL, + `nama_kfa` varchar(100) DEFAULT NULL, + `kode_bahan` varchar(50) DEFAULT NULL, + `nama_bahan` varchar(100) DEFAULT NULL, + `numerator` varchar(10) DEFAULT NULL, + `satuan_num` varchar(10) DEFAULT NULL, + `denominator` varchar(10) DEFAULT NULL, + `satuan_den` varchar(10) DEFAULT NULL, + `nama_satuan_den` varchar(10) DEFAULT NULL, + `kode_sediaan` varchar(50) DEFAULT NULL, + `nama_sediaan` varchar(100) DEFAULT NULL, + `kode_route` varchar(10) DEFAULT NULL, + `nama_route` varchar(50) DEFAULT NULL, + `type` enum('obat','vaksin') NOT NULL, + `id_medication` varchar(50) DEFAULT NULL, + PRIMARY KEY (`kode_brng`) USING BTREE, + CONSTRAINT `mlite_satu_sehat_mapping_obat_ibfk_1` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_satu_sehat_mapping_praktisi -# ------------------------------------------------------------ CREATE TABLE `mlite_satu_sehat_mapping_praktisi` ( `practitioner_id` varchar(40) NOT NULL, `kd_dokter` varchar(20) NOT NULL, + `jenis_praktisi` varchar(20) NOT NULL, PRIMARY KEY (`practitioner_id`), KEY `kd_dokter` (`kd_dokter`), CONSTRAINT `mlite_satu_sehat_mapping_praktisi_ibfk_1` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mlite_satu_sehat_mapping_rad` ( + `kd_jenis_prw` varchar(15) NOT NULL, + `code` varchar(15) DEFAULT NULL, + `system` varchar(100) NOT NULL, + `display` varchar(80) DEFAULT NULL, + `sampel_code` varchar(15) NOT NULL, + `sampel_system` varchar(100) NOT NULL, + `sampel_display` varchar(80) NOT NULL, + PRIMARY KEY (`kd_jenis_prw`) USING BTREE, + CONSTRAINT `mlite_satu_sehat_mapping_rad_ibfk_1` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_radiologi` (`kd_jenis_prw`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_satu_sehat_response -# ------------------------------------------------------------ CREATE TABLE `mlite_satu_sehat_response` ( `no_rawat` varchar(17) NOT NULL, @@ -3006,197 +2968,303 @@ CREATE TABLE `mlite_satu_sehat_response` ( `id_observation_ttvtensi` varchar(50) DEFAULT NULL, `id_observation_ttvkesadaran` varchar(50) DEFAULT NULL, `id_procedure` varchar(50) DEFAULT NULL, + `id_clinical_impression` varchar(50) DEFAULT NULL, `id_composition` varchar(50) DEFAULT NULL, + `id_immunization` varchar(50) DEFAULT NULL, + `id_medication_request` varchar(50) DEFAULT NULL, + `id_medication_dispense` varchar(50) DEFAULT NULL, + `id_medication_statement` varchar(50) DEFAULT NULL, + `id_rad_request` varchar(50) DEFAULT NULL, + `id_rad_specimen` varchar(50) DEFAULT NULL, + `id_rad_observation` varchar(50) DEFAULT NULL, + `id_rad_diagnostic` varchar(50) DEFAULT NULL, + `id_imaging_study` varchar(50) DEFAULT NULL, + `id_lab_pk_request` varchar(50) DEFAULT NULL, + `id_lab_pk_specimen` varchar(50) DEFAULT NULL, + `id_lab_pk_observation` varchar(50) DEFAULT NULL, + `id_lab_pk_diagnostic` varchar(50) DEFAULT NULL, + `id_lab_pa_request` varchar(50) DEFAULT NULL, + `id_lab_pa_specimen` varchar(50) DEFAULT NULL, + `id_lab_pa_observation` varchar(50) DEFAULT NULL, + `id_lab_pa_diagnostic` varchar(50) DEFAULT NULL, + `id_lab_mb_request` varchar(50) DEFAULT NULL, + `id_lab_mb_specimen` varchar(50) DEFAULT NULL, + `id_lab_mb_observation` varchar(50) DEFAULT NULL, + `id_lab_mb_diagnostic` varchar(50) DEFAULT NULL, + `id_careplan` varchar(50) DEFAULT NULL, + `id_allergy` varchar(50) DEFAULT NULL, + `id_questionnaire` varchar(50) DEFAULT NULL, PRIMARY KEY (`no_rawat`), CONSTRAINT `mlite_satu_sehat_response_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + +CREATE TABLE `mlite_sertisign_webhook` ( + `id` int NOT NULL AUTO_INCREMENT, + `transaction_id` varchar(100) NOT NULL, + `status` varchar(50) NOT NULL, + `document_url` varchar(255) NOT NULL, + `payload` text NOT NULL, + `received_at` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `transaction_idx` (`transaction_id`), + KEY `status_idx` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_settings -# ------------------------------------------------------------ +CREATE TABLE `mlite_mapping_snomed_icd` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(20) NOT NULL, + `kd_penyakit` varchar(10) NOT NULL, + `snomed_concept_id` bigint NOT NULL, + `snomed_term` varchar(255) NOT NULL, + `status_penyakit` enum('Baru','Lama') DEFAULT 'Baru', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_mapping` (`no_rawat`,`kd_penyakit`,`snomed_concept_id`), + KEY `no_rawat` (`no_rawat`), + KEY `kd_penyakit` (`kd_penyakit`), + KEY `snomed_concept_id` (`snomed_concept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + +CREATE TABLE `mlite_mapping_snomed_icd9` ( + `id` int NOT NULL AUTO_INCREMENT, + `no_rawat` varchar(17) NOT NULL, + `kd_tindakan` varchar(10) NOT NULL, + `snomed_concept_id` varchar(50) NOT NULL, + `snomed_term` text DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_mapping` (`no_rawat`,`kd_tindakan`,`snomed_concept_id`), + KEY `no_rawat` (`no_rawat`), + KEY `kd_tindakan` (`kd_tindakan`), + KEY `snomed_concept_id` (`snomed_concept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE `mlite_settings` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `module` varchar(100) NOT NULL, `field` varchar(100) NOT NULL, - `value` varchar(1000) NOT NULL, + `value` TEXT NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `module` (`module`,`field`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -LOCK TABLES `mlite_settings` WRITE; -/*!40000 ALTER TABLE `mlite_settings` DISABLE KEYS */; - -INSERT INTO `mlite_settings` (`id`, `module`, `field`, `value`) -VALUES - (1,'settings','logo','uploads/settings/logo.png'), - (2,'settings','nama_instansi','mLITE Indonesia'), - (3,'settings','alamat','Jl. Perintis Kemerdekaan 45'), - (4,'settings','kota','Barabai'), - (5,'settings','propinsi','Kalimantan Selatan'), - (6,'settings','nomor_telepon','0812345678'), - (7,'settings','email','info@mlite.id'), - (8,'settings','website','https://mlite.id'), - (9,'settings','ppk_bpjs','-'), - (10,'settings','footer','Copyright {?=date(\"Y\")?} © by drg. F. Basoro. All rights reserved.'), - (11,'settings','homepage','main'), - (12,'settings','wallpaper','uploads/settings/wallpaper.jpg'), - (13,'settings','text_color','#44813e'), - (14,'settings','igd','IGDK'), - (15,'settings','laboratorium','-'), - (16,'settings','pj_laboratorium','DR001'), - (17,'settings','radiologi','-'), - (18,'settings','pj_radiologi','DR001'), - (19,'settings','dokter_ralan_per_dokter','false'), - (20,'settings','cekstatusbayar','false'), - (21,'settings','ceklimit','false'), - (22,'settings','responsivevoice','false'), - (23,'settings','notif_presensi','true'), - (24,'settings','BpjsApiUrl','https://apijkn-dev.bpjs-kesehatan.go.id/vclaim-rest-dev/'), - (25,'settings','BpjsConsID','-'), - (26,'settings','BpjsSecretKey','-'), - (27,'settings','BpjsUserKey','-'), - (28,'settings','timezone','Asia/Makassar'), - (29,'settings','theme','default'), - (30,'settings','theme_admin','mlite'), - (31,'settings','admin_mode','complex'), - (32,'settings','input_kasir','tidak'), - (33,'settings','editor','wysiwyg'), - (34,'settings','version','5.1.0'), - (35,'settings','update_check','0'), - (36,'settings','update_changelog',''), - (37,'settings','update_version','0'), - (38,'settings','license',''), - (39,'farmasi','deporalan','-'), - (40,'farmasi','igd','-'), - (41,'farmasi','deporanap','-'), - (42,'farmasi','gudang','-'), - (43,'wagateway','server','https://mlite.id'), - (44,'wagateway','token','-'), - (45,'wagateway','phonenumber','-'), - (46,'anjungan','display_poli',''), - (47,'anjungan','carabayar',''), - (48,'anjungan','antrian_loket','1'), - (49,'anjungan','antrian_cs','2'), - (50,'anjungan','antrian_apotek','3'), - (51,'anjungan','panggil_loket','1'), - (52,'anjungan','panggil_loket_nomor','1'), - (53,'anjungan','panggil_cs','1'), - (54,'anjungan','panggil_cs_nomor','1'), - (55,'anjungan','panggil_apotek','1'), - (56,'anjungan','panggil_apotek_nomor','1'), - (57,'anjungan','text_anjungan','Running text anjungan pasien mandiri.....'), - (58,'anjungan','text_loket','Running text display antrian loket.....'), - (59,'anjungan','text_poli','Running text display antrian poliklinik.....'), - (60,'anjungan','text_laboratorium','Running text display antrian laboratorium.....'), - (61,'anjungan','text_apotek','Running text display antrian apotek.....'), - (62,'anjungan','text_farmasi','Running text display antrian farmasi.....'), - (63,'anjungan','vidio','G4im8_n0OoI'), - (64,'api','apam_key','qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341'), - (65,'api','apam_status_daftar','Terdaftar'), - (66,'api','apam_status_dilayani','Anda siap dilayani'), - (67,'api','apam_webappsurl','http://localhost/webapps/'), - (68,'api','apam_normpetugas','000001,000002'), - (69,'api','apam_limit','2'), - (70,'api','apam_smtp_host','ssl://smtp.gmail.com'), - (71,'api','apam_smtp_port','465'), - (72,'api','apam_smtp_username',''), - (73,'api','apam_smtp_password',''), - (74,'api','apam_kdpj',''), - (75,'api','apam_kdprop',''), - (76,'api','apam_kdkab',''), - (77,'api','apam_kdkec',''), - (78,'api','duitku_merchantCode',''), - (79,'api','duitku_merchantKey',''), - (80,'api','duitku_paymentAmount',''), - (81,'api','duitku_paymentMethod',''), - (82,'api','duitku_productDetails',''), - (83,'api','duitku_expiryPeriod',''), - (84,'api','duitku_kdpj',''), - (85,'api','berkasdigital_key','qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341'), - (86,'jkn_mobile','x_username','jkn'), - (87,'jkn_mobile','x_password','mobile'), - (88,'jkn_mobile','header_token','X-Token'), - (89,'jkn_mobile','header_username','X-Username'), - (90,'jkn_mobile','header_password','X-Password'), - (91,'jkn_mobile','BpjsConsID',''), - (92,'jkn_mobile','BpjsSecretKey',''), - (93,'jkn_mobile','BpjsUserKey',''), - (94,'jkn_mobile','BpjsAntrianUrl','https://apijkn-dev.bpjs-kesehatan.go.id/antreanrs_dev/'), - (95,'jkn_mobile','kd_pj_bpjs',''), - (96,'jkn_mobile','exclude_taskid',''), - (97,'jkn_mobile','display',''), - (98,'jkn_mobile','kdprop','1'), - (99,'jkn_mobile','kdkab','1'), - (100,'jkn_mobile','kdkec','1'), - (101,'jkn_mobile','kdkel','1'), - (102,'jkn_mobile','perusahaan_pasien',''), - (103,'jkn_mobile','suku_bangsa',''), - (104,'jkn_mobile','bahasa_pasien',''), - (105,'jkn_mobile','cacat_fisik',''), - (106,'keuangan','jurnal_kasir','0'), - (107,'keuangan','akun_kredit_pendaftaran',''), - (108,'keuangan','akun_kredit_tindakan',''), - (109,'keuangan','akun_kredit_obat_bhp',''), - (110,'keuangan','akun_kredit_laboratorium',''), - (111,'keuangan','akun_kredit_radiologi',''), - (112,'keuangan','akun_kredit_tambahan_biaya',''), - (113,'manajemen','penjab_umum','UMU'), - (114,'manajemen','penjab_bpjs','BPJ'), - (115,'presensi','lat','-2.58'), - (116,'presensi','lon','115.37'), - (117,'presensi','distance','2'), - (118,'presensi','helloworld','Jangan Lupa Bahagia; \nCara untuk memulai adalah berhenti berbicara dan mulai melakukan; \nWaktu yang hilang tidak akan pernah ditemukan lagi; \nKamu bisa membodohi semua orang, tetapi kamu tidak bisa membohongi pikiranmu; \nIni bukan tentang ide. Ini tentang mewujudkan ide; \nBekerja bukan hanya untuk mencari materi. Bekerja merupakan manfaat bagi banyak orang'), - (119,'vedika','carabayar',''), - (120,'vedika','sep',''), - (121,'vedika','skdp',''), - (122,'vedika','operasi',''), - (123,'vedika','individual',''), - (124,'vedika','billing','mlite'), - (125,'vedika','periode','2023-01'), - (126,'vedika','verifikasi','2023-01'), - (127,'vedika','inacbgs_prosedur_bedah',''), - (128,'vedika','inacbgs_prosedur_non_bedah',''), - (129,'vedika','inacbgs_konsultasi',''), - (130,'vedika','inacbgs_tenaga_ahli',''), - (131,'vedika','inacbgs_keperawatan',''), - (132,'vedika','inacbgs_penunjang',''), - (133,'vedika','inacbgs_pelayanan_darah',''), - (134,'vedika','inacbgs_rehabilitasi',''), - (135,'vedika','inacbgs_rawat_intensif',''), - (136,'vedika','eklaim_url',''), - (137,'vedika','eklaim_key',''), - (138,'vedika','eklaim_kelasrs','CP'), - (139,'vedika','eklaim_payor_id','3'), - (140,'vedika','eklaim_payor_cd','JKN'), - (141,'vedika','eklaim_cob_cd','#'), - (142,'orthanc','server','http://localhost:8042'), - (143,'orthanc','username','orthanc'), - (144,'orthanc','password','orthanc'), - (145,'veronisa','username',''), - (146,'veronisa','password',''), - (147,'veronisa','obat_kronis',''), - (148,'jkn_mobile','kirimantrian','tidak'), - (149,'settings','keamanan','ya'), - (150,'dokter_ralan','set_sudah','tidak'), - (151,'settings','websocket','tidak'), - (152,'settings','websocket_proxy',''), - (153,'settings','username_fp',''), - (154,'settings','password_fp',''), - (155,'settings','username_frista',''), - (156,'settings','password_frista',''), - (157,'settings','billing_obat','false'), - (158,'settings','prefix_surat','RS'), - (159,'farmasi','keterangan_etiket',''), - (160,'pcare','consumerUserKeyAntrol',''); - -/*!40000 ALTER TABLE `mlite_settings` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_subrekening -# ------------------------------------------------------------ +) ENGINE=MyISAM AUTO_INCREMENT=221 DEFAULT CHARSET=utf8mb4; + + +INSERT INTO `mlite_settings` VALUES ("1","settings","logo","uploads/settings/logo.png"), +("2","settings","nama_instansi","mLITE Indonesia"), +("3","settings","alamat","Jl. Perintis Kemerdekaan 45"), +("4","settings","kota","Barabai"), +("5","settings","propinsi","Kalimantan Selatan"), +("6","settings","nomor_telepon","0812345678"), +("7","settings","email","info@mlite.id"), +("8","settings","website","https://mlite.id"), +("9","settings","ppk_bpjs","-"), +("10","settings","footer","Copyright {?=date(\"Y\")?} © by drg. F. Basoro. All rights reserved."), +("11","settings","homepage","main"), +("12","settings","wallpaper","uploads/settings/wallpaper.jpg"), +("13","settings","text_color","#44813e"), +("14","settings","igd","IGDK"), +("15","settings","laboratorium","-"), +("16","settings","pj_laboratorium","DR001"), +("17","settings","radiologi","-"), +("18","settings","pj_radiologi","DR001"), +("19","settings","dokter_ralan_per_dokter","false"), +("20","settings","cekstatusbayar","false"), +("21","settings","ceklimit","false"), +("22","settings","responsivevoice","false"), +("23","settings","notif_presensi","true"), +("24","settings","BpjsApiUrl","https://apijkn-dev.bpjs-kesehatan.go.id/vclaim-rest-dev/"), +("25","settings","BpjsConsID","-"), +("26","settings","BpjsSecretKey","-"), +("27","settings","BpjsUserKey","-"), +("28","settings","timezone","Asia/Makassar"), +("29","settings","theme","default"), +("30","settings","theme_admin","mlite"), +("31","settings","admin_mode","complex"), +("32","settings","input_kasir","tidak"), +("33","settings","editor","wysiwyg"), +("34","settings","version","6.3.4"), +("35","settings","update_check",""), +("36","settings","update_changelog",""), +("37","settings","update_version","0"), +("38","settings","license",""), +("39","farmasi","deporalan","-"), +("40","farmasi","igd","-"), +("41","farmasi","deporanap","-"), +("42","farmasi","gudang","-"), +("43","wagateway","server","https://mlite.id"), +("44","wagateway","token","-"), +("45","wagateway","phonenumber","-"), +("46","anjungan","display_poli",""), +("47","anjungan","carabayar",""), +("48","anjungan","antrian_loket","1"), +("49","anjungan","antrian_cs","2"), +("50","anjungan","antrian_apotek","3"), +("51","anjungan","panggil_loket","1"), +("52","anjungan","panggil_loket_nomor","1"), +("53","anjungan","panggil_cs","1"), +("54","anjungan","panggil_cs_nomor","1"), +("55","anjungan","panggil_apotek","1"), +("56","anjungan","panggil_apotek_nomor","1"), +("57","anjungan","text_anjungan","Running text anjungan pasien mandiri....."), +("58","anjungan","text_loket","Running text display antrian loket....."), +("59","anjungan","text_poli","Running text display antrian poliklinik....."), +("60","anjungan","text_laboratorium","Running text display antrian laboratorium....."), +("61","anjungan","text_apotek","Running text display antrian apotek....."), +("62","anjungan","text_farmasi","Running text display antrian farmasi....."), +("63","anjungan","vidio","PLFtgYUkJmfyx7rESNFuRDUmhtkzSeFPQo"), +("64","api","apam_key","qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341"), +("65","api","apam_status_daftar","Terdaftar"), +("66","api","apam_status_dilayani","Anda siap dilayani"), +("67","api","apam_webappsurl","http://localhost/webapps/"), +("68","api","apam_normpetugas","000001,000002"), +("69","api","apam_limit","2"), +("70","api","apam_smtp_host","ssl://smtp.gmail.com"), +("71","api","apam_smtp_port","465"), +("72","api","apam_smtp_username",""), +("73","api","apam_smtp_password",""), +("74","api","apam_kdpj",""), +("75","api","apam_kdprop",""), +("76","api","apam_kdkab",""), +("77","api","apam_kdkec",""), +("78","api","duitku_merchantCode",""), +("79","api","duitku_merchantKey",""), +("80","api","duitku_paymentAmount",""), +("81","api","duitku_paymentMethod",""), +("82","api","duitku_productDetails",""), +("83","api","duitku_expiryPeriod",""), +("84","api","duitku_kdpj",""), +("85","api","berkasdigital_key","qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341"), +("86","jkn_mobile","x_username","jkn"), +("87","jkn_mobile","x_password","mobile"), +("88","jkn_mobile","header_token","X-Token"), +("89","jkn_mobile","header_username","X-Username"), +("90","jkn_mobile","header_password","X-Password"), +("91","jkn_mobile","BpjsConsID",""), +("92","jkn_mobile","BpjsSecretKey",""), +("93","jkn_mobile","BpjsUserKey",""), +("94","jkn_mobile","BpjsAntrianUrl","https://apijkn-dev.bpjs-kesehatan.go.id/antreanrs_dev/"), +("95","jkn_mobile","kd_pj_bpjs",""), +("96","jkn_mobile","exclude_taskid",""), +("97","jkn_mobile","display",""), +("98","jkn_mobile","kdprop","1"), +("99","jkn_mobile","kdkab","1"), +("100","jkn_mobile","kdkec","1"), +("101","jkn_mobile","kdkel","1"), +("102","jkn_mobile","perusahaan_pasien",""), +("103","jkn_mobile","suku_bangsa",""), +("104","jkn_mobile","bahasa_pasien",""), +("105","jkn_mobile","cacat_fisik",""), +("106","keuangan","jurnal_kasir","0"), +("107","keuangan","akun_kredit_pendaftaran","4101"), +("108","keuangan","akun_kredit_tindakan","4102"), +("109","keuangan","akun_kredit_obat_bhp","4103"), +("110","keuangan","akun_kredit_laboratorium","4104"), +("111","keuangan","akun_kredit_radiologi","4105"), +("112","keuangan","akun_kredit_tambahan_biaya","4201"), +("113","manajemen","penjab_umum","UMU"), +("114","manajemen","penjab_bpjs","BPJ"), +("115","presensi","lat","-2.58"), +("116","presensi","lon","115.37"), +("117","presensi","distance","2"), +("118","presensi","helloworld","Jangan Lupa Bahagia; \nCara untuk memulai adalah berhenti berbicara dan mulai melakukan; \nWaktu yang hilang tidak akan pernah ditemukan lagi; \nKamu bisa membodohi semua orang, tetapi kamu tidak bisa membohongi pikiranmu; \nIni bukan tentang ide. Ini tentang mewujudkan ide; \nBekerja bukan hanya untuk mencari materi. Bekerja merupakan manfaat bagi banyak orang"), +("119","vedika","carabayar",""), +("120","vedika","sep",""), +("121","vedika","skdp",""), +("122","vedika","operasi",""), +("123","vedika","individual",""), +("124","vedika","billing","mlite"), +("125","vedika","periode","2023-01"), +("126","vedika","verifikasi","2023-01"), +("127","vedika","inacbgs_prosedur_bedah",""), +("128","vedika","inacbgs_prosedur_non_bedah",""), +("129","vedika","inacbgs_konsultasi",""), +("130","vedika","inacbgs_tenaga_ahli",""), +("131","vedika","inacbgs_keperawatan",""), +("132","vedika","inacbgs_penunjang",""), +("133","vedika","inacbgs_pelayanan_darah",""), +("134","vedika","inacbgs_rehabilitasi",""), +("135","vedika","inacbgs_rawat_intensif",""), +("136","vedika","eklaim_url",""), +("137","vedika","eklaim_key",""), +("138","vedika","eklaim_kelasrs","CP"), +("139","vedika","eklaim_payor_id","3"), +("140","vedika","eklaim_payor_cd","JKN"), +("141","vedika","eklaim_cob_cd","#"), +("142","orthanc","server","http://localhost:8042"), +("143","orthanc","username","orthanc"), +("144","orthanc","password","orthanc"), +("166","afm","username_finger",""), +("148","jkn_mobile","kirimantrian","tidak"), +("149","settings","keamanan","tidak"), +("165","afm","afm_token","fc4eba4aa3ea79a7bba3070cba848696"), +("151","settings","websocket","tidak"), +("152","settings","websocket_proxy",""), +("153","settings","username_fp",""), +("154","settings","password_fp",""), +("155","settings","username_frista",""), +("156","settings","password_frista",""), +("157","settings","billing_obat","false"), +("158","settings","prefix_surat","RS"), +("159","farmasi","keterangan_etiket",""), +("160","settings","set_nomor_surat","000"), +("161","settings","password_expire","tidak"), +("162","farmasi","embalase","0"), +("163","farmasi","tuslah","0"), +("164","settings","log_query","tidak"), +("167","afm","password_finger",""), +("168","afm","x_header_token","X-Header-Token"), +("169","bpjs_emr","consid",""), +("170","bpjs_emr","secretkey",""), +("171","bpjs_emr","userkey",""), +("172","bpjs_emr","koders",""), +("173","bpjs_emr","kode_kemkes",""), +("174","bpjs_emr","kodepos",""), +("175","bpjs_emr","baseurl","https://apijkn-dev.bpjs-kesehatan.go.id/erekammedis_dev/"), +("176","dokter_ralan","set_sudah","tidak"), +("177","esignature","kode_berkasdigital",""), +("178","icare","url","https://apijkn.bpjs-kesehatan.go.id/wsihs/api/rs/validate"), +("179","icare","consid",""), +("180","icare","secretkey",""), +("181","icare","userkey",""), +("182","icare","urlPCare","https://apijkn.bpjs-kesehatan.go.id/wsihs/api/pcare/validate"), +("183","icare","usernameICare",""), +("184","icare","passwordICare",""), +("185","satu_sehat","organizationid",""), +("186","satu_sehat","clientid",""), +("187","satu_sehat","secretkey",""), +("188","satu_sehat","authurl","https://api-satusehat-dev.dto.kemkes.go.id/oauth2/v1"), +("189","satu_sehat","fhirurl","https://api-satusehat-dev.dto.kemkes.go.id/fhir-r4/v1"), +("190","satu_sehat","kelurahan",""), +("191","satu_sehat","kecamatan",""), +("192","satu_sehat","kabupaten",""), +("193","satu_sehat","propinsi",""), +("194","satu_sehat","kodepos",""), +("195","satu_sehat","longitude",""), +("196","satu_sehat","latitude",""), +("197","satu_sehat","zonawaktu","WIB"), +("198","satu_sehat","farmasi",""), +("199","satu_sehat","laboratorium",""), +("200","satu_sehat","radiologi",""), +("201","satu_sehat","praktisiapotek",""), +("202","satu_sehat","praktisilab",""), +("203","satu_sehat","praktisirad",""), +("205","sertisign","api_host","https://api-stag.sertisign.id/"), +("206","sertisign","api_key",""), +("207","veronisa","username",""), +("208","veronisa","password",""), +("209","veronisa","obat_kronis",""), +("210","veronisa","cons_id",""), +("211","veronisa","kode_ppk",""), +("212","veronisa","user_key",""), +("213","veronisa","secret_key",""), +("214","veronisa","bpjs_api_url",""), +("215","settings","login_otp", "tidak"), +("216","keuangan","akun_debet_kas","1101"), +("217","bpjs_emr","kecamatan",""), +("218","satu_sehat","imaging",""), +("219","farmasi","pajak_obat_persen","0"), +("220","settings","billing_parsial","false"); + CREATE TABLE `mlite_subrekening` ( `kd_rek` varchar(15) NOT NULL, @@ -3205,15 +3273,19 @@ CREATE TABLE `mlite_subrekening` ( KEY `kd_rek` (`kd_rek`), CONSTRAINT `mlite_subrekening_ibfk_1` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON UPDATE CASCADE, CONSTRAINT `mlite_subrekening_ibfk_2` FOREIGN KEY (`kd_rek2`) REFERENCES `mlite_rekening` (`kd_rek`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_surat_rujukan -# ------------------------------------------------------------ +CREATE TABLE `mlite_snomed` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `kode` varchar(20) NOT NULL, + `istilah` text NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `kode` (`kode`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; CREATE TABLE `mlite_surat_rujukan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nomor_surat` varchar(100) DEFAULT NULL, `no_rawat` varchar(100) DEFAULT NULL, `no_rkm_medis` varchar(100) DEFAULT NULL, @@ -3221,7 +3293,7 @@ CREATE TABLE `mlite_surat_rujukan` ( `tgl_lahir` varchar(100) DEFAULT NULL, `umur` varchar(100) DEFAULT NULL, `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, + `alamat` TEXT DEFAULT NULL, `kepada` varchar(250) DEFAULT NULL, `di` varchar(250) DEFAULT NULL, `anamnesa` varchar(100) DEFAULT NULL, @@ -3233,15 +3305,11 @@ CREATE TABLE `mlite_surat_rujukan` ( `dokter` varchar(100) DEFAULT NULL, `petugas` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_surat_sakit -# ------------------------------------------------------------ CREATE TABLE `mlite_surat_sakit` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nomor_surat` varchar(100) DEFAULT NULL, `no_rawat` varchar(100) DEFAULT NULL, `no_rkm_medis` varchar(100) DEFAULT NULL, @@ -3249,7 +3317,7 @@ CREATE TABLE `mlite_surat_sakit` ( `tgl_lahir` varchar(100) DEFAULT NULL, `umur` varchar(100) DEFAULT NULL, `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, + `alamat` TEXT DEFAULT NULL, `keadaan` varchar(100) DEFAULT NULL, `diagnosa` varchar(100) DEFAULT NULL, `lama_angka` varchar(100) DEFAULT NULL, @@ -3259,15 +3327,11 @@ CREATE TABLE `mlite_surat_sakit` ( `dokter` varchar(100) DEFAULT NULL, `petugas` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_surat_sehat -# ------------------------------------------------------------ CREATE TABLE `mlite_surat_sehat` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nomor_surat` varchar(100) DEFAULT NULL, `no_rawat` varchar(100) DEFAULT NULL, `no_rkm_medis` varchar(100) DEFAULT NULL, @@ -3275,7 +3339,7 @@ CREATE TABLE `mlite_surat_sehat` ( `tgl_lahir` varchar(100) DEFAULT NULL, `umur` varchar(100) DEFAULT NULL, `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, + `alamat` TEXT DEFAULT NULL, `tanggal` varchar(100) DEFAULT NULL, `berat_badan` varchar(100) DEFAULT NULL, `tinggi_badan` varchar(100) DEFAULT NULL, @@ -3286,12 +3350,8 @@ CREATE TABLE `mlite_surat_sehat` ( `dokter` varchar(100) DEFAULT NULL, `petugas` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_temporary -# ------------------------------------------------------------ CREATE TABLE `mlite_temporary` ( `temp1` text, @@ -3394,126 +3454,72 @@ CREATE TABLE `mlite_temporary` ( `temp98` text, `temp99` text, `temp100` text -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_triase -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase` ( - `no_rawat` varchar(17) NOT NULL, - `tgl_kunjungan` datetime NOT NULL, - `cara_masuk` enum('Jalan','Brankar','Kursi Roda','Digendong') NOT NULL, - `alat_transportasi` enum('-','AGD','Sendiri','Swasta') NOT NULL, - `alasan_kedatangan` enum('Datang Sendiri','Polisi','Rujukan','-') NOT NULL, - `keterangan_kedatangan` varchar(100) NOT NULL, - `macam_kasus` enum('Trauma Kecelakaan Lalu Lintas','Trauma Kecelakaan Kerja','Trauma Kasus Unit Pelayanan Anak & Perempuan','Trauma Lainnya','Non Trauma') NOT NULL, - `tekanan_darah` varchar(8) NOT NULL, - `nadi` varchar(3) NOT NULL, - `pernapasan` varchar(3) NOT NULL, - `suhu` varchar(5) NOT NULL, - `saturasi_o2` varchar(3) NOT NULL, - `nyeri` varchar(5) NOT NULL, - `jenis_triase` enum('Primer','Sekunder') NOT NULL, - `keluhan_utama` varchar(500) NOT NULL, - `kebutuhan_khusus` enum('-','UPPA','Airborne','Dekontaminan') NOT NULL, - `catatan` varchar(100) NOT NULL, - `plan` enum('Ruang Resusitasi','Ruang Kritis','Zona Kuning','Zona Hijau') NOT NULL, - `nik` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - CONSTRAINT `mlite_triase_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -# Dump of table mlite_triase_detail -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_detail` ( +CREATE TABLE `mlite_triase_igd` ( + `id_triase` int NOT NULL AUTO_INCREMENT, `no_rawat` varchar(17) NOT NULL, - `skala` varchar(3) NOT NULL, - `kode_skala` varchar(3) NOT NULL, - PRIMARY KEY (`no_rawat`,`skala`,`kode_skala`) USING BTREE, - CONSTRAINT `mlite_triase_detail_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_triase_pemeriksaan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_pemeriksaan` ( - `kode_pemeriksaan` varchar(3) NOT NULL, - `nama_pemeriksaan` varchar(150) DEFAULT NULL, - PRIMARY KEY (`kode_pemeriksaan`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_triase_skala -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_skala` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `kode_pemeriksaan` varchar(3) NOT NULL, - `skala` int(11) NOT NULL, - `kode_skala` varchar(3) NOT NULL, - `pengkajian_skala` varchar(150) NOT NULL, - PRIMARY KEY (`id`) USING BTREE, - KEY `kode_pemeriksaan` (`kode_pemeriksaan`) USING BTREE, - CONSTRAINT `mlite_triase_skala_ibfk_1` FOREIGN KEY (`kode_pemeriksaan`) REFERENCES `mlite_triase_pemeriksaan` (`kode_pemeriksaan`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - + `no_rkm_medis` varchar(15) NOT NULL, + `tgl_triase` datetime NOT NULL, + `petugas_id` varchar(20) NOT NULL, + `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, + `airway` enum('Bebas','Sumbatan Parsial','Sumbatan Total') NOT NULL, + `breathing` enum('Spontan','Tak Spontan','Distres Nafas') NOT NULL, + `circulation` enum('Baik','Syok','Perdarahan') NOT NULL, + `tekanan_darah` varchar(10) DEFAULT NULL, + `nadi` int DEFAULT NULL, + `respirasi` int DEFAULT NULL, + `suhu` decimal(4,1) DEFAULT NULL, + `spo2` int DEFAULT NULL, + `gcs_e` tinyint DEFAULT NULL, + `gcs_v` tinyint DEFAULT NULL, + `gcs_m` tinyint DEFAULT NULL, + `kategori` enum('Merah','Kuning','Hijau','Hitam') NOT NULL, + `skala_triase` enum('1','2','3','4','5') DEFAULT NULL, + `keluhan_utama` text, + `diagnosa_awal` text, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id_triase`) USING BTREE, + KEY `no_rawat` (`no_rawat`) USING BTREE, + CONSTRAINT `fk_triase_reg_periksa` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_users -# ------------------------------------------------------------ CREATE TABLE `mlite_users` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `username` text, `fullname` text, `description` text, `password` text, + `password_changed_at` datetime DEFAULT NULL, + `otp_code` varchar(10) DEFAULT NULL, + `otp_expires` datetime DEFAULT NULL, `avatar` text, `email` text, `role` varchar(100) NOT NULL DEFAULT 'user', `cap` varchar(100) DEFAULT '', - `access` varchar(500) NOT NULL DEFAULT 'dashboard', + `access` TEXT, PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; +) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; -LOCK TABLES `mlite_users` WRITE; -/*!40000 ALTER TABLE `mlite_users` DISABLE KEYS */; -INSERT INTO `mlite_users` (`id`, `username`, `fullname`, `description`, `password`, `avatar`, `email`, `role`, `cap`, `access`) -VALUES - (1,'admin','Administrator','Admin ganteng baik hati, suka menabung dan tidak sombong.','$2y$10$pgRnDiukCbiYVqsamMM3ROWViSRqbyCCL33N8.ykBKZx0dlplXe9i','avatar6422cb573b50c.png','info@mlite.id','admin','','all'), - (2,'DR001','dr. Ataaka Muhammad','-','$2y$10$kuf2BxvViduBpUTn.6Nxsug3AskH/PGvXTSlfCfJqK8Ayb9a0.vqC','avatar643a104444515.png','info@mlite.id','admin','','all'); +INSERT INTO `mlite_users` VALUES ("1","admin","Administrator","Admin ganteng baik hati, suka menabung dan tidak sombong.","$2y$10$pgRnDiukCbiYVqsamMM3ROWViSRqbyCCL33N8.ykBKZx0dlplXe9i",NULL,NULL,NULL,"avatar6422cb573b50c.png","info@mlite.id","admin","","all"), +("2","DR001","dr. Ataaka Muhammad","-","$2y$10$kuf2BxvViduBpUTn.6Nxsug3AskH/PGvXTSlfCfJqK8Ayb9a0.vqC",NULL,NULL,NULL,"avatar643a104444515.png","info@mlite.id","admin","","all"); -/*!40000 ALTER TABLE `mlite_users` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_users_vedika -# ------------------------------------------------------------ CREATE TABLE `mlite_users_vedika` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `username` text, `password` text, `fullname` text, PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -# Dump of table mlite_vedika -# ------------------------------------------------------------ - CREATE TABLE `mlite_vedika` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `tanggal` date DEFAULT NULL, `no_rkm_medis` varchar(6) NOT NULL, `no_rawat` varchar(100) NOT NULL, @@ -3522,30 +3528,25 @@ CREATE TABLE `mlite_vedika` ( `jenis` varchar(100) NOT NULL, `status` varchar(100) NOT NULL, `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - + PRIMARY KEY (`id`), + KEY `idx_vedika_status_jenis_tgl` (`status`,`jenis`,`tgl_registrasi`), + KEY `idx_vedika_nosep` (`nosep`), + KEY `idx_vedika_no_rkm_medis` (`no_rkm_medis`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_vedika_feedback -# ------------------------------------------------------------ CREATE TABLE `mlite_vedika_feedback` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nosep` varchar(100) NOT NULL, `tanggal` date DEFAULT NULL, `catatan` text, `username` varchar(100) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_veronisa -# ------------------------------------------------------------ CREATE TABLE `mlite_veronisa` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `tanggal` date DEFAULT NULL, `no_rkm_medis` varchar(6) NOT NULL, `no_rawat` varchar(100) NOT NULL, @@ -3553,27 +3554,22 @@ CREATE TABLE `mlite_veronisa` ( `nosep` varchar(100) NOT NULL, `status` varchar(100) NOT NULL, `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - + PRIMARY KEY (`id`), + KEY `idx_no_rawat` (`no_rawat`), + KEY `idx_status` (`status`), + KEY `idx_nosep` (`nosep`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mlite_veronisa_feedback -# ------------------------------------------------------------ CREATE TABLE `mlite_veronisa_feedback` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nosep` varchar(100) NOT NULL, `tanggal` date DEFAULT NULL, `catatan` text, `username` varchar(100) NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table mutasi_berkas -# ------------------------------------------------------------ CREATE TABLE `mutasi_berkas` ( `no_rawat` varchar(17) NOT NULL, @@ -3585,12 +3581,30 @@ CREATE TABLE `mutasi_berkas` ( `ranap` datetime NOT NULL, PRIMARY KEY (`no_rawat`), CONSTRAINT `mutasi_berkas_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `mutasibarang` ( + `kode_brng` varchar(15) NOT NULL, + `jml` double NOT NULL, + `harga` double NOT NULL, + `kd_bangsaldari` char(5) NOT NULL, + `kd_bangsalke` char(5) NOT NULL, + `tanggal` datetime NOT NULL, + `keterangan` varchar(60) NOT NULL, + `no_batch` varchar(20) NOT NULL, + `no_faktur` varchar(20) NOT NULL, + PRIMARY KEY (`kode_brng`,`kd_bangsaldari`,`kd_bangsalke`,`tanggal`,`no_batch`,`no_faktur`) USING BTREE, + KEY `kd_bangsaldari` (`kd_bangsaldari`) USING BTREE, + KEY `kd_bangsalke` (`kd_bangsalke`) USING BTREE, + KEY `jml` (`jml`) USING BTREE, + KEY `keterangan` (`keterangan`) USING BTREE, + KEY `kode_brng` (`kode_brng`) USING BTREE, + CONSTRAINT `mutasibarang_ibfk_1` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `mutasibarang_ibfk_2` FOREIGN KEY (`kd_bangsaldari`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `mutasibarang_ibfk_3` FOREIGN KEY (`kd_bangsalke`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table obat_racikan -# ------------------------------------------------------------ CREATE TABLE `obat_racikan` ( `tgl_perawatan` date NOT NULL, @@ -3599,7 +3613,7 @@ CREATE TABLE `obat_racikan` ( `no_racik` varchar(2) NOT NULL, `nama_racik` varchar(100) NOT NULL, `kd_racik` varchar(3) NOT NULL, - `jml_dr` int(11) NOT NULL, + `jml_dr` int NOT NULL, `aturan_pakai` varchar(150) NOT NULL, `keterangan` varchar(50) NOT NULL, PRIMARY KEY (`tgl_perawatan`,`jam`,`no_rawat`,`no_racik`), @@ -3608,12 +3622,8 @@ CREATE TABLE `obat_racikan` ( KEY `no_racik` (`no_racik`), CONSTRAINT `obat_racikan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `obat_racikan_ibfk_2` FOREIGN KEY (`kd_racik`) REFERENCES `metode_racik` (`kd_racik`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table obatbhp_ok -# ------------------------------------------------------------ CREATE TABLE `obatbhp_ok` ( `kd_obat` varchar(15) NOT NULL, @@ -3625,12 +3635,8 @@ CREATE TABLE `obatbhp_ok` ( KEY `nm_obat` (`nm_obat`), KEY `hargasatuan` (`hargasatuan`), CONSTRAINT `obatbhp_ok_ibfk_1` FOREIGN KEY (`kode_sat`) REFERENCES `kodesatuan` (`kode_sat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table operasi -# ------------------------------------------------------------ CREATE TABLE `operasi` ( `no_rawat` varchar(17) NOT NULL, @@ -3717,12 +3723,8 @@ CREATE TABLE `operasi` ( CONSTRAINT `operasi_ibfk_42` FOREIGN KEY (`bidan`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `operasi_ibfk_43` FOREIGN KEY (`perawat_luar`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `operasi_ibfk_44` FOREIGN KEY (`kode_paket`) REFERENCES `paket_operasi` (`kode_paket`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table opname -# ------------------------------------------------------------ CREATE TABLE `opname` ( `kode_brng` varchar(15) NOT NULL, @@ -3748,12 +3750,8 @@ CREATE TABLE `opname` ( KEY `kode_brng` (`kode_brng`) USING BTREE, CONSTRAINT `opname_ibfk_1` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `opname_ibfk_2` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table paket_operasi -# ------------------------------------------------------------ CREATE TABLE `paket_operasi` ( `kode_paket` varchar(15) NOT NULL, @@ -3821,12 +3819,8 @@ CREATE TABLE `paket_operasi` ( KEY `bidan3` (`bidan3`), KEY `asisten_operator3_2` (`asisten_operator3`), CONSTRAINT `paket_operasi_ibfk_1` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table pasien -# ------------------------------------------------------------ CREATE TABLE `pasien` ( `no_rkm_medis` varchar(15) NOT NULL, @@ -3850,20 +3844,20 @@ CREATE TABLE `pasien` ( `kd_pj` char(3) NOT NULL, `no_peserta` varchar(25) DEFAULT NULL, `kd_kel` varchar(100) NOT NULL, - `kd_kec` int(11) NOT NULL, - `kd_kab` int(11) NOT NULL, + `kd_kec` int NOT NULL, + `kd_kab` int NOT NULL, `pekerjaanpj` varchar(35) NOT NULL, `alamatpj` varchar(100) NOT NULL, `kelurahanpj` varchar(60) NOT NULL, `kecamatanpj` varchar(60) NOT NULL, `kabupatenpj` varchar(60) NOT NULL, `perusahaan_pasien` varchar(8) NOT NULL, - `suku_bangsa` int(11) NOT NULL, - `bahasa_pasien` int(11) NOT NULL, - `cacat_fisik` int(11) NOT NULL, + `suku_bangsa` int NOT NULL, + `bahasa_pasien` int NOT NULL, + `cacat_fisik` int NOT NULL, `email` varchar(50) NOT NULL, `nip` varchar(30) NOT NULL, - `kd_prop` int(11) NOT NULL, + `kd_prop` int NOT NULL, `propinsipj` varchar(30) NOT NULL, PRIMARY KEY (`no_rkm_medis`), KEY `kd_pj` (`kd_pj`), @@ -3887,15 +3881,11 @@ CREATE TABLE `pasien` ( CONSTRAINT `pasien_ibfk_7` FOREIGN KEY (`bahasa_pasien`) REFERENCES `bahasa_pasien` (`id`) ON UPDATE CASCADE, CONSTRAINT `pasien_ibfk_8` FOREIGN KEY (`cacat_fisik`) REFERENCES `cacat_fisik` (`id`) ON UPDATE CASCADE, CONSTRAINT `pasien_ibfk_9` FOREIGN KEY (`kd_prop`) REFERENCES `propinsi` (`kd_prop`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table pegawai -# ------------------------------------------------------------ CREATE TABLE `pegawai` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nik` varchar(20) NOT NULL, `nama` varchar(50) NOT NULL, `jk` enum('Pria','Wanita') NOT NULL, @@ -3921,13 +3911,13 @@ CREATE TABLE `pegawai` ( `bpd` varchar(50) NOT NULL, `rekening` varchar(25) NOT NULL, `stts_aktif` enum('AKTIF','CUTI','KELUAR','TENAGA LUAR') NOT NULL, - `wajibmasuk` tinyint(2) NOT NULL, + `wajibmasuk` tinyint NOT NULL, `pengurang` double NOT NULL, - `indek` tinyint(4) NOT NULL, + `indek` tinyint NOT NULL, `mulai_kontrak` date DEFAULT NULL, - `cuti_diambil` int(11) NOT NULL, + `cuti_diambil` int NOT NULL, `dankes` double NOT NULL, - `photo` varchar(500) DEFAULT NULL, + `photo` TEXT DEFAULT NULL, `no_ktp` varchar(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `nik_2` (`nik`), @@ -3972,22 +3962,12 @@ CREATE TABLE `pegawai` ( CONSTRAINT `pegawai_ibfk_7` FOREIGN KEY (`indexins`) REFERENCES `departemen` (`dep_id`) ON UPDATE CASCADE, CONSTRAINT `pegawai_ibfk_8` FOREIGN KEY (`bpd`) REFERENCES `bank` (`namabank`) ON UPDATE CASCADE, CONSTRAINT `pegawai_ibfk_9` FOREIGN KEY (`kode_emergency`) REFERENCES `emergency_index` (`kode_emergency`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `pegawai` WRITE; -/*!40000 ALTER TABLE `pegawai` DISABLE KEYS */; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -INSERT INTO `pegawai` (`id`, `nik`, `nama`, `jk`, `jbtn`, `jnj_jabatan`, `kode_kelompok`, `kode_resiko`, `kode_emergency`, `departemen`, `bidang`, `stts_wp`, `stts_kerja`, `npwp`, `pendidikan`, `gapok`, `tmp_lahir`, `tgl_lahir`, `alamat`, `kota`, `mulai_kerja`, `ms_kerja`, `indexins`, `bpd`, `rekening`, `stts_aktif`, `wajibmasuk`, `pengurang`, `indek`, `mulai_kontrak`, `cuti_diambil`, `dankes`, `photo`, `no_ktp`) -VALUES - (1,'DR001','dr. Ataaka Muhammad','Pria','-','-','-','-','-','-','-','-','-','-','-',0,'Barabai','2016-06-10','-','Barabai','2019-09-18','<1','-','-','-','AKTIF',0,0,0,'2019-09-18',1,0,'-','0'); -/*!40000 ALTER TABLE `pegawai` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `pegawai` VALUES ("1","DR001","dr. Ataaka Muhammad","Pria","-","-","-","-","-","-","-","-","-","-","-","0","Barabai","2016-06-10","-","Barabai","2019-09-18","<1","-","-","-","AKTIF","0","0","0","2019-09-18","1","0","-","0"); -# Dump of table pemeliharaan_inventaris -# ------------------------------------------------------------ - CREATE TABLE `pemeliharaan_inventaris` ( `no_inventaris` varchar(30) NOT NULL, `tanggal` date NOT NULL, @@ -4000,102 +3980,584 @@ CREATE TABLE `pemeliharaan_inventaris` ( KEY `nip` (`nip`), CONSTRAINT `pemeliharaan_inventaris_ibfk_1` FOREIGN KEY (`no_inventaris`) REFERENCES `inventaris` (`no_inventaris`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `pemeliharaan_inventaris_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `pemeriksaan_ralan` ( + `no_rawat` varchar(17) NOT NULL, + `tgl_perawatan` date NOT NULL, + `jam_rawat` time NOT NULL, + `suhu_tubuh` varchar(5) DEFAULT NULL, + `tensi` varchar(8) NOT NULL, + `nadi` varchar(3) DEFAULT NULL, + `respirasi` varchar(3) DEFAULT NULL, + `tinggi` varchar(5) DEFAULT NULL, + `berat` varchar(5) DEFAULT NULL, + `spo2` varchar(3) NOT NULL, + `gcs` varchar(10) DEFAULT NULL, + `kesadaran` enum('Compos Mentis','Somnolence','Sopor','Coma') NOT NULL, + `keluhan` TEXT DEFAULT NULL, + `pemeriksaan` TEXT DEFAULT NULL, + `alergi` varchar(50) DEFAULT NULL, + `lingkar_perut` varchar(5) DEFAULT NULL, + `rtl` TEXT NOT NULL, + `penilaian` TEXT NOT NULL, + `instruksi` TEXT NOT NULL, + `evaluasi` TEXT NOT NULL, + `nip` varchar(20) NOT NULL, + PRIMARY KEY (`no_rawat`,`tgl_perawatan`,`jam_rawat`) USING BTREE, + KEY `no_rawat` (`no_rawat`), + KEY `nip` (`nip`) USING BTREE, + CONSTRAINT `pemeriksaan_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `pemeriksaan_ralan_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `pegawai` (`nik`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `pemeriksaan_ranap` ( + `no_rawat` varchar(17) NOT NULL, + `tgl_perawatan` date NOT NULL, + `jam_rawat` time NOT NULL, + `suhu_tubuh` varchar(5) DEFAULT NULL, + `tensi` varchar(8) NOT NULL, + `nadi` varchar(3) DEFAULT NULL, + `respirasi` varchar(3) DEFAULT NULL, + `tinggi` varchar(5) DEFAULT NULL, + `berat` varchar(5) DEFAULT NULL, + `spo2` varchar(3) NOT NULL, + `gcs` varchar(10) DEFAULT NULL, + `kesadaran` enum('Compos Mentis','Somnolence','Sopor','Coma') NOT NULL, + `keluhan` TEXT DEFAULT NULL, + `pemeriksaan` TEXT DEFAULT NULL, + `alergi` varchar(50) DEFAULT NULL, + `penilaian` TEXT NOT NULL, + `rtl` TEXT NOT NULL, + `instruksi` TEXT NOT NULL, + `evaluasi` TEXT NOT NULL, + `nip` varchar(20) NOT NULL, + PRIMARY KEY (`no_rawat`,`tgl_perawatan`,`jam_rawat`), + KEY `no_rawat` (`no_rawat`), + KEY `nip` (`nip`), + CONSTRAINT `pemeriksaan_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `pemeriksaan_ranap_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `pegawai` (`nik`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; +CREATE TABLE `pendidikan` ( + `tingkat` varchar(80) NOT NULL, + `indek` tinyint NOT NULL, + `gapok1` double NOT NULL, + `kenaikan` double NOT NULL, + `maksimal` int NOT NULL, + PRIMARY KEY (`tingkat`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +INSERT INTO `pendidikan` VALUES ("-","1","0","0","1"); + + +CREATE TABLE `penilaian_awal_keperawatan_igd` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `keluhan_utama` text NOT NULL, + `rpd` text NOT NULL, + `rpo` text NOT NULL, + `status_kehamilan` enum('Tidak Hamil','Hamil') NOT NULL, + `gravida` varchar(20) DEFAULT NULL, + `para` varchar(20) DEFAULT NULL, + `abortus` varchar(20) DEFAULT NULL, + `hpht` varchar(20) DEFAULT NULL, + `tekanan` enum('TAK','Sakit Kepala','Muntah','Pusing','Bingung') NOT NULL, + `pupil` enum('Normal','Miosis','Isokor','Anisokor') NOT NULL, + `neurosensorik` enum('TAK','Spasme Otot','Perubahan Sensorik','Perubahan Motorik','Perubahan Bentuk Ekstremitas','Penurunan Tingkat Kesadaran','Fraktur/Dislokasi','Luksasio','Kerusakan Jaringan/Luka') NOT NULL, + `integumen` enum('TAK','Luka Bakar','Luka Robek','Lecet','Luka Decubitus','Luka Gangren') NOT NULL, + `turgor` enum('Baik','Menurun') NOT NULL, + `edema` enum('Tidak Ada','Ekstremitas','Seluruh Tubuh','Asites','Palpebrae') NOT NULL, + `mukosa` enum('Lembab','Kering') NOT NULL, + `perdarahan` enum('Tidak Ada','Ada') NOT NULL, + `jumlah_perdarahan` char(5) DEFAULT NULL, + `warna_perdarahan` varchar(40) DEFAULT '', + `intoksikasi` enum('Tidak Ada','Ada','Gigitan Binatang','Zat Kimia','Gas','Obat') NOT NULL, + `bab` char(2) DEFAULT NULL, + `xbab` varchar(10) DEFAULT NULL, + `kbab` varchar(40) DEFAULT NULL, + `wbab` varchar(40) DEFAULT NULL, + `bak` char(2) DEFAULT NULL, + `xbak` varchar(10) DEFAULT NULL, + `wbak` varchar(40) DEFAULT '', + `lbak` varchar(40) DEFAULT '', + `psikologis` enum('Tidak Ada Masalah','Marah','Takut','Depresi','Cepat Lelah','Cemas','Gelisah','Lain-lain') NOT NULL, + `jiwa` enum('Ya','Tidak') NOT NULL, + `perilaku` enum('Perilaku Kekerasan','Gangguan Efek','Gangguan Memori','Halusinasi','Kecenderungan Percobaan Bunuh Diri','Lainnya','-') NOT NULL, + `dilaporkan` varchar(50) DEFAULT NULL, + `sebutkan` varchar(50) DEFAULT NULL, + `hubungan` enum('Harmonis','Kurang Harmonis','Tidak Harmonis','Konflik Besar') NOT NULL, + `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, + `ket_tinggal` varchar(50) DEFAULT '', + `budaya` enum('Tidak Ada','Ada') NOT NULL, + `ket_budaya` varchar(50) NOT NULL, + `pendidikan_pj` enum('-','TS','TK','SD','SMP','SMA','SLTA/SEDERAJAT','D1','D2','D3','D4','S1','S2','S3') NOT NULL, + `ket_pendidikan_pj` varchar(50) DEFAULT NULL, + `edukasi` enum('Pasien','Keluarga') NOT NULL, + `ket_edukasi` varchar(50) NOT NULL, + `kemampuan` enum('Mandiri','Bantuan Minimal','Bantuan Sebagian','Ketergantungan Total') NOT NULL, + `aktifitas` enum('Tirah Baring','Duduk','Berjalan') NOT NULL, + `alat_bantu` enum('Tidak','Ya') NOT NULL, + `ket_bantu` varchar(50) DEFAULT '', + `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, + `provokes` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, + `ket_provokes` varchar(40) NOT NULL, + `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, + `ket_quality` varchar(50) NOT NULL, + `lokasi` varchar(50) NOT NULL, + `menyebar` enum('Tidak','Ya') NOT NULL, + `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, + `durasi` varchar(25) NOT NULL, + `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, + `ket_nyeri` varchar(40) DEFAULT NULL, + `pada_dokter` enum('Tidak','Ya') NOT NULL, + `ket_dokter` varchar(15) DEFAULT NULL, + `berjalan_a` enum('Ya','Tidak') NOT NULL, + `berjalan_b` enum('Ya','Tidak') NOT NULL, + `berjalan_c` enum('Ya','Tidak') NOT NULL, + `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, + `lapor` enum('Ya','Tidak') NOT NULL, + `ket_lapor` varchar(15) DEFAULT NULL, + `rencana` text NOT NULL, + `nip` varchar(20) NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `nip` (`nip`) USING BTREE, + CONSTRAINT `penilaian_awal_keperawatan_igd_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_awal_keperawatan_igd_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `penilaian_awal_keperawatan_ralan` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `td` varchar(8) NOT NULL DEFAULT '', + `nadi` varchar(5) NOT NULL DEFAULT '', + `rr` varchar(5) NOT NULL, + `suhu` varchar(5) NOT NULL DEFAULT '', + `gcs` varchar(5) NOT NULL, + `bb` varchar(5) NOT NULL DEFAULT '', + `tb` varchar(5) NOT NULL DEFAULT '', + `bmi` varchar(10) NOT NULL, + `keluhan_utama` varchar(150) NOT NULL DEFAULT '', + `rpd` varchar(100) NOT NULL DEFAULT '', + `rpk` varchar(100) NOT NULL, + `rpo` varchar(100) NOT NULL, + `alergi` varchar(25) NOT NULL DEFAULT '', + `alat_bantu` enum('Tidak','Ya') NOT NULL, + `ket_bantu` varchar(50) NOT NULL DEFAULT '', + `prothesa` enum('Tidak','Ya') NOT NULL, + `ket_pro` varchar(50) NOT NULL, + `adl` enum('Mandiri','Dibantu') NOT NULL, + `status_psiko` enum('Tenang','Takut','Cemas','Depresi','Lain-lain') NOT NULL, + `ket_psiko` varchar(70) NOT NULL, + `hub_keluarga` enum('Baik','Tidak Baik') NOT NULL, + `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, + `ket_tinggal` varchar(40) NOT NULL, + `ekonomi` enum('Baik','Cukup','Kurang') NOT NULL, + `budaya` enum('Tidak Ada','Ada') NOT NULL, + `ket_budaya` varchar(50) NOT NULL, + `edukasi` enum('Pasien','Keluarga') NOT NULL, + `ket_edukasi` varchar(50) NOT NULL, + `berjalan_a` enum('Ya','Tidak') NOT NULL, + `berjalan_b` enum('Ya','Tidak') NOT NULL, + `berjalan_c` enum('Ya','Tidak') NOT NULL, + `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, + `lapor` enum('Ya','Tidak') NOT NULL, + `ket_lapor` varchar(15) NOT NULL, + `sg1` enum('Tidak','Tidak Yakin','Ya, 1-5 Kg','Ya, 6-10 Kg','Ya, 11-15 Kg','Ya, >15 Kg') NOT NULL, + `nilai1` enum('0','1','2','3','4') NOT NULL, + `sg2` enum('Ya','Tidak') NOT NULL, + `nilai2` enum('0','1') NOT NULL, + `total_hasil` tinyint NOT NULL, + `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, + `provokes` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, + `ket_provokes` varchar(40) NOT NULL, + `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, + `ket_quality` varchar(50) NOT NULL, + `lokasi` varchar(50) NOT NULL, + `menyebar` enum('Tidak','Ya') NOT NULL, + `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, + `durasi` varchar(25) NOT NULL, + `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, + `ket_nyeri` varchar(40) NOT NULL, + `pada_dokter` enum('Tidak','Ya') NOT NULL, + `ket_dokter` varchar(15) NOT NULL, + `rencana` varchar(200) NOT NULL, + `nip` varchar(20) NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `nip` (`nip`) USING BTREE, + CONSTRAINT `penilaian_awal_keperawatan_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_awal_keperawatan_ralan_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `penilaian_awal_keperawatan_ranap` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `ket_informasi` varchar(30) NOT NULL, + `tiba_diruang_rawat` enum('Jalan Tanpa Bantuan','Kursi Roda','Brankar') NOT NULL, + `kasus_trauma` enum('Trauma','Non Trauma') DEFAULT NULL, + `cara_masuk` enum('Poli','IGD','Lain-lain') NOT NULL, + `rps` TEXT NOT NULL, + `rpd` TEXT NOT NULL, + `rpk` TEXT NOT NULL, + `rpo` TEXT NOT NULL, + `riwayat_pembedahan` TEXT NOT NULL, + `riwayat_dirawat_dirs` TEXT NOT NULL, + `alat_bantu_dipakai` enum('Kacamata','Prothesa','Alat Bantu Dengar','Lain-lain') NOT NULL, + `riwayat_kehamilan` enum('Tidak','Ya') NOT NULL, + `riwayat_kehamilan_perkiraan` TEXT NOT NULL, + `riwayat_tranfusi` TEXT NOT NULL, + `riwayat_alergi` TEXT NOT NULL, + `riwayat_merokok` enum('Tidak','Ya') NOT NULL, + `riwayat_merokok_jumlah` varchar(5) NOT NULL, + `riwayat_alkohol` enum('Tidak','Ya') NOT NULL, + `riwayat_alkohol_jumlah` varchar(5) NOT NULL, + `riwayat_narkoba` enum('Tidak','Ya') NOT NULL, + `riwayat_olahraga` enum('Tidak','Ya') NOT NULL, + `pemeriksaan_mental` TEXT NOT NULL, + `pemeriksaan_keadaan_umum` enum('Baik','Sedang','Buruk') NOT NULL, + `pemeriksaan_gcs` varchar(10) NOT NULL, + `pemeriksaan_td` varchar(8) NOT NULL, + `pemeriksaan_nadi` varchar(5) NOT NULL, + `pemeriksaan_rr` varchar(5) NOT NULL, + `pemeriksaan_suhu` varchar(5) NOT NULL, + `pemeriksaan_spo2` varchar(5) NOT NULL, + `pemeriksaan_bb` varchar(5) NOT NULL, + `pemeriksaan_tb` varchar(5) NOT NULL, + `pemeriksaan_susunan_kepala` enum('TAK','Hydrocephalus','Hematoma','Lain-lain') NOT NULL, + `pemeriksaan_susunan_kepala_keterangan` TEXT NOT NULL, + `pemeriksaan_susunan_wajah` enum('TAK','Asimetris','Kelainan Kongenital') NOT NULL, + `pemeriksaan_susunan_wajah_keterangan` TEXT NOT NULL, + `pemeriksaan_susunan_leher` enum('TAK','Kaku Kuduk','Pembesaran Thyroid','Pembesaran KGB') NOT NULL, + `pemeriksaan_susunan_kejang` enum('TAK','Kuat','Ada') NOT NULL, + `pemeriksaan_susunan_kejang_keterangan` TEXT NOT NULL, + `pemeriksaan_susunan_sensorik` enum('TAK','Sakit Nyeri','Rasa kebas') NOT NULL, + `pemeriksaan_kardiovaskuler_denyut_nadi` enum('Teratur','Tidak Teratur') NOT NULL, + `pemeriksaan_kardiovaskuler_sirkulasi` enum('Akral Hangat','Akral Dingin','Edema') NOT NULL, + `pemeriksaan_kardiovaskuler_sirkulasi_keterangan` TEXT NOT NULL, + `pemeriksaan_kardiovaskuler_pulsasi` enum('Kuat','Lemah','Lain-lain') NOT NULL, + `pemeriksaan_respirasi_pola_nafas` enum('Normal','Bradipnea','Tachipnea') NOT NULL, + `pemeriksaan_respirasi_retraksi` enum('Tidak Ada','Ringan','Berat') NOT NULL, + `pemeriksaan_respirasi_suara_nafas` enum('Vesikuler','Wheezing','Rhonki') NOT NULL, + `pemeriksaan_respirasi_volume_pernafasan` enum('Normal','Hiperventilasi','Hipoventilasi') NOT NULL, + `pemeriksaan_respirasi_jenis_pernafasan` enum('Pernafasan Dada','Alat Bantu Pernafasaan') NOT NULL, + `pemeriksaan_respirasi_jenis_pernafasan_keterangan` TEXT NOT NULL, + `pemeriksaan_respirasi_irama_nafas` enum('Teratur','Tidak Teratur') NOT NULL, + `pemeriksaan_respirasi_batuk` enum('Tidak','Ya : Produktif','Ya : Non Produktif') NOT NULL, + `pemeriksaan_gastrointestinal_mulut` enum('TAK','Stomatitis','Mukosa Kering','Bibir Pucat','Lain-lain') NOT NULL, + `pemeriksaan_gastrointestinal_mulut_keterangan` TEXT NOT NULL, + `pemeriksaan_gastrointestinal_gigi` enum('TAK','Karies','Goyang','Lain-lain') NOT NULL, + `pemeriksaan_gastrointestinal_gigi_keterangan` TEXT NOT NULL, + `pemeriksaan_gastrointestinal_lidah` enum('TAK','Kotor','Gerak Asimetris','Lain-lain') NOT NULL, + `pemeriksaan_gastrointestinal_lidah_keterangan` TEXT NOT NULL, + `pemeriksaan_gastrointestinal_tenggorokan` enum('TAK','Gangguan Menelan','Sakit Menelan','Lain-lain') NOT NULL, + `pemeriksaan_gastrointestinal_tenggorokan_keterangan` TEXT NOT NULL, + `pemeriksaan_gastrointestinal_abdomen` enum('Supel','Asictes',' Tegang','Nyeri Tekan/Lepas','Lain-lain') NOT NULL, + `pemeriksaan_gastrointestinal_abdomen_keterangan` TEXT NOT NULL, + `pemeriksaan_gastrointestinal_peistatik_usus` enum('TAK','Tidak Ada Bising Usus','Hiperistaltik') NOT NULL, + `pemeriksaan_gastrointestinal_anus` enum('TAK','Atresia Ani') NOT NULL, + `pemeriksaan_neurologi_pengelihatan` enum('TAK','Ada Kelainan') NOT NULL, + `pemeriksaan_neurologi_pengelihatan_keterangan` TEXT NOT NULL, + `pemeriksaan_neurologi_alat_bantu_penglihatan` enum('Tidak','Kacamata','Lensa Kontak') NOT NULL, + `pemeriksaan_neurologi_pendengaran` enum('TAK','Berdengung','Nyeri','Tuli','Keluar Cairan','Lain-lain') NOT NULL, + `pemeriksaan_neurologi_bicara` enum('Jelas','Tidak Jelas') NOT NULL, + `pemeriksaan_neurologi_bicara_keterangan` TEXT NOT NULL, + `pemeriksaan_neurologi_sensorik` enum('TAK','Sakit Nyeri','Rasa Kebas','Lain-lain') NOT NULL, + `pemeriksaan_neurologi_motorik` enum('TAK','Hemiparese','Tetraparese','Tremor','Lain-lain') NOT NULL, + `pemeriksaan_neurologi_kekuatan_otot` enum('Kuat','Lemah') NOT NULL, + `pemeriksaan_integument_warnakulit` enum('Pucat','Sianosis','Normal','Lain-lain') NOT NULL, + `pemeriksaan_integument_turgor` enum('Baik','Sedang','Buruk') NOT NULL, + `pemeriksaan_integument_kulit` enum('Normal','Rash/Kemerahan','Luka','Memar','Ptekie','Bula') NOT NULL, + `pemeriksaan_integument_dekubitas` enum('Tidak Ada','Usia > 65 tahun','Obesitas','Imobilisasi','Paraplegi/Vegetative State','Dirawat Di HCU','Penyakit Kronis (DM, CHF, CKD)','Inkontinentia Uri/Alvi') NOT NULL, + `pemeriksaan_muskuloskletal_pergerakan_sendi` enum('Bebas','Terbatas') NOT NULL, + `pemeriksaan_muskuloskletal_kekauatan_otot` enum('Baik','Lemah','Tremor') NOT NULL, + `pemeriksaan_muskuloskletal_nyeri_sendi` enum('Tidak Ada','Ada') NOT NULL, + `pemeriksaan_muskuloskletal_nyeri_sendi_keterangan` TEXT NOT NULL, + `pemeriksaan_muskuloskletal_oedema` enum('Tidak Ada','Ada') NOT NULL, + `pemeriksaan_muskuloskletal_oedema_keterangan` TEXT NOT NULL, + `pemeriksaan_muskuloskletal_fraktur` enum('Tidak Ada','Ada') NOT NULL, + `pemeriksaan_muskuloskletal_fraktur_keterangan` TEXT NOT NULL, + `pemeriksaan_eliminasi_bab_frekuensi_jumlah` varchar(5) NOT NULL, + `pemeriksaan_eliminasi_bab_frekuensi_durasi` varchar(10) NOT NULL, + `pemeriksaan_eliminasi_bab_konsistensi` varchar(30) NOT NULL, + `pemeriksaan_eliminasi_bab_warna` varchar(30) NOT NULL, + `pemeriksaan_eliminasi_bak_frekuensi_jumlah` varchar(5) NOT NULL, + `pemeriksaan_eliminasi_bak_frekuensi_durasi` varchar(10) NOT NULL, + `pemeriksaan_eliminasi_bak_warna` varchar(30) NOT NULL, + `pemeriksaan_eliminasi_bak_lainlain` varchar(30) NOT NULL, + `pola_aktifitas_makanminum` enum('Mandiri','Bantuan Orang Lain') NOT NULL, + `pola_aktifitas_mandi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, + `pola_aktifitas_eliminasi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, + `pola_aktifitas_berpakaian` enum('Mandiri','Bantuan Orang Lain') NOT NULL, + `pola_aktifitas_berpindah` enum('Mandiri','Bantuan Orang Lain') NOT NULL, + `pola_nutrisi_frekuesi_makan` varchar(3) NOT NULL, + `pola_nutrisi_jenis_makanan` varchar(20) NOT NULL, + `pola_nutrisi_porsi_makan` varchar(3) NOT NULL, + `pola_tidur_lama_tidur` varchar(3) NOT NULL, + `pola_tidur_gangguan` enum('Tidak Ada Gangguan','Insomnia') NOT NULL, + `pengkajian_fungsi_kemampuan_sehari` enum('Mandiri','Bantuan Minimal','Bantuan Sebagian','Ketergantungan Total') NOT NULL, + `pengkajian_fungsi_aktifitas` enum('Tirah Baring','Duduk','Berjalan') NOT NULL, + `pengkajian_fungsi_berjalan` enum('TAK','Penurunan Kekuatan/ROM','Paralisis','Sering Jatuh','Deformitas','Hilang Keseimbangan','Riwayat Patah Tulang','Lain-lain') NOT NULL, + `pengkajian_fungsi_berjalan_keterangan` TEXT NOT NULL, + `pengkajian_fungsi_ambulasi` enum('Walker','Tongkat','Kursi Roda','Tidak Menggunakan') NOT NULL, + `pengkajian_fungsi_ekstrimitas_atas` enum('TAK','Lemah','Oedema','Tidak Simetris','Lain-lain') NOT NULL, + `pengkajian_fungsi_ekstrimitas_atas_keterangan` TEXT NOT NULL, + `pengkajian_fungsi_ekstrimitas_bawah` enum('TAK','Varises','Oedema','Tidak Simetris','Lain-lain') NOT NULL, + `pengkajian_fungsi_ekstrimitas_bawah_keterangan` TEXT NOT NULL, + `pengkajian_fungsi_menggenggam` enum('Tidak Ada Kesulitan','Terakhir','Lain-lain') NOT NULL, + `pengkajian_fungsi_menggenggam_keterangan` TEXT NOT NULL, + `pengkajian_fungsi_koordinasi` enum('Tidak Ada Kesulitan','Ada Masalah') NOT NULL, + `pengkajian_fungsi_koordinasi_keterangan` TEXT NOT NULL, + `pengkajian_fungsi_kesimpulan` enum('Ya (Co DPJP)','Tidak (Tidak Perlu Co DPJP)') NOT NULL, + `riwayat_psiko_kondisi_psiko` enum('Tidak Ada Masalah','Marah','Takut','Depresi','Cepat Lelah','Cemas','Gelisah','Sulit Tidur','Lain-lain') NOT NULL, + `riwayat_psiko_gangguan_jiwa` enum('Ya','Tidak') NOT NULL, + `riwayat_psiko_perilaku` enum('Tidak Ada Masalah','Perilaku Kekerasan','Gangguan Efek','Gangguan Memori','Halusinasi','Kecenderungan Percobaan Bunuh Diri','Lain-lain') NOT NULL, + `riwayat_psiko_perilaku_keterangan` TEXT NOT NULL, + `riwayat_psiko_hubungan_keluarga` enum('Harmonis','Kurang Harmonis','Tidak Harmonis','Konflik Besar') NOT NULL, + `riwayat_psiko_tinggal` enum('Sendiri','Orang Tua','Suami/Istri','Keluarga','Lain-lain') NOT NULL, + `riwayat_psiko_tinggal_keterangan` TEXT NOT NULL, + `riwayat_psiko_nilai_kepercayaan` enum('Tidak Ada','Ada') NOT NULL, + `riwayat_psiko_nilai_kepercayaan_keterangan` TEXT NOT NULL, + `riwayat_psiko_pendidikan_pj` enum('-','TS','TK','SD','SMP','SMA','SLTA/SEDERAJAT','D1','D2','D3','D4','S1','S2','S3') NOT NULL, + `riwayat_psiko_edukasi_diberikan` enum('Pasien','Keluarga') NOT NULL, + `riwayat_psiko_edukasi_diberikan_keterangan` TEXT NOT NULL, + `penilaian_nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, + `penilaian_nyeri_penyebab` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, + `penilaian_nyeri_ket_penyebab` TEXT NOT NULL, + `penilaian_nyeri_kualitas` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, + `penilaian_nyeri_ket_kualitas` TEXT NOT NULL, + `penilaian_nyeri_lokasi` TEXT NOT NULL, + `penilaian_nyeri_menyebar` enum('Tidak','Ya') NOT NULL, + `penilaian_nyeri_skala` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, + `penilaian_nyeri_waktu` varchar(5) NOT NULL, + `penilaian_nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, + `penilaian_nyeri_ket_hilang` TEXT NOT NULL, + `penilaian_nyeri_diberitahukan_dokter` enum('Tidak','Ya') NOT NULL, + `penilaian_nyeri_jam_diberitahukan_dokter` varchar(10) NOT NULL, + `penilaian_jatuhmorse_skala1` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhmorse_nilai1` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_skala2` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhmorse_nilai2` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_skala3` enum('Tidak Ada/Kursi Roda/Perawat/Tirah Baring','Tongkat/Alat Penopang','Berpegangan Pada Perabot') DEFAULT NULL, + `penilaian_jatuhmorse_nilai3` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_skala4` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhmorse_nilai4` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_skala5` enum('Normal/Tirah Baring/Imobilisasi','Lemah','Terganggu') DEFAULT NULL, + `penilaian_jatuhmorse_nilai5` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_skala6` enum('Sadar Akan Kemampuan Diri Sendiri','Sering Lupa Akan Keterbatasan Yang Dimiliki') DEFAULT NULL, + `penilaian_jatuhmorse_nilai6` tinyint DEFAULT NULL, + `penilaian_jatuhmorse_totalnilai` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala1` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai1` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala2` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai2` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala3` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai3` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala4` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai4` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala5` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai5` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala6` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai6` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala7` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai7` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala8` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai8` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala9` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai9` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala10` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai10` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_skala11` enum('Tidak','Ya') DEFAULT NULL, + `penilaian_jatuhsydney_nilai11` tinyint DEFAULT NULL, + `penilaian_jatuhsydney_totalnilai` tinyint DEFAULT NULL, + `skrining_gizi1` enum('Tidak ada penurunan berat badan','Tidak yakin/ tidak tahu/ terasa baju lebih longgar','Ya 1-5 kg','Ya 6-10 kg','Ya 11-15 kg','Ya > 15 kg') DEFAULT NULL, + `nilai_gizi1` int DEFAULT NULL, + `skrining_gizi2` enum('Tidak','Ya') DEFAULT NULL, + `nilai_gizi2` int DEFAULT NULL, + `nilai_total_gizi` double DEFAULT NULL, + `skrining_gizi_diagnosa_khusus` enum('Tidak','Ya') DEFAULT NULL, + `skrining_gizi_ket_diagnosa_khusus` TEXT, + `skrining_gizi_diketahui_dietisen` enum('Tidak','Ya') DEFAULT NULL, + `skrining_gizi_jam_diketahui_dietisen` varchar(10) DEFAULT NULL, + `rencana` TEXT, + `nip1` varchar(20) NOT NULL, + `nip2` varchar(20) NOT NULL, + `kd_dokter` varchar(20) NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `nip1` (`nip1`) USING BTREE, + KEY `nip2` (`nip2`) USING BTREE, + KEY `kd_dokter` (`kd_dokter`) USING BTREE, + CONSTRAINT `penilaian_awal_keperawatan_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_awal_keperawatan_ranap_ibfk_2` FOREIGN KEY (`nip1`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_awal_keperawatan_ranap_ibfk_3` FOREIGN KEY (`nip2`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_awal_keperawatan_ranap_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `penilaian_medis_igd` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `kd_dokter` varchar(20) NOT NULL, + `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `hubungan` varchar(100) NOT NULL, + `keluhan_utama` TEXT NOT NULL DEFAULT '', + `rps` TEXT NOT NULL, + `rpd` TEXT NOT NULL DEFAULT '', + `rpk` TEXT NOT NULL, + `rpo` TEXT NOT NULL, + `alergi` varchar(100) NOT NULL DEFAULT '', + `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, + `gcs` varchar(10) NOT NULL, + `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, + `td` varchar(8) NOT NULL DEFAULT '', + `nadi` varchar(5) NOT NULL DEFAULT '', + `rr` varchar(5) NOT NULL, + `suhu` varchar(5) NOT NULL DEFAULT '', + `spo` varchar(5) NOT NULL, + `bb` varchar(5) NOT NULL DEFAULT '', + `tb` varchar(5) NOT NULL DEFAULT '', + `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `leher` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ket_fisik` text NOT NULL, + `ket_lokalis` text NOT NULL, + `ekg` text NOT NULL, + `rad` text NOT NULL, + `lab` text NOT NULL, + `diagnosis` TEXT NOT NULL, + `tata` text NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `kd_dokter` (`kd_dokter`) USING BTREE, + CONSTRAINT `penilaian_medis_igd_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_medis_igd_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; + + +CREATE TABLE `penilaian_medis_ralan` ( + `no_rawat` varchar(17) NOT NULL, + `tanggal` datetime NOT NULL, + `kd_dokter` varchar(20) NOT NULL, + `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `hubungan` varchar(30) NOT NULL, + `keluhan_utama` TEXT NOT NULL DEFAULT '', + `rps` TEXT NOT NULL, + `rpd` TEXT NOT NULL DEFAULT '', + `rpk` TEXT NOT NULL, + `rpo` TEXT NOT NULL, + `alergi` varchar(50) NOT NULL DEFAULT '', + `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, + `gcs` varchar(10) NOT NULL, + `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, + `td` varchar(8) NOT NULL DEFAULT '', + `nadi` varchar(5) NOT NULL DEFAULT '', + `rr` varchar(5) NOT NULL, + `suhu` varchar(5) NOT NULL DEFAULT '', + `spo` varchar(5) NOT NULL, + `bb` varchar(5) NOT NULL DEFAULT '', + `tb` varchar(5) NOT NULL DEFAULT '', + `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ket_fisik` text NOT NULL, + `ket_lokalis` text NOT NULL, + `penunjang` text NOT NULL, + `diagnosis` TEXT NOT NULL, + `tata` text NOT NULL, + `konsulrujuk` TEXT NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `kd_dokter` (`kd_dokter`) USING BTREE, + CONSTRAINT `penilaian_medis_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_medis_ralan_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table pemeriksaan_ralan -# ------------------------------------------------------------ -CREATE TABLE `pemeriksaan_ralan` ( +CREATE TABLE `penilaian_medis_ranap` ( `no_rawat` varchar(17) NOT NULL, - `tgl_perawatan` date NOT NULL, - `jam_rawat` time NOT NULL, - `suhu_tubuh` varchar(5) DEFAULT NULL, - `tensi` varchar(8) NOT NULL, - `nadi` varchar(3) DEFAULT NULL, - `respirasi` varchar(3) DEFAULT NULL, - `tinggi` varchar(5) DEFAULT NULL, - `berat` varchar(5) DEFAULT NULL, - `spo2` varchar(3) NOT NULL, - `gcs` varchar(10) DEFAULT NULL, - `kesadaran` enum('Compos Mentis','Somnolence','Sopor','Coma') NOT NULL, - `keluhan` varchar(2000) DEFAULT NULL, - `pemeriksaan` varchar(2000) DEFAULT NULL, - `alergi` varchar(50) DEFAULT NULL, - `lingkar_perut` varchar(5) DEFAULT NULL, - `rtl` varchar(2000) NOT NULL, - `penilaian` varchar(2000) NOT NULL, - `instruksi` varchar(2000) NOT NULL, - `evaluasi` varchar(2000) NOT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`,`tgl_perawatan`,`jam_rawat`) USING BTREE, - KEY `no_rawat` (`no_rawat`), - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `pemeriksaan_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `pemeriksaan_ralan_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `pegawai` (`nik`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - + `tanggal` datetime NOT NULL, + `kd_dokter` varchar(20) NOT NULL, + `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, + `hubungan` varchar(100) NOT NULL, + `keluhan_utama` TEXT NOT NULL DEFAULT '', + `rps` TEXT NOT NULL, + `rpd` TEXT NOT NULL DEFAULT '', + `rpk` TEXT NOT NULL, + `rpo` TEXT NOT NULL, + `alergi` varchar(100) NOT NULL DEFAULT '', + `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, + `gcs` varchar(10) NOT NULL, + `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, + `td` varchar(8) NOT NULL DEFAULT '', + `nadi` varchar(5) NOT NULL DEFAULT '', + `rr` varchar(5) NOT NULL, + `suhu` varchar(5) NOT NULL DEFAULT '', + `spo` varchar(5) NOT NULL, + `bb` varchar(5) NOT NULL DEFAULT '', + `tb` varchar(5) NOT NULL DEFAULT '', + `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `jantung` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `paru` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, + `ket_fisik` text NOT NULL, + `ket_lokalis` text NOT NULL, + `lab` text NOT NULL, + `rad` text NOT NULL, + `penunjang` text NOT NULL, + `diagnosis` TEXT NOT NULL, + `tata` text NOT NULL, + `edukasi` TEXT NOT NULL, + PRIMARY KEY (`no_rawat`) USING BTREE, + KEY `kd_dokter` (`kd_dokter`) USING BTREE, + CONSTRAINT `penilaian_medis_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_medis_ranap_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table pemeriksaan_ranap -# ------------------------------------------------------------ -CREATE TABLE `pemeriksaan_ranap` ( +CREATE TABLE `penilaian_ulang_nyeri` ( `no_rawat` varchar(17) NOT NULL, - `tgl_perawatan` date NOT NULL, - `jam_rawat` time NOT NULL, - `suhu_tubuh` varchar(5) DEFAULT NULL, - `tensi` varchar(8) NOT NULL, - `nadi` varchar(3) DEFAULT NULL, - `respirasi` varchar(3) DEFAULT NULL, - `tinggi` varchar(5) DEFAULT NULL, - `berat` varchar(5) DEFAULT NULL, - `spo2` varchar(3) NOT NULL, - `gcs` varchar(10) DEFAULT NULL, - `kesadaran` enum('Compos Mentis','Somnolence','Sopor','Coma') NOT NULL, - `keluhan` varchar(2000) DEFAULT NULL, - `pemeriksaan` varchar(2000) DEFAULT NULL, - `alergi` varchar(50) DEFAULT NULL, - `penilaian` varchar(2000) NOT NULL, - `rtl` varchar(2000) NOT NULL, - `instruksi` varchar(2000) NOT NULL, - `evaluasi` varchar(2000) NOT NULL, + `tanggal` datetime NOT NULL, + `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, + `provokes` enum('Proses Penyakit','Benturan','Lain-lain','-') NOT NULL, + `ket_provokes` varchar(40) NOT NULL, + `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain','-') NOT NULL, + `ket_quality` varchar(50) NOT NULL, + `lokasi` varchar(50) NOT NULL, + `menyebar` enum('Tidak','Ya') NOT NULL, + `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, + `durasi` varchar(25) NOT NULL, + `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat','-') NOT NULL, + `ket_nyeri` varchar(40) NOT NULL, `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`,`tgl_perawatan`,`jam_rawat`), - KEY `no_rawat` (`no_rawat`), - KEY `nip` (`nip`), - CONSTRAINT `pemeriksaan_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `pemeriksaan_ranap_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `pegawai` (`nik`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table pendidikan -# ------------------------------------------------------------ - -CREATE TABLE `pendidikan` ( - `tingkat` varchar(80) NOT NULL, - `indek` tinyint(4) NOT NULL, - `gapok1` double NOT NULL, - `kenaikan` double NOT NULL, - `maksimal` int(11) NOT NULL, - PRIMARY KEY (`tingkat`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `pendidikan` WRITE; -/*!40000 ALTER TABLE `pendidikan` DISABLE KEYS */; - -INSERT INTO `pendidikan` (`tingkat`, `indek`, `gapok1`, `kenaikan`, `maksimal`) -VALUES - ('-',1,0,0,1); - -/*!40000 ALTER TABLE `pendidikan` ENABLE KEYS */; -UNLOCK TABLES; - + PRIMARY KEY (`no_rawat`,`tanggal`) USING BTREE, + KEY `nip` (`nip`) USING BTREE, + CONSTRAINT `penilaian_ulang_nyeri_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `penilaian_ulang_nyeri_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table penjab -# ------------------------------------------------------------ CREATE TABLE `penjab` ( `kd_pj` char(3) NOT NULL, @@ -4106,23 +4568,13 @@ CREATE TABLE `penjab` ( `attn` varchar(60) NOT NULL, `status` enum('0','1') NOT NULL, PRIMARY KEY (`kd_pj`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `penjab` WRITE; -/*!40000 ALTER TABLE `penjab` DISABLE KEYS */; - -INSERT INTO `penjab` (`kd_pj`, `png_jawab`, `nama_perusahaan`, `alamat_asuransi`, `no_telp`, `attn`, `status`) -VALUES - ('-','-','-','-','0','0','1'), - ('BPJ','BPJS Kesehatan','-','-','0','0','1'), - ('UMU','Umum','-','-','0','0','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `penjab` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `penjab` VALUES ("-","-","-","-","0","0","1"), +("BPJ","BPJS Kesehatan","-","-","0","0","1"), +("UMU","Umum","-","-","0","0","1"); -# Dump of table penyakit -# ------------------------------------------------------------ CREATE TABLE `penyakit` ( `kd_penyakit` varchar(10) NOT NULL, @@ -4136,12 +4588,8 @@ CREATE TABLE `penyakit` ( KEY `nm_penyakit` (`nm_penyakit`), KEY `status` (`status`), CONSTRAINT `penyakit_ibfk_1` FOREIGN KEY (`kd_ktg`) REFERENCES `kategori_penyakit` (`kd_ktg`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table perbaikan_inventaris -# ------------------------------------------------------------ CREATE TABLE `perbaikan_inventaris` ( `no_permintaan` varchar(15) NOT NULL, @@ -4156,12 +4604,8 @@ CREATE TABLE `perbaikan_inventaris` ( KEY `nip` (`nip`), CONSTRAINT `perbaikan_inventaris_ibfk_1` FOREIGN KEY (`no_permintaan`) REFERENCES `permintaan_perbaikan_inventaris` (`no_permintaan`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `perbaikan_inventaris_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table periksa_lab -# ------------------------------------------------------------ CREATE TABLE `periksa_lab` ( `no_rawat` varchar(17) NOT NULL, @@ -4191,12 +4635,8 @@ CREATE TABLE `periksa_lab` ( CONSTRAINT `periksa_lab_ibfk_12` FOREIGN KEY (`dokter_perujuk`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `periksa_lab_ibfk_13` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `periksa_lab_ibfk_9` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table periksa_radiologi -# ------------------------------------------------------------ CREATE TABLE `periksa_radiologi` ( `no_rawat` varchar(17) NOT NULL, @@ -4233,17 +4673,13 @@ CREATE TABLE `periksa_radiologi` ( CONSTRAINT `periksa_radiologi_ibfk_6` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_radiologi` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `periksa_radiologi_ibfk_7` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `periksa_radiologi_ibfk_8` FOREIGN KEY (`dokter_perujuk`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_detail_permintaan_lab -# ------------------------------------------------------------ CREATE TABLE `permintaan_detail_permintaan_lab` ( `noorder` varchar(15) NOT NULL, `kd_jenis_prw` varchar(15) NOT NULL, - `id_template` int(11) NOT NULL, + `id_template` int NOT NULL, `stts_bayar` enum('Sudah','Belum') DEFAULT NULL, PRIMARY KEY (`noorder`,`kd_jenis_prw`,`id_template`) USING BTREE, KEY `id_template` (`id_template`) USING BTREE, @@ -4251,12 +4687,8 @@ CREATE TABLE `permintaan_detail_permintaan_lab` ( CONSTRAINT `permintaan_detail_permintaan_lab_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_lab` (`kd_jenis_prw`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_detail_permintaan_lab_ibfk_3` FOREIGN KEY (`id_template`) REFERENCES `template_laboratorium` (`id_template`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_detail_permintaan_lab_ibfk_4` FOREIGN KEY (`noorder`) REFERENCES `permintaan_lab` (`noorder`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_lab -# ------------------------------------------------------------ CREATE TABLE `permintaan_lab` ( `noorder` varchar(15) NOT NULL, @@ -4276,12 +4708,8 @@ CREATE TABLE `permintaan_lab` ( KEY `no_rawat` (`no_rawat`), CONSTRAINT `permintaan_lab_ibfk_2` FOREIGN KEY (`dokter_perujuk`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_lab_ibfk_3` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_pemeriksaan_lab -# ------------------------------------------------------------ CREATE TABLE `permintaan_pemeriksaan_lab` ( `noorder` varchar(15) NOT NULL, @@ -4291,12 +4719,8 @@ CREATE TABLE `permintaan_pemeriksaan_lab` ( KEY `kd_jenis_prw` (`kd_jenis_prw`), CONSTRAINT `permintaan_pemeriksaan_lab_ibfk_1` FOREIGN KEY (`noorder`) REFERENCES `permintaan_lab` (`noorder`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_pemeriksaan_lab_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_lab` (`kd_jenis_prw`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_pemeriksaan_radiologi -# ------------------------------------------------------------ CREATE TABLE `permintaan_pemeriksaan_radiologi` ( `noorder` varchar(15) NOT NULL, @@ -4306,12 +4730,8 @@ CREATE TABLE `permintaan_pemeriksaan_radiologi` ( KEY `kd_jenis_prw` (`kd_jenis_prw`), CONSTRAINT `permintaan_pemeriksaan_radiologi_ibfk_1` FOREIGN KEY (`noorder`) REFERENCES `permintaan_radiologi` (`noorder`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_pemeriksaan_radiologi_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_radiologi` (`kd_jenis_prw`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_perbaikan_inventaris -# ------------------------------------------------------------ CREATE TABLE `permintaan_perbaikan_inventaris` ( `no_permintaan` varchar(15) NOT NULL, @@ -4324,12 +4744,8 @@ CREATE TABLE `permintaan_perbaikan_inventaris` ( KEY `nik` (`nik`), CONSTRAINT `permintaan_perbaikan_inventaris_ibfk_1` FOREIGN KEY (`no_inventaris`) REFERENCES `inventaris` (`no_inventaris`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_perbaikan_inventaris_ibfk_2` FOREIGN KEY (`nik`) REFERENCES `pegawai` (`nik`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table permintaan_radiologi -# ------------------------------------------------------------ CREATE TABLE `permintaan_radiologi` ( `noorder` varchar(15) NOT NULL, @@ -4349,25 +4765,17 @@ CREATE TABLE `permintaan_radiologi` ( KEY `no_rawat` (`no_rawat`), CONSTRAINT `permintaan_radiologi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `permintaan_radiologi_ibfk_3` FOREIGN KEY (`dokter_perujuk`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table personal_pasien -# ------------------------------------------------------------ CREATE TABLE `personal_pasien` ( `no_rkm_medis` varchar(15) NOT NULL, - `gambar` varchar(1000) DEFAULT NULL, - `password` varchar(1000) DEFAULT NULL, + `gambar` TEXT DEFAULT NULL, + `password` TEXT DEFAULT NULL, PRIMARY KEY (`no_rkm_medis`), CONSTRAINT `personal_pasien_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table perusahaan_pasien -# ------------------------------------------------------------ CREATE TABLE `perusahaan_pasien` ( `kode_perusahaan` varchar(8) NOT NULL, @@ -4376,21 +4784,11 @@ CREATE TABLE `perusahaan_pasien` ( `kota` varchar(40) DEFAULT NULL, `no_telp` varchar(27) DEFAULT NULL, PRIMARY KEY (`kode_perusahaan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `perusahaan_pasien` WRITE; -/*!40000 ALTER TABLE `perusahaan_pasien` DISABLE KEYS */; - -INSERT INTO `perusahaan_pasien` (`kode_perusahaan`, `nama_perusahaan`, `alamat`, `kota`, `no_telp`) -VALUES - ('-','-','-','-','0'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `perusahaan_pasien` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `perusahaan_pasien` VALUES ("-","-","-","-","0"); -# Dump of table petugas -# ------------------------------------------------------------ CREATE TABLE `petugas` ( `nip` varchar(20) NOT NULL, @@ -4416,21 +4814,11 @@ CREATE TABLE `petugas` ( KEY `alamat` (`alamat`), CONSTRAINT `petugas_ibfk_4` FOREIGN KEY (`nip`) REFERENCES `pegawai` (`nik`) ON UPDATE CASCADE, CONSTRAINT `petugas_ibfk_5` FOREIGN KEY (`kd_jbtn`) REFERENCES `jabatan` (`kd_jbtn`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `petugas` WRITE; -/*!40000 ALTER TABLE `petugas` DISABLE KEYS */; - -INSERT INTO `petugas` (`nip`, `nama`, `jk`, `tmp_lahir`, `tgl_lahir`, `gol_darah`, `agama`, `stts_nikah`, `alamat`, `kd_jbtn`, `no_telp`, `status`) -VALUES - ('DR001','dr. Ataaka Muhammad','L','Barabai','2020-12-01','A','Islam','MENIKAH','-','-','0','1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `petugas` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `petugas` VALUES ("DR001","dr. Ataaka Muhammad","L","Barabai","2020-12-01","A","Islam","MENIKAH","-","-","0","1"); -# Dump of table poliklinik -# ------------------------------------------------------------ CREATE TABLE `poliklinik` ( `kd_poli` char(5) NOT NULL DEFAULT '', @@ -4442,60 +4830,36 @@ CREATE TABLE `poliklinik` ( KEY `nm_poli` (`nm_poli`), KEY `registrasi` (`registrasi`), KEY `registrasilama` (`registrasilama`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `poliklinik` WRITE; -/*!40000 ALTER TABLE `poliklinik` DISABLE KEYS */; - -INSERT INTO `poliklinik` (`kd_poli`, `nm_poli`, `registrasi`, `registrasilama`, `status`) -VALUES - ('-','-',0,0,'1'), - ('IGDK','IGD',0,0,'1'), - ('UMU','Umum',0,0,'1'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `poliklinik` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `poliklinik` VALUES ("-","-","0","0","1"), +("IGDK","IGD","0","0","1"), +("UMU","Umum","0","0","1"); -# Dump of table propinsi -# ------------------------------------------------------------ CREATE TABLE `propinsi` ( - `kd_prop` int(11) NOT NULL AUTO_INCREMENT, + `kd_prop` int NOT NULL, `nm_prop` varchar(30) NOT NULL, PRIMARY KEY (`kd_prop`), UNIQUE KEY `nm_prop` (`nm_prop`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `propinsi` WRITE; -/*!40000 ALTER TABLE `propinsi` DISABLE KEYS */; - -INSERT INTO `propinsi` (`kd_prop`, `nm_prop`) -VALUES - (1,'-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `propinsi` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `propinsi` VALUES ("1","-"); -# Dump of table prosedur_pasien -# ------------------------------------------------------------ CREATE TABLE `prosedur_pasien` ( `no_rawat` varchar(17) NOT NULL, `kode` varchar(8) NOT NULL, `status` enum('Ralan','Ranap') NOT NULL, - `prioritas` tinyint(4) NOT NULL, + `prioritas` tinyint NOT NULL, PRIMARY KEY (`no_rawat`,`kode`,`status`), KEY `kode` (`kode`), CONSTRAINT `prosedur_pasien_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `prosedur_pasien_ibfk_2` FOREIGN KEY (`kode`) REFERENCES `icd9` (`kode`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_inap_dr -# ------------------------------------------------------------ CREATE TABLE `rawat_inap_dr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4519,12 +4883,8 @@ CREATE TABLE `rawat_inap_dr` ( CONSTRAINT `rawat_inap_dr_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_dr_ibfk_6` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_inap` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_dr_ibfk_7` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_inap_drpr -# ------------------------------------------------------------ CREATE TABLE `rawat_inap_drpr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4548,12 +4908,8 @@ CREATE TABLE `rawat_inap_drpr` ( CONSTRAINT `rawat_inap_drpr_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_inap` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_drpr_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_drpr_ibfk_4` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_inap_pr -# ------------------------------------------------------------ CREATE TABLE `rawat_inap_pr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4575,12 +4931,8 @@ CREATE TABLE `rawat_inap_pr` ( CONSTRAINT `rawat_inap_pr_ibfk_3` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_pr_ibfk_6` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_inap` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `rawat_inap_pr_ibfk_7` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_jl_dr -# ------------------------------------------------------------ CREATE TABLE `rawat_jl_dr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4603,12 +4955,8 @@ CREATE TABLE `rawat_jl_dr` ( CONSTRAINT `rawat_jl_dr_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_dr_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_dr_ibfk_5` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_jl_drpr -# ------------------------------------------------------------ CREATE TABLE `rawat_jl_drpr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4634,12 +4982,8 @@ CREATE TABLE `rawat_jl_drpr` ( CONSTRAINT `rawat_jl_drpr_ibfk_2` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan` (`kd_jenis_prw`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_drpr_ibfk_3` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_drpr_ibfk_4` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rawat_jl_pr -# ------------------------------------------------------------ CREATE TABLE `rawat_jl_pr` ( `no_rawat` varchar(17) NOT NULL DEFAULT '', @@ -4662,12 +5006,8 @@ CREATE TABLE `rawat_jl_pr` ( CONSTRAINT `rawat_jl_pr_ibfk_10` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_pr_ibfk_8` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `rawat_jl_pr_ibfk_9` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan` (`kd_jenis_prw`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table reg_periksa -# ------------------------------------------------------------ CREATE TABLE `reg_periksa` ( `no_reg` varchar(8) DEFAULT NULL, @@ -4685,7 +5025,7 @@ CREATE TABLE `reg_periksa` ( `stts_daftar` enum('-','Lama','Baru') NOT NULL, `status_lanjut` enum('Ralan','Ranap') NOT NULL, `kd_pj` char(3) NOT NULL, - `umurdaftar` int(11) DEFAULT NULL, + `umurdaftar` int DEFAULT NULL, `sttsumur` enum('Th','Bl','Hr') DEFAULT NULL, `status_bayar` enum('Sudah Bayar','Belum Bayar') NOT NULL, `status_poli` enum('Lama','Baru') NOT NULL, @@ -4700,15 +5040,11 @@ CREATE TABLE `reg_periksa` ( CONSTRAINT `reg_periksa_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `reg_periksa_ibfk_6` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE, CONSTRAINT `reg_periksa_ibfk_7` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table rekap_presensi -# ------------------------------------------------------------ CREATE TABLE `rekap_presensi` ( - `id` int(10) NOT NULL, + `id` int NOT NULL, `shift` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10') NOT NULL, `jam_datang` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `jam_pulang` datetime DEFAULT NULL, @@ -4716,16 +5052,12 @@ CREATE TABLE `rekap_presensi` ( `keterlambatan` varchar(20) NOT NULL, `durasi` varchar(20) DEFAULT NULL, `keterangan` varchar(100) NOT NULL, - `photo` varchar(500) NOT NULL, + `photo` TEXT NOT NULL, PRIMARY KEY (`id`,`jam_datang`), KEY `id` (`id`), CONSTRAINT `rekap_presensi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resep_dokter -# ------------------------------------------------------------ CREATE TABLE `resep_dokter` ( `no_resep` varchar(14) DEFAULT NULL, @@ -4736,31 +5068,23 @@ CREATE TABLE `resep_dokter` ( KEY `kode_brng` (`kode_brng`), CONSTRAINT `resep_dokter_ibfk_1` FOREIGN KEY (`no_resep`) REFERENCES `resep_obat` (`no_resep`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resep_dokter_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resep_dokter_racikan -# ------------------------------------------------------------ CREATE TABLE `resep_dokter_racikan` ( `no_resep` varchar(14) NOT NULL, `no_racik` varchar(2) NOT NULL, `nama_racik` varchar(100) NOT NULL, `kd_racik` varchar(3) NOT NULL, - `jml_dr` int(11) NOT NULL, + `jml_dr` int NOT NULL, `aturan_pakai` varchar(150) NOT NULL, `keterangan` varchar(50) NOT NULL, PRIMARY KEY (`no_resep`,`no_racik`), KEY `kd_racik` (`kd_racik`), CONSTRAINT `resep_dokter_racikan_ibfk_1` FOREIGN KEY (`no_resep`) REFERENCES `resep_obat` (`no_resep`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resep_dokter_racikan_ibfk_2` FOREIGN KEY (`kd_racik`) REFERENCES `metode_racik` (`kd_racik`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resep_dokter_racikan_detail -# ------------------------------------------------------------ CREATE TABLE `resep_dokter_racikan_detail` ( `no_resep` varchar(14) NOT NULL, @@ -4774,12 +5098,8 @@ CREATE TABLE `resep_dokter_racikan_detail` ( KEY `kode_brng` (`kode_brng`), CONSTRAINT `resep_dokter_racikan_detail_ibfk_1` FOREIGN KEY (`no_resep`) REFERENCES `resep_obat` (`no_resep`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resep_dokter_racikan_detail_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resep_obat -# ------------------------------------------------------------ CREATE TABLE `resep_obat` ( `no_resep` varchar(14) NOT NULL DEFAULT '', @@ -4797,12 +5117,8 @@ CREATE TABLE `resep_obat` ( KEY `kd_dokter` (`kd_dokter`), CONSTRAINT `resep_obat_ibfk_3` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `resep_obat_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resep_pulang -# ------------------------------------------------------------ CREATE TABLE `resep_pulang` ( `no_rawat` varchar(17) NOT NULL, @@ -4823,33 +5139,19 @@ CREATE TABLE `resep_pulang` ( CONSTRAINT `resep_pulang_ibfk_2` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resep_pulang_ibfk_3` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE, CONSTRAINT `resep_pulang_ibfk_4` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resiko_kerja -# ------------------------------------------------------------ CREATE TABLE `resiko_kerja` ( `kode_resiko` varchar(3) NOT NULL, `nama_resiko` varchar(200) DEFAULT NULL, - `indek` tinyint(4) DEFAULT NULL, + `indek` tinyint DEFAULT NULL, PRIMARY KEY (`kode_resiko`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `resiko_kerja` WRITE; -/*!40000 ALTER TABLE `resiko_kerja` DISABLE KEYS */; - -INSERT INTO `resiko_kerja` (`kode_resiko`, `nama_resiko`, `indek`) -VALUES - ('-','-',1); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `resiko_kerja` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `resiko_kerja` VALUES ("-","-","1"); -# Dump of table resume_pasien -# ------------------------------------------------------------ CREATE TABLE `resume_pasien` ( `no_rawat` varchar(17) NOT NULL, @@ -4882,12 +5184,8 @@ CREATE TABLE `resume_pasien` ( KEY `kd_dokter` (`kd_dokter`), CONSTRAINT `resume_pasien_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resume_pasien_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table resume_pasien_ranap -# ------------------------------------------------------------ CREATE TABLE `resume_pasien_ranap` ( `no_rawat` varchar(17) NOT NULL, @@ -4935,12 +5233,8 @@ CREATE TABLE `resume_pasien_ranap` ( KEY `kd_dokter` (`kd_dokter`), CONSTRAINT `resume_pasien_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `resume_pasien_ranap_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table riwayat_barang_medis -# ------------------------------------------------------------ CREATE TABLE `riwayat_barang_medis` ( `kode_brng` varchar(15) DEFAULT NULL, @@ -4951,7 +5245,7 @@ CREATE TABLE `riwayat_barang_medis` ( `posisi` enum('Pemberian Obat','Pengadaan','Penerimaan','Piutang','Retur Beli','Retur Jual','Retur Piutang','Mutasi','Opname','Resep Pulang','Retur Pasien','Stok Pasien Ranap','Pengambilan Medis','Penjualan','Stok Keluar','Hibah') DEFAULT NULL, `tanggal` date DEFAULT NULL, `jam` time DEFAULT NULL, - `petugas` varchar(20) DEFAULT NULL, + `petugas` varchar(100) DEFAULT NULL, `kd_bangsal` char(5) DEFAULT NULL, `status` enum('Simpan','Hapus') DEFAULT NULL, `no_batch` varchar(20) NOT NULL, @@ -4961,55 +5255,33 @@ CREATE TABLE `riwayat_barang_medis` ( KEY `kd_bangsal` (`kd_bangsal`) USING BTREE, CONSTRAINT `riwayat_barang_medis_ibfk_1` FOREIGN KEY (`kode_brng`) REFERENCES `databarang` (`kode_brng`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `riwayat_barang_medis_ibfk_2` FOREIGN KEY (`kd_bangsal`) REFERENCES `bangsal` (`kd_bangsal`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table ruang_ok -# ------------------------------------------------------------ CREATE TABLE `ruang_ok` ( `kd_ruang_ok` varchar(3) NOT NULL, `nm_ruang_ok` varchar(50) DEFAULT NULL, PRIMARY KEY (`kd_ruang_ok`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table set_keterlambatan -# ------------------------------------------------------------ CREATE TABLE `set_keterlambatan` ( - `toleransi` int(11) DEFAULT NULL, - `terlambat1` int(11) DEFAULT NULL, - `terlambat2` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; + `toleransi` int DEFAULT NULL, + `terlambat1` int DEFAULT NULL, + `terlambat2` int DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; - -# Dump of table set_no_rkm_medis -# ------------------------------------------------------------ - CREATE TABLE `set_no_rkm_medis` ( `no_rkm_medis` varchar(15) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - -LOCK TABLES `set_no_rkm_medis` WRITE; -/*!40000 ALTER TABLE `set_no_rkm_medis` DISABLE KEYS */; - -INSERT INTO `set_no_rkm_medis` (`no_rkm_medis`) -VALUES - ('000000'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `set_no_rkm_medis` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `set_no_rkm_medis` VALUES ("000000"); -# Dump of table skdp_bpjs -# ------------------------------------------------------------ CREATE TABLE `skdp_bpjs` ( - `tahun` year(4) NOT NULL, + `tahun` year NOT NULL, `no_rkm_medis` varchar(15) DEFAULT NULL, `diagnosa` varchar(50) NOT NULL, `terapi` varchar(50) NOT NULL, @@ -5027,94 +5299,50 @@ CREATE TABLE `skdp_bpjs` ( KEY `kd_dokter` (`kd_dokter`) USING BTREE, CONSTRAINT `skdp_bpjs_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON UPDATE CASCADE, CONSTRAINT `skdp_bpjs_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table spesialis -# ------------------------------------------------------------ CREATE TABLE `spesialis` ( `kd_sps` char(5) NOT NULL DEFAULT '', `nm_sps` varchar(30) DEFAULT NULL, PRIMARY KEY (`kd_sps`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `spesialis` WRITE; -/*!40000 ALTER TABLE `spesialis` DISABLE KEYS */; - -INSERT INTO `spesialis` (`kd_sps`, `nm_sps`) -VALUES - ('UMUM','Dokter Umum'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `spesialis` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `spesialis` VALUES ("UMUM","Dokter Umum"); -# Dump of table stts_kerja -# ------------------------------------------------------------ CREATE TABLE `stts_kerja` ( `stts` char(3) NOT NULL, `ktg` varchar(20) NOT NULL, - `indek` tinyint(4) NOT NULL, + `indek` tinyint NOT NULL, PRIMARY KEY (`stts`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `stts_kerja` WRITE; -/*!40000 ALTER TABLE `stts_kerja` DISABLE KEYS */; - -INSERT INTO `stts_kerja` (`stts`, `ktg`, `indek`) -VALUES - ('-','-',1); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `stts_kerja` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `stts_kerja` VALUES ("-","-","1"); -# Dump of table stts_wp -# ------------------------------------------------------------ CREATE TABLE `stts_wp` ( `stts` char(5) NOT NULL, `ktg` varchar(50) NOT NULL, PRIMARY KEY (`stts`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `stts_wp` WRITE; -/*!40000 ALTER TABLE `stts_wp` DISABLE KEYS */; - -INSERT INTO `stts_wp` (`stts`, `ktg`) -VALUES - ('-','-'); +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `stts_wp` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `stts_wp` VALUES ("-","-"); -# Dump of table suku_bangsa -# ------------------------------------------------------------ CREATE TABLE `suku_bangsa` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `nama_suku_bangsa` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `nama_suku_bangsa` (`nama_suku_bangsa`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT; - -LOCK TABLES `suku_bangsa` WRITE; -/*!40000 ALTER TABLE `suku_bangsa` DISABLE KEYS */; - -INSERT INTO `suku_bangsa` (`id`, `nama_suku_bangsa`) -VALUES - (1,'-'); +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40000 ALTER TABLE `suku_bangsa` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `suku_bangsa` VALUES ("1","-"); -# Dump of table tambahan_biaya -# ------------------------------------------------------------ CREATE TABLE `tambahan_biaya` ( `no_rawat` varchar(17) NOT NULL, @@ -5122,16 +5350,12 @@ CREATE TABLE `tambahan_biaya` ( `besar_biaya` double NOT NULL, PRIMARY KEY (`no_rawat`,`nama_biaya`), CONSTRAINT `tambahan_biaya_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table template_laboratorium -# ------------------------------------------------------------ CREATE TABLE `template_laboratorium` ( `kd_jenis_prw` varchar(15) NOT NULL, - `id_template` int(11) NOT NULL AUTO_INCREMENT, + `id_template` int NOT NULL AUTO_INCREMENT, `Pemeriksaan` varchar(200) NOT NULL, `satuan` varchar(20) NOT NULL, `nilai_rujukan_ld` varchar(30) NOT NULL, @@ -5146,7 +5370,7 @@ CREATE TABLE `template_laboratorium` ( `kso` double DEFAULT NULL, `menejemen` double DEFAULT NULL, `biaya_item` double NOT NULL, - `urut` int(4) DEFAULT NULL, + `urut` int DEFAULT NULL, PRIMARY KEY (`id_template`), KEY `kd_jenis_prw` (`kd_jenis_prw`), KEY `Pemeriksaan` (`Pemeriksaan`), @@ -5165,40 +5389,26 @@ CREATE TABLE `template_laboratorium` ( KEY `biaya_item` (`biaya_item`), KEY `urut` (`urut`), CONSTRAINT `template_laboratorium_ibfk_1` FOREIGN KEY (`kd_jenis_prw`) REFERENCES `jns_perawatan_lab` (`kd_jenis_prw`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -LOCK TABLES `template_laboratorium` WRITE; -/*!40000 ALTER TABLE `template_laboratorium` DISABLE KEYS */; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -INSERT INTO `template_laboratorium` (`kd_jenis_prw`, `id_template`, `Pemeriksaan`, `satuan`, `nilai_rujukan_ld`, `nilai_rujukan_la`, `nilai_rujukan_pd`, `nilai_rujukan_pa`, `bagian_rs`, `bhp`, `bagian_perujuk`, `bagian_dokter`, `bagian_laborat`, `kso`, `menejemen`, `biaya_item`, `urut`) -VALUES - ('LAB001',1,'Leukosit','LK','10','5','10','5',0,0,0,0,0,0,0,0,1), - ('LAB001',2,'Hemoglobin','HB','20','10','20','10',0,0,0,0,0,0,0,0,2); -/*!40000 ALTER TABLE `template_laboratorium` ENABLE KEYS */; -UNLOCK TABLES; +INSERT INTO `template_laboratorium` VALUES ("LAB001","1","Leukosit","LK","10","5","10","5","0","0","0","0","0","0","0","0","1"), +("LAB001","2","Hemoglobin","HB","20","10","20","10","0","0","0","0","0","0","0","0","2"); -# Dump of table temporary_presensi -# ------------------------------------------------------------ - CREATE TABLE `temporary_presensi` ( - `id` int(11) NOT NULL, + `id` int NOT NULL, `shift` enum('Pagi','Pagi2','Pagi3','Pagi4','Pagi5','Pagi6','Pagi7','Pagi8','Pagi9','Pagi10','Siang','Siang2','Siang3','Siang4','Siang5','Siang6','Siang7','Siang8','Siang9','Siang10','Malam','Malam2','Malam3','Malam4','Malam5','Malam6','Malam7','Malam8','Malam9','Malam10','Midle Pagi1','Midle Pagi2','Midle Pagi3','Midle Pagi4','Midle Pagi5','Midle Pagi6','Midle Pagi7','Midle Pagi8','Midle Pagi9','Midle Pagi10','Midle Siang1','Midle Siang2','Midle Siang3','Midle Siang4','Midle Siang5','Midle Siang6','Midle Siang7','Midle Siang8','Midle Siang9','Midle Siang10','Midle Malam1','Midle Malam2','Midle Malam3','Midle Malam4','Midle Malam5','Midle Malam6','Midle Malam7','Midle Malam8','Midle Malam9','Midle Malam10') NOT NULL, `jam_datang` datetime DEFAULT NULL, `jam_pulang` datetime DEFAULT NULL, `status` enum('Tepat Waktu','Terlambat Toleransi','Terlambat I','Terlambat II','Tepat Waktu & PSW','Terlambat Toleransi & PSW','Terlambat I & PSW','Terlambat II & PSW') NOT NULL, `keterlambatan` varchar(20) NOT NULL, `durasi` varchar(20) DEFAULT NULL, - `photo` varchar(500) NOT NULL, + `photo` TEXT NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `temporary_presensi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table utd_donor -# ------------------------------------------------------------ CREATE TABLE `utd_donor` ( `no_donor` varchar(15) NOT NULL, @@ -5206,7 +5416,7 @@ CREATE TABLE `utd_donor` ( `tanggal` date DEFAULT NULL, `dinas` enum('Pagi','Siang','Sore','Malam') DEFAULT NULL, `tensi` varchar(7) DEFAULT NULL, - `no_bag` int(11) DEFAULT NULL, + `no_bag` int DEFAULT NULL, `jenis_bag` enum('SB','DB','TB','QB') DEFAULT NULL, `jenis_donor` enum('DB','DP','DS') DEFAULT NULL, `tempat_aftap` enum('Dalam Gedung','Luar Gedung') DEFAULT NULL, @@ -5225,17 +5435,13 @@ CREATE TABLE `utd_donor` ( CONSTRAINT `utd_donor_ibfk_1` FOREIGN KEY (`petugas_aftap`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `utd_donor_ibfk_2` FOREIGN KEY (`petugas_u_saring`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `utd_donor_ibfk_3` FOREIGN KEY (`no_pendonor`) REFERENCES `utd_pendonor` (`no_pendonor`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table utd_komponen_darah -# ------------------------------------------------------------ CREATE TABLE `utd_komponen_darah` ( `kode` varchar(5) NOT NULL, `nama` varchar(70) DEFAULT NULL, - `lama` smallint(6) DEFAULT NULL, + `lama` smallint DEFAULT NULL, `jasa_sarana` double DEFAULT NULL, `paket_bhp` double DEFAULT NULL, `kso` double DEFAULT NULL, @@ -5243,12 +5449,8 @@ CREATE TABLE `utd_komponen_darah` ( `total` double DEFAULT NULL, `pembatalan` double DEFAULT NULL, PRIMARY KEY (`kode`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table utd_pendonor -# ------------------------------------------------------------ CREATE TABLE `utd_pendonor` ( `no_pendonor` varchar(15) NOT NULL, @@ -5258,10 +5460,10 @@ CREATE TABLE `utd_pendonor` ( `tmp_lahir` varchar(15) NOT NULL, `tgl_lahir` date NOT NULL, `alamat` varchar(100) NOT NULL, - `kd_kel` int(11) NOT NULL, - `kd_kec` int(11) NOT NULL, - `kd_kab` int(11) NOT NULL, - `kd_prop` int(11) NOT NULL, + `kd_kel` int NOT NULL, + `kd_kec` int NOT NULL, + `kd_kab` int NOT NULL, + `kd_prop` int NOT NULL, `golongan_darah` enum('A','AB','B','O') NOT NULL, `resus` enum('(-)','(+)') NOT NULL, `no_telp` varchar(40) NOT NULL, @@ -5273,12 +5475,8 @@ CREATE TABLE `utd_pendonor` ( CONSTRAINT `utd_pendonor_ibfk_1` FOREIGN KEY (`kd_kec`) REFERENCES `kecamatan` (`kd_kec`) ON UPDATE CASCADE, CONSTRAINT `utd_pendonor_ibfk_2` FOREIGN KEY (`kd_kab`) REFERENCES `kabupaten` (`kd_kab`) ON UPDATE CASCADE, CONSTRAINT `utd_pendonor_ibfk_3` FOREIGN KEY (`kd_prop`) REFERENCES `propinsi` (`kd_prop`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -# Dump of table utd_stok_darah -# ------------------------------------------------------------ CREATE TABLE `utd_stok_darah` ( `no_kantong` varchar(20) NOT NULL DEFAULT '', @@ -5292,17 +5490,7 @@ CREATE TABLE `utd_stok_darah` ( PRIMARY KEY (`no_kantong`), KEY `kode_komponen` (`kode_komponen`), CONSTRAINT `utd_stok_darah_ibfk_1` FOREIGN KEY (`kode_komponen`) REFERENCES `utd_komponen_darah` (`kode`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - -CREATE TABLE `mlite_set_nomor_surat` ( - `nomor_surat` varchar(10) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +SET foreign_key_checks = 1; diff --git a/mlite_only.sql b/mlite_only.sql deleted file mode 100644 index 706c66865..000000000 --- a/mlite_only.sql +++ /dev/null @@ -1,1713 +0,0 @@ -# Dump of table mlite_akun_kegiatan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_akun_kegiatan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `kegiatan` varchar(200) DEFAULT NULL, - `kd_rek` varchar(20) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_antrian_loket -# ------------------------------------------------------------ - -CREATE TABLE `mlite_antrian_loket` ( - `kd` int(50) NOT NULL AUTO_INCREMENT, - `type` varchar(50) NOT NULL, - `noantrian` varchar(50) NOT NULL, - `no_rkm_medis` varchar(50) DEFAULT NULL, - `postdate` date NOT NULL, - `start_time` time NOT NULL, - `end_time` time NOT NULL DEFAULT '00:00:00', - `status` varchar(10) NOT NULL DEFAULT '0', - `loket` varchar(10) NOT NULL DEFAULT '0', - PRIMARY KEY (`kd`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_antrian_referensi -# ------------------------------------------------------------ - -CREATE TABLE `mlite_antrian_referensi` ( - `tanggal_periksa` date NOT NULL, - `no_rkm_medis` varchar(50) NOT NULL, - `nomor_kartu` varchar(50) NOT NULL, - `nomor_referensi` varchar(50) NOT NULL, - `kodebooking` varchar(100) NOT NULL, - `jenis_kunjungan` varchar(10) NOT NULL, - `status_kirim` varchar(20) DEFAULT NULL, - `keterangan` varchar(250) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_antrian_referensi_batal -# ------------------------------------------------------------ - -CREATE TABLE `mlite_antrian_referensi_batal` ( - `tanggal_batal` date NOT NULL, - `nomor_referensi` varchar(50) NOT NULL, - `kodebooking` varchar(100) NOT NULL, - `keterangan` varchar(250) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_antrian_referensi_taskid -# ------------------------------------------------------------ - -CREATE TABLE `mlite_antrian_referensi_taskid` ( - `tanggal_periksa` date NOT NULL, - `nomor_referensi` varchar(50) NOT NULL, - `taskid` varchar(50) NOT NULL, - `waktu` varchar(50) NOT NULL, - `status` varchar(20) DEFAULT NULL, - `keterangan` varchar(250) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_apamregister -# ------------------------------------------------------------ - -CREATE TABLE `mlite_apamregister` ( - `nama_lengkap` varchar(225) NOT NULL, - `email` varchar(225) NOT NULL, - `nomor_ktp` varchar(225) NOT NULL, - `nomor_telepon` varchar(225) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_billing -# ------------------------------------------------------------ - -CREATE TABLE `mlite_billing` ( - `id_billing` int(11) NOT NULL AUTO_INCREMENT, - `kd_billing` varchar(100) NOT NULL, - `no_rawat` varchar(17) NOT NULL, - `jumlah_total` int(100) NOT NULL, - `potongan` int(100) NOT NULL, - `jumlah_harus_bayar` int(100) NOT NULL, - `jumlah_bayar` int(100) NOT NULL, - `tgl_billing` date NOT NULL, - `jam_billing` time NOT NULL, - `id_user` int(11) NOT NULL, - `keterangan` varchar(100) NOT NULL, - PRIMARY KEY (`id_billing`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_bridging_pcare -# ------------------------------------------------------------ - -CREATE TABLE `mlite_bridging_pcare` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `no_rawat` text NOT NULL, - `no_rkm_medis` text, - `tgl_daftar` text, - `nomor_kunjungan` text, - `kode_provider_peserta` text, - `nomor_jaminan` text, - `kode_poli` text, - `nama_poli` text, - `kunjungan_sakit` text, - `sistole` text, - `diastole` text, - `nadi` text, - `respirasi` text, - `tinggi` text, - `berat` text, - `lingkar_perut` text, - `rujuk_balik` text, - `subyektif` text, - `kode_tkp` text, - `nomor_urut` text, - `kode_kesadaran` text, - `nama_kesadaran` text, - `terapi` text, - `kode_status_pulang` text, - `nama_status_pulang` text, - `tgl_pulang` text, - `tgl_kunjungan` text, - `kode_dokter` text, - `nama_dokter` text, - `kode_diagnosa1` text, - `nama_diagnosa1` text, - `kode_diagnosa2` text, - `nama_diagnosa2` text, - `kode_diagnosa3` text, - `nama_diagnosa3` text, - `tgl_estimasi_rujuk` text, - `kode_ppk` text, - `nama_ppk` text, - `kode_spesialis` text, - `nama_spesialis` text, - `kode_subspesialis` text, - `nama_subspesialis` text, - `kode_sarana` text, - `nama_sarana` text, - `kode_referensikhusus` text, - `nama_referensikhusus` text, - `kode_faskeskhusus` text, - `nama_faskeskhusus` text, - `catatan` text, - `kode_tacc` text, - `nama_tacc` text, - `alasan_tacc` text, - `id_user` text NOT NULL, - `tgl_input` text NOT NULL, - `status_kirim` text NOT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_detailjurnal -# ------------------------------------------------------------ - -CREATE TABLE `mlite_detailjurnal` ( - `no_jurnal` varchar(20) DEFAULT NULL, - `kd_rek` varchar(15) DEFAULT NULL, - `arus_kas` int(10) NOT NULL, - `debet` double NOT NULL, - `kredit` double NOT NULL, - KEY `no_jurnal` (`no_jurnal`), - KEY `kd_rek` (`kd_rek`), - KEY `debet` (`debet`), - KEY `kredit` (`kredit`), - CONSTRAINT `mlite_detailjurnal_ibfk_1` FOREIGN KEY (`no_jurnal`) REFERENCES `mlite_jurnal` (`no_jurnal`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_detailjurnal_ibfk_2` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_duitku -# ------------------------------------------------------------ - -CREATE TABLE `mlite_duitku` ( - `id` int(10) NOT NULL AUTO_INCREMENT, - `tanggal` datetime NOT NULL, - `no_rkm_medis` varchar(15) NOT NULL, - `paymentUrl` varchar(255) NOT NULL, - `merchantCode` varchar(255) NOT NULL, - `reference` varchar(255) NOT NULL, - `vaNumber` varchar(255) NOT NULL, - `amount` varchar(255) NOT NULL, - `statusCode` varchar(255) NOT NULL, - `statusMessage` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - KEY `reference` (`reference`), - KEY `mlite_duitku_ibfk_1` (`no_rkm_medis`), - CONSTRAINT `mlite_duitku_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_fenton -# ------------------------------------------------------------ - -CREATE TABLE `mlite_fenton` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `usia_kehamilan` int(11) NOT NULL, - `tgl_lahir` date NOT NULL, - `berat_badan` float NOT NULL, - `lingkar_kepala` int(11) NOT NULL, - `panjang_badan` int(11) NOT NULL, - `petugas` varchar(60) NOT NULL, - `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - `deleted_at` timestamp NULL DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_geolocation_presensi -# ------------------------------------------------------------ - -CREATE TABLE `mlite_geolocation_presensi` ( - `id` int(11) NOT NULL, - `tanggal` date DEFAULT NULL, - `latitude` varchar(200) NOT NULL, - `longitude` varchar(200) NOT NULL, - KEY `mlite_geolocation_presensi_ibfk_1` (`id`), - CONSTRAINT `mlite_geolocation_presensi_ibfk_1` FOREIGN KEY (`id`) REFERENCES `pegawai` (`id`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_jurnal -# ------------------------------------------------------------ - -CREATE TABLE `mlite_jurnal` ( - `no_jurnal` varchar(20) NOT NULL, - `no_bukti` varchar(20) DEFAULT NULL, - `tgl_jurnal` date DEFAULT NULL, - `jenis` enum('U','P') DEFAULT NULL, - `kegiatan` varchar(250) NOT NULL, - `keterangan` varchar(350) DEFAULT NULL, - PRIMARY KEY (`no_jurnal`), - KEY `no_bukti` (`no_bukti`), - KEY `tgl_jurnal` (`tgl_jurnal`), - KEY `jenis` (`jenis`), - KEY `keterangan` (`keterangan`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_login_attempts -# ------------------------------------------------------------ - -CREATE TABLE `mlite_login_attempts` ( - `ip` text, - `attempts` int(100) NOT NULL, - `expires` int(100) NOT NULL DEFAULT '0' -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_modules -# ------------------------------------------------------------ - -CREATE TABLE `mlite_modules` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `dir` text, - `sequence` text, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -LOCK TABLES `mlite_modules` WRITE; -/*!40000 ALTER TABLE `mlite_modules` DISABLE KEYS */; - -INSERT INTO `mlite_modules` (`id`, `dir`, `sequence`) -VALUES - (1,'settings','9'), - (2,'dashboard','0'), - (3,'master','1'), - (4,'pasien','2'), - (5,'rawat_jalan','3'), - (6,'kasir_rawat_jalan','4'), - (7,'kepegawaian','5'), - (8,'farmasi','6'), - (9,'users','8'), - (10,'modules','7'), - (11,'wagateway','10'), - (12,'apotek_ralan','11'), - (13,'dokter_ralan','12'), - (14,'igd','13'), - (15,'dokter_igd','14'), - (16,'laboratorium','15'), - (17,'radiologi','16'), - (18,'icd_10','17'), - (19,'rawat_inap','18'), - (20,'apotek_ranap','19'), - (21,'dokter_ranap','20'), - (22,'kasir_rawat_inap','21'), - (23,'operasi','22'), - (24,'anjungan','23'), - (25,'api','24'), - (26,'jkn_mobile','25'), - (27,'vclaim','26'), - (28,'keuangan','27'), - (29,'manajemen','28'), - (30,'presensi','29'), - (31,'vedika','30'), - (32,'profil','31'), - (33,'orthanc','32'), - (34,'veronisa','33'), - (35,'icd_9','34'); - -/*!40000 ALTER TABLE `mlite_modules` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_notifications -# ------------------------------------------------------------ - -CREATE TABLE `mlite_notifications` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `judul` varchar(250) NOT NULL, - `pesan` text NOT NULL, - `tanggal` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `no_rkm_medis` varchar(255) NOT NULL, - `status` varchar(250) NOT NULL DEFAULT 'unread', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_odontogram -# ------------------------------------------------------------ - -CREATE TABLE `mlite_odontogram` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `no_rkm_medis` text NOT NULL, - `pemeriksaan` text, - `kondisi` text, - `catatan` text, - `id_user` text NOT NULL, - `tgl_input` text NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - - - -# Dump of table mlite_ohis -# ------------------------------------------------------------ - -CREATE TABLE `mlite_ohis` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `no_rkm_medis` text NOT NULL, - `d_16` text, - `d_11` text, - `d_26` text, - `d_36` text, - `d_31` text, - `d_46` text, - `c_16` text, - `c_11` text, - `c_26` text, - `c_36` text, - `c_31` text, - `c_46` text, - `debris` text, - `calculus` text, - `nilai` text, - `kriteria` text, - `id_user` text NOT NULL, - `tgl_input` text NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - - - -# Dump of table mlite_pendaftaran_oral_diagnostic -# ------------------------------------------------------------ - -CREATE TABLE `mlite_pendaftaran_oral_diagnostic` ( - `no_reg` varchar(8) DEFAULT NULL, - `no_rawat` varchar(17) NOT NULL, - `tgl_registrasi` date DEFAULT NULL, - `jam_reg` time DEFAULT NULL, - `kd_dokter` varchar(20) DEFAULT NULL, - `no_rkm_medis` varchar(15) DEFAULT NULL, - `kd_poli` char(5) DEFAULT NULL, - `p_jawab` varchar(100) DEFAULT NULL, - `almt_pj` varchar(200) DEFAULT NULL, - `hubunganpj` varchar(20) DEFAULT NULL, - `biaya_reg` double DEFAULT NULL, - `stts` enum('Belum','Sudah','Batal','Berkas Diterima','Dirujuk','Meninggal','Dirawat','Pulang Paksa') DEFAULT NULL, - `stts_daftar` enum('-','Lama','Baru') NOT NULL, - `status_lanjut` enum('Ralan','Ranap') NOT NULL, - `kd_pj` char(3) NOT NULL, - `umurdaftar` int(11) DEFAULT NULL, - `sttsumur` enum('Th','Bl','Hr') DEFAULT NULL, - `status_bayar` enum('Sudah Bayar','Belum Bayar') NOT NULL, - `status_poli` enum('Lama','Baru') NOT NULL, - PRIMARY KEY (`no_rawat`), - KEY `no_rkm_medis` (`no_rkm_medis`), - KEY `kd_poli` (`kd_poli`), - KEY `kd_pj` (`kd_pj`), - KEY `status_lanjut` (`status_lanjut`), - KEY `kd_dokter` (`kd_dokter`), - KEY `status_bayar` (`status_bayar`) USING BTREE, - CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_3` FOREIGN KEY (`kd_poli`) REFERENCES `poliklinik` (`kd_poli`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_6` FOREIGN KEY (`kd_pj`) REFERENCES `penjab` (`kd_pj`) ON UPDATE CASCADE, - CONSTRAINT `mlite_pendaftaran_oral_diagnostic_ibfk_7` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_pengaduan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_pengaduan` ( - `id` varchar(15) NOT NULL, - `tanggal` datetime NOT NULL, - `no_rkm_medis` varchar(15) NOT NULL, - `pesan` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - KEY `no_rkm_medis` (`no_rkm_medis`), - CONSTRAINT `mlite_pengaduan_ibfk_1` FOREIGN KEY (`no_rkm_medis`) REFERENCES `pasien` (`no_rkm_medis`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_pengaduan_detail -# ------------------------------------------------------------ - -CREATE TABLE `mlite_pengaduan_detail` ( - `id` int(10) NOT NULL AUTO_INCREMENT, - `pengaduan_id` varchar(15) NOT NULL, - `tanggal` datetime NOT NULL, - `no_rkm_medis` varchar(15) NOT NULL, - `pesan` varchar(225) DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE, - KEY `pengaduan_detail_ibfk_1` (`pengaduan_id`), - CONSTRAINT `mlite_pengaduan_detail_ibfk_1` FOREIGN KEY (`pengaduan_id`) REFERENCES `mlite_pengaduan` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_awal_keperawatan_gigi -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_awal_keperawatan_gigi` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `bmi` varchar(10) NOT NULL, - `keluhan_utama` varchar(150) NOT NULL DEFAULT '', - `riwayat_penyakit` enum('Tidak Ada','Diabetes Melitus','Hipertensi','Penyakit Jantung','HIV','Hepatitis','Haemophilia','Lain-lain') DEFAULT NULL, - `ket_riwayat_penyakit` varchar(30) NOT NULL, - `alergi` varchar(25) NOT NULL DEFAULT '', - `riwayat_perawatan_gigi` enum('Tidak','Ya, Kapan') NOT NULL, - `ket_riwayat_perawatan_gigi` varchar(50) NOT NULL DEFAULT '', - `kebiasaan_sikat_gigi` enum('1x','2x','3x','Mandi','Setelah Makan','Sebelum Tidur') NOT NULL, - `kebiasaan_lain` enum('Tidak ada','Minum kopi/teh','Minum alkohol','Bruxism','Menggigit pensil','Mengunyah 1 sisi rahang','Merokok','Lain-lain') DEFAULT NULL, - `ket_kebiasaan_lain` varchar(30) NOT NULL, - `obat_yang_diminum_saatini` varchar(100) DEFAULT NULL, - `alat_bantu` enum('Tidak','Ya') NOT NULL, - `ket_alat_bantu` varchar(30) NOT NULL, - `prothesa` enum('Tidak','Ya') NOT NULL, - `ket_pro` varchar(50) NOT NULL, - `status_psiko` enum('Tenang','Takut','Cemas','Depresi','Lain-lain') NOT NULL, - `ket_psiko` varchar(70) NOT NULL, - `hub_keluarga` enum('Baik','Tidak Baik') NOT NULL, - `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, - `ket_tinggal` varchar(40) NOT NULL, - `ekonomi` enum('Baik','Cukup','Kurang') NOT NULL, - `budaya` enum('Tidak Ada','Ada') NOT NULL, - `ket_budaya` varchar(50) NOT NULL, - `edukasi` enum('Pasien','Keluarga') NOT NULL, - `ket_edukasi` varchar(50) NOT NULL, - `berjalan_a` enum('Ya','Tidak') NOT NULL, - `berjalan_b` enum('Ya','Tidak') NOT NULL, - `berjalan_c` enum('Ya','Tidak') NOT NULL, - `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, - `lapor` enum('Ya','Tidak') NOT NULL, - `ket_lapor` varchar(15) NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `lokasi` varchar(50) NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `frekuensi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat','Tidak ada nyeri','Lain-lain') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `pada_dokter` enum('Tidak','Ya') NOT NULL, - `ket_dokter` varchar(15) NOT NULL, - `kebersihan_mulut` enum('Baik','Cukup','Kurang') NOT NULL, - `mukosa_mulut` enum('Normal','Pigmentasi','Radang') NOT NULL, - `karies` enum('Ada','Tidak') NOT NULL, - `karang_gigi` enum('Ada','Tidak') NOT NULL, - `gingiva` enum('Normal','Radang') NOT NULL, - `palatum` enum('Normal','Radang') NOT NULL, - `rencana` varchar(200) NOT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_gigi_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_gigi_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_awal_keperawatan_ralan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_awal_keperawatan_ralan` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `gcs` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `bmi` varchar(10) NOT NULL, - `keluhan_utama` varchar(150) NOT NULL DEFAULT '', - `rpd` varchar(100) NOT NULL DEFAULT '', - `rpk` varchar(100) NOT NULL, - `rpo` varchar(100) NOT NULL, - `alergi` varchar(25) NOT NULL DEFAULT '', - `alat_bantu` enum('Tidak','Ya') NOT NULL, - `ket_bantu` varchar(50) NOT NULL DEFAULT '', - `prothesa` enum('Tidak','Ya') NOT NULL, - `ket_pro` varchar(50) NOT NULL, - `adl` enum('Mandiri','Dibantu') NOT NULL, - `status_psiko` enum('Tenang','Takut','Cemas','Depresi','Lain-lain') NOT NULL, - `ket_psiko` varchar(70) NOT NULL, - `hub_keluarga` enum('Baik','Tidak Baik') NOT NULL, - `tinggal_dengan` enum('Sendiri','Orang Tua','Suami / Istri','Lainnya') NOT NULL, - `ket_tinggal` varchar(40) NOT NULL, - `ekonomi` enum('Baik','Cukup','Kurang') NOT NULL, - `budaya` enum('Tidak Ada','Ada') NOT NULL, - `ket_budaya` varchar(50) NOT NULL, - `edukasi` enum('Pasien','Keluarga') NOT NULL, - `ket_edukasi` varchar(50) NOT NULL, - `berjalan_a` enum('Ya','Tidak') NOT NULL, - `berjalan_b` enum('Ya','Tidak') NOT NULL, - `berjalan_c` enum('Ya','Tidak') NOT NULL, - `hasil` enum('Tidak beresiko (tidak ditemukan a dan b)','Resiko rendah (ditemukan a/b)','Resiko tinggi (ditemukan a dan b)') NOT NULL, - `lapor` enum('Ya','Tidak') NOT NULL, - `ket_lapor` varchar(15) NOT NULL, - `sg1` enum('Tidak','Tidak Yakin','Ya, 1-5 Kg','Ya, 6-10 Kg','Ya, 11-15 Kg','Ya, >15 Kg') NOT NULL, - `nilai1` enum('0','1','2','3','4') NOT NULL, - `sg2` enum('Ya','Tidak') NOT NULL, - `nilai2` enum('0','1') NOT NULL, - `total_hasil` tinyint(4) NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `provokes` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, - `ket_provokes` varchar(40) NOT NULL, - `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, - `ket_quality` varchar(50) NOT NULL, - `lokasi` varchar(50) NOT NULL, - `menyebar` enum('Tidak','Ya') NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `pada_dokter` enum('Tidak','Ya') NOT NULL, - `ket_dokter` varchar(15) NOT NULL, - `rencana` varchar(200) NOT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ralan_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_awal_keperawatan_ranap -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_awal_keperawatan_ranap` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `informasi` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `ket_informasi` varchar(30) NOT NULL, - `tiba_diruang_rawat` enum('Jalan Tanpa Bantuan','Kursi Roda','Brankar') NOT NULL, - `kasus_trauma` enum('Trauma','Non Trauma') DEFAULT NULL, - `cara_masuk` enum('Poli','IGD','Lain-lain') NOT NULL, - `rps` varchar(300) NOT NULL, - `rpd` varchar(100) NOT NULL, - `rpk` varchar(100) NOT NULL, - `rpo` varchar(100) NOT NULL, - `riwayat_pembedahan` varchar(40) NOT NULL, - `riwayat_dirawat_dirs` varchar(40) NOT NULL, - `alat_bantu_dipakai` enum('Kacamata','Prothesa','Alat Bantu Dengar','Lain-lain') NOT NULL, - `riwayat_kehamilan` enum('Tidak','Ya') NOT NULL, - `riwayat_kehamilan_perkiraan` varchar(30) NOT NULL, - `riwayat_tranfusi` varchar(40) NOT NULL, - `riwayat_alergi` varchar(40) NOT NULL, - `riwayat_merokok` enum('Tidak','Ya') NOT NULL, - `riwayat_merokok_jumlah` varchar(5) NOT NULL, - `riwayat_alkohol` enum('Tidak','Ya') NOT NULL, - `riwayat_alkohol_jumlah` varchar(5) NOT NULL, - `riwayat_narkoba` enum('Tidak','Ya') NOT NULL, - `riwayat_olahraga` enum('Tidak','Ya') NOT NULL, - `pemeriksaan_mental` varchar(40) NOT NULL, - `pemeriksaan_keadaan_umum` enum('Baik','Sedang','Buruk') NOT NULL, - `pemeriksaan_gcs` varchar(10) NOT NULL, - `pemeriksaan_td` varchar(8) NOT NULL, - `pemeriksaan_nadi` varchar(5) NOT NULL, - `pemeriksaan_rr` varchar(5) NOT NULL, - `pemeriksaan_suhu` varchar(5) NOT NULL, - `pemeriksaan_spo2` varchar(5) NOT NULL, - `pemeriksaan_bb` varchar(5) NOT NULL, - `pemeriksaan_tb` varchar(5) NOT NULL, - `pemeriksaan_susunan_kepala` enum('TAK','Hydrocephalus','Hematoma','Lain-lain') NOT NULL, - `pemeriksaan_susunan_wajah` enum('TAK','Asimetris','Kelainan Kongenital') NOT NULL, - `pemeriksaan_susunan_leher` enum('TAK','Kaku Kuduk','Pembesaran Thyroid','Pembesaran KGB') NOT NULL, - `pemeriksaan_susunan_kejang` enum('TAK','Kuat','Ada') NOT NULL, - `pemeriksaan_susunan_sensorik` enum('TAK','Sakit Nyeri','Rasa kebas') NOT NULL, - `pemeriksaan_kardiovaskuler_denyut_nadi` enum('Teratur','Tidak Teratur') NOT NULL, - `pemeriksaan_kardiovaskuler_sirkulasi` enum('Akral Hangat','Akral Dingin','Edema') NOT NULL, - `pemeriksaan_kardiovaskuler_pulsasi` enum('Kuat','Lemah','Lain-lain') NOT NULL, - `pemeriksaan_respirasi_pola_nafas` enum('Normal','Bradipnea','Tachipnea') NOT NULL, - `pemeriksaan_respirasi_retraksi` enum('Tidak Ada','Ringan','Berat') NOT NULL, - `pemeriksaan_respirasi_suara_nafas` enum('Vesikuler','Wheezing','Rhonki') NOT NULL, - `pemeriksaan_respirasi_volume_pernafasan` enum('Normal','Hiperventilasi','Hipoventilasi') NOT NULL, - `pemeriksaan_respirasi_jenis_pernafasan` enum('Pernafasan Dada','Alat Bantu Pernafasaan') NOT NULL, - `pemeriksaan_respirasi_irama_nafas` enum('Teratur','Tidak Teratur') NOT NULL, - `pemeriksaan_respirasi_batuk` enum('Tidak','Ya : Produktif','Ya : Non Produktif') NOT NULL, - `pemeriksaan_gastrointestinal_mulut` enum('TAK','Stomatitis','Mukosa Kering','Bibir Pucat','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_gigi` enum('TAK','Karies','Goyang','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_lidah` enum('TAK','Kotor','Gerak Asimetris','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_tenggorokan` enum('TAK','Gangguan Menelan','Sakit Menelan','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_abdomen` enum('Supel','Asictes',' Tegang','Nyeri Tekan/Lepas','Lain-lain') NOT NULL, - `pemeriksaan_gastrointestinal_peistatik_usus` enum('TAK','Tidak Ada Bising Usus','Hiperistaltik') NOT NULL, - `pemeriksaan_gastrointestinal_anus` enum('TAK','Atresia Ani') NOT NULL, - `pemeriksaan_neurologi_pengelihatan` enum('TAK','Ada Kelainan') NOT NULL, - `pemeriksaan_neurologi_alat_bantu_penglihatan` enum('Tidak','Kacamata','Lensa Kontak') NOT NULL, - `pemeriksaan_neurologi_pendengaran` enum('TAK','Berdengung','Nyeri','Tuli','Keluar Cairan','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_bicara` enum('Jelas','Tidak Jelas') NOT NULL, - `pemeriksaan_neurologi_sensorik` enum('TAK','Sakit Nyeri','Rasa Kebas','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_motorik` enum('TAK','Hemiparese','Tetraparese','Tremor','Lain-lain') NOT NULL, - `pemeriksaan_neurologi_kekuatan_otot` enum('Kuat','Lemah') NOT NULL, - `pemeriksaan_integument_warnakulit` enum('Pucat','Sianosis','Normal','Lain-lain') NOT NULL, - `pemeriksaan_integument_turgor` enum('Baik','Sedang','Buruk') NOT NULL, - `pemeriksaan_integument_kulit` enum('Normal','Rash/Kemerahan','Luka','Memar','Ptekie','Bula') NOT NULL, - `pemeriksaan_integument_dekubitas` enum('Tidak Ada','Usia > 65 tahun','Obesitas','Imobilisasi','Paraplegi/Vegetative State','Dirawat Di HCU','Penyakit Kronis (DM, CHF, CKD)','Inkontinentia Uri/Alvi') NOT NULL, - `pemeriksaan_muskuloskletal_pergerakan_sendi` enum('Bebas','Terbatas') NOT NULL, - `pemeriksaan_muskuloskletal_kekauatan_otot` enum('Baik','Lemah','Tremor') NOT NULL, - `pemeriksaan_muskuloskletal_nyeri_sendi` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_muskuloskletal_oedema` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_muskuloskletal_fraktur` enum('Tidak Ada','Ada') NOT NULL, - `pemeriksaan_eliminasi_bab_frekuensi_jumlah` varchar(5) NOT NULL, - `pemeriksaan_eliminasi_bab_frekuensi_durasi` varchar(10) NOT NULL, - `pemeriksaan_eliminasi_bab_konsistensi` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bab_warna` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bak_frekuensi_jumlah` varchar(5) NOT NULL, - `pemeriksaan_eliminasi_bak_frekuensi_durasi` varchar(10) NOT NULL, - `pemeriksaan_eliminasi_bak_warna` varchar(30) NOT NULL, - `pemeriksaan_eliminasi_bak_lainlain` varchar(30) NOT NULL, - `pola_aktifitas_makanminum` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_mandi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_eliminasi` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_berpakaian` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_aktifitas_berpindah` enum('Mandiri','Bantuan Orang Lain') NOT NULL, - `pola_nutrisi_frekuesi_makan` varchar(3) NOT NULL, - `pola_nutrisi_jenis_makanan` varchar(20) NOT NULL, - `pola_nutrisi_porsi_makan` varchar(3) NOT NULL, - `pola_tidur_lama_tidur` varchar(3) NOT NULL, - `pola_tidur_gangguan` enum('Tidak Ada Gangguan','Insomnia') NOT NULL, - `pengkajian_fungsi_kemampuan_sehari` enum('Mandiri','Bantuan Minimal','Bantuan Sebagian','Ketergantungan Total') NOT NULL, - `pengkajian_fungsi_aktifitas` enum('Tirah Baring','Duduk','Berjalan') NOT NULL, - `pengkajian_fungsi_berjalan` enum('TAK','Penurunan Kekuatan/ROM','Paralisis','Sering Jatuh','Deformitas','Hilang Keseimbangan','Riwayat Patah Tulang','Lain-lain') NOT NULL, - `pengkajian_fungsi_ambulasi` enum('Walker','Tongkat','Kursi Roda','Tidak Menggunakan') NOT NULL, - `pengkajian_fungsi_ekstrimitas_atas` enum('TAK','Lemah','Oedema','Tidak Simetris','Lain-lain') NOT NULL, - `pengkajian_fungsi_ekstrimitas_bawah` enum('TAK','Varises','Oedema','Tidak Simetris','Lain-lain') NOT NULL, - `pengkajian_fungsi_menggenggam` enum('Tidak Ada Kesulitan','Terakhir','Lain-lain') NOT NULL, - `pengkajian_fungsi_koordinasi` enum('Tidak Ada Kesulitan','Ada Masalah') NOT NULL, - `pengkajian_fungsi_kesimpulan` enum('Ya (Co DPJP)','Tidak (Tidak Perlu Co DPJP)') NOT NULL, - `riwayat_psiko_kondisi_psiko` enum('Tidak Ada Masalah','Marah','Takut','Depresi','Cepat Lelah','Cemas','Gelisah','Sulit Tidur','Lain-lain') NOT NULL, - `riwayat_psiko_gangguan_jiwa` enum('Ya','Tidak') NOT NULL, - `riwayat_psiko_perilaku` enum('Tidak Ada Masalah','Perilaku Kekerasan','Gangguan Efek','Gangguan Memori','Halusinasi','Kecenderungan Percobaan Bunuh Diri','Lain-lain') NOT NULL, - `riwayat_psiko_hubungan_keluarga` enum('Harmonis','Kurang Harmonis','Tidak Harmonis','Konflik Besar') NOT NULL, - `riwayat_psiko_tinggal` enum('Sendiri','Orang Tua','Suami/Istri','Keluarga','Lain-lain') NOT NULL, - `riwayat_psiko_nilai_kepercayaan` enum('Tidak Ada','Ada') NOT NULL, - `riwayat_psiko_pendidikan_pj` enum('-','TS','TK','SD','SMP','SMA','SLTA/SEDERAJAT','D1','D2','D3','D4','S1','S2','S3') NOT NULL, - `riwayat_psiko_edukasi_diberikan` enum('Pasien','Keluarga') NOT NULL, - `penilaian_nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `penilaian_nyeri_penyebab` enum('Proses Penyakit','Benturan','Lain-lain') NOT NULL, - `penilaian_nyeri_kualitas` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain') NOT NULL, - `penilaian_nyeri_lokasi` varchar(50) NOT NULL, - `penilaian_nyeri_menyebar` enum('Tidak','Ya') NOT NULL, - `penilaian_nyeri_skala` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `penilaian_nyeri_waktu` varchar(5) NOT NULL, - `penilaian_nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat') NOT NULL, - `penilaian_nyeri_diberitahukan_dokter` enum('Tidak','Ya') NOT NULL, - `penilaian_nyeri_jam_diberitahukan_dokter` varchar(10) NOT NULL, - `penilaian_jatuhmorse_skala1` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai1` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala2` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai2` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala3` enum('Tidak Ada/Kursi Roda/Perawat/Tirah Baring','Tongkat/Alat Penopang','Berpegangan Pada Perabot') DEFAULT NULL, - `penilaian_jatuhmorse_nilai3` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala4` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhmorse_nilai4` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala5` enum('Normal/Tirah Baring/Imobilisasi','Lemah','Terganggu') DEFAULT NULL, - `penilaian_jatuhmorse_nilai5` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_skala6` enum('Sadar Akan Kemampuan Diri Sendiri','Sering Lupa Akan Keterbatasan Yang Dimiliki') DEFAULT NULL, - `penilaian_jatuhmorse_nilai6` tinyint(4) DEFAULT NULL, - `penilaian_jatuhmorse_totalnilai` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala1` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai1` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala2` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai2` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala3` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai3` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala4` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai4` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala5` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai5` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala6` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai6` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala7` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai7` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala8` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai8` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala9` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai9` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala10` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai10` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_skala11` enum('Tidak','Ya') DEFAULT NULL, - `penilaian_jatuhsydney_nilai11` tinyint(4) DEFAULT NULL, - `penilaian_jatuhsydney_totalnilai` tinyint(4) DEFAULT NULL, - `skrining_gizi1` enum('Tidak ada penurunan berat badan','Tidak yakin/ tidak tahu/ terasa baju lebih longgar','Ya 1-5 kg','Ya 6-10 kg','Ya 11-15 kg','Ya > 15 kg') DEFAULT NULL, - `nilai_gizi1` int(11) DEFAULT NULL, - `skrining_gizi2` enum('Tidak','Ya') DEFAULT NULL, - `nilai_gizi2` int(11) DEFAULT NULL, - `nilai_total_gizi` double DEFAULT NULL, - `skrining_gizi_diagnosa_khusus` enum('Tidak','Ya') DEFAULT NULL, - `skrining_gizi_diketahui_dietisen` enum('Tidak','Ya') DEFAULT NULL, - `skrining_gizi_jam_diketahui_dietisen` varchar(10) DEFAULT NULL, - `rencana` varchar(200) DEFAULT NULL, - `nip1` varchar(20) NOT NULL, - `nip2` varchar(20) NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip1` (`nip1`) USING BTREE, - KEY `nip2` (`nip2`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_2` FOREIGN KEY (`nip1`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_3` FOREIGN KEY (`nip2`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_awal_keperawatan_ranap_ibfk_4` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_medis_igd -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_medis_igd` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(100) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(100) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `leher` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `ekg` text NOT NULL, - `rad` text NOT NULL, - `lab` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_igd_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_igd_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_medis_ralan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_medis_ralan` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(30) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(50) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `penunjang` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - `konsulrujuk` varchar(1000) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_ralan_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_ralan_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_medis_ranap -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_medis_ranap` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - `anamnesis` enum('Autoanamnesis','Alloanamnesis') NOT NULL, - `hubungan` varchar(100) NOT NULL, - `keluhan_utama` varchar(2000) NOT NULL DEFAULT '', - `rps` varchar(2000) NOT NULL, - `rpd` varchar(1000) NOT NULL DEFAULT '', - `rpk` varchar(1000) NOT NULL, - `rpo` varchar(1000) NOT NULL, - `alergi` varchar(100) NOT NULL DEFAULT '', - `keadaan` enum('Sehat','Sakit Ringan','Sakit Sedang','Sakit Berat') NOT NULL, - `gcs` varchar(10) NOT NULL, - `kesadaran` enum('Compos Mentis','Apatis','Somnolen','Sopor','Koma') NOT NULL, - `td` varchar(8) NOT NULL DEFAULT '', - `nadi` varchar(5) NOT NULL DEFAULT '', - `rr` varchar(5) NOT NULL, - `suhu` varchar(5) NOT NULL DEFAULT '', - `spo` varchar(5) NOT NULL, - `bb` varchar(5) NOT NULL DEFAULT '', - `tb` varchar(5) NOT NULL DEFAULT '', - `kepala` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `mata` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `gigi` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `tht` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `thoraks` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `jantung` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `paru` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `abdomen` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `genital` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ekstremitas` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `kulit` enum('Normal','Abnormal','Tidak Diperiksa') NOT NULL, - `ket_fisik` text NOT NULL, - `ket_lokalis` text NOT NULL, - `lab` text NOT NULL, - `rad` text NOT NULL, - `penunjang` text NOT NULL, - `diagnosis` varchar(500) NOT NULL, - `tata` text NOT NULL, - `edukasi` varchar(1000) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `kd_dokter` (`kd_dokter`) USING BTREE, - CONSTRAINT `mlite_penilaian_medis_ranap_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_medis_ranap_ibfk_2` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penilaian_ulang_nyeri -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penilaian_ulang_nyeri` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `nyeri` enum('Tidak Ada Nyeri','Nyeri Akut','Nyeri Kronis') NOT NULL, - `provokes` enum('Proses Penyakit','Benturan','Lain-lain','-') NOT NULL, - `ket_provokes` varchar(40) NOT NULL, - `quality` enum('Seperti Tertusuk','Berdenyut','Teriris','Tertindih','Tertiban','Lain-lain','-') NOT NULL, - `ket_quality` varchar(50) NOT NULL, - `lokasi` varchar(50) NOT NULL, - `menyebar` enum('Tidak','Ya') NOT NULL, - `skala_nyeri` enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL, - `durasi` varchar(25) NOT NULL, - `nyeri_hilang` enum('Istirahat','Medengar Musik','Minum Obat','-') NOT NULL, - `ket_nyeri` varchar(40) NOT NULL, - `manajemen_nyeri` varchar(1000) DEFAULT NULL, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`,`tanggal`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_penilaian_ulang_nyeri_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_penilaian_ulang_nyeri_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_penjualan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nama_pembeli` varchar(100) DEFAULT NULL, - `alamat_pembeli` varchar(100) DEFAULT NULL, - `nomor_telepon` varchar(50) DEFAULT NULL, - `email` varchar(50) DEFAULT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - `keterangan` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_penjualan_barang -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_barang` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nama_barang` varchar(100) DEFAULT NULL, - `stok` varchar(100) DEFAULT NULL, - `harga` varchar(100) DEFAULT NULL, - `keterangan` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_penjualan_billing -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_billing` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `id_penjualan` int(11) NOT NULL, - `jumlah_total` int(100) NOT NULL, - `potongan` int(100) DEFAULT NULL, - `jumlah_harus_bayar` int(100) NOT NULL, - `jumlah_bayar` int(100) NOT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_penjualan_detail -# ------------------------------------------------------------ - -CREATE TABLE `mlite_penjualan_detail` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `id_penjualan` int(11) NOT NULL, - `id_barang` int(11) NOT NULL, - `nama_barang` varchar(100) NOT NULL, - `harga` int(11) NOT NULL, - `jumlah` int(100) NOT NULL, - `harga_total` int(11) NOT NULL, - `tanggal` date NOT NULL, - `jam` time NOT NULL, - `id_user` varchar(50) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_peta_mukosa_rongga_mulut -# ------------------------------------------------------------ - -CREATE TABLE `mlite_peta_mukosa_rongga_mulut` ( - `no_rawat` varchar(17) NOT NULL, - `tanggal` datetime NOT NULL, - `kelainan` text, - `gambar` text, - `nip` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - KEY `nip` (`nip`) USING BTREE, - CONSTRAINT `mlite_peta_mukosa_rongga_mulut_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `mlite_peta_mukosa_rongga_mulut_ibfk_2` FOREIGN KEY (`nip`) REFERENCES `petugas` (`nip`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_rekening -# ------------------------------------------------------------ - -CREATE TABLE `mlite_rekening` ( - `kd_rek` varchar(15) NOT NULL DEFAULT '', - `nm_rek` varchar(100) DEFAULT NULL, - `tipe` enum('N','M','R') DEFAULT NULL, - `balance` enum('D','K') DEFAULT NULL, - `level` enum('0','1') DEFAULT NULL, - PRIMARY KEY (`kd_rek`), - KEY `nm_rek` (`nm_rek`), - KEY `tipe` (`tipe`), - KEY `balance` (`balance`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_rekeningtahun -# ------------------------------------------------------------ - -CREATE TABLE `mlite_rekeningtahun` ( - `thn` year(4) NOT NULL, - `kd_rek` varchar(15) NOT NULL DEFAULT '', - `saldo_awal` double NOT NULL, - PRIMARY KEY (`thn`,`kd_rek`), - KEY `kd_rek` (`kd_rek`), - KEY `saldo_awal` (`saldo_awal`), - CONSTRAINT `mlite_rekeningtahun_ibfk_1` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_remember_me -# ------------------------------------------------------------ - -CREATE TABLE `mlite_remember_me` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `token` text, - `user_id` int(10) NOT NULL, - `expiry` int(100) NOT NULL, - PRIMARY KEY (`id`), - KEY `mlite_remember_me_ibfk_1` (`user_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_satu_sehat_departemen -# ------------------------------------------------------------ - -CREATE TABLE `mlite_satu_sehat_departemen` ( - `dep_id` char(4) NOT NULL, - `id_organisasi_satusehat` varchar(40) DEFAULT NULL, - PRIMARY KEY (`dep_id`), - UNIQUE KEY `id_organisasi_satusehat` (`id_organisasi_satusehat`), - CONSTRAINT `mlite_satu_sehat_departemen_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `departemen` (`dep_id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_satu_sehat_lokasi -# ------------------------------------------------------------ - -CREATE TABLE `mlite_satu_sehat_lokasi` ( - `kode` char(5) NOT NULL, - `lokasi` varchar(40) DEFAULT NULL, - `id_organisasi_satusehat` varchar(40) DEFAULT NULL, - `id_lokasi_satusehat` varchar(40) DEFAULT NULL, - `longitude` varchar(30) NOT NULL, - `latitude` varchar(30) NOT NULL, - `altitude` varchar(30) NOT NULL, - PRIMARY KEY (`kode`), - UNIQUE KEY `id_lokasi_satusehat` (`id_lokasi_satusehat`), - KEY `id_organisasi_satusehat` (`id_organisasi_satusehat`), - CONSTRAINT `mlite_satu_sehat_lokasi_ibfk_2` FOREIGN KEY (`id_organisasi_satusehat`) REFERENCES `mlite_satu_sehat_departemen` (`id_organisasi_satusehat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_satu_sehat_mapping_praktisi -# ------------------------------------------------------------ - -CREATE TABLE `mlite_satu_sehat_mapping_praktisi` ( - `practitioner_id` varchar(40) NOT NULL, - `kd_dokter` varchar(20) NOT NULL, - PRIMARY KEY (`practitioner_id`), - KEY `kd_dokter` (`kd_dokter`), - CONSTRAINT `mlite_satu_sehat_mapping_praktisi_ibfk_1` FOREIGN KEY (`kd_dokter`) REFERENCES `dokter` (`kd_dokter`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_satu_sehat_response -# ------------------------------------------------------------ - -CREATE TABLE `mlite_satu_sehat_response` ( - `no_rawat` varchar(17) NOT NULL, - `id_encounter` varchar(50) DEFAULT NULL, - `id_condition` varchar(50) DEFAULT NULL, - `id_observation_ttvnadi` varchar(50) DEFAULT NULL, - `id_observation_ttvrespirasi` varchar(50) DEFAULT NULL, - `id_observation_ttvsuhu` varchar(50) DEFAULT NULL, - `id_observation_ttvspo2` varchar(50) DEFAULT NULL, - `id_observation_ttvgcs` varchar(50) DEFAULT NULL, - `id_observation_ttvtinggi` varchar(50) DEFAULT NULL, - `id_observation_ttvberat` varchar(50) DEFAULT NULL, - `id_observation_ttvperut` varchar(50) DEFAULT NULL, - `id_observation_ttvtensi` varchar(50) DEFAULT NULL, - `id_observation_ttvkesadaran` varchar(50) DEFAULT NULL, - `id_procedure` varchar(50) DEFAULT NULL, - `id_composition` varchar(50) DEFAULT NULL, - PRIMARY KEY (`no_rawat`), - CONSTRAINT `mlite_satu_sehat_response_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_settings -# ------------------------------------------------------------ - -CREATE TABLE `mlite_settings` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `module` varchar(100) NOT NULL, - `field` varchar(100) NOT NULL, - `value` varchar(1000) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `module` (`module`,`field`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -LOCK TABLES `mlite_settings` WRITE; -/*!40000 ALTER TABLE `mlite_settings` DISABLE KEYS */; - -INSERT INTO `mlite_settings` (`id`, `module`, `field`, `value`) -VALUES - (1,'settings','logo','uploads/settings/logo.png'), - (2,'settings','nama_instansi','mLITE Indonesia'), - (3,'settings','alamat','Jl. Perintis Kemerdekaan 45'), - (4,'settings','kota','Barabai'), - (5,'settings','propinsi','Kalimantan Selatan'), - (6,'settings','nomor_telepon','0812345678'), - (7,'settings','email','info@mlite.id'), - (8,'settings','website','https://mlite.id'), - (9,'settings','ppk_bpjs','-'), - (10,'settings','footer','Copyright {?=date(\"Y\")?} © by drg. F. Basoro. All rights reserved.'), - (11,'settings','homepage','main'), - (12,'settings','wallpaper','uploads/settings/wallpaper.jpg'), - (13,'settings','text_color','#44813e'), - (14,'settings','igd','IGDK'), - (15,'settings','laboratorium','-'), - (16,'settings','pj_laboratorium','DR001'), - (17,'settings','radiologi','-'), - (18,'settings','pj_radiologi','DR001'), - (19,'settings','dokter_ralan_per_dokter','false'), - (20,'settings','cekstatusbayar','false'), - (21,'settings','ceklimit','false'), - (22,'settings','responsivevoice','false'), - (23,'settings','notif_presensi','true'), - (24,'settings','BpjsApiUrl','https://apijkn-dev.bpjs-kesehatan.go.id/vclaim-rest-dev/'), - (25,'settings','BpjsConsID','-'), - (26,'settings','BpjsSecretKey','-'), - (27,'settings','BpjsUserKey','-'), - (28,'settings','timezone','Asia/Makassar'), - (29,'settings','theme','default'), - (30,'settings','theme_admin','mlite'), - (31,'settings','admin_mode','complex'), - (32,'settings','input_kasir','tidak'), - (33,'settings','editor','wysiwyg'), - (34,'settings','version','5.1.0'), - (35,'settings','update_check','0'), - (36,'settings','update_changelog',''), - (37,'settings','update_version','0'), - (38,'settings','license',''), - (39,'farmasi','deporalan','-'), - (40,'farmasi','igd','-'), - (41,'farmasi','deporanap','-'), - (42,'farmasi','gudang','-'), - (43,'wagateway','server','https://mlite.id'), - (44,'wagateway','token','-'), - (45,'wagateway','phonenumber','-'), - (46,'anjungan','display_poli',''), - (47,'anjungan','carabayar',''), - (48,'anjungan','antrian_loket','1'), - (49,'anjungan','antrian_cs','2'), - (50,'anjungan','antrian_apotek','3'), - (51,'anjungan','panggil_loket','1'), - (52,'anjungan','panggil_loket_nomor','1'), - (53,'anjungan','panggil_cs','1'), - (54,'anjungan','panggil_cs_nomor','1'), - (55,'anjungan','panggil_apotek','1'), - (56,'anjungan','panggil_apotek_nomor','1'), - (57,'anjungan','text_anjungan','Running text anjungan pasien mandiri.....'), - (58,'anjungan','text_loket','Running text display antrian loket.....'), - (59,'anjungan','text_poli','Running text display antrian poliklinik.....'), - (60,'anjungan','text_laboratorium','Running text display antrian laboratorium.....'), - (61,'anjungan','text_apotek','Running text display antrian apotek.....'), - (62,'anjungan','text_farmasi','Running text display antrian farmasi.....'), - (63,'anjungan','vidio','G4im8_n0OoI'), - (64,'api','apam_key','qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341'), - (65,'api','apam_status_daftar','Terdaftar'), - (66,'api','apam_status_dilayani','Anda siap dilayani'), - (67,'api','apam_webappsurl','http://localhost/webapps/'), - (68,'api','apam_normpetugas','000001,000002'), - (69,'api','apam_limit','2'), - (70,'api','apam_smtp_host','ssl://smtp.gmail.com'), - (71,'api','apam_smtp_port','465'), - (72,'api','apam_smtp_username',''), - (73,'api','apam_smtp_password',''), - (74,'api','apam_kdpj',''), - (75,'api','apam_kdprop',''), - (76,'api','apam_kdkab',''), - (77,'api','apam_kdkec',''), - (78,'api','duitku_merchantCode',''), - (79,'api','duitku_merchantKey',''), - (80,'api','duitku_paymentAmount',''), - (81,'api','duitku_paymentMethod',''), - (82,'api','duitku_productDetails',''), - (83,'api','duitku_expiryPeriod',''), - (84,'api','duitku_kdpj',''), - (85,'api','berkasdigital_key','qtbexUAxzqO3M8dCOo2vDMFvgYjdUEdMLVo341'), - (86,'jkn_mobile','x_username','jkn'), - (87,'jkn_mobile','x_password','mobile'), - (88,'jkn_mobile','header_token','X-Token'), - (89,'jkn_mobile','header_username','X-Username'), - (90,'jkn_mobile','header_password','X-Password'), - (91,'jkn_mobile','BpjsConsID',''), - (92,'jkn_mobile','BpjsSecretKey',''), - (93,'jkn_mobile','BpjsUserKey',''), - (94,'jkn_mobile','BpjsAntrianUrl','https://apijkn-dev.bpjs-kesehatan.go.id/antreanrs_dev/'), - (95,'jkn_mobile','kd_pj_bpjs',''), - (96,'jkn_mobile','exclude_taskid',''), - (97,'jkn_mobile','display',''), - (98,'jkn_mobile','kdprop','1'), - (99,'jkn_mobile','kdkab','1'), - (100,'jkn_mobile','kdkec','1'), - (101,'jkn_mobile','kdkel','1'), - (102,'jkn_mobile','perusahaan_pasien',''), - (103,'jkn_mobile','suku_bangsa',''), - (104,'jkn_mobile','bahasa_pasien',''), - (105,'jkn_mobile','cacat_fisik',''), - (106,'keuangan','jurnal_kasir','0'), - (107,'keuangan','akun_kredit_pendaftaran',''), - (108,'keuangan','akun_kredit_tindakan',''), - (109,'keuangan','akun_kredit_obat_bhp',''), - (110,'keuangan','akun_kredit_laboratorium',''), - (111,'keuangan','akun_kredit_radiologi',''), - (112,'keuangan','akun_kredit_tambahan_biaya',''), - (113,'manajemen','penjab_umum','UMU'), - (114,'manajemen','penjab_bpjs','BPJ'), - (115,'presensi','lat','-2.58'), - (116,'presensi','lon','115.37'), - (117,'presensi','distance','2'), - (118,'presensi','helloworld','Jangan Lupa Bahagia; \nCara untuk memulai adalah berhenti berbicara dan mulai melakukan; \nWaktu yang hilang tidak akan pernah ditemukan lagi; \nKamu bisa membodohi semua orang, tetapi kamu tidak bisa membohongi pikiranmu; \nIni bukan tentang ide. Ini tentang mewujudkan ide; \nBekerja bukan hanya untuk mencari materi. Bekerja merupakan manfaat bagi banyak orang'), - (119,'vedika','carabayar',''), - (120,'vedika','sep',''), - (121,'vedika','skdp',''), - (122,'vedika','operasi',''), - (123,'vedika','individual',''), - (124,'vedika','billing','mlite'), - (125,'vedika','periode','2023-01'), - (126,'vedika','verifikasi','2023-01'), - (127,'vedika','inacbgs_prosedur_bedah',''), - (128,'vedika','inacbgs_prosedur_non_bedah',''), - (129,'vedika','inacbgs_konsultasi',''), - (130,'vedika','inacbgs_tenaga_ahli',''), - (131,'vedika','inacbgs_keperawatan',''), - (132,'vedika','inacbgs_penunjang',''), - (133,'vedika','inacbgs_pelayanan_darah',''), - (134,'vedika','inacbgs_rehabilitasi',''), - (135,'vedika','inacbgs_rawat_intensif',''), - (136,'vedika','eklaim_url',''), - (137,'vedika','eklaim_key',''), - (138,'vedika','eklaim_kelasrs','CP'), - (139,'vedika','eklaim_payor_id','3'), - (140,'vedika','eklaim_payor_cd','JKN'), - (141,'vedika','eklaim_cob_cd','#'), - (142,'orthanc','server','http://localhost:8042'), - (143,'orthanc','username','orthanc'), - (144,'orthanc','password','orthanc'), - (145,'veronisa','username',''), - (146,'veronisa','password',''), - (147,'veronisa','obat_kronis',''), - (148,'jkn_mobile','kirimantrian','tidak'), - (149,'settings','keamanan','ya'), - (150,'dokter_ralan','set_sudah','tidak'), - (151,'settings','websocket','tidak'), - (152,'settings','websocket_proxy',''), - (153,'settings','username_fp',''), - (154,'settings','password_fp',''), - (155,'settings','username_frista',''), - (156,'settings','password_frista',''), - (157,'settings','billing_obat','false'), - (158,'settings','prefix_surat','RS'), - (159,'farmasi','keterangan_etiket',''), - (160,'pcare','consumerUserKeyAntrol',''); - -/*!40000 ALTER TABLE `mlite_settings` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_subrekening -# ------------------------------------------------------------ - -CREATE TABLE `mlite_subrekening` ( - `kd_rek` varchar(15) NOT NULL, - `kd_rek2` varchar(15) NOT NULL, - PRIMARY KEY (`kd_rek2`), - KEY `kd_rek` (`kd_rek`), - CONSTRAINT `mlite_subrekening_ibfk_1` FOREIGN KEY (`kd_rek`) REFERENCES `mlite_rekening` (`kd_rek`) ON UPDATE CASCADE, - CONSTRAINT `mlite_subrekening_ibfk_2` FOREIGN KEY (`kd_rek2`) REFERENCES `mlite_rekening` (`kd_rek`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_surat_rujukan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_surat_rujukan` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nomor_surat` varchar(100) DEFAULT NULL, - `no_rawat` varchar(100) DEFAULT NULL, - `no_rkm_medis` varchar(100) DEFAULT NULL, - `nm_pasien` varchar(100) DEFAULT NULL, - `tgl_lahir` varchar(100) DEFAULT NULL, - `umur` varchar(100) DEFAULT NULL, - `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, - `kepada` varchar(250) DEFAULT NULL, - `di` varchar(250) DEFAULT NULL, - `anamnesa` varchar(100) DEFAULT NULL, - `pemeriksaan_fisik` varchar(100) DEFAULT NULL, - `pemeriksaan_penunjang` varchar(100) DEFAULT NULL, - `diagnosa` varchar(100) DEFAULT NULL, - `terapi` varchar(100) DEFAULT NULL, - `alasan_dirujuk` varchar(250) DEFAULT NULL, - `dokter` varchar(100) DEFAULT NULL, - `petugas` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_surat_sakit -# ------------------------------------------------------------ - -CREATE TABLE `mlite_surat_sakit` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nomor_surat` varchar(100) DEFAULT NULL, - `no_rawat` varchar(100) DEFAULT NULL, - `no_rkm_medis` varchar(100) DEFAULT NULL, - `nm_pasien` varchar(100) DEFAULT NULL, - `tgl_lahir` varchar(100) DEFAULT NULL, - `umur` varchar(100) DEFAULT NULL, - `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, - `keadaan` varchar(100) DEFAULT NULL, - `diagnosa` varchar(100) DEFAULT NULL, - `lama_angka` varchar(100) DEFAULT NULL, - `lama_huruf` varchar(100) DEFAULT NULL, - `tanggal_mulai` varchar(100) DEFAULT NULL, - `tanggal_selesai` varchar(100) DEFAULT NULL, - `dokter` varchar(100) DEFAULT NULL, - `petugas` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_surat_sehat -# ------------------------------------------------------------ - -CREATE TABLE `mlite_surat_sehat` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nomor_surat` varchar(100) DEFAULT NULL, - `no_rawat` varchar(100) DEFAULT NULL, - `no_rkm_medis` varchar(100) DEFAULT NULL, - `nm_pasien` varchar(100) DEFAULT NULL, - `tgl_lahir` varchar(100) DEFAULT NULL, - `umur` varchar(100) DEFAULT NULL, - `jk` varchar(100) DEFAULT NULL, - `alamat` varchar(1000) DEFAULT NULL, - `tanggal` varchar(100) DEFAULT NULL, - `berat_badan` varchar(100) DEFAULT NULL, - `tinggi_badan` varchar(100) DEFAULT NULL, - `tensi` varchar(100) DEFAULT NULL, - `gol_darah` varchar(100) DEFAULT NULL, - `riwayat_penyakit` varchar(100) DEFAULT NULL, - `keperluan` varchar(100) DEFAULT NULL, - `dokter` varchar(100) DEFAULT NULL, - `petugas` varchar(100) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_temporary -# ------------------------------------------------------------ - -CREATE TABLE `mlite_temporary` ( - `temp1` text, - `temp2` text, - `temp3` text, - `temp4` text, - `temp5` text, - `temp6` text, - `temp7` text, - `temp8` text, - `temp9` text, - `temp10` text, - `temp11` text, - `temp12` text, - `temp13` text, - `temp14` text, - `temp15` text, - `temp16` text, - `temp17` text, - `temp18` text, - `temp19` text, - `temp20` text, - `temp21` text, - `temp22` text, - `temp23` text, - `temp24` text, - `temp25` text, - `temp26` text, - `temp27` text, - `temp28` text, - `temp29` text, - `temp30` text, - `temp31` text, - `temp32` text, - `temp33` text, - `temp34` text, - `temp35` text, - `temp36` text, - `temp37` text, - `temp38` text, - `temp39` text, - `temp40` text, - `temp41` text, - `temp42` text, - `temp43` text, - `temp44` text, - `temp45` text, - `temp46` text, - `temp47` text, - `temp48` text, - `temp49` text, - `temp50` text, - `temp51` text, - `temp52` text, - `temp53` text, - `temp54` text, - `temp55` text, - `temp56` text, - `temp57` text, - `temp58` text, - `temp59` text, - `temp60` text, - `temp61` text, - `temp62` text, - `temp63` text, - `temp64` text, - `temp65` text, - `temp66` text, - `temp67` text, - `temp68` text, - `temp69` text, - `temp70` text, - `temp71` text, - `temp72` text, - `temp73` text, - `temp74` text, - `temp75` text, - `temp76` text, - `temp77` text, - `temp78` text, - `temp79` text, - `temp80` text, - `temp81` text, - `temp82` text, - `temp83` text, - `temp84` text, - `temp85` text, - `temp86` text, - `temp87` text, - `temp88` text, - `temp89` text, - `temp90` text, - `temp91` text, - `temp92` text, - `temp93` text, - `temp94` text, - `temp95` text, - `temp96` text, - `temp97` text, - `temp98` text, - `temp99` text, - `temp100` text -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - - - -# Dump of table mlite_triase -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase` ( - `no_rawat` varchar(17) NOT NULL, - `tgl_kunjungan` datetime NOT NULL, - `cara_masuk` enum('Jalan','Brankar','Kursi Roda','Digendong') NOT NULL, - `alat_transportasi` enum('-','AGD','Sendiri','Swasta') NOT NULL, - `alasan_kedatangan` enum('Datang Sendiri','Polisi','Rujukan','-') NOT NULL, - `keterangan_kedatangan` varchar(100) NOT NULL, - `macam_kasus` enum('Trauma Kecelakaan Lalu Lintas','Trauma Kecelakaan Kerja','Trauma Kasus Unit Pelayanan Anak & Perempuan','Trauma Lainnya','Non Trauma') NOT NULL, - `tekanan_darah` varchar(8) NOT NULL, - `nadi` varchar(3) NOT NULL, - `pernapasan` varchar(3) NOT NULL, - `suhu` varchar(5) NOT NULL, - `saturasi_o2` varchar(3) NOT NULL, - `nyeri` varchar(5) NOT NULL, - `jenis_triase` enum('Primer','Sekunder') NOT NULL, - `keluhan_utama` varchar(500) NOT NULL, - `kebutuhan_khusus` enum('-','UPPA','Airborne','Dekontaminan') NOT NULL, - `catatan` varchar(100) NOT NULL, - `plan` enum('Ruang Resusitasi','Ruang Kritis','Zona Kuning','Zona Hijau') NOT NULL, - `nik` varchar(20) NOT NULL, - PRIMARY KEY (`no_rawat`) USING BTREE, - CONSTRAINT `mlite_triase_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_triase_detail -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_detail` ( - `no_rawat` varchar(17) NOT NULL, - `skala` varchar(3) NOT NULL, - `kode_skala` varchar(3) NOT NULL, - PRIMARY KEY (`no_rawat`,`skala`,`kode_skala`) USING BTREE, - CONSTRAINT `mlite_triase_detail_ibfk_1` FOREIGN KEY (`no_rawat`) REFERENCES `reg_periksa` (`no_rawat`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_triase_pemeriksaan -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_pemeriksaan` ( - `kode_pemeriksaan` varchar(3) NOT NULL, - `nama_pemeriksaan` varchar(150) DEFAULT NULL, - PRIMARY KEY (`kode_pemeriksaan`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_triase_skala -# ------------------------------------------------------------ - -CREATE TABLE `mlite_triase_skala` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `kode_pemeriksaan` varchar(3) NOT NULL, - `skala` int(11) NOT NULL, - `kode_skala` varchar(3) NOT NULL, - `pengkajian_skala` varchar(150) NOT NULL, - PRIMARY KEY (`id`) USING BTREE, - KEY `kode_pemeriksaan` (`kode_pemeriksaan`) USING BTREE, - CONSTRAINT `mlite_triase_skala_ibfk_1` FOREIGN KEY (`kode_pemeriksaan`) REFERENCES `mlite_triase_pemeriksaan` (`kode_pemeriksaan`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - - - -# Dump of table mlite_users -# ------------------------------------------------------------ - -CREATE TABLE `mlite_users` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` text, - `fullname` text, - `description` text, - `password` text, - `avatar` text, - `email` text, - `role` varchar(100) NOT NULL DEFAULT 'user', - `cap` varchar(100) DEFAULT '', - `access` varchar(500) NOT NULL DEFAULT 'dashboard', - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - -LOCK TABLES `mlite_users` WRITE; -/*!40000 ALTER TABLE `mlite_users` DISABLE KEYS */; - -INSERT INTO `mlite_users` (`id`, `username`, `fullname`, `description`, `password`, `avatar`, `email`, `role`, `cap`, `access`) -VALUES - (1,'admin','Administrator','Admin ganteng baik hati, suka menabung dan tidak sombong.','$2y$10$pgRnDiukCbiYVqsamMM3ROWViSRqbyCCL33N8.ykBKZx0dlplXe9i','avatar6422cb573b50c.png','info@mlite.id','admin','','all'), - (2,'DR001','dr. Ataaka Muhammad','-','$2y$10$kuf2BxvViduBpUTn.6Nxsug3AskH/PGvXTSlfCfJqK8Ayb9a0.vqC','avatar643a104444515.png','info@mlite.id','admin','','all'); - -/*!40000 ALTER TABLE `mlite_users` ENABLE KEYS */; -UNLOCK TABLES; - - -# Dump of table mlite_users_vedika -# ------------------------------------------------------------ - -CREATE TABLE `mlite_users_vedika` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` text, - `password` text, - `fullname` text, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_vedika -# ------------------------------------------------------------ - -CREATE TABLE `mlite_vedika` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `tanggal` date DEFAULT NULL, - `no_rkm_medis` varchar(6) NOT NULL, - `no_rawat` varchar(100) NOT NULL, - `tgl_registrasi` varchar(100) NOT NULL, - `nosep` varchar(100) NOT NULL, - `jenis` varchar(100) NOT NULL, - `status` varchar(100) NOT NULL, - `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_vedika_feedback -# ------------------------------------------------------------ - -CREATE TABLE `mlite_vedika_feedback` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nosep` varchar(100) NOT NULL, - `tanggal` date DEFAULT NULL, - `catatan` text, - `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_veronisa -# ------------------------------------------------------------ - -CREATE TABLE `mlite_veronisa` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `tanggal` date DEFAULT NULL, - `no_rkm_medis` varchar(6) NOT NULL, - `no_rawat` varchar(100) NOT NULL, - `tgl_registrasi` varchar(100) NOT NULL, - `nosep` varchar(100) NOT NULL, - `status` varchar(100) NOT NULL, - `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - - -# Dump of table mlite_veronisa_feedback -# ------------------------------------------------------------ - -CREATE TABLE `mlite_veronisa_feedback` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `nosep` varchar(100) NOT NULL, - `tanggal` date DEFAULT NULL, - `catatan` text, - `username` varchar(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `mlite_set_nomor_surat` ( - `nomor_surat` varchar(10) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/plugins/afm/Admin.php b/plugins/afm/Admin.php index 26191aec3..533c0bd75 100644 --- a/plugins/afm/Admin.php +++ b/plugins/afm/Admin.php @@ -6,6 +6,8 @@ class Admin extends AdminModule { + public $assign = []; + public function navigation() { return [ @@ -17,11 +19,15 @@ public function getManage() { $this->assign['title'] = 'Pengaturan Modul API AFM'; $this->assign['afm'] = htmlspecialchars_array($this->settings('afm')); - return $this->draw('settings.html', ['settings' => $this->assign]); + return $this->draw('settings.html', ['settings' => htmlspecialchars_array($this->assign)]); } public function postSaveSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'afm', 'manage'])); + } foreach ($_POST['afm'] as $key => $val) { $this->settings('afm', $key, $val); } diff --git a/plugins/afm/Help.md b/plugins/afm/Help.md deleted file mode 100644 index 1bc4f1632..000000000 --- a/plugins/afm/Help.md +++ /dev/null @@ -1,8 +0,0 @@ -Untuk menggunakan fitur ini, silahkan ikuti langkah-langkah berikut! -1. Aktifkan modul AFM (Anjungan finger mandiri). Jika anda bisa membaca tutorial ini berarti anda sudah mengaktifkan modulnya (LOL) ...!! -2. Isikan kredensial di pengaturan AFM, yag terdiri dari token AFM, username finger dan password finger BPJS. -3. Download file AFM di mLITE.id dengan klik mlite.id/page/afm -4. Extract dan jalankan file hasil download point 3 di Anjungan Finger mandiri -5. Silahkan ujicoba - -Jika ada kesulitan silahkan tanyakan di grup diff --git a/plugins/afm/Info.php b/plugins/afm/Info.php index 2a541debc..6d5ad33ea 100644 --- a/plugins/afm/Info.php +++ b/plugins/afm/Info.php @@ -3,8 +3,9 @@ 'name' => 'AFM', 'description' => 'Katalog API AFM mLITE', 'author' => 'Basoro', + 'category' => 'bridging', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'laptop', 'pages' => ['API AFM mLITE' => 'afm'], 'install' => function () use ($core) { diff --git a/plugins/afm/README.md b/plugins/afm/README.md new file mode 100644 index 000000000..0159411f3 --- /dev/null +++ b/plugins/afm/README.md @@ -0,0 +1,29 @@ +# Plugin AFM + +Dokumentasi singkat penggunaan modul **AFM** di mLITE. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **API AFM mLITE**. +- Pilih submenu sesuai kebutuhan: + - Kelola + +## Panduan Pengguna (Petugas) + +Plugin AFM bersifat konfigurasi teknis dan tidak memiliki alur operasional harian untuk petugas. Akses diberikan kepada admin teknis yang mengelola integrasi API. + +## Panduan Admin + +1. **Kelola (Pengaturan Token API)** + - Buka menu **API AFM mLITE → Kelola**. + - Isi field **AFM Token** dengan token autentikasi yang diberikan oleh penyedia layanan AFM. + - Isi **Username Finger** dan **Password Finger** untuk integrasi perangkat fingerprint. + - Isi **X-Header-Token** sesuai nama header yang disepakati dengan sistem eksternal (default: `X-Header-Token`). + - Klik **Simpan** untuk menyimpan konfigurasi. + +## Catatan + +- Token AFM bersifat rahasia; jangan bagikan ke pihak yang tidak berwenang. +- Perubahan token memerlukan sinkronisasi ulang dengan sistem eksternal yang menggunakan API ini. +- Plugin ini termasuk kategori **bridging** dan berfungsi sebagai katalog titik akses API AFM mLITE untuk integrasi sistem lain. diff --git a/plugins/afm/Site.php b/plugins/afm/Site.php index 25e6cd313..e0ad76c20 100644 --- a/plugins/afm/Site.php +++ b/plugins/afm/Site.php @@ -59,9 +59,13 @@ public function _getCariPasien() } else if ($header[$this->settings->get('afm.x_header_token')] == $this->settings->get('afm.afm_token')){ $cari = isset_or($decode['nomor_kartu'],''); $field = isset_or($decode['kolom'], 'no_rkm_medis'); - $sql = "SELECT no_peserta , no_rkm_medis , no_ktp , no_tlp FROM pasien WHERE " . $field . " = '" . $cari . "'"; + $allowed_fields = ['no_rkm_medis', 'no_peserta', 'no_ktp', 'no_tlp']; + if (!in_array($field, $allowed_fields)) { + $field = 'no_rkm_medis'; + } + $sql = "SELECT no_peserta , no_rkm_medis , no_ktp , no_tlp FROM pasien WHERE `" . $field . "` = :cari"; $query = $this->db()->pdo()->prepare($sql); - $query->execute(); + $query->execute([':cari' => $cari]); $cek_bookings = $query->fetch(); if (!is_array($cek_bookings)) { $cek_bookings = []; @@ -81,7 +85,7 @@ public function _getCariPasien() ); http_response_code(200); } - echo json_encode($response,true); + echo json_encode(htmlspecialchars_array($response),true); exit(); } @@ -134,7 +138,7 @@ public function _getBio() ); http_response_code(200); } - echo json_encode($response,true); + echo json_encode(htmlspecialchars_array($response),true); exit(); } @@ -201,7 +205,7 @@ public function _getRegPasien() http_response_code(200); } } - echo json_encode($response,true); + echo json_encode(htmlspecialchars_array($response),true); exit(); } @@ -253,7 +257,7 @@ public function _getUserPassFinger() ); http_response_code(200); } - echo json_encode($response,true); + echo json_encode(htmlspecialchars_array($response),true); exit(); } @@ -320,7 +324,7 @@ public function _getSepPatient() http_response_code(200); } } - echo json_encode($response,true); + echo json_encode(htmlspecialchars_array($response),true); exit(); } } diff --git a/plugins/afm/view/admin/settings.html b/plugins/afm/view/admin/settings.html index 72cc08877..bdff733e0 100644 --- a/plugins/afm/view/admin/settings.html +++ b/plugins/afm/view/admin/settings.html @@ -3,20 +3,20 @@
    -

    {$settings.title}

    +

    {?=isset_or($settings.title)?}

    - +
    - +
    - +
    @@ -32,6 +32,29 @@

    {$settings.title}

    +
    +
    +
    +

    Biometrik JKN BPJS

    +
    +
    +

    Instalasi

    + +

    Sebelum memulai instalasi, buka **Windows Powershell** lalu jalankan perintah berikut:

    + + + Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force; + +

    +

    Tujuannya untuk mengubah ExecutionPolicy supaya dapat menjalankan script instalasi.

    + +

    Download dan extract Zip, klik kanan script install.ps1 lalu pilih Run with PowerShell, ketik R untuk melanjutkan. Jika terdapat prompt terkait Execution Policy, ketik huruf A yakni Yes to All lalu tunggu hingga proses instalasi selesai. Jalankan perintah node .\index.js untuk mengaktikan bot biometrik. Server bot akan berjalan di port 3000 secara default dan seharusnya dapat di-akses melalui browser di alamat http://localhost:3000.

    +

    + Download +

    +
    +
    +
    diff --git a/plugins/anjungan/Admin.php b/plugins/anjungan/Admin.php index 1907b5788..5abfc87c2 100644 --- a/plugins/anjungan/Admin.php +++ b/plugins/anjungan/Admin.php @@ -6,6 +6,7 @@ class Admin extends AdminModule { + public $assign = []; public function navigation() { return [ @@ -23,7 +24,7 @@ public function getManage() ['name' => 'Pemanggil', 'url' => url([ADMIN, 'anjungan', 'pemanggil']), 'icon' => 'bullhorn', 'desc' => 'Pemanggil Antrian'], ['name' => 'Pengaturan', 'url' => url([ADMIN, 'anjungan', 'settings']), 'icon' => 'gear', 'desc' => 'Pengaturan Anjungan'], ]; - return $this->draw('manage.html', ['sub_modules' => $sub_modules]); + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function getIndex() @@ -209,16 +210,24 @@ public function getPemanggil() public function getSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'anjungan', 'index'])); + } $this->assign['title'] = 'Pengaturan Modul Anjungan'; $this->assign['poliklinik'] = $this->_getPoliklinik($this->settings->get('anjungan.display_poli')); $this->assign['penjab'] = $this->_getPenjab($this->settings->get('anjungan.carabayar')); $this->assign['anjungan'] = htmlspecialchars_array($this->settings('anjungan')); - return $this->draw('settings.html', ['settings' => $this->assign]); + return $this->draw('settings.html', ['settings' => htmlspecialchars_array($this->assign)]); } public function postSaveSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'anjungan', 'index'])); + } $_POST['anjungan']['display_poli'] = implode(',', $_POST['anjungan']['display_poli']); $_POST['anjungan']['carabayar'] = implode(',', $_POST['anjungan']['carabayar']); foreach ($_POST['anjungan'] as $key => $val) { diff --git a/plugins/anjungan/Help.md b/plugins/anjungan/Help.md deleted file mode 100644 index ee707d08c..000000000 --- a/plugins/anjungan/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
    - -
    diff --git a/plugins/anjungan/Info.php b/plugins/anjungan/Info.php index 8c42bb1fc..02a5e53a0 100644 --- a/plugins/anjungan/Info.php +++ b/plugins/anjungan/Info.php @@ -3,8 +3,9 @@ 'name' => 'Anjungan', 'description' => 'Modul anjungan pasien rawat jalan', 'author' => 'Basoro', + 'category' => 'bridging', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'desktop', 'pages' => ['Anjungan Pasien Mandiri' => 'anjungan'], 'install' => function () use ($core) { diff --git a/plugins/anjungan/README.md b/plugins/anjungan/README.md new file mode 100644 index 000000000..ba694d169 --- /dev/null +++ b/plugins/anjungan/README.md @@ -0,0 +1,55 @@ +# Plugin Anjungan + +Dokumentasi singkat penggunaan modul **Anjungan Pasien Mandiri** di mLITE. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Anjungan Pasien Mandiri**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Display + - Pemanggil + - Pengaturan + +## Panduan Pengguna (Petugas) + +Petugas loket, CS, dan apotek menggunakan fitur **Pemanggil** untuk memanggil nomor antrian pasien: + +1. **Panggil Antrian Loket** + - Buka **Pemanggil → Panggil Loket**. + - Klik tombol loket yang dituju untuk memanggil nomor antrian berikutnya. + - Sistem akan memperbarui nomor antrian dan memutar suara pemanggilan. + - Gunakan tombol **Reset** untuk mereset nomor antrian ke awal hari. + +2. **Panggil Antrian CS** + - Buka **Pemanggil → Panggil CS**. + - Proses sama seperti pemanggil loket, menggunakan antrian tipe CS. + +3. **Panggil Antrian Apotek** + - Buka **Pemanggil → Panggil Apotek**. + - Proses sama seperti pemanggil loket, menggunakan antrian tipe Apotek. + +4. **Display Informasi** + - Buka submenu **Display** untuk menampilkan layar informasi antrian poliklinik, loket, laboratorium, dan apotek secara publik (dapat dipasang di monitor ruang tunggu). + +## Panduan Admin + +1. **Pengaturan Anjungan** + - Buka **Anjungan → Pengaturan**. + - Pilih **Poliklinik** yang ditampilkan di anjungan (multiselect). + - Pilih **Cara Bayar** yang diperbolehkan mendaftar mandiri. + - Atur nomor antrian awal untuk Loket, CS, dan Apotek. + - Isi **Running Text** untuk setiap layar display (anjungan, loket, poli, lab, apotek, farmasi). + - Isi **ID Video YouTube** yang akan ditayangkan di layar anjungan. + - Klik **Simpan** untuk menyimpan pengaturan. + +2. **Reset Antrian Harian** + - Gunakan fungsi reset antrian (Loket/CS/Apotek) di awal hari atau saat antrian perlu dimulai ulang. + - Reset dapat dipicu melalui endpoint yang tersedia di Admin.php (`resetAnjunganLoket`, `resetAnjunganCS`, `resetAnjunganApotek`). + +## Catatan + +- Suara pemanggilan menggunakan file audio digit (0–9) di folder `plugins/anjungan/suara/`. +- Layar Display dapat dibuka di browser terpisah atau monitor publik tanpa login admin. +- Pastikan nomor antrian awal di pengaturan sudah benar sebelum operasional dimulai setiap hari. diff --git a/plugins/anjungan/Site.php b/plugins/anjungan/Site.php index 3e9b6e3c4..510061be2 100644 --- a/plugins/anjungan/Site.php +++ b/plugins/anjungan/Site.php @@ -27,6 +27,11 @@ public function init() public function routes() { + // Auth or IP Restriction Check + if (strpos($_SERVER['REQUEST_URI'], '/anjungan') !== false) { + $this->_checkAccess(); + } + $this->route('anjungan', 'getIndex'); $this->route('anjungan/pasien', 'getDisplayAPM'); $this->route('anjungan/loket', 'getDisplayAntrianLoket'); @@ -48,6 +53,7 @@ public function routes() $this->route('anjungan/display/poli/(:str)', 'getDisplayAntrianPoliDisplay'); $this->route('anjungan/display/poli/(:str)/(:str)', 'getDisplayAntrianPoliDisplay'); $this->route('anjungan/laboratorium', 'getDisplayAntrianLaboratorium'); + $this->route('anjungan/radiologi', 'getDisplayAntrianRadiologi'); $this->route('anjungan/apotek', 'getDisplayAntrianApotek'); $this->route('anjungan/apotek/ambilantrian', 'getDisplayAntrianApotekAmbil'); $this->route('anjungan/ajax', 'getAjax'); @@ -70,6 +76,151 @@ public function routes() //$this->route('anjungan/daftar/baru/(:str)', 'getDaftarBPJS'); } + private function _checkAccess() + { + // 1. Check if user is logged in + if (isset($_SESSION['mlite_user'])) { + return true; + } + + // 2. Check if IP is local/intranet + $clientIP = $_SERVER['REMOTE_ADDR']; + + // Define local/intranet ranges + // localhost, 127.0.0.1, ::1 + // 10.0.0.0 - 10.255.255.255 + // 172.16.0.0 - 172.31.255.255 + // 192.168.0.0 - 192.168.255.255 + + $isLocal = false; + + // Check for IPv6 localhost + if ($clientIP === '::1') { + $isLocal = true; + } + + // Check for IPv4 + $ipLong = ip2long($clientIP); + + if ($ipLong !== false) { + // 127.0.0.0/8 + if (($ipLong & 0xFF000000) === 0x7F000000) { + $isLocal = true; + } + // 10.0.0.0/8 + elseif (($ipLong & 0xFF000000) === 0x0A000000) { + $isLocal = true; + } + // 172.16.0.0/12 + elseif (($ipLong & 0xFFF00000) === 0xAC100000) { + $isLocal = true; + } + // 192.168.0.0/16 + elseif (($ipLong & 0xFFFF0000) === 0xC0A80000) { + $isLocal = true; + } + } + + if (!$isLocal) { + http_response_code(403); + $logo = $this->settings->get('settings.logo'); + $instansi = $this->settings->get('settings.nama_instansi'); + $alamat = $this->settings->get('settings.alamat'); + $ip = $_SERVER['REMOTE_ADDR']; + + $html = ' + + + Access Denied - ' . htmlspecialchars($instansi) . ' + + + + +
    + ' . ($logo ? '' : '') . ' +

    Akses Ditolak

    +
    IP Anda: ' . htmlspecialchars($ip) . '
    +

    + Maaf, halaman Anjungan hanya dapat diakses melalui jaringan lokal (Intranet) Rumah Sakit atau oleh pengguna yang telah terautentikasi. +

    + Login Disini + +
    + + '; + + die($html); + } + + return true; + } + public function getIndex() { echo $this->draw('index.html', ['test' => 'Opo iki']); @@ -80,7 +231,7 @@ public function getDisplayAPM() { $title = 'Display Antrian Poliklinik'; $logo = $this->settings->get('settings.logo'); - $poliklinik = $this->db('poliklinik')->toArray(); + $poliklinik = $this->db('poliklinik')->where('status', '1')->toArray(); $carabayar = str_replace(",","','", $this->settings->get('anjungan.carabayar')); $penjab = $this->db()->pdo()->prepare("SELECT * FROM penjab WHERE kd_pj IN ('$carabayar')"); $penjab->execute(); @@ -438,7 +589,6 @@ public function _resultDisplayAntrianPoli() } $row['selanjutnya'] = $this->db('reg_periksa') ->select('reg_periksa.no_reg') - //->select(['no_urut_reg' => 'ifnull(MAX(CONVERT(RIGHT(reg_periksa.no_reg,3),signed)),0)']) ->select('pasien.nm_pasien') ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') ->where('reg_periksa.tgl_registrasi', $date) @@ -448,11 +598,11 @@ public function _resultDisplayAntrianPoli() ->asc('reg_periksa.no_reg') ->toArray(); $row['get_no_reg'] = $this->db('reg_periksa') - ->select(['max' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)']) - ->where('tgl_registrasi', $date) - ->where('kd_poli', $row['kd_poli']) - ->where('kd_dokter', $row['kd_dokter']) - ->oneArray(); + ->where('tgl_registrasi', $date) + ->where('kd_poli', $row['kd_poli']) + ->where('kd_dokter', $row['kd_dokter']) + ->nextRightNumber('no_reg', 3); + $row['diff'] = (strtotime($row['jam_selesai'])-strtotime($row['jam_mulai']))/60; $row['interval'] = 0; if($row['diff'] == 0) { @@ -690,7 +840,6 @@ public function _resultDisplayAntrianPoliKodeSatu() } $row['selanjutnya'] = $this->db('reg_periksa') ->select('reg_periksa.no_reg') - //->select(['no_urut_reg' => 'ifnull(MAX(CONVERT(RIGHT(reg_periksa.no_reg,3),signed)),0)']) ->select('pasien.nm_pasien') ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') ->where('reg_periksa.tgl_registrasi', $date) @@ -699,12 +848,13 @@ public function _resultDisplayAntrianPoliKodeSatu() ->where('reg_periksa.kd_dokter', $row['kd_dokter']) ->asc('reg_periksa.no_reg') ->toArray(); + $row['get_no_reg'] = $this->db('reg_periksa') - ->select(['max' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)']) ->where('tgl_registrasi', $date) ->where('kd_poli', $row['kd_poli']) ->where('kd_dokter', $row['kd_dokter']) - ->oneArray(); + ->nextRightNumber('no_reg', 3); + $row['diff'] = (strtotime($row['jam_selesai'])-strtotime($row['jam_mulai']))/60; $row['interval'] = 0; if($row['diff'] == 0) { @@ -823,7 +973,6 @@ public function _resultDisplayAntrianPoliKodeDua() } $row['selanjutnya'] = $this->db('reg_periksa') ->select('reg_periksa.no_reg') - //->select(['no_urut_reg' => 'ifnull(MAX(CONVERT(RIGHT(reg_periksa.no_reg,3),signed)),0)']) ->select('pasien.nm_pasien') ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') ->where('reg_periksa.tgl_registrasi', $date) @@ -833,11 +982,10 @@ public function _resultDisplayAntrianPoliKodeDua() ->asc('reg_periksa.no_reg') ->toArray(); $row['get_no_reg'] = $this->db('reg_periksa') - ->select(['max' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)']) ->where('tgl_registrasi', $date) ->where('kd_poli', $row['kd_poli']) ->where('kd_dokter', $row['kd_dokter']) - ->oneArray(); + ->nextRightNumber('no_reg', 3); $row['diff'] = (strtotime($row['jam_selesai'])-strtotime($row['jam_mulai']))/60; $row['interval'] = 0; if($row['diff'] == 0) { @@ -956,7 +1104,6 @@ public function _resultDisplayAntrianPoliKodeTiga() } $row['selanjutnya'] = $this->db('reg_periksa') ->select('reg_periksa.no_reg') - //->select(['no_urut_reg' => 'ifnull(MAX(CONVERT(RIGHT(reg_periksa.no_reg,3),signed)),0)']) ->select('pasien.nm_pasien') ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') ->where('reg_periksa.tgl_registrasi', $date) @@ -966,11 +1113,10 @@ public function _resultDisplayAntrianPoliKodeTiga() ->asc('reg_periksa.no_reg') ->toArray(); $row['get_no_reg'] = $this->db('reg_periksa') - ->select(['max' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)']) ->where('tgl_registrasi', $date) ->where('kd_poli', $row['kd_poli']) ->where('kd_dokter', $row['kd_dokter']) - ->oneArray(); + ->nextRightNumber('no_reg', 3); $row['diff'] = (strtotime($row['jam_selesai'])-strtotime($row['jam_mulai']))/60; $row['interval'] = 0; if($row['diff'] == 0) { @@ -1097,7 +1243,6 @@ public function _resultDisplayAntrianPoliKodeDisplay() } $row['selanjutnya'] = $this->db('reg_periksa') ->select('reg_periksa.no_reg') - //->select(['no_urut_reg' => 'ifnull(MAX(CONVERT(RIGHT(reg_periksa.no_reg,3),signed)),0)']) ->select('pasien.nm_pasien') ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') ->where('reg_periksa.tgl_registrasi', $date) @@ -1107,11 +1252,10 @@ public function _resultDisplayAntrianPoliKodeDisplay() ->asc('reg_periksa.no_reg') ->toArray(); $row['get_no_reg'] = $this->db('reg_periksa') - ->select(['max' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)']) ->where('tgl_registrasi', $date) ->where('kd_poli', $row['kd_poli']) ->where('kd_dokter', $row['kd_dokter']) - ->oneArray(); + ->nextRightNumber('no_reg', 3); $row['diff'] = (strtotime($row['jam_selesai'])-strtotime($row['jam_mulai']))/60; $row['interval'] = 0; if($row['diff'] == 0) { @@ -1252,31 +1396,124 @@ public function getDisplayAntrianLaboratorium() //exit(); } - public function _resultDisplayAntrianLaboratorium() + public function getDisplayAntrianRadiologi() { - $date = date('Y-m-d'); - $tentukan_hari=date('D',strtotime(date('Y-m-d'))); - $day = array( - 'Sun' => 'AKHAD', - 'Mon' => 'SENIN', - 'Tue' => 'SELASA', - 'Wed' => 'RABU', - 'Thu' => 'KAMIS', - 'Fri' => 'JUMAT', - 'Sat' => 'SABTU' - ); - $hari=$day[$tentukan_hari]; + $logo = $this->settings->get('settings.logo'); + $title = 'Display Antrian Radiologi'; + $display = $this->_resultDisplayAntrianRadiologi(); - $poliklinik = $this->settings('settings', 'laboratorium'); - $rows = $this->db('reg_periksa') - ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') - ->where('tgl_registrasi', date('Y-m-d')) - ->where('kd_poli', $poliklinik) - ->asc('no_reg') - ->toArray(); + $_username = ''; + $__username = 'Tamu'; + if(isset($_SESSION['mlite_user'])) { + $_username = $this->core->getUserInfo('fullname', null, true); + $__username = $this->core->getUserInfo('username'); + } + $tanggal = getDayIndonesia(date('Y-m-d')).', '.dateIndonesia(date('Y-m-d')); + $username = !empty($_username) ? $_username : $__username; + $running_text = $this->settings->get('anjungan.text_radiologi'); + if(empty($running_text)) { + $running_text = $this->settings->get('anjungan.text_laboratorium'); + } - return $rows; + $content = $this->draw('display.antrian.radiologi.html', [ + 'logo' => $logo, + 'title' => $title, + 'powered' => 'Powered by mLITE', + 'username' => $username, + 'tanggal' => $tanggal, + 'running_text' => $running_text, + 'display' => $display + ]); + + $assign = [ + 'title' => $this->settings->get('settings.nama_instansi'), + 'desc' => $this->settings->get('settings.alamat'), + 'content' => $content + ]; + + $this->setTemplate("canvas.html"); + $this->tpl->set('page', ['title' => $assign['title'], 'desc' => $assign['desc'], 'content' => $assign['content']]); + } + + public function _resultDisplayAntrianLaboratorium() + { + $date_start = date('Y-m-d', strtotime('-1 month')); + $date = date('Y-m-d'); + + $rows = $this->db('permintaan_lab') + ->join('dokter', 'dokter.kd_dokter=permintaan_lab.dokter_perujuk') + ->join('reg_periksa', 'reg_periksa.no_rawat=permintaan_lab.no_rawat') + ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->join('permintaan_pemeriksaan_lab', 'permintaan_pemeriksaan_lab.noorder=permintaan_lab.noorder') + ->join('jns_perawatan_lab', 'jns_perawatan_lab.kd_jenis_prw=permintaan_pemeriksaan_lab.kd_jenis_prw') + ->where('permintaan_lab.tgl_hasil', '0000-00-00') + ->where('permintaan_lab.tgl_permintaan', '>=', $date_start) + ->where('permintaan_lab.tgl_permintaan', '<=', $date) + ->group('permintaan_lab.noorder') + ->desc('permintaan_lab.tgl_permintaan') + ->toArray(); + + $filteredRows = []; + foreach ($rows as $row) { + + // Tentukan status untuk data yang akan ditampilkan + if ($row['tgl_sampel'] == '0000-00-00' && $row['jam_sampel'] == '00:00:00') { + $row['status_antrian'] = 'Menunggu'; + $row['status_class'] = 'label-warning'; + } elseif ($row['tgl_sampel'] != '0000-00-00' && $row['jam_sampel'] != '00:00:00') { + $row['status_antrian'] = 'Diproses'; + $row['status_class'] = 'label-success'; + } else { + $row['status_antrian'] = 'Diproses'; + $row['status_class'] = 'label-warning'; + } + + $filteredRows[] = $row; } + + $rows = $filteredRows; + + return $rows; + } + + public function _resultDisplayAntrianRadiologi() + { + $date_start = date('Y-m-d', strtotime('-1 month')); + $date = date('Y-m-d'); + + $rows = $this->db('permintaan_radiologi') + ->join('dokter', 'dokter.kd_dokter=permintaan_radiologi.dokter_perujuk') + ->join('reg_periksa', 'reg_periksa.no_rawat=permintaan_radiologi.no_rawat') + ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->join('permintaan_pemeriksaan_radiologi', 'permintaan_pemeriksaan_radiologi.noorder=permintaan_radiologi.noorder') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw=permintaan_pemeriksaan_radiologi.kd_jenis_prw') + ->where('permintaan_radiologi.tgl_hasil', '0000-00-00') + ->where('permintaan_radiologi.tgl_permintaan', '>=', $date_start) + ->where('permintaan_radiologi.tgl_permintaan', '<=', $date) + ->group('permintaan_radiologi.noorder') + ->desc('permintaan_radiologi.tgl_permintaan') + ->toArray(); + + $filteredRows = []; + foreach ($rows as $row) { + if ($row['tgl_sampel'] == '0000-00-00' && $row['jam_sampel'] == '00:00:00') { + $row['status_antrian'] = 'Menunggu'; + $row['status_class'] = 'label-warning'; + } elseif ($row['tgl_sampel'] != '0000-00-00' && $row['jam_sampel'] != '00:00:00') { + $row['status_antrian'] = 'Diproses'; + $row['status_class'] = 'label-success'; + } else { + $row['status_antrian'] = 'Diproses'; + $row['status_class'] = 'label-warning'; + } + + $filteredRows[] = $row; + } + + return $filteredRows; + } public function getDisplayAntrianApotek() { @@ -1729,7 +1966,6 @@ public function getAjax() case "simpanloket": $this->db('mlite_antrian_loket') ->save([ - 'kd' => NULL, 'type' => 'Loket', 'noantrian' => $_GET['noantrian'], 'postdate' => date('Y-m-d'), @@ -1801,7 +2037,6 @@ public function getAjax() case "simpancs": $this->db('mlite_antrian_loket') ->save([ - 'kd' => NULL, 'type' => 'CS', 'noantrian' => $_GET['noantrian'], 'postdate' => date('Y-m-d'), @@ -1876,7 +2111,6 @@ public function getAjax() case "simpanapotek": $this->db('mlite_antrian_loket') ->save([ - 'kd' => NULL, 'type' => 'Apotek', 'noantrian' => $_GET['noantrian'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -1965,7 +2199,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } break; @@ -1982,7 +2216,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } break; @@ -1992,7 +2226,7 @@ public function getAjax() if($this->db('reg_periksa')->where('no_rkm_medis', $_POST['no_rkm_medis'])->where('tgl_registrasi', $_POST['tgl_registrasi'])->oneArray()) { $data['status'] = 'exist'; $data['result'] = ''; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $tanggal = $_POST['tgl_registrasi']; $tentukan_hari = date('D',strtotime($tanggal)); @@ -2014,7 +2248,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } } break; @@ -2060,7 +2294,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } } break; @@ -2076,7 +2310,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } break; case "get-namadokter": @@ -2091,7 +2325,7 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } break; case "post-registrasi": @@ -2146,7 +2380,7 @@ public function getAjax() $_POST['umurdaftar'] = $umur; $_POST['sttsumur'] = $sttsumur; $_POST['status_lanjut'] = 'Ralan'; - $_POST['kd_pj'] = $this->settings->get('anjungan.carabayar_umum'); + // $_POST['kd_pj'] = $this->settings->get('anjungan.carabayar_umum'); $_POST['status_bayar'] = 'Belum Bayar'; $_POST['no_rawat'] = $this->core->setNoRawat($date); $_POST['jam_reg'] = date('H:i:s'); @@ -2180,7 +2414,80 @@ public function getAjax() $data['status'] = 'err'; $data['result'] = ''; } - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); + } + break; + case "loket-display": + $apotek = $this->db('mlite_antrian_loket') + ->select('noantrian') + ->select('loket') + ->where('type', 'Apotek') + ->where('postdate', date('Y-m-d')) + ->where('status', '>=', 1) + ->desc('kd') + ->oneArray(); + + echo json_encode([ + 'loket' => [ + 'antrian' => (string) $this->settings->get('anjungan.no_antrian_loket'), + 'counter' => (string) $this->settings->get('anjungan.konter_antrian_loket') + ], + 'cs' => [ + 'antrian' => (string) $this->settings->get('anjungan.no_antrian_cs'), + 'counter' => (string) $this->settings->get('anjungan.konter_antrian_cs') + ], + 'apotek' => [ + 'antrian' => isset($apotek['noantrian']) ? (string) $apotek['noantrian'] : '', + 'counter' => isset($apotek['loket']) ? (string) $apotek['loket'] : '' + ] + ]); + break; + // FOR DISPLAY + case "apotek-display": + $rows = $this->_resultDisplayAntrianApotek(); + foreach ($rows as $row) { + echo '
  • ' + . ''. $row['noantrian'] . ' '. $row['nm_pasien'] . ' - ' . $row['no_rkm_medis'] . ' Resep: ' . $row['jenis_resep'] . ' Status: ' . $row['status_resep'] . '
    ' + . '
  • '; + } + break; + case "laboratorium-display": + $rows = $this->_resultDisplayAntrianLaboratorium(); + foreach ($rows as $row) { + + echo '
  • ' + . '' . ' Nama: ' . $row['nm_pasien'] . ', No. RM: ' . $row['no_rkm_medis'] . ' Status: ' . $row['status_antrian'] . '
    ' + . '
  • '; + } + break; + case "radiologi-display": + $rows = $this->_resultDisplayAntrianRadiologi(); + foreach ($rows as $row) { + echo '
  • ' + . '' . ' Nama: ' . $row['nm_pasien'] . ', No. RM: ' . $row['no_rkm_medis'] . ' Status: ' . $row['status_antrian'] . '
    ' + . '
  • '; + } + break; + case "bed-display": + $rows = $this->_resultDisplayBed(); + foreach ($rows as $row) { + echo '' + . '' . $row['nm_bangsal'] . '' + . '' . $row['kelas'] . '' + . '' + . 'Jumlah Kosong : ' . $row['kosong']['jumlah'] . ' | Jumlah Terisi : ' . $row['isi']['jumlah'] + . '' + . ''; + } + break; + case "operasi-display": + $rows = $this->_resultDisplayJadwalOperasi(); + foreach ($rows as $row) { + echo '
  • ' + . 'Nama: ' . $row['nm_pasien'] . ', No. RM: ' . $row['no_rkm_medis'] . 'Status: ' . $row['status'] . '
    ' + . '[ Operator : ' . $row['namadok'] . ' ] [ Rujukan Dari : ' + . '{if: $row.kd_poli == "IGDK"}' . $row['kamar.namabangsal'] . '{elseif: $row.kd_poli == "U0027"}' . $row['kamar.namabangsal'] . '{else}' . $row['namapoli'] . '{/if} ]
    ' + . '
  • '; } break; } @@ -2206,7 +2513,7 @@ public function getPresensi() 'powered' => 'Powered by mLITE', 'tanggal' => $tanggal, 'running_text' => $this->settings->get('anjungan.text_poli'), - 'jam_jaga' => $this->db('jam_jaga')->group('jam_masuk')->toArray() + 'jam_jaga' => $this->db('jam_jaga')->select('jam_masuk')->select('jam_pulang')->group('jam_masuk')->toArray() ]); $assign = [ @@ -2266,40 +2573,43 @@ public function getUpload() $idpeg = $this->db('barcode')->where('barcode', $barcode)->oneArray(); $jam_jaga = $this->db('jam_jaga')->join('pegawai', 'pegawai.departemen = jam_jaga.dep_id')->where('pegawai.id', $idpeg['id'])->where('jam_jaga.shift', $_GET['shift'])->oneArray(); - $jadwal_pegawai = $this->db('jadwal_pegawai')->where('id', $idpeg['id'])->where('h'.date('j'), $_GET['shift'])->oneArray(); + $jadwal_pegawai = $this->db('jadwal_pegawai')->where('id', $idpeg['id'])->where('h'.date('j'), $_GET['shift'])->where('bulan', date('m'))->where('tahun', date('Y'))->oneArray(); - $set_keterlambatan = $this->db('set_keterlambatan')->toArray(); - $toleransi = $set_keterlambatan['toleransi']; - $terlambat1 = $set_keterlambatan['terlambat1']; - $terlambat2 = $set_keterlambatan['terlambat2']; + $set_keterlambatan = $this->db('set_keterlambatan')->oneArray(); + $toleransi = $set_keterlambatan['toleransi'] ?? 0; + $terlambat1 = $set_keterlambatan['terlambat1'] ?? 0; + $terlambat2 = $set_keterlambatan['terlambat2'] ?? 0; - $valid = $this->db('rekap_presensi')->where('id', $idpeg['id'])->where('shift', $jam_jaga['shift'])->like('jam_datang', '%'.date('Y-m-d').'%')->oneArray(); + $valid = $this->db('rekap_presensi')->where('id', $idpeg['id'])->where('shift', $jam_jaga['shift'] ?? '')->like('jam_datang', '%'.date('Y-m-d').'%')->oneArray(); if($valid){ - $this->notify('failure', 'Anda sudah presensi untuk tanggal '.date('Y-m-d')); + echo "Anda sudah presensi untuk tanggal ".date('Y-m-d'); //}elseif((!empty($idpeg['id']))&&(!empty($jam_jaga['shift']))&&($jadwal_pegawai)&&(!$valid)) { }elseif((!empty($idpeg['id']))) { $cek = $this->db('temporary_presensi')->where('id', $idpeg['id'])->oneArray(); if(!$cek){ if(empty($urlnya)){ - $this->notify('failure', 'Pilih shift dulu...!!!!'); + echo "Pilih shift dulu...!!!!"; }else{ - + + $keterlambatan = '00:00:00'; $status = 'Tepat Waktu'; + $jam_masuk = $jam_jaga['jam_masuk'] ?? '00:00:00'; + $shift_jaga = $jam_jaga['shift'] ?? ''; - if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_jaga['jam_masuk']))>($toleransi*60)) { + if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_masuk))>($toleransi*60)) { $status = 'Terlambat Toleransi'; } - if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_jaga['jam_masuk']))>($terlambat1*60)) { + if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_masuk))>($terlambat1*60)) { $status = 'Terlambat I'; } - if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_jaga['jam_masuk']))>($terlambat2*60)) { + if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_masuk))>($terlambat2*60)) { $status = 'Terlambat II'; } - if(strtotime(date('Y-m-d H:i:s'))-(date('Y-m-d').' '.$jam_jaga['jam_masuk'])>($toleransi*60)) { - $awal = new \DateTime(date('Y-m-d').' '.$jam_jaga['jam_masuk']); + if((strtotime(date('Y-m-d H:i:s')) - strtotime(date('Y-m-d').' '.$jam_masuk)) > ($toleransi*60)) { + $awal = new \DateTime(date('Y-m-d').' '.$jam_masuk); $akhir = new \DateTime(); $diff = $akhir->diff($awal,true); // to make the difference to be always positive. $keterlambatan = $diff->format('%H:%I:%S'); @@ -2309,7 +2619,7 @@ public function getUpload() $insert = $this->db('temporary_presensi') ->save([ 'id' => $idpeg['id'], - 'shift' => $jam_jaga['shift'], + 'shift' => $shift_jaga, 'jam_datang' => date('Y-m-d H:i:s'), 'jam_pulang' => NULL, 'status' => $status, @@ -2319,13 +2629,15 @@ public function getUpload() ]); if($insert) { - $this->notify('success', 'Presensi Masuk jam '.$jam_jaga['jam_masuk'].' '.$status.' '.$keterlambatan); + echo htmlspecialchars("Presensi Masuk jam ".$jam_masuk." ".$status." ".$keterlambatan." telah disimpan", ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } } }elseif($cek){ $status = $cek['status']; - if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_jaga['jam_pulang']))<0) { + $jam_pulang = $jam_jaga['jam_pulang'] ?? '00:00:00'; + + if((strtotime(date('Y-m-d H:i:s'))-strtotime(date('Y-m-d').' '.$jam_pulang))<0) { $status = $cek['status'].' & PSW'; } @@ -2357,13 +2669,13 @@ public function getUpload() 'photo' => $presensi['photo'] ]); if($insert) { - $this->notify('success', 'Presensi pulang telah disimpan'); $this->db('temporary_presensi')->where('id', $cek['id'])->delete(); + echo htmlspecialchars("Presensi Masuk jam ".$presensi['jam_datang']." ".$presensi['status']." ".$presensi['keterlambatan']." telah disimpan", ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } } } }else{ - $this->notify('failure', 'ID Pegawai atau jadwal shift tidak sesuai. Silahkan pilih berdasarkan shift departemen anda!'); + echo "ID Pegawai atau jadwal shift tidak sesuai. Silahkan pilih berdasarkan shift departemen anda!"; } } } @@ -2497,6 +2809,7 @@ public function getSepMandiriCek() public function getSepMandiriNokaNorm() { + $dateNow = date('Y-m-d'); date_default_timezone_set('UTC'); $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); $key = $this->consid.$this->secretkey.$tStamp; @@ -2523,6 +2836,7 @@ public function getSepMandiriNokaNorm() $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); $decompress = '""'; + $biometrik = ''; if(!empty($json)): if ($code != "200") { @@ -2531,6 +2845,22 @@ public function getSepMandiriNokaNorm() if(!empty($stringDecrypt)) { $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); $sep_response = json_decode($decompress, true); + + $url = $this->api_url . '/SEP/FingerPrint/Peserta/' . $slug[2] . '/TglPelayanan/'.$dateNow.''; + $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $json = json_decode($output, true); + //echo json_encode(htmlspecialchars_array($json)); + $code = $json['metaData']['code']; + $message = $json['metaData']['message']; + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + if ($json != null) { + $biometrik = json_decode($decompress, true)['status']; + } + } else { $sep_response = "Sambungan ke server BPJS sedang ada gangguan. Silahkan ulangi lagi dengan menekan tombol REFRESH"; } @@ -2538,6 +2868,7 @@ public function getSepMandiriNokaNorm() else: $sep_response = "Sambungan ke server BPJS sedang ada gangguan. Silahkan ulangi lagi dengan menekan tombol REFRESH"; endif; + } $title = 'Display SEP Mandiri'; @@ -2560,7 +2891,8 @@ public function getSepMandiriNokaNorm() 'tanggal' => $tanggal, 'running_text' => $this->settings->get('anjungan.text_anjungan'), 'no_rkm_medis' => $slug[3], - 'sep_response' => $sep_response + 'sep_response' => $sep_response, + 'biometrik' => $biometrik ]); $assign = [ @@ -2774,6 +3106,7 @@ public function postSaveSEP() $cek_kuota['jam_mulai'] = date('H:i:s',strtotime('+'.$minutes.' minutes',strtotime($jadwaldokter['jam_mulai']))); $kodebooking = $this->settings->get('settings.ppk_bpjs').''.convertNorawat($reg_periksa['no_rawat']).''.$maping_poli_bpjs['kd_poli_bpjs'].''.$reg_periksa['no_reg']; + $tlp = substr($pasien['no_tlp'], 0, 13); $jenisKunjungan = '1'; $nomorreferensi = $_POST['norujukan']; if(isset($_POST['tujuanKunj']) == '2') { @@ -2785,7 +3118,7 @@ public function postSaveSEP() 'jenispasien' => 'JKN', 'nomorkartu' => $pasien['no_peserta'], 'nik' => $pasien['no_ktp'], - 'nohp' => $pasien['no_tlp'], + 'nohp' => $tlp, 'kodepoli' => $maping_poli_bpjs['kd_poli_bpjs'], 'namapoli' => $maping_poli_bpjs['nm_poli_bpjs'], 'pasienbaru' => '0', @@ -2995,7 +3328,7 @@ public function postSaveSEP() 'prb' => $_POST['prolanis_prb'] ]); } - echo $_POST['sep_no_sep']; + echo htmlspecialchars($_POST['sep_no_sep']); } else { $simpan_sep = $this->db('bridging_sep_internal')->save([ 'no_sep' => $_POST['sep_no_sep'], @@ -3055,7 +3388,7 @@ public function postSaveSEP() } else { - echo $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); @@ -3319,7 +3652,7 @@ public function getDaftarBPJS($nik) $url = $this->api_url . 'Peserta/nik/' . $nik . '/tglSEP/' . $tglPelayananSEP; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); diff --git a/plugins/anjungan/suara/lab.mp3 b/plugins/anjungan/suara/lab.mp3 new file mode 100644 index 000000000..d34f78257 Binary files /dev/null and b/plugins/anjungan/suara/lab.mp3 differ diff --git a/plugins/anjungan/view/admin/index.html b/plugins/anjungan/view/admin/index.html index 09f3dab24..8750942e0 100644 --- a/plugins/anjungan/view/admin/index.html +++ b/plugins/anjungan/view/admin/index.html @@ -59,6 +59,36 @@

    Antrian Laboratorium

    +
    +
    +
    +

    Antrian Apotek

    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +

    Antrian Radiologi

    +
    +
    +
    + +
    + +
    +
    +
    diff --git a/plugins/anjungan/view/admin/manage.html b/plugins/anjungan/view/admin/manage.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/anjungan/view/admin/manage.html +++ b/plugins/anjungan/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
  • diff --git a/plugins/anjungan/view/admin/pemanggil.html b/plugins/anjungan/view/admin/pemanggil.html index aa8815a80..4c96c5835 100644 --- a/plugins/anjungan/view/admin/pemanggil.html +++ b/plugins/anjungan/view/admin/pemanggil.html @@ -118,23 +118,23 @@
    -
    Loket {$value}
    +
    Loket {?=isset_or($value)?}
    -
    {?=strtoupper($namaloket)?}{$antrian}
    +
    {?=strtoupper($namaloket)?}{?=isset_or($antrian)?}
    -
    {$powered}
    +
    {?=isset_or($powered)?}
    diff --git a/plugins/anjungan/view/display.antrian.poli.html b/plugins/anjungan/view/display.antrian.poli.html index f204e1cf1..c2c2b9bd5 100644 --- a/plugins/anjungan/view/display.antrian.poli.html +++ b/plugins/anjungan/view/display.antrian.poli.html @@ -7,7 +7,7 @@ - {$title} - {$settings.nama_instansi} + {?=isset_or($title)?} - {?=isset_or($settings.nama_instansi)?} @@ -38,7 +38,7 @@
    -

    Antrian Poliklinik {$settings.nama_instansi}

    +

    Antrian Poliklinik {?=isset_or($settings.nama_instansi)?}

    @@ -50,14 +50,14 @@

    {$value.nm_dokter}
    {$value.nm_poli}
    [ Antrian: {$value.dalam_antrian.jumlah} - Terlayani: {$value.sudah_dilayani.jumlah} ] -

    + +
    {if: empty($value.dalam_pemeriksaan)}Kosong{else}{$value.dalam_pemeriksaan.no_reg} - {$value.dalam_pemeriksaan.nm_pasien}{/if}{?=isset_or($value.nm_dokter)?}
    {?=isset_or($value.nm_poli)?}
    [ Antrian: {?=isset_or($value.dalam_antrian.jumlah)?} - Terlayani: {?=isset_or($value.sudah_dilayani.jumlah)?} ]
    {if: empty($value.dalam_pemeriksaan)}Kosong{else}{?=isset_or($value.dalam_pemeriksaan.no_reg)?} - {?=isset_or($value.dalam_pemeriksaan.nm_pasien)?}{/if} {if: !empty($value.selanjutnya)} {loop: $value.selanjutnya as $data} - - {$data.nm_pasien} ({$data.no_reg}) - + - {?=isset_or($data.nm_pasien)?} ({?=isset_or($data.no_reg)?}) + {/loop} {/if} @@ -67,16 +67,16 @@

    -

    {$running_text}

    +

    {?=isset_or($running_text)?}

    Made with by drg. F. Basoro. - {$powered}. + {?=isset_or($powered)?}.

    -

    {$tanggal} {?= sprintf('Login sebagai %s', $username) ?}

    +

    {?=isset_or($tanggal)?} {?= sprintf('Login sebagai %s', $username) ?}

    diff --git a/plugins/anjungan/view/display.antrian.poli.kode.html b/plugins/anjungan/view/display.antrian.poli.kode.html index 575a8da50..62e87f4dc 100644 --- a/plugins/anjungan/view/display.antrian.poli.kode.html +++ b/plugins/anjungan/view/display.antrian.poli.kode.html @@ -6,7 +6,7 @@ - {$title} - {$settings.nama_instansi} + {?=isset_or($title)?} - {?=isset_or($settings.nama_instansi)?} @@ -40,11 +40,17 @@
    -

    Antrian Poliklinik {$settings.nama_instansi}

    +

    Antrian Poliklinik {?=isset_or($settings.nama_instansi)?}

    - +
    @@ -54,9 +60,9 @@

    {if: empty($running_text)} - {loop: $jadwal} {$value.nm_dokter} [{$value.nm_poli}] - {$value.jam_mulai} s/d {$value.jam_selesai} WITA {/loop} + {loop: $jadwal} {?=isset_or($value.nm_dokter)?} [{?=isset_or($value.nm_poli)?}] - {?=isset_or($value.jam_mulai)?} s/d {?=isset_or($value.jam_selesai)?} WITA {/loop} {else} - {$running_text} + {?=isset_or($running_text)?} {/if}

    @@ -64,9 +70,9 @@

    Made with by drg. F. Basoro. - {$powered}. + {?=isset_or($powered)?}.

    -

    {$tanggal} {?= sprintf('Login sebagai %s', $username) ?}

    +

    {?=isset_or($tanggal)?} {?= sprintf('Login sebagai %s', $username) ?}

    + + + + +
    +

    Antrian Radiologi {$settings.nama_instansi}

    + + + + + + +
    +
    +
      +
      +
      +
      +

      {$running_text}

      +
      +
      +
      +
      +

      + Made with by drg. F. Basoro. + {$powered}. +

      +

      {$tanggal} {?= sprintf('Login sebagai %s', $username) ?}

      +
      +
      + + + + + diff --git a/plugins/anjungan/view/display.bed.html b/plugins/anjungan/view/display.bed.html index 1de11049e..5a1e291f1 100644 --- a/plugins/anjungan/view/display.bed.html +++ b/plugins/anjungan/view/display.bed.html @@ -1,89 +1,103 @@ - + - - - - - - {$title} - {$settings.nama_instansi} - - - - - - - + .marquee { + width: 100%; + overflow: scroll; + height: calc(75vh); + /* border: 1px solid #ccc; */ + background: #0264d6; + } + + -
      -

      Bed Management {$settings.nama_instansi}

      - - - - - - - - -
      BangsalKelasStatus
      -
      - - - {loop: $display} - - - - - - {/loop} - -
      {$value.nm_bangsal}{$value.kelas} - Jumlah Kosong : {$value.kosong.jumlah} | Jumlah Terisi : {$value.isi.jumlah} -
      -
      -
      -
      -
      -

      - Made with by drg. F. Basoro. - {$powered}. -

      -

      {$tanggal} {?= sprintf('Login sebagai %s', $username) ?}

      +
      +

      Bed Management {?=isset_or($settings.nama_instansi)?}

      + + + + + + + + +
      BangsalKelasStatus
      +
      + + + +
      +
      -
      +
      +
      +

      + Made with by drg. F. + Basoro. + {?=isset_or($powered)?}. +

      +

      {?=isset_or($tanggal)?} {?= + sprintf('Login sebagai %s', $username) ?}

      +
      +
      + + $('.marquee').marquee() + + $(document).ready(function () { + loadBed(); + }); + function loadBed() { + $.get('{?=url()?}/anjungan/ajax?show=bed-display', function (html) { + $("#bed-display").html(html); + + }); + } + \ No newline at end of file diff --git a/plugins/anjungan/view/display.jadwal.operasi.html b/plugins/anjungan/view/display.jadwal.operasi.html index df81d1a20..015094eaa 100644 --- a/plugins/anjungan/view/display.jadwal.operasi.html +++ b/plugins/anjungan/view/display.jadwal.operasi.html @@ -7,7 +7,7 @@ - {$title} - {$settings.nama_instansi} + {?=isset_or($title)?} - {?=isset_or($settings.nama_instansi)?} @@ -39,23 +39,13 @@
      -

      Jadwal Operasi {$settings.nama_instansi}

      +

      Jadwal Operasi {?=isset_or($settings.nama_instansi)?}

      @@ -69,10 +59,21 @@

      Made with by drg. F. Basoro. - {$powered}. + {?=isset_or($powered)?}.

      -

      {$tanggal} {?= sprintf('Login sebagai %s', $username) ?}

      +

      {?=isset_or($tanggal)?} {?= sprintf('Login sebagai %s', $username) ?}

      + diff --git a/plugins/anjungan/view/presensi.html b/plugins/anjungan/view/presensi.html index 6ffbaa5c3..a69272558 100644 --- a/plugins/anjungan/view/presensi.html +++ b/plugins/anjungan/view/presensi.html @@ -6,7 +6,7 @@ - {$title} - {$settings.nama_instansi} + {?=isset_or($title)?} - {?=isset_or($settings.nama_instansi)?} @@ -22,7 +22,7 @@ body:before { content: ""; position: absolute; - background: url('{?=url()?}/{$wallpaper}'); + background: url('{?=url()?}/{?=isset_or($wallpaper)?}'); background-size: cover; z-index: -1; /* Keep the background behind the content */ height: 20%; width: 20%; /* Using Glen Maddern's trick /via @mente */ @@ -36,7 +36,7 @@ text-align: center; } .text_color { - color: {$text_color} !important; + color: {?=isset_or($text_color)?} !important; } .button { position: absolute; @@ -54,40 +54,38 @@ footer a, footer a:hover { color: #fff; } - .btn-group .btn-fab{ - position: fixed !important; - right: 20px; - bottom: 60px; + .center-page { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } +
      -

      Presensi Pegawai {$settings.nama_instansi}

      -
      - -
      - {if: $notify} -
      - {/if} - +

      Made with by drg. F. Basoro. - {$powered}. + {?=isset_or($powered)?}.

      -

      {$tanggal}

      +

      {?=isset_or($tanggal)?}

      @@ -99,26 +97,55 @@

      {$running_text}

      + +
      + + + + @@ -165,18 +192,14 @@

      {$running_text}

      var base64image = document.getElementById("imageprev").src; Webcam.upload(base64image, '{?=url()?}/anjungan/presensi/upload/?barcode=' + barcode + '&shift=' + getshift, function(code, text) { + if(text) { + alert(text); + console.log(text); + } }); Webcam.reset(); - navigator.geolocation.getCurrentPosition( - function(position) { - $.get('{?=url(ADMIN.'/dashboard/geolocation/')?}', {lat: position.coords.latitude, lng: position.coords.longitude}); - }, - function error(err) {}, - {enableHighAccuracy: true, timeout: 5000} - ); - window.location.href = '{?=url()?}/anjungan/presensi'; }); diff --git a/plugins/anjungan/view/rincian.eresep.html b/plugins/anjungan/view/rincian.eresep.html index 8ca42352b..6477fe522 100644 --- a/plugins/anjungan/view/rincian.eresep.html +++ b/plugins/anjungan/view/rincian.eresep.html @@ -13,11 +13,11 @@
      Non Racikan
      {loop: $resep} - - - + + + @@ -29,11 +29,11 @@
      Non Racikan
      {loop: $value.resep_dokter as $data} - - - + + + - + {/loop} {/loop} @@ -61,11 +61,11 @@
      Racikan
      {loop: $resep_racikan} - - - + + + @@ -75,10 +75,10 @@
      Racikan
      - - - - + + + + @@ -88,9 +88,9 @@
      Racikan
      {loop: $value.resep_dokter_racikan_detail as $data} - - - + + + {/loop} diff --git a/plugins/anjungan/view/sep.mandiri.bikin.html b/plugins/anjungan/view/sep.mandiri.bikin.html index fe7972eca..78c56aac6 100644 --- a/plugins/anjungan/view/sep.mandiri.bikin.html +++ b/plugins/anjungan/view/sep.mandiri.bikin.html @@ -5,13 +5,14 @@ - {$title} - {$settings.nama_instansi} + {?=isset_or($title)?} - {?=isset_or($settings.nama_instansi)?} + @@ -176,6 +197,40 @@
      Silahkan Pilih Poli Tujuan

      +

      {$running_text}

      @@ -198,6 +253,54 @@

      {$running_text}

      + + diff --git a/plugins/api/view/admin/settings.apam.html b/plugins/api/view/admin/settings.apam.html index d1456a9f6..3b255d72a 100644 --- a/plugins/api/view/admin/settings.apam.html +++ b/plugins/api/view/admin/settings.apam.html @@ -3,75 +3,75 @@
      -

      {$settings.title}

      +

      {?=isset_or($settings.title)?}

      - +
      - +
      - +
      - +
      - +

      Pisahkan dengan tanda koma

      - +

      Limit untuk kuota. Misal 2 (50%), 4 (25%) dari kuota dalam jadwal

      - +
      - +
      - +
      - +
      - +
        - +
          - +
            @@ -87,37 +87,37 @@

            Pengaturan e-Payment Telemedicine Duitku

            - +

            Ada di dashboard Duitku.COM

            - +

            Ada di dashboard Duitku.COM

            - +

            Biaya Konsultasi Online (Duitku Payment Amount)

            - +

            A1 = ATM Bersama, WW = duitku wallet, VC = Credit Card, MY = Mandiri Clickpay, BK = BCA KlikPay

            - +
            - +

            Batas kadaluarsa pembayaran Virtual Account

            diff --git a/plugins/api/view/admin/settings.key.html b/plugins/api/view/admin/settings.key.html index 22963b0ac..7e75f810c 100644 --- a/plugins/api/view/admin/settings.key.html +++ b/plugins/api/view/admin/settings.key.html @@ -3,12 +3,12 @@
            -

            {$settings.title}

            +

            {?=isset_or($settings.title)?}

            - +
            diff --git a/plugins/apotek_ralan/Admin.php b/plugins/apotek_ralan/Admin.php index 1ff2c6ae9..d20fe6918 100644 --- a/plugins/apotek_ralan/Admin.php +++ b/plugins/apotek_ralan/Admin.php @@ -5,6 +5,75 @@ class Admin extends AdminModule { + protected array $assign = []; + + protected function isBillingParsialEnabled() + { + $val = $this->settings->get('settings.billing_parsial'); + if ($val === null || $val === '') { + return true; + } + return ((string) $val) === 'true'; + } + + protected function getDrugTaxPercent() + { + $taxPercent = $this->settings->get('farmasi.pajak_obat_persen'); + $taxPercent = is_numeric($taxPercent) ? (float) $taxPercent : 0; + + return max(0, min(100, $taxPercent)); + } + + protected function calculateDrugUnitPrice($basePrice) + { + $basePrice = (float) $basePrice; + return round($basePrice + (($basePrice * $this->getDrugTaxPercent()) / 100), 2); + } + + protected function calculateDrugSubtotal($basePrice, $quantity) + { + return round($this->calculateDrugUnitPrice($basePrice) * (float) $quantity, 2); + } + + protected function calculateDrugGrandTotal($basePrice, $quantity, $embalase = 0, $tuslah = 0) + { + return round( + $this->calculateDrugSubtotal($basePrice, $quantity) + (float) $embalase + (float) $tuslah, + 2 + ); + } + + protected function getParsialPaidTotalObat($noRawat) + { + try { + $stmt = $this->core->db()->pdo()->prepare("SELECT COALESCE(SUM(d.jumlah_alokasi), 0) AS total + FROM mlite_billing_pembayaran_detail d + INNER JOIN mlite_billing_pembayaran h ON h.id = d.pembayaran_id + WHERE h.no_rawat = ? AND d.kelompok = 'OBAT'"); + $stmt->execute([(string) $noRawat]); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + return (float) ($row['total'] ?? 0); + } catch (\Exception $e) { + return 0; + } + } + + protected function getParsialHistoryObat($noRawat) + { + try { + $stmt = $this->core->db()->pdo()->prepare("SELECT h.id, h.tgl_bayar, h.jam_bayar, h.metode, h.id_user, h.keterangan, + COALESCE(SUM(d.jumlah_alokasi), 0) AS jumlah_obat + FROM mlite_billing_pembayaran h + INNER JOIN mlite_billing_pembayaran_detail d ON d.pembayaran_id = h.id AND d.kelompok = 'OBAT' + WHERE h.no_rawat = ? + GROUP BY h.id + ORDER BY h.tgl_bayar DESC, h.jam_bayar DESC, h.id DESC"); + $stmt->execute([(string) $noRawat]); + return $stmt->fetchAll(\PDO::FETCH_ASSOC); + } catch (\Exception $e) { + return []; + } + } public function navigation() { @@ -30,7 +99,7 @@ public function anyManage() } $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa); - return $this->draw('manage.html', ['rawat_jalan' => $this->assign, 'cek_vclaim' => $cek_vclaim]); + return $this->draw('manage.html', ['rawat_jalan' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim)]); } public function anyDisplay() @@ -50,7 +119,7 @@ public function anyDisplay() } $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa); - echo $this->draw('display.html', ['rawat_jalan' => $this->assign, 'cek_vclaim' => $cek_vclaim]); + echo $this->draw('display.html', ['rawat_jalan' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim)]); exit(); } @@ -66,6 +135,7 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' $this->assign['tgl_registrasi']= date('Y-m-d'); $this->assign['jam_reg']= date('H:i:s'); + $params = []; $sql = "SELECT reg_periksa.*, pasien.*, dokter.*, @@ -73,10 +143,12 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' penjab.* FROM reg_periksa, pasien, dokter, poliklinik, penjab WHERE reg_periksa.no_rkm_medis = pasien.no_rkm_medis - AND reg_periksa.tgl_registrasi BETWEEN '$tgl_kunjungan' AND '$tgl_kunjungan_akhir' + AND reg_periksa.tgl_registrasi BETWEEN ? AND ? AND reg_periksa.kd_dokter = dokter.kd_dokter AND reg_periksa.kd_poli = poliklinik.kd_poli AND reg_periksa.kd_pj = penjab.kd_pj"; + $params[] = $tgl_kunjungan; + $params[] = $tgl_kunjungan_akhir; if($status_periksa == 'belum') { $sql .= " AND reg_periksa.stts = 'Belum'"; @@ -89,7 +161,7 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' } $stmt = $this->db()->pdo()->prepare($sql); - $stmt->execute(); + $stmt->execute($params); $rows = $stmt->fetchAll(); $this->assign['list'] = []; @@ -138,11 +210,11 @@ public function postSaveDetail() 'no_rawat' => $_POST['no_rawat'], 'kode_brng' => $_POST['kd_jenis_prw'], 'h_beli' => $_POST['biaya'], - 'biaya_obat' => $_POST['biaya'], + 'biaya_obat' => $this->calculateDrugUnitPrice($_POST['biaya']), 'jml' => $_POST['jml'], - 'embalase' => '0', - 'tuslah' => '0', - 'total' => $_POST['biaya'] * $_POST['jml'], + 'embalase' => $_POST['embalase'], + 'tuslah' => $_POST['tuslah'], + 'total' => $this->calculateDrugSubtotal($_POST['biaya'], $_POST['jml']), 'status' => 'Ralan', 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), 'no_batch' => $get_gudangbarang['no_batch'], @@ -213,15 +285,24 @@ public function postSaveDetail() 'no_rawat' => $_POST['no_rawat'], 'kode_brng' => $_POST['kode_brng'][$i]['value'], 'h_beli' => $kapasitas['h_beli'], - 'biaya_obat' => $kapasitas['dasar'], + 'biaya_obat' => $this->calculateDrugUnitPrice($kapasitas['dasar']), 'jml' => $jml, - 'embalase' => '0', - 'tuslah' => '0', - 'total' => $kapasitas['dasar'] * $jml, + 'embalase' => $_POST['embalase'], + 'tuslah' => $_POST['tuslah'], + 'total' => $this->calculateDrugSubtotal($kapasitas['dasar'], $jml), 'status' => 'Ralan', 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), 'no_batch' => $get_gudangbarang['no_batch'], 'no_faktur' => $get_gudangbarang['no_faktur'] + ]); + + $this->db('detail_obat_racikan') + ->save([ + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam' => $_POST['jam_rawat'], + 'no_rawat' => $_POST['no_rawat'], + 'no_racik' => $no_racik, + 'kode_brng' => $_POST['kode_brng'][$i]['value'] ]); } @@ -246,17 +327,72 @@ public function postValidasiResep() ->toArray(); $get_resep_dokter_racikan = $this->db('resep_dokter_racikan') ->select([ + 'no_racik' => 'resep_dokter_racikan.no_racik', + 'nama_racik' => 'resep_dokter_racikan.nama_racik', + 'kd_racik' => 'resep_dokter_racikan.kd_racik', + 'jml_dr' => 'resep_dokter_racikan.jml_dr', + 'keterangan' => 'resep_dokter_racikan.keterangan', 'kode_brng' => 'kode_brng', 'jml' => 'jml', 'aturan_pakai' => 'aturan_pakai' ]) - ->join('resep_dokter_racikan_detail', 'resep_dokter_racikan_detail.no_resep=resep_dokter_racikan.no_resep') + ->join('resep_dokter_racikan_detail', 'resep_dokter_racikan_detail.no_resep=resep_dokter_racikan.no_resep AND resep_dokter_racikan.no_racik=resep_dokter_racikan_detail.no_racik') ->where('resep_dokter_racikan.no_resep', $_POST['no_resep']) - // ->where('resep_dokter_racikan.no_racik=resep_dokter_racikan_detail.no_racik') ->toArray(); $get_resep_dokter = array_merge($get_resep_dokter_nonracikan, $get_resep_dokter_racikan); + + $embalaseData = isset($_POST['embalase']) ? json_decode($_POST['embalase'], true) : []; + $tuslahData = isset($_POST['tuslah']) ? json_decode($_POST['tuslah'], true) : []; + $jumlahData = isset($_POST['jumlah']) ? json_decode($_POST['jumlah'], true) : []; + $kandunganData = isset($_POST['kandungan']) ? json_decode($_POST['kandungan'], true) : []; + $aturanPakaiData = isset($_POST['aturan_pakai']) ? json_decode($_POST['aturan_pakai'], true) : []; + + if(!empty($get_resep_dokter_racikan)) { + // Group by no_racik to avoid duplicate inserts + $racikan_unique = []; + foreach ($get_resep_dokter_racikan as $row) { + if (!isset($racikan_unique[$row['no_racik']])) { + $racikan_unique[$row['no_racik']] = $row; + } + } + + foreach ($racikan_unique as $racikan) { + // Ambil aturan pakai dari input jika ada (prioritas), jika tidak gunakan dari database + $aturan_pakai_racikan = isset($aturanPakaiData[$racikan['kd_racik']]) ? $aturanPakaiData[$racikan['kd_racik']] : $racikan['aturan_pakai']; + + $this->db('obat_racikan')->save( + [ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $_POST['no_rawat'], + 'no_racik' => htmlspecialchars_array($racikan)['no_racik'], + 'nama_racik' => htmlspecialchars_array($racikan)['nama_racik'], + 'kd_racik' => htmlspecialchars_array($racikan)['kd_racik'], + 'jml_dr' => htmlspecialchars_array($racikan)['jml_dr'], + 'aturan_pakai' => $aturan_pakai_racikan, + 'keterangan' => htmlspecialchars_array($racikan)['keterangan'] + ] + ); + } + } + + foreach ($get_resep_dokter as $item) { + $jumlah = isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']; + $kandungan = isset($kandunganData[$item['kode_brng']]) ? $kandunganData[$item['kode_brng']] : (isset($item['kandungan']) ? $item['kandungan'] : 0); + + if (isset($aturanPakaiData[$item['kode_brng']])) { + $aturan_pakai = $aturanPakaiData[$item['kode_brng']]; + } else { + $aturan_pakai = isset($item['aturan_pakai']) ? $item['aturan_pakai'] : ''; + } + + if(isset($item['no_racik'])) { + $jumlah_racik = isset($item['jml_dr']) ? $item['jml_dr'] : (isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']); + $jumlah = isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']; + } + $get_gudangbarang = $this->db('gudangbarang')->where('kode_brng', $item['kode_brng'])->where('kd_bangsal', $this->settings->get('farmasi.deporalan'))->oneArray(); $get_databarang = $this->db('databarang')->where('kode_brng', $item['kode_brng'])->oneArray(); @@ -264,16 +400,40 @@ public function postValidasiResep() ->where('kode_brng', $item['kode_brng']) ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) ->update([ - 'stok' => $get_gudangbarang['stok'] - $item['jml'] + 'stok' => $get_gudangbarang['stok'] - $jumlah ]); + if(isset($item['no_racik'])) { + $this->db('resep_dokter_racikan') + ->where('no_resep', $_POST['no_resep']) + ->where('no_racik', $item['no_racik']) + ->update([ + 'jml_dr' => $jumlah_racik + ]); + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $_POST['no_resep']) + ->where('no_racik', $item['no_racik']) + ->where('kode_brng', $item['kode_brng']) + ->update([ + 'jml' => $jumlah, + 'kandungan' => $kandungan + ]); + } else { + $this->db('resep_dokter') + ->where('no_resep', $_POST['no_resep']) + ->where('kode_brng', $item['kode_brng']) + ->update([ + 'jml' => $jumlah + ]); + } + $this->db('riwayat_barang_medis') ->save([ 'kode_brng' => $item['kode_brng'], 'stok_awal' => $get_gudangbarang['stok'], 'masuk' => '0', - 'keluar' => $item['jml'], - 'stok_akhir' => $get_gudangbarang['stok'] - $item['jml'], + 'keluar' => $jumlah, + 'stok_akhir' => $get_gudangbarang['stok'] - $jumlah, 'posisi' => 'Pemberian Obat', 'tanggal' => $tgl_rawat, 'jam' => $jam_rawat, @@ -285,6 +445,9 @@ public function postValidasiResep() 'keterangan' => $_POST['no_rawat'] . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat']) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat'])) ]); + $embalase = isset($embalaseData[$item['kode_brng']]) ? $embalaseData[$item['kode_brng']] : $this->settings->get('farmasi.embalase'); + $tuslah = isset($tuslahData[$item['kode_brng']]) ? $tuslahData[$item['kode_brng']] : $this->settings->get('farmasi.tuslah'); + $this->db('detail_pemberian_obat') ->save([ 'tgl_perawatan' => $tgl_rawat, @@ -292,11 +455,11 @@ public function postValidasiResep() 'no_rawat' => $_POST['no_rawat'], 'kode_brng' => $item['kode_brng'], 'h_beli' => $get_databarang['h_beli'], - 'biaya_obat' => $get_databarang['dasar'], - 'jml' => $item['jml'], - 'embalase' => '0', - 'tuslah' => '0', - 'total' => $get_databarang['dasar'] * $item['jml'], + 'biaya_obat' => $this->calculateDrugUnitPrice($get_databarang['dasar']), + 'jml' => $jumlah, + 'embalase' => $embalase, + 'tuslah' => $tuslah, + 'total' => $this->calculateDrugSubtotal($get_databarang['dasar'], $jumlah), 'status' => 'Ralan', 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), 'no_batch' => $get_gudangbarang['no_batch'], @@ -309,33 +472,207 @@ public function postValidasiResep() 'jam' => $jam_rawat, 'no_rawat' => $_POST['no_rawat'], 'kode_brng' => $item['kode_brng'], - 'aturan' => $item['aturan_pakai'] + 'aturan' => $aturan_pakai ]); - } - - $resep_dokter_racikan = $this->db('resep_dokter_racikan')->where('no_resep', $_POST['no_resep'])->oneArray(); - - if(!empty($resep_dokter_racikan)) { - $this->db('obat_racikan')->save( - [ + if(isset($item['no_racik'])) { + $this->db('detail_obat_racikan') + ->save([ 'tgl_perawatan' => $tgl_rawat, 'jam' => $jam_rawat, 'no_rawat' => $_POST['no_rawat'], - 'no_racik' => $resep_dokter_racikan['no_racik'], - 'nama_racik' => $resep_dokter_racikan['nama_racik'], - 'kd_racik' => $resep_dokter_racikan['kd_racik'], - 'jml_dr' => $resep_dokter_racikan['jml_dr'], - 'aturan_pakai' => $resep_dokter_racikan['aturan_pakai'], - 'keterangan' => $resep_dokter_racikan['keterangan'] - ] - ); + 'no_racik' => $item['no_racik'], + 'kode_brng' => $item['kode_brng'] + ]); + } + } + $this->db('resep_obat')->where('no_resep', $_POST['no_resep'])->save(['tgl_perawatan' => $tgl_rawat, 'jam' => $jam_rawat]); } exit(); } + public function postTambahItemResep() + { + $no_resep = $_POST['no_resep']; + $no_rawat = revertNorawat($_POST['no_rawat']); + $tgl_peresepan = $_POST['tgl_peresepan']; + $jam_peresepan = $_POST['jam_peresepan']; + $kode_brng = $_POST['kode_brng']; + $tipe = isset($_POST['tipe']) ? $_POST['tipe'] : 'nonracikan'; + + $tgl_rawat = date('Y-m-d'); + $jam_rawat = date('H:i:s'); + + $embalase = isset($_POST['embalase']) ? $_POST['embalase'] : $this->settings->get('farmasi.embalase'); + $tuslah = isset($_POST['tuslah']) ? $_POST['tuslah'] : $this->settings->get('farmasi.tuslah'); + + $get_gudangbarang = $this->db('gudangbarang')->where('kode_brng', $kode_brng)->where('kd_bangsal', $this->settings->get('farmasi.deporalan'))->oneArray(); + $get_databarang = $this->db('databarang')->where('kode_brng', $kode_brng)->oneArray(); + + if ($tipe == 'racikan') { + $no_racik = $_POST['no_racik']; + $kandungan = $_POST['kandungan']; + $jml_dr = $_POST['jml_dr']; // Jumlah racikan (bungkus) + $kapasitas = $get_databarang['kapasitas'] > 0 ? $get_databarang['kapasitas'] : 1; + + // Hitung jumlah obat + $jml = round(($jml_dr * $kandungan) / $kapasitas, 1); + + // Kurangi stok + $this->db('gudangbarang') + ->where('kode_brng', $kode_brng) + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->update([ + 'stok' => $get_gudangbarang['stok'] - $jml + ]); + + // Riwayat + $this->db('riwayat_barang_medis') + ->save([ + 'kode_brng' => $kode_brng, + 'stok_awal' => $get_gudangbarang['stok'], + 'masuk' => '0', + 'keluar' => $jml, + 'stok_akhir' => $get_gudangbarang['stok'] - $jml, + 'posisi' => 'Pemberian Obat', + 'tanggal' => $tgl_rawat, + 'jam' => $jam_rawat, + 'petugas' => $this->core->getUserInfo('fullname', null, true), + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'status' => 'Simpan', + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'], + 'keterangan' => $_POST['no_rawat'] . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat']) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat'])) + ]); + + // Simpan ke detail racikan + // $this->db('resep_dokter_racikan_detail') + // ->save([ + // 'no_resep' => $no_resep, + // 'no_racik' => $no_racik, + // 'kode_brng' => $kode_brng, + // 'p1' => 1, // Default + // 'p2' => 1, // Default + // 'kandungan' => $kandungan, + // 'jml' => $jml + // ]); + + // Simpan ke detail pemberian obat (billing) + $this->db('detail_pemberian_obat') + ->save([ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'kode_brng' => $kode_brng, + 'h_beli' => $get_databarang['h_beli'], + 'biaya_obat' => $this->calculateDrugUnitPrice($get_databarang['dasar']), + 'jml' => $jml, + 'embalase' => $embalase, + 'tuslah' => $tuslah, + 'total' => $this->calculateDrugSubtotal($get_databarang['dasar'], $jml), + 'status' => 'Ralan', + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'] + ]); + + $this->db('detail_obat_racikan') + ->save([ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng + ]); + + header('Content-Type: application/json'); + echo json_encode([ + 'kode_brng' => htmlspecialchars($kode_brng, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'nama_brng' => htmlspecialchars($get_databarang['nama_brng'] ?? 'Nama Obat Tidak Ditemukan', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'jml' => htmlspecialchars($jml, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kandungan' => htmlspecialchars($kandungan, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kapasitas' => htmlspecialchars($kapasitas, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'ralan' => isset($get_databarang['dasar']) ? $this->calculateDrugUnitPrice($get_databarang['dasar']) : 0, + 'total_harga' => isset($get_databarang['dasar']) ? $this->calculateDrugGrandTotal($get_databarang['dasar'], $jml, $embalase, $tuslah) : 0, + 'embalase' => htmlspecialchars($embalase, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'tuslah' => htmlspecialchars($tuslah, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') + ]); + exit(); + + } else { + // Logika Non-Racikan (Existing) + $jml = $_POST['jml']; + $aturan_pakai = $_POST['aturan_pakai']; + + $this->db('gudangbarang') + ->where('kode_brng', $kode_brng) + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->update([ + 'stok' => $get_gudangbarang['stok'] - $jml + ]); + + $this->db('riwayat_barang_medis') + ->save([ + 'kode_brng' => $kode_brng, + 'stok_awal' => $get_gudangbarang['stok'], + 'masuk' => '0', + 'keluar' => $jml, + 'stok_akhir' => $get_gudangbarang['stok'] - $jml, + 'posisi' => 'Pemberian Obat', + 'tanggal' => $tgl_rawat, + 'jam' => $jam_rawat, + 'petugas' => $this->core->getUserInfo('fullname', null, true), + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'status' => 'Simpan', + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'], + 'keterangan' => $_POST['no_rawat'] . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat']) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat'])) + ]); + + $this->db('detail_pemberian_obat') + ->save([ + 'tgl_perawatan' => $tgl_peresepan, + 'jam' => $jam_peresepan, + 'no_rawat' => $no_rawat, + 'kode_brng' => $kode_brng, + 'h_beli' => $get_databarang['h_beli'], + 'biaya_obat' => $this->calculateDrugUnitPrice($get_databarang['dasar']), + 'jml' => $jml, + 'embalase' => $embalase, + 'tuslah' => $tuslah, + 'total' => $this->calculateDrugSubtotal($get_databarang['dasar'], $jml), + 'status' => 'Ralan', + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'] + ]); + + $this->db('aturan_pakai') + ->save([ + 'tgl_perawatan' => $tgl_peresepan, + 'jam' => $jam_peresepan, + 'no_rawat' => $no_rawat, + 'kode_brng' => $kode_brng, + 'aturan' => $aturan_pakai + ]); + + header('Content-Type: application/json'); + echo json_encode([ + 'kode_brng' => htmlspecialchars($kode_brng, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'nama_brng' => htmlspecialchars($get_databarang['nama_brng'] ?? 'Nama Obat Tidak Ditemukan', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'jml' => htmlspecialchars($jml, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'aturan_pakai' => htmlspecialchars($aturan_pakai, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'ralan' => isset($get_databarang['dasar']) ? $this->calculateDrugUnitPrice($get_databarang['dasar']) : 0, + 'total_harga' => isset($get_databarang['dasar']) ? $this->calculateDrugGrandTotal($get_databarang['dasar'], $jml, $embalase, $tuslah) : 0, + 'embalase' => htmlspecialchars($embalase, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'tuslah' => htmlspecialchars($tuslah, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') + ]); + exit(); + } + } + public function postHapusResep() { if(isset($_POST['kd_jenis_prw'])) { @@ -355,22 +692,164 @@ public function postHapusResep() exit(); } + public function postHapusObat() + { + + $get_gudangbarang = $this->db('gudangbarang')->where('kode_brng', $_POST['kode_brng'])->where('kd_bangsal', $this->settings->get('farmasi.deporalan'))->oneArray(); + + $this->db('gudangbarang') + ->where('kode_brng', $_POST['kode_brng']) + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->update([ + 'stok' => $get_gudangbarang['stok'] + $_POST['jml'] + ]); + + $this->db('riwayat_barang_medis') + ->save([ + 'kode_brng' => $_POST['kode_brng'], + 'stok_awal' => $get_gudangbarang['stok'], + 'masuk' => $_POST['jml'], + 'keluar' => '0', + 'stok_akhir' => $get_gudangbarang['stok'] + $_POST['jml'], + 'posisi' => 'Pemberian Obat', + 'tanggal' => $_POST['tgl_perawatan'], + 'jam' => $_POST['jam'], + 'petugas' => $this->core->getUserInfo('fullname', null, true), + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'status' => 'Hapus', + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'], + 'keterangan' => $_POST['no_rawat'] . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat']) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat'])) + ]); + + $this->db('detail_pemberian_obat') + ->where('kode_brng', $_POST['kode_brng']) + ->where('no_rawat', $_POST['no_rawat']) + ->where('tgl_perawatan', $_POST['tgl_perawatan']) + ->where('jam', $_POST['jam']) + ->delete(); + + exit(); + } + + public function postHapusObatRacikan() + { + $no_rawat = $_POST['no_rawat']; + $tgl_perawatan = $_POST['tgl_perawatan']; + $jam = $_POST['jam']; + $no_racik = $_POST['no_racik']; + + // 1. Get all items belonging to this specific racikan + $items_in_racikan = $this->db('detail_obat_racikan') + ->where('no_rawat', $no_rawat) + ->where('tgl_perawatan', $tgl_perawatan) + ->where('jam', $jam) + ->where('no_racik', $no_racik) + ->toArray(); + + foreach($items_in_racikan as $racikan_item) { + + $kode_brng = $racikan_item['kode_brng']; + + // 2. Restore Stock (Best Effort) + $item_billing = $this->db('detail_pemberian_obat') + ->where('no_rawat', $no_rawat) + ->where('tgl_perawatan', $tgl_perawatan) + ->where('jam', $jam) + ->where('kode_brng', $kode_brng) + ->oneArray(); + + if ($item_billing) { + $get_gudangbarang = $this->db('gudangbarang')->where('kode_brng', $kode_brng)->where('kd_bangsal', $this->settings->get('farmasi.deporalan'))->oneArray(); + + $this->db('gudangbarang') + ->where('kode_brng', $kode_brng) + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->update([ + 'stok' => $get_gudangbarang['stok'] + $item_billing['jml'] + ]); + + $this->db('riwayat_barang_medis') + ->save([ + 'kode_brng' => $kode_brng, + 'stok_awal' => $get_gudangbarang['stok'], + 'masuk' => $item_billing['jml'], + 'keluar' => '0', + 'stok_akhir' => $get_gudangbarang['stok'] + $item_billing['jml'], + 'posisi' => 'Pemberian Obat', + 'tanggal' => $tgl_perawatan, + 'jam' => $jam, + 'petugas' => $this->core->getUserInfo('fullname', null, true), + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'status' => 'Hapus', + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'], + 'keterangan' => $no_rawat . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat)) + ]); + } + + // 3. Delete from detail_pemberian_obat (Unconditional delete based on keys) + $this->db('detail_pemberian_obat') + ->where('no_rawat', $no_rawat) + ->where('tgl_perawatan', $tgl_perawatan) + ->where('jam', $jam) + ->where('kode_brng', $kode_brng) + ->delete(); + + // 4. Delete from detail_obat_racikan (per item) + $this->db('detail_obat_racikan') + ->where('no_rawat', $no_rawat) + ->where('tgl_perawatan', $tgl_perawatan) + ->where('jam', $jam) + ->where('no_racik', $no_racik) + ->where('kode_brng', $kode_brng) + ->delete(); + } + + // 5. Finally delete the parent racikan entry + $this->db('obat_racikan') + ->where('no_rawat', $no_rawat) + ->where('tgl_perawatan', $tgl_perawatan) + ->where('jam', $jam) + ->where('no_racik', $no_racik) + ->delete(); + + exit(); + } + public function anyRincian() { + $racikan_nos = $this->db('resep_dokter_racikan')->select('no_resep')->toArray(); + $racikan_nos = array_column($racikan_nos, 'no_resep'); $rows = $this->db('resep_obat') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') - ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) ->where('resep_obat.status', 'ralan') - ->group('resep_dokter.no_resep') + ->group('resep_obat.no_resep') ->toArray(); + + // Filter out racikan from non-racikan list + $rows = array_filter($rows, function($row) use ($racikan_nos) { + return !in_array($row['no_resep'], $racikan_nos); + }); + $resep = []; $jumlah_total_resep = 0; foreach ($rows as $row) { - $row['resep_dokter'] = $this->db('resep_dokter')->join('databarang', 'databarang.kode_brng=resep_dokter.kode_brng')->where('no_resep', $row['no_resep'])->toArray(); + $bangsal = $this->settings->get('farmasi.deporalan'); + $row['resep_dokter'] = $this->db('resep_dokter') + ->join('databarang', 'databarang.kode_brng=resep_dokter.kode_brng') + ->leftJoin('gudangbarang', 'gudangbarang.kode_brng=resep_dokter.kode_brng AND gudangbarang.kd_bangsal = "'.$bangsal.'"') + ->where('no_resep', $row['no_resep']) + ->toArray(); foreach ($row['resep_dokter'] as $value) { - $value['ralan'] = $value['jml'] * $value['dasar']; + $value['ralan'] = $this->calculateDrugGrandTotal( + $value['dasar'], + $value['jml'], + $this->settings->get('farmasi.embalase'), + $this->settings->get('farmasi.tuslah') + ); $jumlah_total_resep += floatval($value['ralan']); } @@ -385,18 +864,38 @@ public function anyRincian() } $rows_racikan = $this->db('resep_obat') + ->select('resep_obat.*') + ->select('dokter.nm_dokter') + ->select('resep_dokter_racikan.no_racik') + ->select('resep_dokter_racikan.nama_racik') + ->select('resep_dokter_racikan.kd_racik') + ->select('resep_dokter_racikan.jml_dr') + ->select('resep_dokter_racikan.aturan_pakai') + ->select('resep_dokter_racikan.keterangan') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') ->join('resep_dokter_racikan', 'resep_dokter_racikan.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) - ->group('resep_dokter_racikan.no_resep') ->where('resep_obat.status', 'ralan') + ->group('resep_obat.no_resep') + ->group('resep_dokter_racikan.no_racik') ->toArray(); $resep_racikan = []; $jumlah_total_resep_racikan = 0; foreach ($rows_racikan as $row) { - $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail')->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng')->where('no_resep', $row['no_resep'])->toArray(); - foreach ($row['resep_dokter_racikan_detail'] as $value) { - $value['ralan'] = $value['jml'] * $value['dasar']; + $bangsal = $this->settings->get('farmasi.deporalan'); + $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->leftJoin('gudangbarang', 'gudangbarang.kode_brng=resep_dokter_racikan_detail.kode_brng AND gudangbarang.kd_bangsal = "'.$bangsal.'"') + ->where('no_resep', $row['no_resep']) + ->where('no_racik', $row['no_racik']) + ->toArray(); + foreach ($row['resep_dokter_racikan_detail'] as &$value) { + $value['ralan'] = $this->calculateDrugGrandTotal( + $value['dasar'], + $value['jml'], + $this->settings->get('farmasi.embalase'), + $this->settings->get('farmasi.tuslah') + ); $jumlah_total_resep_racikan += floatval($value['ralan']); } @@ -410,10 +909,22 @@ public function anyRincian() $resep_racikan[] = $row; } - $query = $this->db()->pdo()->prepare("SELECT * FROM detail_pemberian_obat WHERE no_rawat = '{$_POST['no_rawat']}' AND status = 'Ralan' AND jam NOT IN (SELECT obat_racikan.jam FROM obat_racikan WHERE obat_racikan.no_rawat = '{$_POST['no_rawat']}' AND obat_racikan.tgl_perawatan = tgl_perawatan UNION ALL SELECT resep_obat.jam FROM resep_obat WHERE resep_obat.no_rawat = '{$_POST['no_rawat']}' AND resep_obat.tgl_perawatan = tgl_perawatan)"); - $query->execute(); + $query = $this->db()->pdo()->prepare("SELECT * FROM detail_pemberian_obat WHERE no_rawat = ? AND status = 'Ralan'"); + $query->execute([$_POST['no_rawat']]); $rows_pemberian_obat = $query->fetchAll(); + // Filter out racikan from non-racikan list (detail_pemberian_obat) + $obat_racikan_items = $this->db('detail_obat_racikan') + ->select('kode_brng') + ->where('no_rawat', $_POST['no_rawat']) + ->toArray(); + $obat_racikan_items = array_column($obat_racikan_items, 'kode_brng'); + + // Filter $rows_pemberian_obat agar tidak menampilkan barang yang sudah ada di racikan + $rows_pemberian_obat = array_filter($rows_pemberian_obat, function($row) use ($obat_racikan_items) { + return !in_array($row['kode_brng'], $obat_racikan_items); + }); + $detail_pemberian_obat = []; $jumlah_total_obat = 0; foreach ($rows_pemberian_obat as $row) { @@ -423,34 +934,255 @@ public function anyRincian() ->where('tgl_perawatan', $row['tgl_perawatan']) ->where('jam', $row['jam']) ->oneArray(); - $row['aturan_pakai'] = $aturan_pakai['aturan']; + $row['aturan_pakai'] = $aturan_pakai['aturan'] ?? ''; $data_barang = $this->db('databarang')->where('kode_brng', $row['kode_brng'])->oneArray(); - $row['nama_brng'] = $data_barang['nama_brng']; - $row['ralan'] = $data_barang['ralan']; - $jumlah_total_obat += floatval($row['total']); + $row['nama_brng'] = $data_barang['nama_brng'] ?? ''; + $row['ralan'] = $data_barang['ralan'] ?? 0; + $jumlah_total_obat += (float) ($row['total'] ?? 0) + (float) ($row['embalase'] ?? 0) + (float) ($row['tuslah'] ?? 0); $detail_pemberian_obat[] = $row; } - $query2 = $this->db()->pdo()->prepare("SELECT * FROM obat_racikan WHERE no_rawat = '{$_POST['no_rawat']}' AND jam NOT IN (SELECT resep_obat.jam FROM resep_obat WHERE resep_obat.no_rawat = '{$_POST['no_rawat']}' AND resep_obat.tgl_perawatan = tgl_perawatan AND status = 'ralan')"); - $query2->execute(); + $query2 = $this->db()->pdo()->prepare("SELECT obat_racikan.* FROM obat_racikan WHERE obat_racikan.no_rawat = ?"); + $query2->execute([$_POST['no_rawat']]); $rows_pemberian_obat2 = $query2->fetchAll(); $detail_pemberian_obat2 = []; $jumlah_total_obat2 = 0; foreach ($rows_pemberian_obat2 as $row) { - $row['detail_pemberian_obat'] = $this->db('detail_pemberian_obat') - ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') - ->where('no_rawat', $_POST['no_rawat']) - ->where('tgl_perawatan', $row['tgl_perawatan']) - ->where('jam', $row['jam']) - ->toArray(); - foreach ($row['detail_pemberian_obat'] as $row2) { - $jumlah_total_obat2 += floatval($row2['total']); + $ingredients_map = $this->db('detail_obat_racikan') + ->where('no_rawat', $row['no_rawat']) + ->where('tgl_perawatan', $row['tgl_perawatan']) + ->where('jam', $row['jam']) + ->where('no_racik', $row['no_racik']) + ->toArray(); + + $row['detail_pemberian_obat'] = []; + + foreach($ingredients_map as $map) { + $detail = $this->db('detail_pemberian_obat') + ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') + ->where('detail_pemberian_obat.no_rawat', $map['no_rawat']) + ->where('detail_pemberian_obat.kode_brng', $map['kode_brng']) + ->where('detail_pemberian_obat.tgl_perawatan', $map['tgl_perawatan']) + ->where('detail_pemberian_obat.jam', $map['jam']) + ->where('detail_pemberian_obat.status', 'Ralan') + ->oneArray(); + + if($detail) { + $detail['kandungan'] = isset($map['kandungan']) ? $map['kandungan'] : ''; + $jumlah_total_obat2 += (float) ($detail['total'] ?? 0) + (float) ($detail['embalase'] ?? 0) + (float) ($detail['tuslah'] ?? 0); + $row['detail_pemberian_obat'][] = $detail; + } } + $detail_pemberian_obat2[] = $row; } - echo $this->draw('rincian.html', ['jumlah_total_resep' => $jumlah_total_resep, 'jumlah_total_obat' => $jumlah_total_obat, 'jumlah_total_obat2' => $jumlah_total_obat2, 'resep' =>$resep, 'resep_racikan' => $resep_racikan, 'jumlah_total_resep_racikan' => $jumlah_total_resep_racikan, 'detail_pemberian_obat' => $detail_pemberian_obat, 'detail_pemberian_obat_racikan' => $detail_pemberian_obat2, 'no_rawat' => $_POST['no_rawat']]); + $pasien = $this->db('pasien')->where('no_rkm_medis', $this->core->getRegPeriksaInfo('no_rkm_medis', $_POST['no_rawat']))->oneArray(); + $reg_periksa = $this->db('reg_periksa')->where('no_rawat', $_POST['no_rawat'])->oneArray(); + $billingParsialEnabled = $this->isBillingParsialEnabled(); + $parsialTotal = (float) $jumlah_total_obat + (float) $jumlah_total_obat2; + $parsialPaid = $billingParsialEnabled ? (float) $this->getParsialPaidTotalObat($_POST['no_rawat']) : 0; + $parsialRemaining = $parsialTotal - $parsialPaid; + if ($parsialRemaining < 0) { + $parsialRemaining = 0; + } + if (!$billingParsialEnabled) { + $parsialRemaining = 0; + } + $parsialHistory = $billingParsialEnabled ? $this->getParsialHistoryObat($_POST['no_rawat']) : []; + + echo $this->draw('rincian.html', [ + 'jumlah_total_resep' => $jumlah_total_resep, + 'jumlah_total_obat' => $jumlah_total_obat, + 'jumlah_total_obat2' => $jumlah_total_obat2, + 'resep' => htmlspecialchars_array($resep), + 'resep_racikan' => htmlspecialchars_array($resep_racikan), + 'jumlah_total_resep_racikan' => $jumlah_total_resep_racikan, + 'detail_pemberian_obat' => htmlspecialchars_array($detail_pemberian_obat), + 'detail_pemberian_obat_racikan' => htmlspecialchars_array($detail_pemberian_obat2), + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'pasien' => $pasien, + 'reg_periksa' => $reg_periksa, + 'billing_parsial_enabled' => $billingParsialEnabled ? 'true' : 'false', + 'parsial_total_obat' => $parsialTotal, + 'parsial_paid_obat' => $parsialPaid, + 'parsial_remaining_obat' => $parsialRemaining, + 'parsial_history_obat' => htmlspecialchars_array($parsialHistory) + ]); + exit(); + } + + public function postBayarparsial() + { + if (!$this->isBillingParsialEnabled()) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Fitur billing parsial tidak diaktifkan.']); + exit(); + } + + $noRawat = trim((string) ($_POST['no_rawat'] ?? '')); + $metode = trim((string) ($_POST['metode'] ?? 'Tunai')); + $jumlah = (float) str_replace(',', '.', (string) ($_POST['jumlah_bayar'] ?? 0)); + + if ($noRawat === '' || $jumlah <= 0) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Data pembayaran tidak valid.']); + exit(); + } + + $total = 0; + try { + $stmt = $this->core->db()->pdo()->prepare("SELECT COALESCE(SUM(total + embalase + tuslah), 0) AS total FROM detail_pemberian_obat WHERE no_rawat = ? AND status = 'Ralan'"); + $stmt->execute([$noRawat]); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + $total = (float) ($row['total'] ?? 0); + } catch (\Exception $e) { + $total = 0; + } + + if ($total <= 0) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Tidak ada tagihan obat untuk rawat ini.']); + exit(); + } + + $paid = (float) $this->getParsialPaidTotalObat($noRawat); + $remaining = $total - $paid; + if ($remaining < 0) { + $remaining = 0; + } + if ($remaining <= 0) { + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Tagihan obat sudah lunas.']); + exit(); + } + if ($jumlah > $remaining) { + $jumlah = $remaining; + } + + try { + $pdo = $this->core->db()->pdo(); + $pdo->beginTransaction(); + + $stmt = $pdo->prepare("INSERT INTO mlite_billing_pembayaran (no_rawat, tgl_bayar, jam_bayar, metode, jumlah_bayar, id_user, keterangan) + VALUES (?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([ + $noRawat, + date('Y-m-d'), + date('H:i:s'), + $metode !== '' ? $metode : 'Tunai', + $jumlah, + (int) $this->core->getUserInfo('id'), + 'Parsial Obat' + ]); + $pembayaranId = (int) $pdo->lastInsertId(); + + $stmt = $pdo->prepare("INSERT INTO mlite_billing_pembayaran_detail (pembayaran_id, kelompok, jumlah_alokasi, ref_modul, kd_jenis_prw, tgl_periksa, jam, status_periksa) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([$pembayaranId, 'OBAT', $jumlah, 'apotek_ralan', null, null, null, null]); + + $pdo->commit(); + } catch (\Exception $e) { + try { $this->core->db()->pdo()->rollBack(); } catch (\Exception $x) {} + header('Content-Type: application/json'); + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan pembayaran parsial.']); + exit(); + } + + header('Content-Type: application/json'); + echo json_encode(['status' => 'success', 'message' => 'Pembayaran parsial berhasil disimpan.', 'pembayaran_id' => $pembayaranId]); + exit(); + } + + public function anyNotaparsial() + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'apotek_ralan')) { + echo 'Anda tidak punya izin.'; + exit(); + } + + if (!$this->isBillingParsialEnabled()) { + echo 'Fitur billing parsial tidak diaktifkan.'; + exit(); + } + + $settings = $this->settings('settings'); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($settings))); + + $pembayaranId = (int) ($_GET['pembayaran_id'] ?? 0); + if ($pembayaranId <= 0) { + echo 'ID pembayaran tidak valid.'; + exit(); + } + + $pdo = $this->core->db()->pdo(); + try { + $stmt = $pdo->prepare("SELECT h.id, h.no_rawat, h.tgl_bayar, h.jam_bayar, h.metode, h.jumlah_bayar, h.id_user, h.keterangan, + COALESCE(p.nama, u.fullname) AS nama_kasir + FROM mlite_billing_pembayaran h + LEFT JOIN mlite_users u ON u.id = h.id_user + LEFT JOIN pegawai p ON p.nik = u.username + WHERE h.id = ?"); + $stmt->execute([$pembayaranId]); + $pembayaran = $stmt->fetch(\PDO::FETCH_ASSOC); + } catch (\Exception $e) { + $pembayaran = null; + } + + if (!$pembayaran) { + echo 'Data pembayaran tidak ditemukan.'; + exit(); + } + + $noRawat = (string) ($pembayaran['no_rawat'] ?? ''); + + try { + $stmt = $pdo->prepare("SELECT d.id, d.jumlah_alokasi, 'Obat & BHP' AS nm_perawatan + FROM mlite_billing_pembayaran_detail d + WHERE d.pembayaran_id = ? AND d.kelompok = 'OBAT' + ORDER BY d.id ASC"); + $stmt->execute([$pembayaranId]); + $detail = $stmt->fetchAll(\PDO::FETCH_ASSOC); + } catch (\Exception $e) { + $detail = []; + } + + $totalDetail = 0; + foreach ($detail as $d) { + $totalDetail += (float) ($d['jumlah_alokasi'] ?? 0); + } + + $reg = $this->db('reg_periksa')->where('no_rawat', $noRawat)->oneArray(); + $pasien = []; + if (!empty($reg['no_rkm_medis'])) { + $pasien = $this->db('pasien')->where('no_rkm_medis', $reg['no_rkm_medis'])->oneArray(); + } + + $namaKasir = trim((string) ($pembayaran['nama_kasir'] ?? '')); + if ($namaKasir === '') { + $namaKasir = $this->core->getUserInfo('fullname', null, true); + } + + $show = isset($_GET['show']) ? (string) $_GET['show'] : 'kecil'; + if ($show === 'besar') { + echo $this->draw('nota_parsial.besar.html', [ + 'pembayaran' => htmlspecialchars_array($pembayaran), + 'detail' => htmlspecialchars_array($detail), + 'pasien' => htmlspecialchars_array($pasien), + 'nama_kasir' => htmlspecialchars($namaKasir, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'total_detail' => $totalDetail + ]); + } else { + echo $this->draw('nota_parsial.kecil.html', [ + 'pembayaran' => htmlspecialchars_array($pembayaran), + 'detail' => htmlspecialchars_array($detail), + 'pasien' => htmlspecialchars_array($pasien), + 'nama_kasir' => htmlspecialchars($namaKasir, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'total_detail' => $totalDetail + ]); + } exit(); } @@ -460,10 +1192,10 @@ public function anyObat() ->join('gudangbarang', 'gudangbarang.kode_brng=databarang.kode_brng') ->where('status', '1') ->where('gudangbarang.kd_bangsal', $this->settings->get('farmasi.deporalan')) - ->like('databarang.nama_brng', '%'.$_POST['obat'].'%') + ->like('databarang.nama_brng', '%'.htmlspecialchars($_POST['obat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('obat.html', ['obat' => $obat]); + echo $this->draw('obat.html', ['obat' => htmlspecialchars_array($obat)]); exit(); } @@ -474,7 +1206,7 @@ public function getAjax() switch($show){ default: break; - case "databarang": + case "databarang": $rows = $this->db('databarang') ->join('gudangbarang', 'gudangbarang.kode_brng=databarang.kode_brng') ->where('status', '1') @@ -484,13 +1216,16 @@ public function getAjax() ->limit(10) ->toArray(); + $array = []; foreach ($rows as $row) { $array[] = array( 'kode_brng' => $row['kode_brng'], - 'nama_brng' => $row['nama_brng'] + 'nama_brng' => $row['nama_brng'], + 'stok' => $row['stok'], + 'ralan' => $this->calculateDrugUnitPrice(isset($row['ralan']) ? $row['ralan'] : $row['dasar']) ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; } exit(); @@ -499,9 +1234,9 @@ public function getAjax() public function anyRacikan() { $racikan = $this->db('metode_racik') - ->like('nm_racik', '%'.$_POST['racikan'].'%') + ->like('nm_racik', '%'.htmlspecialchars($_POST['racikan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->toArray(); - echo $this->draw('racikan.html', ['racikan' => $racikan]); + echo $this->draw('racikan.html', ['racikan' => htmlspecialchars_array($racikan)]); exit(); } @@ -515,7 +1250,7 @@ public function postAturanPakai() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -535,7 +1270,7 @@ public function postProviderList() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -555,7 +1290,7 @@ public function postProviderList2() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -565,34 +1300,40 @@ public function postProviderList2() } - public function getCetakLabel($kode_brng, $no_rawat, $tgl_peresepan, $jam_peresepan, $tipe){ - if($tipe == 'nonracikan') { - $rows_pemberian_obat = $this->db('detail_pemberian_obat') - ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') - ->join('reg_periksa', 'reg_periksa.no_rawat=detail_pemberian_obat.no_rawat') - ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') - ->where('detail_pemberian_obat.no_rawat', revertNoRawat($no_rawat)) - ->where('detail_pemberian_obat.status', 'Ralan') - ->where('detail_pemberian_obat.tgl_perawatan', $tgl_peresepan) - ->where('detail_pemberian_obat.jam', $jam_peresepan) - ->where('detail_pemberian_obat.kode_brng', $kode_brng) - ->toArray(); - $detail_pemberian_obat = []; - $jumlah_total_obat = 0; - foreach ($rows_pemberian_obat as $row) { - $aturan_pakai = $this->db('aturan_pakai') - ->where('no_rawat', $row['no_rawat']) - ->where('kode_brng', $row['kode_brng']) - ->where('tgl_perawatan', $row['tgl_perawatan']) - ->where('jam', $row['jam']) - ->oneArray(); - $row['aturan_pakai'] = $aturan_pakai['aturan']; - $row['keterangan'] = ''; + public function getCetakLabel($kode_brng, $no_rawat, $tgl_peresepan, $jam_peresepan, $tipe) + { + $detail_pemberian_obat = []; + + if ($tipe === 'nonracikan') { + + $rows = $this->db('detail_pemberian_obat') + ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') + ->join('reg_periksa', 'reg_periksa.no_rawat=detail_pemberian_obat.no_rawat') + ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') + ->where('detail_pemberian_obat.no_rawat', revertNoRawat($no_rawat)) + ->where('detail_pemberian_obat.status', 'Ralan') + ->where('detail_pemberian_obat.tgl_perawatan', $tgl_peresepan) + ->where('detail_pemberian_obat.jam', $jam_peresepan) + ->where('detail_pemberian_obat.kode_brng', $kode_brng) + ->toArray(); + + foreach ($rows as $row) { + $aturan = $this->db('aturan_pakai') + ->where('no_rawat', $row['no_rawat']) + ->where('kode_brng', $row['kode_brng']) + ->where('tgl_perawatan', $row['tgl_perawatan']) + ->where('jam', $row['jam']) + ->oneArray(); + + $row['aturan_pakai'] = $aturan['aturan'] ?? ''; + $row['keterangan'] = ''; $detail_pemberian_obat[] = $row; } } - if($tipe == 'racikan') { - $rows_pemberian_obat = $this->db('obat_racikan') + + if ($tipe === 'racikan') { + + $rows = $this->db('obat_racikan') ->join('reg_periksa', 'reg_periksa.no_rawat=obat_racikan.no_rawat') ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') ->where('obat_racikan.no_rawat', revertNoRawat($no_rawat)) @@ -600,154 +1341,322 @@ public function getCetakLabel($kode_brng, $no_rawat, $tgl_peresepan, $jam_perese ->where('obat_racikan.tgl_perawatan', $tgl_peresepan) ->where('obat_racikan.jam', $jam_peresepan) ->toArray(); - $detail_pemberian_obat = []; - $jumlah_total_obat = 0; - foreach ($rows_pemberian_obat as $row) { - $row['nama_brng'] = $row['nama_racik']; - $row['jml'] = $row['jml_dr']; - $detail_pemberian_obat[] = $row; - } + foreach ($rows as $row) { + $detail_pemberian_obat[] = [ + 'nama_brng' => $row['nama_racik'], + 'jml' => $row['jml_dr'], + 'aturan_pakai' => $row['aturan_pakai'], + 'keterangan' => '' + ]; + } } + // ==== DATA TAMBAHAN ==== $tanggal = dateIndonesia(date('Y-m-d')); - $pasien = $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat))); - $no_rm = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); - - echo $this->draw('cetak.etiket.html', [ - 'pasien' => $pasien, - 'no_rm' => $no_rm, - 'tanggal' => $tanggal, - 'settings' => $this->settings('settings'), - 'farmasi' => $this->settings('farmasi'), - 'detail' => $detail_pemberian_obat + $no_rawat_real = revertNoRawat($no_rawat); + $no_rm = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat_real); + $pasien = $this->core->getPasienInfo('nm_pasien', $no_rm); + + // ==== RENDER HTML ==== + $html = $this->draw('cetak.etiket.html', [ + 'pasien' => $pasien, + 'no_rm' => $no_rm, + 'tanggal' => $tanggal, + 'settings' => $this->settings('settings'), + 'farmasi' => $this->settings('farmasi'), + 'detail' => htmlspecialchars_array($detail_pemberian_obat) ]); + // ==== PDF LABEL ==== $mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', - 'format' => [100, 70], + 'format' => [100, 70], // ukuran label 'margin_left' => 2, 'margin_right' => 2, 'margin_top' => 2, 'margin_bottom' => 2 ]); - $url = url(ADMIN.'/tmp/cetak.etiket.html'); - $html = file_get_contents($url); - $mpdf->WriteHTML($this->core->setPrintCss(),\Mpdf\HTMLParserMode::HEADER_CSS); - $mpdf->WriteHTML($html,\Mpdf\HTMLParserMode::HTML_BODY); + $mpdf->WriteHTML( + $this->core->setPrintCss(), + \Mpdf\HTMLParserMode::HEADER_CSS + ); + $mpdf->WriteHTML( + $html, + \Mpdf\HTMLParserMode::HTML_BODY + ); - // Output a PDF file directly to the browser $mpdf->Output(); - // $mpdf->Output(UPLOADS.'/test.pdf', 'F'); - exit(); + exit; } - public function getCetakEresep($no_rawat, $tipe, $tgl_peresepan, $jam_peresepan){ - if($tipe == 'nonracikan') { - $resep_obat = $this->db('resep_obat')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); - $resep_dokter_racikan_detail = $this->db('resep_dokter_racikan_detail')->select('kode_brng')->where('no_resep', $resep_obat['no_resep'])->toArray(); - - $notIn = array_map(function ($entry) { - return ($entry[key($entry)]); - }, $resep_dokter_racikan_detail); - - $rows_pemberian_obat = $this->db('detail_pemberian_obat') - ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') - ->join('reg_periksa', 'reg_periksa.no_rawat=detail_pemberian_obat.no_rawat') - ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') - ->where('detail_pemberian_obat.no_rawat', revertNoRawat($no_rawat)) - ->where('detail_pemberian_obat.status', 'Ralan') - ->where('detail_pemberian_obat.tgl_perawatan', $tgl_peresepan) - ->where('detail_pemberian_obat.jam', $jam_peresepan) - ->toArray(); - if($notIn){ - $rows_pemberian_obat = $this->db('detail_pemberian_obat') + public function getCetakEresep($no_rawat, $tipe, $tgl_peresepan, $jam_peresepan) + { + $no_rawat_real = revertNoRawat($no_rawat); + $detail_pemberian_obat = []; + + /* ================= NON RACIKAN ================= */ + if ($tipe === 'nonracikan') { + + $resep_obat = $this->db('resep_obat') + ->where('no_rawat', $no_rawat_real) + ->oneArray(); + + $racikan = $this->db('resep_dokter_racikan_detail') + ->select('kode_brng') + ->where('no_resep', $resep_obat['no_resep'] ?? '') + ->toArray(); + + $notIn = array_column($racikan, 'kode_brng'); + + $query = $this->db('detail_pemberian_obat') ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') ->join('reg_periksa', 'reg_periksa.no_rawat=detail_pemberian_obat.no_rawat') ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') - ->where('detail_pemberian_obat.no_rawat', revertNoRawat($no_rawat)) + ->where('detail_pemberian_obat.no_rawat', $no_rawat_real) ->where('detail_pemberian_obat.status', 'Ralan') ->where('detail_pemberian_obat.tgl_perawatan', $tgl_peresepan) - ->where('detail_pemberian_obat.jam', $jam_peresepan) - ->notIn('detail_pemberian_obat.kode_brng', $notIn) - ->toArray(); - } - $detail_pemberian_obat = []; - $jumlah_total_obat = 0; - foreach ($rows_pemberian_obat as $row) { - $aturan_pakai = $this->db('aturan_pakai') - ->where('no_rawat', $row['no_rawat']) - ->where('kode_brng', $row['kode_brng']) - ->where('tgl_perawatan', $row['tgl_perawatan']) - ->where('jam', $row['jam']) - ->oneArray(); - $row['aturan_pakai'] = $aturan_pakai['aturan']; - $row['keterangan'] = ''; + ->where('detail_pemberian_obat.jam', $jam_peresepan); + + if (!empty($notIn)) { + $query->notIn('detail_pemberian_obat.kode_brng', $notIn); + } + + $rows = $query->toArray(); + + foreach ($rows as $row) { + $aturan = $this->db('aturan_pakai') + ->where('no_rawat', $row['no_rawat']) + ->where('kode_brng', $row['kode_brng']) + ->where('tgl_perawatan', $row['tgl_perawatan']) + ->where('jam', $row['jam']) + ->oneArray(); + + $row['aturan_pakai'] = $aturan['aturan'] ?? ''; + $row['keterangan'] = ''; $detail_pemberian_obat[] = $row; } } - if($tipe == 'racikan') { - $rows_pemberian_obat = $this->db('obat_racikan') + + /* ================= RACIKAN ================= */ + if ($tipe === 'racikan') { + + $rows = $this->db('obat_racikan') ->join('reg_periksa', 'reg_periksa.no_rawat=obat_racikan.no_rawat') ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') - ->where('obat_racikan.no_rawat', revertNoRawat($no_rawat)) + ->where('obat_racikan.no_rawat', $no_rawat_real) ->where('obat_racikan.tgl_perawatan', $tgl_peresepan) ->where('obat_racikan.jam', $jam_peresepan) ->toArray(); - $detail_pemberian_obat = []; - $jumlah_total_obat = 0; - foreach ($rows_pemberian_obat as $row) { - $row['nama_brng'] = $row['nama_racik']; - $row['jml'] = $row['jml_dr']; - $detail_pemberian_obat[] = $row; - } + foreach ($rows as $row) { + $detail_pemberian_obat[] = [ + 'nama_brng' => $row['nama_racik'], + 'jml' => $row['jml_dr'], + 'aturan_pakai' => $row['aturan_pakai'], + 'keterangan' => '' + ]; + } } + /* ================= DATA PASIEN ================= */ + $no_rm = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat_real); + $pasien = $this->core->getPasienInfo('nm_pasien', $no_rm); + $umur = $this->core->getRegPeriksaInfo('umurdaftar', $no_rawat_real); + $sttsumur= $this->core->getRegPeriksaInfo('sttsumur', $no_rawat_real); + $alamat = $this->core->getPasienInfo('alamat', $no_rm); $tanggal = dateIndonesia(date('Y-m-d')); - $pasien = $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat))); - $no_rm = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); - $umur = $this->core->getRegPeriksaInfo('umurdaftar', revertNoRawat($no_rawat)); - $sttsumur = $this->core->getRegPeriksaInfo('sttsumur', revertNoRawat($no_rawat)); - $alamat = $this->core->getPasienInfo('alamat', $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat))); - - echo $this->draw('cetak.eresep.html', [ - 'pasien' => $pasien, - 'no_rm' => $no_rm, - 'umur' => $umur . ' ' . $sttsumur, - 'alamat' => $alamat, - 'tanggal' => $tanggal, - 'settings' => $this->settings('settings'), - 'detail' => $detail_pemberian_obat + + /* ================= RENDER HTML ================= */ + $html = $this->draw('cetak.eresep.html', [ + 'pasien' => $pasien, + 'no_rm' => $no_rm, + 'umur' => $umur . ' ' . $sttsumur, + 'alamat' => $alamat, + 'tanggal' => $tanggal, + 'settings' => $this->settings('settings'), + 'detail' => htmlspecialchars_array($detail_pemberian_obat) ]); + /* ================= PDF ================= */ $mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', - 'format' => [200, 400], + 'format' => [200, 400], 'margin_left' => 20, 'margin_right' => 20, 'margin_top' => 2, 'margin_bottom' => 2 ]); - $url = url(ADMIN.'/tmp/cetak.eresep.html'); - $html = file_get_contents($url); - $mpdf->WriteHTML($this->core->setPrintCss(),\Mpdf\HTMLParserMode::HEADER_CSS); - $mpdf->WriteHTML($html,\Mpdf\HTMLParserMode::HTML_BODY); + $mpdf->WriteHTML( + $this->core->setPrintCss(), + \Mpdf\HTMLParserMode::HEADER_CSS + ); + $mpdf->WriteHTML( + $html, + \Mpdf\HTMLParserMode::HTML_BODY + ); - // Output a PDF file directly to the browser $mpdf->Output(); - // $mpdf->Output(UPLOADS.'/test.pdf', 'F'); - exit(); + exit; + } + + public function getCetakTelaahResep($no_resep) + { + $embalase = (float) $this->settings->get('farmasi.embalase'); + $tuslah = (float) $this->settings->get('farmasi.tuslah'); + + $header = $this->db('resep_obat') + ->select('resep_obat.*') + ->select('reg_periksa.no_reg') + ->select('reg_periksa.umurdaftar') + ->select('reg_periksa.sttsumur') + ->select('pasien.no_rkm_medis') + ->select('pasien.nm_pasien') + ->select('pasien.alamat') + ->select('dokter.nm_dokter') + ->select('penjab.png_jawab') + ->select('poliklinik.nm_poli') + ->join('reg_periksa', 'reg_periksa.no_rawat = resep_obat.no_rawat') + ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->join('dokter', 'dokter.kd_dokter = resep_obat.kd_dokter') + ->join('penjab', 'penjab.kd_pj = reg_periksa.kd_pj') + ->join('poliklinik', 'poliklinik.kd_poli = reg_periksa.kd_poli') + ->where('resep_obat.no_resep', $no_resep) + ->oneArray(); + + if (!$header) { + echo 'Data resep tidak ditemukan.'; + exit; + } + + $detail = []; + $totalBiayaResep = 0; + + $nonRacikan = $this->db('resep_dokter') + ->select('resep_dokter.*') + ->select('databarang.nama_brng') + ->select('databarang.dasar') + ->join('databarang', 'databarang.kode_brng = resep_dokter.kode_brng') + ->where('resep_dokter.no_resep', $no_resep) + ->toArray(); + + foreach ($nonRacikan as $item) { + $basePrice = (float) ($item['dasar'] ?? $item['ralan'] ?? 0); + $unitPrice = $this->calculateDrugUnitPrice($basePrice); + $grandTotal = $this->calculateDrugGrandTotal($basePrice, $item['jml'] ?? 0, $embalase, $tuslah); + $totalBiayaResep += $grandTotal; + $detail[] = [ + 'nama_obat' => $item['nama_brng'] ?? '', + 'keterangan' => number_format((float) ($item['jml'] ?? 0), 0, ',', '.') . ' x ' . number_format($unitPrice, 0, ',', '.') . ' + ' . number_format($embalase, 0, ',', '.') . ' + ' . number_format($tuslah, 0, ',', '.') . ' = ' . number_format($grandTotal, 0, ',', '.'), + 'cara_pakai' => $item['aturan_pakai'] ?: '-' + ]; + } + + $racikan = $this->db('resep_dokter_racikan') + ->where('no_resep', $no_resep) + ->toArray(); + + foreach ($racikan as $racik) { + $racikanDetail = $this->db('resep_dokter_racikan_detail') + ->select('resep_dokter_racikan_detail.*') + ->select('databarang.nama_brng') + ->select('databarang.dasar') + ->join('databarang', 'databarang.kode_brng = resep_dokter_racikan_detail.kode_brng') + ->where('resep_dokter_racikan_detail.no_resep', $no_resep) + ->where('resep_dokter_racikan_detail.no_racik', $racik['no_racik']) + ->toArray(); + + $racikanTotal = 0; + $racikanItems = []; + foreach ($racikanDetail as $racikanItem) { + $basePrice = (float) ($racikanItem['dasar'] ?? $racikanItem['ralan'] ?? 0); + $racikanTotal += $this->calculateDrugGrandTotal($basePrice, $racikanItem['jml'] ?? 0, $embalase, $tuslah); + if (!empty($racikanItem['nama_brng'])) { + $racikanItems[] = $racikanItem['nama_brng']; + } + } + + $totalBiayaResep += $racikanTotal; + $detail[] = [ + 'nama_obat' => trim(($racik['nama_racik'] ?? 'Racikan') . ' (Racikan)'), + 'keterangan' => (!empty($racikanItems) ? implode(', ', $racikanItems) . ' | ' : '') . 'Total = ' . number_format($racikanTotal, 0, ',', '.'), + 'cara_pakai' => $racik['aturan_pakai'] ?: '-' + ]; + } + + $semuaAturanPakaiTerisi = true; + foreach ($detail as $item) { + if (empty($item['cara_pakai']) || $item['cara_pakai'] === '-') { + $semuaAturanPakaiTerisi = false; + break; + } + } + + $header['umur_lengkap'] = trim(($header['umurdaftar'] ?? '') . ' ' . ($header['sttsumur'] ?? '')); + $header['tanggal_peresepan_display'] = (!empty($header['tgl_peresepan']) && $header['tgl_peresepan'] !== '0000-00-00' ? dateIndonesia($header['tgl_peresepan']) : '-') . (!empty($header['jam_peresepan']) ? ' ' . $header['jam_peresepan'] : ''); + $header['unit_layanan_label'] = 'Poli'; + $header['unit_layanan'] = $header['nm_poli'] ?? '-'; + $header['cara_bayar'] = $header['png_jawab'] ?? '-'; + $header['nomor_antrian'] = !empty($header['no_reg']) ? str_pad((string) $header['no_reg'], 3, '0', STR_PAD_LEFT) : '-'; + $header['tanggal_cetak'] = dateIndonesia(date('Y-m-d')); + $header['total_biaya_resep'] = number_format($totalBiayaResep, 0, ',', '.'); + + $checklist = [ + 'nama_pasien_yes' => !empty($header['nm_pasien']) ? 'v' : '', + 'nama_pasien_no' => empty($header['nm_pasien']) ? 'v' : '', + 'umur_pasien_yes' => !empty(trim($header['umur_lengkap'])) ? 'v' : '', + 'umur_pasien_no' => empty(trim($header['umur_lengkap'])) ? 'v' : '', + 'alamat_pasien_yes' => !empty($header['alamat']) ? 'v' : '', + 'alamat_pasien_no' => empty($header['alamat']) ? 'v' : '', + 'berat_badan_yes' => '', + 'berat_badan_no' => '', + 'nama_dokter_yes' => !empty($header['nm_dokter']) ? 'v' : '', + 'nama_dokter_no' => empty($header['nm_dokter']) ? 'v' : '', + 'paraf_dokter_yes' => '', + 'paraf_dokter_no' => '', + 'tanggal_resep_yes' => !empty($header['tgl_peresepan']) && $header['tgl_peresepan'] !== '0000-00-00' ? 'v' : '', + 'tanggal_resep_no' => empty($header['tgl_peresepan']) || $header['tgl_peresepan'] === '0000-00-00' ? 'v' : '', + 'nama_obat_yes' => !empty($detail) ? 'v' : '', + 'nama_obat_no' => empty($detail) ? 'v' : '', + 'aturan_pakai_yes' => $semuaAturanPakaiTerisi ? 'v' : '', + 'aturan_pakai_no' => !$semuaAturanPakaiTerisi ? 'v' : '', + 'unit_yes' => !empty($header['unit_layanan']) && $header['unit_layanan'] !== '-' ? 'v' : '', + 'unit_no' => empty($header['unit_layanan']) || $header['unit_layanan'] === '-' ? 'v' : '', + 'tulisan_yes' => '', + 'tulisan_no' => '', + ]; + + $html = $this->draw('cetak.telaah_resep.html', [ + 'settings' => $this->settings('settings'), + 'header' => htmlspecialchars_array($header), + 'detail' => htmlspecialchars_array($detail), + 'checklist' => htmlspecialchars_array($checklist) + ]); + + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4-L', + 'margin_left' => 8, + 'margin_right' => 8, + 'margin_top' => 8, + 'margin_bottom' => 8 + ]); + + $mpdf->WriteHTML($this->core->setPrintCss(), \Mpdf\HTMLParserMode::HEADER_CSS); + $mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY); + $mpdf->Output(); + exit; } + public function getJavascript() { header('Content-type: text/javascript'); $this->assign['websocket'] = $this->settings->get('settings.websocket'); $this->assign['websocket_proxy'] = $this->settings->get('settings.websocket_proxy'); - echo $this->draw(MODULES.'/apotek_ralan/js/admin/apotek_ralan.js', ['mlite' => $this->assign]); + echo $this->draw(MODULES.'/apotek_ralan/js/admin/apotek_ralan.js', ['mlite' => htmlspecialchars_array($this->assign)]); exit(); } @@ -762,4 +1671,487 @@ private function _addHeaderFiles() $this->core->addJS(url([ADMIN, 'apotek_ralan', 'javascript']), 'footer'); } + public function apiResepList() + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $this->db()->pdo()->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + $page = isset($_GET['page']) ? $_GET['page'] : 1; + $per_page = isset($_GET['per_page']) ? $_GET['per_page'] : 10; + $offset = ($page - 1) * $per_page; + $search = isset($_GET['s']) ? $_GET['s'] : ''; + $tgl_awal = isset($_GET['tgl_awal']) ? $_GET['tgl_awal'] : date('Y-m-d'); + $tgl_akhir = isset($_GET['tgl_akhir']) ? $_GET['tgl_akhir'] : date('Y-m-d'); + + $query = $this->db('resep_obat') + ->leftJoin('reg_periksa', 'reg_periksa.no_rawat = resep_obat.no_rawat') + ->leftJoin('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->leftJoin('dokter', 'dokter.kd_dokter = resep_obat.kd_dokter') + ->where(function($query) { + $query->where('resep_obat.status', 'ralan'); + }) + ->where('resep_obat.tgl_peresepan', '>=', $tgl_awal) + ->where('resep_obat.tgl_peresepan', '<=', $tgl_akhir); + + if ($search) { + $query->like('resep_obat.no_resep', '%'.$search.'%'); + } + + $total = $query->count(); + $data = $query + ->select('resep_obat.*') + ->select('pasien.nm_pasien') + ->select('pasien.no_rkm_medis') + ->select('dokter.nm_dokter') + ->offset($offset) + ->limit($per_page) + ->desc('resep_obat.tgl_peresepan') + ->desc('resep_obat.jam_peresepan') + ->toArray(); + + foreach ($data as &$row) { + $is_obat = $this->db('resep_dokter')->select('no_resep')->where('no_resep', $row['no_resep'])->oneArray(); + $is_racikan = $this->db('resep_dokter_racikan')->select('no_resep')->where('no_resep', $row['no_resep'])->oneArray(); + + if ($is_obat && $is_racikan) { + $row['kategori'] = 'obat,racikan'; + } elseif ($is_obat) { + $row['kategori'] = 'obat'; + } elseif ($is_racikan) { + $row['kategori'] = 'racikan'; + } else { + $row['kategori'] = '-'; + } + } + + // Optimization: Details are fetched asynchronously on frontend + // foreach ($data as &$row) { + // $row['detail'] = $this->apiShowDetail('obat', $row['no_rawat'], $row['no_resep']); + // $row['racikan'] = $this->apiShowDetail('racikan', $row['no_rawat'], $row['no_resep']); + // } + + return [ + 'status' => 'success', + 'data' => $data, + 'total' => $total, + 'page' => $page, + 'per_page' => $per_page + ]; + } + + public function apiShowDetail($category = null, $no_rawat = null, $no_resep = null) + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $no_rawat = revertNorawat($no_rawat); + $kategori = trim($category); + + if (!$no_resep) { + $no_resep = isset($_GET['no_resep']) ? $_GET['no_resep'] : null; + } + + $pasien = $this->db('reg_periksa') + ->leftJoin('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $patient_info = [ + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'no_rkm_medis' => $pasien['no_rkm_medis'] ?? '' + ]; + + try { + if ($kategori == 'obat') { + $query = $this->db('resep_dokter') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter.no_resep') + ->join('databarang', 'databarang.kode_brng = resep_dokter.kode_brng') + ->leftJoin('reg_periksa', 'reg_periksa.no_rawat = resep_obat.no_rawat') + ->leftJoin('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('resep_obat.no_rawat', $no_rawat) + ->where(function($query) { + $query->where('resep_obat.status', 'ralan'); + }); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $resep_dokter = $query->toArray(); + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => $resep_dokter + ]; + } elseif ($kategori == 'racikan') { + $query = $this->db('resep_dokter_racikan') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter_racikan.no_resep') + ->join('metode_racik', 'metode_racik.kd_racik = resep_dokter_racikan.kd_racik') + ->leftJoin('reg_periksa', 'reg_periksa.no_rawat = resep_obat.no_rawat') + ->leftJoin('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('resep_obat.no_rawat', $no_rawat) + ->where(function($query) { + $query->where('resep_obat.status', 'ralan'); + }); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $resep_racikan = $query->toArray(); + + foreach ($resep_racikan as &$racikan) { + $racikan['detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng = resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $racikan['no_resep']) + ->where('no_racik', $racikan['no_racik']) + ->toArray(); + } + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => htmlspecialchars_array($resep_racikan) + ]; + } else { + return ['status' => 'error', 'message' => 'Category not supported: ' . $kategori]; + } + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiValidasi($no_rawat = null, $no_resep = null) + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $no_rawat = revertNorawat($no_rawat); + if (!$no_resep) { + $no_resep = isset($_GET['no_resep']) ? $_GET['no_resep'] : null; + } + + $detail_pemberian_obat = $this->db('detail_pemberian_obat') + ->join('databarang', 'databarang.kode_brng=detail_pemberian_obat.kode_brng') + ->where('no_rawat', $no_rawat) + ->where('status', 'Ralan') + ->toArray(); + + // Also fetch obat_racikan + $obat_racikan = $this->db('obat_racikan') + ->where('no_rawat', $no_rawat) + ->toArray(); + + return [ + 'status' => 'success', + 'data' => [ + 'pemberian_obat' => htmlspecialchars_array($detail_pemberian_obat), + 'obat_racikan' => htmlspecialchars_array($obat_racikan) + ] + ]; + } + + public function apiSaveValidasi() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!$input) { + $input = $_POST; + } + + $tgl_rawat = date('Y-m-d'); + $jam_rawat = date('H:i:s'); + + $no_resep = $input['no_resep']; + $no_rawat = $input['no_rawat']; + + if(isset($input['penyerahan']) && $input['penyerahan'] == 'penyerahan') { + $this->db('resep_obat')->where('no_resep', $no_resep)->save(['tgl_penyerahan' => $tgl_rawat, 'jam_penyerahan' => $jam_rawat]); + } else { + $get_resep_dokter_nonracikan = $this->db('resep_dokter') + ->select([ + 'kode_brng' => 'kode_brng', + 'jml' => 'jml', + 'aturan_pakai' => 'aturan_pakai' + ]) + ->where('no_resep', $no_resep) + ->toArray(); + $get_resep_dokter_racikan = $this->db('resep_dokter_racikan') + ->select([ + 'no_racik' => 'resep_dokter_racikan.no_racik', + 'nama_racik' => 'resep_dokter_racikan.nama_racik', + 'kd_racik' => 'resep_dokter_racikan.kd_racik', + 'jml_dr' => 'resep_dokter_racikan.jml_dr', + 'keterangan' => 'resep_dokter_racikan.keterangan', + 'kode_brng' => 'kode_brng', + 'jml' => 'jml', + 'aturan_pakai' => 'aturan_pakai' + ]) + ->join('resep_dokter_racikan_detail', 'resep_dokter_racikan_detail.no_resep=resep_dokter_racikan.no_resep AND resep_dokter_racikan.no_racik=resep_dokter_racikan_detail.no_racik') + ->where('resep_dokter_racikan.no_resep', $no_resep) + ->toArray(); + $get_resep_dokter = array_merge($get_resep_dokter_nonracikan, $get_resep_dokter_racikan); + + $embalaseData = isset($input['embalase']) ? (is_array($input['embalase']) ? $input['embalase'] : json_decode($input['embalase'], true)) : []; + $tuslahData = isset($input['tuslah']) ? (is_array($input['tuslah']) ? $input['tuslah'] : json_decode($input['tuslah'], true)) : []; + $jumlahData = isset($input['jumlah']) ? (is_array($input['jumlah']) ? $input['jumlah'] : json_decode($input['jumlah'], true)) : []; + $kandunganData = isset($input['kandungan']) ? (is_array($input['kandungan']) ? $input['kandungan'] : json_decode($input['kandungan'], true)) : []; + $aturanPakaiData = isset($input['aturan_pakai']) ? (is_array($input['aturan_pakai']) ? $input['aturan_pakai'] : json_decode($input['aturan_pakai'], true)) : []; + + if(!empty($get_resep_dokter_racikan)) { + $racikan_unique = []; + foreach ($get_resep_dokter_racikan as $row) { + if (!isset($racikan_unique[$row['no_racik']])) { + $racikan_unique[$row['no_racik']] = $row; + } + } + + $aturan_pakai_racikan = isset($aturanPakaiData[$racikan['kd_racik']]) ? $aturanPakaiData[$racikan['kd_racik']] : $racikan['aturan_pakai']; + + foreach ($racikan_unique as $racikan) { + $this->db('obat_racikan')->save( + [ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'no_racik' => htmlspecialchars_array($racikan)['no_racik'], + 'nama_racik' => htmlspecialchars_array($racikan)['nama_racik'], + 'kd_racik' => htmlspecialchars_array($racikan)['kd_racik'], + 'jml_dr' => htmlspecialchars_array($racikan)['jml_dr'], + 'aturan_pakai' => $aturan_pakai_racikan, + 'keterangan' => htmlspecialchars_array($racikan)['keterangan'] + ] + ); + } + } + + foreach ($get_resep_dokter as $item) { + + $jumlah = isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']; + $kandungan = isset($kandunganData[$item['kode_brng']]) ? $kandunganData[$item['kode_brng']] : (isset($item['kandungan']) ? $item['kandungan'] : 0); + $aturan_pakai = isset($aturanPakaiData[$item['kode_brng']]) ? $aturanPakaiData[$item['kode_brng']] : (isset($item['aturan_pakai']) ? $item['aturan_pakai'] : ''); + + if(isset($item['no_racik'])) { + $jumlah_racik = isset($item['jml_dr']) ? $item['jml_dr'] : (isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']); + $jumlah = isset($jumlahData[$item['kode_brng']]) ? $jumlahData[$item['kode_brng']] : $item['jml']; + } + + $get_gudangbarang = $this->db('gudangbarang')->where('kode_brng', $item['kode_brng'])->where('kd_bangsal', $this->settings->get('farmasi.deporalan'))->oneArray(); + $get_databarang = $this->db('databarang')->where('kode_brng', $item['kode_brng'])->oneArray(); + + $this->db('gudangbarang') + ->where('kode_brng', $item['kode_brng']) + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->update([ + 'stok' => $get_gudangbarang['stok'] - $jumlah + ]); + + if(isset($item['no_racik'])) { + $this->db('resep_dokter_racikan') + ->where('no_resep', $no_resep) + ->where('no_racik', $item['no_racik']) + ->update([ + 'jml_dr' => $jumlah_racik + ]); + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $no_resep) + ->where('no_racik', $item['no_racik']) + ->where('kode_brng', $item['kode_brng']) + ->update([ + 'jml' => $jumlah, + 'kandungan' => $kandungan + ]); + } else { + $this->db('resep_dokter') + ->where('no_resep', $no_resep) + ->where('kode_brng', $item['kode_brng']) + ->update([ + 'jml' => $jumlah + ]); + } + + $this->db('riwayat_barang_medis') + ->save([ + 'kode_brng' => $item['kode_brng'], + 'stok_awal' => $get_gudangbarang['stok'], + 'masuk' => '0', + 'keluar' => $jumlah, + 'stok_akhir' => $get_gudangbarang['stok'] - $jumlah, + 'posisi' => 'Pemberian Obat', + 'tanggal' => $tgl_rawat, + 'jam' => $jam_rawat, + 'petugas' => $this->core->getUserInfo('fullname', null, true), + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'status' => 'Simpan', + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'], + 'keterangan' => $no_rawat . ' ' . $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat) . ' ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat)) + ]); + + $embalase = isset($embalaseData[$item['kode_brng']]) ? $embalaseData[$item['kode_brng']] : $this->settings->get('farmasi.embalase'); + $tuslah = isset($tuslahData[$item['kode_brng']]) ? $tuslahData[$item['kode_brng']] : $this->settings->get('farmasi.tuslah'); + + $this->db('detail_pemberian_obat') + ->save([ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'kode_brng' => $item['kode_brng'], + 'h_beli' => $get_databarang['h_beli'], + 'biaya_obat' => $this->calculateDrugUnitPrice($get_databarang['dasar']), + 'jml' => $jumlah, + 'embalase' => $embalase, + 'tuslah' => $tuslah, + 'total' => $this->calculateDrugSubtotal($get_databarang['dasar'], $jumlah), + 'status' => 'Ralan', + 'kd_bangsal' => $this->settings->get('farmasi.deporalan'), + 'no_batch' => $get_gudangbarang['no_batch'], + 'no_faktur' => $get_gudangbarang['no_faktur'] + ]); + + $this->db('aturan_pakai') + ->save([ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'kode_brng' => $item['kode_brng'], + 'aturan' => $aturan_pakai + ]); + + if(isset($item['no_racik'])) { + $this->db('detail_obat_racikan') + ->save([ + 'tgl_perawatan' => $tgl_rawat, + 'jam' => $jam_rawat, + 'no_rawat' => $no_rawat, + 'no_racik' => $item['no_racik'], + 'kode_brng' => $item['kode_brng'] + ]); + } + + } + + $this->db('resep_obat')->where('no_resep', $no_resep)->save(['tgl_perawatan' => $tgl_rawat, 'jam' => $jam_rawat]); + } + + return ['status' => 'success']; + } + + public function apiSimpanObatResep() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!$input) { + $input = $_POST; + } + + $check = $this->db('resep_dokter') + ->where('no_resep', $input['no_resep']) + ->where('kode_brng', $input['kode_brng']) + ->oneArray(); + + if ($check) { + $this->db('resep_dokter') + ->where('no_resep', $input['no_resep']) + ->where('kode_brng', $input['kode_brng']) + ->update([ + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } else { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $input['no_resep'], + 'kode_brng' => $input['kode_brng'], + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } + + return ['status' => 'success']; + } + + public function apiSimpanRacikanResep() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'apotek_ralan')) { + return ['status' => 'error', 'message' => 'You do not have permission to access this resource']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!$input) { + $input = $_POST; + } + + // 1. Save Header Racikan + $no_racik = $input['no_racik']; + $check = $this->db('resep_dokter_racikan') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $no_racik) + ->oneArray(); + + if (!$check) { + $this->db('resep_dokter_racikan')->save([ + 'no_resep' => $input['no_resep'], + 'no_racik' => $no_racik, + 'nama_racik' => $input['nama_racik'], + 'kd_racik' => $input['kd_racik'], + 'jml_dr' => $input['jml_dr'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + } else { + $this->db('resep_dokter_racikan') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $no_racik) + ->update([ + 'nama_racik' => $input['nama_racik'], + 'jml_dr' => $input['jml_dr'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + } + + // 2. Save Ingredients + $items = isset($input['items']) ? (is_array($input['items']) ? $input['items'] : json_decode($input['items'], true)) : []; + + if (is_array($items)) { + // Delete existing details for this racikan to allow full update + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $no_racik) + ->delete(); + + foreach ($items as $item) { + $this->db('resep_dokter_racikan_detail')->save([ + 'no_resep' => $input['no_resep'], + 'no_racik' => $no_racik, + 'kode_brng' => $item['kode_brng'], + 'p1' => 1, + 'p2' => 1, + 'kandungan' => $item['kandungan'], + 'jml' => $item['jml'] + ]); + } + } + + return ['status' => 'success']; + } + } diff --git a/plugins/apotek_ralan/Help.md b/plugins/apotek_ralan/Help.md deleted file mode 100644 index 3b1575f99..000000000 --- a/plugins/apotek_ralan/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
            - -
            diff --git a/plugins/apotek_ralan/Info.php b/plugins/apotek_ralan/Info.php index 9441853ee..194e50f36 100644 --- a/plugins/apotek_ralan/Info.php +++ b/plugins/apotek_ralan/Info.php @@ -4,8 +4,9 @@ 'name' => 'Apotek Ralan', 'description' => 'Modul apotek rawat jalan untuk mLITE', 'author' => 'Basoro', + 'category' => 'farmasi', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'shopping-cart', 'install' => function () use ($core) { }, diff --git a/plugins/apotek_ralan/README.md b/plugins/apotek_ralan/README.md new file mode 100644 index 000000000..02cf234f3 --- /dev/null +++ b/plugins/apotek_ralan/README.md @@ -0,0 +1,50 @@ +# Plugin Apotek Ralan + +Dokumentasi singkat penggunaan modul **Apotek Rawat Jalan** di mLITE. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Apotek Ralan**. +- Pilih submenu sesuai kebutuhan: + - Kelola + +## Panduan Pengguna (Petugas) + +Petugas apotek rawat jalan menggunakan menu **Kelola** untuk seluruh proses pelayanan resep: + +1. **Melihat Daftar Resep** + - Buka **Apotek Ralan → Kelola**. + - Atur filter **Tanggal Kunjungan** (dari–sampai) dan **Status Periksa** (semua / belum / selesai / lunas). + - Klik **Tampilkan** untuk memuat daftar pasien rawat jalan. + +2. **Memproses Resep Pasien** + - Klik baris pasien untuk membuka detail resep. + - Periksa daftar obat yang diresepkan dokter. + - Klik **Validasi Resep** untuk memvalidasi resep sebelum penyiapan obat. + - Tambah item obat dengan mengisi kode barang, jumlah, aturan pakai, dan keterangan, lalu klik **Simpan**. + - Untuk obat racikan, gunakan form **Racikan** — isi nama racikan, jumlah, dan komposisi obat. + - Hapus item obat atau resep yang tidak sesuai menggunakan tombol hapus. + +3. **Mencetak Etiket dan E-Resep** + - Setelah resep divalidasi, klik **Cetak Etiket** untuk mencetak label etiket obat per item. + - Klik **Cetak E-Resep** untuk mencetak keseluruhan resep elektronik pasien. + +4. **Rincian Resep** + - Buka **Rincian** untuk melihat detail biaya dan item resep yang sudah diproses. + +## Panduan Admin + +1. **Konfigurasi Depo Apotek Ralan** + - Pastikan pengaturan `farmasi.deporalan` sudah mengarah ke kode bangsal/gudang apotek rawat jalan yang benar (diatur di modul Farmasi/Settings). + - Kode bangsal ini digunakan saat validasi stok obat saat memproses resep. + +2. **Integrasi VClaim** + - Jika modul **VClaim** aktif, kolom SEP akan ditampilkan pada daftar pasien di Kelola. + - Pastikan modul VClaim sudah dikonfigurasi sebelum menggunakan fitur ini. + +## Catatan + +- Resep hanya dapat diproses untuk pasien yang sudah terdaftar di rawat jalan (tabel `reg_periksa`). +- Validasi resep harus dilakukan sebelum obat dapat diserahkan kepada pasien. +- Cetak etiket mendukung format per item obat (termasuk aturan pakai dan nama pasien). diff --git a/plugins/apotek_ralan/js/admin/apotek_ralan.js b/plugins/apotek_ralan/js/admin/apotek_ralan.js index a6402ef56..7df491a3b 100644 --- a/plugins/apotek_ralan/js/admin/apotek_ralan.js +++ b/plugins/apotek_ralan/js/admin/apotek_ralan.js @@ -41,7 +41,6 @@ $('#manage').on('click', '#submit_periode_rawat_jalan', function(event){ $("#rincian").hide(); $("#sep").hide(); $("#soap").hide(); - $('.periode_rawat_jalan').datetimepicker('remove'); }); }); @@ -72,7 +71,6 @@ $('#manage').on('click', '#belum_periode_rawat_jalan', function(event){ $("#rincian").hide(); $("#sep").hide(); $("#soap").hide(); - $('.periode_rawat_jalan').datetimepicker('remove'); }); }); @@ -103,7 +101,6 @@ $('#manage').on('click', '#selesai_periode_rawat_jalan', function(event){ $("#rincian").hide(); $("#sep").hide(); $("#soap").hide(); - $('.periode_rawat_jalan').datetimepicker('remove'); }); }); @@ -134,7 +131,6 @@ $('#manage').on('click', '#lunas_periode_rawat_jalan', function(event){ $("#rincian").hide(); $("#sep").hide(); $("#soap").hide(); - $('.periode_rawat_jalan').datetimepicker('remove'); }); }); @@ -179,6 +175,7 @@ $("#form_rincian").on("click", "#selesai", function(event){ // ketika baris data diklik $("#display").on("click", ".layanan_obat", function(event){ + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_update', 'apotek_ralan') == true} var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); @@ -194,12 +191,18 @@ $("#display").on("click", ".layanan_obat", function(event){ var url = baseURL + '/apotek_ralan/rincian?t=' + mlite.token; $.post(url, {no_rawat : no_rawat, }, function(data) { + // hapus modal sebelumnya jika ada + $('#modal_gudangbarang').remove(); + $('.modal-backdrop').remove(); + $('body').removeClass('modal-open'); + // tampilkan data $("#form_rincian").show(); $("#form").hide(); $("#notif").hide(); $("#rincian").html(data).show(); }); + {/if} }); // ketika inputbox pencarian diisi @@ -258,8 +261,12 @@ $('input:text[name=racikan]').on('input',function(e){ if(racikan!="") { $.post(url, {racikan: racikan} ,function(data) { // tampilkan data yang sudah di perbaharui + console.log(data); $("#racikan").html(data).show(); + $("#layanan").hide(); $("#obat").hide(); + $("#radiologi").hide(); + $("#laboratorium").hide(); }); } @@ -294,7 +301,7 @@ $('.databarang_ajax').selectator({ load: function (search, callback) { if (search.length < this.minSearchLength) return callback(); $.ajax({ - url: '{?=url()?}/{?=ADMIN?}/dokter_ralan/ajax?show=databarang&nama_brng=' + encodeURIComponent(search) + '&t={?=$_SESSION['token']?}', + url: '{?=url()?}/{?=ADMIN?}/apotek_ralan/ajax?show=databarang&nama_brng=' + encodeURIComponent(search) + '&t={?=$_SESSION['token']?}', type: 'GET', dataType: 'json', success: function(data) { @@ -331,6 +338,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ var keterangan = $('textarea[name=keterangan]').val(); var kode_brng = JSON.stringify($('select[name=kode_brng]').serializeArray()); var kandungan = JSON.stringify($('input:text[name=kandungan]').serializeArray()); + var embalase = $('input:text[name=embalase]').val(); + var tuslah = $('input:text[name=tuslah]').val(); console.log(kode_brng); @@ -348,7 +357,9 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ nama_racik : nama_racik, keterangan : keterangan, kode_brng : kode_brng, - kandungan : kandungan + kandungan : kandungan, + embalase : embalase, + tuslah : tuslah }, function(data) { // tampilkan data $("#display").hide(); @@ -421,6 +432,77 @@ $("#rincian").on("click",".validasi_resep_obat", function(event){ var jenis_racikan = $(this).attr("data-racikan"); var penyerahan = $(this).attr("data-penyerahan"); + var $tbody = $(this).closest('tbody.resep-group'); + var $rows = $tbody.find('tr.item-row'); + var valid = true; + var msg = ""; + var embalaseData = {}; + var tuslahData = {}; + var jumlahData = {}; + var kandunganData = {}; + var aturanPakaiData = {}; + + // Proses header racikan untuk aturan pakai + var $racikanHeaderRow = $tbody.find('tr').has('.aturan_pakai'); + $racikanHeaderRow.each(function() { + var $aturanInput = $(this).find('.aturan_pakai'); + if ($aturanInput.length > 0) { + var kd_racik = $aturanInput.attr('data-kode_brng'); + var aturan = $aturanInput.val(); + if (kd_racik && aturan !== undefined) { + aturanPakaiData[kd_racik] = aturan; + } + } + }); + + $rows.each(function() { + var stok = parseFloat($(this).attr('data-stok')); + // var jml = parseFloat($(this).attr('data-jml')); + var nama = $(this).attr('data-nama_brng'); + + var kode_brng = $(this).find('.embalase').attr('data-kode_brng') || $(this).find('.kandungan_obat').attr('data-kode_brng'); + var embalaseVal = $(this).find('.embalase').val(); + var tuslahVal = $(this).find('.tuslah').val(); + var jumlahVal = $(this).find('.jumlah_obat').val(); + var kandunganVal = $(this).find('.kandungan_obat').val(); + var aturanPakaiVal = $(this).find('.aturan_pakai').val(); + + var jml = parseFloat(jumlahVal); + var kandungan = parseFloat(kandunganVal); + + if (isNaN(jml)) { + // Cek jika ini baris racikan (parent) + var jmlRacik = parseFloat($(this).closest('tbody').find('tr:first .jumlah_obat').val()); + if(!isNaN(jmlRacik) && !isNaN(kandungan)) { + var kapasitas = parseFloat($(this).attr('data-kapasitas')); + jml = Math.round((jmlRacik * kandungan) / kapasitas); + } else { + jml = parseFloat($(this).attr('data-jml')); + } + } + if (isNaN(jml)) jml = 0; + + if(kode_brng) { + if(embalaseVal !== undefined) embalaseData[kode_brng] = embalaseVal; + if(tuslahVal !== undefined) tuslahData[kode_brng] = tuslahVal; + if(jumlahVal !== undefined) jumlahData[kode_brng] = jml; + if(kandunganVal !== undefined) kandunganData[kode_brng] = kandungan; + if(aturanPakaiVal !== undefined) aturanPakaiData[kode_brng] = aturanPakaiVal; + } + + if (isNaN(stok)) stok = 0; + + if (stok < jml) { + valid = false; + msg += "Stok " + nama + " tidak mencukupi (Stok: " + stok + ", Jml: " + jml + ")\n"; + } + }); + + if (!valid) { + alert(msg); + return false; + } + // tampilkan dialog konfirmasi bootbox.confirm("Apakah Anda yakin ingin menvalidasi/menyerahkan data resep ini?", function(result){ // ketika ditekan tombol ok @@ -432,7 +514,12 @@ $("#rincian").on("click",".validasi_resep_obat", function(event){ tgl_peresepan: tgl_peresepan, jam_peresepan: jam_peresepan, jenis_racikan: jenis_racikan, - penyerahan: penyerahan + penyerahan: penyerahan, + embalase: JSON.stringify(embalaseData), + tuslah: JSON.stringify(tuslahData), + jumlah: JSON.stringify(jumlahData), + kandungan: JSON.stringify(kandunganData), + aturan_pakai: JSON.stringify(aturanPakaiData) } ,function(data) { console.log(data); var url = baseURL + '/apotek_ralan/rincian?t=' + mlite.token; @@ -484,6 +571,134 @@ $("#rincian").on("click",".hapus_resep_dokter", function(event){ }); }); +// ketika tombol hapus ditekan +$("#rincian").on("click",".hapus_obat", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var url = baseURL + '/apotek_ralan/hapusobat?t=' + mlite.token; + var kode_brng = $(this).attr("data-kode_brng"); + var no_rawat = $(this).attr("data-no_rawat"); + var tgl_perawatan = $(this).attr("data-tgl_peresepan"); + var jam = $(this).attr("data-jam_peresepan"); + var jml = $(this).attr("data-jml"); + + console.log(kode_brng + ' ' + no_rawat + ' ' + tgl_perawatan + ' ' + jam); + + // tampilkan dialog konfirmasi + bootbox.confirm("Apakah Anda yakin ingin menghapus data ini?", function(result){ + // ketika ditekan tombol ok + if (result){ + // mengirimkan perintah penghapusan + $.post(url, { + kode_brng: kode_brng, + no_rawat: no_rawat, + tgl_perawatan: tgl_perawatan, + jam: jam, + jml: jml + } ,function(data) { + console.log(data); + var url = baseURL + '/apotek_ralan/rincian?t=' + mlite.token; + $.post(url, {no_rawat : no_rawat, + }, function(data) { + // tampilkan data + $("#rincian").html(data).show(); + }); + $('#notif').html("
            "+ + "Data rincian rawat jalan telah dihapus!"+ + ""+ + "
            ").show(); + }); + } + }); +}); + +// ketika tombol hapus ditekan +$("#rincian").on("click",".hapus_obat_racikan", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var url = baseURL + '/apotek_ralan/hapusobatracikan?t=' + mlite.token; + var no_rawat = $(this).attr("data-no_rawat"); + var tgl_perawatan = $(this).attr("data-tgl_peresepan"); + var jam = $(this).attr("data-jam_peresepan"); + var no_racik = $(this).attr("data-no_racik"); // Add this to HTML + var jml = $(this).attr("data-jml"); + + // tampilkan dialog konfirmasi + bootbox.confirm("Apakah Anda yakin ingin menghapus data ini?", function(result){ + // ketika ditekan tombol ok + if (result){ + // mengirimkan perintah penghapusan + $.post(url, { + no_rawat: no_rawat, + tgl_perawatan: tgl_perawatan, + jam: jam, + no_racik: no_racik, + jml: jml + } ,function(data) { + console.log(data); + var url = baseURL + '/apotek_ralan/rincian?t=' + mlite.token; + $.post(url, {no_rawat : no_rawat, + }, function(data) { + // tampilkan data + $("#rincian").html(data).show(); + }); + $('#notif').html("
            "+ + "Data rincian rawat jalan telah dihapus!"+ + ""+ + "
            ").show(); + }); + } + }); +}); + +$("#rincian").on("click", ".bayar_parsial_obat", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + + var no_rawat = $(this).attr("data-no_rawat"); + if(!no_rawat) { + no_rawat = $('input:hidden[name=no_rawat_parsial_obat]').val(); + } + var metode = $('select[name=metode_parsial_obat]').val(); + var jumlah = $('input[name=jumlah_bayar_parsial_obat]').val(); + + if(!jumlah || parseFloat(jumlah) <= 0) { + alert('Nominal bayar masih kosong!'); + return; + } + + var url = baseURL + '/apotek_ralan/bayarparsial?t=' + mlite.token; + $.post(url, { + no_rawat: no_rawat, + metode: metode, + jumlah_bayar: jumlah + }, function(data) { + var res = data; + try { + if (typeof data === 'string') { + res = JSON.parse(data); + } + } catch (e) { + res = {status: 'error', message: 'Respon tidak valid.'}; + } + + if (res.status === 'success') { + window.open(baseURL + '/apotek_ralan/notaparsial?show=kecil&pembayaran_id=' + res.pembayaran_id + '&t=' + mlite.token); + var url2 = baseURL + '/apotek_ralan/rincian?t=' + mlite.token; + $.post(url2, {no_rawat: no_rawat}, function(html) { + $("#rincian").html(html).show(); + }); + $('input[name=jumlah_bayar_parsial_obat]').val(''); + $('#notif').html("
            "+ + (res.message ? res.message : "Pembayaran parsial berhasil disimpan.")+ + ""+ + "
            ").show(); + } else { + alert(res.message ? res.message : 'Gagal menyimpan pembayaran parsial.'); + } + }); +}); + function bersih(){ $('input:text[name=no_rawat]').val(""); $('input:text[name=no_rkm_medis]').val(""); @@ -549,7 +764,7 @@ $(document).on('click', '.table-responsive [data-toggle="dropdown"]', function ( {if: $mlite.websocket_proxy != ''} var URL_WEBSOCKET = "{$mlite.websocket_proxy}"; {else} - var URL_WEBSOCKET = "ws://:3892"; + var URL_WEBSOCKET = "wss://:3892"; {/if} var ws = new WebSocket(URL_WEBSOCKET); @@ -589,4 +804,258 @@ $(document).on('click', '.table-responsive [data-toggle="dropdown"]', function ( },5000); } -{/if} \ No newline at end of file +{/if} + +// Variabel global untuk menampung data sementara dari tombol tambah item +var currentNoResep = ""; +var currentNoRawat = ""; +var currentTglPeresepan = ""; +var currentJamPeresepan = ""; +var currentTipe = ""; +var currentNoRacik = ""; +var currentJmlDr = ""; + +// Ketika tombol tambah item barang diklik +$("#rincian").on("click", ".tambah_item_barang", function(event){ + event.preventDefault(); + currentNoResep = $(this).attr("data-no_resep"); + currentNoRawat = $(this).attr("data-no_rawat"); + currentTglPeresepan = $(this).attr("data-tgl_peresepan"); + currentJamPeresepan = $(this).attr("data-jam_peresepan"); + currentTipe = $(this).attr("data-tipe"); + currentNoRacik = $(this).attr("data-no_racik"); + currentJmlDr = $(this).attr("data-jml_dr"); + + console.log(currentNoRawat + ' ' + currentTipe); + // Reset input pencarian dan tabel + $("#cari_barang").val(""); + $("#tabel_cari_barang tbody").html(""); + + // Tampilkan modal + $("#modal_gudangbarang").modal("show"); + + // Fokus ke input pencarian setelah modal tampil + setTimeout(function(){ + $("#cari_barang").focus(); + }, 500); +}); + +// Ketika input pencarian barang di ketik +$(document).on("keyup", "#cari_barang", function(){ + var search = $(this).val(); + var baseURL = mlite.url + '/' + mlite.admin; + + if(search.length > 2){ + $.ajax({ + url: baseURL + '/apotek_ralan/ajax?show=databarang&nama_brng=' + encodeURIComponent(search) + '&t=' + mlite.token, + type: 'GET', + dataType: 'json', + success: function(data) { + var html = ""; + if(data.length > 0){ + $.each(data, function(i, item){ + html += "
            "; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + }); + } else { + html = ""; + } + $("#tabel_cari_barang tbody").html(html); + } + }); + } +}); + +// Ketika tombol pilih barang di modal diklik +$(document).on("click", ".pilih_barang_modal", function(){ + var kode_brng = $(this).attr("data-kode_brng"); + var nama_brng = $(this).attr("data-nama_brng"); + var embalase_item = $("#embalase_item").val(); + var tuslah_item = $("#tuslah_item").val(); + + console.log(kode_brng + ' - ' + currentNoRawat); + + $("#modal_gudangbarang").modal("hide"); + + if(currentTipe == 'racikan') { + bootbox.prompt({ + title: "Masukkan Kandungan (mg/ml/tab)", + inputType: 'number', + callback: function (kandungan) { + if(kandungan != null && kandungan != ""){ + var baseURL = mlite.url + '/' + mlite.admin; + var url = baseURL + '/apotek_ralan/tambahitemresep?t=' + mlite.token; + + $.post(url, { + no_resep: currentNoResep, + no_rawat: currentNoRawat, + tgl_peresepan: currentTglPeresepan, + jam_peresepan: currentJamPeresepan, + kode_brng: kode_brng, + kandungan: kandungan, + tipe: 'racikan', + no_racik: currentNoRacik, + jml_dr: currentJmlDr, + embalase: embalase_item, + tuslah: tuslah_item + }, function(data) { + console.log(data); + $('#modal_gudangbarang').remove(); + $('.modal-backdrop').remove(); + $('body').removeClass('modal-open'); + + var result = (typeof data === 'string') ? JSON.parse(data) : data; + + var $btn = $('button[data-no_resep="' + currentNoResep + '"][data-no_racik="' + currentNoRacik + '"][data-tipe="racikan"]'); + var $tbody = $btn.closest('tbody.resep-group'); + + var totalHarga = parseFloat(result.total_harga !== undefined ? result.total_harga : result.ralan); + var formattedRalan = isNaN(totalHarga) ? '0' : totalHarga.toLocaleString('id-ID'); + + var newRow = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + $tbody.append(newRow); + + // Trigger input event to update totals if necessary + $tbody.find('.kandungan_obat').trigger('input'); + + $('#notif').html("
            "+ + "Item obat racikan berhasil ditambahkan!"+ + ""+ + "
            ").show(); + }); + } + } + }); + } else { + bootbox.prompt({ + title: "Masukkan Jumlah " + nama_brng, + inputType: 'number', + callback: function (jml) { + if(jml != null && jml != ""){ + bootbox.prompt({ + title: "Masukkan Aturan Pakai", + callback: function (aturan_pakai) { + if(aturan_pakai != null){ + var baseURL = mlite.url + '/' + mlite.admin; + var url = baseURL + '/apotek_ralan/tambahitemresep?t=' + mlite.token; + + $.post(url, { + no_resep: currentNoResep, + no_rawat: currentNoRawat, + tgl_peresepan: currentTglPeresepan, + jam_peresepan: currentJamPeresepan, + kode_brng: kode_brng, + jml: jml, + aturan_pakai: aturan_pakai, + tipe: 'nonracikan', + embalase: embalase_item, + tuslah: tuslah_item + }, function(data) { + console.log(data); + // hapus modal sebelumnya jika ada + $('#modal_gudangbarang').remove(); + $('.modal-backdrop').remove(); + $('body').removeClass('modal-open'); + + var result = (typeof data === 'string') ? JSON.parse(data) : data; + + // Cari tbody target berdasarkan tombol tambah yang diklik + var $btn = $('button[data-no_resep="' + currentNoResep + '"][data-tipe="nonracikan"]'); + var $tbody = $btn.closest('tbody.resep-group'); + + // Buat baris baru + var totalHarga = parseFloat(result.total_harga !== undefined ? result.total_harga : result.ralan); + var formattedRalan = isNaN(totalHarga) ? '0' : totalHarga.toLocaleString('id-ID'); + + var newRow = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + $tbody.append(newRow); + + // Tampilkan notifikasi + $('#notif').html("
            "+ + "Item obat berhasil ditambahkan!"+ + ""+ + "
            ").show(); + }); + } + } + }); + } + } + }); + } +}); + +// Update jumlah obat racikan saat jumlah racik atau kandungan berubah +$(document).on('input', '.jumlah_obat, .kandungan_obat, .embalase, .tuslah', function() { + var $tbody = $(this).closest('tbody.resep-group'); + + // Cek apakah ini baris racikan dengan mengecek keberadaan input kandungan + if($tbody.find('.kandungan_obat').length > 0) { + // Ambil jumlah racikan. Kita gunakan .first() karena .jumlah_obat ada di header racikan + var jmlRacik = parseFloat($tbody.find('.jumlah_obat').val()) || 0; + + $tbody.find('tr.item-row').each(function() { + var $row = $(this); + var kandungan = parseFloat($row.find('.kandungan_obat').val()) || 0; + var kapasitas = parseFloat($row.attr('data-kapasitas')) || 0; + var ralan = parseFloat($row.attr('data-ralan')) || 0; + + var jmlBaru = 0; + // Pastikan kapasitas valid untuk menghindari pembagian dengan nol + // Dan pastikan input valid (jmlRacik > 0 dan kandungan > 0) + if (kapasitas > 0 && jmlRacik > 0 && kandungan > 0) { + // Rumus: (jml_dr * kandungan) / kapasitas + jmlBaru = (jmlRacik * kandungan) / kapasitas; + // Pembulatan 1 desimal + jmlBaru = Math.round(jmlBaru * 10) / 10; + } + + // Tampilkan jumlah baru + $row.find('.jml_obat_display').text(jmlBaru); + + // Update atribut data-jml untuk keperluan validasi/pengiriman data + $row.attr('data-jml', jmlBaru); + + // Update total harga per obat + var embalase = parseFloat($row.find('.embalase').val()) || 0; + var tuslah = parseFloat($row.find('.tuslah').val()) || 0; + var totalHarga = (jmlBaru * ralan) + embalase + tuslah; + var formattedHarga = totalHarga.toLocaleString('id-ID', {minimumFractionDigits: 2, maximumFractionDigits: 2}); + $row.find('.total_harga_display').text(formattedHarga); + }); + + // Hitung total biaya obat racikan + var totalBiayaRacikan = 0; + $tbody.find('tr.item-row').each(function() { + var ralan = parseFloat($(this).attr('data-ralan')) || 0; + var jml = parseFloat($(this).attr('data-jml')) || 0; + var embalase = parseFloat($(this).find('.embalase').val()) || 0; + var tuslah = parseFloat($(this).find('.tuslah').val()) || 0; + totalBiayaRacikan += (ralan * jml) + embalase + tuslah; + }); + + var formattedTotalBiaya = totalBiayaRacikan.toLocaleString('id-ID', {minimumFractionDigits: 2, maximumFractionDigits: 2}); + $tbody.closest('table').find('.total_biaya_racikan_display').text(formattedTotalBiaya); + } +}); diff --git a/plugins/apotek_ralan/view/admin/cetak.eresep.html b/plugins/apotek_ralan/view/admin/cetak.eresep.html index 9136f354a..60ef218ec 100644 --- a/plugins/apotek_ralan/view/admin/cetak.eresep.html +++ b/plugins/apotek_ralan/view/admin/cetak.eresep.html @@ -2,12 +2,12 @@
            -
              - {loop: $display} -
            • - Nama: {$value.nm_pasien}, No. RM: {$value.no_rkm_medis} Status: {$value.status}
              - [ Operator : {$value.namadok} ] [ Rujukan Dari : - {if: $value.kd_poli == 'IGDK'}{$value.kamar.namabangsal} - {elseif: $value.kd_poli == 'U0027'}{$value.kamar.namabangsal} - {else} {$value.namapoli}{/if} ]
              -
            • - {/loop} -
            +
              {$value.nm_dokter}{$value.no_resep}{$value.tgl_peresepan} {$value.jam_peresepan}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.no_resep)?}{?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - +
              {$data.nama_brng}{$data.jml}{$data.aturan_pakai}{?=isset_or($data.nama_brng)?}{?=isset_or($data.jml)?}{?=isset_or($data.aturan_pakai)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?}
              {$value.nm_dokter}{$value.no_resep}{$value.tgl_peresepan} {$value.jam_peresepan}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.no_resep)?}{?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - +
              Keterangan
              {$value.nama_racik}{$value.jml_dr}{$value.aturan_pakai}{$value.keterangan}{?=isset_or($value.nama_racik)?}{?=isset_or($value.jml_dr)?}{?=isset_or($value.aturan_pakai)?}{?=isset_or($value.keterangan)?}
              Nama Obat
              {$data.nama_brng}{$data.kandungan}{$data.jml}{?=isset_or($data.nama_brng)?}{?=isset_or($data.kandungan)?}{?=isset_or($data.jml)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?}
              " + item.kode_brng + "" + item.nama_brng + "" + item.stok + "" + item.ralan + "
              Tidak ada data ditemukan
              ' + result.nama_brng + '' + result.jml + 'Rp. ' + formattedRalan + '
              ' + result.nama_brng + '' + result.aturan_pakai + ' Rp. ' + formattedRalan + '
              - + - {$settings.nama_instansi}
              - {$settings.alamat} - {$settings.nomor_telepon} - {$settings.email}
              - {$settings.kota} - {$settings.propinsi} + {?=isset_or($settings.nama_instansi)?}
              + {?=isset_or($settings.alamat)?} - {?=isset_or($settings.nomor_telepon)?} - {?=isset_or($settings.email)?}
              + {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
              @@ -17,17 +17,17 @@

              Salinan e-Resep

              -
              {$settings.kota}, {$tanggal}
              +
              {?=isset_or($settings.kota)?}, {?=isset_or($tanggal)?}


              - Nama : {$pasien}
              - Umur : {$umur}
              - Alamat : {$alamat}
              + Nama : {?=isset_or($pasien)?}
              + Umur : {?=isset_or($umur)?}
              + Alamat : {?=isset_or($alamat)?}

              {loop: $detail}

              R/

              - {$value.nama_brng} - {$value.jml}
              - {$value.aturan_pakai}
              + {?=isset_or($value.nama_brng)?} - {?=isset_or($value.jml)?}
              + {?=isset_or($value.aturan_pakai)?}
              {/loop}


              diff --git a/plugins/apotek_ralan/view/admin/cetak.etiket.html b/plugins/apotek_ralan/view/admin/cetak.etiket.html index 967f9ff7d..12f0180bc 100644 --- a/plugins/apotek_ralan/view/admin/cetak.etiket.html +++ b/plugins/apotek_ralan/view/admin/cetak.etiket.html @@ -1,15 +1,15 @@
              {loop: $detail}
              - {$settings.nama_instansi}
              - {$settings.alamat}
              {$settings.kota} - {$settings.nomor_telepon}
              - {$farmasi.keterangan_etiket} + {?=isset_or($settings.nama_instansi)?}
              + {?=isset_or($settings.alamat)?}
              {?=isset_or($settings.kota)?} - {?=isset_or($settings.nomor_telepon)?}
              + {if: isset($farmasi.keterangan_etiket)}{?=isset_or($farmasi.keterangan_etiket)?}{/if}

              -
              {$tanggal}
              - a/n : {$pasien} - {$no_rm}

              +
              {?=isset_or($tanggal)?}
              + a/n : {?=isset_or($pasien)?} - {?=isset_or($no_rm)?}

              - {$value.aturan_pakai}
              + {?= isset($value.aturan_pakai) ? $value.aturan_pakai : '' ?}
              Pagi / Siang / Sore / Malam
              Sebelum Makan / Sesudah Makan / Habiskan
              diff --git a/plugins/apotek_ralan/view/admin/cetak.telaah_resep.html b/plugins/apotek_ralan/view/admin/cetak.telaah_resep.html new file mode 100644 index 000000000..d1f6a12c2 --- /dev/null +++ b/plugins/apotek_ralan/view/admin/cetak.telaah_resep.html @@ -0,0 +1,196 @@ +
              + + + + + +
              + + +
              {?=isset_or($settings.nama_instansi)?}
              +
              {?=isset_or($settings.alamat)?}
              +
              Telp. {?=isset_or($settings.nomor_telepon)?} | Email: {?=isset_or($settings.email)?}
              +
              {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
              +
              LEMBAR TELAAH RESEP
              +
              + +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              No. RM:{?=isset_or($header.no_rkm_medis)?}Pemberi Resep:{?=isset_or($header.nm_dokter)?}
              No. Rawat:{?=isset_or($header.no_rawat)?}{?=isset_or($header.unit_layanan_label)?}:{?=isset_or($header.unit_layanan)?}
              Nama Pasien:{?=isset_or($header.nm_pasien)?} ({?=isset_or($header.umur_lengkap)?})No. Resep:{?=isset_or($header.no_resep)?} ({?=isset_or($header.tanggal_peresepan_display)?})
              Alamat:{?=isset_or($header.alamat)?}Cara Bayar:{?=isset_or($header.cara_bayar)?}
              + +
              + + + + + + + + + + + {loop: $detail} + + + + + + {/loop} + + + + + +
              NAMA OBATKETERANGANCARA PAKAI
              {?=isset_or($value.nama_obat)?}{?=isset_or($value.keterangan)?}{?=isset_or($value.cara_pakai)?}
              Jumlah Total Biaya ResepRp {?=isset_or($header.total_biaya_resep)?}
              + +
              + + + + + + + + +
              + + + + + + + + + + + + + + + + + + + + + + + + +
              TELAAH RESEP
              Kelangkapan Administratif ResepYaTidak
              Nama pasien{?=isset_or($checklist.nama_pasien_yes)?}{?=isset_or($checklist.nama_pasien_no)?}
              Umur pasien{?=isset_or($checklist.umur_pasien_yes)?}{?=isset_or($checklist.umur_pasien_no)?}
              Alamat pasien{?=isset_or($checklist.alamat_pasien_yes)?}{?=isset_or($checklist.alamat_pasien_no)?}
              Berat badan{?=isset_or($checklist.berat_badan_yes)?}{?=isset_or($checklist.berat_badan_no)?}
              Nama dokter{?=isset_or($checklist.nama_dokter_yes)?}{?=isset_or($checklist.nama_dokter_no)?}
              Paraf dokter{?=isset_or($checklist.paraf_dokter_yes)?}{?=isset_or($checklist.paraf_dokter_no)?}
              Tanggal penulisan resep{?=isset_or($checklist.tanggal_resep_yes)?}{?=isset_or($checklist.tanggal_resep_no)?}
              Nama dan jumlah obat{?=isset_or($checklist.nama_obat_yes)?}{?=isset_or($checklist.nama_obat_no)?}
              Signatura/aturan pakai obat{?=isset_or($checklist.aturan_pakai_yes)?}{?=isset_or($checklist.aturan_pakai_no)?}
              Ruangan / poliklinik{?=isset_or($checklist.unit_yes)?}{?=isset_or($checklist.unit_no)?}
              Tulisan jelas terbaca{?=isset_or($checklist.tulisan_yes)?}{?=isset_or($checklist.tulisan_no)?}
              +
              + + + + + + + + + + + + + + + + + + + + +
              TELAAH RESEP
              KelengkapanYaTidak
              Syarat Farmasetika
              Tepat rute
              Tepat dosis
              Syarat Farmasi Klinis
              Interaksi obat
              Duplikasi
              +
              + + + + + + + + + + + + + + + + + + + +
              TELAAH OBAT
              Telaah 5 benarYaTidak
              Benar pasien
              Benar obat
              Benar dosis
              Benar rute / cara
              Benar waktu
              +
              + + + + + + + + + + + + + + + + + + + +
              VERIFIKASI RESEP
              Verifikasi 5 benarYaTidak
              Benar pasien
              Benar obat
              Benar dosis
              Benar rute / cara
              Benar waktu
              +
              + + + + + + + + + + + + + + + + +
              PetugasTenaga Teknis Kefarmasian/AsistenVerifikator 1Verifikator 2Tanda Tangan Penerima Obat
              +
              diff --git a/plugins/apotek_ralan/view/admin/display.html b/plugins/apotek_ralan/view/admin/display.html index 6e8d267a6..54f2f504e 100644 --- a/plugins/apotek_ralan/view/admin/display.html +++ b/plugins/apotek_ralan/view/admin/display.html @@ -19,19 +19,19 @@ {loop: $rawat_jalan.list} - - {$value.no_rkm_medis} - {$value.nm_pasien} - {$value.no_rawat} - {$value.no_reg} - {$value.nm_poli} - {$value.nm_dokter} - {$value.png_jawab} - {$value.no_peserta} - {$value.tgl_registrasi} {$value.jam_reg} - {$value.stts} - {$value.status_lanjut} - {$value.status_bayar} + + {?=isset_or($value.no_rkm_medis)?} + {?=isset_or($value.nm_pasien)?} + {?=isset_or($value.no_rawat)?} + {?=isset_or($value.no_reg)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.png_jawab)?} + {?=isset_or($value.no_peserta)?} + {?=isset_or($value.tgl_registrasi)?} {?=isset_or($value.jam_reg)?} + {?=isset_or($value.stts)?} + {?=isset_or($value.status_lanjut)?} + {?=isset_or($value.status_bayar)?} {/loop} diff --git a/plugins/apotek_ralan/view/admin/form.rincian.html b/plugins/apotek_ralan/view/admin/form.rincian.html index 61c666bb8..588509921 100644 --- a/plugins/apotek_ralan/view/admin/form.rincian.html +++ b/plugins/apotek_ralan/view/admin/form.rincian.html @@ -93,19 +93,31 @@
              -
              - -
              - -
                +
                +
                + +
                + +
                + +
                + +
                - -
                - +
                + +
                + +
                  +
                  + +
                  + +
                  - +
                  @@ -247,7 +259,7 @@ load: function (search, callback) { if (search.length < this.minSearchLength) return callback(); $.ajax({ - url: '{?=url()?}/{?=ADMIN?}/apotek_ralan/ajax?show=databarang&nama_brng=' + encodeURIComponent(search) + '&t={?=$_SESSION['token']?}', + url: '{?=url()?}/{?=ADMIN?}/apotek_ralan/ajax?show=databarang&nama_brng=' + encodeURIComponent(search) + '&t={?=$_SESSION["token"]?}', type: 'GET', dataType: 'json', success: function(data) { diff --git a/plugins/apotek_ralan/view/admin/nota_parsial.besar.html b/plugins/apotek_ralan/view/admin/nota_parsial.besar.html new file mode 100644 index 000000000..9c5c8014d --- /dev/null +++ b/plugins/apotek_ralan/view/admin/nota_parsial.besar.html @@ -0,0 +1,114 @@ + + + + + Nota Pembayaran Parsial Obat + + + + + + +
                  +
                  +
                  +

                  {?=isset_or($settings.nama_instansi)?}

                  +
                  {?=isset_or($settings.alamat)?}
                  +
                  +

                  NOTA PEMBAYARAN PARSIAL OBAT

                  +
                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  ID Pembayaran{?=isset_or($pembayaran.id)?}No Rawat{?=isset_or($pembayaran.no_rawat)?}
                  Tanggal/Jam{?=isset_or($pembayaran.tgl_bayar)?} {?=isset_or($pembayaran.jam_bayar)?}Metode{?=isset_or($pembayaran.metode)?}
                  Nama Pasien{?=isset_or($pasien.nm_pasien)?}No RM{?=isset_or($pasien.no_rkm_medis)?}
                  Alamat{?=isset_or($pasien.alamat)?}
                  + + + + + + + + + + {loop: $detail} + + + + + {/loop} + + + + + + + +
                  ItemJumlah
                  {?=isset_or($value.nm_perawatan)?}Rp. {?= number_format(isset_or($value.jumlah_alokasi,0),2,',','.')?}
                  TotalRp. {?= number_format(isset_or($total_detail,0),2,',','.')?}
                  + +
                  +
                  + Terbilang: # {?=terbilang(isset_or($total_detail,0),3,"")?} Rupiah # +
                  +
                  + +
                  +
                  +
                  {?=isset_or($settings.kota)?}, {?=date('d-m-Y')?}
                  +
                  Kasir
                  +


                  +
                  {?=isset_or($nama_kasir)?}
                  +
                  +
                  +
                  + + + + + diff --git a/plugins/apotek_ralan/view/admin/nota_parsial.kecil.html b/plugins/apotek_ralan/view/admin/nota_parsial.kecil.html new file mode 100644 index 000000000..c1d003d4e --- /dev/null +++ b/plugins/apotek_ralan/view/admin/nota_parsial.kecil.html @@ -0,0 +1,97 @@ + + + + + Nota Pembayaran Parsial Obat + + + + + + +
                  +
                  + + + + + + + + + + + + + + + + + + + +
                  {?=isset_or($settings.nama_instansi)?}

                  {?=isset_or($settings.alamat)?}

                  + NOTA PEMBAYARAN PARSIAL OBAT
                  + ID Pembayaran : {?=isset_or($pembayaran.id)?}
                  + No Rawat : {?=isset_or($pembayaran.no_rawat)?}
                  + Tanggal : {?=isset_or($pembayaran.tgl_bayar)?} {?=isset_or($pembayaran.jam_bayar)?}
                  + Metode : {?=isset_or($pembayaran.metode)?}
                  + Nama Pasien : {?=isset_or($pasien.nm_pasien)?}
                  + No RM : {?=isset_or($pasien.no_rkm_medis)?}
                  + Alamat : {?=isset_or($pasien.alamat)?}
                  +
                  + + {loop: $detail} + + + + + {/loop} + + + + +
                  {?=isset_or($value.nm_perawatan)?}Rp. {?= number_format(isset_or($value.jumlah_alokasi,0),2,',','.')?}
                  TotalRp. {?= number_format(isset_or($total_detail,0),2,',','.')?}
                  +
                  Terbilang : # {?=terbilang(isset_or($total_detail,0),3,"")?} Rupiah #
                  +

                  {?=isset_or($settings.kota)?}, {?=date('d-m-Y')?}
                  + Kasir


                  + {?=isset_or($nama_kasir)?}
                  +

                  +
                  +
                  +
                  + + Versi Besar + + + diff --git a/plugins/apotek_ralan/view/admin/obat.html b/plugins/apotek_ralan/view/admin/obat.html index 16b2f4f56..3c3a1f8ab 100644 --- a/plugins/apotek_ralan/view/admin/obat.html +++ b/plugins/apotek_ralan/view/admin/obat.html @@ -12,9 +12,9 @@ {if: $obat} {loop: $obat} - - {$value.kode_brng} - {$value.nama_brng} + + {?=isset_or($value.kode_brng)?} + {?=isset_or($value.nama_brng)?} Rp. {?= number_format($value.dasar,2,',','.')?} {/loop} diff --git a/plugins/apotek_ralan/view/admin/racikan.html b/plugins/apotek_ralan/view/admin/racikan.html index d6f4937cb..02a13f74f 100644 --- a/plugins/apotek_ralan/view/admin/racikan.html +++ b/plugins/apotek_ralan/view/admin/racikan.html @@ -11,9 +11,9 @@ {if: $racikan} {loop: $racikan} - - {$value.kd_racik} - {$value.nm_racik} + + {?=isset_or($value.kd_racik)?} + {?=isset_or($value.nm_racik)?} {/loop} {else} diff --git a/plugins/apotek_ralan/view/admin/rincian.html b/plugins/apotek_ralan/view/admin/rincian.html index 2b78786af..5b8bad251 100644 --- a/plugins/apotek_ralan/view/admin/rincian.html +++ b/plugins/apotek_ralan/view/admin/rincian.html @@ -14,12 +14,12 @@
                  Non Racikan
                  {loop: $detail_pemberian_obat} - {$value.nama_brng} - {$value.jml} - {$value.aturan_pakai} + {?=isset_or($value.nama_brng)?} + {?=isset_or($value.jml)?} + {?=isset_or($value.aturan_pakai)?} Rp. {?= number_format(($value.ralan * $value.jml),2,',','.')?} - + {/loop} @@ -48,19 +48,20 @@
                  Racikan
                  {loop: $detail_pemberian_obat_racikan} - {$value.nama_racik} - {$value.jml_dr} - {$value.aturan_pakai} + {?=isset_or($value.nama_racik)?} + {?=isset_or($value.jml_dr)?} + {?=isset_or($value.aturan_pakai)?} - + {loop: $value.detail_pemberian_obat as $data} - {$data.nama_brng} - {$data.jml} - Rp. {?= number_format(($data.biaya_obat),2,',','.')?} + - {?=isset_or($data.nama_brng)?} + {?=isset_or($data.jml)?} + + Rp. {?= number_format(($data.total),2,',','.')?} {/loop} @@ -76,7 +77,79 @@
                  Racikan

                  +{if: $billing_parsial_enabled == 'true'} +

                  Pembayaran Parsial Obat

                  +
                  +
                  + + + + + + + + + + + + + + + +
                  Total Tagihan ObatRp. {?= number_format(isset_or($parsial_total_obat,0),2,',','.')?}
                  Sudah DibayarRp. {?= number_format(isset_or($parsial_paid_obat,0),2,',','.')?}
                  SisaRp. {?= number_format(isset_or($parsial_remaining_obat,0),2,',','.')?}
                  +
                  +
                  +
                  + + + + +
                  +
                  +
                  + +
                  Riwayat Pembayaran Parsial Obat
                  +
                  + + + + + + + + + + + + + {loop: $parsial_history_obat} + + + + + + + + + {/loop} + {if: empty($parsial_history_obat)} + + {/if} + +
                  NoTanggalJamMetodeJumlahAksi
                  {?=$counter?}.{?=isset_or($value.tgl_bayar)?}{?=isset_or($value.jam_bayar)?}{?=isset_or($value.metode)?}Rp. {?= number_format(isset_or($value.jumlah_obat,0),2,',','.')?} + +
                  Belum ada pembayaran parsial obat.
                  +

                  +{/if}

                  e-Resep

                  Non Racikan
                  @@ -86,41 +159,70 @@
                  Non Racikan
                  Nama Dokter Nomor Resep Tanggal Peresepan - Aksi + Aksi - + {if: isset($resep)} {loop: $resep} + - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam} - - - - + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} + + + + + + + {if: $value.tgl_perawatan != '0000-00-00'} + + {/if} Nama Obat Jumlah Aturan Pakai + Embalase + Tuslah Harga {loop: $value.resep_dokter as $data} - - {$data.nama_brng} - {$data.jml} - {$data.aturan_pakai} + + {?=isset_or($data.nama_brng)?} + + + + + + + + Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} {/loop} + {/loop} - + {/if} Total Biaya Obat - Rp. {?= number_format($jumlah_total_resep,2,',','.')?} + Rp. {?= number_format($jumlah_total_resep,2,',','.')?} @@ -133,57 +235,134 @@
                  Racikan
                  Nama Dokter Nomor Resep Tanggal Peresepan - Aksi + Aksi - - {loop: $resep_racikan} + {loop: $resep_racikan} + - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} - - - - + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} + + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_delete', 'apotek_ralan') == true}{/if} + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_update', 'apotek_ralan') == true}{/if} + + + + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_create', 'apotek_ralan') == true} + {if: $value.tgl_perawatan != '0000-00-00'} + + {/if} + {/if} Nama Racikan Jml. Racik Aturan Pakai - Keterangan + Keterangan - {$value.nama_racik} - {$value.jml_dr} - {$value.aturan_pakai} - {$value.keterangan} + {?=isset_or($value.nama_racik)?} + + + + + + + {?=isset_or($value.keterangan)?} Nama Obat Kandungan Jumlah + Embalase + Tuslah Harga {loop: $value.resep_dokter_racikan_detail as $data} - - {$data.nama_brng} - {$data.kandungan} - {$data.jml} - Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} + + {?=isset_or($data.nama_brng)?} + + {?=isset_or($data.jml)?} + + + Rp. {?= number_format($data.ralan,2,',','.')?} {/loop} - {/loop} + {/loop} Total Biaya Obat Racikan - Rp. {?= number_format($jumlah_total_resep_racikan,2,',','.')?} + Rp. {?= number_format($jumlah_total_resep_racikan,2,',','.')?}
                  +
                  diff --git a/plugins/dokter_igd/view/admin/medis.igd.html b/plugins/dokter_igd/view/admin/medis.igd.html new file mode 100644 index 000000000..81f971f5b --- /dev/null +++ b/plugins/dokter_igd/view/admin/medis.igd.html @@ -0,0 +1,586 @@ + + + + + diff --git a/plugins/dokter_igd/view/admin/medis.igd.tampil.html b/plugins/dokter_igd/view/admin/medis.igd.tampil.html new file mode 100644 index 000000000..1881c3325 --- /dev/null +++ b/plugins/dokter_igd/view/admin/medis.igd.tampil.html @@ -0,0 +1,214 @@ + + + + + \ No newline at end of file diff --git a/plugins/dokter_igd/view/admin/obat.html b/plugins/dokter_igd/view/admin/obat.html index f673736ef..decd40d5a 100644 --- a/plugins/dokter_igd/view/admin/obat.html +++ b/plugins/dokter_igd/view/admin/obat.html @@ -14,11 +14,11 @@ {if: $obat} {loop: $obat} - - {$value.kode_brng} - {$value.nama_brng} - {$value.stok} - {$value.stokminimal} + + {?=isset_or($value.kode_brng)?} + {?=isset_or($value.nama_brng)?} + {?=isset_or($value.stok)?} + {?=isset_or($value.stokminimal)?} Rp. {?= number_format($value.dasar,2,',','.')?} {/loop} diff --git a/plugins/dokter_igd/view/admin/obat.racikan.html b/plugins/dokter_igd/view/admin/obat.racikan.html index d441ae851..7f19b34a9 100644 --- a/plugins/dokter_igd/view/admin/obat.racikan.html +++ b/plugins/dokter_igd/view/admin/obat.racikan.html @@ -13,10 +13,10 @@ {if: $obat} {loop: $obat} - - {$value.kode_brng} - {$value.nama_brng} - {$value.stok} + + {?=isset_or($value.kode_brng)?} + {?=isset_or($value.nama_brng)?} + {?=isset_or($value.stok)?} Rp. {?= number_format($value.dasar,2,',','.')?} {/loop} diff --git a/plugins/dokter_igd/view/admin/pasien.html b/plugins/dokter_igd/view/admin/pasien.html index 3a073084c..fd0751839 100644 --- a/plugins/dokter_igd/view/admin/pasien.html +++ b/plugins/dokter_igd/view/admin/pasien.html @@ -12,15 +12,15 @@ {if: $pasien} {loop: $pasien} - {$value.no_rkm_medis} - {$value.nm_pasien} + data-no_rkm_medis="{?=isset_or($value.no_rkm_medis)?}" + data-nm_pasien="{?=isset_or($value.nm_pasien)?}" + data-tgl_lahir="{?=isset_or($value.tgl_lahir)?}" + data-jk="{if: $value.jk == 'L'}Laki-Laki{else}Perempuan{/if}" + data-alamat="{?=isset_or($value.alamat)?}" + data-no_tlp="{?=isset_or($value.no_tlp)?}" + data-pekerjaan="{?=isset_or($value.pekerjaan)?}"> + {?=isset_or($value.no_rkm_medis)?} + {?=isset_or($value.nm_pasien)?} {/loop} {else} diff --git a/plugins/dokter_igd/view/admin/racikan.html b/plugins/dokter_igd/view/admin/racikan.html index d6f4937cb..02a13f74f 100644 --- a/plugins/dokter_igd/view/admin/racikan.html +++ b/plugins/dokter_igd/view/admin/racikan.html @@ -11,9 +11,9 @@ {if: $racikan} {loop: $racikan} - - {$value.kd_racik} - {$value.nm_racik} + + {?=isset_or($value.kd_racik)?} + {?=isset_or($value.nm_racik)?} {/loop} {else} diff --git a/plugins/dokter_igd/view/admin/radiologi.html b/plugins/dokter_igd/view/admin/radiologi.html index eb16ec6a5..3ccb80a6d 100644 --- a/plugins/dokter_igd/view/admin/radiologi.html +++ b/plugins/dokter_igd/view/admin/radiologi.html @@ -12,9 +12,9 @@ {if: $radiologi} {loop: $radiologi} - - {$value.kd_jenis_prw} - {$value.nm_perawatan} + + {?=isset_or($value.kd_jenis_prw)?} + {?=isset_or($value.nm_perawatan)?} Rp. {?= number_format($value.total_byr,2,',','.')?} {/loop} diff --git a/plugins/dokter_igd/view/admin/resume.html b/plugins/dokter_igd/view/admin/resume.html new file mode 100644 index 000000000..f795c4f12 --- /dev/null +++ b/plugins/dokter_igd/view/admin/resume.html @@ -0,0 +1,135 @@ + + + + + + diff --git a/plugins/dokter_igd/view/admin/resume.tampil.html b/plugins/dokter_igd/view/admin/resume.tampil.html new file mode 100644 index 000000000..69457408a --- /dev/null +++ b/plugins/dokter_igd/view/admin/resume.tampil.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + {if: $resume_pasien} + + + + + + + + + {else} + + + + {/if} + +
                  Nomor RawatKeluhanDiagnosaProsedurPulangDokter
                  {?=isset_or($resume_pasien.no_rawat)?}{?=isset_or($resume_pasien.keluhan_utama)?}{?=isset_or($resume_pasien.diagnosa_utama)?}{?=isset_or($resume_pasien.prosedur_utama)?}{?=isset_or($resume_pasien.kondisi_pulang)?}{?=isset_or($resume_pasien.nm_dokter)?}
                  Tidak ada data
                  diff --git a/plugins/dokter_igd/view/admin/rincian.eresep.html b/plugins/dokter_igd/view/admin/rincian.eresep.html index 93a64514b..d4e2f8836 100644 --- a/plugins/dokter_igd/view/admin/rincian.eresep.html +++ b/plugins/dokter_igd/view/admin/rincian.eresep.html @@ -13,11 +13,11 @@
                  Non Racikan
                  {loop: $resep} - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - + @@ -29,11 +29,11 @@
                  Non Racikan
                  {loop: $value.resep_dokter as $data} - {$data.nama_brng} - {$data.jml} - {$data.aturan_pakai} + {?=isset_or($data.nama_brng)?} + {?=isset_or($data.jml)?} + {?=isset_or($data.aturan_pakai)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} - + {/loop} {/loop} @@ -61,11 +61,11 @@
                  Racikan
                  {loop: $resep_racikan} - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - + @@ -75,10 +75,10 @@
                  Racikan
                  Keterangan - {$value.nama_racik} - {$value.jml_dr} - {$value.aturan_pakai} - {$value.keterangan} + {if: isset($value.nama_racik)}{?=isset_or($value.nama_racik)?}{else}-{/if} + {if: isset($value.jml_dr)}{?=isset_or($value.jml_dr)?}{else}-{/if} + {if: isset($value.aturan_pakai)}{?=isset_or($value.aturan_pakai)?}{else}-{/if} + {if: isset($value.keterangan)}{?=isset_or($value.keterangan)?}{else}-{/if} Nama Obat @@ -88,9 +88,9 @@
                  Racikan
                  {loop: $value.resep_dokter_racikan_detail as $data} - {$data.nama_brng} - {$data.kandungan} - {$data.jml} + {?=isset_or($data.nama_brng)?} + {?=isset_or($data.kandungan)?} + {?=isset_or($data.jml)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} {/loop} diff --git a/plugins/dokter_igd/view/admin/rincian.html b/plugins/dokter_igd/view/admin/rincian.html index 63fd01b72..cc06b8665 100644 --- a/plugins/dokter_igd/view/admin/rincian.html +++ b/plugins/dokter_igd/view/admin/rincian.html @@ -20,14 +20,15 @@
                  Non Racikan
                  Aksi + {if: isset($resep)} {loop: $resep} - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - + @@ -39,15 +40,16 @@
                  Non Racikan
                  {loop: $value.resep_dokter as $data} - {$data.nama_brng} - {$data.jml} - {$data.aturan_pakai} + {?=isset_or($data.nama_brng)?} + {?=isset_or($data.jml)?} + {?=isset_or($data.aturan_pakai)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} - + {/loop} {/loop} + {/if} Total Biaya Obat @@ -71,11 +73,11 @@
                  Racikan
                  {loop: $resep_racikan} - {$value.nm_dokter} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?} - + @@ -85,10 +87,10 @@
                  Racikan
                  Keterangan - {$value.nama_racik} - {$value.jml_dr} - {$value.aturan_pakai} - {$value.keterangan} + {if: isset($value.nama_racik)}{?=isset_or($value.nama_racik)?}{else}-{/if} + {if: isset($value.jml_dr)}{?=isset_or($value.jml_dr)?}{else}-{/if} + {if: isset($value.aturan_pakai)}{?=isset_or($value.aturan_pakai)?}{else}-{/if} + {if: isset($value.keterangan)}{?=isset_or($value.keterangan)?}{else}-{/if} Nama Obat @@ -98,9 +100,9 @@
                  Racikan
                  {loop: $value.resep_dokter_racikan_detail as $data} - {$data.nama_brng} - {$data.kandungan} - {$data.jml} + {?=isset_or($data.nama_brng)?} + {?=isset_or($data.kandungan)?} + {?=isset_or($data.jml)?} Rp. {?= number_format(($data.ralan * $data.jml),2,',','.')?} {/loop} @@ -131,29 +133,29 @@

                  Rincian Tindakan

                  {loop: $rawat_jl_dr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Dokter Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} {loop: $rawat_jl_pr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Perawat Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} {loop: $rawat_jl_drpr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Dokter & Perawat Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} @@ -183,17 +185,31 @@

                  Data e-Resep

                  {loop: $data_resep} - {$value.no_resep} - {$value.tgl_peresepan} {$value.jam_peresepan} + {?=isset_or($value.no_resep)?} + {?=isset_or($value.tgl_peresepan)?} {?=isset_or($value.jam_peresepan)?}
                    {loop: $value.resep_dokter as $data} -
                  • {$data.nama_brng} - {$data.jml} - {$data.aturan_pakai}
                  • +
                  • {?=isset_or($data.nama_brng)?} - {?=isset_or($data.jml)?} - {?=isset_or($data.aturan_pakai)?}
                  • {/loop}
                  + {if: !empty($value.resep_racikan)} +
                  +
                    + {loop: $value.resep_racikan as $racikan} +
                  • {?=isset_or($racikan.nama_racik)?} ({?=isset_or($racikan.jml_dr)?}) - {?=isset_or($racikan.aturan_pakai)?} +
                      + {loop: $racikan.detail as $detail} +
                    • - {?=isset_or($detail.nama_brng)?} ({?=isset_or($detail.jml)?})
                    • + {/loop} +
                    +
                  • + {/loop} +
                  + {/if} - + {/loop} @@ -203,39 +219,6 @@

                  Data e-Resep

                  Permintaan Laboratorium

                  -
                  @@ -249,11 +232,11 @@

                  Permintaan Laboratorium

                  {loop: $laboratorium} - - - + + + @@ -263,10 +246,10 @@

                  Permintaan Laboratorium

                  {loop: $value.permintaan_pemeriksaan_lab as $data} - - + + @@ -284,13 +267,13 @@

                  Permintaan Laboratorium

                  {loop: $data.permintaan_detail_permintaan_lab as $data2} - - - - - - - + + + + + + + {/loop}
                  {$value.nm_dokter}{$value.noorder}{$value.tgl_permintaan} {$value.jam_permintaan}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.noorder)?}{?=isset_or($value.tgl_permintaan)?} {?=isset_or($value.jam_permintaan)?} - +
                  {$data.nm_perawatan}{$data.stts_bayar}{?=isset_or($data.nm_perawatan)?}{?=isset_or($data.stts_bayar)?} - +
                  - {$data2.template_laboratorium.Pemeriksaan}{$data2.template_laboratorium.satuan}{$data2.template_laboratorium.nilai_rujukan_la}{$data2.template_laboratorium.nilai_rujukan_pa}{$data2.template_laboratorium.nilai_rujukan_ld}{$data2.template_laboratorium.nilai_rujukan_pd}- {?=isset_or($data2.template_laboratorium.Pemeriksaan)?}{?=isset_or($data2.template_laboratorium.satuan)?}{?=isset_or($data2.template_laboratorium.nilai_rujukan_la)?}{?=isset_or($data2.template_laboratorium.nilai_rujukan_pa)?}{?=isset_or($data2.template_laboratorium.nilai_rujukan_ld)?}{?=isset_or($data2.template_laboratorium.nilai_rujukan_pd)?}
                  @@ -318,11 +301,11 @@

                  Permintaan Radiologi

                  {loop: $radiologi} - {$value.tgl_permintaan} {$value.jam_permintaan} - {$value.nm_perawatan} - {$value.kelas} + {?=isset_or($value.tgl_permintaan)?} {?=isset_or($value.jam_permintaan)?} + {?=isset_or($value.nm_perawatan)?} + {?=isset_or($value.kelas)?} Rp. {?= number_format($value.total_byr,2,',','.')?} - + {/loop} diff --git a/plugins/dokter_igd/view/admin/soap.html b/plugins/dokter_igd/view/admin/soap.html index b9619636b..1edd4947a 100644 --- a/plugins/dokter_igd/view/admin/soap.html +++ b/plugins/dokter_igd/view/admin/soap.html @@ -7,7 +7,7 @@
                  - {include: ../plugins/icd_10/view/admin/display.html} + {include: ../plugins/dokter_igd/view/admin/display.icd.html}

                  Rincian Riwayat

                  @@ -32,211 +32,211 @@

                  Rincian Riwayat

                  {if: $pemeriksaan} {loop: $pemeriksaan} - {$value.nomor} + {?=isset_or($value.nomor)?} Rawat Jalan
                  - {$value.tgl_perawatan} {$value.jam_rawat}
                  - {$value.departemen_petugas} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?}
                  + {?=isset_or($value.departemen_petugas)?} - {$value.suhu_tubuh} - {$value.tensi} - {$value.nadi} - {$value.respirasi} - {$value.tinggi} - {$value.berat} - {$value.gcs} - {$value.spo2} - {$value.alergi} + {?=isset_or($value.suhu_tubuh)?} + {?=isset_or($value.tensi)?} + {?=isset_or($value.nadi)?} + {?=isset_or($value.respirasi)?} + {?=isset_or($value.tinggi)?} + {?=isset_or($value.berat)?} + {?=isset_or($value.gcs)?} + {?=isset_or($value.spo2)?} + {?=isset_or($value.alergi)?} - Instruksi: {$value.instruksi}

                  - Evaluasi: {$value.evaluasi}

                  -
                  - {$value.nama_petugas} + Instruksi: {?=isset_or($value.instruksi)?}

                  + Evaluasi: {?=isset_or($value.evaluasi)?}

                  +
                  + {?=isset_or($value.nama_petugas)?} Kesadaran - {$value.kesadaran} + {?=isset_or($value.kesadaran)?} Lingkar Perut - {$value.lingkar_perut} + {?=isset_or($value.lingkar_perut)?} Subyektif - {$value.keluhan} + {?=isset_or($value.keluhan)?} Obyektif - {$value.pemeriksaan} + {?=isset_or($value.pemeriksaan)?} Assesment - {$value.penilaian} + {?=isset_or($value.penilaian)?}
                  Plan - {$value.rtl} + {?=isset_or($value.rtl)?} {/loop} {/if} {if: $pemeriksaan_ranap} {loop: $pemeriksaan_ranap as $data} - {$data.nomor} + {?=isset_or($data.nomor)?} Rawat Inap
                  - {$data.tgl_perawatan} {$data.jam_rawat}
                  - {$data.departemen_petugas} + {?=isset_or($data.tgl_perawatan)?} {?=isset_or($data.jam_rawat)?}
                  + {?=isset_or($data.departemen_petugas)?} - {$data.suhu_tubuh} - {$data.tensi} - {$data.nadi} - {$data.respirasi} - {$data.tinggi} - {$data.berat} - {$data.gcs} - {$data.spo2} - {$data.alergi} + {?=isset_or($data.suhu_tubuh)?} + {?=isset_or($data.tensi)?} + {?=isset_or($data.nadi)?} + {?=isset_or($data.respirasi)?} + {?=isset_or($data.tinggi)?} + {?=isset_or($data.berat)?} + {?=isset_or($data.gcs)?} + {?=isset_or($data.spo2)?} + {?=isset_or($data.alergi)?} - {$data.instruksi}

                  -
                  - {$data.nama_petugas} + {?=isset_or($data.instruksi)?}

                  +
                  + {?=isset_or($data.nama_petugas)?} Kesadaran - {$data.kesadaran} + {?=isset_or($data.kesadaran)?} Subyektif - {$data.keluhan} + {?=isset_or($data.keluhan)?} Obyektif - {$data.pemeriksaan} + {?=isset_or($data.pemeriksaan)?} Assesment - {$data.penilaian} + {?=isset_or($data.penilaian)?}
                  Plan - {$data.rtl} + {?=isset_or($data.rtl)?} {/loop} {/if} diff --git a/plugins/dokter_igd/view/admin/triase_igd.html b/plugins/dokter_igd/view/admin/triase_igd.html new file mode 100644 index 000000000..5ee8ad751 --- /dev/null +++ b/plugins/dokter_igd/view/admin/triase_igd.html @@ -0,0 +1,590 @@ +
                  +
                  +
                  +
                  + + + + +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + + + Kategori akan dihitung otomatis berdasarkan tanda vital dan GCS. + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + +
                  +
                  + + + {if: $triase_igd.id_triase != ''} + + {/if} +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + \ No newline at end of file diff --git a/plugins/dokter_igd/view/admin/triase_igd_view.html b/plugins/dokter_igd/view/admin/triase_igd_view.html new file mode 100644 index 000000000..30e2aa3b7 --- /dev/null +++ b/plugins/dokter_igd/view/admin/triase_igd_view.html @@ -0,0 +1,299 @@ + + +
                  +
                  + + + + + + + + + + + + + + + + + + + +
                  No. Rawat{?=isset_or($triase_igd.no_rawat)?}No. RM{?=isset_or($triase_igd.no_rkm_medis)?}
                  Nama Pasien{?=isset_or($triase_igd.nm_pasien)?}Tgl. Triase{?=isset_or($triase_igd.tgl_triase)?}
                  Petugas{?=isset_or($triase_igd.nama_petugas)?} ({?=isset_or($triase_igd.petugas_id)?})
                  + + +
                  +
                  +
                  Kondisi Umum
                  + + + + + + + + + + + + + + + + + +
                  Kesadaran{?=isset_or($triase_igd.kesadaran)?}
                  Airway{?=isset_or($triase_igd.airway)?}
                  Breathing{?=isset_or($triase_igd.breathing)?}
                  Circulation{?=isset_or($triase_igd.circulation)?}
                  +
                  + +
                  +
                  Tanda Vital
                  + + + + + + + + + + + + + + + + + + + + + +
                  Tekanan Darah{?=isset_or($triase_igd.tekanan_darah, '-')?} mmHg
                  Nadi{?=isset_or($triase_igd.nadi, '-')?} x/menit
                  Respirasi{?=isset_or($triase_igd.respirasi, '-')?} x/menit
                  Suhu{?=isset_or($triase_igd.suhu, '-')?} °C
                  SpO2{?=isset_or($triase_igd.spo2, '-')?} %
                  +
                  +
                  + + +
                  +
                  +
                  Glasgow Coma Scale (GCS)
                  + + + + + + + + + + + + + + + + + +
                  GCS Eye (E){?=isset_or($triase_igd.gcs_e, '-')?}
                  GCS Verbal (V){?=isset_or($triase_igd.gcs_v, '-')?}
                  GCS Motorik (M){?=isset_or($triase_igd.gcs_m, '-')?}
                  Total GCS{?=isset_or($triase_igd.total_gcs)?}
                  +
                  + +
                  +
                  Hasil Triase
                  + + + + + + + + + +
                  Kategori + + {?=isset_or($triase_igd.kategori)?} + +
                  Skala Triase{?=isset_or($triase_igd.skala_triase, '-')?}
                  +
                  +
                  + + + {if: $triase_igd.keluhan_utama || $triase_igd.diagnosa_awal} +
                  + {if: $triase_igd.keluhan_utama} +
                  +
                  Keluhan Utama
                  +

                  {?=isset_or($triase_igd.keluhan_utama)?}

                  +
                  + {/if} + + {if: $triase_igd.diagnosa_awal} +
                  +
                  Diagnosa Awal
                  +

                  {?=isset_or($triase_igd.diagnosa_awal)?}

                  +
                  + {/if} +
                  + {/if} + + +
                  +
                  +
                  + Dibuat: {?=isset_or($triase_igd.created_at)?} +
                  +
                  + Diupdate: {?=isset_or($triase_igd.updated_at)?} +
                  +
                  + +
                  +
                  \ No newline at end of file diff --git a/plugins/dokter_ralan/Admin.php b/plugins/dokter_ralan/Admin.php index e2f08c3f4..83d3077e6 100644 --- a/plugins/dokter_ralan/Admin.php +++ b/plugins/dokter_ralan/Admin.php @@ -3,17 +3,25 @@ use Systems\AdminModule; use LZCompressor\LZString; +use Systems\Lib\BpjsService; class Admin extends AdminModule { + private const ALLOWED_STATUS_PENYAKIT = ['Baru', 'Lama']; private $_uploads = WEBAPPS_PATH.'/berkasrawat/pages/upload'; + protected array $assign = []; + private $consid = ''; + private $secretkey = ''; + private $api_url = ''; + private $user_key = ''; + public function navigation() { return [ 'Kelola' => 'index', 'Dokter Ralan' => 'manage', - 'Pengaturan' =>'settings' + 'Pengaturan' => 'settings' ]; } @@ -23,7 +31,7 @@ public function getIndex() ['name' => 'Dokter Ralan', 'url' => url([ADMIN, 'dokter_ralan', 'manage']), 'icon' => 'wheelchair', 'desc' => 'Data pasien rawat jalan'], ['name' => 'Pengaturan', 'url' => url([ADMIN, 'dokter_ralan', 'settings']), 'icon' => 'wrench', 'desc' => 'Pengaturan dokter rawat jalan'], ]; - return $this->draw('index.html', ['sub_modules' => $sub_modules]); + return $this->draw('index.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function anyManage() @@ -44,7 +52,7 @@ public function anyManage() $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $responsivevoice = $this->settings->get('settings.responsivevoice'); $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa); - return $this->draw('manage.html', ['rawat_jalan' => $this->assign, 'cek_vclaim' => $cek_vclaim, 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode')]); + return $this->draw('manage.html', ['rawat_jalan' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim), 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode')]); } public function anyDisplay() @@ -62,9 +70,10 @@ public function anyDisplay() if(isset($_POST['status_periksa'])) { $status_periksa = $_POST['status_periksa']; } + $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $responsivevoice = $this->settings->get('settings.responsivevoice'); $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa); - echo $this->draw('display.html', ['rawat_jalan' => $this->assign, 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode')]); + echo $this->draw('display.html', ['rawat_jalan' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim), 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode')]); exit(); } @@ -75,6 +84,7 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' } $this->_addHeaderFiles(); $username = $this->core->getUserInfo('username', null, true); + $this->assign = []; $this->assign['poliklinik'] = $this->db('poliklinik')->where('status', '1')->toArray(); $this->assign['dokter'] = $this->db('dokter')->where('status', '1')->toArray(); $this->assign['penjab'] = $this->db('penjab')->where('status', '1')->toArray(); @@ -85,6 +95,7 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' $poliklinik = str_replace(",","','", $this->core->getUserInfo('cap', null, true)); $igd = $this->settings('settings', 'igd'); + $params = []; $sql = "SELECT reg_periksa.*, pasien.*, dokter.*, @@ -92,15 +103,19 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' penjab.* FROM reg_periksa, pasien, dokter, poliklinik, penjab WHERE reg_periksa.no_rkm_medis = pasien.no_rkm_medis - AND reg_periksa.kd_poli != '$igd' - AND reg_periksa.tgl_registrasi BETWEEN '$tgl_kunjungan' AND '$tgl_kunjungan_akhir' + AND reg_periksa.kd_poli != ? + AND reg_periksa.tgl_registrasi BETWEEN ? AND ? AND reg_periksa.kd_dokter = dokter.kd_dokter AND reg_periksa.kd_poli = poliklinik.kd_poli AND reg_periksa.kd_pj = penjab.kd_pj"; + $params[] = $igd; + $params[] = $tgl_kunjungan; + $params[] = $tgl_kunjungan_akhir; if ($this->core->getUserInfo('role') != 'admin') { if($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { - $sql .= " AND reg_periksa.kd_dokter = '$username'"; + $sql .= " AND reg_periksa.kd_dokter = ?"; + $params[] = $username; } else { $sql .= " AND reg_periksa.kd_poli IN ('$poliklinik')"; } @@ -116,14 +131,78 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' } $stmt = $this->db()->pdo()->prepare($sql); - $stmt->execute(); + $stmt->execute($params); $rows = $stmt->fetchAll(); $this->assign['list'] = []; foreach ($rows as $row) { + $row['potensi_prb'] = ''; + $bpjs_prb = $this->db('bpjs_prb') + ->join('bridging_sep', 'bridging_sep.no_sep', 'bpjs_prb.no_sep') + ->where('bridging_sep.no_rawat', $row['no_rawat']) + ->oneArray(); + if(!empty($bpjs_prb)) { + $row['potensi_prb'] = $bpjs_prb['prb']; + } $this->assign['list'][] = $row; } + // Query untuk rujukan internal + $params_rujukan = []; + $sql_rujukan_internal = "SELECT + reg_periksa.no_rkm_medis, + pasien.nm_pasien, + reg_periksa.no_rawat, + p1.nm_poli as poli_asal, + p2.nm_poli as poli_tujuan, + d1.nm_dokter as dokter_perujuk, + d2.nm_dokter as dokter_tujuan, + reg_periksa.tgl_registrasi as tgl_rujukan, + mlite_rujukan_internal_poli.kd_poli as kd_poli_tujuan, + mlite_rujukan_internal_poli.kd_dokter as kd_dokter_tujuan, + mlite_rujukan_internal_poli.isi_rujukan as keterangan, + mlite_rujukan_internal_poli.jawab_rujukan as keterangan_jawab + FROM mlite_rujukan_internal_poli + INNER JOIN reg_periksa ON mlite_rujukan_internal_poli.no_rawat = reg_periksa.no_rawat + INNER JOIN pasien ON reg_periksa.no_rkm_medis = pasien.no_rkm_medis + INNER JOIN poliklinik p1 ON reg_periksa.kd_poli = p1.kd_poli + INNER JOIN poliklinik p2 ON mlite_rujukan_internal_poli.kd_poli = p2.kd_poli + INNER JOIN dokter d1 ON reg_periksa.kd_dokter = d1.kd_dokter + INNER JOIN dokter d2 ON mlite_rujukan_internal_poli.kd_dokter = d2.kd_dokter + INNER JOIN penjab ON reg_periksa.kd_pj = penjab.kd_pj + WHERE reg_periksa.kd_poli != ? + AND reg_periksa.tgl_registrasi BETWEEN ? AND ?"; + $params_rujukan[] = $igd; + $params_rujukan[] = $tgl_kunjungan; + $params_rujukan[] = $tgl_kunjungan_akhir; + + if ($this->core->getUserInfo('role') != 'admin') { + if($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { + $sql_rujukan_internal .= " AND reg_periksa.kd_dokter = ?"; + $params_rujukan[] = $username; + } else { + $sql_rujukan_internal .= " AND reg_periksa.kd_poli IN ('$poliklinik')"; + } + } + if($status_periksa == 'belum') { + $sql_rujukan_internal .= " AND reg_periksa.stts = 'Belum'"; + } + if($status_periksa == 'selesai') { + $sql_rujukan_internal .= " AND reg_periksa.stts = 'Sudah'"; + } + if($status_periksa == 'lunas') { + $sql_rujukan_internal .= " AND reg_periksa.status_bayar = 'Sudah Bayar'"; + } + + $stmt = $this->db()->pdo()->prepare($sql_rujukan_internal); + $stmt->execute($params_rujukan); + $rows_rujukan = $stmt->fetchAll(); + + $this->assign['list_rujukan_internal'] = []; + foreach ($rows_rujukan as $row) { + $this->assign['list_rujukan_internal'][] = $row; + } + } public function postSaveDetail() @@ -147,27 +226,45 @@ public function postSaveDetail() } if($_POST['kat'] == 'obat') { - - $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); - $cek_resep = $this->db('resep_obat')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); - - if(empty($cek_resep)) { - - $resep_obat = $this->db('resep_obat') - ->save([ - 'no_resep' => $no_resep, - 'tgl_perawatan' => '0000-00-00', - 'jam' => '00:00:00', - 'no_rawat' => $_POST['no_rawat'], - 'kd_dokter' => $this->core->getUserInfo('username', null, true), - 'tgl_peresepan' => $_POST['tgl_perawatan'], - 'jam_peresepan' => $_POST['jam_rawat'], - 'status' => 'ralan', - 'tgl_penyerahan' => '0000-00-00', - 'jam_penyerahan' => '00:00:00' - ]); - - if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $this->core->getUserInfo('username', null, true))->oneArray()) { + $maxRetries = 5; + $retryCount = 0; + $success = false; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->join('resep_dokter', 'resep_obat.no_resep = resep_dokter.no_resep')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); + + if(empty($cek_resep)) { + + $resep_obat = $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $_POST['no_rawat'], + 'kd_dokter' => $this->core->getUserInfo('username', null, true), + 'tgl_peresepan' => $_POST['tgl_perawatan'], + 'jam_peresepan' => $_POST['jam_rawat'], + 'status' => 'ralan', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $this->core->getUserInfo('username', null, true))->oneArray()) { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $_POST['kd_jenis_prw'], + 'jml' => $_POST['jml'], + 'aturan_pakai' => $_POST['aturan_pakai'] + ]); + } + + } else { + + $no_resep = $cek_resep['no_resep']; $this->db('resep_dokter') ->save([ 'no_resep' => $no_resep, @@ -175,218 +272,272 @@ public function postSaveDetail() 'jml' => $_POST['jml'], 'aturan_pakai' => $_POST['aturan_pakai'] ]); - } - - } else { - - $no_resep = $cek_resep['no_resep']; - $this->db('resep_dokter') - ->save([ - 'no_resep' => $no_resep, - 'kode_brng' => $_POST['kd_jenis_prw'], - 'jml' => $_POST['jml'], - 'aturan_pakai' => $_POST['aturan_pakai'] - ]); + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; + } } } if($_POST['kat'] == 'racikan') { + $maxRetries = 5; + $retryCount = 0; + $success = false; - $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); - $cek_resep = $this->db('resep_obat')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); - - $_POST['jam_rawat'] = date('H:i:s'); + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->join('resep_dokter_racikan', 'resep_obat.no_resep = resep_dokter_racikan.no_resep')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); - if(empty($cek_resep)) { + if(empty($cek_resep)) { - $resep_obat = $this->db('resep_obat') - ->save([ - 'no_resep' => $no_resep, - 'tgl_perawatan' => '0000-00-00', - 'jam' => '00:00:00', - 'no_rawat' => $_POST['no_rawat'], - 'kd_dokter' => $this->core->getUserInfo('username', null, true), - 'tgl_peresepan' => $_POST['tgl_perawatan'], - 'jam_peresepan' => $_POST['jam_rawat'], - 'status' => 'ralan', - 'tgl_penyerahan' => '0000-00-00', - 'jam_penyerahan' => '00:00:00' - ]); + $resep_obat = $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $_POST['no_rawat'], + 'kd_dokter' => $this->core->getUserInfo('username', null, true), + 'tgl_peresepan' => $_POST['tgl_perawatan'], + 'jam_peresepan' => $_POST['jam_rawat'], + 'status' => 'ralan', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); - if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $this->core->getUserInfo('username', null, true))->oneArray()) { - $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); - $no_racik = $no_racik+1; - $this->db('resep_dokter_racikan') - ->save([ - 'no_resep' => $no_resep, - 'no_racik' => $no_racik, - 'nama_racik' => $_POST['nama_racik'], - 'kd_racik' => $_POST['kd_jenis_prw'], - 'jml_dr' => $_POST['jml'], - 'aturan_pakai' => $_POST['aturan_pakai'], - 'keterangan' => $_POST['keterangan'] - ]); - $_POST['kode_brng'] = json_decode($_POST['kode_brng'], true); - $_POST['kandungan'] = json_decode($_POST['kandungan'], true); - for ($i = 0; $i < count($_POST['kode_brng']); $i++) { - $kapasitas = $this->db('databarang')->where('kode_brng', $_POST['kode_brng'][$i]['value'])->oneArray(); - $jml = $_POST['jml']*$_POST['kandungan'][$i]['value']; - $jml = round(($jml/$kapasitas['kapasitas']),1); - $this->db('resep_dokter_racikan_detail') + if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $this->core->getUserInfo('username', null, true))->oneArray()) { + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik+1; + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $_POST['nama_racik'], + 'kd_racik' => $_POST['kd_jenis_prw'], + 'jml_dr' => $_POST['jml'], + 'aturan_pakai' => $_POST['aturan_pakai'], + 'keterangan' => $_POST['keterangan'] + ]); + $post_kode_brng = json_decode($_POST['kode_brng'], true); + $post_kandungan = json_decode($_POST['kandungan'], true); + $kode_brng_count = count($post_kode_brng); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $post_kode_brng[$i]['value'])->oneArray(); + $jml = $_POST['jml']*$post_kandungan[$i]['value']; + $jml = round(($jml/$kapasitas['kapasitas']),1); + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $post_kode_brng[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $post_kandungan[$i]['value'], + 'jml' => $jml + ]); + } + } + + } else { + + $no_resep = $cek_resep['no_resep']; + + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik+1; + $this->db('resep_dokter_racikan') ->save([ 'no_resep' => $no_resep, 'no_racik' => $no_racik, - 'kode_brng' => $_POST['kode_brng'][$i]['value'], - 'p1' => '1', - 'p2' => '1', - 'kandungan' => $_POST['kandungan'][$i]['value'], - 'jml' => $jml + 'nama_racik' => $_POST['nama_racik'], + 'kd_racik' => $_POST['kd_jenis_prw'], + 'jml_dr' => $_POST['jml'], + 'aturan_pakai' => $_POST['aturan_pakai'], + 'keterangan' => $_POST['keterangan'] ]); - } - } - - } else { - - $no_resep = $cek_resep['no_resep']; + $post_kode_brng = json_decode($_POST['kode_brng'], true); + $post_kandungan = json_decode($_POST['kandungan'], true); + $kode_brng_count = count($post_kode_brng); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $post_kode_brng[$i]['value'])->oneArray(); + $jml = $_POST['jml']*$post_kandungan[$i]['value']; + $jml = round(($jml/$kapasitas['kapasitas']),1); + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $post_kode_brng[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $post_kandungan[$i]['value'], + 'jml' => $jml + ]); + } - $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); - $no_racik = $no_racik+1; - $this->db('resep_dokter_racikan') - ->save([ - 'no_resep' => $no_resep, - 'no_racik' => $no_racik, - 'nama_racik' => $_POST['nama_racik'], - 'kd_racik' => $_POST['kd_jenis_prw'], - 'jml_dr' => $_POST['jml'], - 'aturan_pakai' => $_POST['aturan_pakai'], - 'keterangan' => $_POST['keterangan'] - ]); - $_POST['kode_brng'] = json_decode($_POST['kode_brng'], true); - $_POST['kandungan'] = json_decode($_POST['kandungan'], true); - for ($i = 0; $i < count($_POST['kode_brng']); $i++) { - $kapasitas = $this->db('databarang')->where('kode_brng', $_POST['kode_brng'][$i]['value'])->oneArray(); - $jml = $_POST['jml']*$_POST['kandungan'][$i]['value']; - $jml = round(($jml/$kapasitas['kapasitas']),1); - $this->db('resep_dokter_racikan_detail') - ->save([ - 'no_resep' => $no_resep, - 'no_racik' => $no_racik, - 'kode_brng' => $_POST['kode_brng'][$i]['value'], - 'p1' => '1', - 'p2' => '1', - 'kandungan' => $_POST['kandungan'][$i]['value'], - 'jml' => $jml - ]); + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; } - } } if($_POST['kat'] == 'laboratorium') { - $cek_lab = $this->db('permintaan_lab')->where('no_rawat', $_POST['no_rawat'])->where('tgl_permintaan', date('Y-m-d'))->where('tgl_sampel', '0000-00-00')->where('status', 'ralan')->oneArray(); - if(!$cek_lab) { - $max_id = $this->db('permintaan_lab')->select(['noorder' => 'ifnull(MAX(CONVERT(RIGHT(noorder,4),signed)),0)'])->where('tgl_permintaan', date('Y-m-d'))->oneArray(); - if(empty($max_id['noorder'])) { - $max_id['noorder'] = '0000'; - } - $_next_noorder = sprintf('%04s', ($max_id['noorder'] + 1)); - $noorder = 'PL'.date('Ymd').''.$_next_noorder; - - $permintaan_lab = $this->db('permintaan_lab') - ->save([ - 'noorder' => $noorder, - 'no_rawat' => $_POST['no_rawat'], - 'tgl_permintaan' => $_POST['tgl_perawatan'], - 'jam_permintaan' => $_POST['jam_rawat'], - 'tgl_sampel' => '0000-00-00', - 'jam_sampel' => '00:00:00', - 'tgl_hasil' => '0000-00-00', - 'jam_hasil' => '00:00:00', - 'dokter_perujuk' => $this->core->getUserInfo('username', null, true), - 'status' => 'ralan', - 'informasi_tambahan' => $_POST['informasi_tambahan'], - 'diagnosa_klinis' => $_POST['diagnosa_klinis'] - ]); - $this->db('permintaan_pemeriksaan_lab') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'stts_bayar' => 'Belum' - ]); - $template_laboratorium = $this->db('template_laboratorium')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->toArray(); - for ($i = 0; $i < count($template_laboratorium); $i++) { - $this->db('permintaan_detail_permintaan_lab') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'id_template' => $template_laboratorium[$i]['id_template'], - 'stts_bayar' => 'Belum' - ]); - } - } else { - $noorder = $cek_lab['noorder']; - $this->db('permintaan_pemeriksaan_lab') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'stts_bayar' => 'Belum' - ]); - $template_laboratorium = $this->db('template_laboratorium')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->toArray(); - for ($i = 0; $i < count($template_laboratorium); $i++) { - $this->db('permintaan_detail_permintaan_lab') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'id_template' => $template_laboratorium[$i]['id_template'], - 'stts_bayar' => 'Belum' - ]); + $maxRetries = 5; + $retryCount = 0; + $success = false; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $cek_lab = $this->db('permintaan_lab')->where('no_rawat', $_POST['no_rawat'])->where('tgl_permintaan', date('Y-m-d'))->where('tgl_sampel', '0000-00-00')->where('status', 'ralan')->oneArray(); + if(!$cek_lab) { + $urut = $this->db('permintaan_lab') + ->where('tgl_permintaan', date('Y-m-d')) + ->nextRightNumber('noorder', 4); + $noorder = 'PL' . date('Ymd') . sprintf('%04d', $urut); + + $permintaan_lab = $this->db('permintaan_lab') + ->save([ + 'noorder' => $noorder, + 'no_rawat' => $_POST['no_rawat'], + 'tgl_permintaan' => $_POST['tgl_perawatan'], + 'jam_permintaan' => $_POST['jam_rawat'], + 'tgl_sampel' => '0000-00-00', + 'jam_sampel' => '00:00:00', + 'tgl_hasil' => '0000-00-00', + 'jam_hasil' => '00:00:00', + 'dokter_perujuk' => $this->core->getUserInfo('username', null, true), + 'status' => 'ralan', + 'informasi_tambahan' => $_POST['informasi_tambahan'], + 'diagnosa_klinis' => $_POST['diagnosa_klinis'] + ]); + $this->db('permintaan_pemeriksaan_lab') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'stts_bayar' => 'Belum' + ]); + $template_laboratorium = $this->db('template_laboratorium')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->toArray(); + $template_count = count($template_laboratorium); + for ($i = 0; $i < $template_count; $i++) { + $this->db('permintaan_detail_permintaan_lab') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'id_template' => $template_laboratorium[$i]['id_template'], + 'stts_bayar' => 'Belum' + ]); + } + } else { + $noorder = $cek_lab['noorder']; + $this->db('permintaan_pemeriksaan_lab') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'stts_bayar' => 'Belum' + ]); + $template_laboratorium = $this->db('template_laboratorium')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->toArray(); + $template_count = count($template_laboratorium); + for ($i = 0; $i < $template_count; $i++) { + $this->db('permintaan_detail_permintaan_lab') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'id_template' => $template_laboratorium[$i]['id_template'], + 'stts_bayar' => 'Belum' + ]); + } + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; } } } if($_POST['kat'] == 'radiologi') { - $cek_rad = $this->db('permintaan_radiologi')->where('no_rawat', $_POST['no_rawat'])->where('tgl_permintaan', date('Y-m-d'))->where('tgl_sampel', '<>', '0000-00-00')->where('status', 'ralan')->oneArray(); - if(!$cek_rad) { - $max_id = $this->db('permintaan_radiologi')->select(['noorder' => 'ifnull(MAX(CONVERT(RIGHT(noorder,4),signed)),0)'])->where('tgl_permintaan', date('Y-m-d'))->oneArray(); - if(empty($max_id['noorder'])) { - $max_id['noorder'] = '0000'; - } - $_next_noorder = sprintf('%04s', ($max_id['noorder'] + 1)); - $noorder = 'PR'.date('Ymd').''.$_next_noorder; - - $permintaan_rad = $this->db('permintaan_radiologi') - ->save([ - 'noorder' => $noorder, - 'no_rawat' => $_POST['no_rawat'], - 'tgl_permintaan' => $_POST['tgl_perawatan'], - 'jam_permintaan' => $_POST['jam_rawat'], - 'tgl_sampel' => '0000-00-00', - 'jam_sampel' => '00:00:00', - 'tgl_hasil' => '0000-00-00', - 'jam_hasil' => '00:00:00', - 'dokter_perujuk' => $this->core->getUserInfo('username', null, true), - 'status' => 'ralan', - 'informasi_tambahan' => $_POST['informasi_tambahan'], - 'diagnosa_klinis' => $_POST['diagnosa_klinis'] - ]); - $this->db('permintaan_pemeriksaan_radiologi') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'stts_bayar' => 'Belum' - ]); + $maxRetries = 5; + $retryCount = 0; + $success = false; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $cek_rad = $this->db('permintaan_radiologi')->where('no_rawat', $_POST['no_rawat'])->where('tgl_permintaan', date('Y-m-d'))->where('tgl_sampel', '<>', '0000-00-00')->where('status', 'ralan')->oneArray(); + if(!$cek_rad) { + $urut = $this->db('permintaan_radiologi') + ->where('tgl_permintaan', date('Y-m-d')) + ->nextRightNumber('noorder', 4); + $noorder = 'PR' . date('Ymd') . sprintf('%04d', $urut); + + $permintaan_rad = $this->db('permintaan_radiologi') + ->save([ + 'noorder' => $noorder, + 'no_rawat' => $_POST['no_rawat'], + 'tgl_permintaan' => $_POST['tgl_perawatan'], + 'jam_permintaan' => $_POST['jam_rawat'], + 'tgl_sampel' => '0000-00-00', + 'jam_sampel' => '00:00:00', + 'tgl_hasil' => '0000-00-00', + 'jam_hasil' => '00:00:00', + 'dokter_perujuk' => $this->core->getUserInfo('username', null, true), + 'status' => 'ralan', + 'informasi_tambahan' => $_POST['informasi_tambahan'], + 'diagnosa_klinis' => $_POST['diagnosa_klinis'] + ]); + $this->db('permintaan_pemeriksaan_radiologi') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'stts_bayar' => 'Belum' + ]); - } else { - $noorder = $cek_rad['noorder']; - $this->db('permintaan_pemeriksaan_radiologi') - ->save([ - 'noorder' => $noorder, - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'stts_bayar' => 'Belum' - ]); + } else { + $noorder = $cek_rad['noorder']; + $this->db('permintaan_pemeriksaan_radiologi') + ->save([ + 'noorder' => $noorder, + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'stts_bayar' => 'Belum' + ]); + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; + } } } @@ -467,7 +618,22 @@ public function anyCopyResep() ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) ->where('no_resep', $_POST['no_resep']) ->toArray(); - echo $this->draw('copyresep.display.html', ['copy_resep' => $return]); + + $racikan = $this->db('resep_dokter_racikan') + ->where('no_resep', $_POST['no_resep']) + ->toArray(); + + foreach ($racikan as &$r) { + $r['detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->join('gudangbarang', 'gudangbarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->where('kd_bangsal', $this->settings->get('farmasi.deporalan')) + ->where('no_resep', $r['no_resep']) + ->where('no_racik', $r['no_racik']) + ->toArray(); + } + + echo $this->draw('copyresep.display.html', ['copy_resep' => htmlspecialchars_array($return), 'copy_resep_racikan' => htmlspecialchars_array($racikan), 'no_resep' => htmlspecialchars($_POST['no_resep'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); exit(); } @@ -477,31 +643,104 @@ public function postSaveCopyResep() $_POST['jml'] = json_decode($_POST['jml'], true); $_POST['aturan_pakai'] = json_decode($_POST['aturan_pakai'], true); - $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); + $maxRetries = 5; + $retryCount = 0; + $success = false; - $resep_obat = $this->db('resep_obat') - ->save([ - 'no_resep' => $no_resep, - 'tgl_perawatan' => '0000-00-00', - 'jam' => '00:00:00', - 'no_rawat' => $_POST['no_rawat'], - 'kd_dokter' => $this->core->getUserInfo('username', null, true), - 'tgl_peresepan' => $_POST['tgl_perawatan'], - 'jam_peresepan' => $_POST['jam_rawat'], - 'status' => 'ralan', - 'tgl_penyerahan' => '0000-00-00', - 'jam_penyerahan' => '00:00:00' - ]); + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); - for ($i = 0; $i < count($_POST['kode_brng']); $i++) { - $this->db('resep_dokter') + $resep_obat = $this->db('resep_obat') ->save([ 'no_resep' => $no_resep, - 'kode_brng' => $_POST['kode_brng'][$i]['value'], - 'jml' => $_POST['jml'][$i]['value'], - 'aturan_pakai' => $_POST['aturan_pakai'][$i]['value'] + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $_POST['no_rawat'], + 'kd_dokter' => $this->core->getUserInfo('username', null, true), + 'tgl_peresepan' => $_POST['tgl_perawatan'], + 'jam_peresepan' => $_POST['jam_rawat'], + 'status' => 'ralan', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' ]); + if (!empty($_POST['kode_brng'])) { + $kode_brng_count = count($_POST['kode_brng']); + for ($i = 0; $i < $kode_brng_count; $i++) { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $_POST['kode_brng'][$i]['value'], + 'jml' => $_POST['jml'][$i]['value'], + 'aturan_pakai' => $_POST['aturan_pakai'][$i]['value'] + ]); + + } + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; + } + } + + if (isset($_POST['nama_racik'])) { + $_POST['nama_racik'] = json_decode($_POST['nama_racik'], true); + $_POST['kd_racik'] = json_decode($_POST['kd_racik'], true); + $_POST['jml_dr'] = json_decode($_POST['jml_dr'], true); + $_POST['aturan_pakai_racik'] = json_decode($_POST['aturan_pakai_racik'], true); + $_POST['keterangan'] = json_decode($_POST['keterangan'], true); + $_POST['no_racik'] = json_decode($_POST['no_racik'], true); + + $count_racik = count($_POST['nama_racik']); + for ($i = 0; $i < $count_racik; $i++) { + $no_racik = $_POST['no_racik'][$i]['value']; + $nama_racik = $_POST['nama_racik'][$i]['value']; + $kd_racik = $_POST['kd_racik'][$i]['value']; + $jml_dr = $_POST['jml_dr'][$i]['value']; + $aturan_pakai = $_POST['aturan_pakai_racik'][$i]['value']; + $keterangan = $_POST['keterangan'][$i]['value']; + + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $nama_racik, + 'kd_racik' => $kd_racik, + 'jml_dr' => $jml_dr, + 'aturan_pakai' => $aturan_pakai, + 'keterangan' => $keterangan + ]); + + $kode_brng_racikan = json_decode($_POST['kode_brng_racikan_'.$no_racik], true); + $jml_racikan = json_decode($_POST['jml_racikan_'.$no_racik], true); + $p1 = json_decode($_POST['p1_'.$no_racik], true); + $p2 = json_decode($_POST['p2_'.$no_racik], true); + + if(!empty($kode_brng_racikan)) { + $count_detail = count($kode_brng_racikan); + for ($j = 0; $j < $count_detail; $j++) { + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng_racikan[$j]['value'], + 'p1' => $p1[$j]['value'], + 'p2' => $p2[$j]['value'], + 'kandungan' => '0', // Default or fetch if needed + 'jml' => $jml_racikan[$j]['value'] + ]); + } + } + } } exit(); @@ -551,11 +790,16 @@ public function anyRincian() $rows = $this->db('resep_obat') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') - ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) ->where('resep_obat.status', 'ralan') - ->group('resep_dokter.no_resep') + ->group('resep_obat.no_resep') + ->group('resep_obat.no_rawat') + ->group('resep_obat.kd_dokter') ->toArray(); + // Filter only records that do not have racikan + $rows = array_filter($rows, function($row) { + return $this->db('resep_dokter_racikan')->where('no_resep', $row['no_resep'])->count() == 0; + }); $resep = []; $jumlah_total_resep = 0; foreach ($rows as $row) { @@ -572,14 +816,18 @@ public function anyRincian() ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') ->join('resep_dokter_racikan', 'resep_dokter_racikan.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) - ->group('resep_dokter_racikan.no_resep') ->where('resep_obat.status', 'ralan') ->toArray(); + $resep_racikan = []; $jumlah_total_resep_racikan = 0; foreach ($rows_racikan as $row) { $row['nomor'] = $i++; - $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail')->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng')->where('no_resep', $row['no_resep'])->toArray(); + $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $row['no_resep']) + ->where('no_racik', $row['no_racik']) + ->toArray(); foreach ($row['resep_dokter_racikan_detail'] as $value) { $value['ralan'] = $value['jml'] * $value['dasar']; $jumlah_total_resep_racikan += floatval($value['ralan']); @@ -669,6 +917,19 @@ public function anyRincian() ->join('databarang', 'databarang.kode_brng=resep_dokter.kode_brng') ->where('no_resep', $row['no_resep']) ->toArray(); + + $row['resep_racikan'] = $this->db('resep_dokter_racikan') + ->where('no_resep', $row['no_resep']) + ->toArray(); + + foreach ($row['resep_racikan'] as &$racikan) { + $racikan['detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $racikan['no_resep']) + ->where('no_racik', $racikan['no_racik']) + ->toArray(); + } + $data_resep[] = $row; } @@ -677,16 +938,16 @@ public function anyRincian() 'rawat_jl_pr' => $rawat_jl_pr, 'rawat_jl_drpr' => $rawat_jl_drpr, 'resep' => $resep, - 'resep_racikan' => $resep_racikan, + 'resep_racikan' => htmlspecialchars_array($resep_racikan), 'data_resep' => $data_resep, - 'laboratorium' => $laboratorium, - 'radiologi' => $radiologi, + 'laboratorium' => htmlspecialchars_array($laboratorium), + 'radiologi' => htmlspecialchars_array($radiologi), 'jumlah_total' => $jumlah_total, 'jumlah_total_resep' => $jumlah_total_resep, 'jumlah_total_resep_racikan' => $jumlah_total_resep_racikan, //'jumlah_total_lab' => $jumlah_total_lab, 'jumlah_total_rad' => $jumlah_total_rad, - 'no_rawat' => $_POST['no_rawat'] + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); exit(); } @@ -697,11 +958,18 @@ public function anyRincianEresep() $rows = $this->db('resep_obat') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') - ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) ->where('resep_obat.status', 'ralan') - ->group('resep_dokter.no_resep') + ->group('resep_obat.no_resep') + ->group('resep_obat.no_rawat') + ->group('resep_obat.kd_dokter') ->toArray(); + + // Filter only records that do not have racikan + $rows = array_filter($rows, function($row) { + return $this->db('resep_dokter_racikan')->where('no_resep', $row['no_resep'])->count() == 0; + }); + $resep = []; $jumlah_total_resep = 0; foreach ($rows as $row) { @@ -718,14 +986,18 @@ public function anyRincianEresep() ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') ->join('resep_dokter_racikan', 'resep_dokter_racikan.no_resep=resep_obat.no_resep') ->where('no_rawat', $_POST['no_rawat']) - ->group('resep_dokter_racikan.no_resep') ->where('resep_obat.status', 'ralan') ->toArray(); + $resep_racikan = []; $jumlah_total_resep_racikan = 0; foreach ($rows_racikan as $row) { $row['nomor'] = $i++; - $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail')->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng')->where('no_resep', $row['no_resep'])->toArray(); + $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $row['no_resep']) + ->where('no_racik', $row['no_racik']) + ->toArray(); foreach ($row['resep_dokter_racikan_detail'] as $value) { $value['ralan'] = $value['jml'] * $value['dasar']; $jumlah_total_resep_racikan += floatval($value['ralan']); @@ -751,11 +1023,11 @@ public function anyRincianEresep() echo $this->draw('rincian.eresep.html', [ 'resep' => $resep, - 'resep_racikan' => $resep_racikan, + 'resep_racikan' => htmlspecialchars_array($resep_racikan), 'data_resep' => $data_resep, 'jumlah_total_resep' => $jumlah_total_resep, 'jumlah_total_resep_racikan' => $jumlah_total_resep_racikan, - 'no_rawat' => $_POST['no_rawat'] + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); exit(); } @@ -828,7 +1100,27 @@ public function anySoap() $row['nama'] = $icd10['nm_penyakit']; $diagnosa[] = $row; } - + $mapping_snomeds = $this->db('mlite_mapping_snomed_icd') + ->where('no_rawat', $_POST['no_rawat']) + ->asc('kd_penyakit') + ->toArray(); + $mapping_snomed = []; + foreach ($mapping_snomeds as $row_mapping_snomed) { + $penyakit = $this->db('penyakit')->where('kd_penyakit', $row_mapping_snomed['kd_penyakit'])->oneArray(); + $row_mapping_snomed['nm_penyakit'] = $penyakit ? $penyakit['nm_penyakit'] : ''; + $mapping_snomed[] = $row_mapping_snomed; + } + $mapping_snomeds_icd9 = $this->db('mlite_mapping_snomed_icd9') + ->where('no_rawat', $_POST['no_rawat']) + ->asc('kd_tindakan') + ->toArray(); + $mapping_snomed_icd9 = []; + foreach ($mapping_snomeds_icd9 as $row_mapping_snomed_icd9) { + $tindakan = $this->db('icd9')->where('kode', $row_mapping_snomed_icd9['kd_tindakan'])->oneArray(); + $row_mapping_snomed_icd9['nm_tindakan'] = $tindakan ? $tindakan['deskripsi_panjang'] : ''; + $mapping_snomed_icd9[] = $row_mapping_snomed_icd9; + } + $i = 1; $row['nama_petugas'] = ''; $row['departemen_petugas'] = ''; @@ -856,7 +1148,15 @@ public function anySoap() } } - echo $this->draw('soap.html', ['pemeriksaan' => $result, 'pemeriksaan_ranap' => $result_ranap, 'diagnosa' => $diagnosa, 'prosedur' => $prosedur, 'admin_mode' => $this->settings->get('settings.admin_mode')]); + echo $this->draw('soap.html', [ + 'pemeriksaan' => htmlspecialchars_array($result), + 'pemeriksaan_ranap' => htmlspecialchars_array($result_ranap), + 'diagnosa' => htmlspecialchars_array($diagnosa), + 'prosedur' => htmlspecialchars_array($prosedur), + 'mapping_snomed' => htmlspecialchars_array($mapping_snomed), + 'mapping_snomed_icd9' => htmlspecialchars_array($mapping_snomed_icd9), + 'admin_mode' => $this->settings->get('settings.admin_mode') + ]); exit(); } @@ -906,7 +1206,7 @@ public function anyKontrol() $row['nomor'] = $i++; $result[] = $row; } - echo $this->draw('kontrol.html', ['booking_registrasi' => $result]); + echo $this->draw('kontrol.html', ['booking_registrasi' => htmlspecialchars_array($result)]); exit(); } @@ -938,7 +1238,7 @@ public function postSaveKontrol() 'tanggal_periksa' => $_POST['tanggal_datang'], 'kd_dokter' => $this->core->getUserInfo('username', null, true), 'kd_poli' => $this->core->getRegPeriksaInfo('kd_poli', $_POST['no_rawat']), - 'no_reg' => $this->core->setNoBooking($this->core->getUserInfo('username', null, true), $this->core->getRegPeriksaInfo('kd_poli', $no_rawat), $_POST['tanggal_datang']), + 'no_reg' => $this->core->setNoBooking($this->core->getUserInfo('username', null, true), $this->core->getRegPeriksaInfo('kd_poli', $_POST['no_rawat']), $_POST['tanggal_datang']), 'kd_pj' => $this->core->getRegPeriksaInfo('kd_pj', $_POST['no_rawat']), 'limit_reg' => 0, 'waktu_kunjungan' => $_POST['tanggal_datang'].' '.date('H:i:s'), @@ -979,8 +1279,8 @@ public function postSaveKontrolBPJS() $data = json_encode($data); - $url = $this->api_url . 'RencanaKontrol/' . $statusUrl; - $output = BpjsService::$method($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $url = $this->api_url . 'RencanaKontrol/insert'; + $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $data = json_decode($output, true); //echo $data['metaData']['message']; if ($data == NULL) { @@ -1029,7 +1329,7 @@ public function anyLayanan() ->in('kd_poli', $poliklinik) ->limit(10) ->toArray(); - echo $this->draw('layanan.html', ['layanan' => $layanan]); + echo $this->draw('layanan.html', ['layanan' => htmlspecialchars_array($layanan)]); exit(); } @@ -1039,10 +1339,10 @@ public function anyObat() ->join('gudangbarang', 'gudangbarang.kode_brng=databarang.kode_brng') ->where('status', '1') ->where('gudangbarang.kd_bangsal', $this->settings->get('farmasi.deporalan')) - ->like('databarang.nama_brng', '%'.$_POST['obat'].'%') + ->like('databarang.nama_brng', '%'.htmlspecialchars($_POST['obat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('obat.html', ['obat' => $obat]); + echo $this->draw('obat.html', ['obat' => htmlspecialchars_array($obat)]); exit(); } @@ -1052,19 +1352,19 @@ public function anyObatRacikan() ->join('gudangbarang', 'gudangbarang.kode_brng=databarang.kode_brng') ->where('status', '1') ->where('gudangbarang.kd_bangsal', $this->settings->get('farmasi.deporalan')) - ->like('databarang.nama_brng', '%'.$_POST['obat'].'%') + ->like('databarang.nama_brng', '%'.htmlspecialchars($_POST['obat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('obat.racikan.html', ['obat' => $obat]); + echo $this->draw('obat.racikan.html', ['obat' => htmlspecialchars_array($obat)]); exit(); } public function anyRacikan() { $racikan = $this->db('metode_racik') - ->like('nm_racik', '%'.$_POST['racikan'].'%') + ->like('nm_racik', '%'.htmlspecialchars($_POST['racikan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->toArray(); - echo $this->draw('racikan.html', ['racikan' => $racikan]); + echo $this->draw('racikan.html', ['racikan' => htmlspecialchars_array($racikan)]); exit(); } @@ -1072,10 +1372,10 @@ public function anyLaboratorium() { $laboratorium = $this->db('jns_perawatan_lab') ->where('status', '1') - ->like('nm_perawatan', '%'.$_POST['laboratorium'].'%') + ->like('nm_perawatan', '%'.htmlspecialchars($_POST['laboratorium'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('laboratorium.html', ['laboratorium' => $laboratorium]); + echo $this->draw('laboratorium.html', ['laboratorium' => htmlspecialchars_array($laboratorium)]); exit(); } @@ -1083,10 +1383,10 @@ public function anyRadiologi() { $radiologi = $this->db('jns_perawatan_radiologi') ->where('status', '1') - ->like('nm_perawatan', '%'.$_POST['radiologi'].'%') + ->like('nm_perawatan', '%'.htmlspecialchars($_POST['radiologi'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('radiologi.html', ['radiologi' => $radiologi]); + echo $this->draw('radiologi.html', ['radiologi' => htmlspecialchars_array($radiologi)]); exit(); } @@ -1100,7 +1400,7 @@ public function postAturanPakai() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -1120,7 +1420,7 @@ public function postProviderList() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -1140,7 +1440,7 @@ public function postProviderList2() $output = ''; if(count($rows)){ foreach ($rows as $row) { - $output .= ''; + $output .= ''; } } echo $output; @@ -1152,10 +1452,13 @@ public function postProviderList2() public function getAjax() { - header('Content-type: text/html'); + header('Content-type: application/json'); $show = isset($_GET['show']) ? $_GET['show'] : ""; + $array = []; + $handled = true; switch($show){ default: + $handled = false; break; case "databarang": $rows = $this->db('databarang') @@ -1173,7 +1476,7 @@ public function getAjax() 'nama_brng' => $row['nama_brng'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "aturan_pakai": $rows = $this->db('master_aturan_pakai')->like('aturan', '%'.$_GET['aturan'].'%')->toArray(); @@ -1182,7 +1485,7 @@ public function getAjax() 'aturan' => $row['aturan'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "jns_perawatan": $rows = $this->db('jns_perawatan')->like('nm_perawatan', '%'.$_GET['nm_perawatan'].'%')->toArray(); @@ -1192,7 +1495,7 @@ public function getAjax() 'nm_perawatan' => $row['nm_perawatan'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "jns_perawatan_lab": $rows = $this->db('jns_perawatan_lab')->like('nm_perawatan', '%'.$_GET['nm_perawatan'].'%')->toArray(); @@ -1202,7 +1505,7 @@ public function getAjax() 'nm_perawatan' => $row['nm_perawatan'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "jns_perawatan_radiologi": $rows = $this->db('jns_perawatan_radiologi')->like('nm_perawatan', '%'.$_GET['nm_perawatan'].'%')->toArray(); @@ -1212,7 +1515,7 @@ public function getAjax() 'nm_perawatan' => $row['nm_perawatan'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "icd10": $phrase = ''; @@ -1226,7 +1529,7 @@ public function getAjax() 'nm_penyakit' => $row['nm_penyakit'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); break; case "icd9": $phrase = ''; @@ -1240,9 +1543,31 @@ public function getAjax() 'deskripsi_panjang' => $row['deskripsi_panjang'] ); } - echo json_encode($array, true); + echo json_encode(htmlspecialchars_array($array), true); + break; + case "snomed": + $phrase = ''; + if(isset($_GET['s'])) + $phrase = $_GET['s']; + + $rows = $this->db('mlite_snomed') + ->like('kode', '%'.$phrase.'%') + ->orLike('istilah', '%'.$phrase.'%') + ->limit(30) + ->toArray(); + foreach ($rows as $row) { + $array[] = array( + 'kode' => $row['kode'], + 'istilah' => $row['istilah'], + 'text' => $row['kode'] . ' - ' . $row['istilah'] + ); + } + echo json_encode(htmlspecialchars_array($array), true); break; } + if (!$handled) { + echo json_encode([], true); + } exit(); } @@ -1253,11 +1578,18 @@ public function getEresep($no_rawat) $rows = $this->db('resep_obat') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') - ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') ->where('no_rawat', $no_rawat) ->where('resep_obat.status', 'ralan') - ->group('resep_dokter.no_resep') + ->group('resep_obat.no_resep') + ->group('resep_obat.no_rawat') + ->group('resep_obat.kd_dokter') ->toArray(); + + // Filter only records that do not have racikan + $rows = array_filter($rows, function($row) { + return $this->db('resep_dokter_racikan')->where('no_resep', $row['no_resep'])->count() == 0; + }); + $resep = []; $jumlah_total_resep = 0; foreach ($rows as $row) { @@ -1270,18 +1602,23 @@ public function getEresep($no_rawat) $resep[] = $row; } + // Get resep_racikan records that have racikan data $rows_racikan = $this->db('resep_obat') ->join('dokter', 'dokter.kd_dokter=resep_obat.kd_dokter') ->join('resep_dokter_racikan', 'resep_dokter_racikan.no_resep=resep_obat.no_resep') ->where('no_rawat', $no_rawat) - ->group('resep_dokter_racikan.no_resep') ->where('resep_obat.status', 'ralan') ->toArray(); + $resep_racikan = []; $jumlah_total_resep_racikan = 0; foreach ($rows_racikan as $row) { $row['nomor'] = $i++; - $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail')->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng')->where('no_resep', $row['no_resep'])->toArray(); + $row['resep_dokter_racikan_detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng=resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $row['no_resep']) + ->where('no_racik', $row['no_racik']) + ->toArray(); foreach ($row['resep_dokter_racikan_detail'] as $value) { $value['ralan'] = $value['jml'] * $value['dasar']; $jumlah_total_resep_racikan += floatval($value['ralan']); @@ -1307,7 +1644,7 @@ public function getEresep($no_rawat) echo $this->draw('eresep.html', [ 'resep' => $resep, - 'resep_racikan' => $resep_racikan, + 'resep_racikan' => htmlspecialchars_array($resep_racikan), 'data_resep' => $data_resep, 'jumlah_total_resep' => $jumlah_total_resep, 'jumlah_total_resep_racikan' => $jumlah_total_resep_racikan, @@ -1378,8 +1715,8 @@ public function getOdontogram($no_rkm_medis) $odt['85'] = $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->where('pemeriksaan', 'gg_85')->desc('tgl_input')->limit(1)->oneArray(); echo $this->draw('odontogram.html', [ - 'odontogram' => $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray(), - 'ohis' => $this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray(), + 'odontogram' => htmlspecialchars_array($this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray()), + 'ohis' => htmlspecialchars_array($this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray()), 'odt' => $odt ]); exit(); @@ -1387,7 +1724,7 @@ public function getOdontogram($no_rkm_medis) public function getOdontogramTampil($no_rkm_medis) { - echo $this->draw('odontogram.tampil.html', ['odontogram' => $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray()]); + echo $this->draw('odontogram.tampil.html', ['odontogram' => htmlspecialchars_array($this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray())]); exit(); } @@ -1415,7 +1752,7 @@ public function postOdontogramDelete() public function getOhisTampil($no_rkm_medis) { - echo $this->draw('ohis.tampil.html', ['ohis' => $this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray()]); + echo $this->draw('ohis.tampil.html', ['ohis' => htmlspecialchars_array($this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray())]); exit(); } @@ -1459,7 +1796,7 @@ public function getResume($no_rawat) $data_resume['prosedur'] = $this->db('prosedur_pasien')->join('icd9', 'icd9.kode=prosedur_pasien.kode')->where('no_rawat', revertNoRawat($no_rawat))->where('prioritas', 1)->where('status', 'Ralan')->oneArray(); echo $this->draw('resume.html', [ 'reg_periksa' => $this->db('reg_periksa')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(), - 'resume_pasien' => $this->db('resume_pasien')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=resume_pasien.kd_dokter')->oneArray(), + 'resume_pasien' => htmlspecialchars_array($this->db('resume_pasien')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=resume_pasien.kd_dokter')->oneArray()), 'data_resume' => $data_resume ]); exit(); @@ -1467,7 +1804,7 @@ public function getResume($no_rawat) public function getResumeTampil($no_rawat) { - echo $this->draw('resume.tampil.html', ['resume_pasien' => $this->db('resume_pasien')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=resume_pasien.kd_dokter')->oneArray()]); + echo $this->draw('resume.tampil.html', ['resume_pasien' => htmlspecialchars_array($this->db('resume_pasien')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=resume_pasien.kd_dokter')->oneArray())]); exit(); } @@ -1538,12 +1875,108 @@ public function postResumeSave() exit(); } + public function postResumeDelete() + { + $kd_dokter = $this->core->getUserInfo('username', $_SESSION['mlite_user']); + + $this->db('resume_pasien') + ->where('no_rawat', $_POST['no_rawat']) + ->where('kd_dokter', $kd_dokter) + ->delete(); + + exit(); + } + public function getMedisRalan($no_rawat) { $data_medisRalan['pemeriksaan_ralan'] = $this->db('pemeriksaan_ralan')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); + + // Get existing penilaian_medis_ralan data + $penilaian_medis_ralan = $this->db('penilaian_medis_ralan') + ->where('no_rawat', revertNoRawat($no_rawat)) + ->join('dokter', 'dokter.kd_dokter=penilaian_medis_ralan.kd_dokter') + ->oneArray(); + + // If no penilaian_medis_ralan data exists, use fallback from pemeriksaan_ralan + if (empty($penilaian_medis_ralan)) { + // Get latest pemeriksaan_ralan data for fallback + $pemeriksaan_fallback = $this->db('pemeriksaan_ralan') + ->where('no_rawat', revertNoRawat($no_rawat)) + ->desc('tgl_perawatan') + ->desc('jam_rawat') + ->oneArray(); + + if (!empty($pemeriksaan_fallback)) { + // Get current user (dokter) info + $current_dokter = $this->core->getUserInfo('username', $_SESSION['mlite_user']); + $dokter_info = $this->db('dokter')->where('kd_dokter', $current_dokter)->oneArray(); + + // Calculate BMI if height and weight are available + $bmi = ''; + if (!empty($pemeriksaan_fallback['tinggi']) && !empty($pemeriksaan_fallback['berat']) && + $pemeriksaan_fallback['tinggi'] > 0) { + $height_m = $pemeriksaan_fallback['tinggi'] / 100; + $bmi = round($pemeriksaan_fallback['berat'] / ($height_m * $height_m), 2); + } + + // Create fallback data structure matching penilaian_medis_ralan + $penilaian_medis_ralan = [ + 'no_rawat' => revertNoRawat($no_rawat), + 'kd_dokter' => $current_dokter, + 'tanggal' => date('Y-m-d H:i:s'), + 'anamnesis' => '', + 'hubungan' => '', + 'keluhan_utama' => $pemeriksaan_fallback['keluhan'] ?? '', + 'rps' => '', + 'rpd' => '', + 'rpk' => '', + 'rpo' => '', + 'alergi' => $pemeriksaan_fallback['alergi'] ?? '', + 'keadaan' => '', + 'gcs' => $pemeriksaan_fallback['gcs'] ?? '', + 'kesadaran' => $pemeriksaan_fallback['kesadaran'] ?? '', + 'td' => $pemeriksaan_fallback['tensi'] ?? '', + 'nadi' => $pemeriksaan_fallback['nadi'] ?? '', + 'rr' => $pemeriksaan_fallback['respirasi'] ?? '', + 'suhu' => $pemeriksaan_fallback['suhu_tubuh'] ?? '', + 'spo' => $pemeriksaan_fallback['spo2'] ?? '', + 'bb' => $pemeriksaan_fallback['berat'] ?? '', + 'tb' => $pemeriksaan_fallback['tinggi'] ?? '', + 'kepala' => '', + 'gigi' => '', + 'tht' => '', + 'thoraks' => '', + 'abdomen' => '', + 'genital' => '', + 'ekstremitas' => '', + 'kulit' => '', + 'ket_fisik' => '', + 'ket_lokalis' => '', + 'penunjang' => '', + 'diagnosis' => '', + 'tata' => '', + 'konsulrujuk' => '', + // Add dokter info for join compatibility + 'nm_dokter' => htmlspecialchars_array($dokter_info)['nm_dokter'] ?? '', + 'jk' => htmlspecialchars_array($dokter_info)['jk'] ?? '', + 'tmp_lahir' => htmlspecialchars_array($dokter_info)['tmp_lahir'] ?? '', + 'tgl_lahir' => htmlspecialchars_array($dokter_info)['tgl_lahir'] ?? '', + 'gol_drh' => htmlspecialchars_array($dokter_info)['gol_drh'] ?? '', + 'agama' => htmlspecialchars_array($dokter_info)['agama'] ?? '', + 'almt_tgl' => htmlspecialchars_array($dokter_info)['almt_tgl'] ?? '', + 'no_telp' => htmlspecialchars_array($dokter_info)['no_telp'] ?? '', + 'stts_nikah' => htmlspecialchars_array($dokter_info)['stts_nikah'] ?? '', + 'kd_sps' => htmlspecialchars_array($dokter_info)['kd_sps'] ?? '', + 'alumni' => htmlspecialchars_array($dokter_info)['alumni'] ?? '', + 'no_ijn_praktek' => htmlspecialchars_array($dokter_info)['no_ijn_praktek'] ?? '', + 'status' => htmlspecialchars_array($dokter_info)['status'] ?? '' + ]; + } + } + echo $this->draw('medis.ralan.html', [ 'reg_periksa' => $this->db('reg_periksa')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(), - 'penilaian_medis_ralan' => $this->db('penilaian_medis_ralan')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=penilaian_medis_ralan.kd_dokter')->oneArray(), + 'penilaian_medis_ralan' => $penilaian_medis_ralan, 'pasien' => $this->db('pasien')->where('no_rawat', revertNoRawat($no_rawat))->join('reg_periksa','pasien.no_rkm_medis=reg_periksa.no_rkm_medis')->oneArray(), 'dokter' => $this->db('dokter')->where('no_rawat', revertNoRawat($no_rawat))->join('reg_periksa','dokter.kd_dokter=reg_periksa.kd_dokter')->oneArray(), 'data_medisRalan' => $data_medisRalan @@ -1553,15 +1986,56 @@ public function getMedisRalan($no_rawat) public function getMedisRalanTampil($no_rawat) { - echo $this->draw('medis.ralan.tampil.html', ['penilaian_medis_ralan' => $this->db('penilaian_medis_ralan')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=penilaian_medis_ralan.kd_dokter')->oneArray()]); + echo $this->draw('medis.ralan.tampil.html', ['penilaian_medis_ralan' => htmlspecialchars_array($this->db('penilaian_medis_ralan')->where('no_rawat', revertNoRawat($no_rawat))->join('dokter', 'dokter.kd_dokter=penilaian_medis_ralan.kd_dokter')->toArray())]); exit(); } public function postMedisRalan() { $_POST['kd_dokter'] = $this->core->getUserInfo('username', $_SESSION['mlite_user']); - - if($this->db('penilaian_medis_ralan')->where('no_rawat', $_POST['no_rawat'])->where('kd_dokter', $_POST['kd_dokter'])->oneArray()) { + + // Handle edit mode + if(isset($_POST['mode']) && $_POST['mode'] == 'edit' && isset($_POST['original_tanggal'])) { + $this->db('penilaian_medis_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['original_tanggal']) + ->save([ + 'kd_dokter' => $_POST['kd_dokter'], + 'tanggal' => $_POST['tanggal'], + 'anamnesis' => $_POST['anamnesis'], + 'hubungan' => $_POST['hubungan'], + 'keluhan_utama' => $_POST['keluhan_utama'], + 'rps' => $_POST['rps'], + 'rpd' => $_POST['rpd'], + 'rpk' => $_POST['rpk'], + 'rpo' => $_POST['rpo'], + 'alergi' => $_POST['alergi'], + 'keadaan' => $_POST['keadaan'], + 'gcs' => $_POST['gcs'], + 'kesadaran' => $_POST['kesadaran'], + 'td' => $_POST['td'], + 'nadi' => $_POST['nadi'], + 'rr' => $_POST['rr'], + 'suhu' => $_POST['suhu'], + 'spo' => $_POST['spo'], + 'bb' => $_POST['bb'], + 'tb' => $_POST['tb'], + 'kepala' => $_POST['kepala'], + 'gigi' => $_POST['gigi'], + 'tht' => $_POST['tht'], + 'thoraks' => $_POST['thoraks'], + 'abdomen' => $_POST['abdomen'], + 'genital' => $_POST['genital'], + 'ekstremitas' => $_POST['ekstremitas'], + 'kulit' => $_POST['kulit'], + 'ket_fisik' => $_POST['ket_fisik'], + 'ket_lokalis' => $_POST['ket_lokalis'], + 'penunjang' => $_POST['penunjang'] , + 'diagnosis' => $_POST['diagnosis'], + 'tata' => $_POST['tata'], + 'konsulrujuk' => $_POST['konsulrujuk'] + ]); + } else if($this->db('penilaian_medis_ralan')->where('no_rawat', $_POST['no_rawat'])->where('kd_dokter', $_POST['kd_dokter'])->oneArray()) { $this->db('penilaian_medis_ralan') ->where('no_rawat', $_POST['no_rawat']) ->save([ @@ -1642,15 +2116,32 @@ public function postMedisRalan() exit(); } + public function postHapusmedisralan() + { + $this->db('penilaian_medis_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['tanggal']) + ->delete(); + exit(); + } + public function getSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'dokter_ralan', 'manage'])); + } $this->assign['title'] = 'Pengaturan Modul Dokter Ralan'; $this->assign['dokter_ralan'] = htmlspecialchars_array($this->settings('dokter_ralan')); - return $this->draw('settings.html', ['settings' => $this->assign]); + return $this->draw('settings.html', ['settings' => htmlspecialchars_array($this->assign)]); } public function postSaveSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'dokter_ralan', 'manage'])); + } foreach ($_POST['dokter_ralan'] as $key => $val) { $this->settings('dokter_ralan', $key, $val); } @@ -1677,7 +2168,7 @@ public function getSuratRujukan($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_rujukan')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/dokter_ralan/view/admin/surat.rujukan.html', true); exit(); } @@ -1701,7 +2192,7 @@ public function getSuratSehat($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sehat')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/dokter_ralan/view/admin/surat.sehat.html', true); exit(); } @@ -1725,7 +2216,7 @@ public function getSuratSakit($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sakit')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/dokter_ralan/view/admin/surat.sakit.html', true); exit(); } @@ -1733,7 +2224,6 @@ public function getSuratSakit($no_rawat) public function postSimpanSuratSakit() { $query = $this->db('mlite_surat_sakit')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -1753,16 +2243,15 @@ public function postSimpanSuratSakit() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; - $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + $data['msg'] = htmlspecialchars($query->errorInfo()['2'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -1771,7 +2260,6 @@ public function postSimpanSuratSakit() public function postSimpanSuratSehat() { $query = $this->db('mlite_surat_sehat')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -1792,16 +2280,15 @@ public function postSimpanSuratSehat() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; - $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + $data['msg'] = htmlspecialchars($query->errorInfo()['2'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -1810,7 +2297,6 @@ public function postSimpanSuratSehat() public function postSimpanSuratRujukan() { $query = $this->db('mlite_surat_rujukan')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -1832,21 +2318,470 @@ public function postSimpanSuratRujukan() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; - $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + $data['msg'] = htmlspecialchars($query->errorInfo()['2'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + echo json_encode(htmlspecialchars_array($data)); + } + + exit(); + } + + public function postSaveICD10() + { + $snomed_concept_id = trim((string) ($_POST['snomed_concept_id'] ?? '')); + $snomed_term = trim((string) ($_POST['snomed_term'] ?? '')); + $snomed_term = strip_tags($snomed_term); + $snomed_term = str_replace(["\r", "\n", "\t"], ' ', $snomed_term); + $snomed_term = preg_replace('/\s+/', ' ', $snomed_term); + $snomed_term = trim(mb_substr($snomed_term, 0, 255)); + $_POST['status_penyakit'] = 'Baru'; + unset($_POST['nama'], $_POST['snomed_concept_id'], $_POST['snomed_term']); + $this->db('diagnosa_pasien')->save($_POST); + if ($snomed_concept_id !== '' && $snomed_term !== '' && $this->isValidSnomedConceptId($snomed_concept_id)) { + $this->saveSnomedMappingICD( + $_POST['no_rawat'], + $_POST['kd_penyakit'], + $snomed_concept_id, + $snomed_term, + $_POST['status_penyakit'] + ); + } + exit(); + } + + public function postHapusICD10() + { + $diagnosa = $this->db('diagnosa_pasien') + ->where('no_rawat', $_POST['no_rawat']) + ->where('prioritas', $_POST['prioritas']) + ->oneArray(); + $this->db('diagnosa_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + if ($diagnosa) { + $masih_ada_diagnosa = $this->db('diagnosa_pasien') + ->where('no_rawat', $_POST['no_rawat']) + ->where('kd_penyakit', $diagnosa['kd_penyakit']) + ->oneArray(); + if (!$masih_ada_diagnosa) { + $this->db('mlite_mapping_snomed_icd') + ->where('no_rawat', $_POST['no_rawat']) + ->where('kd_penyakit', $diagnosa['kd_penyakit']) + ->delete(); + } + } + exit(); + } + + public function postICD10() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('penyakit')->like('kd_penyakit', $key)->orLike('nm_penyakit', $key)->asc('kd_penyakit')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + + exit(); + + } + + public function postSaveICD9() + { + $no_rawat = trim((string) ($_POST['no_rawat'] ?? '')); + $kd_tindakan = trim((string) ($_POST['kode'] ?? '')); + $snomed_concept_id = trim((string) ($_POST['snomed_concept_id'] ?? '')); + $snomed_term = trim((string) ($_POST['snomed_term'] ?? '')); + $snomed_term = strip_tags($snomed_term); + $snomed_term = str_replace(["\r", "\n", "\t"], ' ', $snomed_term); + $snomed_term = preg_replace('/\s+/', ' ', $snomed_term); + $snomed_term = trim(mb_substr($snomed_term, 0, 255)); + unset($_POST['nama'], $_POST['snomed_concept_id'], $_POST['snomed_term']); + $this->db('prosedur_pasien')->save($_POST); + if ($no_rawat !== '' && $kd_tindakan !== '' && $snomed_concept_id !== '' && $snomed_term !== '' && $this->isValidSnomedConceptId($snomed_concept_id)) { + $this->saveSnomedMappingICD9( + $no_rawat, + $kd_tindakan, + $snomed_concept_id, + $snomed_term + ); + } + exit(); + } + + public function postHapusICD9() + { + $prosedur = $this->db('prosedur_pasien') + ->where('no_rawat', $_POST['no_rawat']) + ->where('prioritas', $_POST['prioritas']) + ->oneArray(); + $this->db('prosedur_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + if ($prosedur) { + $masih_ada_prosedur = $this->db('prosedur_pasien') + ->where('no_rawat', $_POST['no_rawat']) + ->where('kode', $prosedur['kode']) + ->oneArray(); + if (!$masih_ada_prosedur) { + $this->db('mlite_mapping_snomed_icd9') + ->where('no_rawat', $_POST['no_rawat']) + ->where('kd_tindakan', $prosedur['kode']) + ->delete(); + } + } + exit(); + } + + public function postICD9() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('icd9')->like('kode', $key)->orLike('deskripsi_panjang', $key)->asc('kode')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + + exit(); + + } + + public function getDisplayICD() + { + $no_rawat = $_GET['no_rawat']; + $prosedurs = $this->db('prosedur_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $prosedur = []; + foreach ($prosedurs as $row_prosedur) { + $icd9 = $this->db('icd9')->where('kode', $row_prosedur['kode'])->oneArray(); + $row_prosedur['nama'] = $icd9['deskripsi_panjang']; + $prosedur[] = $row_prosedur; + } + + $diagnosas = $this->db('diagnosa_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $diagnosa = []; + foreach ($diagnosas as $row_diagnosa) { + $icd10 = $this->db('penyakit')->where('kd_penyakit', $row_diagnosa['kd_penyakit'])->oneArray(); + $row_diagnosa['nama'] = $icd10['nm_penyakit']; + $diagnosa[] = $row_diagnosa; + } + + $mapping_snomeds = $this->db('mlite_mapping_snomed_icd') + ->where('no_rawat', $no_rawat) + ->asc('kd_penyakit') + ->toArray(); + $mapping_snomed = []; + foreach ($mapping_snomeds as $row_mapping_snomed) { + $icd10 = $this->db('penyakit')->where('kd_penyakit', $row_mapping_snomed['kd_penyakit'])->oneArray(); + $row_mapping_snomed['nm_penyakit'] = $icd10 ? $icd10['nm_penyakit'] : ''; + $mapping_snomed[] = $row_mapping_snomed; + } + $mapping_snomeds_icd9 = $this->db('mlite_mapping_snomed_icd9') + ->where('no_rawat', $no_rawat) + ->asc('kd_tindakan') + ->toArray(); + $mapping_snomed_icd9 = []; + foreach ($mapping_snomeds_icd9 as $row_mapping_snomed_icd9) { + $icd9 = $this->db('icd9')->where('kode', $row_mapping_snomed_icd9['kd_tindakan'])->oneArray(); + $row_mapping_snomed_icd9['nm_tindakan'] = $icd9 ? $icd9['deskripsi_panjang'] : ''; + $mapping_snomed_icd9[] = $row_mapping_snomed_icd9; + } + + echo $this->draw('display.icd.html', [ + 'diagnosa' => htmlspecialchars_array($diagnosa), + 'prosedur' => htmlspecialchars_array($prosedur), + 'mapping_snomed' => htmlspecialchars_array($mapping_snomed), + 'mapping_snomed_icd9' => htmlspecialchars_array($mapping_snomed_icd9) + ]); + exit(); + } + + public function postSaveMappingSnomedIcd() + { + $no_rawat = trim((string) ($_POST['no_rawat'] ?? '')); + $kd_penyakit = trim((string) ($_POST['kd_penyakit'] ?? '')); + $snomed_concept_id = trim((string) ($_POST['snomed_concept_id'] ?? '')); + $snomed_term = trim((string) ($_POST['snomed_term'] ?? '')); + $status_penyakit = trim((string) ($_POST['status_penyakit'] ?? 'Baru')); + + $isPayloadEmpty = ($no_rawat === '' || $kd_penyakit === '' || $snomed_concept_id === '' || $snomed_term === ''); + if ($isPayloadEmpty) { + echo '0'; + exit(); + } + + if (!$this->isValidSnomedConceptId($snomed_concept_id)) { + echo '0'; + exit(); + } + + if (!$this->db('diagnosa_pasien')->where('no_rawat', $no_rawat)->where('kd_penyakit', $kd_penyakit)->oneArray()) { + echo '0'; + exit(); + } + + $this->saveSnomedMappingICD($no_rawat, $kd_penyakit, $snomed_concept_id, $snomed_term, $status_penyakit); + echo '1'; + exit(); + } + + public function postHapusMappingSnomedIcd() + { + $id = (int) ($_POST['id'] ?? 0); + $no_rawat = trim((string) ($_POST['no_rawat'] ?? '')); + + if ($id > 0 && $no_rawat !== '') { + $this->db('mlite_mapping_snomed_icd') + ->where('id', $id) + ->where('no_rawat', $no_rawat) + ->delete(); + } + + exit(); + } + + public function postSaveMappingSnomedIcd9() + { + $no_rawat = trim((string) ($_POST['no_rawat'] ?? '')); + $kd_tindakan = trim((string) ($_POST['kd_tindakan'] ?? '')); + $snomed_concept_id = trim((string) ($_POST['snomed_concept_id'] ?? '')); + $snomed_term = trim((string) ($_POST['snomed_term'] ?? '')); + + $isPayloadEmpty = ($no_rawat === '' || $kd_tindakan === '' || $snomed_concept_id === '' || $snomed_term === ''); + if ($isPayloadEmpty) { + echo '0'; + exit(); + } + + if (!$this->isValidSnomedConceptId($snomed_concept_id)) { + echo '0'; + exit(); } + $prosedur_exists = (bool) $this->db('prosedur_pasien') + ->where('no_rawat', $no_rawat) + ->where('kode', $kd_tindakan) + ->oneArray(); + if (!$prosedur_exists) { + echo '0'; + exit(); + } + + $this->saveSnomedMappingICD9($no_rawat, $kd_tindakan, $snomed_concept_id, $snomed_term); + echo '1'; exit(); } + public function postHapusMappingSnomedIcd9() + { + $id = (int) ($_POST['id'] ?? 0); + $no_rawat = trim((string) ($_POST['no_rawat'] ?? '')); + + if ($id > 0 && $no_rawat !== '') { + $this->db('mlite_mapping_snomed_icd9') + ->where('id', $id) + ->where('no_rawat', $no_rawat) + ->delete(); + } + + exit(); + } + + + private function saveSnomedMappingICD($no_rawat, $kd_penyakit, $snomed_concept_id, $snomed_term, $status_penyakit = 'Baru') + { + $status_penyakit = in_array($status_penyakit, self::ALLOWED_STATUS_PENYAKIT, true) ? $status_penyakit : 'Baru'; + $data_mapping = [ + 'no_rawat' => $no_rawat, + 'kd_penyakit' => $kd_penyakit, + 'snomed_concept_id' => $snomed_concept_id, + 'snomed_term' => $snomed_term, + 'status_penyakit' => $status_penyakit + ]; + + $mapping_tersimpan = $this->db('mlite_mapping_snomed_icd') + ->where('no_rawat', $no_rawat) + ->where('kd_penyakit', $kd_penyakit) + ->where('snomed_concept_id', $snomed_concept_id) + ->oneArray(); + + if ($mapping_tersimpan) { + $this->db('mlite_mapping_snomed_icd')->where('id', $mapping_tersimpan['id'])->save($data_mapping); + } else { + $this->db('mlite_mapping_snomed_icd')->save($data_mapping); + } + } + + private function saveSnomedMappingICD9($no_rawat, $kd_tindakan, $snomed_concept_id, $snomed_term) + { + $snomed_term = strip_tags((string) $snomed_term); + $snomed_term = str_replace(["\r", "\n", "\t"], ' ', $snomed_term); + $snomed_term = preg_replace('/\s+/', ' ', $snomed_term); + $snomed_term = trim(mb_substr($snomed_term, 0, 255)); + $data_mapping = [ + 'no_rawat' => $no_rawat, + 'kd_tindakan' => $kd_tindakan, + 'snomed_concept_id' => $snomed_concept_id, + 'snomed_term' => $snomed_term + ]; + + $mapping_tersimpan = $this->db('mlite_mapping_snomed_icd9') + ->where('no_rawat', $no_rawat) + ->where('kd_tindakan', $kd_tindakan) + ->where('snomed_concept_id', $snomed_concept_id) + ->oneArray(); + + if ($mapping_tersimpan) { + $this->db('mlite_mapping_snomed_icd9')->where('id', $mapping_tersimpan['id'])->save($data_mapping); + } else { + $this->db('mlite_mapping_snomed_icd9')->save($data_mapping); + } + } + + private function isValidSnomedConceptId($concept_id) + { + return preg_match('/^[1-9][0-9]{5,17}$/', (string) $concept_id) === 1; + } + + private function extractJsonObjectFromText($text) + { + $raw = trim((string) $text); + if (preg_match('/```(?:json)?\s*([\s\S]*?)```/i', $raw, $matches) && isset($matches[1])) { + $raw = trim($matches[1]); + } + + $start = strpos($raw, '{'); + $end = strrpos($raw, '}'); + if ($start !== false && $end !== false && $end > $start) { + $candidate = substr($raw, $start, $end - $start + 1); + $decoded = json_decode($candidate, true); + if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { + return $decoded; + } + } + + $decoded = json_decode($raw, true); + if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { + return $decoded; + } + + return []; + } + + public function postRujukanInternal() + { + try { + $query = $this->db('mlite_rujukan_internal_poli') + ->save([ + 'no_rawat' => $_POST['no_rawat'], + 'kd_poli' => $_POST['kd_poli'], + 'kd_dokter' => $_POST['kd_dokter'], + 'isi_rujukan' => $_POST['isi_rujukan'], + ]); + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data rujukan internal berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data rujukan internal']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function postGetRujukanInternal() + { + $rujukan = $this->db('mlite_rujukan_internal_poli')->where('no_rawat', $_POST['no_rawat'])->oneArray(); + if ($rujukan) { + $rujukan['isi_rujukan'] = htmlspecialchars($rujukan['isi_rujukan'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $rujukan['jawab_rujukan'] = htmlspecialchars($rujukan['jawab_rujukan'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + } + echo json_encode(htmlspecialchars_array($rujukan)); + exit(); + } + + public function postHapusrujukaninternal() + { + try { + // Get POST data + $no_rawat = isset($_POST['no_rawat']) ? $_POST['no_rawat'] : ''; + + if (empty($no_rawat)) { + echo json_encode(['status' => 'error', 'message' => 'No rawat tidak boleh kosong']); + exit(); + } + + // Delete rujukan internal + $result = $this->db('mlite_rujukan_internal_poli')->where('no_rawat', $no_rawat)->delete(); + + if ($result) { + echo json_encode(['status' => 'success', 'message' => 'Rujukan internal berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus rujukan internal atau data tidak ditemukan']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function postEditrujukaninternal() + { + try { + // Get POST data + $no_rawat = isset($_POST['no_rawat']) ? $_POST['no_rawat'] : ''; + $jawab_rujukan = isset($_POST['jawab_rujukan']) ? $_POST['jawab_rujukan'] : ''; + + if (empty($jawab_rujukan)) { + echo json_encode(['status' => 'error', 'message' => 'Jawaban rujukan tidak boleh kosong']); + exit(); + } + + // Update rujukan internal + $data = [ + 'jawab_rujukan' => $jawab_rujukan + ]; + + $result = $this->db('mlite_rujukan_internal_poli') + ->where('no_rawat', $no_rawat) + ->save($data); + + if ($result) { + echo json_encode(['status' => 'success', 'message' => 'Rujukan internal berhasil diupdate']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal mengupdate rujukan internal']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + public function getJavascript() { header('Content-type: text/javascript'); @@ -1855,9 +2790,14 @@ public function getJavascript() if($cek_pegawai) { $cek_role = $this->core->getPegawaiInfo('nik', $this->core->getUserInfo('username', $_SESSION['mlite_user'])); } + $this->assign = []; + $poliklinik = $this->db('poliklinik')->where('status', '1')->toArray(); + $dokter = $this->db('dokter')->where('status', '1')->toArray(); + $this->assign['poliklinik'] = $poliklinik; + $this->assign['dokter'] = $dokter; $this->assign['websocket'] = $this->settings->get('settings.websocket'); $this->assign['websocket_proxy'] = $this->settings->get('settings.websocket_proxy'); - echo $this->draw(MODULES.'/dokter_ralan/js/admin/dokter_ralan.js', ['cek_role' => $cek_role, 'mlite' => $this->assign]); + echo $this->draw(MODULES.'/dokter_ralan/js/admin/dokter_ralan.js', ['cek_role' => $cek_role, 'mlite' => htmlspecialchars_array($this->assign)]); exit(); } diff --git a/plugins/dokter_ralan/Help.md b/plugins/dokter_ralan/Help.md deleted file mode 100644 index 133e2fbb9..000000000 --- a/plugins/dokter_ralan/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
                  - -
                  diff --git a/plugins/dokter_ralan/Info.php b/plugins/dokter_ralan/Info.php index 3dc6d9ace..2fab792b6 100644 --- a/plugins/dokter_ralan/Info.php +++ b/plugins/dokter_ralan/Info.php @@ -4,13 +4,15 @@ 'name' => 'Dokter Ralan', 'description' => 'Modul dokter rawat jalan untuk mLITE', 'author' => 'Basoro', + 'category' => 'layanan', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'user-md', 'install' => function () use ($core) { $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('dokter_ralan', 'set_sudah', 'tidak')"); }, 'uninstall' => function() use($core) { + $core->db()->pdo()->exec("DELETE FROM `mlite_settings` WHERE `module` = 'dokter_ralan'"); } ]; diff --git a/plugins/dokter_ralan/README.md b/plugins/dokter_ralan/README.md new file mode 100644 index 000000000..3a085d1bf --- /dev/null +++ b/plugins/dokter_ralan/README.md @@ -0,0 +1,99 @@ +# Plugin Dokter Ralan + +Modul antarmuka dokter untuk pengelolaan rekam medis pasien rawat jalan di semua poliklinik (di luar IGD). + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Dokter Ralan**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Dokter Ralan + - Pengaturan + +## Panduan Pengguna (Petugas) + +Dokter/perawat rawat jalan menggunakan modul ini untuk mencatat seluruh proses pemeriksaan: + +1. **Dokter Ralan (Daftar Pasien Rawat Jalan)** + - Filter daftar pasien berdasarkan rentang tanggal kunjungan dan status periksa (Belum/Sudah). + - Tampilan pasien dapat dibatasi per dokter atau per poliklinik sesuai konfigurasi. + - Mendukung fitur panggil antrian dengan suara (ResponsiveVoice) jika diaktifkan. + +2. **Rincian Tindakan & Layanan** + - Tambahkan tindakan dan layanan yang diberikan kepada pasien rawat jalan. + - Hapus item rincian bila ada input yang salah. + +3. **SOAP (Subyektif–Obyektif–Asesmen–Plan)** + - Isi catatan SOAP: anamnesis, pemeriksaan fisik, diagnosis kerja, dan rencana terapi. + - Simpan atau hapus catatan SOAP. + +4. **Obat & Resep** + - Tambahkan resep obat jadi maupun obat racikan. + - Atur aturan pakai setiap item obat. + - Gunakan fitur **Copy Resep** untuk menduplikasi resep dari kunjungan sebelumnya. + - Lihat dan kelola e-Resep melalui tampilan eResep. + +5. **Laboratorium & Radiologi** + - Buat permintaan laboratorium atau radiologi untuk pasien. + - Hapus nomor/item permintaan bila diperlukan. + +6. **Kontrol** + - Jadwalkan atau catat kunjungan kontrol pasien rawat jalan. + - Dukung penjadwalan kontrol BPJS (surat kontrol BPJS/SEP) melalui `postSaveKontrolBPJS`. + - Simpan atau hapus jadwal kontrol. + +7. **Resume Medis Ralan** + - Isi resume medis pasien rawat jalan setelah pemeriksaan selesai. + - Simpan atau hapus resume. + +8. **Catatan Medis Ralan** + - Isi form catatan medis ralan (anamnesis, pemeriksaan, tindakan medis). + - Simpan atau hapus catatan medis. + +9. **Odontogram & OHIS** + - Untuk pasien poli gigi: isi kondisi gigi pada diagram odontogram. + - Catat skor OHIS (Oral Hygiene Index Simplified). + - Simpan atau hapus data odontogram/OHIS. + +10. **Surat Keterangan** + - Buat dan cetak **Surat Rujukan** ke fasilitas kesehatan lain. + - Buat dan cetak **Surat Keterangan Sehat**. + - Buat dan cetak **Surat Keterangan Sakit** (dengan tanggal sakit). + - Simpan masing-masing surat sesuai kebutuhan. + +11. **Rujukan Internal** + - Buat rujukan internal antar poliklinik dalam satu faskes. + - Edit atau hapus data rujukan internal. + +12. **Diagnosis ICD-10 & ICD-9** + - Cari dan tambahkan kode diagnosis ICD-10 (penyakit) dan ICD-9 (prosedur). + - Gunakan fitur **AI SNOMED mapping** untuk membantu pencarian kode ICD dari istilah klinis. + - Hapus kode diagnosis yang tidak sesuai. + +## Panduan Admin + +1. **Pengaturan Modul Dokter Ralan** + - Buka submenu **Pengaturan**. + - Simpan konfigurasi khusus modul dokter rawat jalan (mis. mode tampilan per dokter). + +2. **Pembatasan Tampilan Per Dokter** + - Aktifkan opsi `dokter_ralan_per_dokter` di pengaturan sistem agar setiap dokter hanya melihat pasien miliknya. + - Jika tidak diaktifkan, dokter melihat pasien sesuai poliklinik yang di-assign pada akunnya. + +3. **Data Master Pendukung** + - Pastikan data **poliklinik**, **dokter**, dan **penjab** aktif (status = 1) di master data. + - Pastikan mapping dokter ke kode BPJS (`maping_dokter_dpjpvclaim`) sudah diisi untuk fitur kontrol BPJS. + +4. **Fitur Panggil Antrian (ResponsiveVoice)** + - Aktifkan `settings.responsivevoice = true` agar sistem dapat memanggil nama pasien dengan suara. + +5. **Integrasi vClaim BPJS** + - Jika plugin vClaim terpasang dan aktif, fitur SEP/BPJS otomatis muncul di halaman Dokter Ralan. + +## Catatan + +- Modul ini menampilkan semua pasien rawat jalan di luar poliklinik IGD (difilter menggunakan kode `settings.igd`). +- Data SOAP, rincian, obat, laboratorium, dan radiologi terintegrasi langsung dengan modul billing. +- Fitur AI SNOMED mapping menggunakan layanan eksternal; pastikan koneksi internet tersedia. +- Surat rujukan, surat sehat, dan surat sakit dapat dicetak langsung dari halaman detail pasien. diff --git a/plugins/dokter_ralan/js/admin/dokter_ralan.js b/plugins/dokter_ralan/js/admin/dokter_ralan.js index 812fe5ce7..857ec70c7 100644 --- a/plugins/dokter_ralan/js/admin/dokter_ralan.js +++ b/plugins/dokter_ralan/js/admin/dokter_ralan.js @@ -10,6 +10,20 @@ $('#daftar_racikan').hide(); $("#info_tambahan").hide(); $("#form_kontrol").hide(); +// Inisialisasi jam_rawat saat halaman dibuka +$(function(){ + var baseURL = mlite.url + '/' + mlite.admin; + var $jr = $('input:text[name=jam_rawat]').last(); + if ($jr.length) { + $jr.focus(); + if (!$jr.val()) { + $.post(baseURL + '/dokter_ralan/cekwaktu?t=' + mlite.token, {}, function(data){ + $jr.val(data); + }); + } + } +}); + $("#display").on("click",".riwayat_perawatan", function(event){ var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); @@ -153,8 +167,8 @@ $("#form_soap").on("click", "#simpan_soap", function(event){ event.preventDefault(); var no_rawat = $('input:text[name=no_rawat]').val(); - var tgl_perawatan = $('input:text[name=tgl_perawatan]').val(); - var jam_rawat = $('input:text[name=jam_rawat]').val(); + var tgl_perawatan = $('#soap_tgl_perawatan').val(); + var jam_rawat = $('#soap_jam_rawat').val(); var suhu_tubuh = $('input:text[name=suhu_tubuh]').val(); var tensi = $('input:text[name=tensi]').val(); var nadi = $('input:text[name=nadi]').val(); @@ -223,10 +237,9 @@ $("#form_soap").on("click", "#simpan_soap", function(event){ $('input:text[name=spo2]').val(""); $('input:text[name=tgl_perawatan]').val("{?=date('Y-m-d')?}"); $('input:text[name=tgl_registrasi]').val("{?=date('Y-m-d')?}"); - //$('input:text[name=jam_rawat]').val("{?=date('H:i:s')?}"); $.post(baseURL + '/dokter_ralan/cekwaktu?t=' + mlite.token, { } ,function(data) { - $("#form_soap #jam_rawat").val(data); + $("#form_soap #soap_jam_rawat").val(data); }); $('#notif').html("
                  "+ "Data soap telah disimpan!"+ @@ -403,6 +416,7 @@ $("#form_kontrol").on("click", "#simpan_kontrol", function(event){ alasan1 : alasan1, rtl1 : rtl1 }, function(data) { + console.log(data); // tampilkan data $("#display").hide(); var url = baseURL + '/dokter_ralan/kontrol?t=' + mlite.token; @@ -626,8 +640,8 @@ $("#obat").on("click", ".pilih_obat", function(event){ var kode_brng = $(this).attr("data-kode_brng"); var nama_brng = $(this).attr("data-nama_brng"); var biaya = $(this).attr("data-dasar"); - var stok = $(this).attr("data-stok"); - var stokminimal = $(this).attr("data-stokminimal"); + var stok = parseFloat($(this).attr("data-stok")); + var stokminimal = parseFloat($(this).attr("data-stokminimal")); var kat = $(this).attr("data-kat"); if(stok < stokminimal) { @@ -682,7 +696,7 @@ $("#obat_racikan").on("click", ".pilih_obat_racikan", function(event){ var kode_brng = $(this).attr("data-kode_brng"); var nama_brng = $(this).attr("data-nama_brng"); var biaya = $(this).attr("data-dasar"); - var stok = $(this).attr("data-stok"); + var stok = parseFloat($(this).attr("data-stok")); if(stok < 1) { alert('Stok obat ' + nama_brng + ' tidak mencukupi.'); @@ -782,7 +796,7 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ var kode_provider = $('input:text[name=kode_provider]').val(); var kode_provider2 = $('input:text[name=kode_provider2]').val(); var tgl_perawatan = $('input:text[name=tgl_perawatan]').val(); - var jam_rawat = $('input:text[name=jam_reg]').val(); + var jam_rawat = $('input:text[name=jam_rawat]').last().val(); var biaya = $('input:text[name=biaya]').val(); var aturan_pakai = $('input:text[name=aturan_pakai]').val(); var kat = $('input:hidden[name=kat]').val(); @@ -849,7 +863,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ $('input:text[name=nm_perawatan]').val(""); $.post(baseURL + '/dokter_ralan/cekwaktu?t=' + mlite.token, { } ,function(data) { - $("#form_rincian #jam_reg").val(data); + $("#form_rincian #rincian_jam_reg").val(data); + $('input:text[name=jam_rawat]').last().val(data).focus(); }); $('input:hidden[name=kat]').val(""); $('input:text[name=biaya]').val(""); @@ -1081,18 +1096,44 @@ $("#rincian").on("click","#simpan_copy_resep", function(event){ var url = baseURL + '/dokter_ralan/rincian?t=' + mlite.token; var no_rawat = $('input:text[name=no_rawat]').val(); var tgl_perawatan = $('input:text[name=tgl_perawatan]').val(); - var jam_rawat = $('input:text[name=jam_reg]').val(); + var jam_rawat = $('input:text[name=jam_rawat]').val(); var kode_brng = JSON.stringify($('input:hidden[name=kode_brng_copyresep]').serializeArray()); var jml = JSON.stringify($('input:text[name=jml_copyresep]').serializeArray()); var aturan_pakai = JSON.stringify($('input:text[name=aturan_copyresep]').serializeArray()); - $.post(url_save, {no_rawat : no_rawat, + // Racikan Data + var nama_racik = JSON.stringify($('input:hidden[name=nama_racik_copyresep]').serializeArray()); + var kd_racik = JSON.stringify($('input:hidden[name=kd_racik_copyresep]').serializeArray()); + var keterangan = JSON.stringify($('input:hidden[name=keterangan_copyresep]').serializeArray()); + var no_racik = JSON.stringify($('input:hidden[name=no_racik_copyresep]').serializeArray()); + var jml_dr = JSON.stringify($('input:text[name=jml_dr_copyresep]').serializeArray()); + var aturan_pakai_racik = JSON.stringify($('input:text[name=aturan_pakai_copyresep]').serializeArray()); + + var data = { + no_rawat : no_rawat, tgl_perawatan : tgl_perawatan, jam_rawat : jam_rawat, kode_brng : kode_brng, jml : jml, - aturan_pakai : aturan_pakai - }, function(data) { + aturan_pakai : aturan_pakai, + nama_racik: nama_racik, + kd_racik: kd_racik, + keterangan: keterangan, + no_racik: no_racik, + jml_dr: jml_dr, + aturan_pakai_racik: aturan_pakai_racik + }; + + // Add dynamic racikan details + $('input:hidden[name^="no_racik_copyresep"]').each(function() { + var nr = $(this).val(); + data['kode_brng_racikan_' + nr] = JSON.stringify($('input:hidden[name="kode_brng_racikan_copyresep_' + nr + '"]').serializeArray()); + data['jml_racikan_' + nr] = JSON.stringify($('input:text[name="jml_racikan_copyresep_' + nr + '"]').serializeArray()); + data['p1_' + nr] = JSON.stringify($('input:hidden[name="p1_copyresep_' + nr + '"]').serializeArray()); + data['p2_' + nr] = JSON.stringify($('input:hidden[name="p2_copyresep_' + nr + '"]').serializeArray()); + }); + + $.post(url_save, data, function(data) { //alert(data); //if(data == 'ErrorError') { // alert('Stok tidak mencukupi pada satu atau lebih obat.'); @@ -1206,7 +1247,7 @@ $(document).ready(function () { dataType: 'json', success: function(data) { callback(data.slice(0, 100)); - console.log(data); + // console.log(data); }, error: function() { callback(); @@ -1230,7 +1271,7 @@ $(document).ready(function () { dataType: 'json', success: function(data) { callback(data.slice(0, 100)); - console.log(data); + // console.log(data); }, error: function() { callback(); @@ -1381,21 +1422,21 @@ $("#form_soap").on("click","#odontogram", function(event){ return false; }); -$("#form_soap").on("click","#jam_rawat", function(event){ +$("#form_soap").on("click","#soap_jam_rawat", function(event){ var baseURL = mlite.url + '/' + mlite.admin; var url = baseURL + '/dokter_ralan/cekwaktu?t=' + mlite.token; $.post(url, { } ,function(data) { - $("#form_soap #jam_rawat").val(data); + $("#form_soap #soap_jam_rawat").val(data); }); }); -$("#form_rincian").on("click","#jam_reg", function(event){ +$("#form_rincian").on("click","#rincian_jam_reg", function(event){ var baseURL = mlite.url + '/' + mlite.admin; var url = baseURL + '/dokter_ralan/cekwaktu?t=' + mlite.token; $.post(url, { } ,function(data) { - $("#form_rincian #jam_reg").val(data); + $("#form_rincian #rincian_jam_reg").val(data); }); }); @@ -1416,12 +1457,207 @@ $("#form_soap").on("click",".resume", function(event){ return false; }); +$("#form_soap").on("click",".assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $('input:text[name=no_rawat]').val().replace(/\//g, ''); + + var loadURL = baseURL + '/dokter_ralan/medisralan/' + no_rawat + '?t=' + mlite.token; + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + modalContent.load(loadURL); + }).modal(); + return false; +}); + +// Event delegation untuk rujuk internal - bekerja untuk elemen dinamis +$(document).on('click', 'a[href="#rujuk_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var url = baseURL + '/dokter_ralan/rujukaninternal?t=' + mlite.token; + var url_get = baseURL + '/dokter_ralan/getrujukaninternal?t=' + mlite.token; + + $.post(url_get, {no_rawat: no_rawat}, function(data) { + var rujukan = JSON.parse(data); + var kd_poli_val = ''; + var kd_dokter_val = ''; + var isi_rujukan_val = ''; + + + var disabled_attr = ''; + if(rujukan) { + kd_poli_val = rujukan.kd_poli; + kd_dokter_val = rujukan.kd_dokter; + isi_rujukan_val = rujukan.isi_rujukan; + jawab_rujukan_val = rujukan.jawab_rujukan; + disabled_attr = ' disabled'; + } + + var rujuk_internal = '' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + ''; + + // tampilkan dialog konfirmasi + bootbox.dialog({ + message: rujuk_internal, + title: 'Rujuk Internal', + buttons: { + main: { + label: 'Simpan', + className: 'btn-primary', + callback() { + var kd_poli = $('#kd_poli').val(); + var kd_dokter = $('#kd_dokter').val(); + var isi_rujukan = $('#isi_rujukan').val(); + var jawab_rujukan = $('#jawab_rujukan').val(); + $.post(url, { + no_rawat: no_rawat, + kd_poli: kd_poli, + kd_dokter: kd_dokter, + isi_rujukan: isi_rujukan, + jawab_rujukan: jawab_rujukan, + } ,function(data) { + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah simpan + $("#display").load(baseURL + '/dokter_ralan/display?t=' + mlite.token); + }); + } + } + } + }); + + // Set values for selects if they exist + if(kd_poli_val) { + $('#kd_poli').val(kd_poli_val); + } + if(kd_dokter_val) { + $('#kd_dokter').val(kd_dokter_val); + } + + $('select').not(':disabled').selectator(); + }); + + event.stopPropagation(); + return false; +}); + +// Event delegation untuk edit rujukan internal +$(document).on('click', 'a[href="#jawab_rujukan_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var dokter_tujuan = $(this).attr("data-dokter_tujuan"); + var poli_tujuan = $(this).attr("data-poli_tujuan"); + var keterangan = $(this).attr("data-keterangan"); + var keterangan_jawab = $(this).attr("data-keterangan_jawab"); + var url = baseURL + '/dokter_ralan/editrujukaninternal?t=' + mlite.token; + var edit_rujukan_internal = '' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + ''; + + // tampilkan dialog konfirmasi + bootbox.dialog({ + message: edit_rujukan_internal, + title: 'Jawab Rujukan Internal', + buttons: { + main: { + label: 'Update', + className: 'btn-primary', + callback() { + var jawab_rujukan = $('#jawab_rujukan').val(); + $.post(url, { + no_rawat: no_rawat, + jawab_rujukan: jawab_rujukan, + } ,function(data) { + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah update + $("#display").load(baseURL + '/dokter_ralan/display?t=' + mlite.token); + }); + } + } + } + }); + $('select').selectator(); + event.stopPropagation(); + return false; +}); + +// Event delegation untuk hapus rujukan internal +$(document).on('click', 'a[href="#hapus_rujukan_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var url = baseURL + '/dokter_ralan/hapusrujukaninternal?t=' + mlite.token; + + // tampilkan dialog konfirmasi + bootbox.confirm("Apakah Anda yakin ingin menghapus rujukan internal ini?", function(result){ + if (result){ + $.post(url, { + no_rawat: no_rawat + } ,function(data) { + // console.log(data); + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah hapus + $("#display").load(baseURL + '/dokter_ralan/display?t=' + mlite.token); + }); + } + }); + event.stopPropagation(); + return false; +}); + {if: $mlite.websocket == 'ya'} {if: $mlite.websocket_proxy != ''} var URL_WEBSOCKET = "{$mlite.websocket_proxy}"; {else} - var URL_WEBSOCKET = "ws://:3892"; + var URL_WEBSOCKET = "wss://:3892"; {/if} var ws = new WebSocket(URL_WEBSOCKET); @@ -1436,7 +1672,7 @@ $("#form_soap").on("click",".resume", function(event){ } } }catch(e){ - console.log(e); + // console.log(e); } } @@ -1455,4 +1691,4 @@ $("#form_soap").on("click",".resume", function(event){ },5000); } -{/if} \ No newline at end of file +{/if} diff --git a/plugins/dokter_ralan/view/admin/copyresep.display.html b/plugins/dokter_ralan/view/admin/copyresep.display.html index 46dbce542..8d9d809f0 100644 --- a/plugins/dokter_ralan/view/admin/copyresep.display.html +++ b/plugins/dokter_ralan/view/admin/copyresep.display.html @@ -10,16 +10,53 @@ - {if: $copy_resep} + {if: $copy_resep || $copy_resep_racikan}
                  + {if: $copy_resep} + + Obat Non-Racikan + {loop: $copy_resep} - $value.stok} class="selisih"{/if}>{$value.nama_brng} - - {$value.stok} - + $value.stok} class="selisih"{/if}>{?=isset_or($value.nama_brng)?} + + {?=isset_or($value.stok)?} + + + {/loop} + {/if} + + {if: $copy_resep_racikan} + + Obat Racikan + + {loop: $copy_resep_racikan} + + + {?=isset_or($value.nama_racik)?} + + + + + + + + Jumlah Racikan: + Aturan Pakai: + + {loop: $value.detail as $detail} + + $detail.stok} class="selisih"{/if} style="padding-left: 20px;"> + + - {?=isset_or($detail.nama_brng)?} + + + {?=isset_or($detail.stok)?} + {/loop} + {/loop} + {/if} diff --git a/plugins/dokter_ralan/view/admin/details.html b/plugins/dokter_ralan/view/admin/details.html index 37e8cd109..38acdc78f 100644 --- a/plugins/dokter_ralan/view/admin/details.html +++ b/plugins/dokter_ralan/view/admin/details.html @@ -19,14 +19,14 @@ {loop: $detail} - {$value.template_laboratorium.urut} - {$value.template_laboratorium.Pemeriksaan} - {$value.template_laboratorium.satuan} - {$value.template_laboratorium.nilai_rujukan_la} - {$value.template_laboratorium.nilai_rujukan_pa} - {$value.template_laboratorium.nilai_rujukan_ld} - {$value.template_laboratorium.nilai_rujukan_pd} - + {?=isset_or($value.template_laboratorium.urut)?} + {?=isset_or($value.template_laboratorium.Pemeriksaan)?} + {?=isset_or($value.template_laboratorium.satuan)?} + {?=isset_or($value.template_laboratorium.nilai_rujukan_la)?} + {?=isset_or($value.template_laboratorium.nilai_rujukan_pa)?} + {?=isset_or($value.template_laboratorium.nilai_rujukan_ld)?} + {?=isset_or($value.template_laboratorium.nilai_rujukan_pd)?} + {/loop} diff --git a/plugins/dokter_ralan/view/admin/display.html b/plugins/dokter_ralan/view/admin/display.html index ec638d38e..1f982acf5 100644 --- a/plugins/dokter_ralan/view/admin/display.html +++ b/plugins/dokter_ralan/view/admin/display.html @@ -1,72 +1,175 @@ +
                  -
                  - - - - - - - - - - - - - - - - - - - {loop: $rawat_jalan.list} - - + + + + + + + + + + + + + {/loop} + +
                  No. RMNama PasienID KunjunganAntrianPoliklinikDokterPenjaminNo. AsuransiTgl. KunjunganStts. PeriksaStts. LanjutStts. Bayar
                  - - {?=isset_or($value.nm_pasien)?}{?=isset_or($value.no_rawat)?} + {if: $responsivevoice == 'true'}{/if}{?=isset_or($value.nm_poli)?}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.png_jawab)?} {if: $value.kd_pj == 'BPJ'}{if: $value.potensi_prb != ''}{/if}{if: $this->core->ActiveModule('vclaim')} iCare{/if}{if: $this->core->ActiveModule('pcare')} iCare{/if}{/if}{?=isset_or($value.no_peserta)?}{?=isset_or($value.tgl_registrasi)?} {?=isset_or($value.jam_reg)?}{?=isset_or($value.stts)?}{?=isset_or($value.status_lanjut)?}{?=isset_or($value.status_bayar)?}
                  +
                  +
                  + +
                  +
                  + + + + + + + + + + + + + + + + + {loop: $rawat_jalan.list_rujukan_internal} + + + + + + + + + + + + + {/loop} + +
                  No. RMNama PasienID KunjunganPoli AsalPoli TujuanDokter PerujukDokter TujuanTgl. RujukanStatusAksi
                  {if: isset($value.no_rkm_medis)}{?=isset_or($value.no_rkm_medis)?}{else}-{/if}{if: isset($value.nm_pasien)}{?=isset_or($value.nm_pasien)?}{else}-{/if}{if: isset($value.no_rawat)}{?=isset_or($value.no_rawat)?}{else}-{/if}{if: isset($value.poli_asal)}{?=isset_or($value.poli_asal)?}{else}-{/if}{if: isset($value.poli_tujuan)}{?=isset_or($value.poli_tujuan)?}{else}-{/if}{if: isset($value.dokter_perujuk)}{?=isset_or($value.dokter_perujuk)?}{else}-{/if}{if: isset($value.dokter_tujuan)}{?=isset_or($value.dokter_tujuan)?}{else}-{/if}{if: isset($value.tgl_rujukan)}{?=isset_or($value.tgl_rujukan)?}{else}-{/if} + {if: isset($value.keterangan_jawab) && $value.keterangan_jawab != ''} + Sudah Dijawab + {else} + Belum Dijawab + {/if} + + JawabHapus +
                  +
                  +
                  @@ -119,29 +119,29 @@

                  Data Barang

                  {loop: $inventaris_barang} - {$value.kode_barang} - {$value.nama_barang} - {$value.jml_barang} - {$value.kode_produsen} - {$value.nama_produsen} - {$value.id_merk} - {$value.nama_merk} - {$value.thn_produksi} - {$value.isbn} - {$value.id_kategori} - {$value.nama_kategori} - {$value.id_jenis} - {$value.nama_jenis} + {?=isset_or($value.kode_barang)?} + {?=isset_or($value.nama_barang)?} + {?=isset_or($value.jml_barang)?} + {?=isset_or($value.kode_produsen)?} + {?=isset_or($value.nama_produsen)?} + {?=isset_or($value.id_merk)?} + {?=isset_or($value.nama_merk)?} + {?=isset_or($value.thn_produksi)?} + {?=isset_or($value.isbn)?} + {?=isset_or($value.id_kategori)?} + {?=isset_or($value.nama_kategori)?} + {?=isset_or($value.id_jenis)?} + {?=isset_or($value.nama_jenis)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.jenis.html b/plugins/inventaris/view/admin/data.jenis.html index 72e862c08..a8c5aee99 100644 --- a/plugins/inventaris/view/admin/data.jenis.html +++ b/plugins/inventaris/view/admin/data.jenis.html @@ -62,11 +62,11 @@

                  Data Jenis

                  {loop: $inventaris_jenis} - {$value.id_jenis} - {$value.nama_jenis} + {?=isset_or($value.id_jenis)?} + {?=isset_or($value.nama_jenis)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.kategori.html b/plugins/inventaris/view/admin/data.kategori.html index 08a13cd71..32c6c629e 100644 --- a/plugins/inventaris/view/admin/data.kategori.html +++ b/plugins/inventaris/view/admin/data.kategori.html @@ -62,11 +62,11 @@

                  Data Kategori

                  {loop: $inventaris_kategori} - {$value.id_kategori} - {$value.nama_kategori} + {?=isset_or($value.id_kategori)?} + {?=isset_or($value.nama_kategori)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.merk.html b/plugins/inventaris/view/admin/data.merk.html index a8c6fe343..9800de312 100644 --- a/plugins/inventaris/view/admin/data.merk.html +++ b/plugins/inventaris/view/admin/data.merk.html @@ -62,11 +62,11 @@

                  Data Merk

                  {loop: $inventaris_merk} - {$value.id_merk} - {$value.nama_merk} + {?=isset_or($value.id_merk)?} + {?=isset_or($value.nama_merk)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.pemeliharaan.html b/plugins/inventaris/view/admin/data.pemeliharaan.html index 24cd0a078..3218befe1 100644 --- a/plugins/inventaris/view/admin/data.pemeliharaan.html +++ b/plugins/inventaris/view/admin/data.pemeliharaan.html @@ -31,16 +31,16 @@

                  {loop: $pemeliharaan} - {$value.no_inventaris} - {$value.kode_barang} - {$value.nama_barang} - {$value.tanggal} - {$value.uraian_kegiatan} - {$value.nip} - {$value.nama} - {$value.pelaksana} - {$value.biaya} - {$value.jenis_pemeliharaan} + {?=isset_or($value.no_inventaris)?} + {?=isset_or($value.kode_barang)?} + {?=isset_or($value.nama_barang)?} + {?=isset_or($value.tanggal)?} + {?=isset_or($value.uraian_kegiatan)?} + {?=isset_or($value.nip)?} + {?=isset_or($value.nama)?} + {?=isset_or($value.pelaksana)?} + {?=isset_or($value.biaya)?} + {?=isset_or($value.jenis_pemeliharaan)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.peminjaman.html b/plugins/inventaris/view/admin/data.peminjaman.html index 5b279a388..5b4208dd3 100644 --- a/plugins/inventaris/view/admin/data.peminjaman.html +++ b/plugins/inventaris/view/admin/data.peminjaman.html @@ -20,7 +20,7 @@

                  @@ -44,7 +44,7 @@

                  @@ -87,24 +87,24 @@

                  {loop: $inventaris_peminjaman} - {$value.peminjam} - {$value.tlp} - {$value.no_inventaris} - {$value.kode_barang} - {$value.nama_barang} - {$value.tgl_pinjam} - {$value.tgl_kembali} - {$value.nip} - {$value.nama} - {$value.status_pinjam} + {?=isset_or($value.peminjam)?} + {?=isset_or($value.tlp)?} + {?=isset_or($value.no_inventaris)?} + {?=isset_or($value.kode_barang)?} + {?=isset_or($value.nama_barang)?} + {?=isset_or($value.tgl_pinjam)?} + {?=isset_or($value.tgl_kembali)?} + {?=isset_or($value.nip)?} + {?=isset_or($value.nama)?} + {?=isset_or($value.status_pinjam)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.permintaan.perbaikan.detail.html b/plugins/inventaris/view/admin/data.permintaan.perbaikan.detail.html index 53838814f..86256f1ba 100644 --- a/plugins/inventaris/view/admin/data.permintaan.perbaikan.detail.html +++ b/plugins/inventaris/view/admin/data.permintaan.perbaikan.detail.html @@ -4,11 +4,11 @@

                  Data Permintaan Perbaikan
                  {if: !$perbaikandetail} - Baru + Baru {/if} {if: $perbaikandetail} - Ubah - Hapus + Ubah + Hapus {/if}

                  @@ -26,11 +26,11 @@

                  - {$permintaan_perbaikan_inventaris.no_permintaan} - {$permintaan_perbaikan_inventaris.no_inventaris} - {$permintaan_perbaikan_inventaris.nik} - {$permintaan_perbaikan_inventaris.nama} - {$permintaan_perbaikan_inventaris.tanggal} - {$permintaan_perbaikan_inventaris.deskripsi_kerusakan} + {?=isset_or($permintaan_perbaikan_inventaris.no_permintaan)?} + {?=isset_or($permintaan_perbaikan_inventaris.no_inventaris)?} + {?=isset_or($permintaan_perbaikan_inventaris.nik)?} - {?=isset_or($permintaan_perbaikan_inventaris.nama)?} + {?=isset_or($permintaan_perbaikan_inventaris.tanggal)?} + {?=isset_or($permintaan_perbaikan_inventaris.deskripsi_kerusakan)?} {if: $perbaikandetail} @@ -42,7 +42,7 @@

                  Tanggal Perbaikan - {$perbaikandetail.tanggal} + {?=isset_or($perbaikandetail.tanggal)?} @@ -51,7 +51,7 @@

                  Status - {$perbaikandetail.status} + {?=isset_or($perbaikandetail.status)?} @@ -60,7 +60,7 @@

                  Uraian Kegiatan - {$perbaikandetail.uraian_kegiatan} + {?=isset_or($perbaikandetail.uraian_kegiatan)?} @@ -69,7 +69,7 @@

                  Petugas - {$perbaikandetail.nip} - {$perbaikandetail.nama} + {?=isset_or($perbaikandetail.nip)?} - {?=isset_or($perbaikandetail.nama)?} @@ -78,7 +78,7 @@

                  Pelaksana - {$perbaikandetail.pelaksana} + {?=isset_or($perbaikandetail.pelaksana)?} @@ -87,7 +87,7 @@

                  Keterangan - {$perbaikandetail.keterangan} + {?=isset_or($perbaikandetail.keterangan)?} {else} diff --git a/plugins/inventaris/view/admin/data.permintaan.perbaikan.html b/plugins/inventaris/view/admin/data.permintaan.perbaikan.html index f886352a6..c9108fd23 100644 --- a/plugins/inventaris/view/admin/data.permintaan.perbaikan.html +++ b/plugins/inventaris/view/admin/data.permintaan.perbaikan.html @@ -29,16 +29,16 @@

                  {loop: $perbaikan} - {$value.no_permintaan} - {$value.no_inventaris} - {$value.nik} - {$value.nama} - {$value.tanggal} - {$value.deskripsi_kerusakan} - {$value.status_perbaikan} + {?=isset_or($value.no_permintaan)?} + {?=isset_or($value.no_inventaris)?} + {?=isset_or($value.nik)?} - {?=isset_or($value.nama)?} + {?=isset_or($value.tanggal)?} + {?=isset_or($value.deskripsi_kerusakan)?} + {?=isset_or($value.status_perbaikan)?} - Tampil - Ubah - Hapus + Tampil + Ubah + Hapus {/loop} diff --git a/plugins/inventaris/view/admin/data.produsen.html b/plugins/inventaris/view/admin/data.produsen.html index 19c08c797..da961bfac 100644 --- a/plugins/inventaris/view/admin/data.produsen.html +++ b/plugins/inventaris/view/admin/data.produsen.html @@ -84,19 +84,19 @@

                  Data Produsen

                  {loop: $inventaris_produsen} - {$value.kode_produsen} - {$value.nama_produsen} - {$value.alamat_produsen} - {$value.no_telp} - {$value.email} - {$value.website_produsen} + {?=isset_or($value.kode_produsen)?} + {?=isset_or($value.nama_produsen)?} + {?=isset_or($value.alamat_produsen)?} + {?=isset_or($value.no_telp)?} + {?=isset_or($value.email)?} + {?=isset_or($value.website_produsen)?} {/loop} diff --git a/plugins/inventaris/view/admin/data.ruang.html b/plugins/inventaris/view/admin/data.ruang.html index 18e694510..22e8ad112 100644 --- a/plugins/inventaris/view/admin/data.ruang.html +++ b/plugins/inventaris/view/admin/data.ruang.html @@ -62,11 +62,11 @@

                  Data Ruang

                  {loop: $inventaris_ruang} - {$value.id_ruang} - {$value.nama_ruang} + {?=isset_or($value.id_ruang)?} + {?=isset_or($value.nama_ruang)?} {/loop} diff --git a/plugins/inventaris/view/admin/form.pemeliharaan.html b/plugins/inventaris/view/admin/form.pemeliharaan.html index c13de3d7a..985efb6c5 100644 --- a/plugins/inventaris/view/admin/form.pemeliharaan.html +++ b/plugins/inventaris/view/admin/form.pemeliharaan.html @@ -10,23 +10,23 @@

                  Form Perbaikan

                  - +
                  - +
                  @@ -40,7 +40,7 @@

                  Form Perbaikan

                  - +
                  diff --git a/plugins/inventaris/view/admin/form.perbaikan.html b/plugins/inventaris/view/admin/form.perbaikan.html index 315bfc245..aea537a35 100644 --- a/plugins/inventaris/view/admin/form.perbaikan.html +++ b/plugins/inventaris/view/admin/form.perbaikan.html @@ -8,21 +8,21 @@

                  Form Perbaikan

                  - +
                  - +
                  - +
                  @@ -36,11 +36,11 @@

                  Form Perbaikan

                  - +
                  - +
                  diff --git a/plugins/inventaris/view/admin/form.permintaan.perbaikan.html b/plugins/inventaris/view/admin/form.permintaan.perbaikan.html index 40dd5f5f0..067a6a37e 100644 --- a/plugins/inventaris/view/admin/form.permintaan.perbaikan.html +++ b/plugins/inventaris/view/admin/form.permintaan.perbaikan.html @@ -8,13 +8,13 @@

                  Form Permintaan Perbaikan

                  - +
                  @@ -22,17 +22,17 @@

                  Form Permintaan Perbaikan

                  - +
                  - +
                  diff --git a/plugins/inventaris/view/admin/manage.html b/plugins/inventaris/view/admin/manage.html index ef247d782..97eb6c350 100644 --- a/plugins/inventaris/view/admin/manage.html +++ b/plugins/inventaris/view/admin/manage.html @@ -109,12 +109,12 @@

                  Data Permintaan Perbaikan

                  {loop: $perbaikan} - {$value.no_permintaan} - {$value.no_inventaris} - {$value.nik} - {$value.nama} - {$value.tanggal} - {$value.deskripsi_kerusakan} - {$value.status_perbaikan} + {?=isset_or($value.no_permintaan)?} + {?=isset_or($value.no_inventaris)?} + {?=isset_or($value.nik)?} - {?=isset_or($value.nama)?} + {?=isset_or($value.tanggal)?} + {?=isset_or($value.deskripsi_kerusakan)?} + {?=isset_or($value.status_perbaikan)?} {/loop} diff --git a/plugins/jam_masuk/Admin.php b/plugins/jam_masuk/Admin.php deleted file mode 100644 index 7e5babbcb..000000000 --- a/plugins/jam_masuk/Admin.php +++ /dev/null @@ -1,194 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - return $this->draw('manage.html'); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_jam_masuk= $_POST['search_field_jam_masuk']; - $search_text_jam_masuk = $_POST['search_text_jam_masuk']; - - $searchQuery = " "; - if($search_text_jam_masuk != ''){ - $searchQuery .= " and (".$search_field_jam_masuk." like '%".$search_text_jam_masuk."%' ) "; - } - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from jam_masuk"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from jam_masuk WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from jam_masuk WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $data[] = array( - 'shift'=>$row['shift'], -'jam_masuk'=>$row['jam_masuk'], -'jam_pulang'=>$row['jam_pulang'] - - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=='add') { - - $shift = $_POST['shift']; -$jam_masuk = $_POST['jam_masuk']; -$jam_pulang = $_POST['jam_pulang']; - - - $jam_masuk_add = $this->db()->pdo()->prepare('INSERT INTO jam_masuk VALUES (?, ?, ?)'); - $jam_masuk_add->execute([$shift, $jam_masuk, $jam_pulang]); - - } - if ($act=="edit") { - - $shift = $_POST['shift']; -$jam_masuk = $_POST['jam_masuk']; -$jam_pulang = $_POST['jam_pulang']; - - - // BUANG FIELD PERTAMA - - $jam_masuk_edit = $this->db()->pdo()->prepare("UPDATE jam_masuk SET shift=?, jam_masuk=?, jam_pulang=? WHERE shift=?"); - $jam_masuk_edit->execute([$shift, $jam_masuk, $jam_pulang,$shift]); - - } - - if ($act=="del") { - $shift= $_POST['shift']; - $check_db = $this->db()->pdo()->prepare("DELETE FROM jam_masuk WHERE shift='$shift'"); - $result = $check_db->execute(); - $error = $check_db->errorInfo(); - if (!empty($result)){ - $data = array( - 'status' => 'success', - 'msg' => $no_rkm_medis - ); - } else { - $data = array( - 'status' => 'error', - 'msg' => $error['2'] - ); - } - echo json_encode($data); - } - - if ($act=="lihat") { - - $search_field_jam_masuk= $_POST['search_field_jam_masuk']; - $search_text_jam_masuk = $_POST['search_text_jam_masuk']; - - $searchQuery = " "; - if($search_text_jam_masuk != ''){ - $searchQuery .= " and (".$search_field_jam_masuk." like '%".$search_text_jam_masuk."%' ) "; - } - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from jam_masuk WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $data[] = array( - 'shift'=>$row['shift'], -'jam_masuk'=>$row['jam_masuk'], -'jam_pulang'=>$row['jam_pulang'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($shift) - { - $detail = $this->db('jam_masuk')->where('shift', $shift)->toArray(); - echo $this->draw('detail.html', ['detail' => $detail]); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/jam_masuk/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/jam_masuk/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - - $this->core->addCSS(url([ADMIN, 'jam_masuk', 'css'])); - $this->core->addJS(url([ADMIN, 'jam_masuk', 'javascript']), 'footer'); - } - -} diff --git a/plugins/jam_masuk/Info.php b/plugins/jam_masuk/Info.php deleted file mode 100644 index d3b0fcb06..000000000 --- a/plugins/jam_masuk/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Jam Masuk', - 'description' => 'Modul jam masuk untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/jam_masuk/js/admin/scripts.js b/plugins/jam_masuk/js/admin/scripts.js deleted file mode 100644 index 1525e32b6..000000000 --- a/plugins/jam_masuk/js/admin/scripts.js +++ /dev/null @@ -1,312 +0,0 @@ -jQuery().ready(function () { - var var_tbl_jam_masuk = $('#tbl_jam_masuk').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'jam_masuk','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_jam_masuk = $('#search_field_jam_masuk').val(); - var search_text_jam_masuk = $('#search_text_jam_masuk').val(); - - data.search_field_jam_masuk = search_field_jam_masuk; - data.search_text_jam_masuk = search_text_jam_masuk; - - } - }, - "columns": [ -{ 'data': 'shift' }, -{ 'data': 'jam_masuk' }, -{ 'data': 'jam_pulang' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // FORM VALIDASI - // ============================================================== - - $("form[name='form_jam_masuk']").validate({ - rules: { -shift: 'required', -jam_masuk: 'required', -jam_pulang: 'required' - - }, - messages: { -shift:'shift tidak boleh kosong!', -jam_masuk:'jam_masuk tidak boleh kosong!', -jam_pulang:'jam_pulang tidak boleh kosong!' - - }, - submitHandler: function (form) { - var shift= $('#shift').val(); -var jam_masuk= $('#jam_masuk').val(); -var jam_pulang= $('#jam_pulang').val(); - - var typeact = $('#typeact').val(); - - var formData = new FormData(form); // tambahan - formData.append('typeact', typeact); // tambahan - - $.ajax({ - url: "{?=url([ADMIN,'jam_masuk','aksi'])?}", - method: "POST", - contentType: false, // tambahan - processData: false, // tambahan - data: formData, - success: function (data) { - if (typeact == "add") { - alert("Data Berhasil Ditambah"); - } - else if (typeact == "edit") { - alert("Data Berhasil Diubah"); - } - $("#modal_cs").hide(); - location.reload(true); - } - }) - } - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - $('#search_text_jam_masuk').keyup(function () { - var_tbl_jam_masuk.draw(); - }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_jam_masuk").click(function () { - $("#search_text_jam_masuk").val(""); - var_tbl_jam_masuk.draw(); - }); - - // =========================================== - // Ketika tombol Edit di tekan - // =========================================== - - $("#edit_data_jam_masuk").click(function () { - var rowData = var_tbl_jam_masuk.rows({ selected: true }).data()[0]; - if (rowData != null) { - - var shift = rowData['shift']; -var jam_masuk = rowData['jam_masuk']; -var jam_pulang = rowData['jam_pulang']; - - - - $("#typeact").val("edit"); - - $('#shift').val(shift); -$('#jam_masuk').val(jam_masuk); -$('#jam_pulang').val(jam_pulang); - - //$("#shift").prop('disabled', true); // GA BISA DIEDIT KALI DISABLE - $('#modal-title').text("Edit Data Jam Masuk"); - $("#modal_jam_masuk").modal(); - } - else { - alert("Silakan pilih data yang akan di edit."); - } - - }); - - // ============================================================== - // TOMBOL DELETE DI CLICK - // ============================================================== - jQuery("#hapus_data_jam_masuk").click(function () { - var rowData = var_tbl_jam_masuk.rows({ selected: true }).data()[0]; - - - if (rowData) { -var shift = rowData['shift']; - var a = confirm("Anda yakin akan menghapus data dengan shift=" + shift); - if (a) { - - $.ajax({ - url: "{?=url([ADMIN,'jam_masuk','aksi'])?}", - method: "POST", - data: { - shift: shift, - typeact: 'del' - }, - success: function (data) { - data = JSON.parse(data); - if(data.status === 'success') { - alert(data.msg); - } else { - alert(data.msg); - } - location.reload(true); - } - }) - } - } - else { - alert("Pilih satu baris untuk dihapus"); - } - }); - - // ============================================================== - // TOMBOL TAMBAH DATA DI CLICK - // ============================================================== - jQuery("#tambah_data_jam_masuk").click(function () { - - $('#shift').val(''); -$('#jam_masuk').val(''); -$('#jam_pulang').val(''); - - - $("#typeact").val("add"); - $("#shift").prop('disabled', false); - - $('#modal-title').text("Tambah Data Jam Masuk"); - $("#modal_jam_masuk").modal(); - }); - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_jam_masuk").click(function () { - - var search_field_jam_masuk = $('#search_field_jam_masuk').val(); - var search_text_jam_masuk = $('#search_text_jam_masuk').val(); - - $.ajax({ - url: "{?=url([ADMIN,'jam_masuk','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_jam_masuk: search_field_jam_masuk, - search_text_jam_masuk: search_text_jam_masuk - }, - dataType: 'json', - success: function (res) { - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; - eTable += ''; -eTable += ''; -eTable += ''; - eTable += ""; - } - eTable += "
                  ShiftJam MasukJam Pulang
                  ' + res[i]['shift'] + '' + res[i]['jam_masuk'] + '' + res[i]['jam_pulang'] + '
                  "; - $('#forTable_jam_masuk').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_jam_masuk").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL jam_masuk DI CLICK - // ============================================================== - jQuery("#lihat_detail_jam_masuk").click(function (event) { - - var rowData = var_tbl_jam_masuk.rows({ selected: true }).data()[0]; - - if (rowData) { -var shift = rowData['shift']; - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/jam_masuk/detail/' + shift + '?t=' + mlite.token; - - var modal = $('#modal_detail_jam_masuk'); - var modalContent = $('#modal_detail_jam_masuk .modal-content'); - - modal.off('show.bs.modal'); - modal.on('show.bs.modal', function () { - modalContent.load(loadURL); - }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Jam Masuk", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_jam_masuk', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_jam_masuk.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_jam_masuk"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data jam_masuk"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/jam_masuk/view/admin/detail.html b/plugins/jam_masuk/view/admin/detail.html deleted file mode 100644 index 9c6857a95..000000000 --- a/plugins/jam_masuk/view/admin/detail.html +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/plugins/jam_masuk/view/admin/manage.html b/plugins/jam_masuk/view/admin/manage.html deleted file mode 100644 index 8607ca9ec..000000000 --- a/plugins/jam_masuk/view/admin/manage.html +++ /dev/null @@ -1,149 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - - - -
                  - - -
                  -
                  -
                  -
                  -
                  - Cari : - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - -
                  ShiftJam MasukJam Pulang
                  -
                  -
                  -
                  -
                  -
                  - - - - - - - diff --git a/plugins/jasa_medis/Admin.php b/plugins/jasa_medis/Admin.php new file mode 100644 index 000000000..2d551ab7a --- /dev/null +++ b/plugins/jasa_medis/Admin.php @@ -0,0 +1,300 @@ + 'manage', + 'Jasa Medis Dokter' => 'dokter', + 'Jasa Medis Perawat' => 'perawat', + ]; + } + + public function getManage() + { + $sub_modules = [ + ['name' => 'Jasa Medis', 'url' => url([ADMIN, 'jasa_medis', 'dokter']), 'icon' => 'user-md', 'desc' => 'Laporan remunerasi jasa medis dokter'], + ['name' => 'Jasa Paramedis', 'url' => url([ADMIN, 'jasa_medis', 'perawat']), 'icon' => 'user', 'desc' => 'Laporan remunerasi jasa paramedis perawat'], + ]; + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); + } + + public function getDokter(){ + $this->_addHeaderFiles(); + + $tgl_awal = isset_or($_GET['tgl_awal'], date('Y-m-d')); + $tgl_akhir = isset_or($_GET['tgl_akhir'], date('Y-m-d')); + $search = isset_or($_GET['search'], ''); + + $this->assign = []; + $dokter = $this->db('dokter')->select(['kd_dokter', 'nm_dokter'])->where('status', '1')->toArray(); + + $reg_periksa = $this->db('reg_periksa') + ->select(['dokter.kd_dokter', 'dokter.nm_dokter']) + ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') + ->where('tgl_registrasi', '>=', $tgl_awal) + ->where('tgl_registrasi', '<=', $tgl_akhir) + ->like('dokter.kd_dokter', '%'.$search.'%') + ->group('reg_periksa.kd_dokter') + ->toArray(); + $this->assign['grandtotal'] = 0; + $this->assign['dokter'] = []; // Initialize dokter array + foreach($reg_periksa as $row) { + $tgl_perawatan = $this->db('rawat_jl_dr') + ->select(['tgl_perawatan']) + ->where('kd_dokter', $row['kd_dokter']) + // ->where('stts_bayar', 'Sudah') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->group('tgl_perawatan') + ->toArray(); + + $row['total'] = 0; + $row['rawat_jl_dr'] = []; // Initialize array + foreach ($tgl_perawatan as $row2) { + + $row2['detail'] = $this->db('rawat_jl_dr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_dr.kd_jenis_prw') + ->join("(SELECT no_rawat, MAX(CONCAT(tgl_billing,' ', jam_billing)) AS max_waktu FROM mlite_billing GROUP BY no_rawat) latest", 'latest.no_rawat=rawat_jl_dr.no_rawat') + ->join('mlite_billing', "mlite_billing.no_rawat=rawat_jl_dr.no_rawat AND CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)=latest.max_waktu") + ->select(['rawat_jl_dr.no_rawat', 'rawat_jl_dr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_dr.tarif_tindakandr']) + ->select(['waktu_billing' => "CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)"]) + ->where('tgl_perawatan', $row2['tgl_perawatan']) + ->where('kd_dokter', $row['kd_dokter']) + ->toArray(); + $row2['subtotal'] = 0; + foreach($row2['detail'] as $row3) { + $row2['subtotal'] += $row3['tarif_tindakandr']; + } + $row['total'] += $row2['subtotal']; + $row['rawat_jl_dr'][] = $row2; + } + + $this->assign['grandtotal'] += $row['total']; + $this->assign['dokter'][] = $row; + } + + return $this->draw('dokter.html', [ + 'jasa_medis' => htmlspecialchars_array($this->assign), + 'dokter' => htmlspecialchars_array($dokter), + 'tgl_awal' => $tgl_awal, + 'tgl_akhir' => $tgl_akhir, + 'search' => $search + ]); + } + + public function getPerawat(){ + $this->_addHeaderFiles(); + + $tgl_awal = isset_or($_GET['tgl_awal'], date('Y-m-d')); + $tgl_akhir = isset_or($_GET['tgl_akhir'], date('Y-m-d')); + $search = isset_or($_GET['search'], ''); + + $this->assign = []; + $petugas = $this->db('petugas')->select(['nip', 'nama'])->where('status', '1')->toArray(); + + $reg_periksa = $this->db('rawat_jl_pr') + ->select(['petugas.nip', 'petugas.nama']) + ->join('petugas', 'petugas.nip=rawat_jl_pr.nip') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->like('petugas.nip', '%'.$search.'%') + ->group('rawat_jl_pr.nip') + ->toArray(); + $this->assign['grandtotal'] = 0; + $this->assign['petugas'] = []; // Initialize petugas array + foreach($reg_periksa as $row) { + $tgl_perawatan = $this->db('rawat_jl_pr') + ->select(['tgl_perawatan']) + ->where('nip', $row['nip']) + // ->where('stts_bayar', 'Sudah') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->group('tgl_perawatan') + ->toArray(); + + $row['total'] = 0; + $row['rawat_jl_pr'] = []; // Initialize array + foreach ($tgl_perawatan as $row2) { + + $row2['detail'] = $this->db('rawat_jl_pr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_pr.kd_jenis_prw') + ->join("(SELECT no_rawat, MAX(CONCAT(tgl_billing,' ', jam_billing)) AS max_waktu FROM mlite_billing GROUP BY no_rawat) latest", 'latest.no_rawat=rawat_jl_pr.no_rawat') + ->join('mlite_billing', "mlite_billing.no_rawat=rawat_jl_pr.no_rawat AND CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)=latest.max_waktu") + ->select(['rawat_jl_pr.no_rawat', 'rawat_jl_pr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_pr.tarif_tindakanpr']) + ->select(['waktu_billing' => "CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)"]) + ->where('tgl_perawatan', $row2['tgl_perawatan']) + ->where('nip', $row['nip']) + ->toArray(); + $row2['subtotal'] = 0; + foreach($row2['detail'] as $row3) { + $row2['subtotal'] += $row3['tarif_tindakanpr']; + } + $row['total'] += $row2['subtotal']; + $row['rawat_jl_pr'][] = $row2; + } + + $this->assign['grandtotal'] += $row['total']; + $this->assign['petugas'][] = $row; + } + + return $this->draw('perawat.html', [ + 'jasa_medis' => htmlspecialchars_array($this->assign), + 'petugas' => $petugas, + 'tgl_awal' => $tgl_awal, + 'tgl_akhir' => $tgl_akhir, + 'search' => $search + ]); + } + + public function postAksi() + { + if(isset($_POST['typeact'])){ + $act = $_POST['typeact']; + }else{ + $act = ''; + } + + if ($act=="lihat_dokter") { + $tgl_awal = $_POST['tgl_awal']; + $tgl_akhir = $_POST['tgl_akhir']; + $search = $_POST['search']; + + $this->assign = []; + $dokter = $this->db('reg_periksa') + ->select(['dokter.kd_dokter', 'dokter.nm_dokter']) + ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') + ->where('tgl_registrasi', '>=', $tgl_awal) + ->where('tgl_registrasi', '<=', $tgl_akhir) + ->like('dokter.kd_dokter', '%'.$search.'%') + ->group('reg_periksa.kd_dokter') + ->toArray(); + + $this->assign['grandtotal'] = 0; + $this->assign['dokter'] = []; + foreach($dokter as $row) { + $row['nm_dokter'] = htmlspecialchars($row['nm_dokter'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $tgl_perawatan = $this->db('rawat_jl_dr') + ->select(['tgl_perawatan']) + ->where('kd_dokter', $row['kd_dokter']) + // ->where('stts_bayar', 'Sudah') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->group('tgl_perawatan') + ->toArray(); + + $row['total'] = 0; + $row['rawat_jl_dr'] = []; + foreach ($tgl_perawatan as $row2) { + + $row2['detail'] = $this->db('rawat_jl_dr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_dr.kd_jenis_prw') + ->join("(SELECT no_rawat, MAX(CONCAT(tgl_billing,' ', jam_billing)) AS max_waktu FROM mlite_billing GROUP BY no_rawat) latest", 'latest.no_rawat=rawat_jl_dr.no_rawat') + ->join('mlite_billing', "mlite_billing.no_rawat=rawat_jl_dr.no_rawat AND CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)=latest.max_waktu") + ->select(['rawat_jl_dr.no_rawat', 'rawat_jl_dr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_dr.tarif_tindakandr']) + ->select(['waktu_billing' => "CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)"]) + ->where('tgl_perawatan', $row2['tgl_perawatan']) + ->where('kd_dokter', $row['kd_dokter']) + ->toArray(); + $row2['subtotal'] = 0; + foreach($row2['detail'] as &$row3) { + $row3['nm_perawatan'] = htmlspecialchars($row3['nm_perawatan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $row2['subtotal'] += $row3['tarif_tindakandr']; + } + $row['total'] += $row2['subtotal']; + $row['rawat_jl_dr'][] = $row2; + } + + $this->assign['grandtotal'] += $row['total']; + $this->assign['dokter'][] = $row; + } + + echo json_encode(htmlspecialchars_array($this->assign)); + } + + if ($act=="lihat_perawat") { + $tgl_awal = $_POST['tgl_awal']; + $tgl_akhir = $_POST['tgl_akhir']; + $search = $_POST['search']; + + $this->assign = []; + + $reg_periksa = $this->db('rawat_jl_pr') + ->select(['petugas.nip', 'petugas.nama']) + ->join('petugas', 'petugas.nip=rawat_jl_pr.nip') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->like('petugas.nip', '%'.$search.'%') + ->group('rawat_jl_pr.nip') + ->toArray(); + $this->assign['grandtotal'] = 0; + $this->assign['petugas'] = []; + foreach($reg_periksa as $row) { + $row['nama'] = htmlspecialchars($row['nama'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $tgl_perawatan = $this->db('rawat_jl_pr') + ->select(['tgl_perawatan']) + ->where('nip', $row['nip']) + // ->where('stts_bayar', 'Sudah') + ->where('tgl_perawatan', '>=', $tgl_awal) + ->where('tgl_perawatan', '<=', $tgl_akhir) + ->group('tgl_perawatan') + ->toArray(); + + $row['total'] = 0; + $row['rawat_jl_pr'] = []; + foreach ($tgl_perawatan as $row2) { + + $row2['detail'] = $this->db('rawat_jl_pr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_pr.kd_jenis_prw') + ->join("(SELECT no_rawat, MAX(CONCAT(tgl_billing,' ', jam_billing)) AS max_waktu FROM mlite_billing GROUP BY no_rawat) latest", 'latest.no_rawat=rawat_jl_pr.no_rawat') + ->join('mlite_billing', "mlite_billing.no_rawat=rawat_jl_pr.no_rawat AND CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)=latest.max_waktu") + ->select(['rawat_jl_pr.no_rawat', 'rawat_jl_pr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_pr.tarif_tindakanpr']) + ->select(['waktu_billing' => "CONCAT(mlite_billing.tgl_billing,' ',mlite_billing.jam_billing)"]) + ->where('tgl_perawatan', $row2['tgl_perawatan']) + ->where('nip', $row['nip']) + ->toArray(); + $row2['subtotal'] = 0; + foreach($row2['detail'] as &$row3) { + $row3['nm_perawatan'] = htmlspecialchars($row3['nm_perawatan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $row2['subtotal'] += $row3['tarif_tindakanpr']; + } + $row['total'] += $row2['subtotal']; + $row['rawat_jl_pr'][] = $row2; + } + + $this->assign['grandtotal'] += $row['total']; + $this->assign['petugas'][] = $row; + } + + echo json_encode(htmlspecialchars_array($this->assign)); + } + exit(); + } + + public function getJavascript() + { + header('Content-type: text/javascript'); + $settings = $this->settings('settings'); + echo $this->draw(MODULES.'/jasa_medis/js/admin/scripts.js', ['settings' => $settings]); + exit(); + } + + private function _addHeaderFiles() + { + $this->core->addJS(url('assets/jscripts/xlsx.js')); + $this->core->addJS(url('assets/jscripts/jspdf.min.js')); + $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); + $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); + $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); + $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); + + $this->core->addJS(url([ADMIN, 'jasa_medis', 'javascript']), 'footer'); + } + +} diff --git a/plugins/jasa_medis/Info.php b/plugins/jasa_medis/Info.php new file mode 100644 index 000000000..71392eff2 --- /dev/null +++ b/plugins/jasa_medis/Info.php @@ -0,0 +1,16 @@ + 'Jasa Medis', + 'description' => 'Modul jasa medis dokter dan perawat untuk mLITE', + 'author' => 'Basoro', + 'category' => 'keuangan', + 'version' => '1.0', + 'compatibility' => '6.*.*', + 'icon' => 'money', + 'install' => function () use ($core) { + }, + 'uninstall' => function() use($core) + { + } +]; \ No newline at end of file diff --git a/plugins/jasa_medis/README.md b/plugins/jasa_medis/README.md new file mode 100644 index 000000000..ec9289441 --- /dev/null +++ b/plugins/jasa_medis/README.md @@ -0,0 +1,49 @@ +# Plugin Jasa Medis + +Dokumentasi singkat penggunaan modul **Jasa Medis** di mLITE. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Jasa Medis**. +- Pilih submenu sesuai kebutuhan: + - Kelola (halaman utama) + - Jasa Medis Dokter + - Jasa Medis Perawat + +## Panduan Pengguna (Petugas) + +1. **Jasa Medis Dokter** + - Buka submenu **Jasa Medis Dokter**. + - Atur rentang tanggal pada filter **Tanggal Awal** dan **Tanggal Akhir**. + - Gunakan kolom pencarian untuk memfilter berdasarkan kode dokter jika diperlukan. + - Klik **Tampilkan** untuk memuat data remunerasi. + - Laporan menampilkan rincian tindakan per dokter per tanggal perawatan beserta tarif tindakan dokter. + - Gunakan tombol **Print** atau **Excel** untuk mengekspor laporan. + +2. **Jasa Medis Perawat** + - Buka submenu **Jasa Medis Perawat**. + - Atur rentang tanggal dan gunakan pencarian berdasarkan NIP petugas bila diperlukan. + - Klik **Tampilkan** untuk memuat data remunerasi paramedis/perawat. + - Laporan menampilkan rincian tindakan per perawat per tanggal perawatan beserta tarif tindakan paramedis. + - Gunakan tombol **Print** atau **Excel** untuk mengekspor laporan. + +## Panduan Admin + +1. **Tarif Tindakan Dokter** + - Data tarif jasa medis dokter (`tarif_tindakandr`) bersumber dari tabel `rawat_jl_dr` dan dikaitkan dengan tabel `jns_perawatan`. + - Pastikan tarif tindakan sudah diatur dengan benar di master data jenis perawatan agar perhitungan remunerasi akurat. + +2. **Tarif Tindakan Paramedis** + - Data tarif jasa paramedis (`tarif_tindakanpr`) bersumber dari tabel `rawat_jl_pr`. + - Verifikasi tarif di master data jenis perawatan secara berkala. + +3. **Data Billing** + - Plugin ini mengambil data billing dari tabel `mlite_billing`. + - Pastikan proses billing rawat jalan sudah berjalan dengan benar agar laporan jasa medis menampilkan data yang lengkap. + +## Catatan + +- Laporan hanya memuat data rawat jalan (rawat_jl_dr dan rawat_jl_pr); rawat inap menggunakan modul terpisah. +- Grand total remunerasi dihitung otomatis dari akumulasi semua tindakan dalam rentang tanggal yang dipilih. +- Pastikan data dokter dan petugas berstatus aktif agar muncul dalam laporan. diff --git a/plugins/jasa_medis/js/admin/scripts.js b/plugins/jasa_medis/js/admin/scripts.js new file mode 100644 index 000000000..c5e47893a --- /dev/null +++ b/plugins/jasa_medis/js/admin/scripts.js @@ -0,0 +1,238 @@ +jQuery().ready(function () { + + // =========================================== + // Ketika tombol lihat data dokter di tekan + // =========================================== + $("#lihat_data_dokter").click(function () { + var search = $('#search').val(); + var tgl_awal = $('#tgl_awal').val(); + var tgl_akhir = $('#tgl_akhir').val(); + + $.ajax({ + url: "{?=url([ADMIN,'jasa_medis','aksi'])?}", + method: "POST", + data: { + typeact: 'lihat_dokter', + search: search, + tgl_awal: tgl_awal, + tgl_akhir: tgl_akhir + }, + dataType: 'json', + success: function (res) { + // console.log(res); + var grandtotal = res['grandtotal']; + var res = res['dokter']; + var eTable = "
                  "; + for (var i = 0; i < res.length; i++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ''; + for (var ii = 0; ii < res[i]['rawat_jl_dr'].length; ii++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ''; + for (var iii = 0; iii < res[i]['rawat_jl_dr'][ii]['detail'].length; iii++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ""; + } + eTable += ''; + eTable += ''; + eTable += ''; + eTable += ""; + } + eTable += ''; + eTable += ''; + eTable += ''; + eTable += ''; + } + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ""; + eTable += "
                  Nama DokterDetail
                  ' + res[i]['nm_dokter'] + '
                  Tanggal : ' + res[i]['rawat_jl_dr'][ii]['tgl_perawatan'] + '
                  - ' + res[i]['rawat_jl_dr'][ii]['detail'][iii]['nm_perawatan'] + ' : Rp. ' + (res[i]['rawat_jl_dr'][ii]['detail'][iii]['tarif_tindakandr']/1000).toFixed(3) + '
                  Sub Total : Rp. ' + (res[i]['rawat_jl_dr'][ii]['subtotal']/1000).toFixed(3) + '
                  Total : Rp. ' + (res[i]['total']/1000).toFixed(3) + '
                  Grand TotalRp. ' + (grandtotal/1000).toFixed(3) + '
                  "; + $('#forTable_dokter').html(eTable); + } + }); + + $('#modal-title-dokter').text("Lihat Data Jasa Medis Dokter"); + $("#modal_lihat_dokter").modal(); + }); + + // =========================================== + // Ketika tombol lihat data perawat di tekan + // =========================================== + $("#lihat_data_perawat").click(function () { + var search = $('#search_perawat').val(); + var tgl_awal = $('#tgl_awal_perawat').val(); + var tgl_akhir = $('#tgl_akhir_perawat').val(); + + $.ajax({ + url: "{?=url([ADMIN,'jasa_medis','aksi'])?}", + method: "POST", + data: { + typeact: 'lihat_perawat', + search: search, + tgl_awal: tgl_awal, + tgl_akhir: tgl_akhir + }, + dataType: 'json', + success: function (res) { + console.log(res); + var grandtotal = res['grandtotal']; + var res = res['petugas']; + var eTable = "
                  "; + for (var i = 0; i < res.length; i++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ''; + for (var ii = 0; ii < res[i]['rawat_jl_pr'].length; ii++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ''; + for (var iii = 0; iii < res[i]['rawat_jl_pr'][ii]['detail'].length; iii++) { + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ""; + } + eTable += ''; + eTable += ''; + eTable += ''; + eTable += ""; + } + eTable += ''; + eTable += ''; + eTable += ''; + eTable += ''; + } + eTable += ""; + eTable += ''; + eTable += ''; + eTable += ""; + eTable += "
                  Nama PerawatDetail
                  ' + res[i]['nama'] + '
                  Tanggal : ' + res[i]['rawat_jl_pr'][ii]['tgl_perawatan'] + '
                  - ' + res[i]['rawat_jl_pr'][ii]['detail'][iii]['nm_perawatan'] + ' : Rp. ' + (res[i]['rawat_jl_pr'][ii]['detail'][iii]['tarif_tindakanpr']/1000).toFixed(3) + '
                  Sub Total : Rp. ' + (res[i]['rawat_jl_pr'][ii]['subtotal']/1000).toFixed(3) + '
                  Total : Rp. ' + (res[i]['total']/1000).toFixed(3) + '
                  Grand TotalRp. ' + (grandtotal/1000).toFixed(3) + '
                  "; + $('#forTable_perawat').html(eTable); + } + }); + + $('#modal-title-perawat').text("Lihat Data Jasa Medis Perawat"); + $("#modal_lihat_perawat").modal(); + }); + + // =========================================== + // Ketika tombol export pdf dokter di tekan + // =========================================== + $("#export_pdf_dokter").click(function () { + var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ + var img = "{?=base64_encode(file_get_contents(url(ADMIN . '/' . $settings['logo'])))?}"; + doc.addImage(img, 'JPEG', 20, 10, 50, 50); + doc.setFontSize(20); + doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); + doc.setFontSize(10); + doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); + doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); + doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ + doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ + doc.setFontSize(14); + doc.text("Tabel Jasa Medis Dokter", 20, 95, null, null, null); + const totalPagesExp = "{total_pages_count_string}"; + doc.autoTable({ + html: '#tbl_lihat_dokter', + startY: 105, + margin: { + left: 20, + right: 20 + }, + styles: { + fontSize: 10, + cellPadding: 5 + }, + didDrawPage: data => { + let footerStr = "Page " + doc.internal.getNumberOfPages(); + if (typeof doc.putTotalPages === 'function') { + footerStr = footerStr + " of " + totalPagesExp; + } + doc.setFontSize(10); + doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); + } + }); + if (typeof doc.putTotalPages === 'function') { + doc.putTotalPages(totalPagesExp); + } + window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); + }); + + // =========================================== + // Ketika tombol export pdf perawat di tekan + // =========================================== + $("#export_pdf_perawat").click(function () { + var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ + var img = "{?=base64_encode(file_get_contents(url(ADMIN . '/' . $settings['logo'])))?}"; + doc.addImage(img, 'JPEG', 20, 10, 50, 50); + doc.setFontSize(20); + doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); + doc.setFontSize(10); + doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); + doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); + doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ + doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ + doc.setFontSize(14); + doc.text("Tabel Jasa Medis Perawat", 20, 95, null, null, null); + const totalPagesExp = "{total_pages_count_string}"; + doc.autoTable({ + html: '#tbl_lihat_perawat', + startY: 105, + margin: { + left: 20, + right: 20 + }, + styles: { + fontSize: 10, + cellPadding: 5 + }, + didDrawPage: data => { + let footerStr = "Page " + doc.internal.getNumberOfPages(); + if (typeof doc.putTotalPages === 'function') { + footerStr = footerStr + " of " + totalPagesExp; + } + doc.setFontSize(10); + doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); + } + }); + if (typeof doc.putTotalPages === 'function') { + doc.putTotalPages(totalPagesExp); + } + window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); + }); + + // =========================================== + // Ketika tombol export xlsx dokter di tekan + // =========================================== + $("#export_xlsx_dokter").click(function () { + let tbl1 = document.getElementById("tbl_lihat_dokter"); + let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); + let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); + let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); + const new_workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data dokter"); + XLSX.writeFile(new_workbook, 'jasa_medis_dokter.xls'); + }); + + // =========================================== + // Ketika tombol export xlsx perawat di tekan + // =========================================== + $("#export_xlsx_perawat").click(function () { + let tbl1 = document.getElementById("tbl_lihat_perawat"); + let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); + let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); + let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); + const new_workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data perawat"); + XLSX.writeFile(new_workbook, 'jasa_medis_perawat.xls'); + }); +}); \ No newline at end of file diff --git a/plugins/jasa_medis_dokter/view/admin/manage.html b/plugins/jasa_medis/view/admin/dokter.html similarity index 85% rename from plugins/jasa_medis_dokter/view/admin/manage.html rename to plugins/jasa_medis/view/admin/dokter.html index 31563eb0e..0e9000817 100644 --- a/plugins/jasa_medis_dokter/view/admin/manage.html +++ b/plugins/jasa_medis/view/admin/dokter.html @@ -2,7 +2,7 @@
                  -

                  Kelola

                  +

                  Jasa Medis Dokter

                  @@ -20,7 +20,7 @@

                  Kelola

                  @@ -48,18 +48,18 @@

                  Kelola

                  {loop: isset_or($jasa_medis.dokter, [])} - {$value.nm_dokter} + {?=isset_or($value.nm_dokter)?} {loop: isset_or($value.rawat_jl_dr, []) as $data} - Tanggal : {$data.tgl_perawatan} + Tanggal : {?=isset_or($data.tgl_perawatan)?} {loop: isset_or($data.detail, []) as $hasil} - - {$hasil.nm_perawatan} : Rp. {?=number_format($hasil.tarif_tindakandr,0,',','.')?} + - {?=isset_or($hasil.nm_perawatan)?} : Rp. {?=number_format($hasil.tarif_tindakandr,0,',','.')?} {/loop} @@ -88,7 +88,7 @@

                  Kelola

                  - - + \ No newline at end of file diff --git a/plugins/jasa_medis/view/admin/manage.html b/plugins/jasa_medis/view/admin/manage.html new file mode 100644 index 000000000..bdf53d77c --- /dev/null +++ b/plugins/jasa_medis/view/admin/manage.html @@ -0,0 +1,21 @@ +
                  +
                  + +
                  +
                  diff --git a/plugins/jasa_medis_perawat/view/admin/manage.html b/plugins/jasa_medis/view/admin/perawat.html similarity index 79% rename from plugins/jasa_medis_perawat/view/admin/manage.html rename to plugins/jasa_medis/view/admin/perawat.html index c5d7e095d..bccc67b79 100644 --- a/plugins/jasa_medis_perawat/view/admin/manage.html +++ b/plugins/jasa_medis/view/admin/perawat.html @@ -2,7 +2,7 @@
                  -

                  Kelola

                  +

                  Jasa Medis Perawat

                  @@ -17,18 +17,18 @@

                  Kelola

                  - {loop: $petugas} - + {/loop} - + - + @@ -48,18 +48,18 @@

                  Kelola

                  {loop: isset_or($jasa_medis.petugas, [])} - {$value.nama} + {?=isset_or($value.nama)?} {loop: isset_or($value.rawat_jl_pr, []) as $data} - Tanggal : {$data.tgl_perawatan} + Tanggal : {?=isset_or($data.tgl_perawatan)?} {loop: isset_or($data.detail, []) as $hasil} - - {$hasil.nm_perawatan} : Rp. {?=number_format($hasil.tarif_tindakanpr,0,',','.')?} + - {?=isset_or($hasil.nm_perawatan)?} : Rp. {?=number_format($hasil.tarif_tindakanpr,0,',','.')?} {/loop} @@ -88,7 +88,7 @@

                  Kelola

                  - - + \ No newline at end of file diff --git a/plugins/jasa_medis_dokter/Admin.php b/plugins/jasa_medis_dokter/Admin.php deleted file mode 100644 index ed4e032a9..000000000 --- a/plugins/jasa_medis_dokter/Admin.php +++ /dev/null @@ -1,153 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - - $tgl_awal = isset_or($_GET['tgl_awal'], date('Y-m-d')); - $tgl_akhir = isset_or($_GET['tgl_akhir'], date('Y-m-d')); - $search = isset_or($_GET['search'], ''); - - $this->assign = []; - $dokter = $this->db('dokter')->select(['kd_dokter', 'nm_dokter'])->where('status', '1')->toArray(); - - $reg_periksa = $this->db('reg_periksa') - ->select(['dokter.kd_dokter', 'dokter.nm_dokter']) - ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') - ->where('tgl_registrasi', '>=', $tgl_awal) - ->where('tgl_registrasi', '<=', $tgl_akhir) - ->like('dokter.kd_dokter', '%'.$search.'%') - ->group('reg_periksa.kd_dokter') - ->toArray(); - $this->assign['grandtotal'] = 0; - foreach($reg_periksa as $row) { - $tgl_perawatan = $this->db('rawat_jl_dr') - ->select(['tgl_perawatan']) - ->where('kd_dokter', $row['kd_dokter']) - // ->where('stts_bayar', 'Sudah') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->group('tgl_perawatan') - ->toArray(); - - $row['total'] = 0; - foreach ($tgl_perawatan as $row2) { - - $row2['detail'] = $this->db('rawat_jl_dr') - ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_dr.kd_jenis_prw') - ->select(['rawat_jl_dr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_dr.tarif_tindakandr']) - ->where('tgl_perawatan', $row2['tgl_perawatan']) - ->where('kd_dokter', $row['kd_dokter']) - // ->where('stts_bayar', 'Sudah') - ->toArray(); - $row2['subtotal'] = 0; - foreach($row2['detail'] as $row3) { - $row2['subtotal'] += $row3['tarif_tindakandr']; - } - $row['total'] += $row2['subtotal']; - $row['rawat_jl_dr'][] = $row2; - } - - $this->assign['grandtotal'] += $row['total']; - $this->assign['dokter'][] = $row; - } - // echo json_encode($this->assign); - // exit(); - return $this->draw('manage.html', ['jasa_medis' => $this->assign, 'dokter' => $dokter]); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=="lihat") { - - $tgl_awal = $_POST['tgl_awal']; - $tgl_akhir = $_POST['tgl_akhir']; - $search = $_POST['search']; - - $this->assign = []; - $dokter = $this->db('reg_periksa') - ->select(['dokter.kd_dokter', 'dokter.nm_dokter']) - ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') - ->where('tgl_registrasi', '>=', $tgl_awal) - ->where('tgl_registrasi', '<=', $tgl_akhir) - ->like('dokter.kd_dokter', '%'.$search.'%') - ->group('reg_periksa.kd_dokter') - ->toArray(); - - $this->assign['grandtotal'] = 0; - foreach($dokter as $row) { - $tgl_perawatan = $this->db('rawat_jl_dr') - ->select(['tgl_perawatan']) - ->where('kd_dokter', $row['kd_dokter']) - // ->where('stts_bayar', 'Sudah') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->group('tgl_perawatan') - ->toArray(); - - $row['total'] = 0; - foreach ($tgl_perawatan as $row2) { - - $row2['detail'] = $this->db('rawat_jl_dr') - ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_dr.kd_jenis_prw') - ->select(['rawat_jl_dr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_dr.tarif_tindakandr']) - ->where('tgl_perawatan', $row2['tgl_perawatan']) - ->where('kd_dokter', $row['kd_dokter']) - // ->where('stts_bayar', 'Sudah') - ->toArray(); - $row2['subtotal'] = 0; - foreach($row2['detail'] as $row3) { - $row2['subtotal'] += $row3['tarif_tindakandr']; - } - $row['total'] += $row2['subtotal']; - $row['rawat_jl_dr'][] = $row2; - } - - $this->assign['grandtotal'] += $row['total']; - $this->assign['dokter'][] = $row; - } - - echo json_encode($this->assign); - } - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/jasa_medis_dokter/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); - $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); - $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); - - $this->core->addJS(url([ADMIN, 'jasa_medis_dokter', 'javascript']), 'footer'); - } - -} diff --git a/plugins/jasa_medis_dokter/Info.php b/plugins/jasa_medis_dokter/Info.php deleted file mode 100644 index 61767fa90..000000000 --- a/plugins/jasa_medis_dokter/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Jasa Medis Dokter', - 'description' => 'Modul dokter untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/jasa_medis_dokter/js/admin/scripts.js b/plugins/jasa_medis_dokter/js/admin/scripts.js deleted file mode 100644 index e467c7217..000000000 --- a/plugins/jasa_medis_dokter/js/admin/scripts.js +++ /dev/null @@ -1,124 +0,0 @@ -jQuery().ready(function () { - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_dokter").click(function () { - var search = $('#search').val(); - var tgl_awal = $('#tgl_awal').val(); - var tgl_akhir = $('#tgl_akhir').val(); - - - $.ajax({ - url: "{?=url([ADMIN,'jasa_medis_dokter','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search: search, - tgl_awal: tgl_awal, - tgl_akhir: tgl_akhir - }, - dataType: 'json', - success: function (res) { - console.log(res); - var grandtotal = res['grandtotal']; - var res = res['dokter']; - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ''; - for (var ii = 0; ii < res[i]['rawat_jl_dr'].length; ii++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ''; - for (var iii = 0; iii < res[i]['rawat_jl_dr'][ii]['detail'].length; iii++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ""; - } - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ""; - } - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - } - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ""; - eTable += "
                  Nama DokterDetail
                  ' + res[i]['nm_dokter'] + '
                  Tanggal : ' + res[i]['rawat_jl_dr'][ii]['tgl_perawatan'] + '
                  - ' + res[i]['rawat_jl_dr'][ii]['detail'][iii]['nm_perawatan'] + ' : Rp. ' + (res[i]['rawat_jl_dr'][ii]['detail'][iii]['tarif_tindakandr']/1000).toFixed(3) + '
                  Sub Total : Rp. ' + (res[i]['rawat_jl_dr'][ii]['subtotal']/1000).toFixed(3) + '
                  Total : Rp. ' + (res[i]['total']/1000).toFixed(3) + '
                  Grand TotalRp. ' + (grandtotal/1000).toFixed(3) + '
                  "; - $('#forTable_dokter').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_dokter").modal(); - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Jasa Medis Dokter", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_dokter', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_dokter.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_dokter"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data dokter"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/jasa_medis_perawat/Admin.php b/plugins/jasa_medis_perawat/Admin.php deleted file mode 100644 index 10f30146c..000000000 --- a/plugins/jasa_medis_perawat/Admin.php +++ /dev/null @@ -1,153 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - - $tgl_awal = isset_or($_GET['tgl_awal'], date('Y-m-d')); - $tgl_akhir = isset_or($_GET['tgl_akhir'], date('Y-m-d')); - $search = isset_or($_GET['search'], ''); - - $this->assign = []; - $petugas = $this->db('petugas')->select(['nip', 'nama'])->where('status', '1')->toArray(); - - $reg_periksa = $this->db('rawat_jl_pr') - ->select(['petugas.nip', 'petugas.nama']) - ->join('petugas', 'petugas.nip=rawat_jl_pr.nip') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->like('petugas.nip', '%'.$search.'%') - ->group('rawat_jl_pr.nip') - ->toArray(); - $this->assign['grandtotal'] = 0; - foreach($reg_periksa as $row) { - $tgl_perawatan = $this->db('rawat_jl_pr') - ->select(['tgl_perawatan']) - ->where('nip', $row['nip']) - // ->where('stts_bayar', 'Sudah') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->group('tgl_perawatan') - ->toArray(); - - $row['total'] = 0; - foreach ($tgl_perawatan as $row2) { - - $row2['detail'] = $this->db('rawat_jl_pr') - ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_pr.kd_jenis_prw') - ->select(['rawat_jl_pr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_pr.tarif_tindakanpr']) - ->where('tgl_perawatan', $row2['tgl_perawatan']) - ->where('nip', $row['nip']) - // ->where('stts_bayar', 'Sudah') - ->toArray(); - $row2['subtotal'] = 0; - foreach($row2['detail'] as $row3) { - $row2['subtotal'] += $row3['tarif_tindakanpr']; - } - $row['total'] += $row2['subtotal']; - $row['rawat_jl_pr'][] = $row2; - } - - $this->assign['grandtotal'] += $row['total']; - $this->assign['petugas'][] = $row; - } - // echo json_encode($this->assign); - // exit(); - return $this->draw('manage.html', ['jasa_medis' => $this->assign, 'petugas' => $petugas]); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=="lihat") { - - $tgl_awal = $_POST['tgl_awal']; - $tgl_akhir = $_POST['tgl_akhir']; - $search = $_POST['search']; - - $this->assign = []; - - $reg_periksa = $this->db('rawat_jl_pr') - ->select(['petugas.nip', 'petugas.nama']) - ->join('petugas', 'petugas.nip=rawat_jl_pr.nip') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->like('petugas.nip', '%'.$search.'%') - ->group('rawat_jl_pr.nip') - ->toArray(); - $this->assign['grandtotal'] = 0; - foreach($reg_periksa as $row) { - $tgl_perawatan = $this->db('rawat_jl_pr') - ->select(['tgl_perawatan']) - ->where('nip', $row['nip']) - // ->where('stts_bayar', 'Sudah') - ->where('tgl_perawatan', '>=', $tgl_awal) - ->where('tgl_perawatan', '<=', $tgl_akhir) - ->group('tgl_perawatan') - ->toArray(); - - $row['total'] = 0; - foreach ($tgl_perawatan as $row2) { - - $row2['detail'] = $this->db('rawat_jl_pr') - ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw=rawat_jl_pr.kd_jenis_prw') - ->select(['rawat_jl_pr.kd_jenis_prw', 'nm_perawatan', 'rawat_jl_pr.tarif_tindakanpr']) - ->where('tgl_perawatan', $row2['tgl_perawatan']) - ->where('nip', $row['nip']) - // ->where('stts_bayar', 'Sudah') - ->toArray(); - $row2['subtotal'] = 0; - foreach($row2['detail'] as $row3) { - $row2['subtotal'] += $row3['tarif_tindakanpr']; - } - $row['total'] += $row2['subtotal']; - $row['rawat_jl_pr'][] = $row2; - } - - $this->assign['grandtotal'] += $row['total']; - $this->assign['petugas'][] = $row; - } - - echo json_encode($this->assign); - } - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/jasa_medis_perawat/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); - $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); - $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); - - $this->core->addJS(url([ADMIN, 'jasa_medis_perawat', 'javascript']), 'footer'); - } - -} diff --git a/plugins/jasa_medis_perawat/Info.php b/plugins/jasa_medis_perawat/Info.php deleted file mode 100644 index b6b4a4888..000000000 --- a/plugins/jasa_medis_perawat/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Jasa Medis Perawat', - 'description' => 'Modul dokter untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/jasa_medis_perawat/js/admin/scripts.js b/plugins/jasa_medis_perawat/js/admin/scripts.js deleted file mode 100644 index e272509f1..000000000 --- a/plugins/jasa_medis_perawat/js/admin/scripts.js +++ /dev/null @@ -1,124 +0,0 @@ -jQuery().ready(function () { - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_perawat").click(function () { - var search = $('#search').val(); - var tgl_awal = $('#tgl_awal').val(); - var tgl_akhir = $('#tgl_akhir').val(); - - - $.ajax({ - url: "{?=url([ADMIN,'jasa_medis_perawat','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search: search, - tgl_awal: tgl_awal, - tgl_akhir: tgl_akhir - }, - dataType: 'json', - success: function (res) { - console.log(res); - var grandtotal = res['grandtotal']; - var res = res['petugas']; - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ''; - for (var ii = 0; ii < res[i]['rawat_jl_pr'].length; ii++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ''; - for (var iii = 0; iii < res[i]['rawat_jl_pr'][ii]['detail'].length; iii++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ""; - } - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ""; - } - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - } - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ""; - eTable += "
                  Nama PerawatDetail
                  ' + res[i]['nama'] + '
                  Tanggal : ' + res[i]['rawat_jl_pr'][ii]['tgl_perawatan'] + '
                  - ' + res[i]['rawat_jl_pr'][ii]['detail'][iii]['nm_perawatan'] + ' : Rp. ' + (res[i]['rawat_jl_pr'][ii]['detail'][iii]['tarif_tindakanpr']/1000).toFixed(3) + '
                  Sub Total : Rp. ' + (res[i]['rawat_jl_pr'][ii]['subtotal']/1000).toFixed(3) + '
                  Total : Rp. ' + (res[i]['total']/1000).toFixed(3) + '
                  Grand TotalRp. ' + (grandtotal/1000).toFixed(3) + '
                  "; - $('#forTable_perawat').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_perawat").modal(); - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Jasa Medis Perawat", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_perawat', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_perawat.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_perawat"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data perawat"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/jkn_mobile/Admin.php b/plugins/jkn_mobile/Admin.php index bb41e3dc5..950f9854e 100644 --- a/plugins/jkn_mobile/Admin.php +++ b/plugins/jkn_mobile/Admin.php @@ -27,6 +27,8 @@ public function navigation() { return [ 'Kelola' => 'manage', + 'WS BPJS' => 'wsbpjs', + 'WS RS' => 'wsrs', 'Katalog' => 'index', 'Mapping Poliklinik' => 'mappingpoli', 'Add Mapping Poliklinik' => 'addmappingpoli', @@ -45,7 +47,8 @@ public function getManage() { $sub_modules = [ ['name' => 'Katalog', 'url' => url([ADMIN, 'jkn_mobile', 'index']), 'icon' => 'tasks', 'desc' => 'Index JKN Mobile'], - ['name' => 'Referensi', 'url' => url([ADMIN, 'jkn_mobile', 'ref']), 'icon' => 'tasks', 'desc' => 'Referensi JKN Mobile'], + ['name' => 'WS BPJS', 'url' => url([ADMIN, 'jkn_mobile', 'wsbpjs']), 'icon' => 'tasks', 'desc' => 'WS BPJS JKN Mobile'], + ['name' => 'WS RS', 'url' => url([ADMIN, 'jkn_mobile', 'wsrs']), 'icon' => 'tasks', 'desc' => 'WS RS JKN Mobile'], ['name' => 'Mapping Poliklinik', 'url' => url([ADMIN, 'jkn_mobile', 'mappingpoli']), 'icon' => 'tasks', 'desc' => 'Mapping Poliklinik JKN Mobile'], ['name' => 'Add Mapping Poliklinik', 'url' => url([ADMIN, 'jkn_mobile', 'addmappingpoli']), 'icon' => 'tasks', 'desc' => 'Add mapping poliklinik JKN Mobile'], ['name' => 'Mapping Dokter', 'url' => url([ADMIN, 'jkn_mobile', 'mappingdokter']), 'icon' => 'tasks', 'desc' => 'Mapping Dokter JKN Mobile'], @@ -59,7 +62,7 @@ public function getManage() ['name' => 'Dashboard Antrol Local BPJS', 'url' => url([ADMIN, 'jkn_mobile', 'antrollocal']), 'icon' => 'tasks', 'desc' => 'Antrian Online Local BPJS'], ['name' => 'Pengaturan', 'url' => url([ADMIN, 'jkn_mobile', 'settings']), 'icon' => 'tasks', 'desc' => 'Pengaturan JKN Mobile'], ]; - return $this->draw('manage.html', ['sub_modules' => $sub_modules]); + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function getIndex() @@ -67,9 +70,72 @@ public function getIndex() return $this->draw('index.html'); } - public function getRef() + public function getWSBpjs() { - return $this->draw('ref.html'); + $this->getCssCard(); + $parsedown = new \Systems\Lib\Parsedown(); + $readme_file = MODULES . '/jkn_mobile/README.md'; + $readme = $parsedown->text($this->tpl->noParse(file_get_contents($readme_file))); + return $this->draw('wsbpjs.html', ['readme' => $readme]); + } + + public function getWSRS() + { + $this->getCssCard(); + $referensi_poli = $this->db('maping_poli_bpjs')->toArray(); + $referensi_dokter = $this->db('maping_dokter_dpjpvclaim')->toArray(); + return $this->draw('wsrs.html', [ + 'referensi_poli' => $referensi_poli, + 'referensi_dokter' => $referensi_dokter, + 'header_username' => $this->settings->get('jkn_mobile.header_username'), + 'header_password' => $this->settings->get('jkn_mobile.header_password'), + 'x_username' => $this->settings->get('jkn_mobile.x_username'), + 'x_password' => $this->settings->get('jkn_mobile.x_password'), + 'header_token' => $this->settings->get('jkn_mobile.header_token'), + 'token' => $this->settings->get('jkn_mobile.token') + ]); + } + + public function postWsRequest() + { + $endpoint = $_POST['endpoint']; + $method = $_POST['method']; + $data = $_POST['data'] ?? null; + + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + + $url = $this->bpjsurl . $endpoint; + + $output = ''; + if ($method == 'GET') { + $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } elseif ($method == 'POST') { + $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } elseif ($method == 'PUT') { + $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } elseif ($method == 'DELETE') { + $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } + + $json = json_decode($output, true); + + // Jika json tidak berbentuk array (gagal decode / response kosong) jadikan array kosong agar tidak error di htmlspecialchars_array + if (!is_array($json)) { + $json = []; + } + + if (isset($json['response']) && !is_array($json['response'])) { + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent($stringDecrypt); + if ($decompress) { + $json['response'] = json_decode($decompress, true); + } + } + + echo json_encode(htmlspecialchars_array($json)); + exit(); } public function getRefPoliFinger() @@ -111,7 +177,7 @@ public function getRefPoli() $url = $this->bpjsurl.'ref/poli'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metadata']['code']; $message = $json['metadata']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -147,7 +213,7 @@ public function getAddMappingPoli() { $this->_addHeaderFiles(); $this->assign['poliklinik'] = $this->db('poliklinik')->where('status','1')->toArray(); - return $this->draw('form.mappingpoli.html', ['row' => $this->assign]); + return $this->draw('form.mappingpoli.html', ['row' => htmlspecialchars_array($this->assign)]); } public function postPoliklinik_Save() @@ -191,7 +257,7 @@ public function getRefDokter() $url = $this->bpjsurl.'ref/dokter'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metadata']['code']; $message = $json['metadata']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -228,7 +294,7 @@ public function getAddMappingDokter() { $this->_addHeaderFiles(); $this->assign['dokter'] = $this->db('dokter')->where('status','1')->toArray(); - return $this->draw('form.mappingdokter.html', ['row' => $this->assign]); + return $this->draw('form.mappingdokter.html', ['row' => htmlspecialchars_array($this->assign)]); } public function postDokter_Save() @@ -265,7 +331,8 @@ public function getDokter_Delete($id) public function getJadwalDokter() { - $poli = $this->db('maping_poli_bpjs')->group('kd_poli_bpjs')->toArray(); + $this->getCssCard(); + $poli = $this->db('maping_poli_bpjs')->toArray(); return $this->draw('jadwaldokter.html',['poli'=>$poli]); } @@ -281,18 +348,26 @@ public function postHfis() { $url = $this->bpjsurl . 'jadwaldokter/kodepoli/'.$kodepoli.'/tanggal/'.$tanggal; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - $code = $json['metadata']['code']; - $message = $json['metadata']['message']; - $stringDecrypt = stringDecrypt($key, $json['response']); - $decompress = '""'; - if (!empty($stringDecrypt)) { - $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); - } - if ($json['metadata']['code'] == '200') { - $response = $decompress; + + if (isset($json['metadata']['code'])) { + $code = $json['metadata']['code']; + $message = $json['metadata']['message']; + + if ($code == '200' && isset($json['response'])) { + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = ''; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + $response = json_decode($decompress, true); + } else { + $response = []; // Empty array if not found or error + } + } else { + $response = []; // Empty array if invalid response } - $response = json_decode($response, true); - echo json_encode($response); + + echo json_encode(htmlspecialchars_array($response)); exit(); } @@ -305,9 +380,9 @@ public function anyTaskID() $date = $_POST['periode_antrol']; $exclude_taskid = str_replace(",","','", $this->settings->get('jkn_mobile.exclude_taskid')); $query = $this->db()->pdo()->prepare("SELECT pasien.no_peserta,pasien.no_rkm_medis,pasien.no_ktp,pasien.no_tlp,reg_periksa.no_reg,reg_periksa.no_rawat,reg_periksa.tgl_registrasi,reg_periksa.kd_dokter,dokter.nm_dokter,reg_periksa.kd_poli,poliklinik.nm_poli,reg_periksa.stts_daftar,reg_periksa.no_rkm_medis - FROM reg_periksa INNER JOIN pasien ON reg_periksa.no_rkm_medis=pasien.no_rkm_medis INNER JOIN dokter ON reg_periksa.kd_dokter=dokter.kd_dokter INNER JOIN poliklinik ON reg_periksa.kd_poli=poliklinik.kd_poli WHERE reg_periksa.tgl_registrasi='$date' AND reg_periksa.kd_poli NOT IN ('$exclude_taskid') + FROM reg_periksa INNER JOIN pasien ON reg_periksa.no_rkm_medis=pasien.no_rkm_medis INNER JOIN dokter ON reg_periksa.kd_dokter=dokter.kd_dokter INNER JOIN poliklinik ON reg_periksa.kd_poli=poliklinik.kd_poli WHERE reg_periksa.tgl_registrasi=? AND reg_periksa.kd_poli NOT IN (?) ORDER BY concat(reg_periksa.tgl_registrasi,' ',reg_periksa.jam_reg)"); - $query->execute(); + $query->execute([$date, $exclude_taskid]); $query = $query->fetchAll(\PDO::FETCH_ASSOC);; $rows = []; @@ -322,8 +397,8 @@ public function anyTaskID() if(!$mlite_antrian_referensi) { $mlite_antrian_referensi = $this->db('mlite_antrian_referensi')->where('tanggal_periksa', $q['tgl_registrasi'])->where('no_rkm_medis', $q['no_rkm_medis'])->oneArray(); } - $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '<>', '0000-00-00 00:00:00')->oneArray(); - $mutasi_berkas2 = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '<>', '0000-00-00 00:00:00')->oneArray(); + $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '>', '1970-01-01 00:00:00')->oneArray(); + $mutasi_berkas2 = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '>', '1970-01-01 00:00:00')->oneArray(); $pemeriksaan_ralan = $this->db('pemeriksaan_ralan')->select(['datajam' => 'concat(tgl_perawatan," ",jam_rawat)'])->where('no_rawat', $reg_periksa['no_rawat'])->oneArray(); $resep_obat = $this->db('resep_obat')->select(['datajam' => 'concat(tgl_perawatan," ",jam)'])->where('no_rawat', $reg_periksa['no_rawat'])->oneArray(); $resep_obat2 = $this->db('resep_obat')->select(['datajam' => 'concat(tgl_peresepan," ",jam_peresepan)'])->where('no_rawat', $reg_periksa['no_rawat'])->where('concat(tgl_perawatan," ",jam)', '<>', 'concat(tgl_peresepan," ",jam_peresepan)')->oneArray(); @@ -353,6 +428,7 @@ public function anyTaskID() $taskid5['waktu'] = ''; $taskid6['waktu'] = ''; $taskid7['waktu'] = ''; + $taskid99['waktu'] = ''; if(!empty($q['nomor_referensi'])) { $taskid1 = $this->db('mlite_antrian_referensi_taskid')->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', '1')->oneArray(); @@ -462,8 +538,8 @@ public function getTaskIDInput($no_rawat) $taskid['99'] = date('Y-m-d H:i:s', $taskid99['waktu'] / 1000 ); $mlite_antrian_loket = $this->db('mlite_antrian_loket')->where('no_rkm_medis', $pasien['no_rkm_medis'])->where('postdate', $pasien['tgl_registrasi'])->oneArray(); - $berkas_dikirim = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $pasien['no_rawat'])->where('dikirim', '<>', '0000-00-00 00:00:00')->oneArray(); - $berkas_diterima = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $pasien['no_rawat'])->where('diterima', '<>', '0000-00-00 00:00:00')->oneArray(); + $berkas_dikirim = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $pasien['no_rawat'])->where('dikirim', '>', '1970-01-01 00:00:00')->oneArray(); + $berkas_diterima = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $pasien['no_rawat'])->where('diterima', '>', '1970-01-01 00:00:00')->oneArray(); $pemeriksaan_ralan = $this->db('pemeriksaan_ralan')->select(['datajam' => 'concat(tgl_perawatan," ",jam_rawat)'])->where('no_rawat', $pasien['no_rawat'])->oneArray(); $resep_obat = $this->db('resep_obat')->select(['datajam' => 'concat(tgl_peresepan," ",jam_peresepan)', 'datajam2' => 'concat(tgl_perawatan," ",jam)', 'no_resep' => 'no_resep'])->where('no_rawat', $pasien['no_rawat'])->oneArray(); @@ -726,7 +802,7 @@ public function getKirimAntrian($no_rawat) 'nomor_referensi' => $nomorreferensi, 'kode_booking' => $kodebooking ]; - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); $this->db('mlite_antrian_referensi')->save([ 'tanggal_periksa' => $reg_periksa['tgl_registrasi'], 'no_rkm_medis' => $reg_periksa['no_rkm_medis'], @@ -784,7 +860,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output1 = BpjsService::post($url, $data1, $this->consid, $this->secretkey, $this->user_key, NULL); $json1 = json_decode($output1, true); echo 'Response:
                  '; - echo json_encode($json1); + echo json_encode(htmlspecialchars_array($json1)); if(isset($json1['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -820,7 +896,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output1 = BpjsService::post($url, $data1, $this->consid, $this->secretkey, $this->user_key, NULL); $json1 = json_decode($output1, true); echo 'Response:
                  '; - echo json_encode($json1); + echo json_encode(htmlspecialchars_array($json1)); if(isset($json1['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -855,7 +931,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output2 = BpjsService::post($url, $data2, $this->consid, $this->secretkey, $this->user_key, NULL); $json2 = json_decode($output2, true); echo 'Response:
                  '; - echo json_encode($json2); + echo json_encode(htmlspecialchars_array($json2)); if(isset($json2['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -890,7 +966,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output3 = BpjsService::post($url, $data3, $this->consid, $this->secretkey, $this->user_key, NULL); $json3 = json_decode($output3, true); echo 'Response:
                  '; - echo json_encode($json3); + echo json_encode(htmlspecialchars_array($json3)); if(isset($json3['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -925,7 +1001,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output4 = BpjsService::post($url, $data4, $this->consid, $this->secretkey, $this->user_key, NULL); $json4 = json_decode($output4, true); echo 'Response:
                  '; - echo json_encode($json4); + echo json_encode(htmlspecialchars_array($json4)); if(isset($json4['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -970,7 +1046,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output5 = BpjsService::post($url, $data5, $this->consid, $this->secretkey, $this->user_key, NULL); $json5 = json_decode($output5, true); echo 'Response:
                  '; - echo json_encode($json5); + echo json_encode(htmlspecialchars_array($json5)); if(isset($json5['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -1005,7 +1081,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output6 = BpjsService::post($url, $data6, $this->consid, $this->secretkey, $this->user_key, NULL); $json6 = json_decode($output6, true); echo 'Response:
                  '; - echo json_encode($json6); + echo json_encode(htmlspecialchars_array($json6)); if(isset($json6['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -1040,7 +1116,7 @@ public function getUpdateWaktu($nomor_referensi, $kode_booking, $versi) $output7 = BpjsService::post($url, $data7, $this->consid, $this->secretkey, $this->user_key, NULL); $json7 = json_decode($output7, true); echo 'Response:
                  '; - echo json_encode($json7); + echo json_encode(htmlspecialchars_array($json7)); if(isset($json7['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->where('nomor_referensi', $kode_booking) @@ -1070,13 +1146,14 @@ public function anyLogTaskID() $date = date('Y-m'); if(isset($_POST['periode_antrol']) && $_POST['periode_antrol'] !='') $date = $_POST['periode_antrol']; - $query = $this->db()->pdo()->prepare("SELECT COUNT(*) as jumlah, keterangan FROM mlite_antrian_referensi WHERE tanggal_periksa LIKE '$date%' GROUP BY keterangan"); - $query->execute(); + $query = $this->db()->pdo()->prepare("SELECT COUNT(*) as jumlah, keterangan FROM mlite_antrian_referensi WHERE tanggal_periksa LIKE ? GROUP BY keterangan"); + $query->execute([$date.'%']); $query = $query->fetchAll(\PDO::FETCH_ASSOC); $rows = []; $a = []; $a['jumlah'] = 0; + $a['keterangan'] = ''; foreach ($query as $q) { if (strpos($q['keterangan'], 'Rujukan nomor ') !== false) { $s = explode(" ", $q['keterangan']); @@ -1120,6 +1197,10 @@ public function anyAntrolLocal() public function getSettings() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'jkn_mobile', 'index'])); + } $this->_addHeaderFiles(); $this->assign['title'] = 'Pengaturan Modul JKN Mobile'; $this->assign['propinsi'] = $this->db('propinsi')->where('kd_prop', $this->settings->get('jkn_mobile.kdprop'))->oneArray(); @@ -1135,13 +1216,27 @@ public function getSettings() $this->assign['penjab'] = $this->db('penjab')->where('status', '1')->toArray(); $this->assign['jkn_mobile'] = htmlspecialchars_array($this->settings('jkn_mobile')); - return $this->draw('settings.html', ['settings' => $this->assign]); + return $this->draw('settings.html', ['settings' => htmlspecialchars_array($this->assign)]); } public function postSaveSettings() { - $_POST['jkn_mobile']['display'] = implode(',', $_POST['jkn_mobile']['display']); - $_POST['jkn_mobile']['exclude_taskid'] = implode(',', $_POST['jkn_mobile']['exclude_taskid']); + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'jkn_mobile', 'index'])); + } + if (isset($_POST['jkn_mobile']['display']) && is_array($_POST['jkn_mobile']['display'])) { + $_POST['jkn_mobile']['display'] = implode(',', $_POST['jkn_mobile']['display']); + } else { + $_POST['jkn_mobile']['display'] = ''; + } + + if (isset($_POST['jkn_mobile']['exclude_taskid']) && is_array($_POST['jkn_mobile']['exclude_taskid'])) { + $_POST['jkn_mobile']['exclude_taskid'] = implode(',', $_POST['jkn_mobile']['exclude_taskid']); + } else { + $_POST['jkn_mobile']['exclude_taskid'] = ''; + } + foreach ($_POST['jkn_mobile'] as $key => $val) { $this->settings('jkn_mobile', $key, $val); } @@ -1199,23 +1294,23 @@ public function anyAntrol() $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); $response = []; - if($json['metadata']['code'] == '200') { + if($json && isset($json['metadata']['code']) && $json['metadata']['code'] == '200') { $response = $json['response']['list']; } $this->assign['list'] = $response; - echo $this->draw('antrol.display.html', ['row' => $this->assign]); + echo $this->draw('antrol.display.html', ['row' => htmlspecialchars_array($this->assign)]); } else { $url = $depanUrlTanggal . $tahun . '-' . $bulan . '-' . $tanggal . '/waktu/server'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); $response = []; - if($json['metadata']['code'] == '200') { + if($json && isset($json['metadata']['code']) && $json['metadata']['code'] == '200') { $response = $json['response']['list']; } $this->assign['list'] = $response; - return $this->draw('antrol.html', ['row' => $this->assign]); + return $this->draw('antrol.html', ['row' => htmlspecialchars_array($this->assign)]); } exit(); } @@ -1229,9 +1324,9 @@ public function getQrAntrol(){ } else { $tanggal = date('Y-m-d'); } - $sql = "SELECT * FROM bridging_sep WHERE tglsep = '$tanggal' AND jnspelayanan = '2' AND kdpolitujuan NOT IN ('IGD','HDL')"; + $sql = "SELECT * FROM bridging_sep WHERE tglsep = ? AND jnspelayanan = '2' AND kdpolitujuan NOT IN ('IGD','HDL')"; $query = $this->db()->pdo()->prepare($sql); - $query->execute(); + $query->execute([$tanggal]); $sep_terbit = $query->fetchAll(); $jml_sep = 1; $jml_antrol = 1; @@ -1399,10 +1494,10 @@ public function getAjax() $data = $data->fetchAll(); // create json format - $datatable['draw'] = isset($_GET['draw']) ? $_GET['draw'] : 1; - $datatable['recordsTotal'] = $totaldata; - $datatable['recordsFiltered'] = $totaldata; - $datatable['data'] = array(); + $datatable['draw'] = isset($_GET['draw']) ? intval(htmlspecialchars($_GET['draw'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')) : 1; + $datatable['recordsTotal'] = $totaldata; + $datatable['recordsFiltered'] = $totaldata; + $datatable['data'] = array(); foreach ($data as $row) { @@ -1413,7 +1508,7 @@ public function getAjax() } - echo json_encode($datatable); + echo json_encode(htmlspecialchars_array($datatable)); break; diff --git a/plugins/jkn_mobile/Info.php b/plugins/jkn_mobile/Info.php index 8d7edd9e9..199780d30 100644 --- a/plugins/jkn_mobile/Info.php +++ b/plugins/jkn_mobile/Info.php @@ -4,8 +4,9 @@ 'name' => 'JKN Mobile', 'description' => 'Modul mLITE JKN Mobile API', 'author' => 'Basoro', + 'category' => 'bridging', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'tasks', 'pages' => ['JKN Mobile' => 'jknmobile'], 'install' => function () use ($core) { diff --git a/plugins/jkn_mobile/README.md b/plugins/jkn_mobile/README.md new file mode 100644 index 000000000..ec53f55fb --- /dev/null +++ b/plugins/jkn_mobile/README.md @@ -0,0 +1,73 @@ +# Plugin JKN Mobile + +Dokumentasi singkat penggunaan modul **JKN Mobile** di mLITE. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **JKN Mobile**. +- Pilih submenu sesuai kebutuhan: + - Kelola (halaman utama) + - WS BPJS + - WS RS + - Katalog + - Mapping Poliklinik + - Mapping Dokter + - Jadwal Dokter HFIS + - Data Booking Antrol + - Task ID + - Quality Rate + - Dashboard Antrol BPJS + - Pengaturan + +## Panduan Pengguna (Petugas) + +1. **Dashboard Antrol BPJS** + - Buka submenu **Dashboard Antrol BPJS** untuk melihat daftar antrian online pasien BPJS yang masuk dari aplikasi Mobile JKN. + - Filter antrian berdasarkan tanggal, poliklinik, atau status antrian. + - Gunakan tombol **Kirim Antrian** pada baris pasien untuk mendaftarkan pasien ke sistem RS. + - Gunakan tombol **Batal Antrol** untuk membatalkan antrian bila diperlukan. + +2. **Data Booking Antrol** + - Pantau data booking antrian online dari pasien. + - Lihat detail booking termasuk nomor referensi, kode booking, dan jadwal kunjungan. + +3. **Task ID** + - Buka submenu **Task ID** untuk mengelola task pengiriman antrian ke BPJS. + - Input task ID baru melalui tombol yang tersedia pada baris data pasien. + - Pantau log task ID melalui submenu **Log Task ID** untuk memverifikasi status pengiriman. + +4. **Quality Rate** + - Lihat laporan quality rate antrian untuk memantau kualitas layanan antrian BPJS. + +5. **Jadwal Dokter HFIS** + - Buka submenu **Jadwal Dokter HFIS** untuk sinkronisasi jadwal dokter dari sistem HFIS BPJS. + +## Panduan Admin + +1. **Pengaturan** + - Buka submenu **Pengaturan**. + - Isi kredensial API BPJS: **BpjsConsID**, **BpjsSecretKey**, dan **BpjsUserKey**. + - Atur URL endpoint antrian BPJS (`BpjsAntrianUrl`); gunakan URL dev untuk testing dan URL produksi untuk live. + - Isi **kd_pj_bpjs** (kode penanggung jawab BPJS), dan atur opsi `kirimantrian` (aktif/tidak). + - Simpan konfigurasi sebelum menggunakan fitur antrian. + +2. **Mapping Poliklinik** + - Buka submenu **Mapping Poliklinik**. + - Tambahkan mapping antara kode poli di sistem RS dengan kode poli di BPJS. + - Tanpa mapping yang benar, antrian tidak dapat dikirimkan ke poli yang tepat. + +3. **Mapping Dokter** + - Buka submenu **Mapping Dokter**. + - Tambahkan mapping antara kode dokter di sistem RS dengan kode dokter di BPJS (HFIS). + +4. **WS BPJS & WS RS** + - Gunakan submenu **WS BPJS** untuk menguji koneksi web service ke server BPJS. + - Gunakan submenu **WS RS** untuk memverifikasi respons web service dari sisi RS. + +## Catatan + +- Konfigurasi **BpjsConsID**, **BpjsSecretKey**, dan **BpjsUserKey** wajib diisi sebelum plugin dapat berkomunikasi dengan API BPJS. +- Gunakan URL dev (`apijkn-dev.bpjs-kesehatan.go.id`) saat testing; ganti ke URL produksi sebelum go-live. +- Mapping poliklinik dan dokter harus lengkap agar pengiriman antrian ke BPJS tidak gagal. +- Log task ID tersimpan untuk memudahkan penelusuran jika terjadi kegagalan pengiriman antrian. diff --git a/plugins/jkn_mobile/Site.php b/plugins/jkn_mobile/Site.php index 0ffc94a44..98e1f3b4c 100644 --- a/plugins/jkn_mobile/Site.php +++ b/plugins/jkn_mobile/Site.php @@ -33,8 +33,8 @@ public function routes() $this->route('jknmobile/antrian/statusfarmasi', 'getStatusAntrianFarmasi'); $this->route('jknmobile/antrian/sisa', 'getSisaAntrian'); $this->route('jknmobile/antrian/batal', 'getBatalAntrian'); + $this->route('jknmobile/antrian/checkin', 'getPasienCheckIn'); $this->route('jknmobile/pasien/baru', 'getPasienBaru'); - $this->route('jknmobile/pasien/checkin', 'getPasienCheckIn'); $this->route('jknmobile/operasi/rs', 'getOperasiRS'); $this->route('jknmobile/operasi/pasien', 'getOperasiPasien'); $this->route('jknmobile/antrian/add', '_getAntreanAdd'); @@ -96,7 +96,7 @@ public function getIndex() $kelas = []; $sql = "SELECT kamar.kelas, kamar.kd_bangsal FROM kamar JOIN bangsal ON kamar.kd_bangsal = bangsal.kd_bangsal WHERE kamar.statusdata = '1'"; // $sql .= " AND kamar.kelas = 'Kelas $kelas' AND kamar.kd_bangsal LIKE '%$bangsal%'"; - $sql .= " GROUP BY kamar.kd_bangsal "; + $sql .= " GROUP BY kamar.kd_bangsal, kamar.kelas "; $query = $this->db()->pdo()->prepare($sql); $query->execute(); $bedlist = $query->fetchAll(); @@ -120,7 +120,24 @@ private function _resultToken() $konten = trim(file_get_contents("php://input")); $header = apache_request_headers(); $response = array(); - if ($header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username') && $header[$this->settings->get('jkn_mobile.header_password')] == $this->settings->get('jkn_mobile.x_password')) { + + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + $passwordHeader = $this->settings->get('jkn_mobile.header_password'); + $usernameValue = $this->settings->get('jkn_mobile.x_username'); + $passwordValue = $this->settings->get('jkn_mobile.x_password'); + + $usernameMatch = false; + $passwordMatch = false; + + if (isset($header[$usernameHeader]) && $header[$usernameHeader] == $usernameValue) { + $usernameMatch = true; + } + + if (isset($header[$passwordHeader]) && $header[$passwordHeader] == $passwordValue) { + $passwordMatch = true; + } + + if ($usernameMatch && $passwordMatch) { $response = array( 'response' => array( 'token' => $this->_getToken() @@ -133,12 +150,12 @@ private function _resultToken() } else { $response = array( 'metadata' => array( - 'message' => 'Access denied', + 'message' => 'Username atau Password Tidak Sesuai', 'code' => 201 ) ); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getAmbilAntrian() @@ -160,15 +177,19 @@ private function _resultAmbilAntrian() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { $tanggal=$decode['tanggalperiksa']; $tentukan_hari=date('D',strtotime($tanggal)); @@ -195,29 +216,57 @@ private function _resultAmbilAntrian() $data_pasien = $this->db('pasien')->where('no_peserta', $decode['nomorkartu'])->oneArray(); $poli = $this->db('maping_poli_bpjs')->where('kd_poli_bpjs', $decode['kodepoli'])->oneArray(); - $dokter = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $decode['kodedokter'])->oneArray(); + + // Check if kodedokter is present before using it + $kodedokter = isset($decode['kodedokter']) ? $decode['kodedokter'] : ''; + if (!empty($kodedokter)) { + $dokter = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $kodedokter)->oneArray(); + } else { + $dokter = null; + } if(strtotime($decode['tanggalperiksa']) == strtotime(date('Y-m-d'))) { - $cek_kuota = $this->db()->pdo()->prepare("SELECT jadwal.kuota - (SELECT COUNT(reg_periksa.tgl_registrasi) + $sql = "SELECT jadwal.kuota - (SELECT COUNT(reg_periksa.tgl_registrasi) FROM reg_periksa WHERE reg_periksa.tgl_registrasi='$decode[tanggalperiksa]' AND reg_periksa.kd_dokter=jadwal.kd_dokter) as sisa_kuota, jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai as jam_mulai, poliklinik.nm_poli, dokter.nm_dokter, jadwal.kuota FROM jadwal INNER JOIN maping_poli_bpjs ON maping_poli_bpjs.kd_poli_rs=jadwal.kd_poli INNER JOIN maping_dokter_dpjpvclaim ON maping_dokter_dpjpvclaim.kd_dokter=jadwal.kd_dokter INNER JOIN poliklinik ON poliklinik.kd_poli=jadwal.kd_poli INNER JOIN dokter ON dokter.kd_dokter=jadwal.kd_dokter - WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]' AND maping_dokter_dpjpvclaim.kd_dokter_bpjs='$decode[kodedokter]' GROUP BY jadwal.kd_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"); + WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]'"; + + if (!empty($kodedokter)) { + $sql .= " AND maping_dokter_dpjpvclaim.kd_dokter_bpjs='$kodedokter'"; + } + + $sql .= " GROUP BY jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai, jadwal.kuota, poliklinik.nm_poli, dokter.nm_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"; + + $cek_kuota = $this->db()->pdo()->prepare($sql); } else { - $cek_kuota = $this->db()->pdo()->prepare("SELECT jadwal.kuota - (SELECT COUNT(booking_registrasi.tanggal_periksa) + $sql = "SELECT jadwal.kuota - (SELECT COUNT(booking_registrasi.tanggal_periksa) FROM booking_registrasi WHERE booking_registrasi.tanggal_periksa='$decode[tanggalperiksa]' AND booking_registrasi.kd_dokter=jadwal.kd_dokter) as sisa_kuota, jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai as jam_mulai, poliklinik.nm_poli, dokter.nm_dokter, jadwal.kuota FROM jadwal INNER JOIN maping_poli_bpjs ON maping_poli_bpjs.kd_poli_rs=jadwal.kd_poli INNER JOIN maping_dokter_dpjpvclaim ON maping_dokter_dpjpvclaim.kd_dokter=jadwal.kd_dokter INNER JOIN poliklinik ON poliklinik.kd_poli=jadwal.kd_poli INNER JOIN dokter ON dokter.kd_dokter=jadwal.kd_dokter - WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]' AND maping_dokter_dpjpvclaim.kd_dokter_bpjs='$decode[kodedokter]' GROUP BY jadwal.kd_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"); + WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]'"; + + if (!empty($kodedokter)) { + $sql .= " AND maping_dokter_dpjpvclaim.kd_dokter_bpjs='$kodedokter'"; + } + + $sql .= " GROUP BY jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai, jadwal.kuota, poliklinik.nm_poli, dokter.nm_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"; + + $cek_kuota = $this->db()->pdo()->prepare($sql); } $cek_kuota->execute(); $cek_kuota = $cek_kuota->fetch(); - $jadwal = $this->db('jadwal') + + $jadwal_q = $this->db('jadwal') ->join('maping_dokter_dpjpvclaim', 'maping_dokter_dpjpvclaim.kd_dokter=jadwal.kd_dokter') - ->where('maping_dokter_dpjpvclaim.kd_dokter_bpjs', $decode['kodedokter']) - ->where('hari_kerja', $hari) - ->oneArray(); + ->where('hari_kerja', $hari); + + if (!empty($kodedokter)) { + $jadwal_q->where('maping_dokter_dpjpvclaim.kd_dokter_bpjs', $kodedokter); + } + + $jadwal = $jadwal_q->oneArray(); $cek_referensi = $this->db('mlite_antrian_referensi')->where('nomor_referensi', $decode['nomorreferensi'])->where('tanggal_periksa', $decode['tanggalperiksa'])->oneArray(); $cek_referensi_noka = $this->db('mlite_antrian_referensi')->where('nomor_kartu', $decode['nomorkartu'])->where('tanggal_periksa', $decode['tanggalperiksa'])->oneArray(); @@ -255,7 +304,7 @@ private function _resultAmbilAntrian() if (!empty($decode['tanggalperiksa']) && !preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$decode['tanggalperiksa'])) { $errors[] = 'Format tanggal periksa tidak sesuai'; } - if(!empty($decode['tanggalperiksa']) && $decode['tanggalperiksa'] == $cek_referensi['tanggal_periksa']) { + if(!empty($decode['tanggalperiksa']) && isset($cek_referensi['tanggal_periksa']) && $decode['tanggalperiksa'] == $cek_referensi['tanggal_periksa']) { $errors[] = 'Anda sudah terdaftar dalam antrian ditanggal '.$decode['tanggalperiksa']; } if(empty($decode['kodepoli'])) { @@ -270,19 +319,18 @@ private function _resultAmbilAntrian() if(!empty($decode['kodedokter']) && $dokter == 0) { $errors[] = 'Kode dokter tidak ditemukan'; } - if(!empty($decode['jeniskunjungan']) && $decode['jeniskunjungan'] < 1 || $decode['jeniskunjungan'] > 4) { + if(isset($decode['jeniskunjungan']) && ($decode['jeniskunjungan'] < 1 || $decode['jeniskunjungan'] > 4)) { $errors[] = 'Jenis kunjungan tidak ditemukan'; } if(!empty($errors)) { - foreach($errors as $error) { - $response = array( - 'metadata' => array( - 'message' => $this->_getErrors($error), - 'code' => 201 - ) - ); - }; + $errorMessage = implode(', ', $errors); + $response = array( + 'metadata' => array( + 'message' => $errorMessage, + 'code' => 201 + ) + ); http_response_code(201); } else { @@ -371,7 +419,7 @@ private function _resultAmbilAntrian() 'nomor_kartu' => $decode['nomorkartu'], 'nomor_referensi' => $decode['nomorreferensi'], 'kodebooking' => $kodebooking, - 'jenis_kunjungan' => $decode['jeniskunjungan'], + 'jenis_kunjungan' => isset($decode['jeniskunjungan']) ? $decode['jeniskunjungan'] : 1, // Default to 1 (Rujukan FKTP) if missing 'status_kirim' => 'Belum', 'keterangan' => '' ]); @@ -403,7 +451,7 @@ private function _resultAmbilAntrian() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getStatusAntrian() @@ -433,17 +481,22 @@ private function _resultStatusAntrian() $hari=$day[$tentukan_hari]; $kdpoli = $this->db('maping_poli_bpjs')->where('kd_poli_bpjs', $decode['kodepoli'])->oneArray(); - $kddokter = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $decode['kodedokter'])->oneArray(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + $kodedokter = isset($decode['kodedokter']) ? $decode['kodedokter'] : ''; + $kddokter = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $kodedokter)->oneArray(); + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { - if(!$this->db('maping_poli_bpjs')->where('kd_poli_bpjs', $decode['kodepoli'])->oneArray()){ + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { + if(!$kdpoli){ $response = array( 'metadata' => array( 'message' => 'Poli Tidak Ditemukan', @@ -451,7 +504,7 @@ private function _resultStatusAntrian() ) ); http_response_code(201); - }else if(!$this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $decode['kodedokter'])->oneArray()){ + }else if(!empty($kodedokter) && !$kddokter){ $response = array( 'metadata' => array( 'message' => 'Dokter Tidak Ditemukan', @@ -469,10 +522,8 @@ private function _resultStatusAntrian() http_response_code(201); }else if(!$this->db('jadwal') ->join('maping_dokter_dpjpvclaim', 'maping_dokter_dpjpvclaim.kd_dokter=jadwal.kd_dokter') - ->where('maping_dokter_dpjpvclaim.kd_dokter_bpjs', $decode['kodedokter']) + ->where('maping_dokter_dpjpvclaim.kd_dokter_bpjs', $kodedokter) ->where('hari_kerja', $hari) - ->where('jam_mulai', strtok($decode['jampraktek'], '-').':00') - ->where('jam_selesai', substr($decode['jampraktek'], strpos($decode['jampraktek'], "-") + 1).':00') ->oneArray()){ $response = array( 'metadata' => array( @@ -490,17 +541,31 @@ private function _resultStatusAntrian() ); http_response_code(201); }else{ - $kuota = $this->db()->pdo()->prepare("SELECT jadwal.kuota - (SELECT COUNT(booking_registrasi.tanggal_periksa) FROM booking_registrasi WHERE booking_registrasi.tanggal_periksa='$decode[tanggalperiksa]' AND booking_registrasi.kd_dokter=jadwal.kd_dokter) as sisa_kuota, jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai as jam_mulai, poliklinik.nm_poli, dokter.nm_dokter, jadwal.kuota FROM jadwal INNER JOIN maping_poli_bpjs ON maping_poli_bpjs.kd_poli_rs=jadwal.kd_poli INNER JOIN poliklinik ON poliklinik.kd_poli=jadwal.kd_poli INNER JOIN dokter ON dokter.kd_dokter=jadwal.kd_dokter WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]' GROUP BY jadwal.kd_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"); + $kuota = $this->db()->pdo()->prepare("SELECT jadwal.kuota - (SELECT COUNT(booking_registrasi.tanggal_periksa) FROM booking_registrasi WHERE booking_registrasi.tanggal_periksa='$decode[tanggalperiksa]' AND booking_registrasi.kd_dokter=jadwal.kd_dokter) as sisa_kuota, jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai as jam_mulai, poliklinik.nm_poli, dokter.nm_dokter, jadwal.kuota FROM jadwal INNER JOIN maping_poli_bpjs ON maping_poli_bpjs.kd_poli_rs=jadwal.kd_poli INNER JOIN poliklinik ON poliklinik.kd_poli=jadwal.kd_poli INNER JOIN dokter ON dokter.kd_dokter=jadwal.kd_dokter WHERE jadwal.hari_kerja='$hari' AND maping_poli_bpjs.kd_poli_bpjs='$decode[kodepoli]' GROUP BY jadwal.kd_dokter, jadwal.kd_poli, jadwal.jam_mulai, jadwal.kuota, poliklinik.nm_poli, dokter.nm_dokter HAVING sisa_kuota > 0 ORDER BY sisa_kuota DESC LIMIT 1"); $kuota->execute(); $kuota = $kuota->fetch(); - $max_antrian = $this->db()->pdo()->prepare("SELECT booking_registrasi.no_reg FROM booking_registrasi WHERE booking_registrasi.status='Belum' AND booking_registrasi.kd_dokter='$kddokter[kd_dokter]' AND booking_registrasi.kd_poli='$kdpoli[kd_poli_rs]' AND booking_registrasi.tanggal_periksa='$decode[tanggalperiksa]' ORDER BY CONVERT(RIGHT(booking_registrasi.no_reg,3),signed) LIMIT 1 "); + $table = ($decode['tanggalperiksa'] == date('Y-m-d')) + ? 'reg_periksa' + : 'booking_registrasi'; + + $q = $this->db($table) + ->select(['no_reg']) + ->where('stts', 'Belum') + ->where('kd_dokter', $kddokter['kd_dokter']) + ->where('kd_poli', $kdpoli['kd_poli_rs']); - if($decode['tanggalperiksa'] == date('Y-m-d')) { - $max_antrian = $this->db()->pdo()->prepare("SELECT reg_periksa.no_reg FROM reg_periksa WHERE reg_periksa.stts='Belum' AND reg_periksa.kd_dokter='$kddokter[kd_dokter]' AND reg_periksa.kd_poli='$kdpoli[kd_poli_rs]' AND reg_periksa.tgl_registrasi='$decode[tanggalperiksa]' ORDER BY CONVERT(RIGHT(reg_periksa.no_reg,3),signed) LIMIT 1 "); + if ($table === 'reg_periksa') { + $q->where('tgl_registrasi', $decode['tanggalperiksa']); + } else { + $q->where('tanggal_periksa', $decode['tanggalperiksa']); } - $max_antrian->execute(); - $max_antrian = $max_antrian->fetch(); + + $max_antrian = $q + ->orderBy('no_reg', 'ASC') + ->limit(1) + ->oneArray(); + if(strtotime($decode['tanggalperiksa']) == strtotime(date('Y-m-d'))) { $data = $this->db()->pdo()->prepare("SELECT poliklinik.nm_poli,COUNT(reg_periksa.kd_poli) as total_antrean,dokter.nm_dokter, @@ -568,7 +633,7 @@ private function _resultStatusAntrian() ) ); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getAmbilAntrianFarmasi() @@ -584,15 +649,19 @@ private function _resultAmbilAntrianFarmasi() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { if(empty($decode['kodebooking'])) { $response = array( 'metadata' => array( @@ -699,7 +768,7 @@ private function _resultAmbilAntrianFarmasi() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getStatusAntrianFarmasi() @@ -715,15 +784,19 @@ private function _resultStatusAntrianFarmasi() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { if(empty($decode['kodebooking'])) { $response = array( 'metadata' => array( @@ -843,7 +916,7 @@ private function _resultStatusAntrianFarmasi() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getSisaAntrian() @@ -859,15 +932,19 @@ private function _resultSisaAntrian() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { if(empty($decode['kodebooking'])) { $response = array( 'metadata' => array( @@ -923,9 +1000,15 @@ private function _resultSisaAntrian() }else if($booking_registrasi['status']=='Terdaftar'){ $noreg = $this->db('reg_periksa')->where('no_rkm_medis', $pasien['no_rkm_medis'])->where('tgl_registrasi', $booking_registrasi['tanggal_periksa'])->oneArray(); - $max_antrian = $this->db()->pdo()->prepare("SELECT reg_periksa.no_reg FROM reg_periksa WHERE reg_periksa.stts='Belum' AND reg_periksa.kd_dokter='$booking_registrasi[kd_dokter]' AND reg_periksa.kd_poli='$booking_registrasi[kd_poli]' AND reg_periksa.tgl_registrasi='$booking_registrasi[tanggal_periksa]' ORDER BY CONVERT(RIGHT(reg_periksa.no_reg,3),signed) LIMIT 1 "); - $max_antrian->execute(); - $max_antrian = $max_antrian->fetch(); + $max_antrian = $this->db('reg_periksa') + ->select(['no_reg']) + ->where('stts', 'Belum') + ->where('kd_dokter', $booking_registrasi['kd_dokter']) + ->where('kd_poli', $booking_registrasi['kd_poli']) + ->where('tgl_registrasi', $booking_registrasi['tanggal_periksa']) + ->orderByRightNumber('no_reg', 3, 'ASC') + ->limit(1) + ->oneArray(); $data = $this->db()->pdo()->prepare("SELECT reg_periksa.kd_poli,poliklinik.nm_poli,dokter.nm_dokter, reg_periksa.no_reg,COUNT(reg_periksa.no_rawat) as total_antrean, @@ -943,7 +1026,7 @@ private function _resultSisaAntrian() 'namapoli' => $data['nm_poli'], 'namadokter' => $data['nm_dokter'], 'sisaantrean' => ($data['sisa_antrean']>0?$data['sisa_antrean']:0), - 'antreanpanggil' => "A-".$max_antrian['no_reg'], + 'antreanpanggil' => "A-".$max_antrian['no_reg'] ?? '000', 'waktutunggu' => (($data['sisa_antrean']*10)*1000), 'keterangan' => "Datanglah Minimal 30 Menit, jika no antrian anda terlewat, silakan konfirmasi ke layanan pelanggan, Terima Kasih .." ), @@ -974,7 +1057,7 @@ private function _resultSisaAntrian() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getBatalAntrian() @@ -990,15 +1073,19 @@ private function _resultBatalAntrian() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { if(empty($decode['kodebooking'])) { $response = array( 'metadata' => array( @@ -1105,7 +1192,7 @@ private function _resultBatalAntrian() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getPasienBaru() @@ -1121,15 +1208,19 @@ private function _resultPasienBaru() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { if (empty($decode['nomorkartu'])){ $response = array( 'metadata' => array( @@ -1527,7 +1618,7 @@ private function _resultPasienBaru() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getPasienCheckIn() @@ -1543,15 +1634,19 @@ private function _resultPasienCheckIn() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { $tanggal=date("Y-m-d", ($decode['waktu']/1000)); $jam = date("H:i:s",($decode['waktu']/1000)); if(empty($decode['kodebooking'])) { @@ -1733,7 +1828,6 @@ private function _resultPasienCheckIn() if (!$mlite_antrian_loket['postdate']) { $this->db('mlite_antrian_loket') ->save([ - 'kd' => NULL, 'type' => 'Loket', 'noantrian' => $next_antrian, 'no_rkm_medis' => $booking_registrasi['no_rkm_medis'], @@ -1869,7 +1963,7 @@ private function _resultPasienCheckIn() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getOperasiRS() @@ -1885,15 +1979,19 @@ private function _resultOperasiRS() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { $data = array(); $sql = $this->db()->pdo()->prepare("SELECT booking_operasi.no_rawat AS kodebooking, booking_operasi.tanggal AS tanggaloperasi, paket_operasi.nm_perawatan AS jenistindakan, maping_poli_bpjs.kd_poli_bpjs AS kodepoli, poliklinik.nm_poli AS namapoli, booking_operasi.status AS terlaksana, pasien.no_peserta AS nopeserta FROM pasien, booking_operasi, paket_operasi, reg_periksa, jadwal, poliklinik, maping_poli_bpjs WHERE booking_operasi.no_rawat = reg_periksa.no_rawat AND pasien.no_rkm_medis = reg_periksa.no_rkm_medis AND booking_operasi.kode_paket = paket_operasi.kode_paket AND booking_operasi.kd_dokter = jadwal.kd_dokter AND jadwal.kd_poli = poliklinik.kd_poli AND jadwal.kd_poli=maping_poli_bpjs.kd_poli_rs AND booking_operasi.tanggal BETWEEN '$decode[tanggalawal]' AND '$decode[tanggalakhir]' GROUP BY booking_operasi.no_rawat"); $sql->execute(); @@ -1968,7 +2066,7 @@ private function _resultOperasiRS() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function getOperasiPasien() @@ -1984,15 +2082,19 @@ private function _resultOperasiPasien() $konten = trim(file_get_contents("php://input")); $decode = json_decode($konten, true); $response = array(); - if($header[$this->settings->get('jkn_mobile.header_token')] == false) { + + $tokenHeader = $this->settings->get('jkn_mobile.header_token'); + $usernameHeader = $this->settings->get('jkn_mobile.header_username'); + + if(!isset($header[$tokenHeader]) || $header[$tokenHeader] == false) { $response = array( 'metadata' => array( - 'message' => 'Token expired', + 'message' => 'Token expired or missing', 'code' => 201 ) ); http_response_code(201); - } else if ($header[$this->settings->get('jkn_mobile.header_token')] == $this->_getToken() && $header[$this->settings->get('jkn_mobile.header_username')] == $this->settings->get('jkn_mobile.x_username')) { + } else if ($header[$tokenHeader] == $this->_getToken() && isset($header[$usernameHeader]) && $header[$usernameHeader] == $this->settings->get('jkn_mobile.x_username')) { $data = array(); $cek_nopeserta = $this->db('pasien')->where('no_peserta', $decode['nopeserta'])->oneArray(); $sql = $this->db()->pdo()->prepare("SELECT booking_operasi.no_rawat AS kodebooking, booking_operasi.tanggal AS tanggaloperasi, paket_operasi.nm_perawatan AS jenistindakan, maping_poli_bpjs.kd_poli_bpjs AS kodepoli, poliklinik.nm_poli AS namapoli, booking_operasi.status AS terlaksana FROM pasien, booking_operasi, paket_operasi, reg_periksa, jadwal, poliklinik, maping_poli_bpjs WHERE booking_operasi.no_rawat = reg_periksa.no_rawat AND pasien.no_rkm_medis = reg_periksa.no_rkm_medis AND booking_operasi.kode_paket = paket_operasi.kode_paket AND booking_operasi.kd_dokter = jadwal.kd_dokter AND jadwal.kd_poli = poliklinik.kd_poli AND jadwal.kd_poli=maping_poli_bpjs.kd_poli_rs AND pasien.no_peserta = '$decode[nopeserta]' GROUP BY booking_operasi.no_rawat"); @@ -2067,7 +2169,7 @@ private function _resultOperasiPasien() ); http_response_code(201); } - echo json_encode($response); + echo json_encode(htmlspecialchars_array($response)); } public function _getJadwal($kodepoli, $tanggal) @@ -2090,17 +2192,12 @@ public function _getJadwal($kodepoli, $tanggal) if($json != null) { echo '{ "metaData": { - "code": "'.$code.'", - "message": "'.$message.'" + "code": "'.htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'", + "message": "'.htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'" }, "response": '.$decompress.'}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2149,7 +2246,7 @@ public function _getUpdateJadwal($data = []) $url = $this->bpjsurl.'updatejadwaldokter'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); exit(); } @@ -2324,7 +2421,7 @@ public function _getAntreanAdd() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $data = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($data)." "; + echo json_encode(htmlspecialchars_array($data))." "; echo $data['metadata']['code']; if($data['metadata']['code'] == 200 || $data['metadata']['code'] == 208){ @@ -2377,12 +2474,12 @@ public function _getAntreanAdd() 'kodebooking' => $kodebooking, 'jenis_kunjungan' => $jeniskunjungan, 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } } @@ -2395,12 +2492,12 @@ public function _getAntreanAdd() 'kodebooking' => $kodebooking, 'jenis_kunjungan' => $jeniskunjungan, 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } } @@ -2415,12 +2512,12 @@ public function _getAntreanAdd() 'kodebooking' => $kodebooking, 'jenis_kunjungan' => $jeniskunjungan, 'status_kirim' => 'Gagal', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Gagal', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } } @@ -2433,12 +2530,12 @@ public function _getAntreanAdd() 'kodebooking' => $kodebooking, 'jenis_kunjungan' => $jeniskunjungan, 'status_kirim' => 'Gagal', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Gagal', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } } @@ -2618,14 +2715,14 @@ public function _getAntreanAddAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $data = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($data)." "; + echo json_encode(htmlspecialchars_array($data))." "; echo $data['metadata']['code']; if($data['metadata']['code'] == 200 || $data['metadata']['code'] == 208){ if($jenispasien == 'JKN') { $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } @@ -2643,7 +2740,7 @@ public function _getAntreanAddAusy() $this->db('mlite_antrian_referensi')->where('nomor_referensi', $q['nomor_referensi'])->save([ 'status_kirim' => 'Gagal', - 'keterangan' => $data['metadata']['message'] + 'keterangan' => htmlspecialchars($data['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } @@ -2705,7 +2802,7 @@ public function _getAntreanBatal() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); echo '
                  -------------------------------------

                  '; } @@ -2774,7 +2871,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -2783,7 +2880,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 1, 'waktu' => strtotime($mlite_antrian_loket['postdate'].' '.$mlite_antrian_loket['start_time']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -2819,7 +2916,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -2828,7 +2925,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 2, 'waktu' => strtotime($mlite_antrian_loket['postdate'].' '.$mlite_antrian_loket['end_time']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -2847,7 +2944,7 @@ public function _getAntreanUpdateWaktu() $q['no_rkm_medis'] = $pasien['no_rkm_medis']; } $reg_periksa = $this->db('reg_periksa')->where('tgl_registrasi', $date)->where('no_rkm_medis', $q['no_rkm_medis'])->oneArray(); - $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '<>', '0000-00-00 00:00:00')->oneArray(); + $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '>', '1970-01-01 00:00:00')->oneArray(); if($mutasi_berkas){ date_default_timezone_set($this->settings->get('settings.timezone')); $data = [ @@ -2864,7 +2961,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -2873,7 +2970,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 3, 'waktu' => strtotime($mutasi_berkas['dikirim']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -2892,7 +2989,7 @@ public function _getAntreanUpdateWaktu() $q['no_rkm_medis'] = $pasien['no_rkm_medis']; } $reg_periksa = $this->db('reg_periksa')->where('tgl_registrasi', $date)->where('no_rkm_medis', $q['no_rkm_medis'])->oneArray(); - $mutasi_berkas = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '<>', '0000-00-00 00:00:00')->oneArray(); + $mutasi_berkas = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '>', '1970-01-01 00:00:00')->oneArray(); if($mutasi_berkas){ date_default_timezone_set($this->settings->get('settings.timezone')); $data = [ @@ -2909,7 +3006,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -2918,7 +3015,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 4, 'waktu' => strtotime($mutasi_berkas['diterima']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -2961,7 +3058,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -2970,7 +3067,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 5, 'waktu' => strtotime($pemeriksaan_ralan['datajam']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3012,7 +3109,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -3021,7 +3118,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 6, 'waktu' => strtotime($resep_obat['datajam']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3063,7 +3160,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -3072,7 +3169,7 @@ public function _getAntreanUpdateWaktu() 'taskid' => 7, 'waktu' => strtotime($resep_obat['datajam']) * 1000, 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3106,7 +3203,7 @@ public function _getAntreanUpdateWaktu() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if(isset($json['metadata']['code']) == 200){ $this->db('mlite_antrian_referensi_taskid') ->save([ @@ -3229,7 +3326,7 @@ public function _getAntreanUpdateWaktuAusy() } $reg_periksa = $this->db('reg_periksa')->where('tgl_registrasi', $date)->where('no_rkm_medis', $q['no_rkm_medis'])->oneArray(); echo $q['no_rkm_medis'].'
                  '; - $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '<>', '0000-00-00 00:00:00')->oneArray(); + $mutasi_berkas = $this->db('mutasi_berkas')->select('dikirim')->where('no_rawat', $reg_periksa['no_rawat'])->where('dikirim', '>', '1970-01-01 00:00:00')->oneArray(); if($mutasi_berkas){ echo 'A '; date_default_timezone_set($this->settings->get('settings.timezone')); @@ -3261,7 +3358,7 @@ public function _getAntreanUpdateWaktuAusy() $q['no_rkm_medis'] = $pasien['no_rkm_medis']; } $reg_periksa = $this->db('reg_periksa')->where('tgl_registrasi', $date)->where('no_rkm_medis', $q['no_rkm_medis'])->oneArray(); - $mutasi_berkas = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '<>', '0000-00-00 00:00:00')->oneArray(); + $mutasi_berkas = $this->db('mutasi_berkas')->select('diterima')->where('no_rawat', $reg_periksa['no_rawat'])->where('diterima', '>', '1970-01-01 00:00:00')->oneArray(); if($mutasi_berkas){ date_default_timezone_set($this->settings->get('settings.timezone')); $this->db('mlite_antrian_referensi_taskid') @@ -3392,18 +3489,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 1) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 1) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3432,18 +3529,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 2) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 2) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3472,18 +3569,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 3) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 3) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3512,18 +3609,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 4) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 4) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3551,18 +3648,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 5) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 5) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3591,18 +3688,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 6) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 6) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3629,18 +3726,18 @@ public function _getAntreanUpdateWaktuAusy() $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); echo 'Response:
                  '; - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); if($json['metadata']['code'] == 200 || $json['metadata']['code'] == 208){ $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 7) ->save([ 'status' => 'Sudah', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } else { $this->db('mlite_antrian_referensi_taskid')->where('tanggal_periksa', $date)->where('nomor_referensi', $q['nomor_referensi'])->where('taskid', 7) ->save([ 'status' => 'Gagal', - 'keterangan' => $json['metadata']['message'] + 'keterangan' => htmlspecialchars($json['metadata']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ]); } echo '
                  -------------------------------------

                  '; @@ -3684,7 +3781,7 @@ public function _getAntreanWaktuTunggu() $url = $this->bpjsurl.'dashboard/waktutunggu/bulan/'.$slug[3].'/tahun/'.$slug[4].'/waktu/'.$slug[5]; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); exit(); } @@ -3694,7 +3791,7 @@ public function _getAntreanWaktuTungguTanggal() $url = $this->bpjsurl.'dashboard/waktutunggu/tanggal/'.$slug[3].'/waktu/'.$slug[4]; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, NULL); $json = json_decode($output, true); - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); exit(); } diff --git a/plugins/jkn_mobile/view/admin/antrol.display.html b/plugins/jkn_mobile/view/admin/antrol.display.html index f90d90ed3..22ecfa5b4 100644 --- a/plugins/jkn_mobile/view/admin/antrol.display.html +++ b/plugins/jkn_mobile/view/admin/antrol.display.html @@ -5,49 +5,49 @@
                  {if: $value.tanggal} -

                  {$value.tanggal}

                  +

                  {?=isset_or($value.tanggal)?}

                  {/if} -

                  - {$value.namapoli} +

                  + {?=isset_or($value.namapoli)?}

                  Jumlah Antrean :
                  - {$value.jumlah_antrean}
                  + {?=isset_or($value.jumlah_antrean)?}

                  Waktu Layanan


                  Rata - Rata Waktu Tunggu Loket :
                  - {$value.avg_waktu_task1} + {?=isset_or($value.avg_waktu_task1)?}
                  Rata - Rata Waktu Layanan Loket :
                  - {$value.avg_waktu_task2}
                  + {?=isset_or($value.avg_waktu_task2)?}
                  Rata - Rata Waktu Tunggu Poli :
                  - {$value.avg_waktu_task3} + {?=isset_or($value.avg_waktu_task3)?}
                  Rata - Rata Waktu Layanan Poli :
                  - {$value.avg_waktu_task4}
                  + {?=isset_or($value.avg_waktu_task4)?}
                  Rata - Rata Waktu Tunggu Farmasi :
                  - {$value.avg_waktu_task5}
                  + {?=isset_or($value.avg_waktu_task5)?}
                  Rata - Rata Waktu Layanan Farmasi :
                  - {$value.avg_waktu_task6}
                  + {?=isset_or($value.avg_waktu_task6)?}
                  @@ -56,7 +56,7 @@

                  diff --git a/plugins/jkn_mobile/view/admin/antrol.html b/plugins/jkn_mobile/view/admin/antrol.html index a8f2d92af..237256804 100644 --- a/plugins/jkn_mobile/view/admin/antrol.html +++ b/plugins/jkn_mobile/view/admin/antrol.html @@ -48,48 +48,48 @@

                  Antrian Online BPJS

                  -

                  {$value.tanggal}

                  -

                  - {$value.namapoli} +

                  {?=isset_or($value.tanggal)?}

                  +

                  + {?=isset_or($value.namapoli)?}

                  Jumlah Antrean :
                  - {$value.jumlah_antrean}
                  + {?=isset_or($value.jumlah_antrean)?}

                  Waktu Layanan


                  Rata - Rata Waktu Tunggu Loket :
                  - {$value.avg_waktu_task1} + {?=isset_or($value.avg_waktu_task1)?}
                  Rata - Rata Waktu Layanan Loket :
                  - {$value.avg_waktu_task2}
                  + {?=isset_or($value.avg_waktu_task2)?}
                  Rata - Rata Waktu Tunggu Poli :
                  - {$value.avg_waktu_task3} + {?=isset_or($value.avg_waktu_task3)?}
                  Rata - Rata Waktu Layanan Poli :
                  - {$value.avg_waktu_task4}
                  + {?=isset_or($value.avg_waktu_task4)?}
                  Rata - Rata Waktu Tunggu Farmasi :
                  - {$value.avg_waktu_task5}
                  + {?=isset_or($value.avg_waktu_task5)?}
                  Rata - Rata Waktu Layanan Farmasi :
                  - {$value.avg_waktu_task6}
                  + {?=isset_or($value.avg_waktu_task6)?}
                  @@ -98,7 +98,7 @@

                  diff --git a/plugins/jkn_mobile/view/admin/antrollocal.html b/plugins/jkn_mobile/view/admin/antrollocal.html index 4472c977b..81718de5f 100755 --- a/plugins/jkn_mobile/view/admin/antrollocal.html +++ b/plugins/jkn_mobile/view/admin/antrollocal.html @@ -43,12 +43,12 @@

                  Dashboard Antrian Online Local JKN Mobile

                  {loop: $taskid} - {$value.no_rkm_medis} {$value.nm_pasien} - {$value.tanggal_periksa} - {$value.no_rawat} - {$value.keterangan} - {$value.nomor_referensi} - {$value.kodebooking} + {?=isset_or($value.no_rkm_medis)?} {?=isset_or($value.nm_pasien)?} + {?=isset_or($value.tanggal_periksa)?} + {?=isset_or($value.no_rawat)?} + {?=isset_or($value.keterangan)?} + {?=isset_or($value.nomor_referensi)?} + {?=isset_or($value.kodebooking)?} {/loop} diff --git a/plugins/jkn_mobile/view/admin/batalantrol.html b/plugins/jkn_mobile/view/admin/batalantrol.html index 146a60e65..e7a2781e1 100644 --- a/plugins/jkn_mobile/view/admin/batalantrol.html +++ b/plugins/jkn_mobile/view/admin/batalantrol.html @@ -9,7 +9,7 @@
                  - +
                  diff --git a/plugins/jkn_mobile/view/admin/bookingantrol.html b/plugins/jkn_mobile/view/admin/bookingantrol.html index 242490cdf..14da27906 100644 --- a/plugins/jkn_mobile/view/admin/bookingantrol.html +++ b/plugins/jkn_mobile/view/admin/bookingantrol.html @@ -19,10 +19,10 @@

                  Data Booking Antrian Online

                  {loop: $row} - {$value.tanggal_periksa} - {$value.nomor_kartu} - {$value.nomor_referensi} - {$value.kodebooking} + {?=isset_or($value.tanggal_periksa)?} + {?=isset_or($value.nomor_kartu)?} + {?=isset_or($value.nomor_referensi)?} + {?=isset_or($value.kodebooking)?} diff --git a/plugins/jkn_mobile/view/admin/form.mappingdokter.html b/plugins/jkn_mobile/view/admin/form.mappingdokter.html index 85de3158c..9c16d78ea 100644 --- a/plugins/jkn_mobile/view/admin/form.mappingdokter.html +++ b/plugins/jkn_mobile/view/admin/form.mappingdokter.html @@ -20,7 +20,7 @@

                  Kelola Dokter

                  diff --git a/plugins/jkn_mobile/view/admin/form.mappingpoli.html b/plugins/jkn_mobile/view/admin/form.mappingpoli.html index 9738c0041..336bff3c9 100644 --- a/plugins/jkn_mobile/view/admin/form.mappingpoli.html +++ b/plugins/jkn_mobile/view/admin/form.mappingpoli.html @@ -20,7 +20,7 @@

                  Kelola Dokter

                  diff --git a/plugins/jkn_mobile/view/admin/form.onsite.html b/plugins/jkn_mobile/view/admin/form.onsite.html index 4b67733b6..b5ddd0e5e 100644 --- a/plugins/jkn_mobile/view/admin/form.onsite.html +++ b/plugins/jkn_mobile/view/admin/form.onsite.html @@ -8,7 +8,7 @@
                  - +
                  Pilih Rujukan
                  diff --git a/plugins/jkn_mobile/view/admin/logtaskid.html b/plugins/jkn_mobile/view/admin/logtaskid.html index 6e87de7a8..3c9b75957 100755 --- a/plugins/jkn_mobile/view/admin/logtaskid.html +++ b/plugins/jkn_mobile/view/admin/logtaskid.html @@ -25,7 +25,7 @@
                  -

                  Dashboard Log Antrian Online Local JKN Mobile {$tgl}

                  +

                  Dashboard Log Antrian Online Local JKN Mobile {?=isset_or($tgl)?}

                  @@ -39,8 +39,8 @@

                  Dashboard Log Antrian Online Local JKN Mobile {$tgl}

                  {loop: $taskid} - {$value.jumlah} - {$value.keterangan} + {?=isset_or($value.jumlah)?} + {?=isset_or($value.keterangan)?} {/loop} diff --git a/plugins/jkn_mobile/view/admin/manage.html b/plugins/jkn_mobile/view/admin/manage.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/jkn_mobile/view/admin/manage.html +++ b/plugins/jkn_mobile/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/jkn_mobile/view/admin/manage.qurate.html b/plugins/jkn_mobile/view/admin/manage.qurate.html index e74f51cab..3d6fe0ebb 100644 --- a/plugins/jkn_mobile/view/admin/manage.qurate.html +++ b/plugins/jkn_mobile/view/admin/manage.qurate.html @@ -31,7 +31,7 @@ }

                  - Antrian Online Tanggal {$stats.tanggal} + Antrian Online Tanggal {?=isset_or($stats.tanggal)?}
                  @@ -51,7 +51,7 @@

                  SEP Terbit
                  - {$stats.jml_sep} + {?=isset_or($stats.jml_sep)?}

                  @@ -65,7 +65,7 @@

                  Tambah Antrian
                  - {$stats.jml_antrol} + {?=isset_or($stats.jml_antrol)?}

                  @@ -79,7 +79,7 @@

                  Quality Rate
                  - {$stats.qr_manual} % + {?=isset_or($stats.qr_manual)?} %

                  diff --git a/plugins/jkn_mobile/view/admin/mappingdokter.html b/plugins/jkn_mobile/view/admin/mappingdokter.html index a3adf65b1..0370cd2ae 100644 --- a/plugins/jkn_mobile/view/admin/mappingdokter.html +++ b/plugins/jkn_mobile/view/admin/mappingdokter.html @@ -18,9 +18,9 @@

                  Data Mapping Dokter

                  {loop: $row} - {$value.kd_dokter} - {$value.kd_dokter_bpjs} - {$value.nm_dokter_bpjs} + {?=isset_or($value.kd_dokter)?} + {?=isset_or($value.kd_dokter_bpjs)?} + {?=isset_or($value.nm_dokter_bpjs)?} diff --git a/plugins/jkn_mobile/view/admin/mappingpoli.html b/plugins/jkn_mobile/view/admin/mappingpoli.html index 458e9e24d..4a3185492 100644 --- a/plugins/jkn_mobile/view/admin/mappingpoli.html +++ b/plugins/jkn_mobile/view/admin/mappingpoli.html @@ -18,9 +18,9 @@

                  Data Mapping Poliklinik

                  {loop: $row} - {$value.kd_poli_rs} - {$value.kd_poli_bpjs} - {$value.nm_poli_bpjs} + {?=isset_or($value.kd_poli_rs)?} + {?=isset_or($value.kd_poli_bpjs)?} + {?=isset_or($value.nm_poli_bpjs)?}
                  diff --git a/plugins/jkn_mobile/view/admin/ref.html b/plugins/jkn_mobile/view/admin/ref.html deleted file mode 100644 index ea5519d78..000000000 --- a/plugins/jkn_mobile/view/admin/ref.html +++ /dev/null @@ -1,184 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Katalog

                  -
                  - -
                  -
                  -
                  -
                  -
                  -

                  Referensi

                  -
                  -
                  -
                  -
                  -
                  - - -
                  - -
                  -
                  -
                  - -
                  - - -
                  -
                  - - -
                  - -
                  - {if: isset($_GET['no_kartu']) && $_GET['no_kartu']!='' && isset($_GET['tgl_pelayanan']) && $_GET['tgl_pelayanan']!=''} -

                  Respons result

                  -
                  -                                  
                  - {/if} -
                  -
                  -
                  - -
                  -
                  -

                  - Hapus SEP -

                  -
                  -
                  -
                  -
                  - -
                  - - -
                  -
                  - - -
                  - -
                  - {if: isset($_GET['no_kartu']) && $_GET['no_kartu']!='' && isset($_GET['tgl_pelayanan']) && $_GET['tgl_pelayanan']!=''} -

                  Respons result

                  -
                  -                                  
                  - {/if} -
                  -
                  -
                  - -
                  -
                  -

                  - Cari SEP -

                  -
                  -
                  -
                  -
                  - -
                  - - -
                  - -
                  - {if: isset($_GET['sep']) && $_GET['sep']!=''} -

                  Respons result

                  -
                  -                                
                  - {/if} -
                  -
                  -
                  -
                  -
                  -
                  -
                  -
                  -
                  -
                  - - diff --git a/plugins/jkn_mobile/view/admin/settings.html b/plugins/jkn_mobile/view/admin/settings.html index a1c08e20c..0d7dc1d36 100644 --- a/plugins/jkn_mobile/view/admin/settings.html +++ b/plugins/jkn_mobile/view/admin/settings.html @@ -3,50 +3,50 @@
                  -

                  {$settings.title}

                  +

                  {?=isset_or($settings.title)?}

                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  @@ -54,7 +54,7 @@

                  {$settings.title}

                  @@ -73,7 +73,7 @@

                  {$settings.title}

                  @@ -82,8 +82,8 @@

                  {$settings.title}

                  - - + + @@ -94,8 +94,8 @@

                  {$settings.title}

                  - - + + @@ -108,8 +108,8 @@

                  {$settings.title}

                  - - + + @@ -120,8 +120,8 @@

                  {$settings.title}

                  - - + + @@ -135,7 +135,7 @@

                  {$settings.title}

                  @@ -145,7 +145,7 @@

                  {$settings.title}

                  @@ -157,7 +157,7 @@

                  {$settings.title}

                  @@ -167,7 +167,7 @@

                  {$settings.title}

                  diff --git a/plugins/jkn_mobile/view/admin/taskid.html b/plugins/jkn_mobile/view/admin/taskid.html index 4049638d2..1e931d615 100644 --- a/plugins/jkn_mobile/view/admin/taskid.html +++ b/plugins/jkn_mobile/view/admin/taskid.html @@ -50,21 +50,21 @@

                  Task ID JKN Mobile

                  {loop: $taskid} - {$value.no_rkm_medis} + {?=isset_or($value.no_rkm_medis)?} {?=$this->core->getPasienInfo('nm_pasien', $value.no_rkm_medis)?} - {$value.tgl_registrasi} - {$value.no_rawat} - {$value.nm_poli} - {$value.nm_dokter} - {$value.nomor_referensi} - {$value.task1} - {$value.task2} - {$value.task3} - {$value.task4} - {$value.task5} - {$value.task6} - {$value.task7} - {$value.task99} + {?=isset_or($value.tgl_registrasi)?} + {?=isset_or($value.no_rawat)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.nomor_referensi)?} + {?=isset_or($value.task1)?} + {?=isset_or($value.task2)?} + {?=isset_or($value.task3)?} + {?=isset_or($value.task4)?} + {?=isset_or($value.task5)?} + {?=isset_or($value.task6)?} + {?=isset_or($value.task7)?} + {?=isset_or($value.task99)?} {/loop} diff --git a/plugins/jkn_mobile/view/admin/taskid.input.html b/plugins/jkn_mobile/view/admin/taskid.input.html index 287a5ede1..d065b8e8e 100644 --- a/plugins/jkn_mobile/view/admin/taskid.input.html +++ b/plugins/jkn_mobile/view/admin/taskid.input.html @@ -9,61 +9,61 @@
                  @@ -246,7 +246,7 @@

                  Tambah Jadwal Presensi

                  @@ -259,7 +259,7 @@

                  Tambah Jadwal Presensi

                  @@ -270,7 +270,7 @@

                  Tambah Jadwal Presensi

                  @@ -281,7 +281,7 @@

                  Tambah Jadwal Presensi

                  @@ -292,7 +292,7 @@

                  Tambah Jadwal Presensi

                  @@ -303,7 +303,7 @@

                  Tambah Jadwal Presensi

                  @@ -314,7 +314,7 @@

                  Tambah Jadwal Presensi

                  @@ -327,7 +327,7 @@

                  Tambah Jadwal Presensi

                  @@ -338,7 +338,7 @@

                  Tambah Jadwal Presensi

                  @@ -349,7 +349,7 @@

                  Tambah Jadwal Presensi

                  @@ -360,7 +360,7 @@

                  Tambah Jadwal Presensi

                  @@ -371,7 +371,7 @@

                  Tambah Jadwal Presensi

                  @@ -382,7 +382,7 @@

                  Tambah Jadwal Presensi

                  @@ -395,7 +395,7 @@

                  Tambah Jadwal Presensi

                  diff --git a/plugins/presensi/view/admin/jadwal.manage.html b/plugins/presensi/view/admin/jadwal.manage.html index c24f894a9..e2753c913 100644 --- a/plugins/presensi/view/admin/jadwal.manage.html +++ b/plugins/presensi/view/admin/jadwal.manage.html @@ -8,21 +8,21 @@

                  Kelola Jadwal Presensi

                  Jadwal
                • - Tambah + Tambah
                • -

                  Jumlah: {?=count($jadwal.totalRecords)?} || Bulan: {$jadwal.showBulan}

                  +

                  Jumlah: {?=$jadwal.totalRecords?} || Bulan: {?=isset_or($jadwal.showBulan)?}

                  @@ -79,48 +79,48 @@

                  Jumlah: {?=count($jadwal.totalRec {if: !empty($jadwal.list)} {loop: $jadwal.list} - {$value.nama} - {$value.h1} - {$value.h2} - {$value.h3} - {$value.h4} - {$value.h5} - {$value.h6} - {$value.h7} - {$value.h8} - {$value.h9} - {$value.h10} - {$value.h11} - {$value.h12} - {$value.h13} - {$value.h14} - {$value.h15} - {$value.h16} - {$value.h17} - {$value.h18} - {$value.h19} - {$value.h20} - {$value.h21} - {$value.h22} - {$value.h23} - {$value.h24} - {$value.h25} - {$value.h26} - {$value.h27} - {$value.h28} - {$value.h29} - {$value.h30} - {$value.h31} + {?=isset_or($value.nama)?} + {?=isset_or($value.h1)?} + {?=isset_or($value.h2)?} + {?=isset_or($value.h3)?} + {?=isset_or($value.h4)?} + {?=isset_or($value.h5)?} + {?=isset_or($value.h6)?} + {?=isset_or($value.h7)?} + {?=isset_or($value.h8)?} + {?=isset_or($value.h9)?} + {?=isset_or($value.h10)?} + {?=isset_or($value.h11)?} + {?=isset_or($value.h12)?} + {?=isset_or($value.h13)?} + {?=isset_or($value.h14)?} + {?=isset_or($value.h15)?} + {?=isset_or($value.h16)?} + {?=isset_or($value.h17)?} + {?=isset_or($value.h18)?} + {?=isset_or($value.h19)?} + {?=isset_or($value.h20)?} + {?=isset_or($value.h21)?} + {?=isset_or($value.h22)?} + {?=isset_or($value.h23)?} + {?=isset_or($value.h24)?} + {?=isset_or($value.h25)?} + {?=isset_or($value.h26)?} + {?=isset_or($value.h27)?} + {?=isset_or($value.h28)?} + {?=isset_or($value.h29)?} + {?=isset_or($value.h30)?} + {?=isset_or($value.h31)?} - + @@ -135,7 +135,7 @@

                  Jumlah: {?=count($jadwal.totalRec

                  - {$jadwal.pagination} + {?=isset_or($jadwal.pagination)?}
                  diff --git a/plugins/presensi/view/admin/jadwal_tambah.form.html b/plugins/presensi/view/admin/jadwal_tambah.form.html index 1de96e824..3eddf77f4 100644 --- a/plugins/presensi/view/admin/jadwal_tambah.form.html +++ b/plugins/presensi/view/admin/jadwal_tambah.form.html @@ -17,7 +17,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -27,7 +27,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -37,7 +37,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -51,7 +51,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -62,7 +62,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -73,7 +73,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -84,7 +84,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -95,7 +95,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -106,7 +106,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -119,7 +119,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -130,7 +130,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -141,7 +141,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -152,7 +152,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -163,7 +163,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -174,7 +174,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -187,7 +187,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -198,7 +198,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -209,7 +209,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -220,7 +220,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -231,7 +231,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -242,7 +242,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -255,7 +255,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -266,7 +266,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -277,7 +277,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -288,7 +288,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -299,7 +299,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -310,7 +310,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -323,7 +323,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -334,7 +334,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -345,7 +345,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -356,7 +356,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -367,7 +367,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -378,7 +378,7 @@

                  Tambah Jadwal Tambahan Presensi

                  @@ -391,7 +391,7 @@

                  Tambah Jadwal Tambahan Presensi

                  diff --git a/plugins/presensi/view/admin/jadwal_tambah.manage.html b/plugins/presensi/view/admin/jadwal_tambah.manage.html index eba9f8183..cb6246ea2 100644 --- a/plugins/presensi/view/admin/jadwal_tambah.manage.html +++ b/plugins/presensi/view/admin/jadwal_tambah.manage.html @@ -4,25 +4,25 @@

                  Kelola Jadwal Tambahan Presensi

                  -

                  Jumlah: {?=count($jadwal_tambah.totalRecords)?} || Bulan: {$jadwal_tambah.showBulan}

                  +

                  Jumlah: {?=$jadwal_tambah.totalRecords?} || Bulan: {?=isset_or($jadwal_tambah.showBulan)?}

                  @@ -79,48 +79,48 @@

                  Jumlah: {?=count($jadwal_tambah.t {if: !empty($jadwal_tambah.list)} {loop: $jadwal_tambah.list} - {$value.nama} - {$value.h1} - {$value.h2} - {$value.h3} - {$value.h4} - {$value.h5} - {$value.h6} - {$value.h7} - {$value.h8} - {$value.h9} - {$value.h10} - {$value.h11} - {$value.h12} - {$value.h13} - {$value.h14} - {$value.h15} - {$value.h16} - {$value.h17} - {$value.h18} - {$value.h19} - {$value.h20} - {$value.h21} - {$value.h22} - {$value.h23} - {$value.h24} - {$value.h25} - {$value.h26} - {$value.h27} - {$value.h28} - {$value.h29} - {$value.h30} - {$value.h31} + {?=isset_or($value.nama)?} + {?=isset_or($value.h1)?} + {?=isset_or($value.h2)?} + {?=isset_or($value.h3)?} + {?=isset_or($value.h4)?} + {?=isset_or($value.h5)?} + {?=isset_or($value.h6)?} + {?=isset_or($value.h7)?} + {?=isset_or($value.h8)?} + {?=isset_or($value.h9)?} + {?=isset_or($value.h10)?} + {?=isset_or($value.h11)?} + {?=isset_or($value.h12)?} + {?=isset_or($value.h13)?} + {?=isset_or($value.h14)?} + {?=isset_or($value.h15)?} + {?=isset_or($value.h16)?} + {?=isset_or($value.h17)?} + {?=isset_or($value.h18)?} + {?=isset_or($value.h19)?} + {?=isset_or($value.h20)?} + {?=isset_or($value.h21)?} + {?=isset_or($value.h22)?} + {?=isset_or($value.h23)?} + {?=isset_or($value.h24)?} + {?=isset_or($value.h25)?} + {?=isset_or($value.h26)?} + {?=isset_or($value.h27)?} + {?=isset_or($value.h28)?} + {?=isset_or($value.h29)?} + {?=isset_or($value.h30)?} + {?=isset_or($value.h31)?} - + @@ -135,7 +135,7 @@

                  Jumlah: {?=count($jadwal_tambah.t

                  - {$jadwal_tambah.pagination} + {?=isset_or($jadwal_tambah.pagination)?}
                  diff --git a/plugins/presensi/view/admin/jagaadd.form.html b/plugins/presensi/view/admin/jagaadd.form.html index 620556f5f..9be23fe6a 100644 --- a/plugins/presensi/view/admin/jagaadd.form.html +++ b/plugins/presensi/view/admin/jagaadd.form.html @@ -4,11 +4,11 @@

                  Tambah Data Jam Jaga

                  @@ -18,16 +18,16 @@

                  Tambah Data Jam Jaga

                  - +
                  @@ -37,7 +37,7 @@

                  Tambah Data Jam Jaga

                  @@ -47,7 +47,7 @@

                  Tambah Data Jam Jaga

                  diff --git a/plugins/presensi/view/admin/index.html b/plugins/presensi/view/admin/jam_jaga.html similarity index 67% rename from plugins/presensi/view/admin/index.html rename to plugins/presensi/view/admin/jam_jaga.html index 0c1f7bb94..6c8ca068a 100644 --- a/plugins/presensi/view/admin/index.html +++ b/plugins/presensi/view/admin/jam_jaga.html @@ -11,17 +11,17 @@

                  Kelola Data Jam Jaga

                  Tidak Aktif -->
                • - Tambah + Tambah
                • -

                  Jumlah: {?=count($jamjaga.totalRecords)?}

                  +

                  Jumlah: {?=$jamjaga.totalRecords?}

                  @@ -43,31 +43,22 @@

                  Jumlah: {?=count($jamjaga.totalRe Shift Jam Masuk Jam Pulang - + Aksi {if: !empty($jamjaga.list)} {loop: $jamjaga.list} - {$value.dep_id} - {$value.shift} - {$value.jam_masuk} - {$value.jam_pulang} - + {/loop} {else} @@ -78,7 +69,7 @@

                  Jumlah: {?=count($jamjaga.totalRe

                  - {$jamjaga.pagination} + {?=isset_or($jamjaga.pagination)?}
                  diff --git a/plugins/presensi/view/admin/jam_masuk.form.html b/plugins/presensi/view/admin/jam_masuk.form.html new file mode 100644 index 000000000..f67a39306 --- /dev/null +++ b/plugins/presensi/view/admin/jam_masuk.form.html @@ -0,0 +1,48 @@ +
                  +
                  +
                  +
                  +

                  {?=isset_or($jam_masuk.title)?}

                  + +
                  +
                  + +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + Batal +
                  + +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/plugins/presensi/view/admin/jam_masuk.manage.html b/plugins/presensi/view/admin/jam_masuk.manage.html new file mode 100644 index 000000000..6f00197c8 --- /dev/null +++ b/plugins/presensi/view/admin/jam_masuk.manage.html @@ -0,0 +1,71 @@ +
                  +
                  +
                  +
                  +

                  Kelola Data Jam Masuk

                  + +
                  +
                  +
                  +
                  +

                  Jumlah: {?=$jam_masuk.totalRecords?}

                  +
                  +
                  +
                  +
                  + + + + + +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + {if: !empty($jam_masuk.list)} + {loop: $jam_masuk.list} + + + + + + + {/loop} + {else} + + + + {/if} + +
                  ShiftJam MasukJam PulangAksi
                  {?=isset_or($value.shift)?}{?=isset_or($value.jam_masuk)?}{?=isset_or($value.jam_pulang)?} + + + + + + +
                  Kosong
                  +
                  + {?=isset_or($jam_masuk.pagination)?} +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/plugins/presensi/view/admin/manage.html b/plugins/presensi/view/admin/manage.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/presensi/view/admin/manage.html +++ b/plugins/presensi/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/presensi/view/admin/presensi.html b/plugins/presensi/view/admin/presensi.html index 78337f562..b2792ec41 100644 --- a/plugins/presensi/view/admin/presensi.html +++ b/plugins/presensi/view/admin/presensi.html @@ -7,7 +7,7 @@

                  Presensi Masuk

                  -

                  Jumlah: {?=count($presensi.totalRecords)?}

                  +

                  Jumlah: {?=$presensi.totalRecords?}

                  {if: $this->core->getUserInfo('role') == 'admin'}
                  @@ -16,7 +16,7 @@

                  Jumlah: {?=count($presensi.totalR

                  @@ -29,7 +29,7 @@

                  Jumlah: {?=count($presensi.totalR

                  @@ -65,17 +65,17 @@

                  Jumlah: {?=count($presensi.totalR {loop: $presensi.list} - - Profile Image + + Profile Image - + - {$value.jbtn} - {$value.shift} - {$value.bidang} - {$value.jam_datang} + {?=isset_or($value.jbtn)?} + {?=isset_or($value.shift)?} + {?=isset_or($value.bidang)?} + {?=isset_or($value.jam_datang)?} - + @@ -89,7 +89,7 @@

                  Jumlah: {?=count($presensi.totalR

                  - {$presensi.pagination} + {?=isset_or($presensi.pagination)?} diff --git a/plugins/presensi/view/admin/rekap_bulanan.html b/plugins/presensi/view/admin/rekap_bulanan.html new file mode 100644 index 000000000..a448748c1 --- /dev/null +++ b/plugins/presensi/view/admin/rekap_bulanan.html @@ -0,0 +1,92 @@ +
                  +
                  +
                  +
                  +

                  Rekap Bulanan Presensi

                  +
                  +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + +
                  + + + + +
                  +
                  +
                  +
                  +
                  + + Cetak Rekap +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + {if: !empty($rekap.list)} + {loop: $rekap.list} + + + + + + + {/loop} + {else} + + + + {/if} + +
                  NamaJabatanRuanganTotal Kehadiran
                  {?=isset_or($value.nama)?}{?=isset_or($value.jbtn)?}{?=isset_or($value.bidang)?}{?=isset_or($value.count)?}
                  Kosong
                  +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/presensi/view/admin/rekap_presensi.html b/plugins/presensi/view/admin/rekap_presensi.html index 607faae17..e9bea702d 100644 --- a/plugins/presensi/view/admin/rekap_presensi.html +++ b/plugins/presensi/view/admin/rekap_presensi.html @@ -1,21 +1,24 @@
                  -
                  -
                  - - - - -
                  -

                  Rekap Presensi

                  - +
                  +
                  +
                  +
                  +

                  Jumlah: {?=$rekap.totalRecords?} | Total Kurang: + {?=isset_or($rekap.totalminus)?} | Total Lebih: {?=isset_or($rekap.totalplus)?}

                  -
                  -
                  -
                  -

                  Jumlah: {?=count($rekap.totalRecords)?} | Total Kurang: {$rekap.totalminus} | Total Lebih: {$rekap.totalplus}

                  -
                  -
                  -
                  - - -
                  -
                  -
                  - -
                  - - - - - - -
                  - -
                  +
                  +
                  + +
                  -
                  - - - - - - - - - - - - - - - - - - {if: !empty($rekap.list)} - {loop: $rekap.list} - - - - - - - - - - - - - - {/loop} - {else} - - - - {/if} - -
                  NamaJabatanShiftRuanganJam DatangJam PulangDurasiEfektifSelisihHariStatus
                  - - Profile Image - - - {$value.jbtn}{$value.shift}{$value.bidang}{$value.jam_datang}{$value.jam_pulang}{$value.durasi}{$value.efektif.efektif}{$value.efektif.kurang}{$value.date}{$value.stts1} {$value.stts2}
                  Kosong
                  +
                  +
                  + +
                  + + + + + +
                  - {$rekap.pagination} +
                  +
                  +
                  + + + + + + + + + + + + + + + + + + {if: !empty($rekap.list)} + {loop: $rekap.list} + + + + + + + + + + + + + + {/loop} + {else} + + + + {/if} + +
                  NamaJabatanShiftRuanganJam DatangJam PulangDurasiEfektifSelisihHariStatus
                  + + Profile Image + + + {?=isset_or($value.jbtn)?}{?=isset_or($value.shift)?}{?=isset_or($value.bidang)?}{?=isset_or($value.jam_datang)?}{?=isset_or($value.jam_pulang)?}{?=isset_or($value.durasi)?}{?=isset_or($value.efektif.efektif)?}{?=isset_or($value.efektif.kurang)?}{?=isset_or($value.date)?}{?=isset_or($value.stts1)?} {?=isset_or($value.stts2)?}
                  Kosong
                  +
                  + {?=isset_or($rekap.pagination)?}
                  +
                  + + + {/loop} + + +

                  +{/if} +

                  e-Radiologi

                  @@ -76,27 +275,232 @@

                  e-Radiologi

                  {loop: $radiologi} - - - + + + - {loop: $value.permintaan_pemeriksaan_radiologi as $data} - - - - - {/loop} + {loop: $value.permintaan_pemeriksaan_radiologi as $data} + + + + + {/loop} {/loop}
                  {$value.nm_dokter}{$value.noorder}{$value.tgl_permintaan} {$value.jam_permintaan}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.noorder)?}{?=isset_or($value.tgl_permintaan)?} {?=isset_or($value.jam_permintaan)?} - - + + - + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_update', 'radiologi') == true} + + + {/if}
                  Nama Pemeriksaan Status Bayar
                  {$data.nm_perawatan}{$data.stts_bayar}
                  {?=isset_or($data.nm_perawatan)?}{?=isset_or($data.stts_bayar)?}
                  + + + + + + diff --git a/plugins/radiologi/view/admin/stts.daftar.html b/plugins/radiologi/view/admin/stts.daftar.html index e2ecfcbcd..f6f05005b 100644 --- a/plugins/radiologi/view/admin/stts.daftar.html +++ b/plugins/radiologi/view/admin/stts.daftar.html @@ -1,7 +1,7 @@
                  - - + +
                  diff --git a/plugins/rawat_inap/Admin.php b/plugins/rawat_inap/Admin.php index a5146e0f2..972a362b1 100644 --- a/plugins/rawat_inap/Admin.php +++ b/plugins/rawat_inap/Admin.php @@ -2,11 +2,18 @@ namespace Plugins\Rawat_Inap; use Systems\AdminModule; +use Systems\Lib\BpjsService; class Admin extends AdminModule { private $_uploads = WEBAPPS_PATH.'/berkasrawat/pages/upload'; + protected array $assign = []; + private $consid = ''; + private $secretkey = ''; + private $api_url = ''; + private $user_key = ''; + public function navigation() { return [ @@ -20,8 +27,13 @@ public function anyManage() $tgl_masuk_akhir = ''; $status_pulang = ''; $status_periksa = ''; + if (!is_array($this->assign)) { + $this->assign = []; // atau bisa langsung array dengan default + } + $this->assign['stts_pulang'] = []; + if(isset($_POST['periode_rawat_inap'])) { $tgl_masuk = $_POST['periode_rawat_inap']; } @@ -37,7 +49,7 @@ public function anyManage() $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $master_berkas_digital = $this->db('master_berkas_digital')->toArray(); $this->_Display($tgl_masuk, $tgl_masuk_akhir, $status_pulang, $status_periksa); - return $this->draw('manage.html', ['rawat_inap' => $this->assign, 'cek_vclaim' => $cek_vclaim, 'master_berkas_digital' => $master_berkas_digital]); + return $this->draw('manage.html', ['rawat_inap' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim), 'master_berkas_digital' => htmlspecialchars_array($master_berkas_digital)]); } public function anyDisplay() @@ -62,7 +74,7 @@ public function anyDisplay() } $cek_vclaim = $this->db('mlite_modules')->where('dir', 'vclaim')->oneArray(); $this->_Display($tgl_masuk, $tgl_masuk_akhir, $status_pulang, $status_periksa); - echo $this->draw('display.html', ['rawat_inap' => $this->assign, 'cek_vclaim' => $cek_vclaim]); + echo $this->draw('display.html', ['rawat_inap' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim)]); exit(); } @@ -75,8 +87,9 @@ public function _Display($tgl_masuk='', $tgl_masuk_akhir='', $status_pulang='', $this->assign['penjab'] = $this->db('penjab')->where('status', '1')->toArray(); $this->assign['no_rawat'] = ''; - $bangsal = str_replace(",","','", $this->core->getUserInfo('cap', null, true)); - + $bangsal_list = str_replace(",","','", $this->core->getUserInfo('cap', null, true)); + + $params = []; $sql = "SELECT kamar_inap.*, reg_periksa.*, @@ -103,28 +116,46 @@ public function _Display($tgl_masuk='', $tgl_masuk_akhir='', $status_pulang='', reg_periksa.kd_pj=penjab.kd_pj"; if ($this->core->getUserInfo('role') != 'admin') { - $sql .= " AND bangsal.kd_bangsal IN ('$bangsal')"; + $sql .= " AND bangsal.kd_bangsal IN ('$bangsal_list')"; } if($status_pulang == '') { $sql .= " AND kamar_inap.stts_pulang = '-'"; } if($status_pulang == 'all' && $tgl_masuk !== '' && $tgl_masuk_akhir !== '') { - $sql .= " AND kamar_inap.stts_pulang = '-' AND kamar_inap.tgl_masuk BETWEEN '$tgl_masuk' AND '$tgl_masuk_akhir'"; + $sql .= " AND kamar_inap.stts_pulang = '-' AND kamar_inap.tgl_masuk BETWEEN ? AND ?"; + $params[] = $tgl_masuk; + $params[] = $tgl_masuk_akhir; } if($status_pulang == 'masuk' && $tgl_masuk !== '' && $tgl_masuk_akhir !== '') { - $sql .= " AND kamar_inap.tgl_masuk BETWEEN '$tgl_masuk' AND '$tgl_masuk_akhir'"; + $sql .= " AND kamar_inap.tgl_masuk BETWEEN ? AND ?"; + $params[] = $tgl_masuk; + $params[] = $tgl_masuk_akhir; } if($status_pulang == 'pulang' && $tgl_masuk !== '' && $tgl_masuk_akhir !== '') { - $sql .= " AND kamar_inap.tgl_keluar BETWEEN '$tgl_masuk' AND '$tgl_masuk_akhir'"; + $sql .= " AND kamar_inap.tgl_keluar BETWEEN ? AND ?"; + $params[] = $tgl_masuk; + $params[] = $tgl_masuk_akhir; } if($status_periksa == 'lunas' && $status_pulang == '-' && $tgl_masuk !== '' && $tgl_masuk_akhir !== '') { - $sql .= " AND reg_periksa.status_bayar = 'Sudah Bayar' AND kamar_inap.tgl_masuk BETWEEN '$tgl_masuk' AND '$tgl_masuk_akhir'"; + $sql .= " AND reg_periksa.status_bayar = 'Sudah Bayar' AND kamar_inap.tgl_masuk BETWEEN ? AND ?"; + $params[] = $tgl_masuk; + $params[] = $tgl_masuk_akhir; } $stmt = $this->db()->pdo()->prepare($sql); - $stmt->execute(); + $stmt->execute($params); $rows = $stmt->fetchAll(); + // XSS Prevention: Sanitize output + foreach ($rows as &$row) { + foreach ($row as $key => $value) { + if (is_string($value)) { + $row[$key] = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); + } + } + } + unset($row); + $this->assign['list'] = []; foreach ($rows as $row) { $row['status_billing'] = 'Sudah Bayar'; @@ -184,6 +215,7 @@ public function anyForm() $this->assign['stts_pulang'] = ['Sehat','Rujuk','APS','+','Meninggal','Sembuh','Membaik','Pulang Paksa','-','Pindah Kamar','Status Belum Lengkap','Atas Persetujuan Dokter','Atas Permintaan Sendiri','Lain-lain']; $this->assign['no_rawat'] = ''; if (isset($_POST['no_rawat'])){ + $no_rawat = htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $this->assign['kamar_inap'] = $this->db('kamar_inap') ->join('reg_periksa', 'reg_periksa.no_rawat=kamar_inap.no_rawat') ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') @@ -191,10 +223,10 @@ public function anyForm() ->join('dpjp_ranap', 'dpjp_ranap.no_rawat=kamar_inap.no_rawat') ->join('dokter', 'dokter.kd_dokter=dpjp_ranap.kd_dokter') ->join('penjab', 'penjab.kd_pj=reg_periksa.kd_pj') - ->where('kamar_inap.no_rawat', $_POST['no_rawat']) + ->where('kamar_inap.no_rawat', $no_rawat) ->oneArray(); echo $this->draw('form.html', [ - 'rawat_inap' => $this->assign + 'rawat_inap' => htmlspecialchars_array($this->assign) ]); } else { $this->assign['kamar_inap'] = [ @@ -214,7 +246,7 @@ public function anyForm() 'lama' => '' ]; echo $this->draw('form.html', [ - 'rawat_inap' => $this->assign + 'rawat_inap' => htmlspecialchars_array($this->assign) ]); } exit(); @@ -223,8 +255,9 @@ public function anyForm() public function anyStatusDaftar() { if(isset($_POST['no_rkm_medis'])) { + $no_rkm_medis = htmlspecialchars($_POST['no_rkm_medis'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $rawat = $this->db('reg_periksa') - ->where('no_rkm_medis', $_POST['no_rkm_medis']) + ->where('no_rkm_medis', $no_rkm_medis) ->where('status_bayar', 'Belum Bayar') ->limit(1) ->oneArray(); @@ -232,7 +265,7 @@ public function anyStatusDaftar() $stts_daftar ="Transaki tanggal ".date('Y-m-d', strtotime($rawat['tgl_registrasi']))." belum diselesaikan" ; $bg_status = 'text-danger'; } else { - $result = $this->db('reg_periksa')->where('no_rkm_medis', $_POST['no_rkm_medis'])->oneArray(); + $result = $this->db('reg_periksa')->where('no_rkm_medis', $no_rkm_medis)->oneArray(); if(!empty($result['no_rawat'])) { $stts_daftar = 'Lama'; $bg_status = 'text-info'; @@ -241,12 +274,13 @@ public function anyStatusDaftar() $bg_status = 'text-success'; } } - echo $this->draw('stts.daftar.html', ['stts_daftar' => $stts_daftar, 'bg_status' =>$bg_status]); + echo $this->draw('stts.daftar.html', ['stts_daftar' => htmlspecialchars($stts_daftar, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'stts_daftar_hidden' => htmlspecialchars($stts_daftar, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'bg_status' => $bg_status]); } else { + $no_rawat = htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $rawat = $this->db('reg_periksa') - ->where('no_rawat', $_POST['no_rawat']) + ->where('no_rawat', $no_rawat) ->oneArray(); - echo $this->draw('stts.daftar.html', ['stts_daftar' => $rawat['stts_daftar']]); + echo $this->draw('stts.daftar.html', ['stts_daftar' => htmlspecialchars($rawat['stts_daftar'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'stts_daftar_hidden' => htmlspecialchars($rawat['stts_daftar'] ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'bg_status' => 'text-info']); } exit(); } @@ -262,8 +296,8 @@ public function postSave() 'tgl_masuk' => $_POST['tgl_masuk'], 'jam_masuk' => $_POST['jam_masuk'], 'ttl_biaya' => $kamar['trf_kamar']*$_POST['lama'], - 'tgl_keluar' => '0000-00-00', - 'jam_keluar' => '00:00:00', + 'tgl_keluar' => null, + 'jam_keluar' => null, 'diagnosa_akhir' => '', 'diagnosa_awal' => $_POST['diagnosa_awal'], 'stts_pulang' => '-' @@ -346,7 +380,7 @@ public function anyPasien() ->toArray();*/ } - echo $this->draw('pasien.html', ['pasien' => $pasien]); + echo $this->draw('pasien.html', ['pasien' => htmlspecialchars_array($pasien)]); exit(); } @@ -359,7 +393,7 @@ public function getAntrian() ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') ->join('penjab', 'penjab.kd_pj=reg_periksa.kd_pj') - ->where('no_rawat', $_GET['no_rawat']) + ->where('no_rawat', htmlspecialchars($_GET['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')) ->oneArray(); echo $this->draw('antrian.html', ['rawat_inap' => $rawat_inap]); exit(); @@ -376,96 +410,120 @@ public function postSaveDetail() if($_POST['kat'] == 'tindakan') { $jns_perawatan = $this->db('jns_perawatan_inap')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->oneArray(); if($_POST['provider'] == 'rawat_inap_dr') { - $this->db('rawat_inap_dr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'kd_dokter' => $_POST['kode_provider'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrdr'] - ]); + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_inap_dr')->save([ + 'no_rawat' => $_POST['no_rawat'], + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'kd_dokter' => $_POST['kode_provider'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdr'] + ]); + } } if($_POST['provider'] == 'rawat_inap_pr') { - $this->db('rawat_inap_pr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'nip' => $_POST['kode_provider2'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrpr'] - ]); + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_inap_pr')->save([ + 'no_rawat' => $_POST['no_rawat'], + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'nip' => $_POST['kode_provider2'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrpr'] + ]); + } } if($_POST['provider'] == 'rawat_inap_drpr') { - $this->db('rawat_inap_drpr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'kd_dokter' => $_POST['kode_provider'], - 'nip' => $_POST['kode_provider2'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], - 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrdrpr'] - ]); - } - } - if($_POST['kat'] == 'obat') { - - $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); - $cek_resep = $this->db('resep_obat')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ranap')->oneArray(); - - if(empty($cek_resep)) { - - $resep_obat = $this->db('resep_obat') - ->save([ - 'no_resep' => $no_resep, - 'tgl_perawatan' => '0000-00-00', - 'jam' => '00:00:00', + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_inap_drpr')->save([ 'no_rawat' => $_POST['no_rawat'], + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], 'kd_dokter' => $_POST['kode_provider'], - 'tgl_peresepan' => $_POST['tgl_perawatan'], - 'jam_peresepan' => $_POST['jam_rawat'], - 'status' => 'ranap', - 'tgl_penyerahan' => '0000-00-00', - 'jam_penyerahan' => '00:00:00' + 'nip' => $_POST['kode_provider2'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdrpr'] ]); - - if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $_POST['kode_provider'])->oneArray()) { - $this->db('resep_dokter') - ->save([ - 'no_resep' => $no_resep, - 'kode_brng' => $_POST['kd_jenis_prw'], - 'jml' => $_POST['jml'], - 'aturan_pakai' => $_POST['aturan_pakai'] - ]); } + } + } + if($_POST['kat'] == 'obat') { + $maxRetries = 5; + $retryCount = 0; + $success = false; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + $no_resep = $this->core->setNoResep($_POST['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->join('resep_dokter', 'resep_obat.no_resep = resep_dokter.no_resep')->where('no_rawat', $_POST['no_rawat'])->where('tgl_peresepan', $_POST['tgl_perawatan'])->where('tgl_perawatan', 'IS', 'NULL')->where('status', 'ranap')->oneArray(); + + if(empty($cek_resep)) { + + $resep_obat = $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => null, + 'jam' => null, + 'no_rawat' => $_POST['no_rawat'], + 'kd_dokter' => $_POST['kode_provider'], + 'tgl_peresepan' => $_POST['tgl_perawatan'], + 'jam_peresepan' => $_POST['jam_rawat'], + 'status' => 'ranap', + 'tgl_penyerahan' => null, + 'jam_penyerahan' => null + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->where('kd_dokter', $_POST['kode_provider'])->oneArray()) { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $_POST['kd_jenis_prw'], + 'jml' => $_POST['jml'], + 'aturan_pakai' => $_POST['aturan_pakai'] + ]); + } - } else { + } else { - $no_resep = $cek_resep['no_resep']; + $no_resep = $cek_resep['no_resep']; - $this->db('resep_dokter') - ->save([ - 'no_resep' => $no_resep, - 'kode_brng' => $_POST['kd_jenis_prw'], - 'jml' => $_POST['jml'], - 'aturan_pakai' => $_POST['aturan_pakai'] - ]); + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $_POST['kd_jenis_prw'], + 'jml' => $_POST['jml'], + 'aturan_pakai' => $_POST['aturan_pakai'] + ]); + } + $this->db()->pdo()->commit(); + $success = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; + } + throw $e; + } } } @@ -578,7 +636,7 @@ public function anyRincian() } $resep[] = $row; } - echo $this->draw('rincian.html', ['rawat_inap_dr' => $rawat_inap_dr, 'rawat_inap_pr' => $rawat_inap_pr, 'rawat_inap_drpr' => $rawat_inap_drpr, 'jumlah_total' => $jumlah_total, 'jumlah_total_resep' => $jumlah_total_resep, 'resep' =>$resep, 'no_rawat' => $_POST['no_rawat']]); + echo $this->draw('rincian.html', ['rawat_inap_dr' => htmlspecialchars_array($rawat_inap_dr), 'rawat_inap_pr' => htmlspecialchars_array($rawat_inap_pr), 'rawat_inap_drpr' => htmlspecialchars_array($rawat_inap_drpr), 'jumlah_total' => $jumlah_total, 'jumlah_total_resep' => $jumlah_total_resep, 'resep' => htmlspecialchars_array($resep), 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); exit(); } @@ -631,7 +689,76 @@ public function anySoap() $result_ranap[] = $row; } - echo $this->draw('soap.html', ['pemeriksaan' => $result, 'pemeriksaan_ranap' => $result_ranap, 'diagnosa' => $diagnosa, 'prosedur' => $prosedur]); + echo $this->draw('soap.html', ['pemeriksaan' => htmlspecialchars_array($result), 'pemeriksaan_ranap' => htmlspecialchars_array($result_ranap), 'diagnosa' => htmlspecialchars_array($diagnosa), 'prosedur' => htmlspecialchars_array($prosedur)]); + exit(); + } + + public function anyFormSoap() + { + // Ambil data pasien dari reg_periksa dan pasien + $pasien_data = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->where('reg_periksa.no_rawat', $_POST['no_rawat']) + ->oneArray(); + + // Hitung umur + $umur = ''; + if($pasien_data) { + $tgl_lahir = new \DateTime($pasien_data['tgl_lahir']); + $tgl_daftar = new \DateTime($pasien_data['tgl_registrasi']); + $umur_tahun = $tgl_daftar->diff($tgl_lahir)->y; + $umur_bulan = $tgl_daftar->diff($tgl_lahir)->m; + $umur_hari = $tgl_daftar->diff($tgl_lahir)->d; + + if($umur_tahun > 0) { + $umur = $umur_tahun . ' Th'; + } elseif($umur_bulan > 0) { + $umur = $umur_bulan . ' Bl'; + } else { + $umur = $umur_hari . ' Hr'; + } + } + + // Ambil data pemeriksaan_ralan terbaru sebagai fallback + $pemeriksaan_ralan = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->desc('tgl_perawatan') + ->desc('jam_rawat') + ->oneArray(); + + // Set default values dari pemeriksaan_ralan jika ada + $default_values = [ + 'suhu_tubuh' => $pemeriksaan_ralan['suhu_tubuh'] ?? '', + 'tensi' => $pemeriksaan_ralan['tensi'] ?? '', + 'nadi' => $pemeriksaan_ralan['nadi'] ?? '', + 'respirasi' => $pemeriksaan_ralan['respirasi'] ?? '', + 'tinggi' => $pemeriksaan_ralan['tinggi'] ?? '', + 'berat' => $pemeriksaan_ralan['berat'] ?? '', + 'gcs' => $pemeriksaan_ralan['gcs'] ?? '', + 'kesadaran' => $pemeriksaan_ralan['kesadaran'] ?? '', + 'alergi' => $pemeriksaan_ralan['alergi'] ?? '', + 'lingkar_perut' => $pemeriksaan_ralan['lingkar_perut'] ?? '', + 'keluhan' => $pemeriksaan_ralan['keluhan'] ?? '', + 'pemeriksaan' => $pemeriksaan_ralan['pemeriksaan'] ?? '', + 'penilaian' => $pemeriksaan_ralan['penilaian'] ?? '', + 'rtl' => $pemeriksaan_ralan['rtl'] ?? '', + 'instruksi' => $pemeriksaan_ralan['instruksi'] ?? '', + 'evaluasi' => $pemeriksaan_ralan['evaluasi'] ?? '', + 'spo2' => $pemeriksaan_ralan['spo2'] ?? '' + ]; + + // Data pasien untuk form + $patient_data = [ + 'no_rawat' => $_POST['no_rawat'], + 'no_rkm_medis' => $pasien_data['no_rkm_medis'] ?? '', + 'nm_pasien' => $pasien_data['nm_pasien'] ?? '', + 'umur' => $umur + ]; + + echo $this->draw('form.soap.html', [ + 'default_values' => htmlspecialchars_array($default_values), + 'patient_data' => htmlspecialchars_array($patient_data) + ]); exit(); } @@ -647,6 +774,149 @@ public function postSaveSOAP() exit(); } + public function anyVitalSignsChart() + { + $no_rawat = $_POST['no_rawat']; + + // Ambil data tanda vital dari pemeriksaan_ralan dan pemeriksaan_ranap + $vital_signs_ralan = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $no_rawat) + ->asc('tgl_perawatan') + ->asc('jam_rawat') + ->toArray(); + + $vital_signs_ranap = $this->db('pemeriksaan_ranap') + ->where('no_rawat', $no_rawat) + ->asc('tgl_perawatan') + ->asc('jam_rawat') + ->toArray(); + + // Gabungkan data dari kedua tabel + $vital_signs = array_merge($vital_signs_ralan, $vital_signs_ranap); + + // Urutkan berdasarkan tanggal dan jam + usort($vital_signs, function($a, $b) { + $datetime_a = $a['tgl_perawatan'] . ' ' . $a['jam_rawat']; + $datetime_b = $b['tgl_perawatan'] . ' ' . $b['jam_rawat']; + return strtotime($datetime_a) - strtotime($datetime_b); + }); + + // Debug: Log jumlah data yang ditemukan + error_log('VitalSignsChart - no_rawat: ' . $no_rawat); + error_log('VitalSignsChart - ralan count: ' . count($vital_signs_ralan)); + error_log('VitalSignsChart - ranap count: ' . count($vital_signs_ranap)); + error_log('VitalSignsChart - total count: ' . count($vital_signs)); + if(count($vital_signs) > 0) { + error_log('VitalSignsChart - first record: ' . json_encode($vital_signs[0])); + } + + $chart_data = [ + 'labels' => [], + 'datasets' => [ + [ + 'label' => 'Suhu (°C)', + 'data' => [], + 'borderColor' => 'rgb(255, 99, 132)', + 'backgroundColor' => 'rgba(255, 99, 132, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ], + [ + 'label' => 'Tensi Sistol (mmHg)', + 'data' => [], + 'borderColor' => 'rgb(54, 162, 235)', + 'backgroundColor' => 'rgba(54, 162, 235, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ], + [ + 'label' => 'Tensi Diastol (mmHg)', + 'data' => [], + 'borderColor' => 'rgb(75, 192, 192)', + 'backgroundColor' => 'rgba(75, 192, 192, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ], + [ + 'label' => 'Nadi (/menit)', + 'data' => [], + 'borderColor' => 'rgb(255, 205, 86)', + 'backgroundColor' => 'rgba(255, 205, 86, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ], + [ + 'label' => 'RR (/menit)', + 'data' => [], + 'borderColor' => 'rgb(153, 102, 255)', + 'backgroundColor' => 'rgba(153, 102, 255, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ], + [ + 'label' => 'Tinggi (cm)', + 'data' => [], + 'borderColor' => 'rgb(255, 159, 64)', + 'backgroundColor' => 'rgba(255, 159, 64, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1, + 'yAxisID' => 'y1' + ], + [ + 'label' => 'Berat (kg)', + 'data' => [], + 'borderColor' => 'rgb(199, 199, 199)', + 'backgroundColor' => 'rgba(199, 199, 199, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1, + 'yAxisID' => 'y1' + ], + [ + 'label' => 'SPO2 (%)', + 'data' => [], + 'borderColor' => 'rgb(83, 102, 255)', + 'backgroundColor' => 'rgba(83, 102, 255, 0.2)', + 'borderWidth' => 1, + 'tension' => 0.1 + ] + ] + ]; + + foreach($vital_signs as $vital) { + $date_label = date('d/m H:i', strtotime($vital['tgl_perawatan'] . ' ' . $vital['jam_rawat'])); + $chart_data['labels'][] = $date_label; + + // Suhu + $chart_data['datasets'][0]['data'][] = floatval($vital['suhu_tubuh']) ?: null; + + // Tensi - pisahkan sistol dan diastol + $tensi_parts = explode('/', $vital['tensi']); + $sistol = isset($tensi_parts[0]) ? floatval($tensi_parts[0]) : null; + $diastol = isset($tensi_parts[1]) ? floatval($tensi_parts[1]) : null; + $chart_data['datasets'][1]['data'][] = $sistol; + $chart_data['datasets'][2]['data'][] = $diastol; + + // Nadi + $chart_data['datasets'][3]['data'][] = floatval($vital['nadi']) ?: null; + + // RR + $chart_data['datasets'][4]['data'][] = floatval($vital['respirasi']) ?: null; + + // Tinggi + $chart_data['datasets'][5]['data'][] = floatval($vital['tinggi']) ?: null; + + // Berat + $chart_data['datasets'][6]['data'][] = floatval($vital['berat']) ?: null; + + // SPO2 + $chart_data['datasets'][7]['data'][] = floatval($vital['spo2']) ?: null; + } + + header('Content-Type: application/json'); + echo json_encode(htmlspecialchars_array($chart_data)); + exit(); + } + public function postHapusSOAP() { $this->db('pemeriksaan_ranap')->where('no_rawat', $_POST['no_rawat'])->where('tgl_perawatan', $_POST['tgl_perawatan'])->where('jam_rawat', $_POST['jam_rawat'])->delete(); @@ -657,10 +927,10 @@ public function anyLayanan() { $layanan = $this->db('jns_perawatan_inap') ->where('status', '1') - ->like('nm_perawatan', '%'.$_POST['layanan'].'%') + ->like('nm_perawatan', '%'.htmlspecialchars($_POST['layanan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('layanan.html', ['layanan' => $layanan]); + echo $this->draw('layanan.html', ['layanan' => htmlspecialchars_array($layanan)]); exit(); } @@ -670,10 +940,10 @@ public function anyObat() ->join('gudangbarang', 'gudangbarang.kode_brng=databarang.kode_brng') ->where('status', '1') ->where('gudangbarang.kd_bangsal', $this->settings->get('farmasi.deporanap')) - ->like('databarang.nama_brng', '%'.$_POST['obat'].'%') + ->like('databarang.nama_brng', '%'.htmlspecialchars($_POST['obat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->limit(10) ->toArray(); - echo $this->draw('obat.html', ['obat' => $obat]); + echo $this->draw('obat.html', ['obat' => htmlspecialchars_array($obat)]); exit(); } @@ -700,7 +970,7 @@ public function postAturanPakai() public function anyBerkasDigital() { $berkas_digital = $this->db('berkas_digital_perawatan')->where('no_rawat', $_POST['no_rawat'])->toArray(); - echo $this->draw('berkasdigital.html', ['berkas_digital' => $berkas_digital]); + echo $this->draw('berkasdigital.html', ['berkas_digital' => htmlspecialchars_array($berkas_digital)]); exit(); } @@ -713,7 +983,7 @@ public function postSaveBerkasDigital() $filePath = $_FILES['file']['tmp_name']; curl_setopt_array($curl, array( - CURLOPT_URL => str_replace('webapps','',WEBAPPS_URL).'api/berkasdigital', + CURLOPT_URL => substr(rtrim(WEBAPPS_URL, '/'), 0, strrpos(rtrim(WEBAPPS_URL, '/'), '/')).'/api/berkasdigital', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, @@ -805,24 +1075,24 @@ public function postCekWaktu() public function postMaxid() { - $max_id = $this->db('reg_periksa')->select(['no_rawat' => 'ifnull(MAX(CONVERT(RIGHT(no_rawat,6),signed)),0)'])->where('tgl_registrasi', date('Y-m-d'))->oneArray(); - if(empty($max_id['no_rawat'])) { - $max_id['no_rawat'] = '000000'; - } - $_next_no_rawat = sprintf('%06s', ($max_id['no_rawat'] + 1)); - $next_no_rawat = date('Y/m/d').'/'.$_next_no_rawat; - echo $next_no_rawat; + $urut = $this->db('reg_periksa') + ->where('kd_poli', $this->settings->get('settings.rawat_inap')) + ->where('tgl_registrasi', date('Y-m-d')) + ->nextRightNumber('no_rawat', 6); + + $next_no_rawat = date('Y/m/d').'/'.$urut; + echo htmlspecialchars($next_no_rawat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); exit(); } public function postMaxAntrian() { - $max_id = $this->db('reg_periksa')->select(['no_reg' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)'])->where('kd_poli', $_POST['kd_poli'])->where('tgl_registrasi', date('Y-m-d'))->desc('no_reg')->limit(1)->oneArray(); - if(empty($max_id['no_reg'])) { - $max_id['no_reg'] = '000'; - } - $_next_no_reg = sprintf('%03s', ($max_id['no_reg'] + 1)); - echo $_next_no_reg; + $urut = $this->db('reg_periksa') + ->where('kd_poli', $this->settings->get('settings.rawat_inap')) + ->where('tgl_registrasi', date('Y-m-d')) + ->nextRightNumber('no_reg', 3); + + echo htmlspecialchars(sprintf('%03d', $urut), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); exit(); } @@ -839,7 +1109,7 @@ public function getSepDetail($no_sep){ $potensi_prb = $this->db('bpjs_prb')->where('no_sep', $no_sep)->oneArray(); $data_sep['potensi_prb'] = $potensi_prb['prb']; - echo $this->draw('sep.detail.html', ['data_sep' => $data_sep]); + echo $this->draw('sep.detail.html', ['data_sep' => htmlspecialchars_array($data_sep)]); exit(); } @@ -862,7 +1132,7 @@ public function getSuratRujukan($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_rujukan')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_inap/view/admin/surat.rujukan.html', true); exit(); } @@ -886,7 +1156,7 @@ public function getSuratSehat($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sehat')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_inap/view/admin/surat.sehat.html', true); exit(); } @@ -910,7 +1180,7 @@ public function getSuratSakit($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sakit')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_inap/view/admin/surat.sakit.html', true); exit(); } @@ -918,7 +1188,6 @@ public function getSuratSakit($no_rawat) public function postSimpanSuratSakit() { $query = $this->db('mlite_surat_sakit')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -938,16 +1207,15 @@ public function postSimpanSuratSakit() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -956,7 +1224,6 @@ public function postSimpanSuratSakit() public function postSimpanSuratSehat() { $query = $this->db('mlite_surat_sehat')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -977,16 +1244,15 @@ public function postSimpanSuratSehat() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -995,7 +1261,6 @@ public function postSimpanSuratSehat() public function postSimpanSuratRujukan() { $query = $this->db('mlite_surat_rujukan')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], 'no_rawat' => $_POST['no_rawat'], 'no_rkm_medis' => $_POST['no_rkm_medis'], @@ -1017,16 +1282,15 @@ public function postSimpanSuratRujukan() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -1046,7 +1310,7 @@ public function anyKontrol() $row['nomor'] = $i++; $result[] = $row; } - echo $this->draw('kontrol.html', ['booking_registrasi' => $result]); + echo $this->draw('kontrol.html', ['booking_registrasi' => htmlspecialchars_array($result)]); exit(); } @@ -1121,8 +1385,8 @@ public function postSaveKontrolBPJS() $data = json_encode($data); - $url = $this->api_url . 'RencanaKontrol/' . $statusUrl; - $output = BpjsService::$method($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $url = $this->api_url . 'RencanaKontrol/insert'; + $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $data = json_decode($output, true); //echo $data['metaData']['message']; if ($data == NULL) { @@ -1162,8 +1426,710 @@ public function getPersetujuanUmum($no_rkm_medis) $settings = $this->settings('settings'); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($settings))); $pasien = $this->db('pasien')->where('no_rkm_medis', $no_rkm_medis)->oneArray(); - echo $this->draw('persetujuan.umum.html', ['pasien' => $pasien]); + echo $this->draw('persetujuan.umum.html', ['pasien' => htmlspecialchars_array($pasien)]); + exit(); + } + + public function postSaveICD10() + { + $_POST['status_penyakit'] = 'Baru'; + unset($_POST['nama']); + $this->db('diagnosa_pasien')->save($_POST); + exit(); + } + + public function postHapusICD10() + { + $this->db('diagnosa_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + exit(); + } + + public function postICD10() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('penyakit')->like('kd_penyakit', $key)->orLike('nm_penyakit', $key)->asc('kd_penyakit')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + exit(); + + } + + public function postSaveICD9() + { + unset($_POST['nama']); + $this->db('prosedur_pasien')->save($_POST); + exit(); + } + + public function postHapusICD9() + { + $this->db('prosedur_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + exit(); + } + + public function postICD9() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('icd9')->like('kode', $key)->orLike('deskripsi_panjang', $key)->asc('kode')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + + exit(); + + } + + public function getDisplayICD() + { + $no_rawat = $_GET['no_rawat']; + $prosedurs = $this->db('prosedur_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $prosedur = []; + foreach ($prosedurs as $row_prosedur) { + $icd9 = $this->db('icd9')->where('kode', $row_prosedur['kode'])->oneArray(); + $row_prosedur['nama'] = $icd9['deskripsi_panjang']; + $prosedur[] = $row_prosedur; + } + + $diagnosas = $this->db('diagnosa_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $diagnosa = []; + foreach ($diagnosas as $row_diagnosa) { + $icd10 = $this->db('penyakit')->where('kd_penyakit', $row_diagnosa['kd_penyakit'])->oneArray(); + $row_diagnosa['nama'] = $icd10['nm_penyakit']; + $diagnosa[] = $row_diagnosa; + } + + echo $this->draw('display.icd.html', ['diagnosa' => htmlspecialchars_array($diagnosa), 'prosedur' => htmlspecialchars_array($prosedur)]); + exit(); + } + + public function getAssessment($no_rawat) + { + $no_rawat = revertNoRawat($no_rawat); + + // Cek apakah sudah ada data assessment + $penilaian_ranap = $this->db('penilaian_awal_keperawatan_ranap') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + // Jika belum ada, ambil data fallback dari pemeriksaan_ralan dan pemeriksaan_ranap + if(!$penilaian_ranap) { + $pemeriksaan_ralan = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $no_rawat) + ->desc('tgl_perawatan') + ->desc('jam_rawat') + ->oneArray(); + + $pemeriksaan_ranap = $this->db('pemeriksaan_ranap') + ->where('no_rawat', $no_rawat) + ->desc('tgl_perawatan') + ->desc('jam_rawat') + ->oneArray(); + + $penilaian_ranap = [ + 'no_rawat' => $no_rawat, + 'tanggal' => date('Y-m-d H:i:s'), + 'informasi' => 'Autoanamnesis', + 'ket_informasi' => '-', + 'tiba_diruang_rawat' => 'Jalan Tanpa Bantuan', + 'kasus_trauma' => 'Non Trauma', + 'cara_masuk' => 'Poli', + 'rps' => $pemeriksaan_ralan['keluhan'] ?? $pemeriksaan_ranap['keluhan'] ?? '', + 'rpd' => '-', + 'rpk' => '-', + 'rpo' => '-', + 'riwayat_pembedahan' => '-', + 'riwayat_dirawat_dirs' => '-', + 'alat_bantu_dipakai' => 'Kacamata', + 'riwayat_kehamilan' => 'Tidak', + 'riwayat_kehamilan_perkiraan' => '-', + 'riwayat_tranfusi' => '-', + 'riwayat_alergi' => $pemeriksaan_ralan['alergi'] ?? $pemeriksaan_ranap['alergi'] ?? '', + 'riwayat_merokok' => 'Tidak', + 'riwayat_merokok_jumlah' => '-', + 'riwayat_alkohol' => 'Tidak', + 'riwayat_alkohol_jumlah' => '-', + 'riwayat_narkoba' => 'Tidak', + 'riwayat_olahraga' => 'Tidak', + 'pemeriksaan_mental' => '-', + 'pemeriksaan_keadaan_umum' => 'Baik', + 'pemeriksaan_gcs' => $pemeriksaan_ralan['gcs'] ?? $pemeriksaan_ranap['gcs'] ?? '', + 'pemeriksaan_td' => $pemeriksaan_ralan['tensi'] ?? $pemeriksaan_ranap['tensi'] ?? '', + 'pemeriksaan_nadi' => $pemeriksaan_ralan['nadi'] ?? $pemeriksaan_ranap['nadi'] ?? '', + 'pemeriksaan_rr' => $pemeriksaan_ralan['respirasi'] ?? $pemeriksaan_ranap['respirasi'] ?? '', + 'pemeriksaan_suhu' => $pemeriksaan_ralan['suhu_tubuh'] ?? $pemeriksaan_ranap['suhu_tubuh'] ?? '', + 'pemeriksaan_spo2' => $pemeriksaan_ralan['spo2'] ?? $pemeriksaan_ranap['spo2'] ?? '', + 'pemeriksaan_bb' => $pemeriksaan_ralan['berat'] ?? $pemeriksaan_ranap['berat'] ?? '', + 'pemeriksaan_tb' => $pemeriksaan_ralan['tinggi'] ?? $pemeriksaan_ranap['tinggi'] ?? '', + 'pemeriksaan_susunan_kepala' => 'TAK', + 'pemeriksaan_susunan_kepala_keterangan' => '-', + 'pemeriksaan_susunan_wajah' => 'TAK', + 'pemeriksaan_susunan_wajah_keterangan' => '-', + 'pemeriksaan_susunan_leher' => 'TAK', + 'pemeriksaan_susunan_leher_keterangan' => '-', + 'pemeriksaan_susunan_kejang' => 'TAK', + 'pemeriksaan_susunan_kejang_keterangan' => '-', + 'pemeriksaan_susunan_sensorik' => 'TAK', + 'pemeriksaan_susunan_sensorik_keterangan' => '-', + 'pemeriksaan_kardiovaskuler_denyut_nadi' => 'Teratur', + 'pemeriksaan_kardiovaskuler_sirkulasi' => 'Akral Hangat', + 'pemeriksaan_kardiovaskuler_sirkulasi_keterangan' => '-', + 'pemeriksaan_kardiovaskuler_pulsasi' => 'Kuat', + 'pemeriksaan_respirasi_pola_nafas' => 'Normal', + 'pemeriksaan_respirasi_retraksi' => 'Tidak Ada', + 'pemeriksaan_respirasi_suara_nafas' => 'Vesikuler', + 'pemeriksaan_respirasi_volume_pernafasan' => 'Normal', + 'pemeriksaan_respirasi_jenis_pernafasan' => 'Pernafasan Dada', + 'pemeriksaan_respirasi_jenis_pernafasan_keterangan' => '-', + 'pemeriksaan_respirasi_irama_nafas' => 'Teratur', + 'pemeriksaan_respirasi_batuk' => 'Tidak', + 'pemeriksaan_gastrointestinal_mulut' => 'TAK', + 'pemeriksaan_gastrointestinal_mulut_keterangan' => '-', + 'pemeriksaan_gastrointestinal_gigi' => 'TAK', + 'pemeriksaan_gastrointestinal_gigi_keterangan' => '-', + 'pemeriksaan_gastrointestinal_lidah' => 'TAK', + 'pemeriksaan_gastrointestinal_lidah_keterangan' => '-', + 'pemeriksaan_gastrointestinal_tenggorokan' => 'TAK', + 'pemeriksaan_gastrointestinal_tenggorokan_keterangan' => '-', + 'pemeriksaan_gastrointestinal_abdomen' => 'Supel', + 'pemeriksaan_gastrointestinal_abdomen_keterangan' => '-', + 'pemeriksaan_gastrointestinal_peistatik_usus' => 'TAK', + 'pemeriksaan_gastrointestinal_peistatik_usus_keterangan' => '-', + 'pemeriksaan_gastrointestinal_anus' => 'TAK', + 'pemeriksaan_gastrointestinal_anus_keterangan' => '-', + 'pemeriksaan_neurologi_pengelihatan' => 'TAK', + 'pemeriksaan_neurologi_pengelihatan_keterangan' => '-', + 'pemeriksaan_neurologi_alat_bantu_penglihatan' => 'Tidak', + 'pemeriksaan_neurologi_pendengaran' => 'TAK', + 'pemeriksaan_neurologi_pendengaran_keterangan' => '-', + 'pemeriksaan_neurologi_bicara' => 'Jelas', + 'pemeriksaan_neurologi_bicara_keterangan' => '-', + 'pemeriksaan_neurologi_sensorik' => 'TAK', + 'pemeriksaan_neurologi_sensorik_keterangan' => '-', + 'pemeriksaan_neurologi_motorik' => 'TAK', + 'pemeriksaan_neurologi_motorik_keterangan' => '-', + 'pemeriksaan_neurologi_kekuatan_otot' => 'Kuat', + 'pemeriksaan_neurologi_kekuatan_otot_keterangan' => '-', + 'pemeriksaan_integument_warnakulit' => 'Normal', + 'pemeriksaan_integument_warnakulit_keterangan' => '-', + 'pemeriksaan_integument_turgor' => 'Baik', + 'pemeriksaan_integument_turgor_keterangan' => '-', + 'pemeriksaan_integument_kulit' => 'Normal', + 'pemeriksaan_integument_kulit_keterangan' => '-', + 'pemeriksaan_integument_dekubitas' => 'Tidak Ada', + 'pemeriksaan_integument_dekubitas_keterangan' => '-', + 'pemeriksaan_muskuloskletal_pergerakan_sendi' => 'Bebas', + 'pemeriksaan_muskuloskletal_pergerakan_sendi_keterangan' => '-', + 'pemeriksaan_muskuloskletal_kekauatan_otot' => 'Baik', + 'pemeriksaan_muskuloskletal_kekauatan_otot_keterangan' => '-', + 'pemeriksaan_muskuloskletal_nyeri_sendi' => 'Tidak Ada', + 'pemeriksaan_muskuloskletal_nyeri_sendi_keterangan' => '-', + 'pemeriksaan_muskuloskletal_oedema' => 'Tidak Ada', + 'pemeriksaan_muskuloskletal_oedema_keterangan' => '-', + 'pemeriksaan_muskuloskletal_fraktur' => 'Tidak Ada', + 'pemeriksaan_muskuloskletal_fraktur_keterangan' => '-', + 'pemeriksaan_eliminasi_bab_frekuensi_jumlah' => '-', + 'pemeriksaan_eliminasi_bab_frekuensi_durasi' => '-', + 'pemeriksaan_eliminasi_bab_konsistensi' => '-', + 'pemeriksaan_eliminasi_bab_warna' => '-', + 'pemeriksaan_eliminasi_bak_frekuensi_jumlah' => '-', + 'pemeriksaan_eliminasi_bak_frekuensi_durasi' => '-', + 'pemeriksaan_eliminasi_bak_warna' => '-', + 'pemeriksaan_eliminasi_bak_lainlain' => '-', + 'pola_aktifitas_makanminum' => 'Mandiri', + 'pola_aktifitas_mandi' => 'Mandiri', + 'pola_aktifitas_eliminasi' => 'Mandiri', + 'pola_aktifitas_berpakaian' => 'Mandiri', + 'pola_aktifitas_berpindah' => 'Mandiri', + 'pola_nutrisi_frekuesi_makan' => '-', + 'pola_nutrisi_jenis_makanan' => '-', + 'pola_nutrisi_porsi_makan' => '-', + 'pola_tidur_lama_tidur' => '-', + 'pola_tidur_gangguan' => 'Tidak Ada Gangguan', + 'pengkajian_fungsi_kemampuan_sehari' => 'Mandiri', + 'pengkajian_fungsi_aktifitas' => 'Berjalan', + 'pengkajian_fungsi_berjalan' => 'TAK', + 'pengkajian_fungsi_berjalan_keterangan' => '-', + 'pengkajian_fungsi_ambulasi' => 'Tidak Menggunakan', + 'pengkajian_fungsi_ekstrimitas_atas' => 'TAK', + 'pengkajian_fungsi_ekstrimitas_atas_keterangan' => '-', + 'pengkajian_fungsi_ekstrimitas_bawah' => 'TAK', + 'pengkajian_fungsi_ekstrimitas_bawah_keterangan' => '-', + 'pengkajian_fungsi_menggenggam' => 'Tidak Ada Kesulitan', + 'pengkajian_fungsi_menggenggam_keterangan' => '-', + 'pengkajian_fungsi_koordinasi' => 'Tidak Ada Kesulitan', + 'pengkajian_fungsi_koordinasi_keterangan' => '-', + 'pengkajian_fungsi_kesimpulan' => 'Tidak (Tidak Perlu Co DPJP)', + 'riwayat_psiko_kondisi_psiko' => 'Tidak Ada Masalah', + 'riwayat_psiko_gangguan_jiwa' => 'Tidak', + 'riwayat_psiko_perilaku' => 'Tidak Ada Masalah', + 'riwayat_psiko_perilaku_keterangan' => '-', + 'riwayat_psiko_hubungan_keluarga' => 'Harmonis', + 'riwayat_psiko_tinggal' => 'Keluarga', + 'riwayat_psiko_tinggal_keterangan' => '-', + 'riwayat_psiko_nilai_kepercayaan' => 'Tidak Ada', + 'riwayat_psiko_nilai_kepercayaan_keterangan' => '-', + 'riwayat_psiko_pendidikan_pj' => '-', + 'riwayat_psiko_edukasi_diberikan' => 'Pasien', + 'riwayat_psiko_edukasi_diberikan_keterangan' => '-', + 'penilaian_nyeri' => 'Tidak Ada Nyeri', + 'penilaian_nyeri_penyebab' => 'Proses Penyakit', + 'penilaian_nyeri_ket_penyebab' => '-', + 'penilaian_nyeri_kualitas' => 'Seperti Tertusuk', + 'penilaian_nyeri_ket_kualitas' => '-', + 'penilaian_nyeri_lokasi' => '-', + 'penilaian_nyeri_ket_lokasi' => '-', + 'penilaian_nyeri_menyebar' => 'Tidak', + 'penilaian_nyeri_ket_menjalar' => '-', + 'penilaian_nyeri_skala' => '0', + 'penilaian_nyeri_ket_skala' => '-', + 'penilaian_nyeri_waktu' => '-', + 'penilaian_nyeri_ket_waktu' => '-', + 'penilaian_nyeri_hilang' => 'Istirahat', + 'penilaian_nyeri_ket_hilang' => '-', + 'penilaian_nyeri_diberitahukan_dokter' => 'Tidak', + 'penilaian_nyeri_ket_diberitahukan_dokter' => '-', + 'penilaian_nyeri_jam_diberitahukan_dokter' => '-', + 'penilaian_nyeri_ket_pada_dokter' => '-', + 'penilaian_jatuhmorse_skala1' => 'Tidak', + 'penilaian_jatuhmorse_nilai1' => 0, + 'penilaian_jatuhmorse_skala2' => 'Tidak', + 'penilaian_jatuhmorse_nilai2' => 0, + 'penilaian_jatuhmorse_skala3' => 'Tidak Ada/Kursi Roda/Perawat/Tirah Baring', + 'penilaian_jatuhmorse_nilai3' => 0, + 'penilaian_jatuhmorse_skala4' => 'Tidak', + 'penilaian_jatuhmorse_nilai4' => 0, + 'penilaian_jatuhmorse_skala5' => 'Normal/Tirah Baring/Imobilisasi', + 'penilaian_jatuhmorse_nilai5' => 0, + 'penilaian_jatuhmorse_skala6' => 'Sadar Akan Kemampuan Diri Sendiri', + 'penilaian_jatuhmorse_nilai6' => 0, + 'penilaian_jatuhmorse_totalnilai' => 0, + 'penilaian_jatuhsydney_skala1' => 'Tidak', + 'penilaian_jatuhsydney_nilai1' => 0, + 'penilaian_jatuhsydney_skala2' => 'Tidak', + 'penilaian_jatuhsydney_nilai2' => 0, + 'penilaian_jatuhsydney_skala3' => 'Tidak', + 'penilaian_jatuhsydney_nilai3' => 0, + 'penilaian_jatuhsydney_skala4' => 'Tidak', + 'penilaian_jatuhsydney_nilai4' => 0, + 'penilaian_jatuhsydney_skala5' => 'Tidak', + 'penilaian_jatuhsydney_nilai5' => 0, + 'penilaian_jatuhsydney_skala6' => 'Tidak', + 'penilaian_jatuhsydney_nilai6' => 0, + 'penilaian_jatuhsydney_skala7' => 'Tidak', + 'penilaian_jatuhsydney_nilai7' => 0, + 'penilaian_jatuhsydney_skala8' => 'Tidak', + 'penilaian_jatuhsydney_nilai8' => 0, + 'penilaian_jatuhsydney_skala9' => 'Tidak', + 'penilaian_jatuhsydney_nilai9' => 0, + 'penilaian_jatuhsydney_skala10' => 'Tidak', + 'penilaian_jatuhsydney_nilai10' => 0, + 'penilaian_jatuhsydney_skala11' => 'Tidak', + 'penilaian_jatuhsydney_nilai11' => 0, + 'penilaian_jatuhsydney_totalnilai' => 0, + 'skrining_gizi1' => 'Tidak ada penurunan berat badan', + 'nilai_gizi1' => 0, + 'skrining_gizi2' => 'Tidak', + 'nilai_gizi2' => 0, + 'nilai_total_gizi' => 0, + 'skrining_gizi_diagnosa_khusus' => 'Tidak', + 'skrining_gizi_ket_diagnosa_khusus' => '-', + 'skrining_gizi_diketahui_dietisen' => 'Tidak', + 'skrining_gizi_jam_diketahui_dietisen' => '-', + 'rencana' => '-', + 'nip1' => $this->core->getUserInfo('username', null, true), + 'nip2' => $this->core->getUserInfo('username', null, true), + 'kd_dokter' => $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat), + ]; + } + + echo $this->draw('assesment.html', ['penilaian_ranap' => htmlspecialchars_array($penilaian_ranap)]); + exit(); + } + + public function postAssessmentsave() + { + $_POST['nip1'] = $this->core->getUserInfo('username', null, true); + $_POST['nip2'] = $this->core->getUserInfo('username', null, true); + + // Remove fields that don't exist in database + $data = $_POST; + unset($data['no_rawat_display']); + + // Cek apakah sudah ada data + $existing = $this->db('penilaian_awal_keperawatan_ranap') + ->where('no_rawat', $data['no_rawat']) + ->oneArray(); + + if($existing) { + // Update data yang sudah ada + $query = $this->db('penilaian_awal_keperawatan_ranap') + ->where('no_rawat', $data['no_rawat']) + ->save($data); + } else { + // Insert data baru + $query = $this->db('penilaian_awal_keperawatan_ranap')->save($data); + } + + if($query) { + $data['status'] = 'success'; + echo json_encode(htmlspecialchars_array($data)); + } else { + $data['status'] = 'error'; + $data['msg'] = 'Gagal menyimpan data assessment'; + echo json_encode(htmlspecialchars_array($data)); + } + exit(); + } + + public function getAssessmenttampil($no_rawat) + { + $no_rawat = revertNoRawat($no_rawat); + + $penilaian_ranap = $this->db('penilaian_awal_keperawatan_ranap') + ->join('petugas as p1', 'p1.nip=penilaian_awal_keperawatan_ranap.nip1') + ->join('petugas as p2', 'p2.nip=penilaian_awal_keperawatan_ranap.nip2') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if($penilaian_ranap) { + $penilaian_ranap['nama_petugas1'] = $penilaian_ranap['p1.nama']; + $penilaian_ranap['nama_petugas2'] = $penilaian_ranap['p2.nama']; + } + + echo $this->draw('assesment.tampil.html', ['penilaian_ranap' => htmlspecialchars_array($penilaian_ranap)]); + exit(); + } + + public function postAssessmentdelete() + { + $query = $this->db('penilaian_awal_keperawatan_ranap') + ->where('no_rawat', $_POST['no_rawat']) + ->delete(); + + if($query) { + $data['status'] = 'success'; + echo json_encode(htmlspecialchars_array($data)); + } else { + $data['status'] = 'error'; + $data['msg'] = 'Gagal menghapus data assessment'; + echo json_encode(htmlspecialchars_array($data)); + } + exit(); + } + + // ADIME Gizi Methods + public function postSaveadimegizi() + { + $data = [ + 'no_rawat' => $_POST['no_rawat'], + 'tanggal' => $_POST['tanggal'], + 'asesmen' => $_POST['asesmen'] ?? null, + 'diagnosis' => $_POST['diagnosis'] ?? null, + 'intervensi' => $_POST['intervensi'] ?? null, + 'monitoring' => $_POST['monitoring'] ?? null, + 'evaluasi' => $_POST['evaluasi'] ?? null, + 'instruksi' => $_POST['instruksi'] ?? null, + 'nip' => $this->core->getUserInfo('username', null, true) + ]; + + // Cek apakah sudah ada data dengan no_rawat dan tanggal yang sama + $existing = $this->db('catatan_adime_gizi') + ->where('no_rawat', $data['no_rawat']) + ->where('tanggal', $data['tanggal']) + ->oneArray(); + + try { + if($existing) { + // Update data yang sudah ada + $query = $this->db('catatan_adime_gizi') + ->where('no_rawat', $data['no_rawat']) + ->where('tanggal', $data['tanggal']) + ->save($data); + } else { + // Insert data baru + $query = $this->db('catatan_adime_gizi')->save($data); + } + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data ADIME Gizi berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data ADIME Gizi']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + + exit(); + } + + public function postGetadimegizi() + { + $no_rawat = $_POST['no_rawat']; + + try { + $data = $this->db('catatan_adime_gizi') + ->join('petugas', 'petugas.nip=catatan_adime_gizi.nip') + ->select([ + 'catatan_adime_gizi.no_rawat', + 'catatan_adime_gizi.tanggal', + 'catatan_adime_gizi.asesmen', + 'catatan_adime_gizi.diagnosis', + 'catatan_adime_gizi.intervensi', + 'catatan_adime_gizi.monitoring', + 'catatan_adime_gizi.evaluasi', + 'catatan_adime_gizi.instruksi', + 'petugas.nama as nama_petugas' + ]) + ->where('catatan_adime_gizi.no_rawat', $no_rawat) + ->desc('catatan_adime_gizi.tanggal') + ->toArray(); + + echo json_encode(htmlspecialchars_array($data)); + } catch (\Exception $e) { + echo json_encode([]); + } + + exit(); + } + + public function postGetadimegizidetail() + { + $no_rawat = $_POST['no_rawat']; + $tanggal = $_POST['tanggal']; + + try { + $data = $this->db('catatan_adime_gizi') + ->where('no_rawat', $no_rawat) + ->where('tanggal', $tanggal) + ->oneArray(); + + echo json_encode(htmlspecialchars_array($data)); + } catch (\Exception $e) { + echo json_encode(null); + } + + exit(); + } + + public function postDeleteadimegizi() + { + $no_rawat = $_POST['no_rawat']; + $tanggal = $_POST['tanggal']; + + try { + $query = $this->db('catatan_adime_gizi') + ->where('no_rawat', $no_rawat) + ->where('tanggal', $tanggal) + ->delete(); + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data ADIME Gizi berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus data ADIME Gizi']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + + exit(); + } + + // Assessment Nyeri Methods + public function getAssessmentNyeri($no_rawat) + { + $no_rawat = revertNorawat($no_rawat); + $reg_periksa = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $penilaian_ulang_nyeri = $this->db('penilaian_ulang_nyeri') + ->join('petugas', 'petugas.nip=penilaian_ulang_nyeri.nip') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + // Get petugas info for current user + $petugas = $this->db('petugas') + ->where('nip', $this->core->getUserInfo('username', null, true)) + ->oneArray(); + + echo $this->draw('assessment.nyeri.html', ['reg_periksa' => htmlspecialchars_array($reg_periksa), 'penilaian_ulang_nyeri' => htmlspecialchars_array($penilaian_ulang_nyeri), 'petugas' => htmlspecialchars_array($petugas)]); + exit(); + } + + public function postAssessmentNyeri() + { + $_POST['nip'] = $this->core->getUserInfo('username', null, true); + + // Handle edit mode + if(isset($_POST['mode']) && $_POST['mode'] == 'edit' && isset($_POST['original_tanggal'])) { + $this->db('penilaian_ulang_nyeri') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['original_tanggal']) + ->save([ + 'nip' => $_POST['nip'], + 'tanggal' => $_POST['tanggal'], + 'nyeri' => $_POST['nyeri'], + 'provokes' => $_POST['provokes'], + 'ket_provokes' => $_POST['ket_provokes'], + 'quality' => $_POST['quality'], + 'ket_quality' => $_POST['ket_quality'], + 'lokasi' => $_POST['lokasi'], + 'menyebar' => $_POST['menyebar'], + 'skala_nyeri' => $_POST['skala_nyeri'], + 'durasi' => $_POST['durasi'], + 'nyeri_hilang' => $_POST['nyeri_hilang'], + 'ket_nyeri' => $_POST['ket_nyeri'] + ]); + } else { + // Check if record already exists + $existing = $this->db('penilaian_ulang_nyeri') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['tanggal']) + ->oneArray(); + + if($existing) { + // Update existing record + $this->db('penilaian_ulang_nyeri') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['tanggal']) + ->save([ + 'nip' => $_POST['nip'], + 'nyeri' => $_POST['nyeri'], + 'provokes' => $_POST['provokes'], + 'ket_provokes' => $_POST['ket_provokes'], + 'quality' => $_POST['quality'], + 'ket_quality' => $_POST['ket_quality'], + 'lokasi' => $_POST['lokasi'], + 'menyebar' => $_POST['menyebar'], + 'skala_nyeri' => $_POST['skala_nyeri'], + 'durasi' => $_POST['durasi'], + 'nyeri_hilang' => $_POST['nyeri_hilang'], + 'ket_nyeri' => $_POST['ket_nyeri'] + ]); + } else { + // Insert new record + $this->db('penilaian_ulang_nyeri')->save([ + 'no_rawat' => $_POST['no_rawat'], + 'nip' => $_POST['nip'], + 'tanggal' => $_POST['tanggal'], + 'nyeri' => $_POST['nyeri'], + 'provokes' => $_POST['provokes'], + 'ket_provokes' => $_POST['ket_provokes'], + 'quality' => $_POST['quality'], + 'ket_quality' => $_POST['ket_quality'], + 'lokasi' => $_POST['lokasi'], + 'menyebar' => $_POST['menyebar'], + 'skala_nyeri' => $_POST['skala_nyeri'], + 'durasi' => $_POST['durasi'], + 'nyeri_hilang' => $_POST['nyeri_hilang'], + 'ket_nyeri' => $_POST['ket_nyeri'] + ]); + } + } + exit(); + } + + public function getAssessmentNyeriTampil($no_rawat) + { + $no_rawat = revertNorawat($no_rawat); + $penilaian_ulang_nyeri = $this->db('penilaian_ulang_nyeri') + ->join('petugas', 'petugas.nip=penilaian_ulang_nyeri.nip') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if($penilaian_ulang_nyeri) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
                  TanggalJenis NyeriSkalaLokasiPetugasAksi
                  '.$penilaian_ulang_nyeri['tanggal'].''.$penilaian_ulang_nyeri['nyeri'].''.$penilaian_ulang_nyeri['skala_nyeri'].''.$penilaian_ulang_nyeri['lokasi'].''.$penilaian_ulang_nyeri['nama'].''; + echo ' '; + echo ''; + echo '
                  '; + } else { + echo '
                  Belum ada data assessment nyeri untuk pasien ini.
                  '; + } + exit(); + } + + public function postHapusAssessmentNyeri() + { + header('Content-Type: application/json'); + + try { + // Validate required fields + if(empty($_POST['no_rawat']) || empty($_POST['tanggal'])) { + echo json_encode(['status' => 'error', 'message' => 'Data tidak lengkap']); + exit(); + } + + $result = $this->db('penilaian_ulang_nyeri') + ->where('no_rawat', $_POST['no_rawat']) + ->where('tanggal', $_POST['tanggal']) + ->delete(); + + if($result) { + echo json_encode(['status' => 'success', 'message' => 'Data assessment nyeri berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus data assessment nyeri']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + + exit(); } public function getJavascript() @@ -1178,6 +2144,1063 @@ public function getJavascript() exit(); } + public function init() + { + $this->consid = $this->settings->get('settings.BpjsConsID'); + $this->secretkey = $this->settings->get('settings.BpjsSecretKey'); + $this->user_key = $this->settings->get('settings.BpjsUserKey'); + $this->api_url = $this->settings->get('settings.BpjsApiUrl'); + } + + public function apiList() + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $user_id = $this->db('mlite_users')->where('username', $username)->oneArray()['id']; + $bangsal = str_replace(",","','", $this->core->getUserInfo('cap', $user_id, true)); + + $draw = $_GET['draw'] ?? 0; + $start = $_GET['start'] ?? 0; + $length = $_GET['length'] ?? 10; + $search = $_GET['search'] ?? ''; + $tgl_awal = $_GET['tgl_awal'] ?? null; + $tgl_akhir = $_GET['tgl_akhir'] ?? null; + $status_pulang = $_GET['status_pulang'] ?? '-'; + + $sql = "SELECT kamar_inap.*, reg_periksa.no_rkm_medis, reg_periksa.umurdaftar, reg_periksa.status_bayar, pasien.nm_pasien, pasien.jk, kamar.kd_kamar, bangsal.nm_bangsal, dokter.nm_dokter, penjab.png_jawab + FROM kamar_inap + JOIN reg_periksa ON kamar_inap.no_rawat = reg_periksa.no_rawat + JOIN pasien ON reg_periksa.no_rkm_medis = pasien.no_rkm_medis + JOIN kamar ON kamar_inap.kd_kamar = kamar.kd_kamar + JOIN bangsal ON kamar.kd_bangsal = bangsal.kd_bangsal + JOIN dpjp_ranap ON kamar_inap.no_rawat = dpjp_ranap.no_rawat + JOIN dokter ON dpjp_ranap.kd_dokter = dokter.kd_dokter + JOIN penjab ON reg_periksa.kd_pj = penjab.kd_pj + WHERE 1=1"; + + + if ($this->core->getUserInfo('role', $user_id, true) != 'admin') { + $sql .= " AND bangsal.kd_bangsal IN ('$bangsal')"; + } + if ($status_pulang == '-') { + $sql .= " AND kamar_inap.stts_pulang = '-'"; + } elseif ($status_pulang != 'all') { + $sql .= " AND kamar_inap.stts_pulang = '$status_pulang'"; + if ($tgl_awal && $tgl_akhir) { + $sql .= " AND kamar_inap.tgl_masuk BETWEEN '$tgl_awal' AND '$tgl_akhir'"; + } + } else { + if ($tgl_awal && $tgl_akhir) { + $sql .= " AND kamar_inap.tgl_masuk BETWEEN '$tgl_awal' AND '$tgl_akhir'"; + } + } + + if (!empty($search)) { + $sql .= " AND (pasien.nm_pasien LIKE '%$search%' OR reg_periksa.no_rkm_medis LIKE '%$search%' OR kamar_inap.no_rawat LIKE '%$search%')"; + } + + $sql .= " GROUP BY kamar_inap.no_rawat"; + + $stmt = $this->db()->pdo()->prepare($sql); + $stmt->execute(); + $totalRecords = $stmt->rowCount(); + + $sql .= " LIMIT $start, $length"; + $stmt = $this->db()->pdo()->prepare($sql); + $stmt->execute(); + $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + return [ + "status" => "success", + "data" => $rows, + "meta" => [ + "page" => floor($start / $length) + 1, + "per_page" => intval($length), + "total" => $totalRecords + ] + ]; + } + + public function apiShow($no_rawat = null) + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + $no_rawat = revertNoRawat($no_rawat); + $row = $this->db('kamar_inap') + ->join('reg_periksa', 'kamar_inap.no_rawat=reg_periksa.no_rawat') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->join('kamar', 'kamar_inap.kd_kamar=kamar.kd_kamar') + ->join('bangsal', 'kamar.kd_bangsal=bangsal.kd_bangsal') + ->join('dpjp_ranap', 'kamar_inap.no_rawat=dpjp_ranap.no_rawat') + ->join('dokter', 'dpjp_ranap.kd_dokter=dokter.kd_dokter') + ->where('kamar_inap.no_rawat', $no_rawat) + ->oneArray(); + + if($row) { + return ['status' => 'success', 'data' => $row]; + } else { + return ['status' => 'error', 'message' => 'Not found']; + } + } + + public function apiCreate() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + if (empty($input['no_rawat']) || empty($input['kd_kamar'])) { + return ['status' => 'error', 'message' => 'Data incomplete']; + } + + $kamar = $this->db('kamar')->where('kd_kamar', $input['kd_kamar'])->oneArray(); + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_kamar' => $input['kd_kamar'], + 'trf_kamar' => $kamar['trf_kamar'], + 'lama' => $input['lama'] ?? 1, + 'tgl_masuk' => $input['tgl_masuk'] ?? date('Y-m-d'), + 'jam_masuk' => $input['jam_masuk'] ?? date('H:i:s'), + 'ttl_biaya' => $kamar['trf_kamar'] * ($input['lama'] ?? 1), + 'tgl_keluar' => '0000-00-00', + 'jam_keluar' => '00:00:00', + 'diagnosa_awal' => $input['diagnosa_awal'] ?? '-', + 'diagnosa_akhir' => '-', + 'stts_pulang' => '-' + ]; + + try { + $this->db('kamar_inap')->save($data); + $this->db('kamar')->where('kd_kamar', $input['kd_kamar'])->save(['status' => 'ISI']); + + if(!empty($input['kd_dokter'])) { + $this->db('dpjp_ranap')->save(['no_rawat' => $input['no_rawat'], 'kd_dokter' => $input['kd_dokter']]); + } + + $this->db('reg_periksa')->where('no_rawat', $input['no_rawat'])->save(['status_lanjut' => 'Ranap']); + + return ['status' => 'created', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiUpdate($no_rawat = null) + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_update', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + + $no_rawat = revertNoRawat($no_rawat); + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('kamar_inap')->where('no_rawat', $no_rawat)->save($input); + + // If discharge + if(isset($input['stts_pulang']) && $input['stts_pulang'] != '-') { + $kamar_inap = $this->db('kamar_inap')->where('no_rawat', $no_rawat)->oneArray(); + $this->db('kamar')->where('kd_kamar', $kamar_inap['kd_kamar'])->save(['status' => 'KOSONG']); + $this->db('reg_periksa')->where('no_rawat', $no_rawat)->save(['stts' => 'Sudah']); + } + + return ['status' => 'success', 'data' => $input]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDelete($no_rawat = null) + { + $username = $this->core->checkAuth('DELETE'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + + $no_rawat = revertNoRawat($no_rawat); + $kamar_inap = $this->db('kamar_inap')->where('no_rawat', $no_rawat)->oneArray(); + + try { + $this->db('kamar_inap')->where('no_rawat', $no_rawat)->delete(); + if($kamar_inap) { + $this->db('kamar')->where('kd_kamar', $kamar_inap['kd_kamar'])->save(['status' => 'KOSONG']); + $this->db('dpjp_ranap')->where('no_rawat', $no_rawat)->delete(); + $this->db('reg_periksa')->where('no_rawat', $no_rawat)->save(['status_lanjut' => 'Ralan']); + } + return ['status' => 'success', 'message' => 'Data deleted']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiShowSoap($no_rawat = null) + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + $no_rawat = revertNoRawat($no_rawat); + + $pemeriksaan = $this->db('pemeriksaan_ranap')->where('no_rawat', $no_rawat)->toArray(); + return ['status' => 'success', 'data' => $pemeriksaan]; + } + + public function apiSaveSoap() + { + $username = $this->core->checkAuth('POST'); + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $nip = $username; + + // Map input to schema columns + $data = [ + 'no_rawat' => $input['no_rawat'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => $input['jam_rawat'], + 'suhu_tubuh' => $input['suhu_tubuh'] ?? null, + 'tensi' => $input['tensi'] ?? '-', + 'nadi' => $input['nadi'] ?? null, + 'respirasi' => $input['respirasi'] ?? null, + 'tinggi' => $input['tinggi'] ?? null, + 'berat' => $input['berat'] ?? null, + 'spo2' => $input['spo2'] ?? '-', + 'gcs' => $input['gcs'] ?? null, + 'kesadaran' => $input['kesadaran'] ?? 'Compos Mentis', + 'keluhan' => $input['keluhan'] ?? null, + 'pemeriksaan' => $input['pemeriksaan'] ?? null, + 'alergi' => $input['alergi'] ?? null, + 'penilaian' => $input['penilaian'] ?? '-', + 'rtl' => $input['rtl'] ?? '-', + 'instruksi' => $input['instruksi'] ?? '-', + 'evaluasi' => $input['evaluasi'] ?? '-', + 'nip' => $nip + ]; + + try { + // Check based on primary key (no_rawat, tgl_perawatan, jam_rawat) + if(!$this->db('pemeriksaan_ranap') + ->where('no_rawat', $data['no_rawat']) + ->where('tgl_perawatan', $data['tgl_perawatan']) + ->where('jam_rawat', $data['jam_rawat']) + ->oneArray()) { + + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $this->db('pemeriksaan_ranap')->save($data); + } else { + + if (!$this->core->checkPermission($username, 'can_update', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $this->db('pemeriksaan_ranap') + ->where('no_rawat', $data['no_rawat']) + ->where('tgl_perawatan', $data['tgl_perawatan']) + ->where('jam_rawat', $data['jam_rawat']) + ->save($data); + } + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteSoap() + { + $username = $this->core->checkAuth('DELETE'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('pemeriksaan_ranap') + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + return ['status' => 'success', 'message' => 'Deleted']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiShowDetail($category = null, $no_rawat = null) + { + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + $no_rawat = revertNorawat($no_rawat); + $kategori = trim($category); + $no_resep = isset($_GET['no_resep']) ? $_GET['no_resep'] : null; + + $pasien = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $patient_info = [ + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'no_rkm_medis' => $pasien['no_rkm_medis'] ?? '' + ]; + + $data = []; + try { + if($kategori == 'tindakan') { + $data['rawat_inap_dr'] = $this->db('rawat_inap_dr') + ->join('jns_perawatan_inap', 'jns_perawatan_inap.kd_jenis_prw=rawat_inap_dr.kd_jenis_prw') + ->join('dokter', 'dokter.kd_dokter=rawat_inap_dr.kd_dokter') + ->where('no_rawat', $no_rawat) + ->toArray(); + $data['rawat_inap_pr'] = $this->db('rawat_inap_pr') + ->join('jns_perawatan_inap', 'jns_perawatan_inap.kd_jenis_prw=rawat_inap_pr.kd_jenis_prw') + ->join('petugas', 'petugas.nip=rawat_inap_pr.nip') + ->where('no_rawat', $no_rawat) + ->toArray(); + $data['rawat_inap_drpr'] = $this->db('rawat_inap_drpr') + ->join('jns_perawatan_inap', 'jns_perawatan_inap.kd_jenis_prw=rawat_inap_drpr.kd_jenis_prw') + ->join('dokter', 'dokter.kd_dokter=rawat_inap_drpr.kd_dokter') + ->join('petugas', 'petugas.nip=rawat_inap_drpr.nip') + ->where('no_rawat', $no_rawat) + ->toArray(); + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => [ + 'rawat_jl_dr' => $data['rawat_inap_dr'], + 'rawat_jl_pr' => $data['rawat_inap_pr'], + 'rawat_jl_drpr' => $data['rawat_inap_drpr'] + ] + ]; + + } elseif($kategori == 'obat') { + $query = $this->db('resep_dokter') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter.no_resep') + ->join('databarang', 'databarang.kode_brng = resep_dokter.kode_brng') + ->where('resep_obat.no_rawat', $no_rawat) + ->where('resep_obat.status', 'ranap'); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $data['obat'] = $query->toArray(); + + return ['status' => 'success', 'patient' => $patient_info, 'data' => $data['obat']]; + + } elseif($kategori == 'racikan') { + $query = $this->db('resep_dokter_racikan') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter_racikan.no_resep') + ->join('metode_racik', 'metode_racik.kd_racik = resep_dokter_racikan.kd_racik') + ->where('resep_obat.no_rawat', $no_rawat) + ->where('resep_obat.status', 'ranap'); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $resep_racikan = $query->toArray(); + + foreach ($resep_racikan as &$racikan) { + $racikan['detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng = resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $racikan['no_resep']) + ->where('no_racik', $racikan['no_racik']) + ->toArray(); + } + $data['racikan'] = $resep_racikan; + return ['status' => 'success', 'patient' => $patient_info, 'data' => $data['racikan']]; + + } else { + return ['status' => 'error', 'message' => 'Category not supported: ' . $kategori]; + } + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + + } + + public function apiSaveDetail() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kategori = trim($input['kat']); + + if (empty($kategori) || empty($input['no_rawat']) || empty($input['kd_jenis_prw'])) { + return ['status' => 'error', 'message' => 'Data incomplete']; + } + + try { + + if($kategori == 'tindakan') { + $jns_perawatan = $this->db('jns_perawatan_inap')->where('kd_jenis_prw', $input['kd_jenis_prw'])->oneArray(); + if($input['provider'] == 'rawat_inap_dr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_inap_dr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'kd_dokter' => $input['kode_provider'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdr'] + ]); + } + } + if($input['provider'] == 'rawat_inap_pr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_inap_pr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'nip' => $input['kode_provider2'] ?? $input['kode_provider'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrpr'] + ]); + } + } + if($input['provider'] == 'rawat_inap_drpr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_inap_drpr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'kd_dokter' => $input['kode_provider'], + 'nip' => $input['kode_provider2'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdrpr'] + ]); + } + } + return ['status' => 'success', 'message' => 'Detail saved']; + } elseif ($kategori == 'obat') { + $no_resep = $this->core->setNoResep($input['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->where('no_rawat', $input['no_rawat'])->where('tgl_peresepan', $input['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); + + if (empty($cek_resep)) { + $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $input['kode_provider'] ?? $username, + 'tgl_peresepan' => $input['tgl_perawatan'], + 'jam_peresepan' => $input['jam_rawat'], + 'status' => 'ranap', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->oneArray()) { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $input['kd_jenis_prw'], + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } + } else { + $no_resep = $cek_resep['no_resep']; + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $input['kd_jenis_prw'], + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } + return ['status' => 'success', 'message' => 'Obat saved']; + } elseif ($kategori == 'racikan') { + $no_resep = $this->core->setNoResep($input['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->where('no_rawat', $input['no_rawat'])->where('tgl_peresepan', $input['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); + + $jam_rawat = $input['jam_rawat'] ?? date('H:i:s'); + + if (empty($cek_resep)) { + $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $input['kode_provider'] ?? $username, + 'tgl_peresepan' => $input['tgl_perawatan'], + 'jam_peresepan' => $jam_rawat, + 'status' => 'ranap', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->oneArray()) { + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik + 1; + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $input['nama_racik'], + 'kd_racik' => $input['kd_jenis_prw'], + 'jml_dr' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + + $kode_brng_list = is_string($input['kode_brng']) ? json_decode($input['kode_brng'], true) : $input['kode_brng']; + $kandungan_list = is_string($input['kandungan']) ? json_decode($input['kandungan'], true) : $input['kandungan']; + + $kode_brng_count = count($kode_brng_list); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $kode_brng_list[$i]['value'])->oneArray(); + $jml = $input['jml'] * $kandungan_list[$i]['value']; + if ($kapasitas['kapasitas'] > 0) { + $jml = round(($jml / $kapasitas['kapasitas']), 1); + } + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng_list[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $kandungan_list[$i]['value'], + 'jml' => $jml + ]); + } + } + } else { + $no_resep = $cek_resep['no_resep']; + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik + 1; + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $input['nama_racik'], + 'kd_racik' => $input['kd_jenis_prw'], + 'jml_dr' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + + $kode_brng_list = is_string($input['kode_brng']) ? json_decode($input['kode_brng'], true) : $input['kode_brng']; + $kandungan_list = is_string($input['kandungan']) ? json_decode($input['kandungan'], true) : $input['kandungan']; + + $kode_brng_count = count($kode_brng_list); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $kode_brng_list[$i]['value'])->oneArray(); + $jml = $input['jml'] * $kandungan_list[$i]['value']; + if ($kapasitas['kapasitas'] > 0) { + $jml = round(($jml / $kapasitas['kapasitas']), 1); + } + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng_list[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $kandungan_list[$i]['value'], + 'jml' => $jml + ]); + } + } + return ['status' => 'success', 'message' => 'Racikan saved']; + } else { + return ['status' => 'error', 'message' => 'Category not supported']; + } + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiDeleteDetail() + { + $username = $this->core->checkAuth('DELETE'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kategori = trim($input['kat']); + + if($kategori == 'tindakan') { + if($input['provider'] == 'rawat_inap_dr') { + $this->db('rawat_inap_dr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + if($input['provider'] == 'rawat_inap_pr') { + $this->db('rawat_inap_pr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + if($input['provider'] == 'rawat_inap_drpr') { + $this->db('rawat_inap_drpr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + } elseif ($kategori == 'obat') { + if(isset($input['kd_jenis_prw'])) { + $this->db('resep_dokter') + ->where('no_resep', $input['no_resep']) + ->where('kode_brng', $input['kd_jenis_prw']) + ->delete(); + } else { + $this->db('resep_obat') + ->where('no_resep', $input['no_resep']) + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_peresepan', $input['tgl_peresepan']) + ->where('jam_peresepan', $input['jam_peresepan']) + ->delete(); + } + } elseif ($kategori == 'racikan') { + if(isset($input['kd_jenis_prw']) && isset($input['no_racik'])) { + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->where('kode_brng', $input['kd_jenis_prw']) + ->delete(); + } elseif (isset($input['no_racik'])) { + $this->db('resep_dokter_racikan') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->delete(); + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->delete(); + } + } + + return ['status' => 'success']; + } + + public function apiSaveDiagnosa() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_penyakit' => $input['kd_penyakit'], + 'status' => $input['status'] ?? 'Ranap', + 'prioritas' => $input['prioritas'], + 'status_penyakit' => 'Baru' + ]; + + try { + $this->db('diagnosa_pasien')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteDiagnosa() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('diagnosa_pasien') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_penyakit', $input['kd_penyakit']) + ->where('prioritas', $input['prioritas']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveProsedur() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kode' => $input['kode'], + 'status' => $input['status'] ?? 'Ranap', + 'prioritas' => $input['prioritas'] + ]; + + try { + $this->db('prosedur_pasien')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteProsedur() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('prosedur_pasien') + ->where('no_rawat', $input['no_rawat']) + ->where('kode', $input['kode']) + ->where('prioritas', $input['prioritas']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveCatatan() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $input['no_rawat']); + + $data = [ + 'tanggal' => date('Y-m-d'), + 'jam' => date('H:i:s'), + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $kd_dokter, + 'catatan' => $input['catatan'] + ]; + + try { + $this->db('catatan_perawatan')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteCatatan() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('catatan_perawatan') + ->where('no_rawat', $input['no_rawat']) + ->where('tanggal', $input['tanggal']) + ->where('jam', $input['jam']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveBerkas() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kode' => $input['judul'] ?? '', + 'lokasi_file' => $input['deskripsi'] ?? '' + ]; + + try { + $this->db('berkas_digital_perawatan')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteBerkas() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('berkas_digital_perawatan') + ->where('no_rawat', $input['no_rawat']) + ->where('kode', $input['judul'] ?? $input['kode']) + ->where('lokasi_file', $input['deskripsi'] ?? $input['lokasi_file']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveResume() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $input['no_rawat']); + + // Check if exists + $exists = $this->db('resume_pasien')->where('no_rawat', $input['no_rawat'])->oneArray(); + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $kd_dokter, + 'diagnosa_utama' => $input['diagnosa_utama'] ?? '', + 'diagnosa_sekunder' => $input['diagnosa_sekunder'] ?? '', + 'jalannya_penyakit' => $input['jalannya_penyakit'] ?? '', + 'obat_pulang' => $input['terapi'] ?? '', + 'kondisi_pulang' => $input['kondisi_pulang'] ?? 'Hidup', + // Default required fields + 'keluhan_utama' => '', + 'pemeriksaan_penunjang' => '', + 'hasil_laborat' => '', + 'kd_diagnosa_utama' => '', + 'kd_diagnosa_sekunder' => '', + 'diagnosa_sekunder2' => '', + 'kd_diagnosa_sekunder2' => '', + 'diagnosa_sekunder3' => '', + 'kd_diagnosa_sekunder3' => '', + 'diagnosa_sekunder4' => '', + 'kd_diagnosa_sekunder4' => '', + 'prosedur_utama' => '', + 'kd_prosedur_utama' => '', + 'prosedur_sekunder' => '', + 'kd_prosedur_sekunder' => '', + 'prosedur_sekunder2' => '', + 'kd_prosedur_sekunder2' => '', + 'prosedur_sekunder3' => '', + 'kd_prosedur_sekunder3' => '' + ]; + + try { + if ($exists) { + $this->db('resume_pasien')->where('no_rawat', $input['no_rawat'])->save($data); + } else { + $this->db('resume_pasien')->save($data); + } + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveRujukanInternal() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_poli' => $input['kd_poli'], + 'kd_dokter' => $input['kd_dokter'], + 'isi_rujukan' => $input['catatan'] ?? '' + ]; + + try { + $this->db('mlite_rujukan_internal_poli')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteRujukanInternal() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('mlite_rujukan_internal_poli') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_poli', $input['kd_poli']) + ->where('kd_dokter', $input['kd_dokter']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveLaporanOperasi() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'tanggal' => $input['tanggal'] . ' ' . $input['jam'], + 'operator' => $input['operator'], + 'laporan_operasi' => $input['laporan'] ?? '', + // Defaults + 'operator2' => '-', 'operator3' => '-', 'asisten_operator1' => '-', 'asisten_operator2' => '-', 'asisten_operator3' => '-', + 'instrumen' => '-', 'dokter_anak' => '-', 'perawat_resusitas' => '-', 'dokter_anestesi' => '-', 'asisten_anestesi' => '-', + 'bidan' => '-', 'perawat_luar' => '-', 'omloop' => '-', 'omloop2' => '-', 'omloop3' => '-', 'omloop4' => '-', 'omloop5' => '-' + ]; + + try { + $this->db('laporan_operasi')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteLaporanOperasi() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $tanggal = $input['tanggal']; + if(isset($input['jam'])) { + $tanggal .= ' ' . $input['jam']; + } + + $this->db('laporan_operasi') + ->where('no_rawat', $input['no_rawat']) + ->where('tanggal', $tanggal) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + private function _addHeaderFiles() { $this->core->addCSS(url('assets/css/dataTables.bootstrap.min.css')); @@ -1188,7 +3211,8 @@ private function _addHeaderFiles() $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); + $this->core->addJS('https://cdn.jsdelivr.net/npm/chart.js'); $this->core->addJS(url([ADMIN, 'rawat_inap', 'javascript']), 'footer'); } -} +} \ No newline at end of file diff --git a/plugins/rawat_inap/Help.md b/plugins/rawat_inap/Help.md deleted file mode 100644 index 6b9b4accb..000000000 --- a/plugins/rawat_inap/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
                  - -
                  diff --git a/plugins/rawat_inap/Info.php b/plugins/rawat_inap/Info.php index df45007a1..76edd2ed1 100644 --- a/plugins/rawat_inap/Info.php +++ b/plugins/rawat_inap/Info.php @@ -4,8 +4,9 @@ 'name' => 'Rawat Inap', 'description' => 'Modul rawat inap untuk mLITE', 'author' => 'Basoro', + 'category' => 'layanan', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'hotel', 'install' => function () use ($core) { }, diff --git a/plugins/rawat_inap/README.md b/plugins/rawat_inap/README.md new file mode 100644 index 000000000..b9b9a8569 --- /dev/null +++ b/plugins/rawat_inap/README.md @@ -0,0 +1,80 @@ +# Plugin Rawat Inap + +Modul pengelolaan pasien rawat inap di mLITE, mencakup pendaftaran masuk kamar, pencatatan tindakan dan obat, manajemen DPJP, hingga proses kepulangan pasien. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Rawat Inap**. +- Pilih submenu sesuai kebutuhan: + - Kelola + +## Panduan Pengguna (Petugas) + +1. **Daftar Pasien Rawat Inap** + - Buka menu **Rawat Inap → Kelola**. + - Tampil daftar pasien yang sedang dirawat (status pulang = `-`). + - Filter berdasarkan periode tanggal masuk/keluar dan status pulang untuk melihat riwayat. + - Tampilan dibatasi sesuai bangsal yang menjadi tanggung jawab akun pengguna (kecuali admin). + +2. **Mendaftarkan Pasien Masuk Kamar** + - Cari pasien dengan no rekam medis atau nama melalui form pencarian pasien. + - Pilih pasien dengan status lanjut `Ranap` dari Rawat Jalan atau IGD. + - Isi **Form Masuk**: kamar, dokter DPJP, tanggal masuk, jam masuk, lama rencana rawat, dan diagnosa awal. + - Klik **Simpan** — sistem akan mengisi tarif kamar otomatis, mencatat ke `kamar_inap`, menambahkan DPJP ke `dpjp_ranap`, dan mengubah status kamar menjadi `ISI`. + +3. **Manajemen DPJP (Dokter Penanggung Jawab Pasien)** + - Tambah dokter DPJP baru melalui form Set DPJP pada detail pasien. + - Hapus dokter DPJP yang tidak relevan menggunakan tombol hapus di daftar DPJP. + - Satu pasien dapat memiliki lebih dari satu DPJP. + +4. **Input Tindakan dan Obat** + - Pada detail pasien, pilih kategori **Tindakan** atau **Obat**. + - Untuk **Tindakan**: pilih jenis perawatan inap, provider (dokter/petugas/dokter+petugas), tanggal, jam, dan jumlah tindakan. + - Untuk **Obat**: pilih obat dari master, isi jumlah dan aturan pakai — sistem otomatis membuat atau menggabungkan resep harian. + - Hapus detail tindakan/obat yang salah melalui tombol hapus di daftar rincian. + +5. **Rincian Biaya** + - Buka tab **Rincian** pada detail pasien untuk melihat total biaya: tindakan dokter, tindakan petugas, tindakan gabungan, dan obat. + - Informasi billing (kode billing RI.xxx) tersedia untuk proses pembayaran. + +6. **Proses Kepulangan Pasien** + - Klik **Pulangkan** pada baris pasien. + - Isi form: status pulang, diagnosa akhir, tanggal dan jam keluar. + - Klik **Simpan** — sistem akan memperbarui `kamar_inap`, mengubah status `reg_periksa` menjadi `Sudah`, dan status kamar menjadi `KOSONG`. + - Pilihan status pulang: Sehat, Rujuk, APS, Meninggal, Sembuh, Membaik, Pulang Paksa, Pindah Kamar, Atas Persetujuan Dokter, dan lainnya. + +7. **Ubah Penjamin** + - Ubah penjamin (penjab) pasien yang sudah terdaftar tanpa harus mendaftar ulang. + +8. **Cetak Antrian** + - Gunakan fitur **Antrian** untuk mencetak nomor antrian atau label rawat inap pasien. + +## Panduan Admin + +1. **Master Kamar dan Bangsal** + - Kelola data kamar dan bangsal di modul **Master** (tabel `kamar` dan `bangsal`). + - Pastikan tarif kamar (`trf_kamar`) sudah diisi agar biaya rawat inap terhitung otomatis. + - Hanya kamar dengan `statusdata = 1` yang tampil di form pendaftaran. + +2. **Master Jenis Perawatan Inap** + - Kelola daftar tindakan rawat inap di tabel `jns_perawatan_inap` melalui modul Master. + - Pastikan tarif tindakan dokter, petugas, dan gabungan sudah benar. + +3. **Hak Akses Bangsal** + - Atur `cap` (capability) akun petugas dengan kode bangsal yang menjadi wewenangnya. + - Petugas hanya melihat pasien di bangsal yang sesuai dengan `cap`-nya; admin melihat semua bangsal. + +4. **Integrasi vClaim BPJS** + - Jika modul `vclaim` aktif, tombol pengajuan SEP tersedia pada daftar pasien rawat inap. + - Nomor SEP ditampilkan bila bridging sudah berhasil. + +5. **Berkas Digital** + - Master berkas digital (`master_berkas_digital`) mengatur dokumen apa saja yang dapat diunggah per pasien rawat inap. + - File disimpan di direktori `webapps/berkasrawat/pages/upload/`. + +## Catatan + +- Pasien hanya dapat didaftarkan masuk kamar jika sudah memiliki data `reg_periksa` dengan `status_lanjut = Ranap`. +- Satu nomor rawat hanya dapat menempati satu kamar pada satu waktu. +- Biaya kamar dihitung otomatis: tarif kamar × lama hari rawat. diff --git a/plugins/rawat_inap/js/admin/rawat_inap.js b/plugins/rawat_inap/js/admin/rawat_inap.js index df72aeb1e..ed4b58b03 100644 --- a/plugins/rawat_inap/js/admin/rawat_inap.js +++ b/plugins/rawat_inap/js/admin/rawat_inap.js @@ -1,3 +1,6 @@ +// Global variable untuk chart +var vitalSignsChart = null; + // sembunyikan form dan notif $("#form_rincian").hide(); $("#form_soap").hide(); @@ -11,6 +14,20 @@ $("#tanggal_keluar").hide(); $("#diagnosa_keluar").hide(); $("#form_kontrol").hide(); +// Inisialisasi jam_rawat saat halaman dibuka +$(function(){ + var baseURL = mlite.url + '/' + mlite.admin; + var $jr = $('input:text[name=jam_rawat]').last(); + if ($jr.length) { + $jr.focus(); + if (!$jr.val()) { + $.post(baseURL + '/rawat_inap/cekwaktu?t=' + mlite.token, {}, function(data){ + $jr.val(data); + }); + } + } +}); + // tombol buka form diklik $("#index").on('click', '#bukaform', function(){ var baseURL = mlite.url + '/' + mlite.admin; @@ -123,6 +140,7 @@ $("#display").on("click",".riwayat_perawatan", function(event){ // ketika baris data diklik $("#display").on("click", ".edit", function(event){ + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_update', 'rawat_inap') == true} var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); var url = baseURL + '/rawat_inap/form?t=' + mlite.token; @@ -140,6 +158,7 @@ $("#display").on("click", ".edit", function(event){ //$.post(url, {no_rawat: no_rawat} ,function(data) { // $("#stts_daftar").html(data).show(); //}); + {/if} }); }); @@ -215,6 +234,7 @@ $("#display").on("click", ".sep", function(event){ $('#no_kartu_peserta').text(json_obj[0].response.peserta.noKartu); $('#no_mr_peserta').text(no_rkm_medis); $('#nik_peserta').text(json_obj[0].response.peserta.nik); + $('#prov_umum_peserta').text(json_obj[0].response.peserta.provUmum.nmProvider); $('#tgl_lahir_peserta').text(json_obj[0].response.peserta.tglLahir); $('#status_peserta').text(json_obj[0].response.peserta.statusPeserta.keterangan); $('#jenis_peserta').text(json_obj[0].response.peserta.jenisPeserta.keterangan); @@ -406,6 +426,93 @@ $('#manage').on('click', '#lunas_periode_rawat_inap', function(event){ //$("#display").on("click", ".soap", function(event){ +// Handler untuk copy data SOAP sebagai fallback +$("#soap").on("click",".copy_soap", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var suhu_tubuh = $(this).attr("data-suhu_tubuh"); + var tensi = $(this).attr("data-tensi"); + var nadi = $(this).attr("data-nadi"); + var respirasi = $(this).attr("data-respirasi"); + var tinggi = $(this).attr("data-tinggi"); + var berat = $(this).attr("data-berat"); + var gcs = $(this).attr("data-gcs"); + var kesadaran = $(this).attr("data-kesadaran"); + var alergi = $(this).attr("data-alergi"); + var lingkar_perut = $(this).attr("data-lingkar_perut"); + var keluhan = $(this).attr("data-keluhan"); + var pemeriksaan = $(this).attr("data-pemeriksaan"); + var penilaian = $(this).attr("data-penilaian"); + var rtl = $(this).attr("data-rtl"); + var instruksi = $(this).attr("data-instruksi"); + var evaluasi = $(this).attr("data-evaluasi"); + var spo2 = $(this).attr("data-spo2"); + + $('input:text[name=suhu_tubuh]').val(suhu_tubuh); + $('input:text[name=tensi]').val(tensi); + $('input:text[name=nadi]').val(nadi); + $('input:text[name=respirasi]').val(respirasi); + $('input:text[name=tinggi]').val(tinggi); + $('input:text[name=berat]').val(berat); + $('input:text[name=gcs]').val(gcs); + $('input:text[name=kesadaran]').val(kesadaran); + $('input:text[name=alergi]').val(alergi); + $('input:text[name=lingkar_perut]').val(lingkar_perut); + $('textarea[name=keluhan]').val(keluhan); + $('textarea[name=pemeriksaan]').val(pemeriksaan); + $('textarea[name=penilaian]').val(penilaian); + $('textarea[name=rtl]').val(rtl); + $('textarea[name=instruksi]').val(instruksi); + $('textarea[name=evaluasi]').val(evaluasi); + $('input:text[name=spo2]').val(spo2); +}); + +// Handler untuk edit data SOAP +$("#soap").on("click",".edit_soap", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var tgl_perawatan = $(this).attr("data-tgl_perawatan"); + var jam_rawat = $(this).attr("data-jam_rawat"); + var suhu_tubuh = $(this).attr("data-suhu_tubuh"); + var tensi = $(this).attr("data-tensi"); + var nadi = $(this).attr("data-nadi"); + var respirasi = $(this).attr("data-respirasi"); + var tinggi = $(this).attr("data-tinggi"); + var berat = $(this).attr("data-berat"); + var gcs = $(this).attr("data-gcs"); + var kesadaran = $(this).attr("data-kesadaran"); + var alergi = $(this).attr("data-alergi"); + var lingkar_perut = $(this).attr("data-lingkar_perut"); + var keluhan = $(this).attr("data-keluhan"); + var pemeriksaan = $(this).attr("data-pemeriksaan"); + var penilaian = $(this).attr("data-penilaian"); + var rtl = $(this).attr("data-rtl"); + var instruksi = $(this).attr("data-instruksi"); + var evaluasi = $(this).attr("data-evaluasi"); + var spo2 = $(this).attr("data-spo2"); + + $('input:text[name=tgl_perawatan]').val(tgl_perawatan); + $('input:text[name=jam_rawat]').val(jam_rawat); + $('input:text[name=suhu_tubuh]').val(suhu_tubuh); + $('input:text[name=tensi]').val(tensi); + $('input:text[name=nadi]').val(nadi); + $('input:text[name=respirasi]').val(respirasi); + $('input:text[name=tinggi]').val(tinggi); + $('input:text[name=berat]').val(berat); + $('input:text[name=gcs]').val(gcs); + $('input:text[name=kesadaran]').val(kesadaran); + $('input:text[name=alergi]').val(alergi); + $('input:text[name=lingkar_perut]').val(lingkar_perut); + $('textarea[name=keluhan]').val(keluhan); + $('textarea[name=pemeriksaan]').val(pemeriksaan); + $('textarea[name=penilaian]').val(penilaian); + $('textarea[name=rtl]').val(rtl); + $('textarea[name=instruksi]').val(instruksi); + $('textarea[name=evaluasi]').val(evaluasi); + $('input:text[name=spo2]').val(spo2); +}); + // ketika tombol simpan diklik $("#form_soap").on("click", "#simpan_soap", function(event){ {if: !$cek_role} @@ -418,8 +525,8 @@ $("#form_soap").on("click", "#simpan_soap", function(event){ event.preventDefault(); var no_rawat = $('input:text[name=no_rawat]').val(); - var tgl_perawatan = $('input:text[name=tgl_perawatan]').val(); - var jam_rawat = $('input:text[name=jam_rawat]').val(); + var tgl_perawatan = $('#soap_tgl_perawatan').val(); + var jam_rawat = $('#soap_jam_rawat').val(); var suhu_tubuh = $('input:text[name=suhu_tubuh]').val(); var tensi = $('input:text[name=tensi]').val(); var nadi = $('input:text[name=nadi]').val(); @@ -466,6 +573,10 @@ $("#form_soap").on("click", "#simpan_soap", function(event){ }, function(data) { // tampilkan data $("#soap").html(data).show(); + // Update vital signs chart + if (typeof updateVitalSignsChart === 'function') { + updateVitalSignsChart(); + } }); $('input:text[name=suhu_tubuh]').val(""); $('input:text[name=tensi]').val(""); @@ -597,12 +708,16 @@ $("#soap").on("click",".hapus_soap", function(event){ tgl_perawatan: tgl_perawatan, jam_rawat: jam_rawat } ,function(data) { - console.log(data); + // console.log(data); var url = baseURL + '/rawat_inap/soap?t=' + mlite.token; $.post(url, {no_rawat : no_rawat, }, function(data) { // tampilkan data $("#soap").html(data).show(); + // Update vital signs chart + if (typeof updateVitalSignsChart === 'function') { + updateVitalSignsChart(); + } }); $('input:text[name=suhu_tubuh]').val(""); $('input:text[name=tensi]').val(""); @@ -700,7 +815,7 @@ $("#surat_kontrol").on("click",".hapus_kontrol", function(event){ kd_poli: kd_poli, no_rkm_medis: no_rkm_medis } ,function(data) { - //console.log(data); + // console.log(data); var url = baseURL + '/rawat_inap/kontrol?t=' + mlite.token; $.post(url, {no_rkm_medis : no_rkm_medis, }, function(data) { @@ -835,7 +950,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ var biaya = $('input:text[name=biaya]').val(); var aturan_pakai = $('input:text[name=aturan_pakai]').val(); var kat = $('input:hidden[name=kat]').val(); - var jml = $('input:text[name=jml]').val(); + var jml = $('input:text[name=jml_tindakan]').val(); + var jml_tindakan = $('input:text[name=jml_tindakan]').val(); var url = baseURL + '/rawat_inap/savedetail?t=' + mlite.token; $.post(url, {no_rawat : no_rawat, @@ -848,7 +964,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ biaya : biaya, aturan_pakai : aturan_pakai, kat : kat, - jml : jml + jml : jml, + jml_tindakan : jml_tindakan }, function(data) { // tampilkan data @@ -859,6 +976,11 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ // tampilkan data $("#rincian").html(data).show(); }); + $.post(baseURL + '/rawat_inap/cekwaktu?t=' + mlite.token, { + } ,function(data) { + $("#form_rincian #rincian_jam_reg").val(data); + $('input:text[name=jam_rawat]').last().val(data).focus(); + }); $('input:hidden[name=kd_jenis_prw]').val(""); $('input:text[name=nm_perawatan]').val(""); $('input:hidden[name=kat]').val(""); @@ -867,6 +989,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ $('input:text[name=nama_provider2]').val(""); $('input:text[name=kode_provider]').val(""); $('input:text[name=kode_provider2]').val(""); + $('input:text[name=jam_rawat]').last().val(""); + $('input:text[name=jml_tindakan]').last().val(""); $('#notif').html("
                  "+ "Data pasien telah disimpan!"+ ""+ @@ -1010,7 +1134,7 @@ $("#form_kontrol").on("click", "#simpan_kontrol", function(event){ dokter : dokter, poli : poli }, function(data) { - //console.log(data); + // console.log(data); // tampilkan data $("#display").hide(); var url = baseURL + '/rawat_inap/kontrol?t=' + mlite.token; @@ -1063,7 +1187,7 @@ $("#form_kontrol").on("click", "#simpan_kontrol_bpjs", function(event){ dokter : dokter, poli : poli }, function(data) { - //console.log(data); + // console.log(data); // tampilkan data $("#display").hide(); var url = baseURL + '/rawat_inap/kontrol?t=' + mlite.token; @@ -1196,3 +1320,398 @@ $("#form_soap").on("click","#jam_rawat", function(event){ $("#jam_rawat").val(data); }); }); + +// Handler untuk tombol assessment di form SOAP +$("#form_soap").on("click",".assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $('input:text[name=no_rawat]').val(); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessment/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment yang sudah ada + $('.tampildata_assessment').load(baseURL + '/rawat_inap/assessmenttampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Handler untuk assessment di display juga +$("#display").on("click",".assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessment/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment yang sudah ada + $('.tampildata_assessment').load(baseURL + '/rawat_inap/assessmenttampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Handler untuk tombol buat assessment dari tampil assessment +$(document).on("click", ".buat_assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessment/' + set_no_rawat + '?t=' + mlite.token); + }).modal(); + return false; +}); + +// Handler untuk tombol edit assessment +$(document).on("click", ".edit_assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessment/' + set_no_rawat + '?t=' + mlite.token); + }).modal(); + return false; +}); + +// Handler untuk tombol hapus assessment +$(document).on("click", ".hapus_assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + + bootbox.confirm("Apakah Anda yakin ingin menghapus data assessment ini?", function(result){ + if (result){ + $.post(baseURL + '/rawat_inap/assessmentdelete?t=' + mlite.token, { + no_rawat: no_rawat + }, function(data) { + if(data.status == 'success') { + // Reload tampilan assessment + var set_no_rawat = no_rawat.replace(/\//g, ''); + $('.tampildata_assessment').load(baseURL + '/rawat_inap/assessmenttampil/' + set_no_rawat + '?t=' + mlite.token); + } else { + alert('Error: ' + data.msg); + } + }, 'json'); + } + }); +}); + +// Handler untuk copy data SOAP sebagai fallback assessment +$(document).on("click", ".copy_soap", function(event){ + event.preventDefault(); + + // Ambil data dari tombol + var suhu_tubuh = $(this).data('suhu_tubuh'); + var tensi = $(this).data('tensi'); + var nadi = $(this).data('nadi'); + var respirasi = $(this).data('respirasi'); + var tinggi = $(this).data('tinggi'); + var berat = $(this).data('berat'); + var gcs = $(this).data('gcs'); + var kesadaran = $(this).data('kesadaran'); + var alergi = $(this).data('alergi'); + var keluhan = $(this).data('keluhan'); + var pemeriksaan = $(this).data('pemeriksaan'); + var penilaian = $(this).data('penilaian'); + var rtl = $(this).data('rtl'); + var spo2 = $(this).data('spo2'); + + // Isi form assessment dengan data SOAP + if($('#assesmentModal').hasClass('in')) { + $('input[name="pemeriksaan_suhu"]').val(suhu_tubuh); + $('input[name="pemeriksaan_td"]').val(tensi); + $('input[name="pemeriksaan_nadi"]').val(nadi); + $('input[name="pemeriksaan_rr"]').val(respirasi); + $('input[name="pemeriksaan_tb"]').val(tinggi); + $('input[name="pemeriksaan_bb"]').val(berat); + $('input[name="pemeriksaan_gcs"]').val(gcs); + $('input[name="riwayat_alergi"]').val(alergi); + $('textarea[name="rps"]').val(keluhan); + $('textarea[name="rencana"]').val(rtl); + $('input[name="pemeriksaan_spo2"]').val(spo2); + + // Trigger BMI calculation jika ada + if(typeof calculateBMI === 'function') { + calculateBMI(); + } + } +}); + +// Handler untuk tombol Assessment Nyeri di form SOAP +$("#form_soap").on("click",".assessment_nyeri", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $('input:text[name=no_rawat]').val(); + + if (!no_rawat) { + alert('Pilih pasien terlebih dahulu!'); + return false; + } + + var modal = $('#assessmentNyeriModal'); + var modalContent = $('#assessmentNyeriModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment nyeri dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessmentnyeri/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment nyeri yang sudah ada + $('.tampildata').load(baseURL + '/rawat_inap/assessmentnyeritampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Handler untuk Assessment Nyeri di display juga +$("#display").on("click",".assessment_nyeri", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + + var modal = $('#assessmentNyeriModal'); + var modalContent = $('#assessmentNyeriModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment nyeri dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessmentnyeri/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment nyeri yang sudah ada + $('.tampildata').load(baseURL + '/rawat_inap/assessmentnyeritampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Handler untuk tombol buat assessment nyeri dari tampil assessment nyeri +$(document).on("click", ".buat_assessment_nyeri", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + + var modal = $('#assessmentNyeriModal'); + var modalContent = $('#assessmentNyeriModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessmentnyeri/' + set_no_rawat + '?t=' + mlite.token); + }).modal(); + return false; +}); + +// Handler untuk tombol edit assessment nyeri +$(document).on("click", ".edit_assessment_nyeri", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + + var modal = $('#assessmentNyeriModal'); + var modalContent = $('#assessmentNyeriModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_inap/assessmentnyeri/' + set_no_rawat + '?t=' + mlite.token); + }).modal(); + return false; +}); + +// Handler untuk tombol hapus assessment nyeri +$(document).on("click", ".hapus_assessment_nyeri", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).data('no_rawat'); + var tanggal = $(this).data('tanggal'); + + bootbox.confirm("Apakah Anda yakin ingin menghapus data assessment nyeri ini?", function(result){ + if (result){ + $.post(baseURL + '/rawat_inap/hapusassessmentnyeri?t=' + mlite.token, { + no_rawat: no_rawat, + tanggal: tanggal + }, function(data) { + try { + var response = typeof data === 'string' ? JSON.parse(data) : data; + if(response.status === 'success') { + alert(response.message); + // Reload tampilan assessment nyeri + var set_no_rawat = no_rawat.replace(/\//g, ''); + $('.tampildata').load(baseURL + '/rawat_inap/assessmentnyeritampil/' + set_no_rawat + '?t=' + mlite.token); + } else { + alert('Error: ' + response.message); + } + } catch(e) { + // Fallback for non-JSON response + alert('Data assessment nyeri berhasil dihapus!'); + var set_no_rawat = no_rawat.replace(/\//g, ''); + $('.tampildata').load(baseURL + '/rawat_inap/assessmentnyeritampil/' + set_no_rawat + '?t=' + mlite.token); + } + }).fail(function(xhr, status, error) { + alert('Terjadi kesalahan saat menghapus data: ' + error); + }); + } + }); +}); + +// Load Vital Signs Chart +function loadVitalSignsChart() { + console.log('loadVitalSignsChart() called'); + + var no_rawat = $('input[name="no_rawat"]').val(); + console.log('no_rawat:', no_rawat); + + if (!no_rawat) { + console.log('No rawat not found, showing no-data message'); + $('#chart-no-data').show(); + $('#chart-loading').hide(); + return; + } + + // Check if Chart.js is loaded + if (typeof Chart === 'undefined') { + console.error('Chart.js is not loaded!'); + $('#chart-no-data').show(); + $('#chart-loading').hide(); + return; + } + + $('#chart-loading').show(); + $('#chart-no-data').hide(); + + var baseURL = mlite.url + '/' + mlite.admin; + var url = baseURL + '/rawat_inap/vitalsignschart?t=' + mlite.token; + + $.post(url, {no_rawat: no_rawat}, function(data) { + console.log('Raw data:', data); + $('#chart-loading').hide(); + + if (data.labels && data.labels.length > 0) { + createVitalSignsChart(data); + } else { + $('#chart-no-data').show(); + } + }, 'json').fail(function() { + $('#chart-loading').hide(); + $('#chart-no-data').show(); + }); +} + +// Create Vital Signs Chart +function createVitalSignsChart(chartData) { + console.log('createVitalSignsChart() called with data:', chartData); + + // Check if Chart.js is loaded + if (typeof Chart === 'undefined') { + console.error('Chart.js is not loaded in createVitalSignsChart!'); + return; + } + + var ctx = document.getElementById('vitalSignsChart'); + + // Check if canvas element exists + if (!ctx) { + console.error('Canvas element vitalSignsChart not found'); + return; + } + + console.log('Canvas element found, getting 2D context'); + ctx = ctx.getContext('2d'); + + // Destroy existing chart if exists + if (vitalSignsChart && typeof vitalSignsChart.destroy === 'function') { + vitalSignsChart.destroy(); + } + + // Filter out Height and Weight datasets (which use yAxisID: 'y1') + if (chartData.datasets) { + chartData.datasets = chartData.datasets.filter(function(dataset) { + return dataset.yAxisID !== 'y1'; + }); + } + + vitalSignsChart = new Chart(ctx, { + type: 'line', + data: chartData, + options: { + responsive: true, + maintainAspectRatio: false, + interaction: { + mode: 'index', + intersect: false, + }, + plugins: { + title: { + display: true, + text: 'Grafik Tren Tanda Vital Pasien' + }, + legend: { + display: true, + position: 'top' + }, + tooltip: { + callbacks: { + label: function(context) { + var label = context.dataset.label || ''; + if (label) { + label += ': '; + } + if (context.parsed.y !== null) { + label += context.parsed.y; + } + return label; + } + } + } + }, + scales: { + x: { + display: true, + title: { + display: true, + text: 'Waktu Pemeriksaan' + } + }, + y: { + type: 'linear', + display: true, + position: 'left', + title: { + display: true, + text: 'Nilai Tanda Vital' + }, + beginAtZero: false + } + } + } + }); +} + +// Update chart after saving SOAP data +function updateVitalSignsChart() { + loadVitalSignsChart(); +} diff --git a/plugins/rawat_inap/view/admin/assesment.html b/plugins/rawat_inap/view/admin/assesment.html new file mode 100644 index 000000000..112988547 --- /dev/null +++ b/plugins/rawat_inap/view/admin/assesment.html @@ -0,0 +1,1951 @@ + + + + + \ No newline at end of file diff --git a/plugins/rawat_inap/view/admin/assesment.tampil.html b/plugins/rawat_inap/view/admin/assesment.tampil.html new file mode 100644 index 000000000..5048582a7 --- /dev/null +++ b/plugins/rawat_inap/view/admin/assesment.tampil.html @@ -0,0 +1,379 @@ +{if: $penilaian_ranap} + + + + + + + + + + + + + + + + + + + + + + + +
                  Nomor RawatTanggalInformasiVital SignsStatus NyeriPetugasAksi
                  {?=isset_or($penilaian_ranap.no_rawat)?}{?=isset_or($penilaian_ranap.tanggal)?} + Informasi: {?=isset_or($penilaian_ranap.informasi)?}
                  + Cara Masuk: {?=isset_or($penilaian_ranap.cara_masuk)?}
                  + Tiba di Ruang: {?=isset_or($penilaian_ranap.tiba_diruang_rawat)?} +
                  + TD: {?=isset_or($penilaian_ranap.pemeriksaan_td)?} mmHg
                  + Nadi: {?=isset_or($penilaian_ranap.pemeriksaan_nadi)?} x/mnt
                  + RR: {?=isset_or($penilaian_ranap.pemeriksaan_rr)?} x/mnt
                  + Suhu: {?=isset_or($penilaian_ranap.pemeriksaan_suhu)?} °C
                  + SpO2: {?=isset_or($penilaian_ranap.pemeriksaan_spo2)?} %
                  + GCS: {?=isset_or($penilaian_ranap.pemeriksaan_gcs)?}
                  + BB: {?=isset_or($penilaian_ranap.pemeriksaan_bb)?} kg
                  + TB: {?=isset_or($penilaian_ranap.pemeriksaan_tb)?} cm +
                  + Nyeri: {?=isset_or($penilaian_ranap.penilaian_nyeri)?}
                  + {if: $penilaian_ranap.penilaian_nyeri != 'Tidak Ada Nyeri'} + Skala: {?=isset_or($penilaian_ranap.penilaian_nyeri_skala)?}/10
                  + Lokasi: {?=isset_or($penilaian_ranap.penilaian_nyeri_lokasi)?}
                  + Kualitas: {?=isset_or($penilaian_ranap.penilaian_nyeri_kualitas)?} + {/if} +
                  + Petugas 1: {?=isset_or($penilaian_ranap.nama_petugas1)?}
                  + Petugas 2: {?=isset_or($penilaian_ranap.nama_petugas2)?} +
                  + + +
                  + + +
                  +
                  + +
                  +
                  +
                  +
                  + Riwayat Penyakit Sekarang (RPS):
                  + {?=isset_or($penilaian_ranap.rps)?} +
                  +
                  +
                  +
                  +
                  + RPD: {?=isset_or($penilaian_ranap.rpd)?} +
                  +
                  + RPK: {?=isset_or($penilaian_ranap.rpk)?} +
                  +
                  + RPO: {?=isset_or($penilaian_ranap.rpo)?} +
                  +
                  +
                  +
                  +
                  + Riwayat Pembedahan: {?=isset_or($penilaian_ranap.riwayat_pembedahan)?} +
                  +
                  + Riwayat Dirawat di RS: {?=isset_or($penilaian_ranap.riwayat_dirawat_dirs)?} +
                  +
                  +
                  +
                  +
                  + Riwayat Alergi: {?=isset_or($penilaian_ranap.riwayat_alergi)?} +
                  +
                  + Alat Bantu: {?=isset_or($penilaian_ranap.alat_bantu_dipakai)?} +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + Keadaan Umum: {?=isset_or($penilaian_ranap.pemeriksaan_keadaan_umum)?} +
                  +
                  + Pemeriksaan Mental: {?=isset_or($penilaian_ranap.pemeriksaan_mental)?} +
                  +
                  +
                  +
                  Susunan Saraf:
                  +
                  +
                  + Kepala: {?=isset_or($penilaian_ranap.pemeriksaan_susunan_kepala)?} +
                  +
                  + Wajah: {?=isset_or($penilaian_ranap.pemeriksaan_susunan_wajah)?} +
                  +
                  + Leher: {?=isset_or($penilaian_ranap.pemeriksaan_susunan_leher)?} +
                  +
                  + Kejang: {?=isset_or($penilaian_ranap.pemeriksaan_susunan_kejang)?} +
                  +
                  +
                  +
                  + Sensorik: {?=isset_or($penilaian_ranap.pemeriksaan_susunan_sensorik)?} +
                  +
                  +
                  +
                  Kardiovaskular:
                  +
                  +
                  + Denyut Nadi: {?=isset_or($penilaian_ranap.pemeriksaan_kardiovaskuler_denyut_nadi)?} +
                  +
                  + Sirkulasi: {?=isset_or($penilaian_ranap.pemeriksaan_kardiovaskuler_sirkulasi)?} +
                  +
                  + Pulsasi: {?=isset_or($penilaian_ranap.pemeriksaan_kardiovaskuler_pulsasi)?} +
                  +
                  +
                  +
                  Respirasi:
                  +
                  +
                  + Pola Nafas: {?=isset_or($penilaian_ranap.pemeriksaan_respirasi_pola_nafas)?} +
                  +
                  + Suara Nafas: {?=isset_or($penilaian_ranap.pemeriksaan_respirasi_suara_nafas)?} +
                  +
                  + Batuk: {?=isset_or($penilaian_ranap.pemeriksaan_respirasi_batuk)?} +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + Kemampuan Sehari-hari: {?=isset_or($penilaian_ranap.pengkajian_fungsi_kemampuan_sehari)?} +
                  +
                  + Aktifitas: {?=isset_or($penilaian_ranap.pengkajian_fungsi_aktifitas)?} +
                  +
                  +
                  +
                  + Berjalan: {?=isset_or($penilaian_ranap.pengkajian_fungsi_berjalan)?} +
                  +
                  + Ambulasi: {?=isset_or($penilaian_ranap.pengkajian_fungsi_ambulasi)?} +
                  +
                  +
                  +
                  + Ekstrimitas Atas: {?=isset_or($penilaian_ranap.pengkajian_fungsi_ekstrimitas_atas)?} +
                  +
                  + Ekstrimitas Bawah: {?=isset_or($penilaian_ranap.pengkajian_fungsi_ekstrimitas_bawah)?} +
                  +
                  +
                  +
                  + Menggenggam: {?=isset_or($penilaian_ranap.pengkajian_fungsi_menggenggam)?} +
                  +
                  + Koordinasi: {?=isset_or($penilaian_ranap.pengkajian_fungsi_koordinasi)?} +
                  +
                  +
                  +
                  + Kesimpulan: {?=isset_or($penilaian_ranap.pengkajian_fungsi_kesimpulan)?} +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + Kondisi Psiko: {?=isset_or($penilaian_ranap.riwayat_psiko_kondisi_psiko)?} +
                  +
                  + Gangguan Jiwa: {?=isset_or($penilaian_ranap.riwayat_psiko_gangguan_jiwa)?} +
                  +
                  +
                  +
                  + Perilaku: {?=isset_or($penilaian_ranap.riwayat_psiko_perilaku)?} +
                  +
                  + Hubungan Keluarga: {?=isset_or($penilaian_ranap.riwayat_psiko_hubungan_keluarga)?} +
                  +
                  +
                  +
                  + Tinggal dengan: {?=isset_or($penilaian_ranap.riwayat_psiko_tinggal)?} +
                  +
                  + Nilai Kepercayaan: {?=isset_or($penilaian_ranap.riwayat_psiko_nilai_kepercayaan)?} +
                  +
                  +
                  +
                  + Pendidikan PJ: {?=isset_or($penilaian_ranap.riwayat_psiko_pendidikan_pj)?} +
                  +
                  + Edukasi Diberikan: {?=isset_or($penilaian_ranap.riwayat_psiko_edukasi_diberikan)?} +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + 1. Penurunan berat badan: {?=isset_or($penilaian_ranap.skrining_gizi1)?} +
                  +
                  + Nilai: {?=isset_or($penilaian_ranap.nilai_gizi1)?} +
                  +
                  +
                  +
                  + 2. Asupan makan berkurang: {?=isset_or($penilaian_ranap.skrining_gizi2)?} +
                  +
                  + Nilai: {?=isset_or($penilaian_ranap.nilai_gizi2)?} +
                  +
                  +
                  +
                  + Total Nilai Gizi: {?=isset_or($penilaian_ranap.nilai_total_gizi)?} +
                  +
                  + Status: + {if: $penilaian_ranap.nilai_total_gizi >= 3} + Risiko Tinggi + {elseif: $penilaian_ranap.nilai_total_gizi >= 1} + Risiko Sedang + {else} + Risiko Rendah + {/if} +
                  +
                  +
                  +
                  + Diagnosa Khusus: {?=isset_or($penilaian_ranap.skrining_gizi_diagnosa_khusus)?} +
                  +
                  + Diketahui Dietisen: {?=isset_or($penilaian_ranap.skrining_gizi_diketahui_dietisen)?} +
                  +
                  + {if: $penilaian_ranap.skrining_gizi_jam_diketahui_dietisen} +
                  +
                  + Jam Diketahui Dietisen: {?=isset_or($penilaian_ranap.skrining_gizi_jam_diketahui_dietisen)?} +
                  +
                  + {/if} +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  + Rencana:
                  + {?=isset_or($penilaian_ranap.rencana)?} +
                  +
                  +
                  +
                  +
                  +
                  + +{else} +
                  + Belum ada data assessment untuk pasien ini. + +
                  +{/if} + + \ No newline at end of file diff --git a/plugins/rawat_inap/view/admin/assessment.nyeri.html b/plugins/rawat_inap/view/admin/assessment.nyeri.html new file mode 100644 index 000000000..216b23bc5 --- /dev/null +++ b/plugins/rawat_inap/view/admin/assessment.nyeri.html @@ -0,0 +1,351 @@ + + + + \ No newline at end of file diff --git a/plugins/rawat_inap/view/admin/display.html b/plugins/rawat_inap/view/admin/display.html index 1e5c3b8f3..8e487d4b9 100644 --- a/plugins/rawat_inap/view/admin/display.html +++ b/plugins/rawat_inap/view/admin/display.html @@ -20,44 +20,42 @@ {loop: $rawat_inap.list} - + - {$value.nm_pasien} - {$value.no_rawat} - {$value.nm_bangsal} - {$value.kd_kamar} + {?=isset_or($value.nm_pasien)?} + {?=isset_or($value.no_rawat)?} + {?=isset_or($value.nm_bangsal)?} - {?=isset_or($value.kd_kamar)?}
                    {if: $value.dokter} {loop: $value.dokter as $data_dokter}
                  • - {$data_dokter.nm_dokter} + {?=isset_or($data_dokter.nm_dokter)?}
                  • {/loop} {else} @@ -70,28 +68,28 @@ {if: $cek_vclaim}
                    - {if: $value.no_sep !=''} + {if: $value.no_sep != ''} {/if}
                    {/if} {else} - {$value.png_jawab} + {?=isset_or($value.png_jawab)?} {/if} - {$value.no_peserta} - {$value.tgl_masuk} {$value.jam_masuk} - {$value.tgl_keluar} {$value.jam_keluar} - {$value.status_billing} - {$value.stts_pulang} + {?=isset_or($value.no_peserta)?} + {?=isset_or($value.tgl_masuk)?} {?=isset_or($value.jam_masuk)?} + {?=isset_or($value.tgl_keluar)?} {?=isset_or($value.jam_keluar)?} + {?=isset_or($value.status_billing)?} + {?=isset_or($value.stts_pulang)?} {/loop} @@ -122,7 +120,7 @@ + + \ No newline at end of file diff --git a/plugins/rawat_inap/view/admin/form.berkasdigital.html b/plugins/rawat_inap/view/admin/form.berkasdigital.html index 2b836c0bd..5e9658470 100644 --- a/plugins/rawat_inap/view/admin/form.berkasdigital.html +++ b/plugins/rawat_inap/view/admin/form.berkasdigital.html @@ -44,7 +44,7 @@
                    diff --git a/plugins/rawat_inap/view/admin/form.html b/plugins/rawat_inap/view/admin/form.html index ca7da2599..169bb4173 100644 --- a/plugins/rawat_inap/view/admin/form.html +++ b/plugins/rawat_inap/view/admin/form.html @@ -6,21 +6,21 @@
                    - +
                    - +
                    - +
                    - +
                    @@ -34,13 +34,13 @@
                    - +
                    @@ -48,7 +48,7 @@
                    @@ -58,7 +58,7 @@
                    @@ -76,32 +76,32 @@
                    - +
                    - +
                    - +
                    - +
                    - +
                    @@ -109,7 +109,7 @@
                    @@ -122,14 +122,26 @@
                    - - - + + +
                    - - - - - - - $.post(url,{ - no_rawat: no_rawat, - prioritas: prioritas, - nama: nama, - status: status, - kode: kode - } ,function(data) { - $("#display_icd").show().load(baseURL + '/icd_10/display?no_rawat=' + no_rawat + '&t=' + mlite.token); - //bersih(); - $('#notif').html("
                    "+ - "Data ICD 9 (Prosedur) pasien telah disimpan!"+ - ""+ - "
                    ").show(); - }); - }); - - - +} + +// Edit ADIME Gizi +$(document).off('click', '.edit-adime').on('click', '.edit-adime', function() { + var baseURL = mlite.url + '/' + mlite.admin; + var no_rawat = $(this).data('no-rawat'); + var tanggal = $(this).data('tanggal'); + + var url = baseURL + '/rawat_inap/getadimegizidetail?t=' + mlite.token; + $.post(url, {no_rawat: no_rawat, tanggal: tanggal}, function(data) { + if (data) { + $('#adime_no_rawat').val(data.no_rawat); + $('#adime_tanggal').val(data.tanggal); + $('#asesmen').val(data.asesmen || ''); + $('#diagnosis').val(data.diagnosis || ''); + $('#intervensi').val(data.intervensi || ''); + $('#monitoring').val(data.monitoring || ''); + $('#evaluasi_gizi').val(data.evaluasi || ''); + $('#instruksi_gizi').val(data.instruksi || ''); + } + }, 'json'); +}); + +// Hapus ADIME Gizi +$(document).off('click', '.hapus-adime').on('click', '.hapus-adime', function() { + var baseURL = mlite.url + '/' + mlite.admin; + var no_rawat = $(this).data('no-rawat'); + var tanggal = $(this).data('tanggal'); + + if (confirm('Yakin ingin menghapus data ADIME Gizi ini?')) { + var url = baseURL + '/rawat_inap/deleteadimegizi?t=' + mlite.token; + $.post(url, {no_rawat: no_rawat, tanggal: tanggal}, function(data) { + if (data.status === 'success') { + alert('Data ADIME Gizi berhasil dihapus!'); + loadAdimeGiziData(no_rawat); + } else { + alert('Gagal menghapus data: ' + (data.message || 'Unknown error')); + } + }, 'json').fail(function() { + alert('Terjadi kesalahan saat menghapus data!'); + }); + } +}); + +// Reset form ADIME Gizi +function resetAdimeGiziForm() { + $('#asesmen').val(''); + $('#diagnosis').val(''); + $('#intervensi').val(''); + $('#monitoring').val(''); + $('#evaluasi_gizi').val(''); + $('#instruksi_gizi').val(''); + $('#adime_tanggal').val(new Date().toISOString().slice(0, 19).replace('T', ' ')); +} + \ No newline at end of file diff --git a/plugins/rawat_inap/view/admin/kontrol.html b/plugins/rawat_inap/view/admin/kontrol.html index db28e8e30..07aeb3d19 100644 --- a/plugins/rawat_inap/view/admin/kontrol.html +++ b/plugins/rawat_inap/view/admin/kontrol.html @@ -24,14 +24,14 @@

                    Rincian Kontrol

                    {if: $booking_registrasi} {loop: $booking_registrasi} - {$value.nomor} - {$value.tanggal_periksa} - {$value.no_reg} - {$value.nm_poli} - {$value.nm_dokter} - {$value.png_jawab} - {$value.status} - Hapus + {?=isset_or($value.nomor)?} + {?=isset_or($value.tanggal_periksa)?} + {?=isset_or($value.no_reg)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.png_jawab)?} + {?=isset_or($value.status)?} + Hapus {/loop} {else} diff --git a/plugins/rawat_inap/view/admin/layanan.html b/plugins/rawat_inap/view/admin/layanan.html index 684d18313..421753112 100644 --- a/plugins/rawat_inap/view/admin/layanan.html +++ b/plugins/rawat_inap/view/admin/layanan.html @@ -13,9 +13,9 @@ {if: $layanan} {loop: $layanan} - - {$value.kd_jenis_prw} - {$value.nm_perawatan} + + {?=isset_or($value.kd_jenis_prw)?} + {?=isset_or($value.nm_perawatan)?} Rp. {?= number_format($value.total_byrdr,2,',','.')?} Rp. {?= number_format($value.total_byrpr,2,',','.')?} diff --git a/plugins/rawat_inap/view/admin/manage.html b/plugins/rawat_inap/view/admin/manage.html index c9f31c351..e8089d59d 100644 --- a/plugins/rawat_inap/view/admin/manage.html +++ b/plugins/rawat_inap/view/admin/manage.html @@ -34,12 +34,14 @@

                    Kelola Pasien

                    {if: $this->core->getUserInfo('role') == 'admin' || $this->core->getUserInfo('role') == 'rekammedis'} + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_create', 'rawat_inap') == true}
                    {include: ../plugins/rawat_inap/view/admin/form.html}
                    {/if} + {/if}
                    {include: ../plugins/rawat_inap/view/admin/display.html}
                    @@ -55,28 +57,26 @@

                    Kelola Pasien

                    +
                    +
                    + +
                  - -
                  - {include: ../plugins/icd_10/view/admin/display.html} + {include: ../plugins/rawat_inap/view/admin/display.icd.html} +
                  + +
                  +
                  +
                  +

                  Grafik Tanda Vital

                  +
                  +
                  +
                  + +
                  + + +
                  +

                  Rincian Riwayat

                  @@ -31,212 +50,212 @@

                  Rincian Riwayat

                  {loop: $pemeriksaan} - {$value.nomor} + {?=isset_or($value.nomor)?} Rawat Jalan
                  - {$value.tgl_perawatan} {$value.jam_rawat}
                  - {$value.departemen_petugas} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?}
                  + {?=isset_or($value.departemen_petugas)?} - {$value.suhu_tubuh} - {$value.tensi} - {$value.nadi} - {$value.respirasi} - {$value.tinggi} - {$value.berat} - {$value.gcs} - {$value.spo2} - {$value.alergi} + {?=isset_or($value.suhu_tubuh)?} + {?=isset_or($value.tensi)?} + {?=isset_or($value.nadi)?} + {?=isset_or($value.respirasi)?} + {?=isset_or($value.tinggi)?} + {?=isset_or($value.berat)?} + {?=isset_or($value.gcs)?} + {?=isset_or($value.spo2)?} + {?=isset_or($value.alergi)?} - Instruksi: {$value.instruksi}

                  - Evaluasi: {$value.evaluasi}

                  -
                  - {$value.nama_petugas} + Instruksi: {?=isset_or($value.instruksi)?}

                  + Evaluasi: {?=isset_or($value.evaluasi)?}

                  +
                  + {?=isset_or($value.nama_petugas)?} Kesadaran - {$value.kesadaran} + {?=isset_or($value.kesadaran)?} Lingkar Perut - {$value.lingkar_perut} + {?=isset_or($value.lingkar_perut)?} Subyektif - {$value.keluhan} + {?=isset_or($value.keluhan)?} Obyektif - {$value.pemeriksaan} + {?=isset_or($value.pemeriksaan)?} Assesment - {$value.penilaian} + {?=isset_or($value.penilaian)?}
                  Plan - {$value.rtl} + {?=isset_or($value.rtl)?} {/loop} {loop: $pemeriksaan_ranap as $data} - {$data.nomor} + {?=isset_or($data.nomor)?} Rawat Inap
                  - {$data.tgl_perawatan} {$data.jam_rawat}
                  - {$data.departemen_petugas} + {?=isset_or($data.tgl_perawatan)?} {?=isset_or($data.jam_rawat)?}
                  + {?=isset_or($data.departemen_petugas)?} - {$data.suhu_tubuh} - {$data.tensi} - {$data.nadi} - {$data.respirasi} - {$data.tinggi} - {$data.berat} - {$data.gcs} - {$data.spo2} - {$data.alergi} + {?=isset_or($data.suhu_tubuh)?} + {?=isset_or($data.tensi)?} + {?=isset_or($data.nadi)?} + {?=isset_or($data.respirasi)?} + {?=isset_or($data.tinggi)?} + {?=isset_or($data.berat)?} + {?=isset_or($data.gcs)?} + {?=isset_or($data.spo2)?} + {?=isset_or($data.alergi)?} - Instruksi: {$data.instruksi}

                  - Evaluasi: {$data.evaluasi}

                  -
                  - {$data.nama_petugas} + Instruksi: {?=isset_or($data.instruksi)?}

                  + Evaluasi: {?=isset_or($data.evaluasi)?}

                  +
                  + {?=isset_or($data.nama_petugas)?} Kesadaran - {$data.kesadaran} + {?=isset_or($data.kesadaran)?} Subyektif - {$data.keluhan} + {?=isset_or($data.keluhan)?} Obyektif - {$data.pemeriksaan} + {?=isset_or($data.pemeriksaan)?} Assesment - {$data.penilaian} + {?=isset_or($data.penilaian)?}
                  Plan - {$data.rtl} + {?=isset_or($data.rtl)?} {/loop} diff --git a/plugins/rawat_inap/view/admin/stts.daftar.html b/plugins/rawat_inap/view/admin/stts.daftar.html index b74011b1b..3e79c68f5 100644 --- a/plugins/rawat_inap/view/admin/stts.daftar.html +++ b/plugins/rawat_inap/view/admin/stts.daftar.html @@ -1,7 +1,7 @@ -
                  +
                  - - + +
                  diff --git a/plugins/rawat_inap/view/admin/surat.rujukan.html b/plugins/rawat_inap/view/admin/surat.rujukan.html index 96696c176..dd03af155 100644 --- a/plugins/rawat_inap/view/admin/surat.rujukan.html +++ b/plugins/rawat_inap/view/admin/surat.rujukan.html @@ -30,14 +30,14 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_inap','simpansuratrujukan'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var kepada = $("#kepada").val(); var di = $("#di").val(); var anamnesa = $("#anamnesa").val(); @@ -46,7 +46,7 @@ var diagnosa = $("#diagnosa").val(); var terapi = $("#terapi").val(); var alasan_dirujuk = $("#alasan_dirujuk").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -97,12 +97,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -142,12 +142,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -157,7 +157,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}
                  Hasil-hasil penatalaksanaan yang telah kami lakukan terhadap pasien tersebut sebagai berikut. @@ -215,17 +215,17 @@

                  - {$settings.kota}, {?=date('Y-m-d')?}
                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}
                  Salam Sejawat


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}



                  diff --git a/plugins/rawat_inap/view/admin/surat.sakit.html b/plugins/rawat_inap/view/admin/surat.sakit.html index 56c4a8368..874872751 100644 --- a/plugins/rawat_inap/view/admin/surat.sakit.html +++ b/plugins/rawat_inap/view/admin/surat.sakit.html @@ -30,21 +30,21 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_inap','simpansuratsakit'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var keadaan = $("#keadaan").val(); var diagnosa =$("#diagnosa").val(); var lama_angka = $("#lama_angka").val(); var lama_huruf = $("#lama_huruf").val(); var tanggal_mulai = $("#tanggal_mulai").val(); var tanggal_selesai = $("#tanggal_selesai").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -89,12 +89,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -113,7 +113,7 @@

                  - Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, Menerangkan bahwa;

                  + Yang bertanda tangan di bawah ini Dokter {?=isset_or($settings.nama_instansi)?}, Menerangkan bahwa;

                  @@ -123,12 +123,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -138,7 +138,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?} @@ -159,16 +159,16 @@



                  - {$settings.kota}, {?=date('Y-m-d')?}

                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}



                  diff --git a/plugins/rawat_inap/view/admin/surat.sehat.html b/plugins/rawat_inap/view/admin/surat.sehat.html index 00624e8b8..4091806fa 100644 --- a/plugins/rawat_inap/view/admin/surat.sehat.html +++ b/plugins/rawat_inap/view/admin/surat.sehat.html @@ -33,14 +33,14 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_inap','simpansuratsehat'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var tanggal = $("#tanggal").val(); var berat_badan = $("#berat_badan").val(); var tinggi_badan =$("#tinggi_badan").val(); @@ -48,7 +48,7 @@ var gol_darah = $("#gol_darah").val(); var riwayat_penyakit = $("#riwayat_penyakit").val(); var keperluan = $("#keperluan").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -94,12 +94,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -118,7 +118,7 @@

                  - Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, Menerangkan bahwa;

                  + Yang bertanda tangan di bawah ini Dokter {?=isset_or($settings.nama_instansi)?}, Menerangkan bahwa;

                  @@ -128,12 +128,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -143,7 +143,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}
                  Hasil pemeriksaan fisik kami pada tanggal adalah sebagai berikut: @@ -193,16 +193,16 @@



                  - {$settings.kota}, {?=date('Y-m-d')?}

                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}

                  diff --git a/plugins/rawat_jalan/Admin.php b/plugins/rawat_jalan/Admin.php index 37df0bdda..f12c80725 100644 --- a/plugins/rawat_jalan/Admin.php +++ b/plugins/rawat_jalan/Admin.php @@ -12,7 +12,7 @@ class Admin extends AdminModule protected $secretkey; protected $user_key; protected $api_url; - protected $assign; + protected array $assign = []; public function init() { @@ -33,6 +33,920 @@ public function navigation() ]; } + public function apiList() + { + + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $draw = $_GET['draw'] ?? 0; + $start = $_GET['start'] ?? 0; + $length = $_GET['length'] ?? 10; + $columnIndex = $_GET['order'][0]['column'] ?? 0; + $columnName = $_GET['columns'][$columnIndex]['data'] ?? 'no_rawat'; + $columnSortOrder = strtolower($_GET['order'][0]['dir'] ?? 'asc'); + + $allowedColumns = ['no_reg', 'jam_reg', 'no_rkm_medis', 'kd_poli', 'kd_dokter', 'stts', 'status_bayar', 'kd_pj', 'nm_pasien', 'nm_dokter', 'nm_poli', 'png_jawab', 'no_rawat']; + if (!in_array($columnName, $allowedColumns)) { + $columnName = 'no_rawat'; + } + if (!in_array($columnSortOrder, ['asc', 'desc'])) { + $columnSortOrder = 'asc'; + } + + $searchValue = is_array($_GET['search'] ?? null) ? ($_GET['search']['value'] ?? '') : ($_GET['search'] ?? ''); + + $tgl_awal = $_GET['tgl_awal'] ?? date('Y-m-d'); + $tgl_akhir = $_GET['tgl_akhir'] ?? date('Y-m-d'); + $status_periksa = $_GET['status_periksa'] ?? ''; + $status_bayar = $_GET['status_bayar'] ?? ''; + $rujukan_internal = $_GET['rujukan_internal'] ?? false; + $semua_poli = $_GET['semua_poli'] ?? false; + + $user_id = $this->db('mlite_users')->where('username', $username)->oneArray()['id']; + $poliklinik = str_replace(",","','", (string)$this->core->getUserInfo('cap', $user_id, true)); + $igd = $this->settings('settings', 'igd'); + + // Base Query + $params = []; + if ($tgl_awal > date('Y-m-d')) { + $sql = "SELECT booking_registrasi.no_reg, booking_registrasi.jam_booking as jam_reg, + booking_registrasi.no_rkm_medis, booking_registrasi.kd_poli, booking_registrasi.kd_dokter, + booking_registrasi.status as stts, 'Belum Bayar' as status_bayar, booking_registrasi.kd_pj, + pasien.nm_pasien, dokter.nm_dokter, poliklinik.nm_poli, penjab.png_jawab, + concat(date_format(booking_registrasi.tanggal_periksa, '%Y/%m/%d'), '/', lpad(booking_registrasi.no_reg, 6, '0')) as no_rawat + FROM booking_registrasi + JOIN pasien ON booking_registrasi.no_rkm_medis = pasien.no_rkm_medis + JOIN dokter ON booking_registrasi.kd_dokter = dokter.kd_dokter + JOIN poliklinik ON booking_registrasi.kd_poli = poliklinik.kd_poli + JOIN penjab ON booking_registrasi.kd_pj = penjab.kd_pj + WHERE booking_registrasi.kd_poli != ? + AND booking_registrasi.tanggal_periksa BETWEEN ? AND ?"; + $params[] = $igd; + $params[] = $tgl_awal; + $params[] = $tgl_akhir; + + if ($this->core->getUserInfo('role', $user_id, true) != 'admin' && !$semua_poli) { + $sql .= " AND booking_registrasi.kd_poli IN ('$poliklinik')"; + } + if($status_periksa == 'belum') { + $sql .= " AND booking_registrasi.status = 'Belum'"; + } + if($status_periksa == 'selesai') { + $sql .= " AND booking_registrasi.status = 'Sudah'"; + } + + // Search + if (!empty($searchValue)) { + $sql .= " AND (booking_registrasi.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ? OR dokter.nm_dokter LIKE ? OR poliklinik.nm_poli LIKE ?)"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + } + } else { + $sql = "SELECT reg_periksa.*, pasien.nm_pasien, dokter.nm_dokter, poliklinik.nm_poli, penjab.png_jawab + FROM reg_periksa + JOIN pasien ON reg_periksa.no_rkm_medis = pasien.no_rkm_medis + JOIN dokter ON reg_periksa.kd_dokter = dokter.kd_dokter + JOIN poliklinik ON reg_periksa.kd_poli = poliklinik.kd_poli + JOIN penjab ON reg_periksa.kd_pj = penjab.kd_pj "; + + if($rujukan_internal) { + $sql .= " JOIN mlite_rujukan_internal_poli ON reg_periksa.no_rawat = mlite_rujukan_internal_poli.no_rawat "; + } + + $sql .= " WHERE reg_periksa.kd_poli != ? + AND reg_periksa.tgl_registrasi BETWEEN ? AND ?"; + $params[] = $igd; + $params[] = $tgl_awal; + $params[] = $tgl_akhir; + + if ($this->core->getUserInfo('role', $user_id, true) != 'admin' && !$semua_poli) { + $sql .= " AND reg_periksa.kd_poli IN ('$poliklinik')"; + } + if($status_periksa == 'belum') { + $sql .= " AND reg_periksa.stts = 'Belum'"; + } + if($status_periksa == 'selesai') { + $sql .= " AND reg_periksa.stts = 'Sudah'"; + } + if($status_periksa == 'lunas') { + $sql .= " AND reg_periksa.status_bayar = 'Sudah Bayar'"; + } + + // Search + if (!empty($searchValue)) { + $sql .= " AND (reg_periksa.no_rawat LIKE ? OR reg_periksa.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ? OR dokter.nm_dokter LIKE ? OR poliklinik.nm_poli LIKE ?)"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + $params[] = "%$searchValue%"; + } + } + + // Count Total (filtered) + $stmt = $this->db()->pdo()->prepare($sql); + $stmt->execute($params); + $totalRecords = $stmt->rowCount(); + + // Order and Limit + $sql .= " ORDER BY $columnName $columnSortOrder LIMIT $start, $length"; + + $stmt = $this->db()->pdo()->prepare($sql); + $stmt->execute($params); + $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + // XSS Prevention: Sanitize output + foreach ($rows as &$row) { + foreach ($row as $key => $value) { + if (is_string($value)) { + $row[$key] = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); + } + } + } + unset($row); + + $data = []; + foreach ($rows as $row) { + $bridging_sep = $this->db('bridging_sep')->where('no_rawat', $row['no_rawat'])->oneArray(); + $row['no_sep'] = isset_or($bridging_sep['no_sep']); + $data[] = $row; + } + + return [ + "status" => "success", + "data" => $data, + "meta" => [ + "page" => floor($start / $length) + 1, + "per_page" => intval($length), + "total" => $totalRecords + ] + ]; + } + + public function apiShow($no_rawat = null) + { + + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + $no_rawat = revertNoRawat($no_rawat); + $row = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') + ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') + ->join('penjab', 'penjab.kd_pj=reg_periksa.kd_pj') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if($row) { + return ['status' => 'success', 'data' => $row]; + } else { + return ['status' => 'error', 'message' => 'Not found']; + } + } + + public function apiCreate() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + if (empty($input['no_rkm_medis']) || empty($input['kd_poli']) || empty($input['kd_dokter'])) { + return ['status' => 'error', 'message' => 'Data incomplete']; + } + + $input['tgl_registrasi'] = $input['tgl_registrasi'] ?? date('Y-m-d'); + $input['jam_reg'] = $input['jam_reg'] ?? date('H:i:s'); + $input['kd_pj'] = $input['kd_pj'] ?? '-'; + + // Validasi master data dulu agar tidak menghasilkan warning/fatal dan JSON tetap bersih. + $pasien = $this->db('pasien')->where('no_rkm_medis', $input['no_rkm_medis'])->oneArray(); + if (!$pasien) { + return ['status' => 'error', 'message' => 'No. RM tidak ditemukan']; + } + + $poliklinik = $this->db('poliklinik')->where('kd_poli', $input['kd_poli'])->oneArray(); + if (!$poliklinik) { + return ['status' => 'error', 'message' => 'Kode poli tidak valid']; + } + + $dokter = $this->db('dokter')->where('kd_dokter', $input['kd_dokter'])->oneArray(); + if (!$dokter) { + return ['status' => 'error', 'message' => 'Kode dokter tidak valid']; + } + + $maxRetries = 5; + $retryCount = 0; + $success = false; + $lastError = ''; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + if ($input['tgl_registrasi'] > date('Y-m-d')) { + $input['no_reg'] = $this->core->setNoBooking($input['kd_dokter'], $input['tgl_registrasi'], $input['kd_poli']); + $booking = [ + 'tanggal_booking' => date('Y-m-d'), + 'jam_booking' => date('H:i:s'), + 'no_rkm_medis' => $input['no_rkm_medis'], + 'tanggal_periksa' => $input['tgl_registrasi'], + 'kd_dokter' => $input['kd_dokter'], + 'kd_poli' => $input['kd_poli'], + 'no_reg' => $input['no_reg'], + 'kd_pj' => $input['kd_pj'], + 'limit_reg' => '0', + 'waktu_kunjungan' => $input['tgl_registrasi'] . ' ' . $input['jam_reg'], + 'status' => 'Belum' + ]; + $this->db('booking_registrasi')->save($booking); + $this->db()->pdo()->commit(); + return ['status' => 'success', 'result' => 'created', 'data' => $booking]; + } + + $input['no_rawat'] = $this->setNoRawat($input['tgl_registrasi']); + + // Calculate No Reg (Queue Number) + $tgl_registrasi = $input['tgl_registrasi']; + $q = $this->db('reg_periksa') + ->where('kd_poli', $input['kd_poli']) + ->where('tgl_registrasi', $tgl_registrasi); + + if ($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { + $q->where('kd_dokter', $input['kd_dokter']); + } + + $urut = $q->nextRightNumber('no_reg', 3); + $input['no_reg'] = sprintf('%03d', $urut); + + $input['status_lanjut'] = 'Ralan'; + $input['stts'] = 'Belum'; + $input['status_bayar'] = 'Belum Bayar'; + $input['p_jawab'] = $input['p_jawab'] ?? '-'; + $input['almt_pj'] = $input['almt_pj'] ?? '-'; + $input['hubunganpj'] = $input['hubunganpj'] ?? '-'; + + $input['biaya_reg'] = $poliklinik['registrasi'] ?? 0; + + // Calculate Age + $birthDate = new \DateTime($pasien['tgl_lahir']); + $today = new \DateTime("today"); + $y = $today->diff($birthDate)->y; + $m = $today->diff($birthDate)->m; + $d = $today->diff($birthDate)->d; + $input['umurdaftar'] = $d; + $input['sttsumur'] = "Hr"; + if($y !='0'){ + $input['umurdaftar'] = $y; + $input['sttsumur'] = "Th"; + } + if($y =='0' && $m !='0'){ + $input['umurdaftar'] = $m; + $input['sttsumur'] = "Bl"; + } + $existingVisit = $this->db('reg_periksa') + ->where('no_rkm_medis', $input['no_rkm_medis']) + ->oneArray(); + $input['stts_daftar'] = $existingVisit ? 'Lama' : 'Baru'; + $input['status_poli'] = 'Lama'; + + $this->db('reg_periksa')->save($input); + $this->db()->pdo()->commit(); + $success = true; + return ['status' => 'success', 'result' => 'created', 'data' => $input]; + + } catch (\Throwable $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $errMsg = strtolower((string) $e->getMessage()); + $rawErr = trim((string) $e->getMessage()); + if (strpos($errMsg, 'foreign key') !== false) { + $lastError = 'Validasi referensi gagal (pasien/poli/dokter/penjamin tidak valid). Detail: ' . $rawErr; + } elseif (strpos($errMsg, 'booking_registrasi.no_rkm_medis') !== false && strpos($errMsg, 'booking_registrasi.tanggal_periksa') !== false) { + $lastError = 'Booking pasien pada tanggal tersebut sudah ada. Detail: ' . $rawErr; + } elseif (strpos($errMsg, 'unique') !== false || strpos($errMsg, 'primary') !== false) { + $lastError = 'Data duplikat atau bentrok nomor registrasi. Detail: ' . $rawErr; + } else { + $lastError = 'Constraint database gagal saat membuat booking. Detail: ' . $rawErr; + } + $retryCount++; + usleep(100000); + continue; + } + $lastError = $e->getMessage(); + break; + } + } + + if (trim((string) $lastError) === '') { + $lastError = 'Gagal membuat rawat jalan. Periksa no_rkm_medis, kd_poli, kd_dokter, kd_pj, dan konflik nomor registrasi.'; + } + return ['status' => 'error', 'message' => htmlspecialchars($lastError, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]; + } + + public function apiUpdate($no_rawat = null) + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_update', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + + $no_rawat = revertNoRawat($no_rawat); + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $parts = explode('/', $no_rawat); + if (count($parts) == 4) { + $date = $parts[0] . '-' . $parts[1] . '-' . $parts[2]; + if ($date > date('Y-m-d')) { + $no_reg = substr($parts[3], -3); + $booking = $this->db('booking_registrasi') + ->where('tanggal_periksa', $date) + ->where('no_reg', $no_reg) + ->oneArray(); + + if ($booking) { + if(isset($input['stts'])) { + $input['status'] = $input['stts']; + unset($input['stts']); + } + + if ($input['status'] == 'Terdaftar') { + $pasien = $this->db('pasien')->where('no_rkm_medis', $booking['no_rkm_medis'])->oneArray(); + $poliklinik = $this->db('poliklinik')->where('kd_poli', $booking['kd_poli'])->oneArray(); + + $birthDate = new \DateTime($pasien['tgl_lahir']); + $today = new \DateTime($booking['tanggal_periksa']); + $y = $today->diff($birthDate)->y; + $m = $today->diff($birthDate)->m; + $d = $today->diff($birthDate)->d; + $umurdaftar = $d; + $sttsumur = "Hr"; + if($y !='0'){ + $umurdaftar = $y; + $sttsumur = "Th"; + } + if($y =='0' && $m !='0'){ + $umurdaftar = $m; + $sttsumur = "Bl"; + } + + $reg_data = [ + 'no_reg' => $booking['no_reg'], + 'no_rawat' => $this->setNoRawat($booking['tanggal_periksa']), + 'tgl_registrasi' => $booking['tanggal_periksa'], + 'jam_reg' => date('H:i:s'), + 'kd_dokter' => $booking['kd_dokter'], + 'no_rkm_medis' => $booking['no_rkm_medis'], + 'kd_poli' => $booking['kd_poli'], + 'p_jawab' => $pasien['namakeluarga'] ?? '-', + 'almt_pj' => $pasien['alamatpj'] ?? '-', + 'hubunganpj' => $pasien['keluarga'] ?? '-', + 'biaya_reg' => $poliklinik['registrasi'] ?? 0, + 'stts' => 'Belum', + 'status_lanjut' => 'Ralan', + 'kd_pj' => $booking['kd_pj'], + 'umurdaftar' => $umurdaftar, + 'sttsumur' => $sttsumur, + 'status_bayar' => 'Belum Bayar', + 'status_poli' => 'Lama', + 'stts_daftar' => $this->db('reg_periksa') + ->where('no_rkm_medis', $booking['no_rkm_medis']) + ->oneArray() ? 'Lama' : 'Baru' + ]; + + if(!$this->db('reg_periksa')->where('no_rkm_medis', $booking['no_rkm_medis'])->where('tgl_registrasi', $booking['tanggal_periksa'])->oneArray()) { + $this->db('reg_periksa')->save($reg_data); + } + } + + try { + $this->db('booking_registrasi') + ->where('tanggal_periksa', $date) + ->where('no_reg', $no_reg) + ->save($input); + return ['status' => 'updated', 'data' => $input]; + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + } + } + + try { + $this->db('reg_periksa')->where('no_rawat', $no_rawat)->save($input); + return ['status' => 'updated', 'data' => $input]; + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiDelete($no_rawat = null) + { + $username = $this->core->checkAuth('DELETE'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + if(!$no_rawat) { + return ['status' => 'error', 'message' => 'No rawat missing']; + } + $no_rawat = revertNoRawat($no_rawat); + + $parts = explode('/', $no_rawat); + if (count($parts) == 4) { + $date = $parts[0] . '-' . $parts[1] . '-' . $parts[2]; + if ($date > date('Y-m-d')) { + $no_reg = substr($parts[3], -3); + $booking = $this->db('booking_registrasi') + ->where('tanggal_periksa', $date) + ->where('no_reg', $no_reg) + ->oneArray(); + + if ($booking) { + $this->db('booking_registrasi') + ->where('tanggal_periksa', $date) + ->where('no_reg', $no_reg) + ->delete(); + return ['status' => 'deleted', 'no_rawat' => $no_rawat]; + } + } + } + + if(!$this->db('reg_periksa')->where('no_rawat', $no_rawat)->oneArray()) { + return ['status' => 'error', 'message' => 'No rawat not found']; + } + + try { + $this->db('reg_periksa')->where('no_rawat', $no_rawat)->delete(); + return ['status' => 'deleted', 'no_rawat' => $no_rawat]; + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiSaveDetail() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kategori = trim($input['kat']); + + if (empty($kategori) || empty($input['no_rawat']) || empty($input['kd_jenis_prw'])) { + return ['status' => 'error', 'message' => 'Data incomplete']; + } + + try { + if($kategori == 'tindakan') { + if (empty($input['provider'])) { + return ['status' => 'error', 'message' => 'Provider missing for tindakan']; + } + $jns_perawatan = $this->db('jns_perawatan')->where('kd_jenis_prw', $input['kd_jenis_prw'])->oneArray(); + if(!$jns_perawatan) { + return ['status' => 'error', 'message' => 'Jenis perawatan not found']; + } + + if($input['provider'] == 'rawat_jl_dr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_jl_dr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'kd_dokter' => $input['kode_provider'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdr'], + 'stts_bayar' => 'Belum' + ]); + } + } + if($input['provider'] == 'rawat_jl_pr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_jl_pr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'nip' => $input['kode_provider2'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrpr'], + 'stts_bayar' => 'Belum' + ]); + } + } + if($input['provider'] == 'rawat_jl_drpr') { + for ($i = 0; $i < $input['jml_tindakan']; $i++) { + $this->db('rawat_jl_drpr')->save([ + 'no_rawat' => $input['no_rawat'], + 'kd_jenis_prw' => $input['kd_jenis_prw'], + 'kd_dokter' => $input['kode_provider'], + 'nip' => $input['kode_provider2'], + 'tgl_perawatan' => $input['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($input['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdrpr'], + 'stts_bayar' => 'Belum' + ]); + } + } + + return ['status' => 'success', 'message' => 'Detail saved']; + } elseif ($kategori == 'obat') { + $no_resep = $this->core->setNoResep($input['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->where('no_rawat', $input['no_rawat'])->where('tgl_peresepan', $input['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); + + if (empty($cek_resep)) { + $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $input['kode_provider'] ?? $username, + 'tgl_peresepan' => $input['tgl_perawatan'], + 'jam_peresepan' => $input['jam_rawat'], + 'status' => 'ralan', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->oneArray()) { + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $input['kd_jenis_prw'], + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } + } else { + $no_resep = $cek_resep['no_resep']; + $this->db('resep_dokter') + ->save([ + 'no_resep' => $no_resep, + 'kode_brng' => $input['kd_jenis_prw'], + 'jml' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'] + ]); + } + return ['status' => 'success', 'message' => 'Obat saved']; + } elseif ($kategori == 'racikan') { + $no_resep = $this->core->setNoResep($input['tgl_perawatan']); + $cek_resep = $this->db('resep_obat')->where('no_rawat', $input['no_rawat'])->where('tgl_peresepan', $input['tgl_perawatan'])->where('tgl_perawatan', '0000-00-00')->where('status', 'ralan')->oneArray(); + + $jam_rawat = $input['jam_rawat'] ?? date('H:i:s'); + + if (empty($cek_resep)) { + $this->db('resep_obat') + ->save([ + 'no_resep' => $no_resep, + 'tgl_perawatan' => '0000-00-00', + 'jam' => '00:00:00', + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $input['kode_provider'] ?? $username, + 'tgl_peresepan' => $input['tgl_perawatan'], + 'jam_peresepan' => $jam_rawat, + 'status' => 'ralan', + 'tgl_penyerahan' => '0000-00-00', + 'jam_penyerahan' => '00:00:00' + ]); + + if ($this->db('resep_obat')->where('no_resep', $no_resep)->oneArray()) { + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik + 1; + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $input['nama_racik'], + 'kd_racik' => $input['kd_jenis_prw'], + 'jml_dr' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + + $kode_brng_list = is_string($input['kode_brng']) ? json_decode($input['kode_brng'], true) : $input['kode_brng']; + $kandungan_list = is_string($input['kandungan']) ? json_decode($input['kandungan'], true) : $input['kandungan']; + + $kode_brng_count = count($kode_brng_list); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $kode_brng_list[$i]['value'])->oneArray(); + $jml = $input['jml'] * $kandungan_list[$i]['value']; + if ($kapasitas['kapasitas'] > 0) { + $jml = round(($jml / $kapasitas['kapasitas']), 1); + } + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng_list[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $kandungan_list[$i]['value'], + 'jml' => $jml + ]); + } + } + } else { + $no_resep = $cek_resep['no_resep']; + $no_racik = $this->db('resep_dokter_racikan')->where('no_resep', $no_resep)->count(); + $no_racik = $no_racik + 1; + $this->db('resep_dokter_racikan') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'nama_racik' => $input['nama_racik'], + 'kd_racik' => $input['kd_jenis_prw'], + 'jml_dr' => $input['jml'], + 'aturan_pakai' => $input['aturan_pakai'], + 'keterangan' => $input['keterangan'] + ]); + + $kode_brng_list = is_string($input['kode_brng']) ? json_decode($input['kode_brng'], true) : $input['kode_brng']; + $kandungan_list = is_string($input['kandungan']) ? json_decode($input['kandungan'], true) : $input['kandungan']; + + $kode_brng_count = count($kode_brng_list); + for ($i = 0; $i < $kode_brng_count; $i++) { + $kapasitas = $this->db('databarang')->where('kode_brng', $kode_brng_list[$i]['value'])->oneArray(); + $jml = $input['jml'] * $kandungan_list[$i]['value']; + if ($kapasitas['kapasitas'] > 0) { + $jml = round(($jml / $kapasitas['kapasitas']), 1); + } + $this->db('resep_dokter_racikan_detail') + ->save([ + 'no_resep' => $no_resep, + 'no_racik' => $no_racik, + 'kode_brng' => $kode_brng_list[$i]['value'], + 'p1' => '1', + 'p2' => '1', + 'kandungan' => $kandungan_list[$i]['value'], + 'jml' => $jml + ]); + } + } + return ['status' => 'success', 'message' => 'Racikan saved']; + } else { + return ['status' => 'error', 'message' => 'Category not supported']; + } + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiDeleteDetail() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kategori = trim($input['kat']); + + if (empty($kategori) || empty($input['no_rawat']) || empty($input['kd_jenis_prw']) || empty($input['provider']) || empty($input['tgl_perawatan']) || empty($input['jam_rawat'])) { + return ['status' => 'error', 'message' => 'Data incomplete']; + } + + try { + if($kategori == 'tindakan') { + if($input['provider'] == 'rawat_jl_dr') { + $this->db('rawat_jl_dr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + if($input['provider'] == 'rawat_jl_pr') { + $this->db('rawat_jl_pr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + if($input['provider'] == 'rawat_jl_drpr') { + $this->db('rawat_jl_drpr') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_jenis_prw', $input['kd_jenis_prw']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + } + + return ['status' => 'success', 'message' => 'Detail deleted']; + } elseif ($kategori == 'obat') { + if(isset($input['kd_jenis_prw'])) { + $this->db('resep_dokter') + ->where('no_resep', $input['no_resep']) + ->where('kode_brng', $input['kd_jenis_prw']) + ->delete(); + } else { + $this->db('resep_obat') + ->where('no_resep', $input['no_resep']) + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_peresepan', $input['tgl_peresepan']) + ->where('jam_peresepan', $input['jam_peresepan']) + ->delete(); + } + return ['status' => 'success', 'message' => 'Resep deleted']; + } elseif ($kategori == 'racikan') { + if(isset($input['kd_jenis_prw']) && isset($input['no_racik'])) { + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->where('kode_brng', $input['kd_jenis_prw']) + ->delete(); + } elseif (isset($input['no_racik'])) { + $this->db('resep_dokter_racikan') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->delete(); + $this->db('resep_dokter_racikan_detail') + ->where('no_resep', $input['no_resep']) + ->where('no_racik', $input['no_racik']) + ->delete(); + } + return ['status' => 'success', 'message' => 'Racikan deleted']; + } else { + return ['status' => 'error', 'message' => 'Category not supported']; + } + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiShowDetail($kategori, $no_rawat) + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $no_rawat = revertNorawat($no_rawat); + $kategori = trim($kategori); + $no_resep = isset($_GET['no_resep']) ? $_GET['no_resep'] : null; + + $pasien = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $patient_info = [ + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'no_rkm_medis' => $pasien['no_rkm_medis'] ?? '' + ]; + + try { + if ($kategori == 'tindakan') { + $rawat_jl_dr = $this->db('rawat_jl_dr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw = rawat_jl_dr.kd_jenis_prw') + ->join('dokter', 'dokter.kd_dokter = rawat_jl_dr.kd_dokter') + ->where('no_rawat', $no_rawat) + ->toArray(); + + $rawat_jl_pr = $this->db('rawat_jl_pr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw = rawat_jl_pr.kd_jenis_prw') + ->join('petugas', 'petugas.nip = rawat_jl_pr.nip') + ->where('no_rawat', $no_rawat) + ->toArray(); + + $rawat_jl_drpr = $this->db('rawat_jl_drpr') + ->join('jns_perawatan', 'jns_perawatan.kd_jenis_prw = rawat_jl_drpr.kd_jenis_prw') + ->join('dokter', 'dokter.kd_dokter = rawat_jl_drpr.kd_dokter') + ->join('petugas', 'petugas.nip = rawat_jl_drpr.nip') + ->where('no_rawat', $no_rawat) + ->toArray(); + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => [ + 'rawat_jl_dr' => $rawat_jl_dr, + 'rawat_jl_pr' => htmlspecialchars_array($rawat_jl_pr), + 'rawat_jl_drpr' => htmlspecialchars_array($rawat_jl_drpr) + ] + ]; + } elseif ($kategori == 'obat') { + $query = $this->db('resep_dokter') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter.no_resep') + ->join('databarang', 'databarang.kode_brng = resep_dokter.kode_brng') + ->where('resep_obat.no_rawat', $no_rawat) + ->where('resep_obat.status', 'ralan'); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $resep_dokter = $query->toArray(); + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => $resep_dokter + ]; + } elseif ($kategori == 'racikan') { + $query = $this->db('resep_dokter_racikan') + ->join('resep_obat', 'resep_obat.no_resep = resep_dokter_racikan.no_resep') + ->join('metode_racik', 'metode_racik.kd_racik = resep_dokter_racikan.kd_racik') + ->where('resep_obat.no_rawat', $no_rawat) + ->where('resep_obat.status', 'ralan'); + + if ($no_resep) { + $query->where('resep_obat.no_resep', $no_resep); + } + + $resep_racikan = $query->toArray(); + + foreach ($resep_racikan as &$racikan) { + $racikan['detail'] = $this->db('resep_dokter_racikan_detail') + ->join('databarang', 'databarang.kode_brng = resep_dokter_racikan_detail.kode_brng') + ->where('no_resep', $racikan['no_resep']) + ->where('no_racik', $racikan['no_racik']) + ->toArray(); + } + + return [ + 'status' => 'success', + 'patient' => $patient_info, + 'data' => htmlspecialchars_array($resep_racikan) + ]; + } else { + return ['status' => 'error', 'message' => 'Category not supported: ' . $kategori]; + } + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiShowSoap($no_rawat) + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_read', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $no_rawat = revertNorawat($no_rawat); + + try { + $pemeriksaan = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $no_rawat) + ->toArray(); + + return ['status' => 'success', 'data' => $pemeriksaan]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + public function getIndex() { $sub_modules = [ @@ -41,7 +955,7 @@ public function getIndex() ['name' => 'Booking Periksa', 'url' => url([ADMIN, 'rawat_jalan', 'bookingperiksa']), 'icon' => 'file-o', 'desc' => 'Booking periksa pasien rawat jalan via Online'], ['name' => 'Jadwal Dokter', 'url' => url([ADMIN, 'rawat_jalan', 'jadwal']), 'icon' => 'user-md', 'desc' => 'Jadwal dokter rawat jalan'], ]; - return $this->draw('index.html', ['sub_modules' => $sub_modules]); + return $this->draw('index.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function anyManage() @@ -74,17 +988,19 @@ public function anyManage() $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa, $status_bayar); return $this->draw('manage.html', [ - 'rawat_jalan' => $this->assign, - 'cek_vclaim' => $cek_vclaim, + 'rawat_jalan' => htmlspecialchars_array($this->assign), + 'cek_vclaim' => htmlspecialchars_array($cek_vclaim), 'cek_pcare' => $cek_pcare, - 'master_berkas_digital' => $master_berkas_digital, + 'master_berkas_digital' => htmlspecialchars_array($master_berkas_digital), 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode'), 'waapitoken' => $waapitoken, 'waapiphonenumber' => $waapiphonenumber, 'nama_instansi' => $nama_instansi, 'username_fp' => $this->settings->get('settings.username_fp'), - 'password_fp' => $this->settings->get('settings.password_fp') + 'password_fp' => $this->settings->get('settings.password_fp'), + 'username_frista' => $this->settings->get('settings.username_frista'), + 'password_frista' => $this->settings->get('settings.password_frista') ] ); } @@ -116,7 +1032,7 @@ public function anyDisplay() $cek_pcare = $this->db('mlite_modules')->where('dir', 'pcare')->oneArray(); $responsivevoice = $this->settings->get('settings.responsivevoice'); $this->_Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa, $status_bayar); - echo $this->draw('display.html', ['rawat_jalan' => $this->assign, 'cek_vclaim' => $cek_vclaim, 'cek_pcare' => $cek_pcare, 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode'), 'waapitoken' => $waapitoken, 'waapiphonenumber' => $waapiphonenumber, 'nama_instansi' => $nama_instansi]); + echo $this->draw('display.html', ['rawat_jalan' => htmlspecialchars_array($this->assign), 'cek_vclaim' => htmlspecialchars_array($cek_vclaim), 'cek_pcare' => $cek_pcare, 'responsivevoice' => $responsivevoice, 'admin_mode' => $this->settings->get('settings.admin_mode'), 'waapitoken' => $waapitoken, 'waapiphonenumber' => $waapiphonenumber, 'nama_instansi' => $nama_instansi]); exit(); } @@ -136,8 +1052,9 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' $this->assign['tgl_registrasi']= date('Y-m-d'); $this->assign['jam_reg']= date('H:i:s'); - $poliklinik = str_replace(",","','", $this->core->getUserInfo('cap', null, true)); + $poliklinik = str_replace(",","','", (string)$this->core->getUserInfo('cap', null, true)); $igd = $this->settings('settings', 'igd'); + $sql = "SELECT reg_periksa.*, pasien.*, dokter.*, @@ -175,6 +1092,56 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' $this->assign['list'][] = $row; } + $sql_rujukan_internal = "SELECT + reg_periksa.no_rkm_medis, + pasien.nm_pasien, + reg_periksa.no_rawat, + p1.nm_poli as poli_asal, + reg_periksa.kd_poli as kd_poli_asal, + p2.nm_poli as poli_tujuan, + mlite_rujukan_internal_poli.kd_poli as kd_poli_tujuan, + d1.nm_dokter as dokter_perujuk, + reg_periksa.kd_dokter as kd_dokter_perujuk, + d2.nm_dokter as dokter_tujuan, + mlite_rujukan_internal_poli.kd_dokter as kd_dokter_tujuan, + reg_periksa.tgl_registrasi as tgl_rujukan, + mlite_rujukan_internal_poli.isi_rujukan as keterangan, + mlite_rujukan_internal_poli.jawab_rujukan as keterangan_jawab + FROM mlite_rujukan_internal_poli + INNER JOIN reg_periksa ON mlite_rujukan_internal_poli.no_rawat = reg_periksa.no_rawat + INNER JOIN pasien ON reg_periksa.no_rkm_medis = pasien.no_rkm_medis + INNER JOIN poliklinik p1 ON reg_periksa.kd_poli = p1.kd_poli + INNER JOIN poliklinik p2 ON mlite_rujukan_internal_poli.kd_poli = p2.kd_poli + INNER JOIN dokter d1 ON reg_periksa.kd_dokter = d1.kd_dokter + INNER JOIN dokter d2 ON mlite_rujukan_internal_poli.kd_dokter = d2.kd_dokter + INNER JOIN penjab ON reg_periksa.kd_pj = penjab.kd_pj + WHERE reg_periksa.kd_poli != '$igd' + AND reg_periksa.tgl_registrasi BETWEEN '$tgl_kunjungan' AND '$tgl_kunjungan_akhir'"; + + if ($this->core->getUserInfo('role') != 'admin') { + $sql_rujukan_internal .= " AND reg_periksa.kd_poli IN ('$poliklinik')"; + } + if($status_periksa == 'belum') { + $sql_rujukan_internal .= " AND reg_periksa.stts = 'Belum'"; + } + if($status_periksa == 'selesai') { + $sql_rujukan_internal .= " AND reg_periksa.stts = 'Sudah'"; + } + if($status_periksa == 'lunas') { + $sql_rujukan_internal .= " AND reg_periksa.status_bayar = 'Sudah Bayar'"; + } + + $stmt = $this->db()->pdo()->prepare($sql_rujukan_internal); + $stmt->execute(); + $rows = $stmt->fetchAll(); + + $this->assign['list_rujukan_internal'] = []; + foreach ($rows as $row) { + $bridging_sep = $this->db('bridging_sep')->where('no_rawat', $row['no_rawat'])->oneArray(); + $row['no_sep'] = isset_or($bridging_sep['no_sep']); + $this->assign['list_rujukan_internal'][] = $row; + } + if (isset($_POST['no_rawat'])){ $this->assign['reg_periksa'] = $this->db('reg_periksa') ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') @@ -206,7 +1173,6 @@ public function _Display($tgl_kunjungan, $tgl_kunjungan_akhir, $status_periksa=' 'sttsumur' => '', 'status_bayar' => '', 'status_poli' => '', - 'nm_pasien' => '', 'tgl_lahir' => '', 'jk' => '', 'alamat' => '', @@ -270,7 +1236,6 @@ public function anyForm() 'sttsumur' => '', 'status_bayar' => '', 'status_poli' => '', - 'nm_pasien' => '', 'tgl_lahir' => '', 'jk' => '', 'alamat' => '', @@ -311,87 +1276,129 @@ public function anyStatusDaftar() $stts_daftar_hidden = $stts_daftar; } } - echo $this->draw('stts.daftar.html', ['stts_daftar' => $stts_daftar, 'stts_daftar_hidden' => $stts_daftar_hidden, 'bg_status' =>$bg_status]); + echo $this->draw('stts.daftar.html', ['stts_daftar' => htmlspecialchars($stts_daftar, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'stts_daftar_hidden' => htmlspecialchars($stts_daftar_hidden, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'bg_status' => htmlspecialchars($bg_status, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); } else { $rawat = $this->db('reg_periksa') ->where('no_rawat', $_POST['no_rawat']) ->oneArray(); - echo $this->draw('stts.daftar.html', ['stts_daftar' => $rawat['stts_daftar']]); + echo $this->draw('stts.daftar.html', [ + 'stts_daftar' => htmlspecialchars($rawat['stts_daftar'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'stts_daftar_hidden' => htmlspecialchars($rawat['stts_daftar'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'bg_status' => '' + ]); } exit(); } public function postSave() { - if ($_POST['tgl_registrasi'] > date('Y-m-d')) { - $this->db('booking_registrasi')->save([ - 'tanggal_booking' => date('Y-m-d'), - 'jam_booking' => date('H:i:s'), - 'no_rkm_medis' => $_POST['no_rkm_medis'], - 'tanggal_periksa' => $_POST['tgl_registrasi'], - 'kd_dokter' => $_POST['kd_dokter'], - 'kd_poli' => $_POST['kd_poli'], - 'no_reg' => $this->core->setNoBooking($_POST['kd_dokter'], $_POST['tgl_registrasi'], $_POST['kd_poli']), - 'kd_pj' => $_POST['kd_pj'], - 'limit_reg' => '0', - 'waktu_kunjungan' => $_POST['tgl_registrasi'] . ' ' . $_POST['jam_reg'], - 'status' => 'Belum' - ]); - } else if (!$this->db('reg_periksa')->where('no_rawat', $_POST['no_rawat'])->oneArray()) { - - $_POST['status_lanjut'] = 'Ralan'; - $_POST['stts'] = 'Belum'; - $_POST['status_bayar'] = 'Belum Bayar'; - $_POST['p_jawab'] = '-'; - $_POST['almt_pj'] = '-'; - $_POST['hubunganpj'] = '-'; - - $poliklinik = $this->db('poliklinik')->where('kd_poli', $_POST['kd_poli'])->oneArray(); - - $_POST['biaya_reg'] = $poliklinik['registrasi']; - - $pasien = $this->db('pasien')->where('no_rkm_medis', $_POST['no_rkm_medis'])->oneArray(); - - $birthDate = new \DateTime($pasien['tgl_lahir']); - $today = new \DateTime("today"); - $umur_daftar = "0"; - $status_umur = 'Hr'; - if ($birthDate < $today) { - $y = $today->diff($birthDate)->y; - $m = $today->diff($birthDate)->m; - $d = $today->diff($birthDate)->d; - $umur_daftar = $d; - $status_umur = "Hr"; - if($y !='0'){ - $umur_daftar = $y; - $status_umur = "Th"; + $maxRetries = 5; + $retryCount = 0; + $success = false; + $lastError = ''; + + while ($retryCount < $maxRetries && !$success) { + $this->db()->pdo()->beginTransaction(); + try { + if ($_POST['tgl_registrasi'] > date('Y-m-d')) { + $_POST['no_reg'] = $this->core->setNoBooking($_POST['kd_dokter'], $_POST['tgl_registrasi'], $_POST['kd_poli']); + $this->db('booking_registrasi')->save([ + 'tanggal_booking' => date('Y-m-d'), + 'jam_booking' => date('H:i:s'), + 'no_rkm_medis' => $_POST['no_rkm_medis'], + 'tanggal_periksa' => $_POST['tgl_registrasi'], + 'kd_dokter' => $_POST['kd_dokter'], + 'kd_poli' => $_POST['kd_poli'], + 'no_reg' => $_POST['no_reg'], + 'kd_pj' => $_POST['kd_pj'], + 'limit_reg' => '0', + 'waktu_kunjungan' => $_POST['tgl_registrasi'] . ' ' . $_POST['jam_reg'], + 'status' => 'Belum' + ]); + $this->db()->pdo()->commit(); + $success = true; + $query = true; + } else if (!$this->db('reg_periksa')->where('no_rawat', $_POST['no_rawat'])->oneArray()) { + $_POST['no_rawat'] = $this->setNoRawat($_POST['tgl_registrasi']); + + $q = $this->db('reg_periksa') + ->where('kd_poli', $_POST['kd_poli']) + ->where('tgl_registrasi', $_POST['tgl_registrasi']); + + if ($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { + $q->where('kd_dokter', $_POST['kd_dokter']); + } + + $urut = $q->nextRightNumber('no_reg', 3); + $_POST['no_reg'] = sprintf('%03d', $urut); + + $_POST['status_lanjut'] = 'Ralan'; + $_POST['stts'] = 'Belum'; + $_POST['status_bayar'] = 'Belum Bayar'; + $_POST['p_jawab'] = '-'; + $_POST['almt_pj'] = '-'; + $_POST['hubunganpj'] = '-'; + + $poliklinik = $this->db('poliklinik')->where('kd_poli', $_POST['kd_poli'])->oneArray(); + $_POST['biaya_reg'] = $poliklinik['registrasi'] ?? 0; + + $pasien = $this->db('pasien')->where('no_rkm_medis', $_POST['no_rkm_medis'])->oneArray(); + + $birthDate = new \DateTime($pasien['tgl_lahir']); + $today = new \DateTime("today"); + $umur_daftar = "0"; + $status_umur = 'Hr'; + if ($birthDate < $today) { + $y = $today->diff($birthDate)->y; + $m = $today->diff($birthDate)->m; + $d = $today->diff($birthDate)->d; + $umur_daftar = $d; + $status_umur = "Hr"; + if($y !='0'){ + $umur_daftar = $y; + $status_umur = "Th"; + } + if($y =='0' && $m !='0'){ + $umur_daftar = $m; + $status_umur = "Bl"; + } + } + + $_POST['umurdaftar'] = $umur_daftar; + $_POST['sttsumur'] = $status_umur; + $_POST['status_poli'] = 'Lama'; + + $query = $this->db('reg_periksa')->save($_POST); + $this->db()->pdo()->commit(); + $success = true; + } else { + $query = $this->db('reg_periksa')->where('no_rawat', $_POST['no_rawat'])->save([ + 'kd_poli' => $_POST['kd_poli'], + 'kd_dokter' => $_POST['kd_dokter'], + 'kd_pj' => $_POST['kd_pj'] + ]); + $this->db()->pdo()->commit(); + $success = true; } - if($y =='0' && $m !='0'){ - $umur_daftar = $m; - $status_umur = "Bl"; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCount++; + usleep(100000); + continue; } + $lastError = $e->getMessage(); + break; } - - $_POST['umurdaftar'] = $umur_daftar; - $_POST['sttsumur'] = $status_umur; - $_POST['status_poli'] = 'Lama'; - - $query = $this->db('reg_periksa')->save($_POST); - } else { - $query = $this->db('reg_periksa')->where('no_rawat', $_POST['no_rawat'])->save([ - 'kd_poli' => $_POST['kd_poli'], - 'kd_dokter' => $_POST['kd_dokter'], - 'kd_pj' => $_POST['kd_pj'] - ]); } - if($query->errorInfo()['0'] == '00000') { + if($query) { $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); } @@ -423,7 +1430,7 @@ public function anyBooking($page = 1) } $biaya_reg = $this->db('poliklinik')->where('kd_poli', $row['kd_poli'])->oneArray(); - $_POST['biaya_reg'] = $biaya_reg['registrasi']; + $_POST['biaya_reg'] = $biaya_reg['registrasi'] ?? 0; if($_POST['stts_daftar'] == 'Lama') { $_POST['biaya_reg'] = $biaya_reg['registrasilama']; } @@ -457,35 +1464,57 @@ public function anyBooking($page = 1) } if($row['status'] == 'Belum') { - $insert = $this->db('reg_periksa') - ->save([ - 'no_reg' => $row['no_reg'], - 'no_rawat' => $this->setNoRawat(), - 'tgl_registrasi' => date('Y-m-d'), - 'jam_reg' => date('H:i:s'), - 'kd_dokter' => $row['kd_dokter'], - 'no_rkm_medis' => $item, - 'kd_poli' => $row['kd_poli'], - 'p_jawab' => $this->getPasienInfo('namakeluarga', $item), - 'almt_pj' => $this->getPasienInfo('alamatpj', $item), - 'hubunganpj' => $this->getPasienInfo('keluarga', $item), - 'biaya_reg' => $_POST['biaya_reg'], - 'stts' => 'Belum', - 'stts_daftar' => $_POST['stts_daftar'], - 'status_lanjut' => 'Ralan', - 'kd_pj' => $row['kd_pj'], - 'umurdaftar' => $umur, - 'sttsumur' => $sttsumur, - 'status_bayar' => 'Belum Bayar', - 'status_poli' => $_POST['status_poli'] - ]); - - if ($insert) { + $maxRetriesInner = 5; + $retryCountInner = 0; + $successInner = false; + while ($retryCountInner < $maxRetriesInner && !$successInner) { + $this->db()->pdo()->beginTransaction(); + try { + $no_rawat = $this->setNoRawat(); + $insert = $this->db('reg_periksa') + ->save([ + 'no_reg' => $row['no_reg'], + 'no_rawat' => $no_rawat, + 'tgl_registrasi' => date('Y-m-d'), + 'jam_reg' => date('H:i:s'), + 'kd_dokter' => $row['kd_dokter'], + 'no_rkm_medis' => $item, + 'kd_poli' => $row['kd_poli'], + 'p_jawab' => $this->getPasienInfo('namakeluarga', $item), + 'almt_pj' => $this->getPasienInfo('alamatpj', $item), + 'hubunganpj' => $this->getPasienInfo('keluarga', $item), + 'biaya_reg' => $_POST['biaya_reg'], + 'stts' => 'Belum', + 'stts_daftar' => $_POST['stts_daftar'], + 'status_lanjut' => 'Ralan', + 'kd_pj' => $row['kd_pj'], + 'umurdaftar' => $umur, + 'sttsumur' => $sttsumur, + 'status_bayar' => 'Belum Bayar', + 'status_poli' => $_POST['status_poli'] + ]); + + if ($insert) { $this->db('booking_registrasi')->where('no_rkm_medis', $item)->where('tanggal_periksa', date('Y-m-d'))->update('status', 'Terdaftar'); - $this->notify('success', 'Validasi sukses'); - } else { - $this->notify('failure', 'Validasi gagal'); + } + $this->db()->pdo()->commit(); + $successInner = true; + } catch (\Exception $e) { + $this->db()->pdo()->rollBack(); + if ($e->getCode() == '23000') { + $retryCountInner++; + usleep(100000); + continue; + } + break; } + } + + if ($successInner) { + $this->notify('success', 'Validasi sukses'); + } else { + $this->notify('failure', 'Validasi gagal'); + } } } @@ -506,8 +1535,8 @@ public function anyBooking($page = 1) $phrase = $_GET['s']; // pagination - $totalRecords = $this->db()->pdo()->prepare("SELECT booking_registrasi.no_rkm_medis FROM booking_registrasi, pasien WHERE booking_registrasi.no_rkm_medis = pasien.no_rkm_medis AND (booking_registrasi.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ?) AND booking_registrasi.tanggal_periksa BETWEEN '$start_date' AND '$end_date'"); - $totalRecords->execute(['%'.$phrase.'%', '%'.$phrase.'%']); + $totalRecords = $this->db()->pdo()->prepare("SELECT booking_registrasi.no_rkm_medis FROM booking_registrasi, pasien WHERE booking_registrasi.no_rkm_medis = pasien.no_rkm_medis AND (booking_registrasi.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ?) AND booking_registrasi.tanggal_periksa BETWEEN ? AND ?"); + $totalRecords->execute(['%'.$phrase.'%', '%'.$phrase.'%', $start_date, $end_date]); $totalRecords = $totalRecords->fetchAll(); $pagination = new \Systems\Lib\Pagination($page, count($totalRecords), $perpage, url([ADMIN, 'rawat_jalan', 'booking', '%d?s='.$phrase.'&start_date='.$start_date.'&end_date='.$end_date])); @@ -515,8 +1544,8 @@ public function anyBooking($page = 1) $this->assign['totalRecords'] = $totalRecords; $offset = $pagination->offset(); - $query = $this->db()->pdo()->prepare("SELECT booking_registrasi.*, pasien.nm_pasien, pasien.alamat, pasien.no_tlp, dokter.nm_dokter, poliklinik.nm_poli, penjab.png_jawab, pasien.no_peserta FROM booking_registrasi, pasien, dokter, poliklinik, penjab WHERE booking_registrasi.no_rkm_medis = pasien.no_rkm_medis AND booking_registrasi.kd_dokter = dokter.kd_dokter AND booking_registrasi.kd_poli = poliklinik.kd_poli AND booking_registrasi.kd_pj = penjab.kd_pj AND (booking_registrasi.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ?) AND booking_registrasi.tanggal_periksa BETWEEN '$start_date' AND '$end_date' LIMIT $perpage OFFSET $offset"); - $query->execute(['%'.$phrase.'%', '%'.$phrase.'%']); + $query = $this->db()->pdo()->prepare("SELECT booking_registrasi.*, pasien.nm_pasien, pasien.alamat, pasien.no_tlp, dokter.nm_dokter, poliklinik.nm_poli, penjab.png_jawab, pasien.no_peserta FROM booking_registrasi, pasien, dokter, poliklinik, penjab WHERE booking_registrasi.no_rkm_medis = pasien.no_rkm_medis AND booking_registrasi.kd_dokter = dokter.kd_dokter AND booking_registrasi.kd_poli = poliklinik.kd_poli AND booking_registrasi.kd_pj = penjab.kd_pj AND (booking_registrasi.no_rkm_medis LIKE ? OR pasien.nm_pasien LIKE ?) AND booking_registrasi.tanggal_periksa BETWEEN ? AND ? LIMIT ".(int)$perpage." OFFSET ".(int)$offset); + $query->execute(['%'.$phrase.'%', '%'.$phrase.'%', $start_date, $end_date]); $rows = $query->fetchAll(); $this->assign['list'] = []; @@ -528,7 +1557,7 @@ public function anyBooking($page = 1) } $this->assign['searchUrl'] = url([ADMIN, 'rawat_jalan', 'booking', $page.'?s='.$phrase.'&start_date='.$start_date.'&end_date='.$end_date]); - return $this->draw('booking.html', ['booking' => $this->assign, 'waapitoken' => $waapitoken, 'waapiphonenumber' => $waapiphonenumber, 'nama_instansi' => $nama_instansi]); + return $this->draw('booking.html', ['booking' => htmlspecialchars_array($this->assign), 'waapitoken' => $waapitoken, 'waapiphonenumber' => $waapiphonenumber, 'nama_instansi' => $nama_instansi]); } @@ -595,7 +1624,7 @@ public function anyKontrol() $row['nomor'] = $i++; $result[] = $row; } - echo $this->draw('kontrol.html', ['booking_registrasi' => $result]); + echo $this->draw('kontrol.html', ['booking_registrasi' => htmlspecialchars_array($result)]); exit(); } @@ -712,7 +1741,7 @@ public function getPersetujuanUmum($no_rkm_medis) $settings = $this->settings('settings'); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($settings))); $pasien = $this->db('pasien')->where('no_rkm_medis', $no_rkm_medis)->oneArray(); - echo $this->draw('persetujuan.umum.html', ['pasien' => $pasien]); + echo $this->draw('persetujuan.umum.html', ['pasien' => htmlspecialchars_array($pasien)]); exit(); } @@ -730,7 +1759,7 @@ public function getJadwal() $this->assign['jadwal'][] = $row; } - return $this->draw('jadwal.html', ['pendaftaran' => $this->assign]); + return $this->draw('jadwal.html', ['pendaftaran' => htmlspecialchars_array($this->assign)]); } public function getJadwalDel($kd_dokter, $hari_kerja) @@ -771,7 +1800,7 @@ public function getJadwalAdd() $this->assign['poliklinik'] = $this->db('poliklinik')->toArray(); $this->assign['hari_kerja'] = $this->core->getEnum('jadwal', 'hari_kerja'); $this->assign['postUrl'] = url([ADMIN, 'rawat_jalan', 'jadwalsave', $this->assign['form']['kd_dokter'], $this->assign['form']['hari_kerja']]); - return $this->draw('jadwal.form.html', ['pendaftaran' => $this->assign]); + return $this->draw('jadwal.form.html', ['pendaftaran' => htmlspecialchars_array($this->assign)]); } public function getJadwalEdit($id, $hari_kerja) @@ -792,7 +1821,7 @@ public function getJadwalEdit($id, $hari_kerja) $this->assign['poliklinik'] = $this->db('poliklinik')->toArray(); $this->assign['postUrl'] = url([ADMIN, 'rawat_jalan', 'jadwalsave', $this->assign['form']['kd_dokter'], $this->assign['form']['hari_kerja']]); - return $this->draw('jadwal.form.html', ['pendaftaran' => $this->assign]); + return $this->draw('jadwal.form.html', ['pendaftaran' => htmlspecialchars_array($this->assign)]); } else { redirect(url([ADMIN, 'rawat_jalan', 'jadwal'])); } @@ -841,7 +1870,7 @@ public function postStatusRawat() if($_POST['stts'] == 'Berkas Dikirim') { if(!$this->db('mutasi_berkas')->where('no_rawat', $_POST['no_rawat'])->oneArray()) { $this->db('mutasi_berkas')->save([ - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'status' => 'Sudah Dikirim', 'dikirim' => $datetime, 'diterima' => '0000-00-00 00:00:00', @@ -853,7 +1882,7 @@ public function postStatusRawat() } else if ($_POST['stts'] == 'Berkas Diterima') { if(!$this->db('mutasi_berkas')->where('no_rawat', $_POST['no_rawat'])->oneArray()) { $this->db('mutasi_berkas')->save([ - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'status' => 'Sudah Diterima', 'dikirim' => $datetime, 'diterima' => $datetime, @@ -886,13 +1915,13 @@ public function anyPasien() { if(isset($_POST['cari'])) { $pasien = $this->db('pasien') - ->like('no_rkm_medis', '%'.$_POST['cari'].'%') - ->orLike('nm_pasien', '%'.$_POST['cari'].'%') + ->like('no_rkm_medis', '%'.htmlspecialchars($_POST['cari'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') + ->orLike('nm_pasien', '%'.htmlspecialchars($_POST['cari'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'%') ->asc('no_rkm_medis') ->limit(5) ->toArray(); } - echo $this->draw('pasien.html', ['pasien' => $pasien]); + echo $this->draw('pasien.html', ['pasien' => htmlspecialchars_array($pasien ?? [])]); exit(); } @@ -907,7 +1936,7 @@ public function getAntrian() ->join('penjab', 'penjab.kd_pj=reg_periksa.kd_pj') ->where('no_rawat', $_GET['no_rawat']) ->oneArray(); - echo $this->draw('antrian.html', ['rawat_jalan' => $rawat_jalan]); + echo $this->draw('antrian.html', ['rawat_jalan' => htmlspecialchars_array($rawat_jalan)]); exit(); } @@ -922,54 +1951,60 @@ public function postSaveDetail() if($_POST['kat'] == 'tindakan') { $jns_perawatan = $this->db('jns_perawatan')->where('kd_jenis_prw', $_POST['kd_jenis_prw'])->oneArray(); if($_POST['provider'] == 'rawat_jl_dr') { - $this->db('rawat_jl_dr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'kd_dokter' => $_POST['kode_provider'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrdr'], - 'stts_bayar' => 'Belum' - ]); + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_jl_dr')->save([ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'kd_dokter' => $_POST['kode_provider'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdr'], + 'stts_bayar' => 'Belum' + ]); + } } if($_POST['provider'] == 'rawat_jl_pr') { - $this->db('rawat_jl_pr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'nip' => $_POST['kode_provider2'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrpr'], - 'stts_bayar' => 'Belum' - ]); + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_jl_pr')->save([ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'nip' => $_POST['kode_provider2'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrpr'], + 'stts_bayar' => 'Belum' + ]); + } } if($_POST['provider'] == 'rawat_jl_drpr') { - $this->db('rawat_jl_drpr')->save([ - 'no_rawat' => $_POST['no_rawat'], - 'kd_jenis_prw' => $_POST['kd_jenis_prw'], - 'kd_dokter' => $_POST['kode_provider'], - 'nip' => $_POST['kode_provider2'], - 'tgl_perawatan' => $_POST['tgl_perawatan'], - 'jam_rawat' => $_POST['jam_rawat'], - 'material' => $jns_perawatan['material'], - 'bhp' => $jns_perawatan['bhp'], - 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], - 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], - 'kso' => $jns_perawatan['kso'], - 'menejemen' => $jns_perawatan['menejemen'], - 'biaya_rawat' => $jns_perawatan['total_byrdrpr'], - 'stts_bayar' => 'Belum' - ]); + for ($i = 0; $i < $_POST['jml_tindakan']; $i++) { + $this->db('rawat_jl_drpr')->save([ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'kd_dokter' => $_POST['kode_provider'], + 'nip' => $_POST['kode_provider2'], + 'tgl_perawatan' => $_POST['tgl_perawatan'], + 'jam_rawat' => date('H:i:s', strtotime($_POST['jam_rawat']. ' +'.$i.'0 seconds')), + 'material' => $jns_perawatan['material'], + 'bhp' => $jns_perawatan['bhp'], + 'tarif_tindakandr' => $jns_perawatan['tarif_tindakandr'], + 'tarif_tindakanpr' => $jns_perawatan['tarif_tindakanpr'], + 'kso' => $jns_perawatan['kso'], + 'menejemen' => $jns_perawatan['menejemen'], + 'biaya_rawat' => $jns_perawatan['total_byrdrpr'], + 'stts_bayar' => 'Belum' + ]); + } } } exit(); @@ -1046,7 +2081,7 @@ public function anyRincian() } } - echo $this->draw('rincian.html', ['rawat_jl_dr' => $rawat_jl_dr, 'rawat_jl_pr' => $rawat_jl_pr, 'rawat_jl_drpr' => $rawat_jl_drpr, 'jumlah_total' => $jumlah_total, 'no_rawat' => $_POST['no_rawat']]); + echo $this->draw('rincian.html', ['rawat_jl_dr' => htmlspecialchars_array($rawat_jl_dr), 'rawat_jl_pr' => htmlspecialchars_array($rawat_jl_pr), 'rawat_jl_drpr' => htmlspecialchars_array($rawat_jl_drpr), 'jumlah_total' => $jumlah_total, 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); exit(); } @@ -1090,25 +2125,97 @@ public function anySoap() $result_ranap = []; - $check_table = $this->db()->pdo()->query("SHOW TABLES LIKE 'pemeriksaan_ranap'"); - $check_table->execute(); - $check_table = $check_table->fetch(); - if($check_table) { - $rows_ranap = $this->db('pemeriksaan_ranap') - ->where('no_rawat', $_POST['no_rawat']) - ->toArray(); - foreach ($rows_ranap as $row) { - $row['nomor'] = $i++; - $row['nama_petugas'] = $this->core->getPegawaiInfo('nama',$row['nip']); - $row['departemen_petugas'] = $this->core->getDepartemenInfo($this->core->getPegawaiInfo('departemen',$row['nip'])); - $result_ranap[] = $row; - } + $rows_ranap = $this->db('pemeriksaan_ranap') + ->where('no_rawat', $_POST['no_rawat']) + ->toArray(); + foreach ($rows_ranap as $row) { + $row['nomor'] = $i++; + $row['nama_petugas'] = $this->core->getPegawaiInfo('nama',$row['nip']); + $row['departemen_petugas'] = $this->core->getDepartemenInfo($this->core->getPegawaiInfo('departemen',$row['nip'])); + $result_ranap[] = $row; } - echo $this->draw('soap.html', ['pemeriksaan' => $result, 'pemeriksaan_ranap' => $result_ranap, 'diagnosa' => $diagnosa, 'prosedur' => $prosedur, 'admin_mode' => $this->settings->get('settings.admin_mode')]); + echo $this->draw('soap.html', ['pemeriksaan' => htmlspecialchars_array($result), 'pemeriksaan_ranap' => htmlspecialchars_array($result_ranap), 'diagnosa' => htmlspecialchars_array($diagnosa), 'prosedur' => htmlspecialchars_array($prosedur), 'admin_mode' => $this->settings->get('settings.admin_mode')]); exit(); } + public function apiSaveSOAP() + { + $username = $this->core->checkAuth('POST'); + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $required = ['no_rawat', 'tgl_perawatan', 'jam_rawat', 'suhu_tubuh', 'tensi', 'nadi', 'respirasi', 'tinggi', 'berat', 'gcs', 'keluhan', 'pemeriksaan', 'alergi', 'lingkar_perut', 'rtl', 'penilaian', 'instruksi', 'evaluasi', 'nip']; + + foreach($required as $field) { + if(!isset($input[$field])) { + return ['status' => 'error', 'message' => 'Field '.$field.' missing']; + } + } + + try { + if(!$this->db('pemeriksaan_ralan') + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->where('nip', $input['nip']) + ->oneArray()) { + + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $this->db('pemeriksaan_ralan')->save($input); + } else { + + if (!$this->core->checkPermission($username, 'can_update', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $this->db('pemeriksaan_ralan') + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->where('nip', $input['nip']) + ->save($input); + } + return ['status' => 'success', 'message' => 'SOAP saved']; + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + + public function apiDeleteSOAP() + { + $username = $this->core->checkAuth('DELETE'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_REQUEST; + + if(empty($input['no_rawat']) || empty($input['tgl_perawatan']) || empty($input['jam_rawat'])) { + return ['status' => 'error', 'message' => 'Parameters incomplete']; + } + + try { + $this->db('pemeriksaan_ralan') + ->where('no_rawat', $input['no_rawat']) + ->where('tgl_perawatan', $input['tgl_perawatan']) + ->where('jam_rawat', $input['jam_rawat']) + ->delete(); + return ['status' => 'success', 'message' => 'SOAP deleted']; + } catch (\PDOException $e) { + $message = $e->getMessage(); + $message = preg_replace('/`[^`]+`\./', '', $message); + return ['status' => 'error', 'message' => htmlspecialchars_array($message)]; + } + } + public function postSaveSOAP() { $_POST['nip'] = $this->core->getUserInfo('username', null, true); @@ -1141,7 +2248,7 @@ public function anyLayanan() ->in('kd_poli', $poliklinik) ->limit(10) ->toArray(); - echo $this->draw('layanan.html', ['layanan' => $layanan]); + echo $this->draw('layanan.html', ['layanan' => htmlspecialchars_array($layanan)]); exit(); } @@ -1151,14 +2258,14 @@ public function postGetLayanan() ->where('status', '1') ->where('kd_jenis_prw', $_POST['layanan']) ->oneArray(); - echo json_encode($layanan); + echo json_encode(htmlspecialchars_array($layanan)); exit(); } public function anyBerkasDigital() { $berkas_digital = $this->db('berkas_digital_perawatan')->where('no_rawat', $_POST['no_rawat'])->toArray(); - echo $this->draw('berkasdigital.html', ['berkas_digital' => $berkas_digital]); + echo $this->draw('berkasdigital.html', ['berkas_digital' => htmlspecialchars_array($berkas_digital)]); exit(); } @@ -1168,10 +2275,14 @@ public function postSaveBerkasDigital() if(MULTI_APP) { $curl = curl_init(); - $filePath = $_FILES['file']['tmp_name']; + $filePath = isset($_FILES['file']['tmp_name']) ? $_FILES['file']['tmp_name'] : ''; + if (empty($filePath) || !file_exists($filePath)) { + echo 'Gagal menambahkan gambar: berkas tidak ditemukan'; + exit(); + } curl_setopt_array($curl, array( - CURLOPT_URL => str_replace('webapps','',WEBAPPS_URL).'api/berkasdigital', + CURLOPT_URL => substr(rtrim(WEBAPPS_URL, '/'), 0, strrpos(rtrim(WEBAPPS_URL, '/'), '/')).'/api/berkasdigital', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, @@ -1179,15 +2290,15 @@ public function postSaveBerkasDigital() CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', - CURLOPT_POSTFIELDS => array('file'=> new \CURLFILE($filePath),'token' => $this->settings->get('api.berkasdigital_key'), 'no_rawat' => $_POST['no_rawat'], 'kode' => $_POST['kode']), + CURLOPT_POSTFIELDS => array('file'=> new \CURLFILE($filePath),'token' => $this->settings->get('api.berkasdigital_key'), 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'kode' => $_POST['kode']), CURLOPT_HTTPHEADER => array(), )); $response = curl_exec($curl); curl_close($curl); - $json = json_decode($response, true); - if($json['status'] == 'Success') { + $json = is_string($response) ? json_decode($response, true) : null; + if(is_array($json) && isset($json['status']) && $json['status'] == 'Success' && isset($json['msg'])) { echo '
                  '; } else { echo 'Gagal menambahkan gambar'; @@ -1205,7 +2316,7 @@ public function postSaveBerkasDigital() $imgPath = $dir.'/'.$id.'_'.$imgName.'.'.$img->getInfos('type'); $lokasi_file = 'pages/upload/'.$id.'_'.$imgName.'.'.$img->getInfos('type'); $img->save($imgPath); - $query = $this->db('berkas_digital_perawatan')->save(['no_rawat' => $_POST['no_rawat'], 'kode' => $_POST['kode'], 'lokasi_file' => $lokasi_file]); + $query = $this->db('berkas_digital_perawatan')->save(['no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'kode' => $_POST['kode'], 'lokasi_file' => $lokasi_file]); if($query) { echo '
                  '; } @@ -1263,26 +2374,44 @@ public function postCekWaktu() public function postMaxid() { - $max_id = $this->db('reg_periksa')->select(['no_rawat' => 'ifnull(MAX(CONVERT(RIGHT(no_rawat,6),signed)),0)'])->where('tgl_registrasi', date('Y-m-d'))->oneArray(); - if(empty($max_id['no_rawat'])) { - $max_id['no_rawat'] = '000000'; + if(isset($_POST['tgl_registrasi'])) { + $tgl_registrasi = $_POST['tgl_registrasi']; + } else { + $tgl_registrasi = date('Y-m-d'); } - $_next_no_rawat = sprintf('%06s', ($max_id['no_rawat'] + 1)); - $next_no_rawat = date('Y/m/d').'/'.$_next_no_rawat; + $urut = $this->db('reg_periksa') + ->where('tgl_registrasi', $tgl_registrasi) + ->nextRightNumber('no_rawat', 6); + + $next_no_rawat = + date('Y/m/d', strtotime($tgl_registrasi)) . + '/' . + sprintf('%06d', $urut); + echo $next_no_rawat; + exit(); } public function postMaxAntrian() { - $max_id = $this->db('reg_periksa')->select(['no_reg' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)'])->where('kd_poli', $_POST['kd_poli'])->where('tgl_registrasi', date('Y-m-d'))->desc('no_reg')->limit(1)->oneArray(); - if($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { - $max_id = $this->db('reg_periksa')->select(['no_reg' => 'ifnull(MAX(CONVERT(RIGHT(no_reg,3),signed)),0)'])->where('kd_poli', $_POST['kd_poli'])->where('kd_dokter', $_POST['kd_dokter'])->where('tgl_registrasi', date('Y-m-d'))->desc('no_reg')->limit(1)->oneArray(); + if(isset($_POST['tgl_registrasi'])) { + $tgl_registrasi = $_POST['tgl_registrasi']; + } else { + $tgl_registrasi = date('Y-m-d'); } - if(empty($max_id['no_reg'])) { - $max_id['no_reg'] = '000'; + + $q = $this->db('reg_periksa') + ->where('kd_poli', $_POST['kd_poli']) + ->where('tgl_registrasi', $tgl_registrasi); + + if ($this->settings->get('settings.dokter_ralan_per_dokter') == 'true') { + $q->where('kd_dokter', $_POST['kd_dokter']); } - $_next_no_reg = sprintf('%03s', ($max_id['no_reg'] + 1)); + + $urut = $q->nextRightNumber('no_reg', 3); + + $_next_no_reg = sprintf('%03d', $urut); $date = date('Y-m-d'); $tentukan_hari=date('D',strtotime(date('Y-m-d'))); @@ -1325,71 +2454,105 @@ public function getRegPeriksaInfo($field, $no_rawat) return $row[$field]; } - public function setNoRawat() + public function setNoRawat($date = null) { - $date = date('Y-m-d'); - $last_no_rawat = $this->db()->pdo()->prepare("SELECT ifnull(MAX(CONVERT(RIGHT(no_rawat,6),signed)),0) FROM reg_periksa WHERE tgl_registrasi = '$date'"); - $last_no_rawat->execute(); - $last_no_rawat = $last_no_rawat->fetch(); - if(empty($last_no_rawat[0])) { - $last_no_rawat[0] = '000000'; + $date = $date ?? date('Y-m-d'); + $urut = $this->db('reg_periksa') + ->where('tgl_registrasi', $date) + ->nextRightNumber('no_rawat', 6); + if(empty($urut)) { + $urut = '000000'; } - $next_no_rawat = sprintf('%06s', ($last_no_rawat[0] + 1)); - $next_no_rawat = date('Y/m/d').'/'.$next_no_rawat; + $next_no_rawat = sprintf('%06s', $urut); + $next_no_rawat = str_replace('-', '/', $date).'/'.$next_no_rawat; return $next_no_rawat; } public function postCetak() { - $this->db()->pdo()->exec("DELETE FROM `mlite_temporary`"); - $cari = $_POST['cari']; - $tgl_awal = $_POST['tgl_awal']; - $tgl_akhir = $_POST['tgl_akhir']; - $igd = $this->settings->get('settings.igd'); - $this->db()->pdo()->exec("INSERT INTO `mlite_temporary` ( - `temp1`,`temp2`,`temp3`,`temp4`,`temp5`,`temp6`,`temp7`,`temp8`,`temp9`,`temp10`,`temp11`,`temp12`,`temp13`,`temp14`,`temp15`,`temp16`,`temp17`,`temp18`,`temp19` - ) - SELECT * - FROM `reg_periksa` - WHERE `kd_poli` <> '$igd' - AND `tgl_registrasi` BETWEEN '$tgl_awal' AND '$tgl_akhir' - "); - - $cetak = $this->db('mlite_temporary')->toArray(); - echo $this->draw('cetak.rawat_jalan.html', ['cetak' => $cetak]); - - exit(); + $this->db()->pdo()->exec("DELETE FROM mlite_temporary"); + + $cari = $_POST['cari']; + $tgl_awal = $_POST['tgl_awal']; + $tgl_akhir = $_POST['tgl_akhir']; + $igd = $this->settings->get('settings.igd'); + + $this->db()->pdo()->exec(" + INSERT INTO mlite_temporary ( + `temp1`, + `temp2`, + `temp3`, + `temp4`, + `temp5`, + `temp6`, + `temp7`, + `temp8`, + `temp9`, + `temp10`, + `temp11`, + `temp12`, + `temp13`, + `temp14`, + `temp15`, + `temp16`, + `temp17`, + `temp18`, + `temp19` + ) + SELECT * + FROM reg_periksa + WHERE kd_poli <> '$igd' + AND tgl_registrasi BETWEEN '$tgl_awal' AND '$tgl_akhir' + "); + + exit; } + public function getCetakPdf() { - $mpdf = new \Mpdf\Mpdf([ - 'mode' => 'utf-8', - 'orientation' => 'L' - ]); - - $mpdf->SetHTMLHeader($this->core->setPrintHeader()); - $mpdf->SetHTMLFooter($this->core->setPrintFooter()); - - $url = url(ADMIN.'/tmp/cetak.rawat_jalan.html'); - $html = file_get_contents($url); - $mpdf->WriteHTML($this->core->setPrintCss(),\Mpdf\HTMLParserMode::HEADER_CSS); - $mpdf->WriteHTML($html,\Mpdf\HTMLParserMode::HTML_BODY); - - // Output a PDF file directly to the browser - $mpdf->Output(); - exit(); - } + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'orientation' => 'L' + ]); - public function getExcel() - { - $file = "data.pasien.rawat.jalan.xls"; - $html = file_get_contents(url(ADMIN.'/tmp/cetak.rawat_jalan.html')); - header("Content-type: application/vnd-ms-excel"); - header("Content-Disposition: attachment; filename=$file"); - echo ""; - echo $html; + $mpdf->SetHTMLHeader($this->core->setPrintHeader()); + $mpdf->SetHTMLFooter($this->core->setPrintFooter()); + + // ambil data + $cetak = $this->db('mlite_temporary')->toArray(); + + // inject ke template + $this->tpl->set('cetak', $cetak); + + // render template (PATH BENAR) + $html = $this->draw('cetak.rawat_jalan.html'); + + // CSS + $mpdf->WriteHTML( + $this->core->setPrintCss(), + \Mpdf\HTMLParserMode::HEADER_CSS + ); + + // BODY + $mpdf->WriteHTML( + $html, + \Mpdf\HTMLParserMode::HTML_BODY + ); + + $mpdf->Output(); + exit; + } + + public function getExcel() + { + $file = "data.pasien.rawat.jalan.xls"; + $html = file_get_contents(url(ADMIN.'/tmp/cetak.rawat_jalan.html')); + header("Content-type: application/vnd-ms-excel"); + header("Content-Disposition: attachment; filename=$file"); + echo ""; + echo $html; echo ""; exit(); } @@ -1403,10 +2566,9 @@ public function postObatKronis() $bridging_sep['no_sep'] = ''; } $this->db('mlite_veronisa')->save([ - 'id' => NULL, 'tanggal' => date('Y-m-d'), 'no_rkm_medis' => $reg_periksa['no_rkm_medis'], - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'tgl_registrasi' => $reg_periksa['tgl_registrasi'], 'nosep' => $bridging_sep['no_sep'], 'status' => 'Belum', @@ -1416,6 +2578,20 @@ public function postObatKronis() exit(); } + public function postKPS() + { + if (isset($_POST['no_rawat']) && $_POST['no_rawat'] !='') { + $this->db('catatan_perawatan')->save([ + 'tanggal' => date('Y-m-d'), + 'jam' => date('H:i:s'), + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kd_dokter' => $_POST['kd_dokter'], + 'catatan' => 'KPS' + ]); + } + exit(); + } + public function getOdontogram($no_rkm_medis) { @@ -1473,16 +2649,16 @@ public function getOdontogram($no_rkm_medis) $odt['85'] = $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->where('pemeriksaan', 'gg_85')->desc('tgl_input')->limit(1)->oneArray(); echo $this->draw('odontogram.html', [ - 'odontogram' => $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray(), - 'ohis' => $this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray(), - 'odt' => $odt + 'odontogram' => htmlspecialchars_array($this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray()), + 'ohis' => htmlspecialchars_array($this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray()), + 'odt' => htmlspecialchars_array($odt) ]); exit(); } public function getOdontogramTampil($no_rkm_medis) { - echo $this->draw('odontogram.tampil.html', ['odontogram' => $this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray()]); + echo $this->draw('odontogram.tampil.html', ['odontogram' => htmlspecialchars_array($this->db('mlite_odontogram')->where('no_rkm_medis', $no_rkm_medis)->toArray())]); exit(); } @@ -1510,7 +2686,7 @@ public function postOdontogramDelete() public function getOhisTampil($no_rkm_medis) { - echo $this->draw('ohis.tampil.html', ['ohis' => $this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray()]); + echo $this->draw('ohis.tampil.html', ['ohis' => htmlspecialchars_array($this->db('mlite_ohis')->where('no_rkm_medis', $no_rkm_medis)->toArray())]); exit(); } @@ -1553,8 +2729,8 @@ public function getSepDetail($no_sep) $this->tpl->set('sep', $this->tpl->noParse_array(htmlspecialchars_array($sep))); $potensi_prb = $this->db('bpjs_prb')->where('no_sep', $no_sep)->oneArray(); - $data_sep['potensi_prb'] = $potensi_prb['prb']; - echo $this->draw('sep.detail.html', ['data_sep' => $data_sep]); + $data_sep['potensi_prb'] = $potensi_prb['prb'] ?? null; + echo $this->draw('sep.detail.html', ['data_sep' => htmlspecialchars_array($data_sep)]); exit(); } @@ -1577,7 +2753,7 @@ public function getSuratRujukan($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_rujukan')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_jalan/view/admin/surat.rujukan.html', true); exit(); } @@ -1601,7 +2777,7 @@ public function getSuratSehat($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sehat')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_jalan/view/admin/surat.sehat.html', true); exit(); } @@ -1625,7 +2801,7 @@ public function getSuratSakit($no_rawat) $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); $this->tpl->set('surat', $this->db('mlite_surat_sakit')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - $this->tpl->set('nomor_surat', $this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat'].'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); + $this->tpl->set('nomor_surat', $this->settings->get('settings.set_nomor_surat').'/'.$this->settings->get('settings.prefix_surat').'/'.getRomawi(date('m')).'/'.date('Y')); echo $this->tpl->draw(MODULES.'/rawat_jalan/view/admin/surat.sakit.html', true); exit(); } @@ -1633,9 +2809,8 @@ public function getSuratSakit($no_rawat) public function postSimpanSuratSakit() { $query = $this->db('mlite_surat_sakit')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'no_rkm_medis' => $_POST['no_rkm_medis'], 'nm_pasien' => $_POST['nm_pasien'], 'tgl_lahir' => $_POST['tgl_lahir'], @@ -1653,16 +2828,15 @@ public function postSimpanSuratSakit() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -1671,9 +2845,8 @@ public function postSimpanSuratSakit() public function postSimpanSuratSehat() { $query = $this->db('mlite_surat_sehat')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'no_rkm_medis' => $_POST['no_rkm_medis'], 'nm_pasien' => $_POST['nm_pasien'], 'tgl_lahir' => $_POST['tgl_lahir'], @@ -1692,16 +2865,15 @@ public function postSimpanSuratSehat() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); @@ -1710,9 +2882,8 @@ public function postSimpanSuratSehat() public function postSimpanSuratRujukan() { $query = $this->db('mlite_surat_rujukan')->save([ - 'id' => NULL, 'nomor_surat' => $_POST['nomor_surat'], - 'no_rawat' => $_POST['no_rawat'], + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'no_rkm_medis' => $_POST['no_rkm_medis'], 'nm_pasien' => $_POST['nm_pasien'], 'tgl_lahir' => $_POST['tgl_lahir'], @@ -1732,21 +2903,482 @@ public function postSimpanSuratRujukan() ]); if($query) { - $nomor_surat = ltrim($this->db('mlite_set_nomor_surat')->select('nomor_surat')->oneArray()['nomor_surat']); + $nomor_surat = ltrim($this->settings->get('settings.set_nomor_surat')); $nomor_surat = sprintf('%03s', ($nomor_surat + 1)); - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $nomor_surat]); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'set_nomor_surat')->set('value', $nomor_surat)->update(); $data['status'] = 'success'; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } else { $data['status'] = 'error'; $data['msg'] = $query->errorInfo()['2']; - echo json_encode($data); + echo json_encode(htmlspecialchars_array($data)); } exit(); } + public function postSaveICD10() + { + $_POST['status_penyakit'] = 'Baru'; + unset($_POST['nama']); + $this->db('diagnosa_pasien')->save($_POST); + exit(); + } + + public function postHapusICD10() + { + $this->db('diagnosa_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + exit(); + } + + public function postICD10() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('penyakit')->like('kd_penyakit', $key)->orLike('nm_penyakit', $key)->asc('kd_penyakit')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + + exit(); + + } + + public function postSaveICD9() + { + unset($_POST['nama']); + $this->db('prosedur_pasien')->save($_POST); + exit(); + } + + public function postHapusICD9() + { + $this->db('prosedur_pasien')->where('no_rawat', $_POST['no_rawat'])->where('prioritas', $_POST['prioritas'])->delete(); + exit(); + } + + public function postICD9() + { + + if(isset($_POST["query"])){ + $output = ''; + $key = "%".$_POST["query"]."%"; + $rows = $this->db('icd9')->like('kode', $key)->orLike('deskripsi_panjang', $key)->asc('kode')->limit(10)->toArray(); + $output = ''; + if(count($rows)){ + foreach ($rows as $row) { + $output .= ''; + } + } else { + $output .= ''; + } + echo $output; + } + + exit(); + + } + + public function getDisplayICD() + { + $no_rawat = $_GET['no_rawat']; + $prosedurs = $this->db('prosedur_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $prosedur = []; + foreach ($prosedurs as $row_prosedur) { + $icd9 = $this->db('icd9')->where('kode', $row_prosedur['kode'])->oneArray(); + $row_prosedur['nama'] = $icd9['deskripsi_panjang']; + $prosedur[] = $row_prosedur; + } + + $diagnosas = $this->db('diagnosa_pasien') + ->where('no_rawat', $no_rawat) + ->asc('prioritas') + ->toArray(); + $diagnosa = []; + foreach ($diagnosas as $row_diagnosa) { + $icd10 = $this->db('penyakit')->where('kd_penyakit', $row_diagnosa['kd_penyakit'])->oneArray(); + $row_diagnosa['nama'] = $icd10['nm_penyakit']; + $diagnosa[] = $row_diagnosa; + } + + echo $this->draw('display.icd.html', ['diagnosa' => htmlspecialchars_array($diagnosa), 'prosedur' => htmlspecialchars_array($prosedur)]); + exit(); + } + + public function getAssessment($no_rawat) + { + $no_rawat_reverted = revertNoRawat($no_rawat); + + // Cek apakah data assessment sudah ada + $existing_assessment = $this->db('penilaian_awal_keperawatan_ralan') + ->where('no_rawat', $no_rawat_reverted) + ->oneArray(); + + $penilaian_awal_keperawatan_ralan = null; + + if($existing_assessment) { + // Jika data assessment sudah ada, ambil dengan join petugas + $penilaian_awal_keperawatan_ralan = $this->db('penilaian_awal_keperawatan_ralan') + ->where('no_rawat', $no_rawat_reverted) + ->join('petugas', 'petugas.nip=penilaian_awal_keperawatan_ralan.nip') + ->oneArray(); + } else { + // Jika belum ada, ambil data dari pemeriksaan_ralan sebagai fallback + $pemeriksaan_data = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $no_rawat_reverted) + ->desc('tgl_perawatan') + ->desc('jam_rawat') + ->oneArray(); + + if($pemeriksaan_data) { + // Map data dari pemeriksaan_ralan ke format penilaian_awal_keperawatan_ralan + $penilaian_awal_keperawatan_ralan = [ + 'no_rawat' => $pemeriksaan_data['no_rawat'], + 'tanggal' => $pemeriksaan_data['tgl_perawatan'] . 'T' . substr($pemeriksaan_data['jam_rawat'], 0, 5), + 'informasi' => 'Autoanamnesis', // default + 'td' => $pemeriksaan_data['tensi'] ?? '', + 'nadi' => $pemeriksaan_data['nadi'] ?? '', + 'rr' => $pemeriksaan_data['respirasi'] ?? '', + 'suhu' => $pemeriksaan_data['suhu_tubuh'] ?? '', + 'gcs' => $pemeriksaan_data['gcs'] ?? '', + 'bb' => $pemeriksaan_data['berat'] ?? '', + 'tb' => $pemeriksaan_data['tinggi'] ?? '', + 'bmi' => '', // akan dihitung otomatis jika bb dan tb ada + 'keluhan_utama' => $pemeriksaan_data['keluhan'] ?? '', + 'rpd' => '', + 'rpk' => '', + 'rpo' => '', + 'alergi' => $pemeriksaan_data['alergi'] ?? '', + 'alat_bantu' => 'Tidak', + 'ket_bantu' => '', + 'prothesa' => 'Tidak', + 'ket_pro' => '', + 'adl' => 'Mandiri', + 'status_psiko' => 'Tenang', + 'ket_psiko' => '', + 'hub_keluarga' => 'Baik', + 'tinggal_dengan' => 'Keluarga', + 'ket_tinggal' => '', + 'ekonomi' => 'Cukup', + 'budaya' => 'Tidak Ada', + 'ket_budaya' => '', + 'edukasi' => 'Pasien', + 'ket_edukasi' => '', + 'berjalan_a' => 'Tidak', + 'berjalan_b' => 'Tidak', + 'berjalan_c' => 'Tidak', + 'hasil' => 'Rendah', + 'lapor' => 'Tidak', + 'ket_lapor' => '', + 'sg1' => 'Tidak', + 'nilai1' => '0', + 'sg2' => 'Tidak', + 'nilai2' => '0', + 'total_hasil' => 0, + 'nyeri' => 'Tidak', + 'provokes' => 'Aktivitas', + 'ket_provokes' => '', + 'quality' => 'Seperti Tertusuk', + 'ket_quality' => '', + 'lokasi' => '', + 'menyebar' => 'Tidak', + 'skala_nyeri' => '0', + 'durasi' => '', + 'nyeri_hilang' => 'Istirahat', + 'ket_nyeri' => '', + 'pada_dokter' => 'Tidak', + 'ket_dokter' => '', + 'rencana' => '', + 'nip' => $this->core->getUserInfo('username') ?? '' + ]; + + // Hitung BMI jika bb dan tb tersedia + if(!empty($penilaian_awal_keperawatan_ralan['bb']) && !empty($penilaian_awal_keperawatan_ralan['tb'])) { + $bb = floatval($penilaian_awal_keperawatan_ralan['bb']); + $tb = floatval($penilaian_awal_keperawatan_ralan['tb']) / 100; // convert cm to m + if($tb > 0) { + $bmi = $bb / ($tb * $tb); + $penilaian_awal_keperawatan_ralan['bmi'] = number_format($bmi, 2); + } + } + } + } + + $data_assessment['penilaian_awal_keperawatan_ralan'] = $existing_assessment; + $data_petugas = $this->db('petugas')->select('nip, nama')->where('status', '1')->toArray(); + echo $this->draw('assesment.html', [ + 'reg_periksa' => $this->db('reg_periksa')->where('no_rawat', $no_rawat_reverted)->oneArray(), + 'penilaian_awal_keperawatan_ralan' => htmlspecialchars_array($penilaian_awal_keperawatan_ralan), + 'pasien' => $this->db('pasien')->where('no_rawat', $no_rawat_reverted)->join('reg_periksa','pasien.no_rkm_medis=reg_periksa.no_rkm_medis')->oneArray(), + 'petugas' => $existing_assessment ? $this->db('petugas')->where('no_rawat', $no_rawat_reverted)->join('penilaian_awal_keperawatan_ralan','petugas.nip=penilaian_awal_keperawatan_ralan.nip')->oneArray() : [], + 'data_assessment' => $data_assessment, + 'petugas_list' => $data_petugas + ]); + exit(); + } + + public function postAssessmentsave() + { + // Trim semua input POST untuk menghilangkan whitespace + foreach($_POST as $key => $value) { + if(is_string($value)) { + $_POST[$key] = trim($value); + } + } + + // Log untuk debugging + error_log('POST data received: ' . print_r($_POST, true)); + + // Debug khusus untuk field GCS + error_log('GCS field debug - isset: ' . (isset($_POST['gcs']) ? 'true' : 'false') . ', value: "' . (isset($_POST['gcs']) ? $_POST['gcs'] : 'NOT_SET') . '"'); + + // Validasi input required + $required_fields = ['no_rawat', 'tanggal', 'informasi', 'rr', 'gcs', 'bmi', 'rpk', 'rpo', 'ket_pro', 'ket_psiko', 'ket_tinggal', 'ket_budaya', 'ket_edukasi', 'ket_lapor', 'ket_provokes', 'ket_quality', 'lokasi', 'durasi', 'ket_nyeri', 'ket_dokter', 'rencana', 'nip']; + + foreach($required_fields as $field) { + $value = isset($_POST[$field]) ? $_POST[$field] : ''; + $trimmed_value = is_string($value) ? trim($value) : $value; + + // Log detail untuk setiap field + error_log('Field validation - ' . $field . ': isset=' . (isset($_POST[$field]) ? 'true' : 'false') . ', original="' . $value . '", trimmed="' . $trimmed_value . '", empty=' . (empty($trimmed_value) ? 'true' : 'false')); + + if(empty($trimmed_value) || $trimmed_value === '') { + error_log('Validation failed for field: ' . $field . ', value: "' . $value . '"'); + echo json_encode([ + 'status' => 'error', + 'message' => 'Field ' . $field . ' harus diisi', + 'field' => $field, + 'value' => $value, + 'trimmed_value' => $trimmed_value, + 'debug_info' => [ + 'isset' => isset($_POST[$field]), + 'original_value' => $value, + 'trimmed_value' => $trimmed_value, + 'is_empty' => empty($trimmed_value) + ] + ]); + exit(); + } + } + + // Cek apakah data sudah ada + $existing = $this->db('penilaian_awal_keperawatan_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->oneArray(); + + $data = [ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'tanggal' => $_POST['tanggal'], + 'informasi' => $_POST['informasi'], + 'td' => $_POST['td'] ?? '', + 'nadi' => $_POST['nadi'] ?? '', + 'rr' => $_POST['rr'], + 'suhu' => $_POST['suhu'] ?? '', + 'gcs' => $_POST['gcs'], + 'bb' => $_POST['bb'] ?? '', + 'tb' => $_POST['tb'] ?? '', + 'bmi' => $_POST['bmi'], + 'keluhan_utama' => $_POST['keluhan_utama'] ?? '', + 'rpd' => $_POST['rpd'] ?? '', + 'rpk' => $_POST['rpk'], + 'rpo' => $_POST['rpo'], + 'alergi' => $_POST['alergi'] ?? '', + 'alat_bantu' => $_POST['alat_bantu'], + 'ket_bantu' => $_POST['ket_bantu'] ?? '', + 'prothesa' => $_POST['prothesa'], + 'ket_pro' => $_POST['ket_pro'], + 'adl' => $_POST['adl'], + 'status_psiko' => $_POST['status_psiko'], + 'ket_psiko' => $_POST['ket_psiko'], + 'hub_keluarga' => $_POST['hub_keluarga'], + 'tinggal_dengan' => $_POST['tinggal_dengan'], + 'ket_tinggal' => $_POST['ket_tinggal'], + 'ekonomi' => $_POST['ekonomi'], + 'budaya' => $_POST['budaya'], + 'ket_budaya' => $_POST['ket_budaya'], + 'edukasi' => $_POST['edukasi'], + 'ket_edukasi' => $_POST['ket_edukasi'], + 'berjalan_a' => $_POST['berjalan_a'], + 'berjalan_b' => $_POST['berjalan_b'], + 'berjalan_c' => $_POST['berjalan_c'], + 'hasil' => $_POST['hasil'], + 'lapor' => $_POST['lapor'], + 'ket_lapor' => $_POST['ket_lapor'], + 'sg1' => $_POST['sg1'], + 'nilai1' => $_POST['nilai1'], + 'sg2' => $_POST['sg2'], + 'nilai2' => $_POST['nilai2'], + 'total_hasil' => (int)$_POST['total_hasil'], + 'nyeri' => $_POST['nyeri'], + 'provokes' => $_POST['provokes'], + 'ket_provokes' => $_POST['ket_provokes'], + 'quality' => $_POST['quality'], + 'ket_quality' => $_POST['ket_quality'], + 'lokasi' => $_POST['lokasi'], + 'menyebar' => $_POST['menyebar'], + 'skala_nyeri' => $_POST['skala_nyeri'], + 'durasi' => $_POST['durasi'], + 'nyeri_hilang' => $_POST['nyeri_hilang'], + 'ket_nyeri' => $_POST['ket_nyeri'], + 'pada_dokter' => $_POST['pada_dokter'], + 'ket_dokter' => $_POST['ket_dokter'], + 'rencana' => $_POST['rencana'], + 'nip' => $_POST['nip'] + ]; + + try { + if($existing) { + // Update data yang sudah ada + $query = $this->db('penilaian_awal_keperawatan_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->save($data); + } else { + // Insert data baru + $query = $this->db('penilaian_awal_keperawatan_ralan')->save($data); + } + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data assessment berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data assessment']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function getAssessmenttampil($no_rawat) + { + $no_rawat = revertNorawat($no_rawat); + $penilaian_awal_keperawatan_ralan = $this->db('penilaian_awal_keperawatan_ralan') + ->join('petugas', 'petugas.nip=penilaian_awal_keperawatan_ralan.nip') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if($penilaian_awal_keperawatan_ralan) { + $penilaian_awal_keperawatan_ralan['nm_petugas'] = $penilaian_awal_keperawatan_ralan['nama']; + } + + echo $this->draw('assesment.tampil.html', ['penilaian_awal_keperawatan_ralan' => htmlspecialchars_array($penilaian_awal_keperawatan_ralan)]); + exit(); + } + + public function postAssessmentdelete() + { + try { + $query = $this->db('penilaian_awal_keperawatan_ralan') + ->where('no_rawat', $_POST['no_rawat']) + ->delete(); + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data assessment berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus data assessment']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function postRujukanInternal() + { + try { + $query = $this->db('mlite_rujukan_internal_poli') + ->save([ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'kd_poli' => $_POST['kd_poli'], + 'kd_dokter' => $_POST['kd_dokter'], + 'isi_rujukan' => $_POST['isi_rujukan'] + ]); + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data rujukan internal berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data rujukan internal']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function postGetRujukanInternal() + { + $rujukan = $this->db('mlite_rujukan_internal_poli')->where('no_rawat', $_POST['no_rawat'])->oneArray(); + echo json_encode(htmlspecialchars_array($rujukan)); + exit(); + } + + public function postHapusrujukaninternal() + { + try { + // Get POST data + $no_rawat = isset($_POST['no_rawat']) ? $_POST['no_rawat'] : ''; + + if (empty($no_rawat)) { + echo json_encode(['status' => 'error', 'message' => 'No rawat tidak boleh kosong']); + exit(); + } + + // Delete rujukan internal + $result = $this->db('mlite_rujukan_internal_poli')->where('no_rawat', $no_rawat)->delete(); + + if ($result) { + echo json_encode(['status' => 'success', 'message' => 'Rujukan internal berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus rujukan internal atau data tidak ditemukan']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function postEditrujukaninternal() + { + try { + // Get POST data + $no_rawat = isset($_POST['no_rawat']) ? $_POST['no_rawat'] : ''; + $jawab_rujukan = isset($_POST['jawab_rujukan']) ? $_POST['jawab_rujukan'] : ''; + + if (empty($jawab_rujukan)) { + echo json_encode(['status' => 'error', 'message' => 'Jawaban rujukan tidak boleh kosong']); + exit(); + } + + // Update rujukan internal + $data = [ + 'jawab_rujukan' => $jawab_rujukan + ]; + + $result = $this->db('mlite_rujukan_internal_poli') + ->where('no_rawat', $no_rawat) + ->save($data); + + if ($result) { + echo json_encode(['status' => 'success', 'message' => 'Rujukan internal berhasil diupdate']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal mengupdate rujukan internal']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + public function getJavascript() { header('Content-type: text/javascript'); @@ -1755,9 +3387,803 @@ public function getJavascript() if($cek_pegawai) { $cek_role = $this->core->getPegawaiInfo('nik', $this->core->getUserInfo('username', $_SESSION['mlite_user'])); } + $poliklinik = $this->db('poliklinik')->where('status', '1')->toArray(); + $dokter = $this->db('dokter')->where('status', '1')->toArray(); + $this->assign['poliklinik'] = $poliklinik; + $this->assign['dokter'] = $dokter; $this->assign['websocket'] = $this->settings->get('settings.websocket'); $this->assign['websocket_proxy'] = $this->settings->get('settings.websocket_proxy'); - echo $this->draw(MODULES.'/rawat_jalan/js/admin/rawat_jalan.js', ['cek_role' => $cek_role, 'mlite' => $this->assign]); + echo $this->draw(MODULES.'/rawat_jalan/js/admin/rawat_jalan.js', ['cek_role' => $cek_role, 'mlite' => htmlspecialchars_array($this->assign)]); + exit(); + } + + public function anyDataTb() + { + try { + // Add debugging + error_log('anyDataTb called with POST: ' . print_r($_POST, true)); + + // Validate POST data + if(empty($_POST['no_rawat'])) { + throw new \Exception('No rawat tidak ditemukan'); + } + + $no_rawat = $_POST['no_rawat']; + $no_rkm_medis = $_POST['no_rkm_medis'] ?? ''; + $nm_pasien = $_POST['nm_pasien'] ?? ''; + + // Get patient data from reg_periksa and pasien tables + $patient_data = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis') + ->where('reg_periksa.no_rawat', $no_rawat) + ->oneArray(); + + $tgl_lahir = ''; + $jk = ''; + $alamat = ''; + $no_tlp = ''; + $umur = ''; + + if($patient_data) { + $tgl_lahir = $patient_data['tgl_lahir'] ?? ''; + $jk = $patient_data['jk'] ?? ''; + $alamat = $patient_data['alamat'] ?? ''; + $no_tlp = $patient_data['no_tlp'] ?? ''; + + // Calculate age + if(!empty($patient_data['tgl_lahir'])) { + $birth_date = new \DateTime($patient_data['tgl_lahir']); + $current_date = new \DateTime(); + $age = $current_date->diff($birth_date)->y; + $umur = $age; + } + } + + try { + $data_tb = $this->db('data_tb')->where('no_rawat', $no_rawat)->oneArray(); + if(!$data_tb) { + $data_tb = $this->getDefaultDataTb($no_rawat); + } + } catch(\Exception $e) { + error_log('Error querying data_tb: ' . $e->getMessage()); + $data_tb = $this->getDefaultDataTb($no_rawat); + } + + // Add patient data to data_tb array for template access + $data_tb['tgl_lahir'] = $tgl_lahir; + $data_tb['jk'] = $jk; + $data_tb['alamat'] = $alamat; + $data_tb['no_tlp'] = $no_tlp; + $data_tb['umur'] = $umur; + + $html = $this->draw('form.data_tb.html', [ + 'data_tb' => $data_tb, + 'no_rawat' => $no_rawat, + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $nm_pasien + ]); + + error_log('anyDataTb HTML length: ' . strlen($html)); + echo $html; + + } catch(\Exception $e) { + error_log('anyDataTb error: ' . $e->getMessage()); + echo ''; + echo ''; + } + exit(); + } + + private function getDefaultDataTb($no_rawat) { + return [ + 'no_rawat' => $no_rawat, + 'id_tb_03' => '', + 'id_periode_laporan' => '', + 'tanggal_buat_laporan' => '', + 'tahun_buat_laporan' => date('Y'), + 'kd_wasor' => '', + 'noregkab' => '', + 'id_propinsi' => '', + 'kd_kabupaten' => '', + 'id_kecamatan' => '', + 'id_kelurahan' => '', + 'nama_rujukan' => '', + 'sebutkan1' => '', + 'tipe_diagnosis' => '', + 'klasifikasi_lokasi_anatomi' => '', + 'klasifikasi_riwayat_pengobatan' => '', + 'klasifikasi_status_hiv' => '', + 'total_skoring_anak' => '', + 'konfirmasiSkoring5' => '', + 'konfirmasiSkoring6' => '', + 'tanggal_mulai_pengobatan' => '', + 'paduan_oat' => '', + 'sumber_obat' => '', + 'sebutkan' => '', + 'sebelum_pengobatan_hasil_mikroskopis' => '', + 'sebelum_pengobatan_hasil_tes_cepat' => '', + 'sebelum_pengobatan_hasil_biakan' => '', + 'noreglab_bulan_2' => '', + 'hasil_mikroskopis_bulan_2' => '', + 'noreglab_bulan_3' => '', + 'hasil_mikroskopis_bulan_3' => '', + 'noreglab_bulan_5' => '', + 'hasil_mikroskopis_bulan_5' => '', + 'akhir_pengobatan_noreglab' => '', + 'akhir_pengobatan_hasil_mikroskopis' => '', + 'tanggal_hasil_akhir_pengobatan' => '', + 'hasil_akhir_pengobatan' => '', + 'tanggal_dianjurkan_tes' => '', + 'tanggal_tes_hiv' => '', + 'hasil_tes_hiv' => '', + 'ppk' => '', + 'art' => '', + 'tb_dm' => '', + 'terapi_dm' => '', + 'pindah_ro' => '', + 'status_pengobatan' => '', + 'foto_toraks' => '', + 'toraks_tdk_dilakukan' => '', + 'keterangan' => '', + 'kode_icd_x' => '', + // Additional fields found in template + 'tanggal_daftar' => '', + 'tanggal_mulai_berobat' => '', + 'tipe_diagnosis_tb' => '', + 'lokasi_anatomi' => '', + 'klasifikasi_tb' => '', + 'klasifikasi_kasus' => '', + 'sebutkan2' => '', + 'skoring_kontak_tb' => '', + 'skoring_uji_tuberkulin' => '', + 'skoring_status_gizi' => '', + 'skoring_demam_tanpa_sebab' => '', + 'skoring_batuk_kronik' => '', + 'skoring_pembesaran_kelenjar_limfe' => '', + 'skoring_pembengkakan_tulang_sendi' => '', + 'skoring_foto_toraks' => '', + 'skoring_total_skor' => '' + ]; + } + + public function postDataTbSave() + { + try { + // Validasi input + if(empty($_POST['no_rawat'])) { + echo json_encode(['status' => 'error', 'message' => 'No rawat tidak boleh kosong']); + exit(); + } + + // Cek apakah data sudah ada + $existing = $this->db('data_tb')->where('no_rawat', $_POST['no_rawat'])->oneArray(); + + // Siapkan data untuk disimpan + $data = [ + 'no_rawat' => htmlspecialchars($_POST['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'id_tb_03' => isset($_POST['id_tb_03']) ? $_POST['id_tb_03'] : null, + 'id_periode_laporan' => isset($_POST['id_periode_laporan']) ? $_POST['id_periode_laporan'] : null, + 'tanggal_buat_laporan' => isset($_POST['tanggal_buat_laporan']) && !empty($_POST['tanggal_buat_laporan']) ? $_POST['tanggal_buat_laporan'] : null, + 'tahun_buat_laporan' => isset($_POST['tahun_buat_laporan']) && !empty($_POST['tahun_buat_laporan']) ? (int)$_POST['tahun_buat_laporan'] : null, + 'kd_wasor' => isset($_POST['kd_wasor']) && !empty($_POST['kd_wasor']) ? (int)$_POST['kd_wasor'] : null, + 'noregkab' => isset($_POST['noregkab']) && !empty($_POST['noregkab']) ? (int)$_POST['noregkab'] : null, + 'id_propinsi' => isset($_POST['id_propinsi']) ? $_POST['id_propinsi'] : null, + 'kd_kabupaten' => isset($_POST['kd_kabupaten']) ? $_POST['kd_kabupaten'] : null, + 'id_kecamatan' => isset($_POST['id_kecamatan']) ? $_POST['id_kecamatan'] : null, + 'id_kelurahan' => isset($_POST['id_kelurahan']) ? $_POST['id_kelurahan'] : null, + 'nama_rujukan' => isset($_POST['nama_rujukan']) ? $_POST['nama_rujukan'] : null, + 'sebutkan1' => isset($_POST['sebutkan1']) ? $_POST['sebutkan1'] : null, + 'tipe_diagnosis' => isset($_POST['tipe_diagnosis']) ? $_POST['tipe_diagnosis'] : null, + 'klasifikasi_lokasi_anatomi' => isset($_POST['klasifikasi_lokasi_anatomi']) ? $_POST['klasifikasi_lokasi_anatomi'] : null, + 'klasifikasi_riwayat_pengobatan' => isset($_POST['klasifikasi_riwayat_pengobatan']) ? $_POST['klasifikasi_riwayat_pengobatan'] : null, + 'klasifikasi_status_hiv' => isset($_POST['klasifikasi_status_hiv']) ? $_POST['klasifikasi_status_hiv'] : null, + 'total_skoring_anak' => isset($_POST['total_skoring_anak']) ? $_POST['total_skoring_anak'] : null, + 'konfirmasiSkoring5' => isset($_POST['konfirmasiSkoring5']) ? $_POST['konfirmasiSkoring5'] : null, + 'konfirmasiSkoring6' => isset($_POST['konfirmasiSkoring6']) ? $_POST['konfirmasiSkoring6'] : null, + 'tanggal_mulai_pengobatan' => isset($_POST['tanggal_mulai_pengobatan']) && !empty($_POST['tanggal_mulai_pengobatan']) ? $_POST['tanggal_mulai_pengobatan'] : null, + 'paduan_oat' => isset($_POST['paduan_oat']) ? $_POST['paduan_oat'] : null, + 'sumber_obat' => isset($_POST['sumber_obat']) ? $_POST['sumber_obat'] : null, + 'sebutkan' => isset($_POST['sebutkan']) ? $_POST['sebutkan'] : null, + 'sebelum_pengobatan_hasil_mikroskopis' => isset($_POST['sebelum_pengobatan_hasil_mikroskopis']) ? $_POST['sebelum_pengobatan_hasil_mikroskopis'] : null, + 'sebelum_pengobatan_hasil_tes_cepat' => isset($_POST['sebelum_pengobatan_hasil_tes_cepat']) ? $_POST['sebelum_pengobatan_hasil_tes_cepat'] : null, + 'sebelum_pengobatan_hasil_biakan' => isset($_POST['sebelum_pengobatan_hasil_biakan']) ? $_POST['sebelum_pengobatan_hasil_biakan'] : null, + 'noreglab_bulan_2' => isset($_POST['noreglab_bulan_2']) ? $_POST['noreglab_bulan_2'] : null, + 'hasil_mikroskopis_bulan_2' => isset($_POST['hasil_mikroskopis_bulan_2']) ? $_POST['hasil_mikroskopis_bulan_2'] : null, + 'noreglab_bulan_3' => isset($_POST['noreglab_bulan_3']) ? $_POST['noreglab_bulan_3'] : null, + 'hasil_mikroskopis_bulan_3' => isset($_POST['hasil_mikroskopis_bulan_3']) ? $_POST['hasil_mikroskopis_bulan_3'] : null, + 'noreglab_bulan_5' => isset($_POST['noreglab_bulan_5']) ? $_POST['noreglab_bulan_5'] : null, + 'hasil_mikroskopis_bulan_5' => isset($_POST['hasil_mikroskopis_bulan_5']) ? $_POST['hasil_mikroskopis_bulan_5'] : null, + 'akhir_pengobatan_noreglab' => isset($_POST['akhir_pengobatan_noreglab']) ? $_POST['akhir_pengobatan_noreglab'] : null, + 'akhir_pengobatan_hasil_mikroskopis' => isset($_POST['akhir_pengobatan_hasil_mikroskopis']) ? $_POST['akhir_pengobatan_hasil_mikroskopis'] : null, + 'tanggal_hasil_akhir_pengobatan' => isset($_POST['tanggal_hasil_akhir_pengobatan']) && !empty($_POST['tanggal_hasil_akhir_pengobatan']) ? $_POST['tanggal_hasil_akhir_pengobatan'] : null, + 'hasil_akhir_pengobatan' => isset($_POST['hasil_akhir_pengobatan']) ? $_POST['hasil_akhir_pengobatan'] : null, + 'tanggal_dianjurkan_tes' => isset($_POST['tanggal_dianjurkan_tes']) && !empty($_POST['tanggal_dianjurkan_tes']) ? $_POST['tanggal_dianjurkan_tes'] : null, + 'tanggal_tes_hiv' => isset($_POST['tanggal_tes_hiv']) && !empty($_POST['tanggal_tes_hiv']) ? $_POST['tanggal_tes_hiv'] : null, + 'hasil_tes_hiv' => isset($_POST['hasil_tes_hiv']) ? $_POST['hasil_tes_hiv'] : null, + 'ppk' => isset($_POST['ppk']) ? $_POST['ppk'] : null, + 'art' => isset($_POST['art']) ? $_POST['art'] : null, + 'tb_dm' => isset($_POST['tb_dm']) ? $_POST['tb_dm'] : null, + 'terapi_dm' => isset($_POST['terapi_dm']) ? $_POST['terapi_dm'] : null, + 'pindah_ro' => isset($_POST['pindah_ro']) ? $_POST['pindah_ro'] : null, + 'status_pengobatan' => isset($_POST['status_pengobatan']) ? $_POST['status_pengobatan'] : null, + 'foto_toraks' => isset($_POST['foto_toraks']) ? $_POST['foto_toraks'] : null, + 'toraks_tdk_dilakukan' => isset($_POST['toraks_tdk_dilakukan']) ? $_POST['toraks_tdk_dilakukan'] : null, + 'keterangan' => isset($_POST['keterangan']) ? $_POST['keterangan'] : null, + 'kode_icd_x' => isset($_POST['kode_icd_x']) ? $_POST['kode_icd_x'] : null + ]; + + if($existing) { + // Update data yang sudah ada + $query = $this->db('data_tb') + ->where('no_rawat', $_POST['no_rawat']) + ->save($data); + } else { + // Insert data baru + $query = $this->db('data_tb')->save($data); + } + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data TB berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data TB']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function getDataTbView($no_rawat) + { + $no_rawat = revertNorawat($no_rawat); + $data_tb = $this->db('data_tb') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if(!$data_tb) { + echo json_encode(['status' => 'error', 'message' => 'Data TB tidak ditemukan']); + exit(); + } + + // Format tanggal untuk tampilan + if($data_tb['tanggal_buat_laporan']) { + $data_tb['tanggal_buat_laporan_formatted'] = date('d/m/Y H:i', strtotime($data_tb['tanggal_buat_laporan'])); + } + if($data_tb['tanggal_mulai_pengobatan']) { + $data_tb['tanggal_mulai_pengobatan_formatted'] = date('d/m/Y', strtotime($data_tb['tanggal_mulai_pengobatan'])); + } + if($data_tb['tanggal_hasil_akhir_pengobatan']) { + $data_tb['tanggal_hasil_akhir_pengobatan_formatted'] = date('d/m/Y', strtotime($data_tb['tanggal_hasil_akhir_pengobatan'])); + } + if($data_tb['tanggal_dianjurkan_tes']) { + $data_tb['tanggal_dianjurkan_tes_formatted'] = date('d/m/Y', strtotime($data_tb['tanggal_dianjurkan_tes'])); + } + if($data_tb['tanggal_tes_hiv']) { + $data_tb['tanggal_tes_hiv_formatted'] = date('d/m/Y', strtotime($data_tb['tanggal_tes_hiv'])); + } + + echo $this->draw('view.data_tb.html', ['data_tb' => htmlspecialchars_array($data_tb)]); + exit(); + } + + public function postDataTbHapus() + { + try { + if(empty($_POST['no_rawat'])) { + echo json_encode(['status' => 'error', 'message' => 'No rawat tidak boleh kosong']); + exit(); + } + + $query = $this->db('data_tb') + ->where('no_rawat', $_POST['no_rawat']) + ->delete(); + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data TB berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus data TB atau data tidak ditemukan']); + } + } catch(\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); + } + + public function apiSaveDiagnosa() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_penyakit' => $input['kd_penyakit'], + 'status' => $input['status'] ?? 'Ralan', + 'prioritas' => $input['prioritas'], + 'status_penyakit' => 'Baru' + ]; + + try { + $this->db('diagnosa_pasien')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteDiagnosa() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('diagnosa_pasien') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_penyakit', $input['kd_penyakit']) + ->where('prioritas', $input['prioritas']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveProsedur() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kode' => $input['kode'], + 'status' => $input['status'] ?? 'Ralan', + 'prioritas' => $input['prioritas'] + ]; + + try { + $this->db('prosedur_pasien')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteProsedur() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('prosedur_pasien') + ->where('no_rawat', $input['no_rawat']) + ->where('kode', $input['kode']) + ->where('prioritas', $input['prioritas']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveCatatan() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $input['no_rawat']); + + $data = [ + 'tanggal' => date('Y-m-d'), + 'jam' => date('H:i:s'), + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $kd_dokter, + 'catatan' => $input['catatan'] + ]; + + try { + $this->db('catatan_perawatan')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteCatatan() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('catatan_perawatan') + ->where('no_rawat', $input['no_rawat']) + ->where('tanggal', $input['tanggal']) + ->where('jam', $input['jam']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveBerkas() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kode' => $input['judul'] ?? '', + 'lokasi_file' => $input['deskripsi'] ?? '' + ]; + + try { + $this->db('berkas_digital_perawatan')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteBerkas() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('berkas_digital_perawatan') + ->where('no_rawat', $input['no_rawat']) + ->where('kode', $input['judul'] ?? $input['kode']) + ->where('lokasi_file', $input['deskripsi'] ?? $input['lokasi_file']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveResume() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $input['no_rawat']); + + // Check if exists + $exists = $this->db('resume_pasien')->where('no_rawat', $input['no_rawat'])->oneArray(); + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_dokter' => $kd_dokter, + 'diagnosa_utama' => $input['diagnosa_utama'] ?? '', + 'diagnosa_sekunder' => $input['diagnosa_sekunder'] ?? '', + 'jalannya_penyakit' => $input['jalannya_penyakit'] ?? '', + 'obat_pulang' => $input['terapi'] ?? '', + 'kondisi_pulang' => $input['kondisi_pulang'] ?? 'Hidup', + // Default required fields + 'keluhan_utama' => '', + 'pemeriksaan_penunjang' => '', + 'hasil_laborat' => '', + 'kd_diagnosa_utama' => '', + 'kd_diagnosa_sekunder' => '', + 'diagnosa_sekunder2' => '', + 'kd_diagnosa_sekunder2' => '', + 'diagnosa_sekunder3' => '', + 'kd_diagnosa_sekunder3' => '', + 'diagnosa_sekunder4' => '', + 'kd_diagnosa_sekunder4' => '', + 'prosedur_utama' => '', + 'kd_prosedur_utama' => '', + 'prosedur_sekunder' => '', + 'kd_prosedur_sekunder' => '', + 'prosedur_sekunder2' => '', + 'kd_prosedur_sekunder2' => '', + 'prosedur_sekunder3' => '', + 'kd_prosedur_sekunder3' => '' + ]; + + try { + if ($exists) { + $this->db('resume_pasien')->where('no_rawat', $input['no_rawat'])->save($data); + } else { + $this->db('resume_pasien')->save($data); + } + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteResume() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + if (!isset($input['no_rawat']) || !isset($input['kd_dokter'])) { + return ['status' => 'error', 'message' => 'Missing required parameters: no_rawat or kd_dokter']; + } + + $this->db('resume_pasien') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_dokter', $input['kd_dokter']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveRujukanInternal() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'kd_poli' => $input['kd_poli'], + 'kd_dokter' => $input['kd_dokter'], + 'isi_rujukan' => $input['catatan'] ?? '' + ]; + + try { + $this->db('mlite_rujukan_internal_poli')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteRujukanInternal() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $this->db('mlite_rujukan_internal_poli') + ->where('no_rawat', $input['no_rawat']) + ->where('kd_poli', $input['kd_poli']) + ->where('kd_dokter', $input['kd_dokter']) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveLaporanOperasi() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_create', 'rawat_jalan')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $data = [ + 'no_rawat' => $input['no_rawat'], + 'tanggal' => $input['tanggal'] . ' ' . $input['jam'], + 'operator' => $input['operator'], + 'laporan_operasi' => $input['laporan'] ?? '', + // Defaults + 'operator2' => '-', 'operator3' => '-', 'asisten_operator1' => '-', 'asisten_operator2' => '-', 'asisten_operator3' => '-', + 'instrumen' => '-', 'dokter_anak' => '-', 'perawat_resusitas' => '-', 'dokter_anestesi' => '-', 'asisten_anestesi' => '-', + 'bidan' => '-', 'perawat_luar' => '-', 'omloop' => '-', 'omloop2' => '-', 'omloop3' => '-', 'omloop4' => '-', 'omloop5' => '-' + ]; + + try { + $this->db('laporan_operasi')->save($data); + return ['status' => 'success', 'data' => $data]; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiDeleteLaporanOperasi() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_delete', 'rawat_inap')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + $tanggal = $input['tanggal']; + if(isset($input['jam'])) { + $tanggal .= ' ' . $input['jam']; + } + + $this->db('laporan_operasi') + ->where('no_rawat', $input['no_rawat']) + ->where('tanggal', $tanggal) + ->delete(); + return ['status' => 'success']; + } catch (\PDOException $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + // ADIME Gizi Methods + public function postSaveadimegizi() + { + $data = [ + 'no_rawat' => $_POST['no_rawat'], + 'tanggal' => $_POST['tanggal'], + 'asesmen' => $_POST['asesmen'] ?? null, + 'diagnosis' => $_POST['diagnosis'] ?? null, + 'intervensi' => $_POST['intervensi'] ?? null, + 'monitoring' => $_POST['monitoring'] ?? null, + 'evaluasi' => $_POST['evaluasi'] ?? null, + 'instruksi' => $_POST['instruksi'] ?? null, + 'nip' => $this->core->getUserInfo('username', null, true) + ]; + + // Cek apakah sudah ada data dengan no_rawat dan tanggal yang sama + $existing = $this->db('catatan_adime_gizi') + ->where('no_rawat', $data['no_rawat']) + ->where('tanggal', $data['tanggal']) + ->oneArray(); + + try { + if($existing) { + // Update data yang sudah ada + $query = $this->db('catatan_adime_gizi') + ->where('no_rawat', $data['no_rawat']) + ->where('tanggal', $data['tanggal']) + ->save($data); + } else { + // Insert data baru + $query = $this->db('catatan_adime_gizi')->save($data); + } + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data ADIME Gizi berhasil disimpan']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menyimpan data ADIME Gizi']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + + exit(); + } + + public function postGetadimegizi() + { + $no_rawat = $_POST['no_rawat']; + + try { + $data = $this->db('catatan_adime_gizi') + ->join('petugas', 'petugas.nip=catatan_adime_gizi.nip') + ->select([ + 'catatan_adime_gizi.no_rawat', + 'catatan_adime_gizi.tanggal', + 'catatan_adime_gizi.asesmen', + 'catatan_adime_gizi.diagnosis', + 'catatan_adime_gizi.intervensi', + 'catatan_adime_gizi.monitoring', + 'catatan_adime_gizi.evaluasi', + 'catatan_adime_gizi.instruksi', + 'petugas.nama as nama_petugas' + ]) + ->where('catatan_adime_gizi.no_rawat', $no_rawat) + ->desc('catatan_adime_gizi.tanggal') + ->toArray(); + + echo json_encode(htmlspecialchars_array($data)); + } catch (\Exception $e) { + echo json_encode([]); + } + + exit(); + } + + public function postGetadimegizidetail() + { + $no_rawat = $_POST['no_rawat']; + $tanggal = $_POST['tanggal']; + + try { + $data = $this->db('catatan_adime_gizi') + ->where('no_rawat', $no_rawat) + ->where('tanggal', $tanggal) + ->oneArray(); + + echo json_encode(htmlspecialchars_array($data)); + } catch (\Exception $e) { + echo json_encode(null); + } + + exit(); + } + + public function postDeleteadimegizi() + { + $no_rawat = $_POST['no_rawat']; + $tanggal = $_POST['tanggal']; + + try { + $query = $this->db('catatan_adime_gizi') + ->where('no_rawat', $no_rawat) + ->where('tanggal', $tanggal) + ->delete(); + + if($query) { + echo json_encode(['status' => 'success', 'message' => 'Data ADIME Gizi berhasil dihapus']); + } else { + echo json_encode(['status' => 'error', 'message' => 'Gagal menghapus data ADIME Gizi']); + } + } catch (\Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]); + } + exit(); } diff --git a/plugins/rawat_jalan/Help.md b/plugins/rawat_jalan/Help.md deleted file mode 100644 index 1169cd41f..000000000 --- a/plugins/rawat_jalan/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
                  - -
                  diff --git a/plugins/rawat_jalan/Info.php b/plugins/rawat_jalan/Info.php index ee00ef106..80925f688 100644 --- a/plugins/rawat_jalan/Info.php +++ b/plugins/rawat_jalan/Info.php @@ -4,8 +4,9 @@ 'name' => 'Rawat Jalan', 'description' => 'Modul pendaftaran layanan untuk mLITE', 'author' => 'Basoro', + 'category' => 'layanan', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'wheelchair', 'install' => function () use ($core) { }, diff --git a/plugins/rawat_jalan/README.md b/plugins/rawat_jalan/README.md new file mode 100644 index 000000000..87b330134 --- /dev/null +++ b/plugins/rawat_jalan/README.md @@ -0,0 +1,79 @@ +# Plugin Rawat Jalan + +Modul pendaftaran dan pengelolaan layanan rawat jalan di mLITE, mencakup registrasi pasien, booking, jadwal dokter, input tindakan dan obat, hingga integrasi BPJS. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Rawat Jalan**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Rawat Jalan + - Booking Registrasi + - Booking Periksa + - Jadwal Dokter + +## Panduan Pengguna (Petugas) + +1. **Kelola (Dashboard)** + - Halaman utama Rawat Jalan sebagai titik masuk modul. + +2. **Rawat Jalan** + - Tampil daftar kunjungan rawat jalan hari ini (default), dapat difilter berdasarkan rentang tanggal. + - Filter berdasarkan status periksa: **Belum**, **Selesai**, atau **Lunas**. + - Tampilan dibatasi sesuai poliklinik yang menjadi wewenang akun pengguna (kecuali admin atau centang "Semua Poli"). + - **Mendaftarkan Pasien Baru**: + - Pilih pasien (no rekam medis), poliklinik, dokter, penjamin, dan tanggal. + - Sistem otomatis mengisi no rawat, no urut antrian, biaya registrasi, dan umur pasien. + - Jika tanggal lebih dari hari ini, registrasi dicatat sebagai **booking** (`booking_registrasi`). + - **Input Tindakan**: + - Pilih jenis perawatan, provider (dokter/petugas/dokter+petugas), tanggal, jam, dan jumlah. + - Sistem menyimpan ke tabel `rawat_jl_dr`, `rawat_jl_pr`, atau `rawat_jl_drpr` sesuai provider. + - **Input Obat**: + - Pilih obat, isi jumlah dan aturan pakai. + - Sistem membuat atau menggabungkan resep harian ke tabel `resep_obat` dan `resep_dokter`. + - **Input Racikan**: + - Isi nama racikan, komposisi obat, kandungan, jumlah, dan aturan pakai. + - Data tersimpan di `resep_dokter_racikan` dan `resep_dokter_racikan_detail`. + - **Rujukan Internal**: Aktifkan filter rujukan internal untuk menampilkan pasien yang dirujuk antar poli. + - **Dokumen Pendukung**: Buat surat rujukan, surat sakit, surat sehat, dan persetujuan umum dari halaman detail pasien. + +3. **Booking Registrasi** + - Lihat daftar booking pendaftaran yang belum diproses. + - Ubah status booking menjadi **Terdaftar** untuk mengkonversinya menjadi `reg_periksa` resmi pada hari pemeriksaan. + +4. **Booking Periksa** + - Kelola jadwal booking pemeriksaan pasien yang telah dikonfirmasi. + +5. **Jadwal Dokter** + - Lihat dan kelola jadwal praktik dokter per poliklinik. + - Jadwal bersumber dari tabel `jadwal` yang dikelola di modul Master. + +## Panduan Admin + +1. **Pengaturan Poliklinik dan Dokter** + - Kelola data poliklinik (termasuk biaya registrasi) dan dokter di modul **Master**. + - Pastikan status poliklinik dan dokter aktif (`status = 1`) agar tampil di form pendaftaran. + +2. **Pengaturan IGD** + - Di menu **Settings → Umum**, atur kode poliklinik IGD (`igd`) agar pasien IGD tidak tercampur di daftar rawat jalan biasa. + +3. **Pengaturan Antrian per Dokter** + - Aktifkan opsi `dokter_ralan_per_dokter` di Settings agar nomor urut antrian dihitung per dokter (bukan per poliklinik). + +4. **Hak Akses Poliklinik** + - Atur `cap` (capability) akun petugas dengan kode poliklinik yang menjadi wewenangnya (dipisah koma). + - Admin dapat melihat semua poliklinik; petugas hanya melihat poliklinik sesuai `cap`-nya. + +5. **Integrasi vClaim BPJS** + - Jika modul `vclaim` aktif, tombol pengajuan SEP muncul di daftar pasien. + - Nomor SEP dari bridging ditampilkan di kolom SEP. + +6. **Berkas Digital** + - Berkas digital pasien (persetujuan, form, dll.) diunggah ke `webapps/berkasrawat/pages/upload/`. + +## Catatan + +- Registrasi untuk tanggal yang akan datang otomatis masuk ke `booking_registrasi`; registrasi hari ini langsung ke `reg_periksa`. +- No rawat dihasilkan otomatis dengan format `YYYY/MM/DD/XXXXX`. +- Sistem mencoba kembali hingga 5 kali jika terjadi konflik no rawat (duplicate key) saat pendaftaran bersamaan. diff --git a/plugins/rawat_jalan/js/admin/rawat_jalan.js b/plugins/rawat_jalan/js/admin/rawat_jalan.js index 6ac9cc205..ed6fdb8fe 100644 --- a/plugins/rawat_jalan/js/admin/rawat_jalan.js +++ b/plugins/rawat_jalan/js/admin/rawat_jalan.js @@ -9,6 +9,20 @@ $('#provider').hide(); $('#aturan_pakai').hide(); $("#form_kontrol").hide(); +// Inisialisasi jam_rawat saat halaman dibuka +$(function(){ + var baseURL = mlite.url + '/' + mlite.admin; + var $jr = $('input:text[name=jam_rawat]').last(); + if ($jr.length) { + $jr.focus(); + if (!$jr.val()) { + $.post(baseURL + '/rawat_jalan/cekwaktu?t=' + mlite.token, {}, function(data){ + $jr.val(data); + }); + } + } +}); + // tombol buka form diklik $("#index").on('click', '#bukaform', function(){ var baseURL = mlite.url + '/' + mlite.admin; @@ -40,7 +54,9 @@ $("#form").on("click","#no_rawat", function(event){ var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); var url = baseURL + '/rawat_jalan/maxid?t=' + mlite.token; + var tgl_registrasi = $('#tgl_registrasi').val(); $.post(url, { + tgl_registrasi: tgl_registrasi } ,function(data) { $("#no_rawat").val(data); }); @@ -50,12 +66,14 @@ $("#form").on("click","#no_reg", function(event){ var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); var url = baseURL + '/rawat_jalan/maxantrian?t=' + mlite.token; + var tgl_registrasi = $('#tgl_registrasi').val(); var kd_poli = $('select[name=kd_poli]').val(); var kd_dokter = $('select[name=kd_dokter]').val(); $.post(url, { kd_poli: kd_poli, - kd_dokter: kd_dokter + kd_dokter: kd_dokter, + tgl_registrasi: tgl_registrasi } ,function(data) { if(data == '888888') { alert('Kuota pendaftaran sudah terpenuhi.\nSilahkan pilih tanggal lain atau pilih dokter lain.'); @@ -160,6 +178,7 @@ $("#display").on("click",".riwayat_perawatan", function(event){ // ketika baris data diklik $("#display").on("click", ".edit", function(event){ + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_update', 'rawat_jalan') == true} var baseURL = mlite.url + '/' + mlite.admin; event.preventDefault(); var url = baseURL + '/rawat_jalan/form?t=' + mlite.token; @@ -175,6 +194,7 @@ $("#display").on("click", ".edit", function(event){ $('input:hidden[name=stts_daftar]').val(get_stts_daftar); }); }); + {/if} }); // ketika tombol hapus ditekan @@ -230,6 +250,7 @@ $("#display").on("click", ".sep", function(event){ $('#no_kartu_peserta').text(json_obj[0].response.peserta.noKartu); $('#no_mr_peserta').text(no_rkm_medis); $('#nik_peserta').text(json_obj[0].response.peserta.nik); + $('#prov_umum_peserta').text(json_obj[0].response.peserta.provUmum.nmProvider); $('#tgl_lahir_peserta').text(json_obj[0].response.peserta.tglLahir); $('#status_peserta').text(json_obj[0].response.peserta.statusPeserta.keterangan); $('#jenis_peserta').text(json_obj[0].response.peserta.jenisPeserta.keterangan); @@ -434,8 +455,8 @@ $("#form_soap").on("click", "#simpan_soap", function(event){ event.preventDefault(); var no_rawat = $('input:text[name=no_rawat]').val(); - var tgl_perawatan = $('input:text[name=tgl_perawatan]').val(); - var jam_rawat = $('input:text[name=jam_rawat]').val(); + var tgl_perawatan = $('#soap_tgl_perawatan').val(); + var jam_rawat = $('#soap_jam_rawat').val(); var suhu_tubuh = $('input:text[name=suhu_tubuh]').val(); var tensi = $('input:text[name=tensi]').val(); var nadi = $('input:text[name=nadi]').val(); @@ -829,6 +850,7 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ var aturan_pakai = $('input:text[name=aturan_pakai]').val(); var kat = $('input:hidden[name=kat]').val(); var jml = $('input:text[name=jml]').val(); + var jml_tindakan = $('input:text[name=jml_tindakan]').val(); var url = baseURL + '/rawat_jalan/savedetail?t=' + mlite.token; $.post(url, {no_rawat : no_rawat, @@ -841,7 +863,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ biaya : biaya, aturan_pakai : aturan_pakai, kat : kat, - jml : jml + jml : jml, + jml_tindakan : jml_tindakan }, function(data) { // tampilkan data @@ -852,6 +875,11 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ // tampilkan data $("#rincian").html(data).show(); }); + $.post(baseURL + '/rawat_jalan/cekwaktu?t=' + mlite.token, { + } ,function(data) { + $("#form_rincian #rincian_jam_reg").val(data); + $('input:text[name=jam_rawat]').last().val(data).focus(); + }); $('input:hidden[name=kd_jenis_prw]').val(""); $('input:text[name=nm_perawatan]').val(""); $('input:hidden[name=kat]').val(""); @@ -860,6 +888,8 @@ $("#form_rincian").on("click", "#simpan_rincian", function(event){ $('input:text[name=nama_provider2]').val(""); $('input:text[name=kode_provider]').val(""); $('input:text[name=kode_provider2]').val(""); + $('input:text[name=jam_rawat]').last().val(""); + $('input:text[name=jml_tindakan]').val(""); $('#notif').html("
                  "+ "Data pasien telah disimpan!"+ ""+ @@ -1127,12 +1157,231 @@ $("#form_soap").on("click","#odontogram", function(event){ return false; }); +$("#form_soap").on("click",".assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $('input:text[name=no_rawat]').val(); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_jalan/assessment/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment yang sudah ada + $('.tampildata_assessment').load(baseURL + '/rawat_jalan/assessmenttampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Handler untuk assessment di display juga +$("#display").on("click",".assesment", function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + + var modal = $('#assesmentModal'); + var modalContent = $('#assesmentModal .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + // Load form assessment dengan data pasien + var set_no_rawat = no_rawat.replace(/\//g, ''); + modalContent.load(baseURL + '/rawat_jalan/assessment/' + set_no_rawat + '?t=' + mlite.token, function() { + // Load data assessment yang sudah ada + $('.tampildata_assessment').load(baseURL + '/rawat_jalan/assessmenttampil/' + set_no_rawat + '?t=' + mlite.token); + }); + }).modal(); + return false; +}); + +// Event delegation untuk rujuk internal - bekerja untuk elemen dinamis +$(document).on('click', 'a[href="#rujuk_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var url = baseURL + '/rawat_jalan/rujukaninternal?t=' + mlite.token; + var url_get = baseURL + '/rawat_jalan/getrujukaninternal?t=' + mlite.token; + + $.post(url_get, {no_rawat: no_rawat}, function(data) { + var rujukan = JSON.parse(data); + var kd_poli_val = ''; + var kd_dokter_val = ''; + var isi_rujukan_val = ''; + var jawab_rujukan_val = ''; + var disabled_attr = ''; + + if(rujukan) { + kd_poli_val = rujukan.kd_poli; + kd_dokter_val = rujukan.kd_dokter; + isi_rujukan_val = rujukan.isi_rujukan; + jawab_rujukan_val = rujukan.jawab_rujukan; + disabled_attr = ' disabled'; + } + + var rujuk_internal = '' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + ''; + + // tampilkan dialog konfirmasi + bootbox.dialog({ + message: rujuk_internal, + title: 'Rujuk Internal', + buttons: { + main: { + label: 'Simpan', + className: 'btn-primary', + callback() { + var kd_poli = $('#kd_poli').val(); + var kd_dokter = $('#kd_dokter').val(); + var isi_rujukan = $('#isi_rujukan').val(); + var jawab_rujukan = $('#jawab_rujukan').val(); + $.post(url, { + no_rawat: no_rawat, + kd_poli: kd_poli, + kd_dokter: kd_dokter, + isi_rujukan: isi_rujukan, + jawab_rujukan: jawab_rujukan, + } ,function(data) { + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah simpan + $("#display").load(baseURL + '/rawat_jalan/display?t=' + mlite.token); + }); + } + } + } + }); + + // Set values for selects if they exist + if(kd_poli_val) { + $('#kd_poli').val(kd_poli_val); + } + if(kd_dokter_val) { + $('#kd_dokter').val(kd_dokter_val); + } + + $('select').not(':disabled').selectator(); + }); + + event.stopPropagation(); + return false; +}); + +// Event delegation untuk edit rujukan internal +$(document).on('click', 'a[href="#jawab_rujukan_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var dokter_tujuan = $(this).attr("data-dokter_tujuan"); + var poli_tujuan = $(this).attr("data-poli_tujuan"); + var keterangan = $(this).attr("data-keterangan"); + var keterangan_jawab = $(this).attr("data-keterangan_jawab"); + var url = baseURL + '/rawat_jalan/editrujukaninternal?t=' + mlite.token; + var edit_rujukan_internal = '' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + '
                  ' + + '' + + '' + + '
                  ' + + ''; + + // tampilkan dialog konfirmasi + bootbox.dialog({ + message: edit_rujukan_internal, + title: 'Jawab Rujukan Internal', + buttons: { + main: { + label: 'Update', + className: 'btn-primary', + callback() { + var jawab_rujukan = $('#jawab_rujukan').val(); + $.post(url, { + no_rawat: no_rawat, + jawab_rujukan: jawab_rujukan, + } ,function(data) { + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah update + $("#display").load(baseURL + '/rawat_jalan/display?t=' + mlite.token); + }); + } + } + } + }); + $('select').selectator(); + event.stopPropagation(); + return false; +}); + +// Event delegation untuk hapus rujukan internal +$(document).on('click', 'a[href="#hapus_rujukan_internal"]', function(event){ + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var no_rawat = $(this).attr("data-no_rawat"); + var url = baseURL + '/rawat_jalan/hapusrujukaninternal?t=' + mlite.token; + + // tampilkan dialog konfirmasi + bootbox.confirm("Apakah Anda yakin ingin menghapus rujukan internal ini?", function(result){ + if (result){ + $.post(url, { + no_rawat: no_rawat + } ,function(data) { + // console.log(data); + var data = JSON.parse(data); + alert(data.message); + // Reload display setelah hapus + $("#display").load(baseURL + '/rawat_jalan/display?t=' + mlite.token); + }); + } + }); + event.stopPropagation(); + return false; +}); + {if: $mlite.websocket == 'ya'} {if: $mlite.websocket_proxy != ''} var URL_WEBSOCKET = "{$mlite.websocket_proxy}"; {else} - var URL_WEBSOCKET = "ws://:3892"; + var URL_WEBSOCKET = "wss://:3892"; {/if} var ws = new WebSocket(URL_WEBSOCKET); diff --git a/plugins/rawat_jalan/view/admin/antrian.html b/plugins/rawat_jalan/view/admin/antrian.html index caad45bbf..1b996868a 100644 --- a/plugins/rawat_jalan/view/admin/antrian.html +++ b/plugins/rawat_jalan/view/admin/antrian.html @@ -37,13 +37,13 @@
                  - + @@ -57,39 +57,39 @@ diff --git a/plugins/rawat_jalan/view/admin/assesment.html b/plugins/rawat_jalan/view/admin/assesment.html new file mode 100644 index 000000000..474becb8c --- /dev/null +++ b/plugins/rawat_jalan/view/admin/assesment.html @@ -0,0 +1,742 @@ + + + + + + diff --git a/plugins/rawat_jalan/view/admin/assesment.tampil.html b/plugins/rawat_jalan/view/admin/assesment.tampil.html new file mode 100644 index 000000000..544a7bdaf --- /dev/null +++ b/plugins/rawat_jalan/view/admin/assesment.tampil.html @@ -0,0 +1,107 @@ +
                  {$settings.nama_instansi} {?=isset_or($settings.nama_instansi)?}
                  -
                  {$settings.alamat}
                  - {$settings.nomor_telepon} - {$settings.email} +
                  {?=isset_or($settings.alamat)?}
                  + {?=isset_or($settings.nomor_telepon)?} - {?=isset_or($settings.email)?}
                  - {$rawat_jalan.no_reg} + {?=isset_or($rawat_jalan.no_reg)?}
                  - ID Daftar{$rawat_jalan.no_rawat} + ID Daftar{?=isset_or($rawat_jalan.no_rawat)?}
                  - Nama{$rawat_jalan.nm_pasien} + Nama{?=isset_or($rawat_jalan.nm_pasien)?}
                  - Nomor RM{$rawat_jalan.no_rkm_medis} + Nomor RM{?=isset_or($rawat_jalan.no_rkm_medis)?}
                  - Poliklinik{$rawat_jalan.nm_poli} + Poliklinik{?=isset_or($rawat_jalan.nm_poli)?}
                  - Dokter{$rawat_jalan.nm_dokter} + Dokter{?=isset_or($rawat_jalan.nm_dokter)?}
                  - Penjamin{$rawat_jalan.png_jawab} + Penjamin{?=isset_or($rawat_jalan.png_jawab)?}
                  + + + + + + + + + + + + + + + {if: $penilaian_awal_keperawatan_ralan} + + + + + + + + + + + + {else} + + + + {/if} + +
                  Nomor RawatTanggalInformasiKeluhan UtamaVital SignsStatus PsikoNyeriPetugasAksi
                  {?=isset_or($penilaian_awal_keperawatan_ralan.no_rawat)?}{?=isset_or($penilaian_awal_keperawatan_ralan.tanggal)?}{?=isset_or($penilaian_awal_keperawatan_ralan.informasi)?}{?=isset_or($penilaian_awal_keperawatan_ralan.keluhan_utama)?} + TD: {?=isset_or($penilaian_awal_keperawatan_ralan.td)?}
                  + Nadi: {?=isset_or($penilaian_awal_keperawatan_ralan.nadi)?}
                  + RR: {?=isset_or($penilaian_awal_keperawatan_ralan.rr)?}
                  + Suhu: {?=isset_or($penilaian_awal_keperawatan_ralan.suhu)?}
                  + GCS: {?=isset_or($penilaian_awal_keperawatan_ralan.gcs)?} +
                  {?=isset_or($penilaian_awal_keperawatan_ralan.status_psiko)?} + {?=isset_or($penilaian_awal_keperawatan_ralan.nyeri)?}
                  + Skala: {?=isset_or($penilaian_awal_keperawatan_ralan.skala_nyeri)?} +
                  {?=isset_or($penilaian_awal_keperawatan_ralan.nm_petugas)?} + + +
                  Tidak ada data
                  diff --git a/plugins/rawat_jalan/view/admin/booking.html b/plugins/rawat_jalan/view/admin/booking.html index a9986936a..ada67343e 100644 --- a/plugins/rawat_jalan/view/admin/booking.html +++ b/plugins/rawat_jalan/view/admin/booking.html @@ -24,7 +24,7 @@

                  Kelola Booking Pasien

                  Jumlah: {?=count($booking.totalRecords)?}

                  -
                  +
                  @@ -61,18 +61,18 @@

                  Jumlah: {?=count($booking.totalRe {if: !empty($booking.list)} {loop: $booking.list} - - {$value.nm_pasien} - {$value.no_rkm_medis} - {$value.no_reg} - {$value.nm_poli} - {$value.nm_dokter} - {$value.png_jawab} - {$value.tanggal_booking} - {$value.jam_booking} - {$value.tanggal_periksa} - {$value.status} - + + {?=isset_or($value.nm_pasien)?} + {?=isset_or($value.no_rkm_medis)?} + {?=isset_or($value.no_reg)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.png_jawab)?} + {?=isset_or($value.tanggal_booking)?} + {?=isset_or($value.jam_booking)?} + {?=isset_or($value.tanggal_periksa)?} + {?=isset_or($value.status)?} + {/loop} {else} @@ -82,7 +82,7 @@

                  Jumlah: {?=count($booking.totalRe

                  - {$booking.pagination} + {?=isset_or($booking.pagination)?}
                  @@ -142,8 +142,8 @@

                  + + + + + + + diff --git a/plugins/rawat_jalan/view/admin/display.icd.html b/plugins/rawat_jalan/view/admin/display.icd.html new file mode 100644 index 000000000..a3ec1d478 --- /dev/null +++ b/plugins/rawat_jalan/view/admin/display.icd.html @@ -0,0 +1,105 @@ + +

                  ICD 9 dan ICD 10

                  +
                  + + + + + + + + + + + +
                  Diagnosa/Penyakit/ICD 10: + + + + + + + + {loop: $diagnosa} + + + + + + + {/loop} +
                  KodeNama PenyakitPrioritasAksi
                  {?=isset_or($value.kd_penyakit)?}{?=isset_or($value.nama)?}{?=isset_or($value.prioritas)?} + +
                  +
                  Prosedur Tindakan/ICD 9: + + + + + + + + {loop: $prosedur} + + + + + + + {/loop} +
                  KodeNama TindakanPrioritasAksi
                  {?=isset_or($value.kode)?}{?=isset_or($value.nama)?}{?=isset_or($value.prioritas)?} + +
                  +
                  +
                  + + + \ No newline at end of file diff --git a/plugins/rawat_jalan/view/admin/form.berkasdigital.html b/plugins/rawat_jalan/view/admin/form.berkasdigital.html index af67be695..41e0d5511 100644 --- a/plugins/rawat_jalan/view/admin/form.berkasdigital.html +++ b/plugins/rawat_jalan/view/admin/form.berkasdigital.html @@ -44,7 +44,7 @@
                  diff --git a/plugins/rawat_jalan/view/admin/form.data_tb.html b/plugins/rawat_jalan/view/admin/form.data_tb.html new file mode 100644 index 000000000..470e5628b --- /dev/null +++ b/plugins/rawat_jalan/view/admin/form.data_tb.html @@ -0,0 +1,627 @@ + + + + + \ No newline at end of file diff --git a/plugins/rawat_jalan/view/admin/form.html b/plugins/rawat_jalan/view/admin/form.html index 01848362e..0106cdbe3 100644 --- a/plugins/rawat_jalan/view/admin/form.html +++ b/plugins/rawat_jalan/view/admin/form.html @@ -6,11 +6,11 @@
                  - +
                  - +
                  @@ -24,7 +24,7 @@
                  @@ -34,7 +34,7 @@
                  @@ -44,7 +44,7 @@
                  @@ -52,12 +52,12 @@
                  - +
                  - +
                  @@ -74,19 +74,19 @@
                  - +
                  - +
                  - +
                  @@ -98,7 +98,7 @@
                  - +
                  @@ -108,16 +108,16 @@
                  - - + +
                  + + diff --git a/plugins/rawat_jalan/view/admin/index.html b/plugins/rawat_jalan/view/admin/index.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/rawat_jalan/view/admin/index.html +++ b/plugins/rawat_jalan/view/admin/index.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/rawat_jalan/view/admin/jadwal.form.html b/plugins/rawat_jalan/view/admin/jadwal.form.html index 2159632f2..cc1732f7a 100644 --- a/plugins/rawat_jalan/view/admin/jadwal.form.html +++ b/plugins/rawat_jalan/view/admin/jadwal.form.html @@ -2,16 +2,16 @@
                  -

                  {$pendaftaran.title}

                  +

                  {?=isset_or($pendaftaran.title)?}

                  -
                  +
                  @@ -19,29 +19,29 @@

                  {$pendaftaran.title}

                  - +
                  - +
                  - +
                  diff --git a/plugins/rawat_jalan/view/admin/jadwal.html b/plugins/rawat_jalan/view/admin/jadwal.html index 34979eec1..fc14bd06b 100644 --- a/plugins/rawat_jalan/view/admin/jadwal.html +++ b/plugins/rawat_jalan/view/admin/jadwal.html @@ -20,28 +20,28 @@

                  Kelola Jadwal - - - - - - - - - {/loop} - {else} - Data jadwal dokter tidak ditemukan - {/if} - - + {loop: $pendaftaran.jadwal} + + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.hari_kerja)?} + {?=isset_or($value.jam_mulai)?} - {?=isset_or($value.jam_selesai)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.kuota)?} + + + + + + + + + + {/loop} + {else} + Data jadwal dokter tidak ditemukan + {/if} + +

                  @@ -51,6 +51,8 @@

                  Kelola Jadwal $(document).ready(function(){ + // Inisialisasi DataTables hanya jika ada data + {if: !empty($pendaftaran.jadwal)} $('.display').DataTable({ "language": { "search": "", "searchPlaceholder": "Search..." }, "lengthChange": false, @@ -59,6 +61,7 @@

                  Kelola Jadwal

                  Hapus + {?=isset_or($value.nomor)?} + {?=isset_or($value.tanggal_periksa)?} + {?=isset_or($value.no_reg)?} + {?=isset_or($value.nm_poli)?} + {?=isset_or($value.nm_dokter)?} + {?=isset_or($value.png_jawab)?} + {?=isset_or($value.status)?} + Hapus {/loop} {else} diff --git a/plugins/rawat_jalan/view/admin/layanan.html b/plugins/rawat_jalan/view/admin/layanan.html index 684d18313..421753112 100644 --- a/plugins/rawat_jalan/view/admin/layanan.html +++ b/plugins/rawat_jalan/view/admin/layanan.html @@ -13,9 +13,9 @@ {if: $layanan} {loop: $layanan} - - {$value.kd_jenis_prw} - {$value.nm_perawatan} + + {?=isset_or($value.kd_jenis_prw)?} + {?=isset_or($value.nm_perawatan)?} Rp. {?= number_format($value.total_byrdr,2,',','.')?} Rp. {?= number_format($value.total_byrpr,2,',','.')?} diff --git a/plugins/rawat_jalan/view/admin/manage.html b/plugins/rawat_jalan/view/admin/manage.html index 9aa88cd2e..72aa02d10 100644 --- a/plugins/rawat_jalan/view/admin/manage.html +++ b/plugins/rawat_jalan/view/admin/manage.html @@ -40,12 +40,14 @@

                  Kelola Pasien

                  {if: $this->core->getUserInfo('role') == 'admin' || $this->core->getUserInfo('role') == 'rekammedis'} + {if: $this->core->checkPermission($this->core->getUserInfo('username'), 'can_create', 'rawat_jalan') == true}
                  {include: ../plugins/rawat_jalan/view/admin/form.html}
                  {/if} + {/if}
                  {include: ../plugins/rawat_jalan/view/admin/display.html}
                  @@ -69,34 +71,134 @@

                  Kelola Pasien

                  - - - - diff --git a/plugins/rawat_jalan/view/admin/odontogram.html b/plugins/rawat_jalan/view/admin/odontogram.html index 93bc63da5..110139f3d 100644 --- a/plugins/rawat_jalan/view/admin/odontogram.html +++ b/plugins/rawat_jalan/view/admin/odontogram.html @@ -276,7 +276,7 @@

                  Odontogram

                  - + @@ -290,7 +290,6 @@

                  Odontogram

                  - Cetak
                  @@ -310,11 +309,11 @@

                  History Odontogram

                  {loop: $odontogram} - {$value.tgl_input} + {?=isset_or($value.tgl_input)?} {?=str_replace('gg_','Gigi ',$value.pemeriksaan)?} - {$value.kondisi} - {$value.catatan} - + {?=isset_or($value.kondisi)?} + {?=isset_or($value.catatan)?} + {/loop} @@ -399,12 +398,12 @@

                  History OHIS

                  {loop: $ohis} - {$value.tgl_input} - {$value.debris} - {$value.calculus} - {$value.nilai} - {$value.kriteria} - + {?=isset_or($value.tgl_input)?} + {?=isset_or($value.debris)?} + {?=isset_or($value.calculus)?} + {?=isset_or($value.nilai)?} + {?=isset_or($value.kriteria)?} + {/loop} @@ -503,15 +502,4 @@

                  History OHIS

                  }); }); }); -jQuery("#cetak_odontogram").click(function (event) { - - var no_rawat = $('input:text[name=no_rawat]').val(); - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/jasper/odontogram/' + no_rawat.replace(/\//g,'') + '?t=' + mlite.token; - $("#modal_cetak_odontogram").modal('show').html('
                  '); - - return false; - -}); diff --git a/plugins/rawat_jalan/view/admin/odontogram.tampil.html b/plugins/rawat_jalan/view/admin/odontogram.tampil.html index 29b54c185..d53f6d714 100644 --- a/plugins/rawat_jalan/view/admin/odontogram.tampil.html +++ b/plugins/rawat_jalan/view/admin/odontogram.tampil.html @@ -12,11 +12,11 @@

                  History Odontogram

                  {loop: $odontogram} - {$value.tgl_input} + {?=isset_or($value.tgl_input)?} {?=str_replace('gg_','Gigi ',$value.pemeriksaan)?} - {$value.kondisi} - {$value.catatan} - + {?=isset_or($value.kondisi)?} + {?=isset_or($value.catatan)?} + {/loop} diff --git a/plugins/rawat_jalan/view/admin/ohis.tampil.html b/plugins/rawat_jalan/view/admin/ohis.tampil.html index 4e71849df..4943fa431 100644 --- a/plugins/rawat_jalan/view/admin/ohis.tampil.html +++ b/plugins/rawat_jalan/view/admin/ohis.tampil.html @@ -13,12 +13,12 @@

                  History OHIS

                  {loop: $ohis} - {$value.tgl_input} - {$value.debris} - {$value.calculus} - {$value.nilai} - {$value.kriteria} - + {?=isset_or($value.tgl_input)?} + {?=isset_or($value.debris)?} + {?=isset_or($value.calculus)?} + {?=isset_or($value.nilai)?} + {?=isset_or($value.kriteria)?} + {/loop} diff --git a/plugins/rawat_jalan/view/admin/pasien.html b/plugins/rawat_jalan/view/admin/pasien.html index 6827ee731..34205e248 100644 --- a/plugins/rawat_jalan/view/admin/pasien.html +++ b/plugins/rawat_jalan/view/admin/pasien.html @@ -21,19 +21,19 @@ {if: $pasien} {loop: $pasien} - {$value.no_rkm_medis} - {$value.nm_pasien} - {$value.tgl_lahir} - {if: $value.jk=='L'}Laki-Laki{else}Perempuan{/if} - {$value.alamat} - {$value.no_tlp} + data-no_rkm_medis="{?=isset_or($value.no_rkm_medis)?}" + data-nm_pasien="{?=isset_or($value.nm_pasien)?}" + data-tgl_lahir="{?=isset_or($value.tgl_lahir)?}" + data-jk="{if: $value.jk == 'L'}Laki-Laki{else}Perempuan{/if}" + data-alamat="{?=isset_or($value.alamat)?}" + data-no_tlp="{?=isset_or($value.no_tlp)?}" + data-pekerjaan="{?=isset_or($value.pekerjaan)?}"> + {?=isset_or($value.no_rkm_medis)?} + {?=isset_or($value.nm_pasien)?} + {?=isset_or($value.tgl_lahir)?} + {if: $value.jk == 'L'}Laki-Laki{else}Perempuan{/if} + {?=isset_or($value.alamat)?} + {?=isset_or($value.no_tlp)?} {/loop} {else} diff --git a/plugins/rawat_jalan/view/admin/persetujuan.umum.html b/plugins/rawat_jalan/view/admin/persetujuan.umum.html index f353ead3b..db071028d 100644 --- a/plugins/rawat_jalan/view/admin/persetujuan.umum.html +++ b/plugins/rawat_jalan/view/admin/persetujuan.umum.html @@ -26,23 +26,23 @@ Nama Pasien - : {$pasien.nm_pasien} + : {?=isset_or($pasien.nm_pasien)?} Nomor RM - : {$pasien.no_rkm_medis} + : {?=isset_or($pasien.no_rkm_medis)?} Tanggal Lahir - : {$pasien.tgl_lahir} + : {?=isset_or($pasien.tgl_lahir)?} Alamat - : {$pasien.alamat} + : {?=isset_or($pasien.alamat)?} Nomor HP - : {$pasien.no_tlp} + : {?=isset_or($pasien.no_tlp)?} @@ -60,19 +60,19 @@ Nama - : {$pasien.tgl_lahir} + : {?=isset_or($pasien.tgl_lahir)?} Alamat - : {$pasien.alamat} + : {?=isset_or($pasien.alamat)?} Nomor HP - : {$pasien.no_tlp} + : {?=isset_or($pasien.no_tlp)?} - Selaku Pasien/Wali hukum {$pasien.nm_pasien} dengan menyatakan persetujuan : + Selaku Pasien/Wali hukum {?=isset_or($pasien.nm_pasien)?} dengan menyatakan persetujuan : @@ -91,10 +91,10 @@ - Saya menyetujui untuk perawatan di {$settings.nama_instansi} sebagai pasien rawat jalan atau rawat inap tergantung kepada kebutuhan medis. + Saya menyetujui untuk perawatan di {?=isset_or($settings.nama_instansi)?} sebagai pasien rawat jalan atau rawat inap tergantung kepada kebutuhan medis. Pengobatan dapat meliputi pemeriksaan x-ray/radiology, tes darah, perawatan rutin dan prosedur seperti cairan infus atau suntikan dan evaluasi (contohnya wawancara dan pemeriksaan fisik). Persetujuan yang saya berikan tidak termasuk persetujuan untuk prosedur/tindakan invasif (misalnya, operasi) atau tindakan yang mempunyai resiko tinggi. - Jika saya memutuskan untuk menghentikan perawatan medis untuk diri saya sendiri. Saya memahami dan menyadari bahwa {$settings.nama_instansi} atau dokter tidak bertanggung jawab atas hasil yang merugikan Saya. + Jika saya memutuskan untuk menghentikan perawatan medis untuk diri saya sendiri. Saya memahami dan menyadari bahwa {?=isset_or($settings.nama_instansi)?} atau dokter tidak bertanggung jawab atas hasil yang merugikan Saya.

                  @@ -109,9 +109,9 @@ - Saya memahami informasi yang ada didalam diri Saya, termasuk Diagnosis, hasil laboratorium dan hasil tes diagnostik yang akan di gunakan untuk perawatan medis, {$settings.nama_instansi} akan menjamin kerahasiaannya. - Saya memberi wewenang kepada {$settings.nama_instansi} untuk memberikan informasi tentang tentang diagnosis, hasil pelayanan dan pengobatan bila diperlukan untuk memproses klaim asuransi/ perusahaan dan atau lembaga pemerintah. - Saya memberi wewenang kepada {$settings.nama_instansi} untuk memberikan informasi tentang diagnosis, hasil pelayanan dan pengobatan saya kepada anggota keluarga saya. + Saya memahami informasi yang ada didalam diri Saya, termasuk Diagnosis, hasil laboratorium dan hasil tes diagnostik yang akan di gunakan untuk perawatan medis, {?=isset_or($settings.nama_instansi)?} akan menjamin kerahasiaannya. + Saya memberi wewenang kepada {?=isset_or($settings.nama_instansi)?} untuk memberikan informasi tentang tentang diagnosis, hasil pelayanan dan pengobatan bila diperlukan untuk memproses klaim asuransi/ perusahaan dan atau lembaga pemerintah. + Saya memberi wewenang kepada {?=isset_or($settings.nama_instansi)?} untuk memberikan informasi tentang diagnosis, hasil pelayanan dan pengobatan saya kepada anggota keluarga saya.

                  @@ -127,8 +127,8 @@ Saya memiliki hak untuk mengambil bagian dalam keputusan mengenai penyakit saya dan dalam hal perawatan medis dan rencana pengobatan. - Saya telah mendapat informasi tentang “Hak dan tanggung jawab pasien“ di {$settings.nama_instansi} melalui Leaflet dan banner yang diediakan oleh petugas. - Saya memahami bahwa {$settings.nama_instansi} tidak bertanggung jawab atas kehilangan barang-barang pribadi dan barang berharga yang di bawa ke {$settings.nama_instansi}. + Saya telah mendapat informasi tentang “Hak dan tanggung jawab pasien“ di {?=isset_or($settings.nama_instansi)?} melalui Leaflet dan banner yang diediakan oleh petugas. + Saya memahami bahwa {?=isset_or($settings.nama_instansi)?} tidak bertanggung jawab atas kehilangan barang-barang pribadi dan barang berharga yang di bawa ke {?=isset_or($settings.nama_instansi)?}.

                  @@ -144,9 +144,9 @@ Saya Tidak di perkenankan untuk membawa barang-barang berharga ke ruang rawat inap, jika ada anggota keluarga atau teman harus diminta untuk membawa pulang uang atau perhiasan. - Bila tidak ada anggota keluarga, {$settings.nama_instansi} menyediakan tempat penitipan barang milik pasien di tempat resmi yang telah disediakan {$settings.nama_instansi}. - Saya telah menerima informasi tentang peraturan yang diberlakukan oleh {$settings.nama_instansi} dan saya beserta keluarga bersedia untuk mematuhinya, termasuk akan mematuhi jam berkunjung pasien sesuai dengan aturan di {$settings.nama_instansi}. - Anggota keluarga saya yang menunggu saya, bersedia untuk selalu memakai tanda pengenal khusus yang diberikan oleh {$settings.nama_instansi}, dan demi keamanan seluruh pasien setiap keluarga dan siapapun yang akan megunjungi saya diluar jam berkunjung, bersedia untuk diminta/diperiksa identitasnya dan memakai identitias yang diberikan oleh {$settings.nama_instansi}. + Bila tidak ada anggota keluarga, {?=isset_or($settings.nama_instansi)?} menyediakan tempat penitipan barang milik pasien di tempat resmi yang telah disediakan {?=isset_or($settings.nama_instansi)?}. + Saya telah menerima informasi tentang peraturan yang diberlakukan oleh {?=isset_or($settings.nama_instansi)?} dan saya beserta keluarga bersedia untuk mematuhinya, termasuk akan mematuhi jam berkunjung pasien sesuai dengan aturan di {?=isset_or($settings.nama_instansi)?}. + Anggota keluarga saya yang menunggu saya, bersedia untuk selalu memakai tanda pengenal khusus yang diberikan oleh {?=isset_or($settings.nama_instansi)?}, dan demi keamanan seluruh pasien setiap keluarga dan siapapun yang akan megunjungi saya diluar jam berkunjung, bersedia untuk diminta/diperiksa identitasnya dan memakai identitias yang diberikan oleh {?=isset_or($settings.nama_instansi)?}.

                  @@ -161,7 +161,7 @@ - Saya memahami tentang informasi biaya pengobatan atau biaya tindakan yang dijelaskan oleh petugas {$settings.nama_instansi}

                  + Saya memahami tentang informasi biaya pengobatan atau biaya tindakan yang dijelaskan oleh petugas {?=isset_or($settings.nama_instansi)?}

                  @@ -272,15 +272,15 @@ // =========================================== $("#export_pdf").click(function () { var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; + var img = "{?=base64_encode(file_get_contents(url(ADMIN . '/' . $settings['logo'])))?}"; var canvas = document.getElementById('canvas'); var imgData = canvas.toDataURL("image/png", 1.0); doc.addImage(img, 'JPEG', 20, 10, 50, 50); doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); + doc.text("{?=isset_or($settings.nama_instansi)?}", 80, 35, null, null, null); doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); + doc.text("{?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}", 80, 46, null, null, null); + doc.text("Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}", 80, 56, null, null, null); doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ doc.setFontSize(14); @@ -310,7 +310,7 @@ doc.isFinished = true; doc.setFontSize(11); - doc.text("{$settings.kota}, {?=date('Y-m-d')?}", 350, 580, null, null, null); + doc.text("{?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}", 350, 580, null, null, null); doc.addImage(imgData, 'JPEG', 300, 590, 220, 130); doc.text("(_________________________)", 350, 710, null, null, null); doc.isFinished = false; diff --git a/plugins/rawat_jalan/view/admin/rincian.html b/plugins/rawat_jalan/view/admin/rincian.html index e480031d3..f4391b332 100644 --- a/plugins/rawat_jalan/view/admin/rincian.html +++ b/plugins/rawat_jalan/view/admin/rincian.html @@ -13,29 +13,29 @@

                  Rincian Tindakan

                  {loop: $rawat_jl_dr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Dokter Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} {loop: $rawat_jl_pr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Perawat Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} {loop: $rawat_jl_drpr} - {$value.tgl_perawatan} {$value.jam_rawat} - {$value.nm_perawatan} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?} + {?=isset_or($value.nm_perawatan)?} Dokter & Perawat Rp. {?= number_format($value.biaya_rawat,2,',','.')?} - + {/loop} diff --git a/plugins/rawat_jalan/view/admin/sep.detail.html b/plugins/rawat_jalan/view/admin/sep.detail.html index a18ffb76f..8df567c33 100644 --- a/plugins/rawat_jalan/view/admin/sep.detail.html +++ b/plugins/rawat_jalan/view/admin/sep.detail.html @@ -23,7 +23,7 @@ SURAT ELEGIBILITAS PESERTA
                  - {$sep.nmppkpelayanan} + {?=isset_or($sep.nmppkpelayanan)?}
                  @@ -35,11 +35,11 @@ @@ -57,7 +57,7 @@ :
                  - {$data_sep.potensi_prb} + {?=isset_or($data_sep.potensi_prb)?}
                  - +
                  - {$sep.no_sep} + {?=isset_or($sep.no_sep)?}
                  @@ -74,7 +74,7 @@ : - {$sep.tglsep} + {?=isset_or($sep.tglsep)?} @@ -91,7 +91,7 @@ : - {$sep.no_kartu} ( MR: {$sep.nomr}) + {?=isset_or($sep.no_kartu)?} ( MR: {?=isset_or($sep.nomr)?}) Peserta @@ -100,7 +100,7 @@ : - {$sep.peserta} + {?=isset_or($sep.peserta)?} @@ -117,7 +117,7 @@ : - {$sep.nama_pasien} + {?=isset_or($sep.nama_pasien)?} COB @@ -126,7 +126,7 @@ : - {$sep.cob} + {?=isset_or($sep.cob)?} @@ -143,7 +143,7 @@ : - {$sep.tanggal_lahir} Kelamin: {$sep.jkel} + {?=isset_or($sep.tanggal_lahir)?} Kelamin: {?=isset_or($sep.jkel)?} Jns. Rawat @@ -169,7 +169,7 @@ : - {$sep.notelep} + {?=isset_or($sep.notelep)?} Kls. Rawat @@ -178,7 +178,7 @@ : - {$print_sep.kelas_naik} + {?=isset_or($print_sep.kelas_naik)?} @@ -195,7 +195,7 @@ : - {$sep.nmpolitujuan} + {?=isset_or($sep.nmpolitujuan)?} Kls. Hak @@ -204,7 +204,7 @@ : - Kelas {$sep.klsrawat} + Kelas {?=isset_or($sep.klsrawat)?} @@ -221,7 +221,7 @@ : - {$sep.nmdpdjp} + {?=isset_or($sep.nmdpdjp)?} @@ -238,7 +238,7 @@ : - {$sep.nmppkrujukan} + {?=isset_or($sep.nmppkrujukan)?} @@ -255,7 +255,7 @@ : - {$sep.nmdiagnosaawal} + {?=isset_or($sep.nmdiagnosaawal)?} @@ -272,7 +272,7 @@ : - {$sep.catatan} + {?=isset_or($sep.catatan)?} Pasien/Keluarga Pasien @@ -291,11 +291,11 @@ *Saya Menyetujui BPJS Kesehatan menggunakan informasi Medis Pasien jika diperlukan.
                  **SEP bukan sebagai bukti penjaminan peserta
                  Cetakan ke 1 {?=date("d/m/Y H:i:s A")?}
                  - Masa berlaku {$sep.tglrujukan} s/d {$print_sep.batas_rujukan} + Masa berlaku {?=isset_or($sep.tglrujukan)?} s/d {?=isset_or($print_sep.batas_rujukan)?} - {$sep.nama_pasien}
                  + {?=isset_or($sep.nama_pasien)?}
                  diff --git a/plugins/rawat_jalan/view/admin/soap.html b/plugins/rawat_jalan/view/admin/soap.html index 02f0573fd..279ce8c37 100644 --- a/plugins/rawat_jalan/view/admin/soap.html +++ b/plugins/rawat_jalan/view/admin/soap.html @@ -8,7 +8,7 @@
                  - {include: ../plugins/icd_10/view/admin/display.html} + {include: ../plugins/rawat_jalan/view/admin/display.icd.html}

                  Rincian Riwayat

                  @@ -38,221 +38,221 @@

                  Rincian Riwayat

                  {loop: $pemeriksaan} {if: $admin_mode == 'complex'} - {$value.nomor} + {?=isset_or($value.nomor)?} Rawat Jalan
                  - {$value.tgl_perawatan} {$value.jam_rawat}
                  - {$value.departemen_petugas} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?}
                  + {?=isset_or($value.departemen_petugas)?} - {$value.suhu_tubuh} - {$value.tensi} - {$value.nadi} - {$value.respirasi} - {$value.tinggi} - {$value.berat} - {$value.gcs} - {$value.spo2} - {$value.alergi} + {?=isset_or($value.suhu_tubuh)?} + {?=isset_or($value.tensi)?} + {?=isset_or($value.nadi)?} + {?=isset_or($value.respirasi)?} + {?=isset_or($value.tinggi)?} + {?=isset_or($value.berat)?} + {?=isset_or($value.gcs)?} + {?=isset_or($value.spo2)?} + {?=isset_or($value.alergi)?} - Instruksi: {$value.instruksi}

                  - Evaluasi: {$value.evaluasi}

                  -
                  - {$value.nama_petugas} + Instruksi: {?=isset_or($value.instruksi)?}

                  + Evaluasi: {?=isset_or($value.evaluasi)?}

                  +
                  + {?=isset_or($value.nama_petugas)?} {else} - {$value.nomor} + {?=isset_or($value.nomor)?} Rawat Jalan
                  - {$value.tgl_perawatan} {$value.jam_rawat}
                  - {$value.departemen_petugas} + {?=isset_or($value.tgl_perawatan)?} {?=isset_or($value.jam_rawat)?}
                  + {?=isset_or($value.departemen_petugas)?} {/if} {if: $admin_mode == 'complex'} Kesadaran - {$value.kesadaran} + {?=isset_or($value.kesadaran)?} Lingkar Perut - {$value.lingkar_perut} + {?=isset_or($value.lingkar_perut)?} {/if} Subyektif - {$value.keluhan} + {?=isset_or($value.keluhan)?} Obyektif - {$value.pemeriksaan} + {?=isset_or($value.pemeriksaan)?} Assesment - {$value.penilaian} + {?=isset_or($value.penilaian)?}
                  Plan - {$value.rtl} + {?=isset_or($value.rtl)?} {/loop} {if: $admin_mode == 'complex'} {loop: $pemeriksaan_ranap as $data} - {$data.nomor} + {?=isset_or($data.nomor)?} Rawat Inap
                  - {$data.tgl_perawatan} {$data.jam_rawat}
                  - {$data.departemen_petugas} + {?=isset_or($data.tgl_perawatan)?} {?=isset_or($data.jam_rawat)?}
                  + {?=isset_or($data.departemen_petugas)?} - {$data.suhu_tubuh} - {$data.tensi} - {$data.nadi} - {$data.respirasi} - {$data.tinggi} - {$data.berat} - {$data.gcs} - {$data.spo2} - {$data.alergi} + {?=isset_or($data.suhu_tubuh)?} + {?=isset_or($data.tensi)?} + {?=isset_or($data.nadi)?} + {?=isset_or($data.respirasi)?} + {?=isset_or($data.tinggi)?} + {?=isset_or($data.berat)?} + {?=isset_or($data.gcs)?} + {?=isset_or($data.spo2)?} + {?=isset_or($data.alergi)?} - Instruksi: {$data.instruksi}

                  - Evaluasi: {$data.evaluasi}

                  -
                  - {$data.nama_petugas} + Instruksi: {?=isset_or($data.instruksi)?}

                  + Evaluasi: {?=isset_or($data.evaluasi)?}

                  +
                  + {?=isset_or($data.nama_petugas)?} Kesadaran - {$data.kesadaran} + {?=isset_or($data.kesadaran)?} Subyektif - {$data.keluhan} + {?=isset_or($data.keluhan)?} Obyektif - {$data.pemeriksaan} + {?=isset_or($data.pemeriksaan)?} Assesment - {$data.penilaian} + {?=isset_or($data.penilaian)?}
                  Plan - {$data.rtl} + {?=isset_or($data.rtl)?} {/loop} {/if} diff --git a/plugins/rawat_jalan/view/admin/stts.daftar.html b/plugins/rawat_jalan/view/admin/stts.daftar.html index b74011b1b..3e79c68f5 100644 --- a/plugins/rawat_jalan/view/admin/stts.daftar.html +++ b/plugins/rawat_jalan/view/admin/stts.daftar.html @@ -1,7 +1,7 @@ -
                  +
                  - - + +
                  diff --git a/plugins/rawat_jalan/view/admin/surat.rujukan.html b/plugins/rawat_jalan/view/admin/surat.rujukan.html index 7737c0251..56c93ad4b 100644 --- a/plugins/rawat_jalan/view/admin/surat.rujukan.html +++ b/plugins/rawat_jalan/view/admin/surat.rujukan.html @@ -30,14 +30,14 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_jalan','simpansuratrujukan'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var kepada = $("#kepada").val(); var di = $("#di").val(); var anamnesa = $("#anamnesa").val(); @@ -46,7 +46,7 @@ var diagnosa = $("#diagnosa").val(); var terapi = $("#terapi").val(); var alasan_dirujuk = $("#alasan_dirujuk").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -97,12 +97,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -142,12 +142,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -157,7 +157,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}
                  Hasil-hasil penatalaksanaan yang telah kami lakukan terhadap pasien tersebut sebagai berikut. @@ -215,17 +215,17 @@

                  - {$settings.kota}, {?=date('Y-m-d')?}
                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}
                  Salam Sejawat


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}



                  diff --git a/plugins/rawat_jalan/view/admin/surat.sakit.html b/plugins/rawat_jalan/view/admin/surat.sakit.html index bff51be37..9dbcb9f8e 100644 --- a/plugins/rawat_jalan/view/admin/surat.sakit.html +++ b/plugins/rawat_jalan/view/admin/surat.sakit.html @@ -30,21 +30,21 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_jalan','simpansuratsakit'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var keadaan = $("#keadaan").val(); var diagnosa =$("#diagnosa").val(); var lama_angka = $("#lama_angka").val(); var lama_huruf = $("#lama_huruf").val(); var tanggal_mulai = $("#tanggal_mulai").val(); var tanggal_selesai = $("#tanggal_selesai").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -89,12 +89,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -113,7 +113,7 @@

                  - Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, Menerangkan bahwa;

                  + Yang bertanda tangan di bawah ini Dokter {?=isset_or($settings.nama_instansi)?}, Menerangkan bahwa;

                  @@ -123,12 +123,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -138,7 +138,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?} @@ -159,16 +159,16 @@



                  - {$settings.kota}, {?=date('Y-m-d')?}

                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}

                  diff --git a/plugins/rawat_jalan/view/admin/surat.sehat.html b/plugins/rawat_jalan/view/admin/surat.sehat.html index ab33a7d6a..f15177a63 100644 --- a/plugins/rawat_jalan/view/admin/surat.sehat.html +++ b/plugins/rawat_jalan/view/admin/surat.sehat.html @@ -33,14 +33,14 @@ function Simpan() { var url = "{?=url([ADMIN,'rawat_jalan','simpansuratsehat'])?}"; - var no_rawat = "{$no_rawat}"; + var no_rawat = "{?=isset_or($no_rawat)?}"; var nomor_surat = $("#nomor_surat").val(); - var no_rkm_medis = "{$pasien.no_rkm_medis}"; - var nm_pasien = "{$pasien.nm_pasien}"; - var tgl_lahir = "{$pasien.tgl_lahir}"; + var no_rkm_medis = "{?=isset_or($pasien.no_rkm_medis)?}"; + var nm_pasien = "{?=isset_or($pasien.nm_pasien)?}"; + var tgl_lahir = "{?=isset_or($pasien.tgl_lahir)?}"; var umur = "{?=hitungUmur($pasien.tgl_lahir)?}"; - var jk = "{$pasien.jk}"; - var alamat = "{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}"; + var jk = "{?=isset_or($pasien.jk)?}"; + var alamat = "{?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}"; var tanggal = $("#tanggal").val(); var berat_badan = $("#berat_badan").val(); var tinggi_badan =$("#tinggi_badan").val(); @@ -48,7 +48,7 @@ var gol_darah = $("#gol_darah").val(); var riwayat_penyakit = $("#riwayat_penyakit").val(); var keperluan = $("#keperluan").val(); - var dokter = "{$nm_dokter}"; + var dokter = "{?=isset_or($nm_dokter)?}"; var petugas = "{?=$this->core->getUserInfo('username', $_SESSION['mlite_user'])?}"; $.post( @@ -94,12 +94,12 @@ - + -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +

                  {?=isset_or($settings.nama_instansi)?}
                  + Alamat: {?=isset_or($settings.alamat)?} - {?=isset_or($settings.kota)?} - {?=isset_or($settings.propinsi)?}
                  + Telepon: {?=isset_or($settings.nomor_telepon)?} - Email: {?=isset_or($settings.email)?}

                  @@ -118,7 +118,7 @@

                  - Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, Menerangkan bahwa;

                  + Yang bertanda tangan di bawah ini Dokter {?=isset_or($settings.nama_instansi)?}, Menerangkan bahwa;

                  @@ -128,12 +128,12 @@

                  Nama : - {$pasien.nm_pasien} + {?=isset_or($pasien.nm_pasien)?} Tanggal Lahir / Umur : - {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?} + {?=isset_or($pasien.tgl_lahir)?} / {?=hitungUmur($pasien.tgl_lahir)?} Jenis Kelamin @@ -143,7 +143,7 @@

                  Alamat : - {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop} + {?=isset_or($pasien.alamat)?}, {?=isset_or($pasien.nm_kel)?}, {?=isset_or($pasien.nm_kec)?}, {?=isset_or($pasien.nm_kab)?}, {?=isset_or($pasien.nm_prop)?}
                  Hasil pemeriksaan fisik kami pada tanggal adalah sebagai berikut: @@ -193,16 +193,16 @@



                  - {$settings.kota}, {?=date('Y-m-d')?}

                  + {?=isset_or($settings.kota)?}, {?=date('Y-m-d')?}


                  - {$nm_dokter} + {?=isset_or($nm_dokter)?}

                  diff --git a/plugins/riwayat_barang_medis/Admin.php b/plugins/riwayat_barang_medis/Admin.php deleted file mode 100644 index 90a3f7f16..000000000 --- a/plugins/riwayat_barang_medis/Admin.php +++ /dev/null @@ -1,192 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - return $this->draw('manage.html'); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_riwayat_barang_medis= $_POST['search_field_riwayat_barang_medis']; - $search_text_riwayat_barang_medis = $_POST['search_text_riwayat_barang_medis']; - - $tgl_awal = isset_or($_POST['tgl_awal'], date('Y-m-d')); - $tgl_akhir = isset_or($_POST['tgl_akhir'], date('Y-m-d')); - - $searchQuery = " "; - if($search_text_riwayat_barang_medis != ''){ - $searchQuery .= " and (".$search_field_riwayat_barang_medis." like '%".$search_text_riwayat_barang_medis."%' ) "; - } - - $searchQuery .= " and (tanggal between '".$tgl_awal."' and '".$tgl_akhir."') "; - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from riwayat_barang_medis"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from riwayat_barang_medis WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from riwayat_barang_medis WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $databarang = $this->db('databarang')->select('nama_brng')->where('kode_brng', $row['kode_brng'])->oneArray(); - $bangsal = $this->db('bangsal')->select('nm_bangsal')->where('kd_bangsal', $row['kd_bangsal'])->oneArray(); - $data[] = array( - 'kode_brng'=>$row['kode_brng'], - 'nama_brng'=>$databarang['nama_brng'], - 'stok_awal'=>$row['stok_awal'], - 'masuk'=>$row['masuk'], - 'keluar'=>$row['keluar'], - 'stok_akhir'=>$row['stok_akhir'], - 'posisi'=>$row['posisi'], - 'tanggal'=>$row['tanggal'], - 'jam'=>$row['jam'], - 'petugas'=>$row['petugas'], - 'kd_bangsal'=>$row['kd_bangsal'], - 'nm_bangsal'=>$bangsal['nm_bangsal'], - 'status'=>$row['status'], - 'no_batch'=>$row['no_batch'], - 'no_faktur'=>$row['no_faktur'], - 'keterangan'=>$row['keterangan'] - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=="lihat") { - - $search_field_riwayat_barang_medis= $_POST['search_field_riwayat_barang_medis']; - $search_text_riwayat_barang_medis = $_POST['search_text_riwayat_barang_medis']; - - $tgl_awal = isset_or($_POST['tgl_awal'], date('Y-m-d')); - $tgl_akhir = isset_or($_POST['tgl_akhir'], date('Y-m-d')); - - $searchQuery = " "; - if($search_text_riwayat_barang_medis != ''){ - $searchQuery .= " and (".$search_field_riwayat_barang_medis." like '%".$search_text_riwayat_barang_medis."%' ) "; - } - - $searchQuery .= " and (tanggal between '".$tgl_awal."' and '".$tgl_akhir."') "; - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from riwayat_barang_medis WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $databarang = $this->db('databarang')->select('nama_brng')->where('kode_brng', $row['kode_brng'])->oneArray(); - $bangsal = $this->db('bangsal')->select('nm_bangsal')->where('kd_bangsal', $row['kd_bangsal'])->oneArray(); - $data[] = array( - 'kode_brng'=>$row['kode_brng'], - 'nama_brng'=>$databarang['nama_brng'], - 'stok_awal'=>$row['stok_awal'], - 'masuk'=>$row['masuk'], - 'keluar'=>$row['keluar'], - 'stok_akhir'=>$row['stok_akhir'], - 'posisi'=>$row['posisi'], - 'tanggal'=>$row['tanggal'], - 'jam'=>$row['jam'], - 'petugas'=>$row['petugas'], - 'kd_bangsal'=>$row['kd_bangsal'], - 'nm_bangsal'=>$bangsal['nm_bangsal'], - 'status'=>$row['status'], - 'no_batch'=>$row['no_batch'], - 'no_faktur'=>$row['no_faktur'], - 'keterangan'=>$row['keterangan'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($kode_brng) - { - $detail = $this->db('riwayat_barang_medis')->where('kode_brng', $kode_brng)->toArray(); - echo $this->draw('detail.html', ['detail' => $detail]); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/riwayat_barang_medis/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/riwayat_barang_medis/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); - $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); - $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); - - $this->core->addCSS(url([ADMIN, 'riwayat_barang_medis', 'css'])); - $this->core->addJS(url([ADMIN, 'riwayat_barang_medis', 'javascript']), 'footer'); - } - -} diff --git a/plugins/riwayat_barang_medis/Info.php b/plugins/riwayat_barang_medis/Info.php deleted file mode 100644 index a53d17851..000000000 --- a/plugins/riwayat_barang_medis/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Riwayat Barang Medis', - 'description' => 'Modul riwayat barang medis untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/riwayat_barang_medis/css/admin/styles.css b/plugins/riwayat_barang_medis/css/admin/styles.css deleted file mode 100644 index bb8838489..000000000 --- a/plugins/riwayat_barang_medis/css/admin/styles.css +++ /dev/null @@ -1,21 +0,0 @@ -#tbl_riwayat_barang_medis th, #tbl_riwayat_barang_medis td, #forTable_riwayat_barang_medis th, #forTable_riwayat_barang_medis td { - white-space: nowrap; -} -.dataTables_wrapper th, .dataTables_wrapper td { - white-space: nowrap; -} -.pmd-datatable-pagination { - padding-top: 10px !important; -} -.dataTables_length { - display: inline; -} -.dataTables_paginate { - display: inline; - float: right; -} -@media (max-width:767px) { - .dataTables_length{ - display: none !important; - } -} \ No newline at end of file diff --git a/plugins/riwayat_barang_medis/js/admin/scripts.js b/plugins/riwayat_barang_medis/js/admin/scripts.js deleted file mode 100644 index 484f344e0..000000000 --- a/plugins/riwayat_barang_medis/js/admin/scripts.js +++ /dev/null @@ -1,231 +0,0 @@ -jQuery().ready(function () { - var var_tbl_riwayat_barang_medis = $('#tbl_riwayat_barang_medis').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'riwayat_barang_medis','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_riwayat_barang_medis = $('#search_field_riwayat_barang_medis').val(); - var search_text_riwayat_barang_medis = $('#search_text_riwayat_barang_medis').val(); - var tgl_awal = $('#tgl_awal').val(); - var tgl_akhir = $('#tgl_akhir').val(); - - data.search_field_riwayat_barang_medis = search_field_riwayat_barang_medis; - data.search_text_riwayat_barang_medis = search_text_riwayat_barang_medis; - data.tgl_awal = tgl_awal; - data.tgl_akhir = tgl_akhir; - - } - }, - "columns": [ -{ 'data': 'kode_brng' }, -{ 'data': 'nama_brng' }, -{ 'data': 'stok_awal' }, -{ 'data': 'masuk' }, -{ 'data': 'keluar' }, -{ 'data': 'stok_akhir' }, -{ 'data': 'posisi' }, -{ 'data': 'tanggal' }, -{ 'data': 'jam' }, -{ 'data': 'petugas' }, -{ 'data': 'kd_bangsal' }, -{ 'data': 'nm_bangsal' }, -{ 'data': 'status' }, -{ 'data': 'no_batch' }, -{ 'data': 'no_faktur' }, -{ 'data': 'keterangan' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2}, -{ 'targets': 3}, -{ 'targets': 4}, -{ 'targets': 5}, -{ 'targets': 6}, -{ 'targets': 7}, -{ 'targets': 8}, -{ 'targets': 9}, -{ 'targets': 10}, -{ 'targets': 11}, -{ 'targets': 12}, -{ 'targets': 13}, -{ 'targets': 14}, -{ 'targets': 15} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - // $('#search_text_riwayat_barang_medis').keyup(function () { - // var_tbl_riwayat_barang_medis.draw(); - // }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_riwayat_barang_medis").click(function () { - // $("#search_text_riwayat_barang_medis").val(""); - var_tbl_riwayat_barang_medis.draw(); - }); - - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_riwayat_barang_medis").click(function () { - - var search_field_riwayat_barang_medis = $('#search_field_riwayat_barang_medis').val(); - var search_text_riwayat_barang_medis = $('#search_text_riwayat_barang_medis').val(); - - var tgl_awal = $('#tgl_awal').val(); - var tgl_akhir = $('#tgl_akhir').val(); - - $.ajax({ - url: "{?=url([ADMIN,'riwayat_barang_medis','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_riwayat_barang_medis: search_field_riwayat_barang_medis, - search_text_riwayat_barang_medis: search_text_riwayat_barang_medis, - tgl_awal: tgl_awal, - tgl_akhir: tgl_akhir - }, - dataType: 'json', - success: function (res) { - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ''; - eTable += ""; - } - eTable += "
                  Kode BrngNama BrngStok AwalMasukKeluarStok AkhirPosisiTanggalJamPetugasKd BangsalNm BangsalStatusNo BatchNo FakturKeterangan
                  ' + res[i]['kode_brng'] + '' + res[i]['nama_brng'] + '' + res[i]['stok_awal'] + '' + res[i]['masuk'] + '' + res[i]['keluar'] + '' + res[i]['stok_akhir'] + '' + res[i]['posisi'] + '' + res[i]['tanggal'] + '' + res[i]['jam'] + '' + res[i]['petugas'] + '' + res[i]['kd_bangsal'] + '' + res[i]['nm_bangsal'] + '' + res[i]['status'] + '' + res[i]['no_batch'] + '' + res[i]['no_faktur'] + '' + res[i]['keterangan'] + '
                  "; - $('#forTable_riwayat_barang_medis').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_riwayat_barang_medis").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL riwayat_barang_medis DI CLICK - // ============================================================== - jQuery("#lihat_detail_riwayat_barang_medis").click(function (event) { - - var rowData = var_tbl_riwayat_barang_medis.rows({ selected: true }).data()[0]; - - if (rowData) { -var kode_brng = rowData['kode_brng']; - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/riwayat_barang_medis/detail/' + kode_brng + '?t=' + mlite.token; - - var modal = $('#modal_detail_riwayat_barang_medis'); - var modalContent = $('#modal_detail_riwayat_barang_medis .modal-content'); - - modal.off('show.bs.modal'); - modal.on('show.bs.modal', function () { - modalContent.load(loadURL); - }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('l', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,820,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,820,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Riwayat Barang Medis", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_riwayat_barang_medis', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_riwayat_barang_medis.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_riwayat_barang_medis"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data riwayat_barang_medis"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/riwayat_barang_medis/view/admin/detail.html b/plugins/riwayat_barang_medis/view/admin/detail.html deleted file mode 100644 index 3e84cede7..000000000 --- a/plugins/riwayat_barang_medis/view/admin/detail.html +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/plugins/riwayat_barang_medis/view/admin/manage.html b/plugins/riwayat_barang_medis/view/admin/manage.html deleted file mode 100644 index d2d033465..000000000 --- a/plugins/riwayat_barang_medis/view/admin/manage.html +++ /dev/null @@ -1,125 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - -
                  -
                  -
                  -
                  - Cari : - - - - - - - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - -
                  Kode BrngNama BrngStok AwalMasukKeluarStok AkhirPosisiTanggalJamPetugasKd BangsalNm BangsalStatusNo BatchNo FakturKeterangan
                  -
                  -
                  -
                  -
                  -
                  - - - - - - diff --git a/plugins/satu_sehat/Admin.php b/plugins/satu_sehat/Admin.php index 92540af6f..c226bc7a3 100755 --- a/plugins/satu_sehat/Admin.php +++ b/plugins/satu_sehat/Admin.php @@ -2,11 +2,32 @@ namespace Plugins\Satu_Sehat; +use SatuSehat\Src\CarePlan; use Systems\AdminModule; +use SatuSehat\Src\ClinicalImpression; +use SatuSehat\Src\Composition; +use SatuSehat\Src\Condition; +use SatuSehat\Src\DiagnosticReport; +use SatuSehat\Src\Respiratory; +use SatuSehat\Src\Observation; +use SatuSehat\Src\Medication; +use SatuSehat\Src\MedicationDispense; +use SatuSehat\Src\MedicationRequest; +use SatuSehat\Src\Procedure; +use SatuSehat\Src\QuestionareMedication; +use SatuSehat\Src\ServiceRequest; +use SatuSehat\Src\Temperature; +use SatuSehat\Src\Specimen; class Admin extends AdminModule { + private $authurl; + private $fhirurl; + private $clientid; + private $secretkey; + private $organizationid; + public function init() { $this->authurl = $this->settings->get('satu_sehat.authurl'); @@ -16,18 +37,47 @@ public function init() $this->organizationid = $this->settings->get('satu_sehat.organizationid'); } + public function getObatByCode($code) + { + if ($this->getAccessToken() === '') { + return ['error' => 'Gagal mendapatkan access token']; + } + + $url = $this->settings->get('satu_sehat.authurl'); + $parsed = parse_url($url); + $baseUrl = $parsed['scheme'] . '://' . $parsed['host']; + + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $baseUrl . '/kfa-v2/products?identifier=kfa&code=' . urlencode($code), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Accept: application/json' + ] + ]); + + $response = curl_exec($ch); + curl_close($ch); + + return json_decode($response, true); + } + public function navigation() { return [ - 'Kelola' => 'manage', - 'Referensi Praktisi' => 'praktisi', - 'Referensi Pasien' => 'pasien', - 'Mapping Departemen' => 'departemen', - 'Mapping Lokasi' => 'lokasi', - 'Mapping Praktisi' => 'mappingpraktisi', - 'Data Response' => 'response', - 'Verifikasi KYC' => 'kyc', - 'Pengaturan' => 'settings', + 'Kelola' => 'manage', + 'Referensi Praktisi' => 'praktisi', + 'Referensi Pasien' => 'pasien', + 'Mapping Departemen' => 'departemen', + 'Mapping Lokasi' => 'lokasi', + 'Mapping Praktisi' => 'mappingpraktisi', + 'Mapping Obat' => 'mappingobat', + 'Mapping Laboratorium' => 'mappinglab', + 'Mapping Radiologi' => 'mappingrad', + 'Data Response' => 'response', + 'Verifikasi KYC' => 'kyc', + 'Pengaturan' => 'settings', ]; } @@ -39,6 +89,9 @@ public function getManage() ['name' => 'Mapping Departemen', 'url' => url([ADMIN, 'satu_sehat', 'departemen']), 'icon' => 'heart', 'desc' => 'Mapping departemen satu sehat'], ['name' => 'Mapping Lokasi', 'url' => url([ADMIN, 'satu_sehat', 'lokasi']), 'icon' => 'heart', 'desc' => 'Mapping lokasi satu sehat'], ['name' => 'Mapping Praktisi', 'url' => url([ADMIN, 'satu_sehat', 'mappingpraktisi']), 'icon' => 'heart', 'desc' => 'Mapping praktisi satu sehat'], + ['name' => 'Mapping Obat', 'url' => url([ADMIN, 'satu_sehat', 'mappingobat']), 'icon' => 'heart', 'desc' => 'Mapping obat satu sehat'], + ['name' => 'Mapping Laboratorium', 'url' => url([ADMIN, 'satu_sehat', 'mappinglab']), 'icon' => 'heart', 'desc' => 'Mapping laboratorium satu sehat'], + ['name' => 'Mapping Radiologi', 'url' => url([ADMIN, 'satu_sehat', 'mappingrad']), 'icon' => 'heart', 'desc' => 'Mapping radiologi satu sehat'], ['name' => 'Data Response', 'url' => url([ADMIN, 'satu_sehat', 'response']), 'icon' => 'heart', 'desc' => 'Data encounter satu sehat'], ['name' => 'Verifikasi KYC', 'url' => url([ADMIN, 'satu_sehat', 'kyc']), 'icon' => 'heart', 'desc' => 'Verifikasi KYC satu sehat'], ['name' => 'Pengaturan', 'url' => url([ADMIN, 'satu_sehat', 'settings']), 'icon' => 'heart', 'desc' => 'Pengaturan satu sehat'], @@ -71,6 +124,16 @@ public function getToken() // exit(); } + private function getAccessToken(): string + { + $raw = $this->getToken(); + $obj = json_decode($raw); + if (is_object($obj) && isset($obj->access_token) && is_string($obj->access_token)) { + return $obj->access_token; + } + return ''; + } + public function getPractitioner($nik_dokter) { @@ -84,7 +147,7 @@ public function getPractitioner($nik_dokter) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET' )); @@ -97,6 +160,31 @@ public function getPractitioner($nik_dokter) } + public function getDicomRouter() + { + + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => 'https://api-satusehat.kemkes.go.id/dicom-router', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'GET' + )); + + $response = curl_exec($curl); + + curl_close($curl); + echo '
                  ' . $response . '
                  '; + exit(); + + } + public function getPractitionerID($nik_dokter) { echo json_decode($this->getPractitioner($nik_dokter))->entry[0]->resource->id; @@ -117,7 +205,7 @@ public function getPractitionerByID($id_dokter) CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), )); $response = curl_exec($curl); @@ -140,7 +228,7 @@ public function getPatient($nik_pasien) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET' )); @@ -173,7 +261,7 @@ public function getPatientByID($id_pasien) CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), )); $response = curl_exec($curl); @@ -201,7 +289,7 @@ public function getOrganization($kode_departemen, $kode_organization = '') CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => '{ "resourceType": "Organization", @@ -306,7 +394,7 @@ public function getOrganizationById($kode_departemen) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET', )); @@ -332,7 +420,7 @@ public function getOrganizationByPart($kode_departemen) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET', )); @@ -358,7 +446,7 @@ public function getOrganizationUpdate($kode_departemen) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_POSTFIELDS => '{ "resourceType": "Organization", @@ -467,7 +555,7 @@ public function getLocation($kode, $kode_organization = '') CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => '{ "resourceType": "Location", @@ -560,22 +648,21 @@ public function getLocation($kode, $kode_organization = '') $response = curl_exec($curl); - if(json_decode($response)->issue[0]->code == 'duplicate') { + if (json_decode($response)->issue[0]->code == 'duplicate') { $curl = curl_init(); curl_setopt_array($curl, array( - CURLOPT_URL => $this->settings->get('satu_sehat.fhirurl').'/Location?organization='.$kode_organization, + CURLOPT_URL => $this->settings->get('satu_sehat.fhirurl') . '/Location?organization=' . $kode_organization, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer '.json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET', )); - + $response = curl_exec($curl); - } curl_close($curl); @@ -599,7 +686,7 @@ public function getLocationByOrgId($kode_departemen) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET', )); @@ -625,7 +712,7 @@ public function getLocationUpdate($kode_departemen) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_POSTFIELDS => '{ "resourceType": "Location", @@ -728,7 +815,7 @@ public function getLocationUpdate($kode_departemen) exit(); } - public function getEncounter($no_rawat) + public function getEncounter($no_rawat, $render = true) { $zonawaktu = '+07:00'; @@ -753,23 +840,6 @@ public function getEncounter($no_rawat) $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); $endTime = date("H:i:s", strtotime('+10 minutes', strtotime($jam_reg))); - $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); - if ($this->settings->get('satu_sehat.billing') == 'khanza') { - $mlite_billing = $this->db('nota_jalan')->select([ - 'tgl_billing' => 'tanggal', - 'jam_billing' => 'jam' - ]) - ->where('no_rawat', $no_rawat) - ->oneArray(); - if ($status_lanjut == 'Ranap') { - $mlite_billing = $this->db('nota_inap')->select([ - 'tgl_billing' => 'tanggal', - 'jam_billing' => 'jam' - ]) - ->where('no_rawat', $no_rawat) - ->oneArray(); - } - } $code = 'AMB'; $display = 'ambulatory'; @@ -782,6 +852,15 @@ public function getEncounter($no_rawat) } $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $kd_poli)->oneArray(); + $praktisi_id = isset($no_ktp_dokter['practitioner_id']) ? $no_ktp_dokter['practitioner_id'] : ''; + $lokasi_id = isset($mlite_satu_sehat_lokasi['id_lokasi_satusehat']) ? $mlite_satu_sehat_lokasi['id_lokasi_satusehat'] : ''; + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $ihs_patient = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } $curl = curl_init(); $json = '{ @@ -789,11 +868,11 @@ public function getEncounter($no_rawat) "status": "arrived", "class": { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "'.$code.'", - "display": "'.$display.'" + "code": "' . $code . '", + "display": "' . $display . '" }, "subject": { - "reference": "Patient/' . json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id . '", + "reference": "Patient/' . $ihs_patient . '", "display": "' . $nama_pasien . '" }, "participant": [ @@ -810,7 +889,7 @@ public function getEncounter($no_rawat) } ], "individual": { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '", + "reference": "Practitioner/' . $praktisi_id . '", "display": "' . $nama_dokter . '" } } @@ -821,7 +900,7 @@ public function getEncounter($no_rawat) "location": [ { "location": { - "reference": "Location/' . $mlite_satu_sehat_lokasi['id_lokasi_satusehat'] . '", + "reference": "Location/' . $lokasi_id . '", "display": "' . $kd_poli . ' ' . $nm_poli . '" } } @@ -844,7 +923,7 @@ public function getEncounter($no_rawat) "value": "' . $no_rawat . '" } ] - }'; + }'; curl_setopt_array($curl, array( CURLOPT_URL => $this->fhirurl . '/Encounter', CURLOPT_RETURNTRANSFER => true, @@ -853,14 +932,15 @@ public function getEncounter($no_rawat) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => $json, )); $response = curl_exec($curl); - $id_encounter = json_decode($response)->id; + $decoded = json_decode($response); + $id_encounter = (is_object($decoded) && isset($decoded->id)) ? $decoded->id : null; $pesan = 'Gagal mengirim encounter platform Satu Sehat!!'; if ($id_encounter) { $this->db('mlite_satu_sehat_response')->save([ @@ -871,12 +951,45 @@ public function getEncounter($no_rawat) } curl_close($curl); - // echo $response; - echo $this->draw('encounter.html', ['pesan' => $pesan, 'response' => $response, 'json' => $json]); + if ($render) { + echo $this->draw('encounter.html', ['pesan' => $pesan, 'response' => $response, 'json' => $json]); + } else { + $data = json_decode($response); + echo $data ? json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) : $response; + } + exit(); + } + + public function getEncounterById($encounter_id, $type) + { + if ($type == '') { + $type = 'ClinicalImpression'; + } + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/' . $type . '?encounter=' . $encounter_id, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'GET', + )); + + $response = curl_exec($curl); + + curl_close($curl); + + $result = json_decode($response, true); + + echo $result['entry'][0]['resource']['id'] ?? null; exit(); } - public function getEncounterBundle($no_rawat) + public function getEncounterBundle($no_rawat, $param = '') { $zonawaktu = '+00:00'; @@ -893,39 +1006,22 @@ public function getEncounterBundle($no_rawat) $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); - $inProg = $this->db('pemeriksaan_ralan')->select(['tgl' => 'tgl_perawatan', 'jam' => 'jam_rawat','respirasi' => 'respirasi','suhu' => 'suhu_tubuh','tensi'=> 'tensi','nadi' => 'nadi'])->where('no_rawat', $no_rawat)->oneArray(); + $inProg = $this->db('pemeriksaan_ralan')->select(['tgl' => 'tgl_perawatan', 'jam' => 'jam_rawat', 'respirasi' => 'respirasi', 'suhu' => 'suhu_tubuh', 'tensi' => 'tensi', 'nadi' => 'nadi', 'penilaian' => 'penilaian', 'keluhan' => 'keluhan'])->where('no_rawat', $no_rawat)->oneArray(); $diagnosa_pasien = $this->db('diagnosa_pasien') ->join('penyakit', 'penyakit.kd_penyakit=diagnosa_pasien.kd_penyakit') ->where('no_rawat', $no_rawat) ->where('diagnosa_pasien.status', $status_lanjut) ->where('prioritas', '1') ->oneArray(); - $_prosedure_pasien = $this->db('prosedur_pasien')->select(['deskripsi_pendek' => 'icd9.deskripsi_pendek','kode' => 'icd9.kode'])->join('icd9','icd9.kode = prosedur_pasien.kode')->where('prosedur_pasien.no_rawat',$no_rawat)->where('prosedur_pasien.status','Ralan')->where('prosedur_pasien.prioritas','1')->oneArray(); - $prosedure_pasien = $_prosedure_pasien['deskripsi_pendek']; - $kode_prosedure_pasien = $_prosedure_pasien['kode']; - if (strpos($kode_prosedure_pasien, '.') !== false) { - $kode_prosedure_pasien = $kode_prosedure_pasien; - } else { - $kode_prosedure_pasien = substr_replace($kode_prosedure_pasien,'.',2,0); + $_prosedure_pasien = $this->db('prosedur_pasien')->select(['deskripsi_pendek' => 'icd9.deskripsi_pendek', 'kode' => 'icd9.kode'])->join('icd9', 'icd9.kode = prosedur_pasien.kode')->where('prosedur_pasien.no_rawat', $no_rawat)->where('prosedur_pasien.status', 'Ralan')->where('prosedur_pasien.prioritas', '1')->oneArray(); + $prosedure_pasien = $_prosedure_pasien['deskripsi_pendek'] ?? ''; + $kode_prosedure_pasien = $_prosedure_pasien['kode'] ?? ''; + // Harden: avoid deprecated calls with null and only mutate when safe + if ($kode_prosedure_pasien !== '' && strpos($kode_prosedure_pasien, '.') === false && strlen($kode_prosedure_pasien) >= 2) { + $kode_prosedure_pasien = substr_replace($kode_prosedure_pasien, '.', 2, 0); } $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); - if ($this->settings->get('satu_sehat.billing') == 'khanza') { - $mlite_billing = $this->db('nota_jalan')->select([ - 'tgl_billing' => 'tanggal', - 'jam_billing' => 'jam' - ]) - ->where('no_rawat', $no_rawat) - ->oneArray(); - if ($status_lanjut == 'Ranap') { - $mlite_billing = $this->db('nota_inap')->select([ - 'tgl_billing' => 'tanggal', - 'jam_billing' => 'jam' - ]) - ->where('no_rawat', $no_rawat) - ->oneArray(); - } - } $kunjungan = 'Kunjungan'; if ($status_lanjut == 'Ranap') { @@ -959,124 +1055,23 @@ public function getEncounterBundle($no_rawat) $uuid_nadi = $this->gen_uuid(); $uuid_procedure = $this->gen_uuid(); $uuid_composition = $this->gen_uuid(); + $uuid_clinical_impression_history = $this->gen_uuid(); + $uuid_clinical_impression_prognosis = $this->gen_uuid(); // $cek_ihs = $this->core->getPasienInfo('nip',$no_rkm_medis); // $ihs_patient = $cek_ihs; // if ($ihs_patient == '' || $ihs_patient == '-') { - $ihs_patient = json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id; - // $this->db('pasien')->where('no_rkm_medis',$no_rkm_medis)->update('nip',$ihs_patient); + $ihs_patient = ''; + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } + // $this->db('pasien')->where('no_rkm_medis',$no_rkm_medis)->update('nip',$ihs_patient); // } $sistole = strtok($inProg['tensi'], '/'); $diastole = substr($inProg['tensi'], strpos($inProg['tensi'], '/') + 1); - if ($inProg['respirasi'] != '') { - $respiratory = '{ - "fullUrl": "urn:uuid:' . $uuid_respiration . '", - "resource": { - "resourceType": "Observation", - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "code": "9279-1", - "display": "Respiratory rate" - } - ] - }, - "subject": { - "reference": "Patient/' . $ihs_patient . '" - }, - "performer": [ - { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '" - } - ], - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "Pemeriksaan Fisik Pernafasan ' . $nama_pasien . ' di ' . $tgl_registrasi . '" - }, - "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "issued": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "valueQuantity": { - "value": '.$inProg['respirasi'].', - "unit": "breaths/minute", - "system": "http://unitsofmeasure.org", - "code": "/min" - } - }, - "request": { - "method": "POST", - "url": "Observation" - } - },'; - } - - if ($inProg['nadi'] != '') { - $nadi = '{ - "fullUrl": "urn:uuid:' . $uuid_nadi . '", - "resource": { - "resourceType": "Observation", - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "code": "8867-4", - "display": "Heart rate" - } - ] - }, - "subject": { - "reference": "Patient/' . $ihs_patient . '" - }, - "performer": [ - { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '" - } - ], - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "Pemeriksaan Fisik Nadi ' . $nama_pasien . ' di ' . $tgl_registrasi . '" - }, - "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "issued": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "valueQuantity": { - "value": '.$inProg['nadi'].', - "unit": "beats/minute", - "system": "http://unitsofmeasure.org", - "code": "/min" - } - }, - "request": { - "method": "POST", - "url": "Observation" - } - },'; - } - if ($inProg['tensi'] != '') { $diastole = '{ "fullUrl": "urn:uuid:' . $uuid_diastolik . '", @@ -1115,8 +1110,8 @@ public function getEncounterBundle($no_rawat) "reference": "urn:uuid:' . $uuid_encounter . '", "display": "Pemeriksaan Fisik Diastolik ' . $nama_pasien . ' di ' . $tgl_registrasi . '" }, - "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "issued": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", + "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '", + "issued": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '", "bodySite": { "coding": [ { @@ -1127,7 +1122,7 @@ public function getEncounterBundle($no_rawat) ] }, "valueQuantity": { - "value": '.$diastole.', + "value": ' . $diastole . ', "unit": "mm[Hg]", "system": "http://unitsofmeasure.org", "code": "mm[Hg]" @@ -1187,10 +1182,10 @@ public function getEncounterBundle($no_rawat) "reference": "urn:uuid:' . $uuid_encounter . '", "display": "Pemeriksaan Fisik Sistole ' . $nama_pasien . ' di ' . $tgl_registrasi . '" }, - "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "issued": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", + "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '", + "issued": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '", "valueQuantity": { - "value": '.$inProg['respirasi'].', + "value": ' . $inProg['respirasi'] . ', "unit": "breaths/minute", "system": "http://unitsofmeasure.org", "code": "/min" @@ -1203,6 +1198,40 @@ public function getEncounterBundle($no_rawat) },'; } + $composition_json = ''; + $display_composition = "Kunjungan ' . $nama_pasien . ' di tanggal ' . $tgl_registrasi . '"; + $zonaWaktu_composition = $this->convertTimeSatset($mlite_billing['tgl_billing'] . ' ' . $mlite_billing['jam_billing']) . '' . $zonawaktu; + $composition = new Composition( + $uuid_encounter, + $uuid_composition, + $ihs_patient, + $no_ktp_dokter['practitioner_id'], + $nama_pasien, + $nama_dokter, + $no_rawat, + $this->organizationid, + $display_composition, + $zonaWaktu_composition + ); + $composition_json = $composition->toJson(); + + $respiratory_json = ''; + if (!in_array($inProg['respirasi'], ['', '-'])) { + $zonaWaktu = $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu; + $display_respiratory = "Pemeriksaan Fisik Pernafasan ' . $nama_pasien . ' di ' . $tgl_registrasi . '"; + $respiratory = new Respiratory( + $uuid_encounter, + $uuid_respiration, + $ihs_patient, + $no_ktp_dokter['practitioner_id'], + $inProg['respirasi'], + $zonaWaktu, + $display_respiratory + ); + $respiratory_json = $respiratory->toJson(); + } + + $temperatur_json = ''; if ($inProg['suhu'] != '') { $value_temp = 'N'; $display_temp = 'Normal'; @@ -1217,189 +1246,348 @@ public function getEncounterBundle($no_rawat) $display_temp = 'Low'; $text_temp = 'bawah'; } - $suhu = '{ - "fullUrl": "urn:uuid:' . $uuid_suhu . '", - "resource": { - "resourceType": "Observation", - "status": "final", - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/observation-category", - "code": "vital-signs", - "display": "Vital Signs" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "http://loinc.org", - "code": "8310-5", - "display": "Body temperature" - } - ] - }, - "subject": { - "reference": "Patient/' . $ihs_patient . '" - }, - "performer": [ - { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '" - } - ], - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "Pemeriksaan Fisik Suhu ' . $nama_pasien . ' di ' . $tgl_registrasi . '" - }, - "effectiveDateTime": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "issued": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "valueQuantity": { - "value": '.str_replace(',','.',$inProg['suhu']).', - "unit": "C", - "system": "http://unitsofmeasure.org", - "code": "Cel" - }, - "interpretation": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", - "code": "'.$value_temp.'", - "display": "'.$display_temp.'" - } - ], - "text": "Di '.$text_temp.' nilai referensi" - } - ] - }, - "request": { - "method": "POST", - "url": "Observation" - } - },'; + $display_encounter_temp = "Pemeriksaan Fisik Suhu ' . $nama_pasien . ' di ' . $tgl_registrasi . '"; + $zonaWaktu = $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu; + $suhu = new Temperature( + $uuid_encounter, + $uuid_suhu, + $ihs_patient, + $no_ktp_dokter['practitioner_id'], + str_replace(',', '.', $inProg['suhu']), + $display_encounter_temp, + $value_temp, + $display_temp, + $text_temp, + $zonaWaktu + ); + $temperatur_json = $suhu->toJson(); + } + + $heart_rate_json = ''; + if (!in_array($inProg['nadi'], ['', '-'])) { + $zonaWaktu = $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu; + $display_nadi = "Pemeriksaan Fisik Nadi ' . $nama_pasien . ' di ' . $tgl_registrasi . '"; + $nadi = new Observation($uuid_encounter, $uuid_nadi, $ihs_patient, $no_ktp_dokter['practitioner_id'], $inProg['nadi'], $zonaWaktu, $display_nadi, 'nadi'); + $heart_rate_json = $nadi->toJsonBundle() . ','; } + $condition_json = ''; + if ($diagnosa_pasien['kd_penyakit'] != '') { + $display_condition = $kunjungan . ' ' . $nama_pasien . ' dari tanggal ' . $tgl_registrasi; + $condition = new Condition( + $uuid_encounter, + $uuid_condition, + $diagnosa_pasien['kd_penyakit'], + $diagnosa_pasien['nm_penyakit'], + $ihs_patient, + $nama_pasien, + $display_condition + ); + $condition_json = $condition->toJson(); + } + + $procedure_json = ''; if ($prosedure_pasien) { - $procedure = '{ - "fullUrl": "urn:uuid:' . $uuid_procedure . '", - "resource": { - "resourceType": "Procedure", - "status": "completed", - "category": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "103693007", - "display": "Diagnostic procedure" - } - ], - "text": "Diagnostic procedure" - }, - "code": { - "coding": [ - { - "system": "http://hl7.org/fhir/sid/icd-9-cm", - "code": "'.$kode_prosedure_pasien.'", - "display": "'.$prosedure_pasien.'" - } - ] - }, - "subject": { - "reference": "Patient/' . $ihs_patient . '", - "display": "' . $nama_pasien . '" - }, - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "Tindakan pada ' . $nama_pasien . ' di tanggal ' . $tgl_registrasi . '" - }, - "performedPeriod": { - "start": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "end": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '" - }, - "performer": [ - { - "actor": { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '", - "display": "' . $nama_dokter . '" - } - } - ], - "reasonCode": [ - { - "coding": [ - { - "system": "http://hl7.org/fhir/sid/icd-10", - "code": "' . $diagnosa_pasien['kd_penyakit'] . '", - "display": "' . $diagnosa_pasien['nm_penyakit'] . '" - } - ] - } - ] - }, - "request": { - "method": "POST", - "url": "Procedure" + $display_procedure = "Tindakan pada ' . $nama_pasien . ' di tanggal ' . $tgl_registrasi . '"; + $zonaWaktu = $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu; + $procedure = new Procedure( + $uuid_encounter, + $uuid_procedure, + $kode_prosedure_pasien, + $prosedure_pasien, + $ihs_patient, + $nama_pasien, + $display_procedure, + $zonaWaktu, + $no_ktp_dokter['practitioner_id'], + $nama_dokter, + $diagnosa_pasien['kd_penyakit'], + $diagnosa_pasien['nm_penyakit'] + ); + $procedure_json = $procedure->toJson(); + } + + $careplan_json = ''; + $cek_ranap = $this->db('kamar_inap')->where('no_rawat', $no_rawat)->oneArray(); + if ($cek_ranap) { + $uuid_careplan = $this->gen_uuid(); + $careplan = new CarePlan($ihs_patient, $uuid_encounter, $uuid_careplan, "Pasien Dirawat Inapkan", "Rawat Inap", $no_ktp_dokter['practitioner_id']); + $careplan_json = $careplan->toJsonBundle() . ','; + } + + $medicationforrequest_json = ''; + $medicationrequest_json = ''; + // map of MedicationRequest UUIDs by drug code for later linking + $medicationrequest_ids = []; + $no = 1; + $cek_resep = $this->db('resep_dokter')->join('resep_obat', 'resep_obat.no_resep = resep_dokter.no_resep')->where('no_rawat', $no_rawat)->where('status', 'ralan')->toArray(); + foreach ($cek_resep as $value) { + $cek_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $value['kode_brng'])->oneArray(); + if ($cek_obat) { + $uuid_medication = $this->gen_uuid(); + $uuid_medicationrequest = $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if ($cek_obat['satuan_den'] == '385057009' || $cek_obat['satuan_den'] == '421366001') { + $system_cek = 'http://snomed.info/sct'; } - },'; + + $medication = new Medication( + $uuid_medication, + $this->organizationid, + $no_rawat, + $cek_obat['kode_kfa'], + $cek_obat['nama_kfa'], + $cek_obat['kode_sediaan'], + $cek_obat['nama_sediaan'], + $cek_obat['kode_bahan'], + $cek_obat['nama_bahan'], + $cek_obat['satuan_num'], + $cek_obat['numerator'], + $cek_obat['satuan_den'], + $system_cek, + $value['jml'], + $no . $this->ran_char() + ); + $medicationforrequest_json .= $medication->toJson(); + + $time_authored = $this->convertTimeSatset($value['tgl_peresepan'] . ' ' . $value['jam_peresepan']) . $zonawaktu; + $medicationrequest = new MedicationRequest( + $uuid_medication, + $uuid_medicationrequest, + $this->organizationid, + $value['no_resep'], + $cek_obat['nama_kfa'], + $ihs_patient, + $nama_pasien, + $time_authored, + $no_ktp_dokter['practitioner_id'], + $nama_dokter, + $uuid_condition, + $uuid_encounter, + $diagnosa_pasien['nm_penyakit'], + $value['aturan_pakai'], + $cek_obat['kode_route'], + $cek_obat['nama_route'], + $value['jml'], + $cek_obat['satuan_den'], + $system_cek, + $cek_obat['satuan_den'], + $no . $this->ran_char() + ); + $medicationrequest_json .= $medicationrequest->toJson(); + // store MR id by drug code for linking in dispense section + if (!empty($value['kode_brng'])) { + $medicationrequest_ids[$value['kode_brng']] = $uuid_medicationrequest; + } + + $no++; + } } - $composition = '{ - "fullUrl": "urn:uuid:' . $uuid_composition . '", - "resource": { - "resourceType": "Composition", - "identifier": { - "system": "http://sys-ids.kemkes.go.id/composition/' . $this->organizationid . '", - "value": "' . $no_rawat . '" - }, - "status": "final", - "type": { - "coding": [ - { - "system": "http://loinc.org", - "code": "18842-5", - "display": "Discharge summary" - } - ] - }, - "category": [ - { - "coding": [ - { - "system": "http://loinc.org", - "code": "LP173421-1", - "display": "Report" - } - ] - } - ], - "subject": { - "reference": "Patient/' . $ihs_patient . '", - "display": "' . $nama_pasien . '" - }, - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "Kunjungan ' . $nama_pasien . ' di tanggal ' . $tgl_registrasi . '" - }, - "date": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'].' '.$mlite_billing['jam_billing']) . '' . $zonawaktu . '", - "author": [ - { - "reference": "Practitioner/' . $no_ktp_dokter['practitioner_id'] . '", - "display": "' . $nama_dokter . '" - } - ], - "title": "Resume Medis Rawat Jalan", - "custodian": { - "reference": "Organization/' . $this->organizationid . '" - } - }, - "request": { - "method": "POST", - "url": "Composition" + $medicationfordispense_json = ''; + $medicationdispense_json = ''; + $no = 1; + $cek_detail = $this->db('detail_pemberian_obat')->where('no_rawat', $no_rawat)->toArray(); + $praktisi_apoteker = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id', 'kd_dokter')->where('jenis_praktisi', 'Apoteker')->toArray(); + // Guard against empty practitioner list + if (!is_array($praktisi_apoteker) || empty($praktisi_apoteker)) { + // Fallback: attempt to use prescribing doctor as pharmacist context + $id_praktisi_apoteker = [ + 'practitioner_id' => $no_ktp_dokter['practitioner_id'] ?? ($no_ktp_dokter['practitioner_id'] ?? ''), + 'kd_dokter' => $kd_dokter + ]; + } else { + $id_praktisi_apoteker = $praktisi_apoteker[array_rand($praktisi_apoteker)]; + } + $nama_praktisi_apoteker = $this->core->getPegawaiInfo('nama', $id_praktisi_apoteker['kd_dokter'] ?? $kd_dokter); + foreach ($cek_detail as $value) { + $cek_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $value['kode_brng'])->oneArray(); + $cek_aturan_pakai = $this->db('aturan_pakai')->where('no_rawat', $no_rawat)->where('kode_brng', $value['kode_brng'])->where('jam', $value['jam'])->oneArray(); + if ($cek_obat && $cek_aturan_pakai) { + $uuid_medication_for_dispense = $this->gen_uuid(); + $uuid_medication_dispense = $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if ($cek_obat['satuan_den'] == '385057009' || $cek_obat['satuan_den'] == '421366001') { + $system_cek = 'http://snomed.info/sct'; + } + + $medication_for_dispense = new Medication( + $uuid_medication_for_dispense, + $this->organizationid, + $no_rawat, + $cek_obat['kode_kfa'], + $cek_obat['nama_kfa'], + $cek_obat['kode_sediaan'], + $cek_obat['nama_sediaan'], + $cek_obat['kode_bahan'], + $cek_obat['nama_bahan'], + $cek_obat['satuan_num'], + $cek_obat['numerator'], + $cek_obat['satuan_den'], + $system_cek, + $value['jml'], + $no . $this->ran_char() + ); + $medicationfordispense_json .= $medication_for_dispense->toJson(); + + $time_prepared_handed = $this->convertTimeSatset($value['tgl_perawatan'] . ' ' . $value['jam']) . $zonawaktu; + // find matching MedicationRequest id by drug code; fallback to new UUID + $mr_uuid_for_dispense = $medicationrequest_ids[$value['kode_brng']] ?? $this->gen_uuid(); + $medication_dispense = new MedicationDispense( + $uuid_medication_dispense, + $this->organizationid, + $no_rawat, + $uuid_medication_for_dispense, + $cek_obat['nama_kfa'], + $ihs_patient, + $nama_pasien, + $uuid_encounter, + $id_praktisi_apoteker['practitioner_id'], + $nama_praktisi_apoteker, + $mlite_satu_sehat_lokasi['id_lokasi_satusehat'], + $mr_uuid_for_dispense, + $time_prepared_handed, + $time_prepared_handed, + $cek_aturan_pakai['aturan'], + $value['jml'], + $cek_obat['satuan_den'], + $system_cek, + $cek_obat['satuan_den'], + $no . $this->ran_char() + ); + $medicationdispense_json .= $medication_dispense->toJson(); + + $no++; } - }'; + } + + $questionare_json = ''; + $careplan_medication_json = ''; + if ($medicationdispense_json) { + $uuid_questionare = $this->gen_uuid(); + $questionare = new QuestionareMedication($uuid_questionare, $uuid_encounter, $ihs_patient, $nama_pasien, $id_praktisi_apoteker['practitioner_id'], $nama_praktisi_apoteker); + $questionare_json = $questionare->toJson(); + + $uuid_careplan = $this->gen_uuid(); + $careplan = new CarePlan($ihs_patient, $uuid_encounter, $uuid_careplan, "Pasien Mendapatkan Resep Obat", "Resep Obat", $no_ktp_dokter['practitioner_id']); + $careplan_medication_json = $careplan->toJsonBundle() . ','; + } + + $clinical_impression_json_history = ''; + if ($inProg['keluhan'] != '') { + $clinicalimpression_history = new ClinicalImpression( + $this->organizationid, + $uuid_clinical_impression_history, + $no_rawat, + $ihs_patient, + $nama_pasien, + $uuid_encounter, + $inProg['keluhan'], + "in-progress" + ); + $clinical_impression_json_history = $clinicalimpression_history->toJsonBundle() . ','; + } + + $clinical_impression_json_prognosis = ''; + if ($inProg['penilaian'] != '') { + $clinicalimpression = new ClinicalImpression( + $this->organizationid, + $uuid_clinical_impression_prognosis, + $no_rawat, + $ihs_patient, + $nama_pasien, + $uuid_encounter, + $inProg['penilaian'], + "completed" + ); + $clinical_impression_json_prognosis = $clinicalimpression->toJsonBundle() . ','; + } + + $service_request_lab_json = []; + $specimen_json = []; + $observation_lab_json = []; + $diagnostic_report_json = []; + $permintaan_lab = $this->db('permintaan_lab')->join('permintaan_pemeriksaan_lab', 'permintaan_lab.noorder = permintaan_pemeriksaan_lab.noorder')->where('no_rawat', $no_rawat)->toArray(); + foreach ($permintaan_lab as $value) { + $check_mapping_lab = $this->db('mlite_satu_sehat_mapping_lab')->where('kd_jenis_prw', $value['kd_jenis_prw'])->oneArray(); + if ($check_mapping_lab && $check_mapping_lab['id_template'] != '' && $check_mapping_lab['jenis_pemeriksaan'] == 'tunggal') { + $praktisi_lab = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id', 'kd_dokter')->where('jenis_praktisi', 'Laboratorium')->toArray(); + $id_praktisi_lab = $praktisi_lab[array_rand($praktisi_lab)]; + $nama_praktisi_lab = $this->core->getPegawaiInfo('nama', $id_praktisi_lab['kd_dokter']); + $no_ktp_dokter_perujuk = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id')->where('kd_dokter', $value['dokter_perujuk'])->oneArray(); + $nama_dokter_perujuk = $this->core->getPegawaiInfo('nama', $value['dokter_perujuk']); + $nama_tindakan = $this->db('jns_perawatan_lab')->select('nm_perawatan')->where('kd_jenis_prw', $value['kd_jenis_prw'])->oneArray(); + $time_sampled = $this->convertTimeSatset($value['tgl_sample'] . ' ' . $value['jam_sample']) . $zonawaktu; + $time_result = $this->convertTimeSatset($value['tgl_hasil'] . ' ' . $value['jam_hasil']) . $zonawaktu; + + $uuid_service_request_lab = $this->gen_uuid(); + $uuid_specimen_lab = $this->gen_uuid(); + $uuid_observation_lab = $this->gen_uuid(); + $uuid_diagnostic_report = $this->gen_uuid(); + + + $service_request_lab = new ServiceRequest( + $uuid_service_request_lab, + $this->organizationid, + $no_rawat, + $ihs_patient, + $uuid_encounter, + $no_ktp_dokter_perujuk['practitioner_id'], + $nama_dokter_perujuk, + $check_mapping_lab['code_loinc'], + $check_mapping_lab['display_loinc'], + $check_mapping_lab['code_kptl'], + $check_mapping_lab['display_kptl'], + $nama_tindakan['nm_perawatan'] + ); + $service_request_lab_json[] = $service_request_lab->toJsonBundle() . ','; + + $specimen_lab = new Specimen($uuid_specimen_lab, $this->organizationid, $ihs_patient, $nama_pasien, $uuid_service_request_lab, $no_rawat, $time_sampled); + $specimen_json[] = $specimen_lab->toJsonBundle() . ','; + + $cek_hasil_lab = $this->db('detail_periksa_lab')->where('no_rawat', $no_rawat)->where('kd_jenis_prw', $value['kd_jenis_prw'])->where('tgl_periksa', $value['tgl_hasil'])->where('jam', $value['jam_hasil'])->oneArray(); + $observation_lab = new Observation( + $uuid_encounter, + $uuid_observation_lab, + $ihs_patient, + $id_praktisi_lab, + $cek_hasil_lab['nilai'], + $time_result, + "", + "lab", + $uuid_specimen_lab, + $uuid_service_request_lab, + $check_mapping_lab['code_loinc'], + $check_mapping_lab['display_loinc'] + ); + $observation_lab_json[] = $observation_lab->toJsonBundle() . ','; + + $diagnostic_report_lab = new DiagnosticReport( + $uuid_diagnostic_report, + $uuid_specimen_lab, + $uuid_encounter, + $uuid_service_request_lab, + $uuid_observation_lab, + $id_praktisi_lab, + $ihs_patient, + $check_mapping_lab['code_loinc'], + $check_mapping_lab['display_loinc'], + $time_result + ); + $diagnostic_report_json[] = $diagnostic_report_lab->toJsonBundle() . ','; + } + } + $service_request_lab_json_decode = implode("\n", $service_request_lab_json); + $specimen_lab_json_decode = implode("\n", $specimen_json); + $observation_lab_json_decode = implode("\n", $observation_lab_json); + $diagnostic_report_json_decode = implode("\n", $diagnostic_report_json); + + $careplan_service_request_lab_json = ''; + if ($service_request_lab_json_decode) { + $uuid_careplan = $this->gen_uuid(); + $careplan = new CarePlan($ihs_patient, $uuid_encounter, $uuid_careplan, "Pasien Mendapatkan Pemeriksaan Laboratorium", "Pemeriksaan Laboratorium", $no_ktp_dokter['practitioner_id']); + $careplan_service_request_lab_json = $careplan->toJsonBundle() . ','; + } // Bundle dari sini ---------------------------------------------------------------------- $json_bundle = '{ @@ -1413,8 +1601,8 @@ public function getEncounterBundle($no_rawat) "status": "finished", "class": { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", - "code": "'.$code.'", - "display": "'.$display.'" + "code": "' . $code . '", + "display": "' . $display . '" }, "subject": { "reference": "Patient/' . $ihs_patient . '", @@ -1440,8 +1628,8 @@ public function getEncounterBundle($no_rawat) } ], "period": { - "start": "' . $this->convertTimeSatset($tgl_registrasi.' '.$jam_reg) . '' . $zonawaktu . '", - "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'].' '.$mlite_billing['jam_billing']) . '' . $zonawaktu . '" + "start": "' . $this->convertTimeSatset($tgl_registrasi . ' ' . $jam_reg) . '' . $zonawaktu . '", + "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'] . ' ' . $mlite_billing['jam_billing']) . '' . $zonawaktu . '" }, "location": [ { @@ -1473,22 +1661,22 @@ public function getEncounterBundle($no_rawat) { "status": "arrived", "period": { - "start": "' . $this->convertTimeSatset($tgl_registrasi.' '.$jam_reg) . '' . $zonawaktu . '", - "end": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '" + "start": "' . $this->convertTimeSatset($tgl_registrasi . ' ' . $jam_reg) . '' . $zonawaktu . '", + "end": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '" } }, { "status": "in-progress", "period": { - "start": "' . $this->convertTimeSatset($inProg['tgl'].' '.$inProg['jam']) . '' . $zonawaktu . '", - "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'].' '.$mlite_billing['jam_billing']) . '' . $zonawaktu . '" + "start": "' . $this->convertTimeSatset($inProg['tgl'] . ' ' . $inProg['jam']) . '' . $zonawaktu . '", + "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'] . ' ' . $mlite_billing['jam_billing']) . '' . $zonawaktu . '" } }, { "status": "finished", "period": { - "start": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'].' '.$mlite_billing['jam_billing']) . '' . $zonawaktu . '", - "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'].' '.$mlite_billing['jam_billing']) . '' . $zonawaktu . '" + "start": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'] . ' ' . $mlite_billing['jam_billing']) . '' . $zonawaktu . '", + "end": "' . $this->convertTimeSatset($mlite_billing['tgl_billing'] . ' ' . $mlite_billing['jam_billing']) . '' . $zonawaktu . '" } } ], @@ -1506,59 +1694,27 @@ public function getEncounterBundle($no_rawat) "method": "POST", "url": "Encounter" } - },'. - $respiratory. - $suhu. - $nadi - .'{ - "fullUrl": "urn:uuid:' . $uuid_condition . '", - "resource": { - "resourceType": "Condition", - "clinicalStatus": { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", - "code": "active", - "display": "Active" - } - ] - }, - "category": [ - { - "coding": [ - { - "system": "http://terminology.hl7.org/CodeSystem/condition-category", - "code": "encounter-diagnosis", - "display": "Encounter Diagnosis" - } - ] - } - ], - "code": { - "coding": [ - { - "system": "http://hl7.org/fhir/sid/icd-10", - "code": "' . $diagnosa_pasien['kd_penyakit'] . '", - "display": "' . $diagnosa_pasien['nm_penyakit'] . '" - } - ] - }, - "subject": { - "reference": "Patient/' . $ihs_patient . '", - "display": "' . $nama_pasien . '" - }, - "encounter": { - "reference": "urn:uuid:' . $uuid_encounter . '", - "display": "' . $kunjungan . ' ' . $nama_pasien . ' dari tanggal ' . $tgl_registrasi . '" - } - }, - "request": { - "method": "POST", - "url": "Condition" - } - },' - .$procedure - .$composition. + },' . + $respiratory_json . + $temperatur_json . + $heart_rate_json . + $clinical_impression_json_history . + $careplan_json . + $careplan_service_request_lab_json . + $service_request_lab_json_decode . + $specimen_lab_json_decode . + $observation_lab_json_decode . + $diagnostic_report_json_decode . + $condition_json . + $procedure_json . + $careplan_medication_json . + $medicationforrequest_json . + $medicationrequest_json . + $questionare_json . + $medicationfordispense_json . + $medicationdispense_json . + $clinical_impression_json_prognosis . + $composition_json . '] }'; $curl = curl_init(); @@ -1583,12 +1739,25 @@ public function getEncounterBundle($no_rawat) $id_observation_nadi = NULL; $id_procedure = NULL; $id_composition = NULL; - - $entry = json_decode($response)->entry; + $id_medication_for_request = NULL; + $id_medication_request = NULL; + $id_medication_dispense = NULL; + $id_clinical_impression = NULL; + $id_service_request_lab = NULL; + $id_specimen_lab = NULL; + $id_observation_lab = NULL; + $id_diagnostic_report_lab = NULL; + $id_careplan = NULL; + + $decodedResponse = json_decode($response); + $entry = (is_object($decodedResponse) && isset($decodedResponse->entry) && is_array($decodedResponse->entry)) ? $decodedResponse->entry : []; $index = ''; - foreach ($entry as $key => $value) { - $resourceType = $value->response->resourceType; - $index = $index.' '.$key.'|'.$resourceType.' '; + foreach ((array) $entry as $key => $value) { + $resourceType = (isset($value->response) && isset($value->response->resourceType)) ? $value->response->resourceType : null; + if ($resourceType === null) { + continue; + } + $index = $index . ' { ' . $key . '. ' . $resourceType . ' } '; if ($resourceType == 'Encounter') { $id_encounter = $value->response->resourceID; } @@ -1596,7 +1765,7 @@ public function getEncounterBundle($no_rawat) $id_condition = $value->response->resourceID; } if ($resourceType == 'Observation') { - if (!empty($respiratory && $suhu && $nadi)) { + if (!empty($respiratory_json && $temperatur_json && $heart_rate_json)) { if ($key == '1') { $id_observation_respiratory = $value->response->resourceID; } @@ -1607,7 +1776,7 @@ public function getEncounterBundle($no_rawat) $id_observation_nadi = $value->response->resourceID; } } - if (!empty($respiratory && $suhu) && empty($nadi)) { + if (!empty($respiratory_json && $temperatur_json) && empty($heart_rate_json)) { if ($key == '1') { $id_observation_respiratory = $value->response->resourceID; } @@ -1615,7 +1784,7 @@ public function getEncounterBundle($no_rawat) $id_observation_temp = $value->response->resourceID; } } - if (!empty($respiratory && $nadi) && empty($suhu)) { + if (!empty($respiratory_json && $heart_rate_json) && empty($temperatur_json)) { if ($key == '1') { $id_observation_respiratory = $value->response->resourceID; } @@ -1623,7 +1792,7 @@ public function getEncounterBundle($no_rawat) $id_observation_nadi = $value->response->resourceID; } } - if (!empty($suhu && $nadi) && empty($respiratory)) { + if (!empty($temperatur_json && $heart_rate_json) && empty($respiratory_json)) { if ($key == '1') { $id_observation_temp = $value->response->resourceID; } @@ -1631,22 +1800,21 @@ public function getEncounterBundle($no_rawat) $id_observation_nadi = $value->response->resourceID; } } - if (!empty($respiratory) && empty($suhu && $nadi)) { + if (!empty($respiratory_json) && empty($temperatur_json && $heart_rate_json)) { if ($key == '1') { $id_observation_respiratory = $value->response->resourceID; } } - if (!empty($suhu) && empty($respiratory && $nadi)) { + if (!empty($temperatur_json) && empty($respiratory_json && $heart_rate_json)) { if ($key == '1') { $id_observation_temp = $value->response->resourceID; } } - if (!empty($nadi) && empty($respiratory && $suhu)) { + if (!empty($heart_rate_json) && empty($respiratory_json && $temperatur_json)) { if ($key == '1') { $id_observation_nadi = $value->response->resourceID; } } - } if ($resourceType == 'Procedure') { $id_procedure = $value->response->resourceID; @@ -1654,9 +1822,36 @@ public function getEncounterBundle($no_rawat) if ($resourceType == 'Composition') { $id_composition = $value->response->resourceID; } + if ($resourceType == 'Medication') { + $id_medication_for_request = $value->response->resourceID; + } + if ($resourceType == 'MedicationRequest') { + $id_medication_request = $value->response->resourceID; + } + if ($resourceType == 'MedicationDispense') { + $id_medication_dispense = $value->response->resourceID; + } + if ($resourceType == 'ClinicalImpression') { + $id_clinical_impression = $value->response->resourceID; + } + if ($resourceType == 'ServiceRequest') { + $id_service_request_lab = $value->response->resourceID; + } + if ($resourceType == 'Specimen') { + $id_specimen_lab = $value->response->resourceID; + } + if ($resourceType == 'Observation' && $observation_lab_json_decode) { + $id_observation_lab = $value->response->resourceID; + } + if ($resourceType == 'DiagnosticReport') { + $id_diagnostic_report_lab = $value->response->resourceID; + } + if ($resourceType == 'CarePlan') { + $id_careplan = $value->response->resourceID; + } } - $pesan = 'Gagal mengirim encounter & condition platform Satu Sehat!!'; + $pesan = 'Gagal mengirim pasien dengan No Rawat : ' . $no_rawat . ' ke platform Satu Sehat!!'; if ($id_encounter) { $this->db('mlite_satu_sehat_response')->save([ 'no_rawat' => $no_rawat, @@ -1666,21 +1861,30 @@ public function getEncounterBundle($no_rawat) 'id_observation_ttvsuhu' => $id_observation_temp, 'id_observation_ttvnadi' => $id_observation_nadi, 'id_procedure' => $id_procedure, - 'id_composition' => $id_composition + 'id_composition' => $id_composition, + 'id_medication_request' => $id_medication_request, + 'id_medication_dispense' => $id_medication_dispense, + 'id_clinical_impression' => $id_clinical_impression, + 'id_lab_pk_request' => $id_service_request_lab, + 'id_lab_pk_specimen' => $id_specimen_lab, + 'id_lab_pk_observation' => $id_observation_lab, + 'id_lab_pk_diagnostic' => $id_diagnostic_report_lab, + 'id_careplan' => $id_careplan, ]); - $pesan = 'Sukses mengirim '.$index.' platform Satu Sehat!! '; + $pesan = 'Sukses mengirim pasien dengan No Rawat : ' . $no_rawat . ' ' . $index . ' ke platform Satu Sehat!! '; } curl_close($curl); - echo $this->draw('encounter.html', ['pesan' => $pesan, 'response' => $response]); - // DEBUG ****** - // $response = json_decode($json_bundle); - // print_r($json_bundle); - exit(); + if ($param == "all") { + return json_decode($response); + } else { + echo $this->draw('encounter.html', ['pesan' => $pesan, 'response' => $response]); + exit(); + } } - public function getCondition($no_rawat) + public function getCondition($no_rawat, $render = true) { $zonawaktu = '+07:00'; @@ -1719,6 +1923,36 @@ public function getCondition($no_rawat) $kunjungan = 'Perawatan'; } + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $ihs_patient = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } + + $kd_penyakit = $diagnosa_pasien['kd_penyakit'] ?? null; + $nm_penyakit = $diagnosa_pasien['nm_penyakit'] ?? null; + $encounter_id = $mlite_satu_sehat_response['id_encounter'] ?? null; + + if ($ihs_patient === '' || !$kd_penyakit || !$nm_penyakit || !$encounter_id) { + $error = [ + 'error' => 'Data tidak lengkap untuk Condition', + 'missing' => [ + 'patient_id' => $ihs_patient === '' ? 'missing' : 'ok', + 'kd_penyakit' => !$kd_penyakit ? 'missing' : 'ok', + 'nm_penyakit' => !$nm_penyakit ? 'missing' : 'ok', + 'id_encounter' => !$encounter_id ? 'missing' : 'ok' + ] + ]; + $response = json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('condition.html', ['pesan' => 'Gagal mengirim condition platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $curl = curl_init(); curl_setopt_array($curl, array( @@ -1757,17 +1991,17 @@ public function getCondition($no_rawat) "coding": [ { "system": "http://hl7.org/fhir/sid/icd-10", - "code": "' . $diagnosa_pasien['kd_penyakit'] . '", - "display": "' . $diagnosa_pasien['nm_penyakit'] . '" + "code": "' . $kd_penyakit . '", + "display": "' . $nm_penyakit . '" } ] }, "subject": { - "reference": "Patient/' . json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id . '", + "reference": "Patient/' . $ihs_patient . '", "display": "' . $nama_pasien . '" }, "encounter": { - "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "reference": "Encounter/' . $encounter_id . '", "display": "' . $kunjungan . ' ' . $nama_pasien . ' dari tanggal ' . $tgl_registrasi . '" } }', @@ -1776,7 +2010,8 @@ public function getCondition($no_rawat) $response = curl_exec($curl); - $id_condition = json_decode($response)->id; + $decoded = json_decode($response); + $id_condition = (is_object($decoded) && isset($decoded->id)) ? $decoded->id : null; $pesan = 'Gagal mengirim condition platform Satu Sehat!!'; if ($id_condition) { $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); @@ -1798,12 +2033,16 @@ public function getCondition($no_rawat) } curl_close($curl); - // echo $response; - echo $this->draw('condition.html', ['pesan' => $pesan, 'response' => $response]); + if ($render) { + echo $this->draw('condition.html', ['pesan' => $pesan, 'response' => $response]); + } else { + $data = json_decode($response); + echo $data ? json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) : $response; + } exit(); } - public function getObservation($no_rawat, $ttv) + public function getObservation($no_rawat, $ttv, $render = true) { $zonawaktu = '+07:00'; @@ -1830,6 +2069,19 @@ public function getObservation($no_rawat, $ttv) $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $ihs_patient = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } + $__pracResp = $this->getPractitioner($no_ktp_dokter); + $__pracJson = json_decode($__pracResp); + $practitioner_id = ''; + if (is_object($__pracJson) && isset($__pracJson->entry) && is_array($__pracJson->entry) && isset($__pracJson->entry[0]) && isset($__pracJson->entry[0]->resource) && isset($__pracJson->entry[0]->resource->id)) { + $practitioner_id = $__pracJson->entry[0]->resource->id; + } + $encounter_id = $mlite_satu_sehat_response['id_encounter'] ?? null; $pemeriksaan = $this->db('pemeriksaan_ralan') ->where('no_rawat', $no_rawat) @@ -1858,7 +2110,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '8867-4'; $ttv_loinc_display = 'Heart rate'; - $ttv_unitsofmeasure_value = $pemeriksaan['nadi']; + $val = isset($pemeriksaan['nadi']) ? trim((string) $pemeriksaan['nadi']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['nadi' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'beats/minute'; $ttv_unitsofmeasure_code = '/min'; } @@ -1868,7 +2130,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '9279-1'; $ttv_loinc_display = 'Respiratory rate'; - $ttv_unitsofmeasure_value = $pemeriksaan['respirasi']; + $val = isset($pemeriksaan['respirasi']) ? trim((string) $pemeriksaan['respirasi']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['respirasi' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'breaths/minute'; $ttv_unitsofmeasure_code = '/min'; } @@ -1878,7 +2150,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '8310-5'; $ttv_loinc_display = 'Body temperature'; - $ttv_unitsofmeasure_value = $pemeriksaan['suhu_tubuh']; + $val = isset($pemeriksaan['suhu_tubuh']) ? trim((string) $pemeriksaan['suhu_tubuh']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['suhu_tubuh' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'degree Celsius'; $ttv_unitsofmeasure_code = 'Cel'; } @@ -1888,7 +2170,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '59408-5'; $ttv_loinc_display = 'Oxygen saturation'; - $ttv_unitsofmeasure_value = $pemeriksaan['spo2']; + $val = isset($pemeriksaan['spo2']) ? trim((string) $pemeriksaan['spo2']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['spo2' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'percent saturation'; $ttv_unitsofmeasure_code = '%'; } @@ -1898,7 +2190,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '9269-2'; $ttv_loinc_display = 'Glasgow coma score total'; - $ttv_unitsofmeasure_value = $pemeriksaan['gcs']; + $val = isset($pemeriksaan['gcs']) ? trim((string) $pemeriksaan['gcs']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['gcs' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_code = '{score}'; } @@ -1907,7 +2209,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '8302-2'; $ttv_loinc_display = 'Body height'; - $ttv_unitsofmeasure_value = $pemeriksaan['tinggi']; + $val = isset($pemeriksaan['tinggi']) ? trim((string) $pemeriksaan['tinggi']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['tinggi' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'centimeter'; $ttv_unitsofmeasure_code = 'cm'; } @@ -1917,7 +2229,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '29463-7'; $ttv_loinc_display = 'Body weight'; - $ttv_unitsofmeasure_value = $pemeriksaan['berat']; + $val = isset($pemeriksaan['berat']) ? trim((string) $pemeriksaan['berat']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['berat' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'kilogram'; $ttv_unitsofmeasure_code = 'kg'; } @@ -1927,7 +2249,17 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '8280-0'; $ttv_loinc_display = 'Waist Circumference at umbilicus by Tape measure'; - $ttv_unitsofmeasure_value = $pemeriksaan['berat']; + $val = isset($pemeriksaan['lingkar_perut']) ? trim((string) $pemeriksaan['lingkar_perut']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['lingkar_perut' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $ttv_unitsofmeasure_value = $val; $ttv_unitsofmeasure_unit = 'centimeter'; $ttv_unitsofmeasure_code = 'cm'; } @@ -1937,8 +2269,24 @@ public function getObservation($no_rawat, $ttv) $ttv_hl7_display = 'Vital Signs'; $ttv_loinc_code = '35094-2'; $ttv_loinc_display = 'Blood pressure panel'; - $sistole = strtok($pemeriksaan['tensi'], '/'); - $diastole = substr($pemeriksaan['tensi'], strpos($pemeriksaan['tensi'], '/') + 1); + $bp = isset($pemeriksaan['tensi']) ? trim((string) $pemeriksaan['tensi']) : ''; + if ($bp === '' || strpos($bp, '/') === false) { + $error = [ + 'error' => 'Data tidak lengkap untuk Observation', + 'missing' => [ + 'tensi' => 'missing' + ] + ]; + $response = json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + $sistole = strtok($bp, '/'); + $diastole = substr($bp, strpos($bp, '/') + 1); $ttv_unitsofmeasure_unit = 'mmHg'; $ttv_unitsofmeasure_code = 'mm[Hg]'; } @@ -1946,13 +2294,42 @@ public function getObservation($no_rawat, $ttv) if ($ttv == 'kesadaran') { $ttv_hl7_code = 'exam'; $ttv_hl7_display = 'Exam'; - $ttv_unitsofmeasure_value = 'Alert'; - if ($pemeriksaan['kesadaran'] == 'Somnolence') { - $ttv_unitsofmeasure_value = 'Voice'; + $val = isset($pemeriksaan['kesadaran']) ? trim((string) $pemeriksaan['kesadaran']) : ''; + if ($val === '') { + $response = json_encode(['error' => 'Data tidak lengkap untuk Observation', 'missing' => ['kesadaran' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); } - if ($pemeriksaan['kesadaran'] == 'Sopor') { + $ttv_unitsofmeasure_value = $val; + if ($val === 'Somnolence') { + $ttv_unitsofmeasure_value = 'Voice'; + } elseif ($val === 'Sopor') { $ttv_unitsofmeasure_value = 'Pain'; + } elseif ($val === 'Compos Mentis') { + $ttv_unitsofmeasure_value = 'Alert'; + } + } + + if ($ihs_patient === '' || !$encounter_id || $practitioner_id === '') { + $error = [ + 'error' => 'Data tidak lengkap untuk Observation', + 'missing' => [ + 'patient_id' => $ihs_patient === '' ? 'missing' : 'ok', + 'id_encounter' => !$encounter_id ? 'missing' : 'ok', + 'practitioner_id' => $practitioner_id === '' ? 'missing' : 'ok' + ] + ]; + $response = json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('observation.html', ['pesan' => 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; } + exit(); } $curl = curl_init(); @@ -1966,7 +2343,7 @@ public function getObservation($no_rawat, $ttv) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => '{ "resourceType": "Observation", @@ -1992,15 +2369,15 @@ public function getObservation($no_rawat, $ttv) ] }, "subject": { - "reference": "Patient/' . json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id . '" + "reference": "Patient/' . $ihs_patient . '" }, "performer": [ { - "reference": "Practitioner/' . json_decode($this->getPractitioner($no_ktp_dokter))->entry[0]->resource->id . '" + "reference": "Practitioner/' . $practitioner_id . '" } ], "encounter": { - "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "reference": "Encounter/' . $encounter_id . '", "display": "Pemeriksaan fisik ' . $ttv . ' ' . $nama_pasien . ' tanggal ' . $tgl_registrasi . '" }, "effectiveDateTime": "' . $pemeriksaan['tgl_perawatan'] . 'T' . $pemeriksaan['jam_rawat'] . '' . $zonawaktu . '", @@ -2019,7 +2396,7 @@ public function getObservation($no_rawat, $ttv) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => '{ "resourceType": "Observation", @@ -2046,15 +2423,15 @@ public function getObservation($no_rawat, $ttv) "text": "Blood pressure systolic & diastolic" }, "subject": { - "reference": "Patient/' . json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id . '" + "reference": "Patient/' . $ihs_patient . '" }, "performer": [ { - "reference": "Practitioner/' . json_decode($this->getPractitioner($no_ktp_dokter))->entry[0]->resource->id . '" + "reference": "Practitioner/' . $practitioner_id . '" } ], "encounter": { - "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "reference": "Encounter/' . $encounter_id . '", "display": "Pemeriksaan fisik ' . $ttv . ' ' . $nama_pasien . ' tanggal ' . $tgl_registrasi . '" }, "effectiveDateTime": "' . $pemeriksaan['tgl_perawatan'] . 'T' . $pemeriksaan['jam_rawat'] . '' . $zonawaktu . '", @@ -2106,7 +2483,7 @@ public function getObservation($no_rawat, $ttv) CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => '{ "resourceType": "Observation", @@ -2132,15 +2509,15 @@ public function getObservation($no_rawat, $ttv) ] }, "subject": { - "reference": "Patient/' . json_decode($this->getPatient($no_ktp_pasien))->entry[0]->resource->id . '" + "reference": "Patient/' . $ihs_patient . '" }, "performer": [ { - "reference": "Practitioner/' . json_decode($this->getPractitioner($no_ktp_dokter))->entry[0]->resource->id . '" + "reference": "Practitioner/' . $practitioner_id . '" } ], "encounter": { - "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "reference": "Encounter/' . $encounter_id . '", "display": "Pemeriksaan fisik ' . $ttv . ' ' . $nama_pasien . ' tanggal ' . $tgl_registrasi . '" }, "effectiveDateTime": "' . $pemeriksaan['tgl_perawatan'] . 'T' . $pemeriksaan['jam_rawat'] . '' . $zonawaktu . '", @@ -2158,7 +2535,8 @@ public function getObservation($no_rawat, $ttv) $response = curl_exec($curl); - $id_observation = json_decode($response)->id; + $decoded = json_decode($response); + $id_observation = (is_object($decoded) && isset($decoded->id)) ? $decoded->id : null; $pesan = 'Gagal mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!'; if ($id_observation) { $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); @@ -2169,81 +2547,242 @@ public function getObservation($no_rawat, $ttv) 'no_rawat' => $no_rawat, 'id_observation_ttv' . $ttv . '' => $id_observation ]); - } else { - $this->db('mlite_satu_sehat_response') - ->save([ - 'no_rawat' => $no_rawat, - 'id_observation_ttv' . $ttv . '' => $id_condition - ]); + $pesan = 'Sukses mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!'; } - $pesan = 'Sukses mengirim observation ttv ' . $ttv . ' ke platform Satu Sehat!!'; } curl_close($curl); - // echo $response; - echo $this->draw('observation.html', ['pesan' => $pesan, 'response' => $response]); + if ($render) { + echo $this->draw('observation.html', ['pesan' => $pesan, 'response' => $response]); + } else { + $data = json_decode($response); + echo $data ? json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) : $response; + } exit(); } - public function getSettings() + public function getMappingLab() { - return $this->draw('settings.html', ['satu_sehat' => $this->settings->get('satu_sehat')]); + $this->_addHeaderFiles(); + $mapping_lab = $this->db('mlite_satu_sehat_mapping_lab') + ->join('template_laboratorium', 'template_laboratorium.id_template = mlite_satu_sehat_mapping_lab.id_template') + ->toArray(); + $template_laboratorium = $this->db('template_laboratorium')->toArray(); + return $this->draw('mapping.lab.html', ['mapping_lab_satu_sehat' => $mapping_lab, 'template_laboratorium' => $template_laboratorium]); } - public function postSaveSettings() + public function getMappingRad() { - foreach ($_POST['satu_sehat'] as $key => $val) { - $this->settings('satu_sehat', $key, $val); - } - - $this->notify('success', 'Pengaturan telah disimpan'); - redirect(url([ADMIN, 'satu_sehat', 'settings'])); + $this->_addHeaderFiles(); + $mapping_rad = $this->db('mlite_satu_sehat_mapping_rad') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw = mlite_satu_sehat_mapping_rad.kd_jenis_prw') + ->toArray(); + $jns_perawatan_radiologi = $this->db('jns_perawatan_radiologi')->toArray(); + return $this->draw('mapping.rad.html', ['mapping_rad_satu_sehat' => $mapping_rad, 'jns_perawatan_radiologi' => $jns_perawatan_radiologi]); } - public function anyPraktisi() + public function getLookupMaster() { - $response = []; - if (isset($_POST['nik_dokter']) && $_POST['nik_dokter'] != '') { - $response = json_decode($this->getPractitioner($_POST['nik_dokter'])); + header('Content-type: application/json'); + $type = isset($_GET['type']) ? (string) $_GET['type'] : ''; + $q = isset($_GET['q']) ? trim((string) $_GET['q']) : ''; + + if ($q === '') { + echo json_encode([]); + exit(); } - return $this->draw('praktisi.html', ['response' => json_encode($response, JSON_PRETTY_PRINT)]); + + $items = []; + + if ($type === 'loinc_lab') { + $rows = $this->db('mlite_loinc_lab') + ->like('Code', '%'.$q.'%') + ->orLike('NamaPemeriksaan', '%'.$q.'%') + ->orLike('Display', '%'.$q.'%') + ->limit(50) + ->toArray(); + + foreach ($rows as $row) { + $code = trim((string) ($row['Code'] ?? '')); + $display = trim((string) ($row['NamaPemeriksaan'] ?? ($row['Display'] ?? ''))); + if ($code === '') continue; + $items[] = [ + 'value' => $code, + 'text' => '['.$code.'] '.($display !== '' ? $display : $code), + 'code' => $code, + 'display' => $display, + 'code_system' => 'http://loinc.org' + ]; + } + } elseif ($type === 'loinc_rad') { + $rows = $this->db('mlite_loinc_radiologi') + ->like('Code', '%'.$q.'%') + ->orLike('NamaPemeriksaan', '%'.$q.'%') + ->orLike('Display', '%'.$q.'%') + ->limit(50) + ->toArray(); + + foreach ($rows as $row) { + $code = trim((string) ($row['Code'] ?? '')); + $display = trim((string) ($row['NamaPemeriksaan'] ?? ($row['Display'] ?? ''))); + if ($code === '') continue; + $items[] = [ + 'value' => $code, + 'text' => '['.$code.'] '.($display !== '' ? $display : $code), + 'code' => $code, + 'display' => $display, + 'code_system' => 'http://loinc.org', + 'body_site_code' => (string) ($row['BodySiteCode'] ?? ''), + 'body_site_display' => (string) ($row['BodySiteDisplay'] ?? ''), + 'body_site_code_system' => (string) ($row['BodySiteCodeSystem'] ?? '') + ]; + } + } elseif ($type === 'snomed') { + $rows = $this->db('mlite_snomed') + ->like('kode', '%'.$q.'%') + ->orLike('istilah', '%'.$q.'%') + ->limit(50) + ->toArray(); + + foreach ($rows as $row) { + $code = trim((string) ($row['kode'] ?? '')); + $display = trim((string) ($row['istilah'] ?? '')); + if ($code === '') continue; + $items[] = [ + 'value' => $code, + 'text' => '['.$code.'] '.($display !== '' ? $display : $code), + 'code' => $code, + 'display' => $display, + 'code_system' => 'http://snomed.info/sct' + ]; + } + } elseif ($type === 'kfa') { + $rows = $this->db('mlite_kfa') + ->like('kode_kfa', '%'.$q.'%') + ->orLike('nama_kfa', '%'.$q.'%') + ->limit(50) + ->toArray(); + + foreach ($rows as $row) { + $code = trim((string) ($row['kode_kfa'] ?? '')); + $display = trim((string) ($row['nama_kfa'] ?? '')); + if ($code === '') continue; + $items[] = [ + 'kode_kfa' => $code, + 'nama_kfa' => $display, + 'text' => '['.$code.'] '.($display !== '' ? $display : $code), + 'kode_bahan' => (string) ($row['kode_bahan'] ?? ''), + 'nama_bahan' => (string) ($row['nama_bahan'] ?? ''), + 'numerator' => (string) ($row['numerator'] ?? ''), + 'satuan_num' => (string) ($row['satuan_num'] ?? ''), + 'denominator' => (string) ($row['denominator'] ?? ''), + 'satuan_den' => (string) ($row['satuan_den'] ?? ''), + 'nama_satuan_den' => (string) ($row['nama_satuan_den'] ?? ''), + 'kode_sediaan' => (string) ($row['kode_sediaan'] ?? ''), + 'nama_sediaan' => (string) ($row['nama_sediaan'] ?? '') + ]; + } + } + + echo json_encode(htmlspecialchars_array($items), true); + exit(); } - public function anyPasien() + public function postSaveRad() { - $response = []; - if (isset($_POST['nik_pasien']) && $_POST['nik_pasien'] != '') { - $response = json_decode($this->getPatient($_POST['nik_pasien'])); + if (isset($_POST['simpan'])) { + $query = $this->db('mlite_satu_sehat_mapping_rad')->save( + [ + 'kd_jenis_prw' => $_POST['kd_jenis_prw'], + 'code' => $_POST['code'], + 'system' => $_POST['code_system'], + 'display' => $_POST['display'], + 'sampel_code' => $_POST['sample_code'], + 'sampel_system' => $_POST['sample_system'], + 'sampel_display' => $_POST['sample_display'] + ] + ); + + if ($query) { + $this->notify('success', 'Mapping radiologi telah disimpan'); + } else { + $this->notify('danger', 'Mapping radiologi gagal disimpan'); + } } - return $this->draw('pasien.html', ['response' => json_encode($response, JSON_PRETTY_PRINT)]); + + if (isset($_POST['hapus'])) { + $query = $this->db('mlite_satu_sehat_mapping_rad') + ->where('kd_jenis_prw', $_POST['kd_jenis_prw']) + ->delete(); + if ($query) { + $this->notify('success', 'Mapping radiologi telah dihapus'); + } else { + $this->notify('danger', 'Mapping radiologi gagal dihapus'); + } + } + + redirect(url([ADMIN, 'satu_sehat', 'mappingrad'])); } - public function getDepartemen() + public function postSaveLab() { - $poli = $this->db('poliklinik')->where('status', '1')->toArray(); - $mlite_satset = $this->db('mlite_satu_sehat_departemen')->toArray(); - $satu_sehat = []; - foreach ($mlite_satset as $value) { - $nama = $this->core->getDepartemenInfo($value['dep_id']); - if ($nama == '') { - $nama = $this->core->getPoliklinikInfo('nm_poli', $value['dep_id']); + if (isset($_POST['simpan'])) { + $id_template = (int) ($_POST['id_template'] ?? 0); + $kd_jenis_prw = trim((string) ($_POST['kd_jenis_prw'] ?? '')); + if ($id_template <= 0) { + $this->notify('danger', 'Perawatan belum dipilih'); + redirect(url([ADMIN, 'satu_sehat', 'mappinglab'])); + } + if ($kd_jenis_prw === '') { + $tpl = $this->db('template_laboratorium')->where('id_template', $id_template)->oneArray(); + $kd_jenis_prw = trim((string) ($tpl['kd_jenis_prw'] ?? '')); + } + $query = $this->db('mlite_satu_sehat_mapping_lab')->save( + [ + 'id_template' => $id_template, + 'kd_jenis_prw' => $kd_jenis_prw, + 'code' => $_POST['code'], + 'system' => $_POST['code_system'], + 'display' => $_POST['display'], + 'sampel_code' => $_POST['sample_code'], + 'sampel_system' => $_POST['sample_system'], + 'sampel_display' => $_POST['sample_display'] + ] + ); + + if ($query) { + $this->notify('success', 'Mapping laboratorium telah disimpan'); + } else { + $this->notify('danger', 'Mapping laboratorium gagal disimpan'); } - $value['nama'] = $nama; - $satu_sehat[] = $value; } - return $this->draw('departemen.html', ['departemen' => $this->db('departemen')->toArray(), 'poli' => $poli, 'satu_sehat_departemen' => $satu_sehat]); + + if (isset($_POST['hapus'])) { + $id_template = (int) ($_POST['id_template'] ?? 0); + if ($id_template <= 0) { + $this->notify('danger', 'Perawatan belum dipilih'); + redirect(url([ADMIN, 'satu_sehat', 'mappinglab'])); + } + $query = $this->db('mlite_satu_sehat_mapping_lab') + ->where('id_template', $id_template) + ->delete(); + if ($query) { + $this->notify('success', 'Mapping laboratorium telah dihapus'); + } else { + $this->notify('danger', 'Mapping laboratorium gagal dihapus'); + } + } + + redirect(url([ADMIN, 'satu_sehat', 'mappinglab'])); } public function postSaveDepartemen() { - if(isset($_POST['simpan'])) { + if (isset($_POST['simpan'])) { $get_id_organisasi_satusehat = json_decode($this->getOrganization($_POST['dep_id'])); - // $id_organisasi_satusehat = $get_id_organisasi_satusehat->id; - - // echo json_encode($get_id_organisasi_satusehat, true); - if($get_id_organisasi_satusehat->issue[0]->code == 'duplicate') { + if ($get_id_organisasi_satusehat->issue[0]->code == 'duplicate') { $curl = curl_init(); @@ -2255,35 +2794,34 @@ public function postSaveDepartemen() CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), CURLOPT_CUSTOMREQUEST => 'GET', )); - + $response = curl_exec($curl); - + curl_close($curl); - + $get_id_organisasi_satusehat = json_decode($response); $get_id_organisasi_satusehat = json_encode($get_id_organisasi_satusehat, true); // echo $get_id_organisasi_satusehat; foreach (json_decode($get_id_organisasi_satusehat)->entry as $item) { - if ($item->resource->identifier[0]->value == $_POST['dep_id']) { - $id_organisasi_satusehat = $item->resource->id; - echo $id_organisasi_satusehat; - } - } - + if ($item->resource->identifier[0]->value == $_POST['dep_id']) { + $id_organisasi_satusehat = $item->resource->id; + echo $id_organisasi_satusehat; + } + } } - - if($id_organisasi_satusehat !='') { + + if ($id_organisasi_satusehat != '') { $query = $this->db('mlite_satu_sehat_departemen')->save( [ - 'dep_id' => $_POST['dep_id'], + 'dep_id' => $_POST['dep_id'], 'id_organisasi_satusehat' => $id_organisasi_satusehat ] - ); - if($query){ + ); + if ($query) { $this->notify('success', 'Mapping departemen telah disimpan'); } else { $this->notify('danger', 'Mapping departemen gagal disimpan'); @@ -2305,16 +2843,3227 @@ public function postSaveDepartemen() } } - if (isset($_POST['hapus'])) { - $query = $this->db('mlite_satu_sehat_departemen') - ->where('id_organisasi_satusehat', $_POST['id_organisasi_satusehat']) - ->delete(); - if ($query) { - $this->notify('success', 'Mapping departemen telah dihapus'); + if (isset($_POST['hapus'])) { + $query = $this->db('mlite_satu_sehat_departemen') + ->where('id_organisasi_satusehat', $_POST['id_organisasi_satusehat']) + ->delete(); + if ($query) { + $this->notify('success', 'Mapping departemen telah dihapus'); + } + } + + redirect(url([ADMIN, 'satu_sehat', 'departemen'])); + } + + public function getProcedure($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $nm_poli = $this->core->getPoliklinikInfo('nm_poli', $kd_poli); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $no_ktp_dokter = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); + $prosedur_pasien = $this->db('prosedur_pasien') + ->join('icd9', 'icd9.kode=prosedur_pasien.kode') + ->where('no_rawat', $no_rawat) + ->where('prosedur_pasien.status', $status_lanjut) + ->where('prioritas', '1') + ->oneArray(); + + $pemeriksaan_ralan = $this->db('pemeriksaan_ralan')->where('no_rawat', $no_rawat)->oneArray(); + + if (!is_array($prosedur_pasien) || !isset($prosedur_pasien['kode']) || !isset($prosedur_pasien['deskripsi_panjang'])) { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Procedure', 'missing' => ['prosedur_pasien.kode' => 'missing', 'prosedur_pasien.deskripsi_panjang' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('procedure.html', ['pesan' => 'Gagal mengirim procedure platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + + $kode_icd9 = $prosedur_pasien['kode']; + $deskripsi_icd9 = $prosedur_pasien['deskripsi_panjang']; + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Procedure', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('procedure.html', ['pesan' => 'Gagal mengirim procedure platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + $id_encounter = $mlite_satu_sehat_response['id_encounter']; + $tgl_pulang = isset_or($mlite_billing['tgl_billing'], $pemeriksaan_ralan['tgl_perawatan']); + $jam_pulang = isset_or($mlite_billing['jam_billing'], $pemeriksaan_ralan['jam_rawat']); + + $kunjungan = 'Kunjungan'; + if ($status_lanjut == 'Ranap') { + $kunjungan = 'Perawatan'; + } + + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/Procedure', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => '{ + "resourceType": "Procedure", + "status": "completed", + "category": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "103693007", + "display": "Diagnostic procedure" + } + ], + "text":"Diagnostic procedure" + }, + "code": { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-9-cm", + "code": "' . $kode_icd9 . '", + "display": "' . $deskripsi_icd9 . '" + + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nama_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $id_encounter . '", + "display": "Prosedur kepada ' . $nama_pasien . ' selama ' . $kunjungan . ' dari tanggal ' . $tgl_registrasi . 'T' . $jam_reg . '' . $zonawaktu . ' sampai ' . $tgl_pulang . 'T' . $jam_pulang . '' . $zonawaktu . '" + }, + "performedPeriod": { + "start": "' . $tgl_registrasi . 'T' . $jam_reg . '' . $zonawaktu . '", + "end": "' . $tgl_pulang . 'T' . $jam_pulang . '' . $zonawaktu . '" + } + }', + )); + + $response = curl_exec($curl); + + $id_procedure = isset(json_decode($response)->id) ? json_decode($response)->id : null; + $pesan = 'Gagal mengirim procedure platform Satu Sehat!!'; + if ($id_procedure) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_procedure' => $id_procedure + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_procedure' => $id_procedure + ]); + } + $pesan = 'Sukses mengirim procedure platform Satu Sehat!!'; + } + + curl_close($curl); + // echo $response; + if ($render) { + echo $this->draw('procedure.html', ['pesan' => $pesan, 'response' => $response]); + } else { + $data = json_decode($response); + echo $data ? json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) : $response; + } + exit(); + } + + public function getDietGizi($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $nm_poli = $this->core->getPoliklinikInfo('nm_poli', $kd_poli); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $no_ktp_dokter = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id')->where('kd_dokter', $kd_dokter)->oneArray(); + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Diet Gizi', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('dietgizi.html', ['pesan' => 'Gagal mengirim diet gizi platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + $id_encounter = $mlite_satu_sehat_response['id_encounter']; + + $date = date('Y-m-d'); + $time = date('H:i:s'); + + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $adime_gizi = $this->db('catatan_adime_gizi')->where('no_rawat', $no_rawat)->oneArray(); + $instruksi = isset_or($adime_gizi['instruksi'], ''); + + $curl = curl_init(); + + $data = '{ + "resourceType" : "Composition", + "identifier" : { + "system" : "http://sys-ids.kemkes.go.id/composition/' . $this->organizationid . '", + "value" : "' . $no_rawat . '" + }, + "status" : "final", + "type" : { + "coding" : [ + { + "system" : "http://loinc.org", + "code" : "18842-5", + "display" : "Discharge summary" + } + ] + }, + "category" : [ + { + "coding" : [ + { + "system" : "http://loinc.org", + "code" : "LP173421-1", + "display" : "Report" + } + ] + } + ], + "subject" : { + "reference" : "Patient/' . $id_pasien . '", + "display" : "' . $nama_pasien . '" + }, + "encounter" : { + "reference" : "Encounter/' . $id_encounter . '", + "display" : "Kunjungan ' . $nama_pasien . ' pada tanggal ' . $tgl_registrasi . ' dengan nomor kunjungan ' . $no_rawat . '" + }, + "date" : "' . $date . 'T' . $time . '' . $zonawaktu . '", + "author" : [ + { + "reference" : "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display" : "' . $nama_dokter . '" + } + ], + "title" : "Modul Gizi", + "custodian" : { + "reference" : "Organization/' . $this->organizationid . '" + }, + "section" : [ + { + "code" : { + "coding" : [ + { + "system" : "http://loinc.org", + "code" : "42344-2", + "display" : "Discharge diet (narrative)" + } + ] + }, + "text" : { + "status" : "additional", + "div" : "' . $instruksi . '" + } + } + ] + }'; + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/Composition', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data + )); + + $response = curl_exec($curl); + + $id_composition = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim composition platform Satu Sehat!!'; + if ($id_composition) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_composition' => $id_composition + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_composition' => $id_composition + ]); + } + $pesan = 'Sukses mengirim id_composition platform Satu Sehat!!'; + } + + curl_close($curl); + // echo $response; + // echo '
                  ' . $data . '
                  '; + if ($render) { + echo $this->draw('dietgizi.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getQuestionnaire($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $nm_poli = $this->core->getPoliklinikInfo('nm_poli', $kd_poli); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $no_ktp_dokter = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id')->where('kd_dokter', $kd_dokter)->oneArray(); + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Diet Gizi', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('dietgizi.html', ['pesan' => 'Gagal mengirim diet gizi platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + $id_encounter = $mlite_satu_sehat_response['id_encounter']; + + $date = date('Y-m-d'); + $time = date('H:i:s'); + + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $adime_gizi = $this->db('catatan_adime_gizi')->where('no_rawat', $no_rawat)->oneArray(); + $instruksi = isset_or($adime_gizi['instruksi'], ''); + + $catatan_perawatan = $this->db('catatan_perawatan')->where('no_rawat', $no_rawat)->where('kd_dokter', $kd_dokter)->where('catatan', 'KPS')->oneArray(); + + $curl = curl_init(); + + $data = '{ + "resourceType": "QuestionnaireResponse", + "questionnaire": "https://fhir.kemkes.go.id/Questionnaire/Q0002", + "status": "completed", + "subject": { + "reference" : "Patient/' . $id_pasien . '", + "display" : "' . $nama_pasien . '" + }, + "encounter": { + "reference" : "Encounter/' . $id_encounter . '" + }, + "authored": "' . $catatan_perawatan['tanggal'] . 'T' . $catatan_perawatan['jam'] . '' . $zonawaktu . '", + "author": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '" + }, + "source": { + "reference": "Patient/' . $id_pasien . '" + }, + "item": [ + { + "linkId": "1", + "text": "Status Kesejahteraan", + "answer": [ + { + "valueString": "Keluarga Pra Sejahtera (KPS)" + } + ] + } + ] + }'; + + // echo '
                  ' . $data . '
                  '; + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/QuestionnaireResponse', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data + )); + + $response = curl_exec($curl); + + $id_questionnaire = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim questionnaire response platform Satu Sehat!!'; + if ($id_questionnaire) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_questionnaire' => $id_questionnaire + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_questionnaire' => $id_questionnaire + ]); + } + $pesan = 'Sukses mengirim questionnaire response platform Satu Sehat!!'; + } + + curl_close($curl); + // echo $response; + // echo '
                  ' . $data . '
                  '; + if ($render) { + echo $this->draw('questionnaire.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getVaksin($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + + // Data resep dan mapping obat + $row['medications'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep = resep_obat.no_resep') + ->join('mlite_satu_sehat_mapping_obat', 'mlite_satu_sehat_mapping_obat.kode_brng = resep_dokter.kode_brng') + ->where('mlite_satu_sehat_mapping_obat.type', 'vaksin') + ->where('no_rawat', $no_rawat) + ->toArray(); + + // Data pasien dan dokter + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Vaksin', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('vaksin.html', ['pesan' => 'Gagal mengirim vaksin platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + $id_encounter = $mlite_satu_sehat_response['id_encounter']; + + foreach ($row['medications'] as $i => $obat) { + $medReqId = $this->gen_uuid(); + $medId = $obat['no_resep'] . '' . $obat['kode_brng']; + $medUuid = "urn:uuid:" . $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if (is_string($obat['satuan_den']) && ctype_digit($obat['satuan_den'])) { + $system_cek = 'http://snomed.info/sct'; + } + + // Parsing aturan pakai + if (preg_match_all('/\d+/', $obat['aturan_pakai'], $m) && count($m[0]) >= 2) { + $frequency = (int) $m[0][0]; + $doseValue = (int) $m[0][1]; + } else { + $frequency = 1; + $doseValue = 1; + } + + // $duration = max(1, (int)round($obat['jml'] / $frequency / $doseValue)); + // $startDate = $obat['tgl_peresepan']; + // $endDate = date('Y-m-d', strtotime("$startDate +{$duration} days")); + + // $satu_sehat_mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $obat['kode_brng'])->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $kd_poli)->oneArray(); + $databarang = $this->db('databarang')->where('kode_brng', $obat['kode_brng'])->oneArray(); + $gudangbarang = $this->db('gudangbarang')->where('kode_brng', $obat['kode_brng'])->where('kd_bangsal', $this->core->getSettings('satu_sehat', 'farmasi'))->oneArray(); + // $batch['no_batch'] = '121212'; + + $batch['no_batch'] = !empty($gudangbarang['no_batch']) + ? $gudangbarang['no_batch'] + : 'BATCH-' . date('YmdHis'); + + $data = '{ + "resourceType": "Immunization", + "status": "completed", + "vaccineCode": { + "coding": [ + { + "system": "http://sys-ids.kemkes.go.id/kfa", + "code": "' . $obat['kode_kfa'] . '", + "display": "' . $obat['nama_kfa'] . '" + } + ] + }, + "patient": { + "reference": "Patient/' . $id_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $id_encounter . '" + }, + "occurrenceDateTime": "' . $obat['tgl_perawatan'] . 'T' . $obat['jam'] . '' . $zonawaktu . '", + "expirationDate": "' . $databarang['expire'] . '", + "recorded": "' . $obat['tgl_perawatan'] . 'T' . $obat['jam'] . '' . $zonawaktu . '", + "primarySource": true, + "location": { + "reference": "Location/' . $mlite_satu_sehat_lokasi['id_lokasi_satusehat'] . '", + "display": "' . $mlite_satu_sehat_lokasi['lokasi'] . '" + }, + "lotNumber": "' . $batch['no_batch'] . '", + "route": { + "coding": [ + { + "system": "http://www.whocc.no/atc", + "code": "' . $obat['kode_route'] . '", + "display": "' . $obat['nama_route'] . '" + } + ] + }, + "doseQuantity": { + "value": ' . (int) $obat['jml'] . ', + "unit": "' . $obat['satuan_num'] . '", + "system": "' . $obat['system_num'] . '", + "code": "' . $obat['satuan_num'] . '" + }, + "performer": [ + { + "function": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0443", + "code": "AP", + "display": "Administering Provider" + } + ] + }, + "actor": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '" + } + } + ], + "reasonCode": [ + { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/immunization-reason", + "code": "IM-Program", + "display" : "Imunisasi Program" + } + ] + } + ], + "protocolApplied" : [ + { + "doseNumberPositiveInt" : ' . (int) $doseValue . ' + } + ] + }'; + + $url = $this->fhirurl . '/Immunization'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_immunization = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim vaksin/imunisasi platform Satu Sehat!!'; + if ($id_immunization) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_immunization' => $id_immunization + ]); + $pesan = 'Sukses mengirim vaksin/imunisasi platform Satu Sehat!!'; + } + + curl_close($curl); + + // echo '
                  '. $data. '
                  '; + + } + + if ($render) { + echo $this->draw('vaksin.html', ['pesan' => isset($pesan) ? $pesan : '', 'response' => isset($response) ? $response : '']); + } else { + echo isset($response) ? $response : ''; + } + exit(); + } + + public function getClinicalImpression($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + $no_rawat = revertNoRawat($no_rawat); + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $pemeriksaan_ralan = $this->db('pemeriksaan_ralan')->where('no_rawat', $no_rawat)->oneArray(); + + $keluhan = isset_or($pemeriksaan_ralan['keluhan'], ''); + $pemeriksaan = isset_or($pemeriksaan_ralan['pemeriksaan'], ''); + $penilaian = isset_or($pemeriksaan_ralan['penilaian'], ''); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $tgl_perawatan = isset_or($pemeriksaan_ralan['tgl_perawatan'], date('Y-m-d')); + $jam_rawat = isset_or($pemeriksaan_ralan['jam_rawat'], date('H:i:s')); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi')->select('practitioner_id')->where('kd_dokter', $kd_dokter)->oneArray(); + $nama_dokter = $this->db('dokter')->where('kd_dokter', $kd_dokter)->oneArray(); + $id_condition = isset_or($mlite_satu_sehat_response['id_condition'], ''); + $diagnosa_pasien = $this->db('diagnosa_pasien') + ->join('penyakit', 'penyakit.kd_penyakit=diagnosa_pasien.kd_penyakit') + ->where('no_rawat', $no_rawat) + ->where('prioritas', '1') + ->oneArray(); + + $kd_penyakit = isset_or($diagnosa_pasien['kd_penyakit'], ''); + $nm_penyakit = isset_or($diagnosa_pasien['nm_penyakit'], ''); + + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + $resp = json_encode(['error' => 'Data tidak lengkap untuk Clinical Impression', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('clinical.impression.html', ['pesan' => 'Gagal mengirim clinical impression platform Satu Sehat!!', 'response' => $resp]); + } else { + echo $resp; + } + exit(); + } + + $id_encounter = $mlite_satu_sehat_response['id_encounter']; + + $data = '{ + "resourceType": "ClinicalImpression", + "status": "completed", + "description": "Evaluasi klinis untuk pasien dengan ' . $keluhan . ', ' . $pemeriksaan . '.", + "subject": { + "reference": "Patient/' . $id_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $id_encounter . '" + }, + "effectiveDateTime": "' . $tgl_perawatan . 'T' . $jam_rawat . '' . $zonawaktu . '", + "date": "' . $tgl_perawatan . 'T' . $jam_rawat . '' . $zonawaktu . '", + "assessor": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '" + }, + "summary": "' . $penilaian . '", + "finding": [ + { + "itemCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-10", + "code": "' . $kd_penyakit . '", + "display": "' . $nm_penyakit . '" + } + ] + }, + "itemReference": { + "reference": "Condition/' . $id_condition . '" + } + } + ], + "prognosisCodeableConcept": [ + { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "PR000001", + "display": "Prognosis" + } + ] + } + ] + }'; + + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/ClinicalImpression', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_clinical_impression = isset(json_decode($response)->id) ? json_decode($response)->id : null; + $pesan = 'Gagal mengirim clinical impression platform Satu Sehat!!'; + if ($id_clinical_impression) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_clinical_impression' => $id_clinical_impression + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_clinical_impression' => $id_clinical_impression + ]); + } + $pesan = 'Sukses mengirim clinical impression platform Satu Sehat!!'; + } + + curl_close($curl); + // echo '
                  ' . $data . '
                  '; + + if ($render) { + echo $this->draw('clinical.impression.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getMedication(string $no_rawat = '', string $tipe = 'request', $render = true) + { + // Zona waktu + $zonawaktu = match ($this->settings->get('satu_sehat.zonawaktu')) { + 'WITA' => '+08:00', + 'WIT' => '+09:00', + default => '+07:00', + }; + + $kode_brng = $no_rawat; + $no_rawat = revertNoRawat($no_rawat); + + if ($tipe === 'request') { + + // Data resep dan mapping obat + $row['medications'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep = resep_obat.no_resep') + ->join('mlite_satu_sehat_mapping_obat', 'mlite_satu_sehat_mapping_obat.kode_brng = resep_dokter.kode_brng') + ->where('mlite_satu_sehat_mapping_obat.type', 'obat') + ->where('no_rawat', $no_rawat) + ->toArray(); + + if (count($row['medications']) === 0) { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication Request', 'missing' => ['noresep' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + foreach ($row['medications'] as $i => $obat) { + $medReqId = $this->gen_uuid(); + $medId = $obat['no_resep'] . '' . $obat['kode_brng']; + $medUuid = "urn:uuid:" . $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if (ctype_digit($obat['satuan_den'])) { + $system_cek = 'http://snomed.info/sct'; + } + + // Parsing aturan pakai + if (preg_match_all('/\d+/', $obat['aturan_pakai'], $m) && count($m[0]) >= 2) { + $frequency = (int) $m[0][0]; + $doseValue = (int) $m[0][1]; + } else { + $frequency = 1; + $doseValue = 1; + } + + // $duration = max(1, (int)round($obat['jml'] / $frequency / $doseValue)); + // $startDate = $obat['tgl_peresepan']; + // $endDate = date('Y-m-d', strtotime("$startDate +{$duration} days")); + + $satu_sehat_mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $obat['kode_brng'])->oneArray(); + + $data = '{ + "resourceType": "MedicationRequest", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/prescription/' . $this->organizationid . '", + "use": "official", + "value": "' . $obat['no_resep'] . '" + }, + { + "system": "http://sys-ids.kemkes.go.id/prescription-item/' . $this->organizationid . '", + "use": "official", + "value": "' . $obat['kode_brng'] . '" + } + ], + "status": "completed", + "intent": "order", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category", + "code": "outpatient", + "display": "Outpatient" + } + ] + } + ], + "medicationReference": { + "reference": "Medication/' . $satu_sehat_mapping_obat['id_medication'] . '", + "display": "' . $obat['nama_kfa'] . '" + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "authoredOn": "' . $obat['tgl_peresepan'] . 'T' . $obat['jam_peresepan'] . '' . $zonawaktu . '", + "requester": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + }, + "dosageInstruction": [ + { + "sequence": 1, + "patientInstruction": "' . $obat['aturan_pakai'] . '", + "timing": { + "repeat": { + "frequency": ' . $doseValue . ', + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "system": "http://www.whocc.no/atc", + "code": "' . $obat['kode_route'] . '", + "display": "' . $obat['nama_route'] . '" + } + ] + }, + "doseAndRate": [ + { + "doseQuantity": { + "value": ' . $frequency . ', + "unit": "' . $obat['satuan_den'] . '", + "system": "' . $system_cek . '", + "code": "' . $obat['satuan_den'] . '" + } + } + ] + } + ], + "dispenseRequest": { + "quantity": { + "value": ' . $obat['jml'] . ', + "unit": "' . $obat['satuan_den'] . '", + "system": "' . $system_cek . '", + "code": "' . $obat['satuan_den'] . '" + }, + "performer": { + "reference": "Organization/' . $this->organizationid . '" + } + } + }'; + + $url = $this->fhirurl . '/MedicationRequest'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_medication_request = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim medication request platform Satu Sehat!!'; + if ($id_medication_request) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_medication_request' => $id_medication_request + ]); + $pesan = 'Sukses mengirim medication request platform Satu Sehat!!'; + } + + curl_close($curl); + + // echo '
                  '. $data. '
                  '; + + } + } else if ($tipe === 'dispense') { + // Data resep dan mapping obat + $row['medications'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep = resep_obat.no_resep') + ->join('mlite_satu_sehat_mapping_obat', 'mlite_satu_sehat_mapping_obat.kode_brng = resep_dokter.kode_brng') + ->where('mlite_satu_sehat_mapping_obat.type', 'obat') + ->where('no_rawat', $no_rawat) + ->toArray(); + + if (count($row['medications']) === 0) { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication Dispense', 'missing' => ['noresep' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'farmasi'))->oneArray(); + + foreach ($row['medications'] as $i => $obat) { + $medReqId = $this->gen_uuid(); + $medId = $obat['no_resep'] . '' . $obat['kode_brng']; + $medUuid = "urn:uuid:" . $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if (ctype_digit($obat['satuan_den'])) { + $system_cek = 'http://snomed.info/sct'; + } + + // Parsing aturan pakai + if (preg_match_all('/\d+/', $obat['aturan_pakai'], $m) && count($m[0]) >= 2) { + $frequency = (int) $m[0][0]; + $doseValue = (int) $m[0][1]; + } else { + $frequency = 1; + $doseValue = 1; + } + + // $duration = max(1, (int)round($obat['jml'] / $frequency / $doseValue)); + // $startDate = $obat['tgl_peresepan']; + // $endDate = date('Y-m-d', strtotime("$startDate +{$duration} days")); + + $satu_sehat_mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $obat['kode_brng'])->oneArray(); + + $data = '{ + "resourceType": "MedicationDispense", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/prescription/' . $this->organizationid . '", + "use": "official", + "value": "' . $obat['no_resep'] . '" + }, + { + "system": "http://sys-ids.kemkes.go.id/prescription-item/' . $this->organizationid . '", + "use": "official", + "value": "' . $obat['kode_brng'] . '" + } + ], + "status": "completed", + "category": { + "coding": [ + { + "system": "http://terminology.hl7.org/fhir/CodeSystem/medicationdispense-category", + "code": "outpatient", + "display": "Outpatient" + } + ] + }, + "medicationReference": { + "reference": "Medication/' . $satu_sehat_mapping_obat['id_medication'] . '", + "display": "' . $obat['nama_kfa'] . '" + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "context": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "performer": [ + { + "actor": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + } + } + ], + "location": { + "reference": "Location/' . $mlite_satu_sehat_lokasi['id_lokasi_satusehat'] . '", + "display": "' . $mlite_satu_sehat_lokasi['lokasi'] . '" + }, + "authorizingPrescription": [{ + "reference": "MedicationRequest/' . $mlite_satu_sehat_response['id_medication_request'] . '" + }], + "quantity": { + "system": "' . $system_cek . '", + "code": "' . $obat['satuan_den'] . '", + "value": ' . $obat['jml'] . ' + }, + "whenPrepared": "' . $obat['tgl_peresepan'] . 'T' . $obat['jam_peresepan'] . '' . $zonawaktu . '", + "whenHandedOver": "' . $obat['tgl_perawatan'] . 'T' . $obat['jam'] . '' . $zonawaktu . '", + "dosageInstruction": [ + { + "sequence": 1, + "text": "' . $obat['aturan_pakai'] . '", + "timing": { + "repeat": { + "frequency": ' . $doseValue . ', + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "system": "http://www.whocc.no/atc", + "code": "' . $obat['kode_route'] . '", + "display": "' . $obat['nama_route'] . '" + } + ] + }, + "doseAndRate": [ + { + "doseQuantity": { + "value": ' . $frequency . ', + "unit": "' . $obat['satuan_den'] . '", + "system": "' . $system_cek . '", + "code": "' . $obat['satuan_den'] . '" + } + } + ] + } + ] + }'; + + $url = $this->fhirurl . '/MedicationDispense'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_medication_dispense = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim medication dispense platform Satu Sehat!!'; + if ($id_medication_dispense) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_medication_dispense' => $id_medication_dispense + ]); + $pesan = 'Sukses mengirim medication dispense platform Satu Sehat!!'; + } + + curl_close($curl); + + // echo '
                  '. $data. '
                  '; + + } + } else if ($tipe === 'statement') { + + // Data resep dan mapping obat + $row['medications'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep = resep_obat.no_resep') + ->join('mlite_satu_sehat_mapping_obat', 'mlite_satu_sehat_mapping_obat.kode_brng = resep_dokter.kode_brng') + ->where('mlite_satu_sehat_mapping_obat.type', 'obat') + ->where('no_rawat', $no_rawat) + ->toArray(); + + if (count($row['medications']) === 0) { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication Dispense', 'missing' => ['noresep' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Medication', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'farmasi'))->oneArray(); + + foreach ($row['medications'] as $i => $obat) { + $medReqId = $this->gen_uuid(); + $medId = $obat['no_resep'] . '' . $obat['kode_brng']; + $medUuid = "urn:uuid:" . $this->gen_uuid(); + $system_cek = 'http://terminology.hl7.org/CodeSystem/v3-orderableDrugForm'; + if (ctype_digit($obat['satuan_den'])) { + $system_cek = 'http://snomed.info/sct'; + } + + // Parsing aturan pakai + if (preg_match_all('/\d+/', $obat['aturan_pakai'], $m) && count($m[0]) >= 2) { + $frequency = (int) $m[0][0]; + $doseValue = (int) $m[0][1]; + } else { + $frequency = 1; + $doseValue = 1; + } + + // $duration = max(1, (int)round($obat['jml'] / $frequency / $doseValue)); + // $startDate = $obat['tgl_peresepan']; + // $endDate = date('Y-m-d', strtotime("$startDate +{$duration} days")); + + $satu_sehat_mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $obat['kode_brng'])->oneArray(); + + $data = '{ + "resourceType": "MedicationStatement", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/medicationstatement/' . $this->organizationid . '", + "use": "official", + "value": "' . $obat['no_resep'] . '-' . $obat['kode_brng'] . '" + } + ], + "status": "completed", + "category": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/medication-statement-category", + "code": "outpatient", + "display": "Outpatient" + } + ] + }, + "medicationReference": { + "reference": "Medication/' . $satu_sehat_mapping_obat['id_medication'] . '", + "display": "' . $obat['nama_kfa'] . '" + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "dosage": [ + { + "text": "' . $obat['aturan_pakai'] . '", + "timing": { + "repeat": { + "frequency": ' . $doseValue . ', + "period": 1, + "periodUnit": "d" + } + }, + "route": { + "coding": [ + { + "system": "http://www.whocc.no/atc", + "code": "' . $obat['kode_route'] . '", + "display": "' . $obat['nama_route'] . '" + } + ] + }, + "doseAndRate": [ + { + "doseQuantity": { + "value": ' . $frequency . ', + "unit": "' . $obat['satuan_den'] . '", + "system": "' . $system_cek . '", + "code": "' . $obat['satuan_den'] . '" + } + } + ] + } + ], + "dateAsserted": "' . $obat['tgl_penyerahan'] . 'T' . $obat['jam_penyerahan'] . '' . $zonawaktu . '", + "informationSource": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "context": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "note": [{ + "text": "Sudah dilakukan proses telaah obat oleh petugas dan obat sudah diserahkan ke pasien." + }] + }'; + + // echo '
                  '. $data. '
                  '; + + $url = $this->fhirurl . '/MedicationStatement'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_medication_statement = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim medication statement platform Satu Sehat!!'; + if ($id_medication_statement) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_medication_statement' => $id_medication_statement + ]); + $pesan = 'Sukses mengirim medication statement platform Satu Sehat!!'; + } + + curl_close($curl); + + } + } else if ($tipe == 'mapping') { + $satu_sehat_mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->where('kode_brng', $kode_brng)->oneArray(); + $data = '{ + "resourceType": "Medication", + "meta": { + "profile": [ + "https://fhir.kemkes.go.id/r4/StructureDefinition/Medication" + ] + }, + "identifier": [ + { + "system" : "http://sys-ids.kemkes.go.id/medication/' . $this->organizationid . '", + "use": "official", + "value" : "' . $satu_sehat_mapping_obat['kode_brng'] . '" + } + ], + "code": { + "coding": [ + { + "system": "http://sys-ids.kemkes.go.id/kfa", + "code": "' . $satu_sehat_mapping_obat['kode_kfa'] . '", + "display": "' . $satu_sehat_mapping_obat['nama_kfa'] . '" + } + ] + }, + "status": "active", + "form": { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/medication-form", + "code": "' . $satu_sehat_mapping_obat['kode_sediaan'] . '", + "display": "' . $satu_sehat_mapping_obat['nama_sediaan'] . '" + } + ] + }, + "extension": [ + { + "url": "https://fhir.kemkes.go.id/r4/StructureDefinition/MedicationType", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/medication-type", + "code": "NC", + "display": "Non-compound" + } + ] + } + } + ] + }'; + + $url = $this->fhirurl . '/Medication'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $data, + )); + + $response = curl_exec($curl); + + $id_medication = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim mapping medication platform Satu Sehat!!'; + if ($id_medication) { + $this->db('mlite_satu_sehat_mapping_obat') + ->where('kode_brng', $kode_brng) + ->save([ + 'id_medication' => $id_medication + ]); + $pesan = 'Sukses mengirim mapping medication platform Satu Sehat!!'; + } + + curl_close($curl); + } + + if ($render) { + echo $this->draw('medication.html', [ + 'pesan' => isset_or($pesan, ''), + 'response' => isset_or($response, '') + ]); + } else { + echo isset($response) ? $response : ''; + } + exit(); + } + + public function getLaboratory(string $no_rawat = '', string $tipe = 'request', $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + $permintaan_lab = $this->db('permintaan_lab') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $no_rawat = revertNoRawat($no_rawat); + $pesan = ''; + $response = ''; + $laboratory = ''; + + if ($tipe == 'request') { + + $row['permintaan_lab'] = $this->db('permintaan_lab') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_lab']) || !isset($row['permintaan_lab']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory request', 'missing' => ['permintaan_lab.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_lab'] = $this->db('permintaan_pemeriksaan_lab') + ->join('jns_perawatan_lab', 'jns_perawatan_lab.kd_jenis_prw = permintaan_pemeriksaan_lab.kd_jenis_prw') + ->where('noorder', $row['permintaan_lab']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_lab']) || !isset($row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory request', 'missing' => ['permintaan_pemeriksaan_lab.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_lab = $this->db('mlite_satu_sehat_mapping_lab')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory request', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'laboratorium'))->oneArray(); + + $laboratory = ' + { + "resourceType": "ServiceRequest", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/servicerequest/' . $this->organizationid . '", + "value": "' . $row['permintaan_pemeriksaan_lab']['noorder'] . '" + } + ], + "status": "active", + "intent": "order", + "priority": "routine", + "category": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "108252007", + "display": "Laboratory procedure" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_lab['system'], 'http://loinc.org') . '", + "code": "' . $mapping_lab['code'] . '", + "display": "' . $mapping_lab['display'] . '" + } + ], + "text": "' . $row['permintaan_pemeriksaan_lab']['nm_perawatan'] . '" + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "occurrenceDateTime": "' . $row['permintaan_lab']['tgl_permintaan'] . 'T' . $row['permintaan_lab']['jam_permintaan'] . $zonawaktu . '", + "requester": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + }, + "performer": [ + { + "reference": "Organization/' . $mlite_satu_sehat_lokasi['id_organisasi_satusehat'] . '", + "display": "' . $mlite_satu_sehat_lokasi['lokasi'] . '" + } + ], + "reasonCode": [ + { + "text": "' . $row['permintaan_lab']['diagnosa_klinis'] . '" + } + ] + } + '; + + $url = $this->fhirurl . '/ServiceRequest'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . $this->getAccessToken()), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $laboratory, + )); + + $response = curl_exec($curl); + + $id_laboratory_request = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim laboratory request lab PK platform Satu Sehat!!'; + if ($id_laboratory_request) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_lab_pk_request' => $id_laboratory_request + ]); + $pesan = 'Sukses mengirim laboratory request lab PK platform Satu Sehat!!'; + } + + curl_close($curl); + + } + if ($tipe == 'specimen') { + + $row['permintaan_lab'] = $this->db('permintaan_lab') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_lab']) || !isset($row['permintaan_lab']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory specimen', 'missing' => ['permintaan_lab.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_lab'] = $this->db('permintaan_pemeriksaan_lab') + ->join('jns_perawatan_lab', 'jns_perawatan_lab.kd_jenis_prw = permintaan_pemeriksaan_lab.kd_jenis_prw') + ->where('noorder', $row['permintaan_lab']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_lab']) || !isset($row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory specimen', 'missing' => ['permintaan_pemeriksaan_lab.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_lab = $this->db('mlite_satu_sehat_mapping_lab')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory specimen', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'laboratorium'))->oneArray(); + + $laboratory = ' + { + "resourceType": "Specimen", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/specimen/' . $this->organizationid . '", + "value": "' . $row['permintaan_pemeriksaan_lab']['noorder'] . '" + } + ], + "status": "available", + "type": { + "coding": [ + { + "system": "' . isset_or($mapping_lab['sampel_system'], 'http://snomed.info/sct') . '", + "code": "' . isset_or($mapping_lab['sampel_code'], '119364003') . '", + "display": "' . isset_or($mapping_lab['sampel_display'], 'Serum specimen') . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "receivedTime": "' . $row['permintaan_lab']['tgl_permintaan'] . 'T' . $row['permintaan_lab']['jam_permintaan'] . $zonawaktu . '", + "request": [ + { + "reference": "ServiceRequest/' . $mlite_satu_sehat_response['id_lab_pk_request'] . '" + } + ] + } + '; + + // echo json_decode(json_encode($laboratory)); + + $url = $this->fhirurl . '/Specimen'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $laboratory, + )); + + $response = curl_exec($curl); + + $id_laboratory_specimen = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim laboratory specimen lab PK platform Satu Sehat!!'; + if ($id_laboratory_specimen) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_lab_pk_specimen' => $id_laboratory_specimen + ]); + $pesan = 'Sukses mengirim laboratory specimen lab PK platform Satu Sehat!!'; + } + + curl_close($curl); + + } + if ($tipe == 'observation') { + + $row['permintaan_lab'] = $this->db('permintaan_lab') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_lab']) || !isset($row['permintaan_lab']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory observation', 'missing' => ['permintaan_lab.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_lab'] = $this->db('permintaan_pemeriksaan_lab') + ->join('jns_perawatan_lab', 'jns_perawatan_lab.kd_jenis_prw = permintaan_pemeriksaan_lab.kd_jenis_prw') + ->where('noorder', $row['permintaan_lab']['noorder']) + ->oneArray(); + $mapping_lab = $this->db('mlite_satu_sehat_mapping_lab')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory observation', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'laboratorium'))->oneArray(); + + $detail_periksa_lab = $this->db('detail_periksa_lab') + ->where('no_rawat', $no_rawat) + ->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw']) + ->where('tgl_periksa', $row['permintaan_lab']['tgl_hasil']) + ->where('jam', $row['permintaan_lab']['jam_hasil']) + ->oneArray(); + + $laboratory = ' + { + "resourceType": "Observation", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/observation/' . $this->organizationid . '", + "value": "' . $row['permintaan_pemeriksaan_lab']['noorder'] . '" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "laboratory", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_lab['system'], 'http://loinc.org') . '", + "code": "' . $mapping_lab['code'] . '", + "display": "' . $mapping_lab['display'] . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "performer": [ + { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + } + ], + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "display": "Hasil Pemeriksaan Lab ' . $row['permintaan_pemeriksaan_lab']['nm_perawatan'] . ' dengan No.Rawat ' . $no_rawat . ', Atas Nama Pasien ' . $nm_pasien . ', Nomor RM ' . $no_rkm_medis . ', Pada Tanggal ' . $row['permintaan_lab']['tgl_hasil'] . ' jam ' . $row['permintaan_lab']['jam_hasil'] . '" + }, + "specimen": { + "reference": "Specimen/' . $mlite_satu_sehat_response['id_lab_pk_specimen'] . '" + }, + "effectiveDateTime": "' . $row['permintaan_lab']['tgl_hasil'] . 'T' . $row['permintaan_lab']['jam_hasil'] . $zonawaktu . '", + "valueString": "Hasil Lab ' . $row['permintaan_pemeriksaan_lab']['nm_perawatan'] . ' dengan Nilai ' . isset_or($detail_periksa_lab['nilai'], '') . ' pada Tanggal ' . $row['permintaan_lab']['tgl_hasil'] . ' jam ' . $row['permintaan_lab']['jam_hasil'] . '" + } + '; + + // echo json_decode(json_encode($laboratory)); + + $url = $this->fhirurl . '/Observation'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $laboratory, + )); + + $response = curl_exec($curl); + + $id_laboratory_observation = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim laboratory observation lab PK platform Satu Sehat!!'; + if ($id_laboratory_observation) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_lab_pk_observation' => $id_laboratory_observation + ]); + $pesan = 'Sukses mengirim laboratory observation lab PK platform Satu Sehat!!'; + } + + curl_close($curl); + + } + if ($tipe == 'diagnostic') { + + $row['permintaan_lab'] = $this->db('permintaan_lab') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_lab']) || !isset($row['permintaan_lab']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory diagnostic report', 'missing' => ['permintaan_lab.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_lab'] = $this->db('permintaan_pemeriksaan_lab') + ->join('jns_perawatan_lab', 'jns_perawatan_lab.kd_jenis_prw = permintaan_pemeriksaan_lab.kd_jenis_prw') + ->where('noorder', $row['permintaan_lab']['noorder']) + ->oneArray(); + $mapping_lab = $this->db('mlite_satu_sehat_mapping_lab')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Laboratory diagnostic report', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'laboratorium'))->oneArray(); + + $detail_periksa_lab = $this->db('detail_periksa_lab') + ->where('no_rawat', $no_rawat) + ->where('kd_jenis_prw', $row['permintaan_pemeriksaan_lab']['kd_jenis_prw']) + ->where('tgl_periksa', $row['permintaan_lab']['tgl_hasil']) + ->where('jam', $row['permintaan_lab']['jam_hasil']) + ->oneArray(); + + $laboratory = ' + { + "resourceType": "DiagnosticReport", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/diagnostic/' . $this->organizationid . '/lab", + "use": "official", + "value": "' . $row['permintaan_pemeriksaan_lab']['noorder'] . '" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "LAB", + "display": "Laboratory" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_lab['system'], 'http://loinc.org') . '", + "code": "' . $mapping_lab['code'] . '", + "display": "' . $mapping_lab['display'] . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "effectiveDateTime": "' . $row['permintaan_lab']['tgl_hasil'] . 'T' . $row['permintaan_lab']['jam_hasil'] . $zonawaktu . '", + "issued": "' . $row['permintaan_lab']['tgl_hasil'] . 'T' . $row['permintaan_lab']['jam_hasil'] . $zonawaktu . '", + "performer": [ + { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + } + ], + "specimen": [ + { + "reference": "Specimen/' . $mlite_satu_sehat_response['id_lab_pk_specimen'] . '" + } + ], + "result": [ + { + "reference": "Observation/' . $mlite_satu_sehat_response['id_lab_pk_observation'] . '" + } + ], + "basedOn": [ + { + "reference": "ServiceRequest/' . $mlite_satu_sehat_response['id_lab_pk_request'] . '" + } + ], + "conclusion": "Hasil pemeriksaan menunjukkan kadar glukosa darah tinggi, konsisten dengan diagnosis diabetes mellitus." + } + '; + + // echo json_decode(json_encode($laboratory)); + + $url = $this->fhirurl . '/DiagnosticReport'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $laboratory, + )); + + $response = curl_exec($curl); + + $id_laboratory_diagnostic = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim laboratory diagnostic lab PK platform Satu Sehat!!'; + if ($id_laboratory_diagnostic) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_lab_pk_diagnostic' => $id_laboratory_diagnostic + ]); + $pesan = 'Sukses mengirim laboratory diagnostic lab PK platform Satu Sehat!!'; + } + + curl_close($curl); + + } + ; + + if ($render) { + echo $this->draw('laboratory.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getRadiology($no_rawat = '', $tipe = '', $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $pesan = ''; + $response = ''; + + $radiologi = ''; + + if ($tipe == 'request') { + + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_radiologi']) || !isset($row['permintaan_radiologi']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology request', 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_radiologi'] = $this->db('permintaan_pemeriksaan_radiologi') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw = permintaan_pemeriksaan_radiologi.kd_jenis_prw') + ->where('noorder', $row['permintaan_radiologi']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_radiologi']) || !isset($row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology request', 'missing' => ['permintaan_pemeriksaan_radiologi.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_radiologi = $this->db('mlite_satu_sehat_mapping_rad')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology request', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'radiologi'))->oneArray(); + + $radiologi = '{ + "resourceType": "ServiceRequest", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/acsn/' . $this->organizationid . '", + "value": "' . $row['permintaan_radiologi']['noorder'] . '" + } + ], + "status": "active", + "intent": "order", + "priority": "routine", + "category": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "363679005", + "display": "Imaging" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_radiologi['system'], 'http://loinc.org') . '", + "code": "' . $mapping_radiologi['code'] . '", + "display": "' . $mapping_radiologi['display'] . '" + } + ], + "text": "' . $row['permintaan_pemeriksaan_radiologi']['nm_perawatan'] . '" + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '", + "display": "Permintaan ' . $row['permintaan_pemeriksaan_radiologi']['nm_perawatan'] . ' Atas nama ' . $nm_pasien . ' No.RM ' . $no_rkm_medis . ' No. Rawat ' . $no_rawat . ' pada tangga ' . $row['permintaan_radiologi']['tgl_permintaan'] . ' jam ' . $row['permintaan_radiologi']['jam_permintaan'] . '" + }, + "occurrenceDateTime": "' . $row['permintaan_radiologi']['tgl_permintaan'] . 'T' . $row['permintaan_radiologi']['jam_permintaan'] . $zonawaktu . '", + "requester": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nm_dokter . '" + }, + "performer": [ + { + "reference": "Organization/' . $mlite_satu_sehat_lokasi['id_organisasi_satusehat'] . '", + "display": "' . $mlite_satu_sehat_lokasi['lokasi'] . '" + } + ], + "reasonCode": [ + { + "text": "Permintaan pemeriksaan radiologi dengan Accession Number ' . $row['permintaan_radiologi']['noorder'] . ' dan diagnosa klinis: ' . $row['permintaan_radiologi']['diagnosa_klinis'] . '" + } + ] + }'; + + // echo json_decode(json_encode($radiologi)); + + $url = $this->fhirurl . '/ServiceRequest'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $radiologi, + )); + + $response = curl_exec($curl); + + $id_radiologi_request = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim radiologi request platform Satu Sehat!!'; + if ($id_radiologi_request) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_rad_request' => $id_radiologi_request + ]); + $pesan = 'Sukses mengirim radiologi request platform Satu Sehat!!'; + } + + curl_close($curl); + + } elseif ($tipe == 'specimen') { + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_radiologi']) || !isset($row['permintaan_radiologi']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology specimen', 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_radiologi'] = $this->db('permintaan_pemeriksaan_radiologi') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw = permintaan_pemeriksaan_radiologi.kd_jenis_prw') + ->where('noorder', $row['permintaan_radiologi']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_radiologi']) || !isset($row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology specimen', 'missing' => ['permintaan_pemeriksaan_radiologi.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_radiologi = $this->db('mlite_satu_sehat_mapping_rad')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology specimen', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'radiologi'))->oneArray(); + + + $radiologi = '{ + "resourceType": "Specimen", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/specimen/' . $this->organizationid . '", + "value": "' . $row['permintaan_radiologi']['noorder'] . '" + } + ], + "status": "available", + "type": { + "coding": [ + { + "system": "' . isset_or($mapping_radiologi['sampel_system'], 'http://snomed.info/sct') . '", + "code": "' . isset_or($mapping_radiologi['sampel_code'], '') . '", + "display": "' . isset_or($mapping_radiologi['sampel_display'], '') . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "receivedTime": "' . $row['permintaan_radiologi']['tgl_permintaan'] . 'T' . $row['permintaan_radiologi']['jam_permintaan'] . $zonawaktu . '", + "request": [ + { + "reference": "ServiceRequest/' . $mlite_satu_sehat_response['id_rad_request'] . '" + } + ] + }'; + + // echo json_decode(json_encode($radiologi)); + + $url = $this->fhirurl . '/Specimen'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $radiologi, + )); + + $response = curl_exec($curl); + + $id_radiologi_specimen = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim radiologi specimen platform Satu Sehat!!'; + if ($id_radiologi_specimen) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_rad_specimen' => $id_radiologi_specimen + ]); + $pesan = 'Sukses mengirim radiologi specimen platform Satu Sehat!!'; + } + + curl_close($curl); + + } elseif ($tipe == 'observation') { + + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_radiologi']) || !isset($row['permintaan_radiologi']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology result', 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_radiologi'] = $this->db('permintaan_pemeriksaan_radiologi') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw = permintaan_pemeriksaan_radiologi.kd_jenis_prw') + ->where('noorder', $row['permintaan_radiologi']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_radiologi']) || !isset($row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology result', 'missing' => ['permintaan_pemeriksaan_radiologi.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_radiologi = $this->db('mlite_satu_sehat_mapping_rad')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])->oneArray(); + + $hasil_radiologi = $this->db('hasil_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology observation', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'radiologi'))->oneArray(); + + + $radiologi = '{ + "resourceType": "Observation", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/observation/' . $this->organizationid . '", + "value": "' . $row['permintaan_radiologi']['noorder'] . '" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "imaging", + "display": "Imaging" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_radiologi['system'], 'http://loinc.org') . '", + "code": "' . $mapping_radiologi['code'] . '", + "display": "' . $mapping_radiologi['display'] . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "effectiveDateTime": "' . $row['permintaan_radiologi']['tgl_hasil'] . 'T' . $row['permintaan_radiologi']['jam_hasil'] . $zonawaktu . '", + "performer": [ + { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "dr. ' . $nm_dokter . ', Sp.Rad" + } + ], + "valueString": "' . isset_or($hasil_radiologi['hasil'], '') . '" + }'; + + + // echo json_decode(json_encode($radiologi)); + + $url = $this->fhirurl . '/Observation'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $radiologi, + )); + + $response = curl_exec($curl); + + $id_radiologi_observation = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim radiologi observation platform Satu Sehat!!'; + if ($id_radiologi_observation) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_rad_observation' => $id_radiologi_observation + ]); + $pesan = 'Sukses mengirim radiologi observation platform Satu Sehat!!'; + } + + curl_close($curl); + + } elseif ($tipe == 'diagnostic') { + + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_radiologi']) || !isset($row['permintaan_radiologi']['noorder'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology result', 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $row['permintaan_pemeriksaan_radiologi'] = $this->db('permintaan_pemeriksaan_radiologi') + ->join('jns_perawatan_radiologi', 'jns_perawatan_radiologi.kd_jenis_prw = permintaan_pemeriksaan_radiologi.kd_jenis_prw') + ->where('noorder', $row['permintaan_radiologi']['noorder']) + ->oneArray(); + if (!is_array($row['permintaan_pemeriksaan_radiologi']) || !isset($row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])) { + echo json_encode(['error' => 'Data tidak lengkap untuk Radiology result', 'missing' => ['permintaan_pemeriksaan_radiologi.kd_jenis_prw' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + $mapping_radiologi = $this->db('mlite_satu_sehat_mapping_rad')->where('kd_jenis_prw', $row['permintaan_pemeriksaan_radiologi']['kd_jenis_prw'])->oneArray(); + + $hasil_radiologi = $this->db('hasil_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + // Data pasien dan dokter + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $nm_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + if ($id_pasien === '') { + echo json_encode(['error' => 'Data tidak lengkap untuk Radilogy diagnostic report', 'missing' => ['patient_id' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + exit(); + } + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $this->core->getSettings('satu_sehat', 'radiologi'))->oneArray(); + + + $radiologi = '{ + "resourceType": "DiagnosticReport", + "identifier": [ + { + "system": "http://sys-ids.kemkes.go.id/diagnostic/' . $this->organizationid . '/rad", + "value": "' . $row['permintaan_radiologi']['noorder'] . '" + } + ], + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0074", + "code": "RAD", + "display": "Radiology" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "' . isset_or($mapping_radiologi['system'], 'http://loinc.org') . '", + "code": "' . $mapping_radiologi['code'] . '", + "display": "' . $mapping_radiologi['display'] . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $id_pasien . '", + "display": "' . $nm_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $mlite_satu_sehat_response['id_encounter'] . '" + }, + "effectiveDateTime": "' . $row['permintaan_radiologi']['tgl_hasil'] . 'T' . $row['permintaan_radiologi']['jam_hasil'] . $zonawaktu . '", + "issued": "' . $row['permintaan_radiologi']['tgl_hasil'] . 'T' . $row['permintaan_radiologi']['jam_hasil'] . $zonawaktu . '", + "performer": [ + { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "dr. ' . $nm_dokter . ', Sp.Rad" + } + ], + "specimen": [ + { + "reference": "Specimen/' . $mlite_satu_sehat_response['id_rad_specimen'] . '" + } + ], + "result": [ + { + "reference": "Observation/' . $mlite_satu_sehat_response['id_rad_observation'] . '" + } + ], + "basedOn": [ + { + "reference": "ServiceRequest/' . $mlite_satu_sehat_response['id_rad_request'] . '" + } + ] + }'; + + // echo json_decode(json_encode($radiologi)); + + $url = $this->fhirurl . '/DiagnosticReport'; + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $radiologi, + )); + + $response = curl_exec($curl); + + $id_radiologi_diagnostic = isset_or(json_decode($response)->id, ''); + $pesan = 'Gagal mengirim radiologi diagnostic platform Satu Sehat!!'; + if ($id_radiologi_diagnostic) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_rad_diagnostic' => $id_radiologi_diagnostic + ]); + $pesan = 'Sukses mengirim radiologi diagnostic platform Satu Sehat!!'; + } + + curl_close($curl); + + } elseif ($tipe == 'image') { + + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + if (!is_array($row['permintaan_radiologi']) || !isset($row['permintaan_radiologi']['noorder'])) { + echo '
                  ' . json_encode(['error' => 'Data tidak lengkap untuk Radiology image', 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . '
                  '; + exit(); + } + $noorder = $row['permintaan_radiologi']['noorder']; + + if ($this->settings->get('satu_sehat.imaging') == 'mini_pacs') { + + // Cari study Mini PACS berdasarkan no_rawat + $pacs_study = $this->db('mlite_mini_pacs_study') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + if (!$pacs_study) { + $response = json_encode([ + 'error' => 'Data study Mini PACS tidak ditemukan', + 'missing' => ['mlite_mini_pacs_study.no_rawat' => $no_rawat] + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $pesan = 'Gagal: Study Mini PACS tidak ditemukan untuk no_rawat ' . $no_rawat; + } else { + // Panggil SatusehatDicomClient langsung — hindari nested HTTP (504) + try { + require_once '../plugins/mini_pacs/SatusehatDicomClient.php'; + + $config = [ + 'base_url' => 'https://api-satusehat.kemkes.go.id', + 'client_key' => $this->core->getSettings('satu_sehat', 'clientid'), + 'secret_key' => $this->core->getSettings('satu_sehat', 'secretkey'), + 'organization_id' => $this->core->getSettings('satu_sehat', 'organizationid'), + ]; + $client = new \Plugins\Mini_Pacs\SatusehatDicomClient($config); + + // Ambil series & instance pertama + $pacs_series = $this->db('mlite_mini_pacs_series') + ->where('study_id', $pacs_study['id']) + ->oneArray(); + + if (!$pacs_series) { + throw new \Exception('Series Mini PACS tidak ditemukan untuk study_id ' . $pacs_study['id']); + } + + $pacs_instance = $this->db('mlite_mini_pacs_instance') + ->where('series_id', $pacs_series['id']) + ->oneArray(); + + if (!$pacs_instance ) { + throw new \Exception('File DICOM tidak ditemukan atau belum dikonversi'); + } + + // 1. Upload DICOM + $upload = $client->uploadDicom($pacs_instance['file_path']); + $isDuplicate = (isset($upload['status']) && $upload['status'] === 'duplicate'); + + // 2. Data penunjang + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $permintaan_radiologi = $this->db('permintaan_radiologi') + ->where('no_rawat', $no_rawat) + ->oneArray(); + + $pasien = $this->db('reg_periksa') + ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->where('reg_periksa.no_rawat', $no_rawat) + ->oneArray(); + + $no_ktp_pasien = $pasien['no_ktp'] ?? ''; + + // Ambil patient IHS ID + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $id_pasien = ''; + if ( + is_object($__patientJson) && + isset($__patientJson->entry[0]->resource->id) + ) { + $id_pasien = $__patientJson->entry[0]->resource->id; + } + + // 3. Kirim ImagingStudy ke FHIR + $fhirResult = $client->sendImagingStudy([ + 'patientId' => $id_pasien, + 'encounterId' => $mlite_satu_sehat_response['id_encounter'] ?? '', + 'serviceRequestId' => $mlite_satu_sehat_response['id_rad_request'] ?? '', + 'noRawat' => $no_rawat, + 'noOrder' => $permintaan_radiologi['noorder'] ?? '', + 'studyUID' => $pacs_study['study_instance_uid'] ?? '', + 'seriesUID' => $pacs_series['series_instance_uid'] ?? '', + 'instanceUID' => $pacs_instance['sop_instance_uid'] ?? '', + ]); + + $fhirString = $fhirResult['response']; + $fhirArr = json_decode($fhirString, true); + $fhirPayloadArr = json_decode($fhirResult['payload'] ?? '{}', true); + + $response = json_encode([ + 'status' => $isDuplicate ? 'duplicate' : 'success', + 'message' => $isDuplicate ? 'DICOM sudah ada di Satu Sehat (Duplicate).' : 'Berhasil kirim ke Satu Sehat', + 'dicom_raw' => $upload['raw'] ?? '', + 'fhir_payload' => $fhirPayloadArr ?: ($fhirResult['payload'] ?? ''), + 'fhir_raw' => $fhirArr ?: $fhirString, + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + $id_imaging_study = isset_or(json_decode($response)->fhir_raw->id, ''); + + $pesan = $isDuplicate + ? 'DICOM sudah ada di Satu Sehat (Duplicate) — Mini PACS' + : 'Sukses mengirim image ke Satu Sehat via Mini PACS!! — ID ImagingStudy: ' . $id_imaging_study; + + // 4. Simpan ID ImagingStudy ke database + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'id_imaging_study' => $id_imaging_study + ]); + + + } catch (\Exception $e) { + $response = json_encode(['error' => $e->getMessage()], JSON_PRETTY_PRINT); + $pesan = 'Gagal mengirim image ke Satu Sehat via Mini PACS: ' . $e->getMessage(); + } + } + + } else { + + // Alur Orthanc (default) + $accessionNumber = $this->getStudiIdByNoOrder($noorder); + if (!$accessionNumber) { + echo '
                  ' . json_encode(['error' => 'Tidak ada data image studi untuk accession number ' . $noorder, 'missing' => ['permintaan_radiologi.noorder' => 'missing']], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . '
                  '; + exit(); + } + + $orthanc_server = $this->settings->get('orthanc.server'); + // $orthanc_server = 'http://172.18.0.7:8042'; + $orthanc_user = $this->settings->get('orthanc.username'); + $orthanc_password = $this->settings->get('orthanc.password'); + + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $orthanc_server . '/modalities/DCMROUTER/store', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_TIMEOUT => 30, + CURLOPT_CUSTOMREQUEST => 'POST', + + // Orthanc REST API butuh BASIC AUTH + CURLOPT_USERPWD => $orthanc_user . ':' . $orthanc_password, + + // UUID instance Orthanc (plain text, BUKAN JSON) + CURLOPT_POSTFIELDS => $accessionNumber, + + CURLOPT_HTTPHEADER => [ + 'Content-Type: text/plain' + ], + ]); + + $response = curl_exec($curl); + + curl_close($curl); + + } + } + if ($render) { + echo $this->draw('radiology.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getStudiIdByNoOrder($noorder) + { + + $orthanc_server = $this->settings->get('orthanc.server'); + // $orthanc_server = 'http://172.18.0.7:8042'; + $orthanc_user = $this->settings->get('orthanc.username'); + $orthanc_password = $this->settings->get('orthanc.password'); + + $ch = curl_init($orthanc_server . '/tools/find'); + + curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_USERPWD => $orthanc_user . ':' . $orthanc_password, + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + CURLOPT_POSTFIELDS => json_encode([ + "Level" => "Study", + "Query" => [ + "AccessionNumber" => $noorder + ] + ]) + ]); + + $response = curl_exec($ch); + curl_close($ch); + + $studyIds = json_decode($response, true); + // print_r($studyIds); + return $studyIds[0] ?? ''; + } + + public function getCarePlan($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $nm_poli = $this->core->getPoliklinikInfo('nm_poli', $kd_poli); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $no_ktp_dokter = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); + $pemeriksaan = $this->db('pemeriksaan_ralan')->where('no_rawat', $no_rawat)->oneArray(); + + $rtl = $pemeriksaan['rtl'] ?? null; + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $kunjungan = 'Kunjungan'; + if ($status_lanjut == 'Ranap') { + $kunjungan = 'Perawatan'; + $row['pemeriksaan'] = $this->db('pemeriksaan_ranap') + ->where('no_rawat', $no_rawat) + ->limit(1) + ->desc('tgl_perawatan') + ->oneArray(); + $rtl = $pemeriksaan['rtl'] ?? null; + } + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $ihs_patient = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } + + $encounter_id = $mlite_satu_sehat_response['id_encounter'] ?? null; + + if ($ihs_patient === '' || !$rtl || !$encounter_id) { + $error = [ + 'error' => 'Data tidak lengkap untuk CarePlan', + 'missing' => [ + 'patient_id' => $ihs_patient === '' ? 'missing' : 'ok', + 'rtl' => !$rtl ? 'missing' : 'ok', + 'id_encounter' => !$encounter_id ? 'missing' : 'ok' + ] + ]; + $response = json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('careplan.html', ['pesan' => 'Gagal mengirim careplan platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + $careplan = '{ + "resourceType" : "CarePlan", + "identifier" : { + "system" : "http://sys-ids.kemkes.go.id/careplan/' . $this->organizationid . '", + "value" : "' . $no_rawat . '" + }, + "title" : "Instruksi Medik dan Keperawatan Pasien", + "status" : "active", + "category" : [ + { + "coding" : [ + { + "system" : "http://snomed.info/sct", + "code" : "736271009", + "display" : "Outpatient care plan" + } + ] + } + ], + "intent" : "plan", + "description" : "' . $rtl . '", + "subject" : { + "reference" : "Patient/' . $ihs_patient . '", + "display" : "' . $nama_pasien . '" + }, + "encounter" : { + "reference": "Encounter/' . $encounter_id . '", + "display": "' . $kunjungan . ' ' . $nama_pasien . ' dari tanggal ' . $tgl_registrasi . '" + }, + "created" : "' . $pemeriksaan['tgl_perawatan'] . 'T' . $pemeriksaan['jam_rawat'] . $zonawaktu . '", + "author" : { + "reference" : "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display" : "' . $nama_dokter . '" + } + }'; + + // echo '
                  '.$careplan.'
                  '; + + $curl = curl_init(); + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/CarePlan', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $careplan, + )); + + $response = curl_exec($curl); + + $decoded = json_decode($response); + $id_careplan = (is_object($decoded) && isset($decoded->id)) ? $decoded->id : null; + $pesan = 'Gagal mengirim careplan platform Satu Sehat!!'; + if ($id_careplan) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_careplan' => $id_careplan + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_careplan' => $id_careplan + ]); + } + $pesan = 'Sukses mengirim careplan platform Satu Sehat!!'; + } + + curl_close($curl); + + if ($render) { + echo $this->draw('careplan.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getAllergy($no_rawat, $render = true) + { + + $zonawaktu = '+07:00'; + if ($this->settings->get('satu_sehat.zonawaktu') == 'WITA') { + $zonawaktu = '+08:00'; + } + if ($this->settings->get('satu_sehat.zonawaktu') == 'WIT') { + $zonawaktu = '+09:00'; + } + + + $no_rawat = revertNoRawat($no_rawat); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $no_rawat); + $nm_poli = $this->core->getPoliklinikInfo('nm_poli', $kd_poli); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $no_rawat); + $no_ktp_dokter = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $nama_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $no_rawat); + $no_ktp_pasien = $this->core->getPasienInfo('no_ktp', $no_rkm_medis); + $nama_pasien = $this->core->getPasienInfo('nm_pasien', $no_rkm_medis); + $status_lanjut = $this->core->getRegPeriksaInfo('status_lanjut', $no_rawat); + $tgl_registrasi = $this->core->getRegPeriksaInfo('tgl_registrasi', $no_rawat); + $jam_reg = $this->core->getRegPeriksaInfo('jam_reg', $no_rawat); + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $no_rawat)->oneArray(); + $pemeriksaan = $this->db('pemeriksaan_ralan')->where('no_rawat', $no_rawat)->oneArray(); + + $rtl = $pemeriksaan['rtl'] ?? null; + + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + + $id_dokter = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('practitioner_id') + ->where('kd_dokter', $kd_dokter) + ->oneArray(); + + $kunjungan = 'Kunjungan'; + if ($status_lanjut == 'Ranap') { + $kunjungan = 'Perawatan'; + $row['pemeriksaan'] = $this->db('pemeriksaan_ranap') + ->where('no_rawat', $no_rawat) + ->limit(1) + ->desc('tgl_perawatan') + ->oneArray(); + $rtl = $pemeriksaan['rtl'] ?? null; + } + + $__patientResp = $this->getPatient($no_ktp_pasien); + $__patientJson = json_decode($__patientResp); + $ihs_patient = ''; + if (is_object($__patientJson) && isset($__patientJson->entry) && is_array($__patientJson->entry) && isset($__patientJson->entry[0]) && isset($__patientJson->entry[0]->resource) && isset($__patientJson->entry[0]->resource->id)) { + $ihs_patient = $__patientJson->entry[0]->resource->id; + } + + $encounter_id = $mlite_satu_sehat_response['id_encounter'] ?? null; + + if ($ihs_patient === '' || !$encounter_id) { + $error = [ + 'error' => 'Data tidak lengkap untuk Allergy', + 'missing' => [ + 'patient_id' => $ihs_patient === '' ? 'missing' : 'ok', + 'rtl' => !$rtl ? 'missing' : 'ok', + 'id_encounter' => !$encounter_id ? 'missing' : 'ok' + ] + ]; + $response = json_encode($error, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + if ($render) { + echo $this->draw('allergy.html', ['pesan' => 'Gagal mengirim allergy platform Satu Sehat!!', 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + $allergy_list = [ + [ + 'deskripsi' => 'Allergy to food', + 'snomed_ct' => '414285001', + 'icd_10' => 'T78.1', + 'category' => 'food' + ], + [ + 'deskripsi' => 'Allergy to drug', + 'snomed_ct' => '416098002', + 'icd_10' => 'T88.7', + 'category' => 'drug' + ], + [ + 'deskripsi' => 'Allergy to nutraceutical', + 'snomed_ct' => '300910009', + 'icd_10' => 'J30.1', + 'category' => 'environment' + ], + [ + 'deskripsi' => 'Allergy to dust', + 'snomed_ct' => '232350006', + 'icd_10' => 'J30.8', + 'category' => 'environment' + ], + [ + 'deskripsi' => 'Allergic disposition', + 'snomed_ct' => '609328004', + 'icd_10' => 'T78.4', + 'category' => 'environment' + ] + ]; + + $allergy_icd10 = array_column($allergy_list, 'icd_10'); + + $row['allergy'] = []; + + $allergy = $this->db('diagnosa_pasien') + ->join('penyakit', 'penyakit.kd_penyakit = diagnosa_pasien.kd_penyakit') + ->where('no_rawat', $no_rawat) + ->where('diagnosa_pasien.status', $status_lanjut) + ->in('diagnosa_pasien.kd_penyakit', $allergy_icd10) + ->oneArray(); + + $allergy_map = array_column($allergy_list, null, 'icd_10'); + + if (!empty($allergy) && isset($allergy_map[$allergy['kd_penyakit']])) { + $row['allergy'] = $allergy_map[$allergy['kd_penyakit']]; + } + + $allergy = '{ + "resourceType" : "AllergyIntolerance", + "identifier" : { + "system" : "http://sys-ids.kemkes.go.id/allergy/' . $this->organizationid . '", + "use" : "official", + "value" : "' . $no_rawat . '" + }, + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical", + "code": "active", + "display": "Active" + } + ] + }, + "verificationStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/allergyintolerance-verification", + "code": "confirmed", + "display": "Confirmed" + } + ] + }, + "category": [ + "food" + ], + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "' . $row['allergy']['snomed_ct'] . '", + "display": "' . $row['allergy']['deskripsi'] . '" + } + ], + "text": "' . $row['allergy']['deskripsi'] . '" + }, + "patient": { + "reference": "Patient/' . $ihs_patient . '", + "display": "' . $nama_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $encounter_id . '", + "display": "' . $kunjungan . ' ' . $nama_pasien . ' dari tanggal ' . $tgl_registrasi . '" + }, + "recordedDate": "' . $pemeriksaan['tgl_perawatan'] . 'T' . $pemeriksaan['jam_rawat'] . $zonawaktu . '", + "recorder": { + "reference": "Practitioner/' . $id_dokter['practitioner_id'] . '", + "display": "' . $nama_dokter . '" + } + }'; + + $curl = curl_init(); + // echo '
                  ' . $allergy . '
                  '; + + curl_setopt_array($curl, array( + CURLOPT_URL => $this->fhirurl . '/AllergyIntolerance', + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Authorization: Bearer ' . json_decode($this->getToken())->access_token), + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_POSTFIELDS => $allergy + )); + + $response = curl_exec($curl); + + $decoded = json_decode($response); + $id_allergy = (is_object($decoded) && isset($decoded->id)) ? $decoded->id : null; + $pesan = 'Gagal mengirim allergy platform Satu Sehat!!'; + if ($id_allergy) { + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + if ($mlite_satu_sehat_response) { + $this->db('mlite_satu_sehat_response') + ->where('no_rawat', $no_rawat) + ->save([ + 'no_rawat' => $no_rawat, + 'id_allergy' => $id_allergy + ]); + } else { + $this->db('mlite_satu_sehat_response') + ->save([ + 'no_rawat' => $no_rawat, + 'id_allergy' => $id_allergy + ]); + } + $pesan = 'Sukses mengirim allergy platform Satu Sehat!!'; + } + + curl_close($curl); + + if ($render) { + echo $this->draw('allergy.html', ['pesan' => $pesan, 'response' => $response]); + } else { + echo $response; + } + exit(); + } + + public function getSettings() + { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'satu_sehat', 'praktisi'])); + } + return $this->draw('settings.html', ['satu_sehat' => $this->settings->get('satu_sehat'), 'mapping_lokasi' => $this->db('mlite_satu_sehat_lokasi')->toArray(), 'bidang' => $this->db('bidang')->toArray()]); + } + + public function postSaveSettings() + { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'satu_sehat', 'praktisi'])); + } + foreach ($_POST['satu_sehat'] as $key => $val) { + $this->settings('satu_sehat', $key, $val); + } + + $this->notify('success', 'Pengaturan telah disimpan'); + redirect(url([ADMIN, 'satu_sehat', 'settings'])); + } + + public function anyPraktisi() + { + $response = []; + if (isset($_POST['nik_dokter']) && $_POST['nik_dokter'] != '') { + $response = json_decode($this->getPractitioner($_POST['nik_dokter'])); + } + return $this->draw('praktisi.html', ['response' => json_encode($response, JSON_PRETTY_PRINT)]); + } + + public function anyPasien() + { + $response = []; + if (isset($_POST['nik_pasien']) && $_POST['nik_pasien'] != '') { + $response = json_decode($this->getPatient($_POST['nik_pasien'])); + } + return $this->draw('pasien.html', ['response' => json_encode($response, JSON_PRETTY_PRINT)]); + } + + public function getDepartemen() + { + $poli = $this->db('poliklinik')->where('status', '1')->toArray(); + $mlite_satset = $this->db('mlite_satu_sehat_departemen')->toArray(); + $satu_sehat = []; + foreach ($mlite_satset as $value) { + $nama = $this->core->getDepartemenInfo($value['dep_id']); + if ($nama == '') { + $nama = $this->core->getPoliklinikInfo('nm_poli', $value['dep_id']); } + $value['nama'] = $nama; + $satu_sehat[] = $value; } - - redirect(url([ADMIN, 'satu_sehat', 'departemen'])); + return $this->draw('departemen.html', ['departemen' => $this->db('departemen')->toArray(), 'poli' => $poli, 'satu_sehat_departemen' => $satu_sehat]); } public function getLokasi() @@ -2401,25 +6150,57 @@ public function postSaveLokasi() public function getMappingPraktisi() { + $this->_addHeaderFiles(); + $apotek_setting = $this->settings->get('satu_sehat.praktisiapotek'); + $lab_setting = $this->settings->get('satu_sehat.praktisilab'); $mapping_praktisi = $this->db('mlite_satu_sehat_mapping_praktisi') - ->join('dokter', 'dokter.kd_dokter=mlite_satu_sehat_mapping_praktisi.kd_dokter') - ->toArray(); + ->join('dokter', 'dokter.kd_dokter=mlite_satu_sehat_mapping_praktisi.kd_dokter') + ->toArray(); + $mapping_praktisi_apoteker = $this->db('mlite_satu_sehat_mapping_praktisi') + ->select('pegawai.nama as nm_dokter, mlite_satu_sehat_mapping_praktisi.*') + ->join('pegawai', 'pegawai.nik=mlite_satu_sehat_mapping_praktisi.kd_dokter')->toArray(); + + $combined = array_merge($mapping_praktisi, $mapping_praktisi_apoteker); + $unique = []; + $seen = []; + + foreach ($combined as $item) { + $key = $item['kd_dokter']; + if (!isset($seen[$key])) { + $seen[$key] = true; + $unique[] = $item; + } + } + $dokter = $this->db('dokter')->where('status', '1')->toArray(); - return $this->draw('mapping.praktisi.html', ['mapping_praktisi' => $mapping_praktisi, 'dokter' => $dokter]); + $apoteker = $this->db('pegawai')->where('stts_aktif', 'AKTIF')->where('bidang', $apotek_setting)->toArray(); + $lab = $this->db('pegawai')->where('stts_aktif', 'AKTIF')->where('bidang', $lab_setting)->toArray(); + $lab_apoteker = array_merge($lab, $apoteker); + return $this->draw('mapping.praktisi.html', ['mapping_praktisi' => $unique, 'dokter' => $dokter, 'apoteker' => $lab_apoteker]); } public function postSaveMappingPraktisi() { if (isset($_POST['simpan'])) { - $kd_dokter = $_POST['dokter']; + $kd_dokter = (is_null($_POST['dokter'])) ? $_POST['medis'] : $_POST['dokter']; $nik = $this->core->getPegawaiInfo('no_ktp', $kd_dokter); + $bidang = $this->core->getPegawaiInfo('bidang', $kd_dokter); $send_json = json_decode($this->getPractitioner($nik))->entry[0]->resource->id; - + $apotek_setting = $this->settings->get('satu_sehat.praktisiapotek'); + $lab_setting = $this->settings->get('satu_sehat.praktisilab'); + $jenis_praktisi = 'Dokter'; + if ($bidang == $apotek_setting) { + $jenis_praktisi = 'Apoteker'; + } + if ($bidang == $lab_setting) { + $jenis_praktisi = 'Laboratorium'; + } if ($send_json != '') { $query = $this->db('mlite_satu_sehat_mapping_praktisi')->save( [ 'practitioner_id' => $send_json, - 'kd_dokter' => $_POST['dokter'] + 'kd_dokter' => $_POST['dokter'], + 'jenis_praktisi' => $jenis_praktisi, ] ); if ($query) { @@ -2429,7 +6210,7 @@ public function postSaveMappingPraktisi() } } } - + if (isset($_POST['hapus'])) { $query = $this->db('mlite_satu_sehat_mapping_praktisi') ->where('kd_dokter', $_POST['dokter']) @@ -2442,45 +6223,440 @@ public function postSaveMappingPraktisi() redirect(url([ADMIN, 'satu_sehat', 'mappingpraktisi'])); } - public function getResponse() + public function getCodeDrugForm($keyword) + { + $url = 'https://terminology.hl7.org/6.4.0/CodeSystem-v3-orderableDrugForm.json'; + + // Get JSON data from the URL + $json = file_get_contents($url); + + // Decode JSON to PHP array + $data = json_decode($json, true); + + // Access values + foreach ($data['concept'] as $value) { + if ($value['display'] === $keyword) { + return $value['code']; + } + } + } + + public function searchObat($keyword) + { + + $url = $this->settings->get('satu_sehat.authurl'); + $parsed = parse_url($url); + $baseUrl = $parsed['scheme'] . '://' . $parsed['host']; + + if ($this->getAccessToken() === '') { + return ['error' => 'Gagal mendapatkan access token']; + } + + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $baseUrl . '/kfa-v2/products/all?page=1&size=5&product_type=farmasi&keyword=' . urlencode($keyword), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Accept: application/json' + ] + ]); + + $response = curl_exec($ch); + curl_close($ch); + + return json_decode($response, true); + } + + public function searchIdentifierObat($keyword) + { + + $url = $this->settings->get('satu_sehat.authurl'); + $parsed = parse_url($url); + $baseUrl = $parsed['scheme'] . '://' . $parsed['host']; + + if ($this->getAccessToken() === '') { + return ['error' => 'Gagal mendapatkan access token']; + } + + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $baseUrl . '/kfa-v2/products?identifier=kfa&code=' . urlencode($keyword), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ + 'Authorization: Bearer ' . $this->getAccessToken(), + 'Accept: application/json' + ] + ]); + + $response = curl_exec($ch); + curl_close($ch); + + return json_decode($response, true); + } + + public function getMappingObat() + { + $this->_addHeaderFiles(); + $databarang = $this->db('databarang')->where('status', '1')->toArray(); + $mapping_obat = $this->db('mlite_satu_sehat_mapping_obat')->toArray(); + return $this->draw('mapping.obat.html', ['databarang' => $databarang, 'mapping_obat_satu_sehat' => $mapping_obat]); + } + + public function getMappingObatSearch() + { + echo json_encode($this->searchObat($_GET['keyword'])); + exit(); + } + + public function regexZatAktif($string) + { + if (preg_match('/([\d\.]+)\s*([^\d\s]+)/', $string, $matches)) { + return [ + 'value' => $matches[1], + 'unit' => $matches[2], + ]; + } + + return null; + } + + public function postSaveObat() + { + if (isset($_POST['simpan'])) { + + $kfa = $this->db('mlite_kfa')->where('kode_kfa', $_POST['select_kfa'])->oneArray(); + if (!$kfa) { + $this->notify('danger', 'Data KFA tidak ditemukan di master. Silakan import master KFA terlebih dahulu.'); + redirect(url([ADMIN, 'satu_sehat', 'mappingobat'])); + } + + $query = $this->db('mlite_satu_sehat_mapping_obat')->save( + [ + 'kode_brng' => $_POST['kode_brng'], + 'kode_kfa' => $_POST['select_kfa'], + 'nama_kfa' => $kfa['nama_kfa'] ?? null, + 'kode_bahan' => $kfa['kode_bahan'] ?? null, + 'nama_bahan' => $kfa['nama_bahan'] ?? null, + 'numerator' => $kfa['numerator'] ?? null, + 'satuan_num' => $kfa['satuan_num'] ?? null, + 'denominator' => $kfa['denominator'] ?? null, + 'satuan_den' => $kfa['satuan_den'] ?? null, + 'nama_satuan_den' => $kfa['nama_satuan_den'] ?? null, + 'kode_sediaan' => $kfa['kode_sediaan'] ?? null, + 'nama_sediaan' => $kfa['nama_sediaan'] ?? null, + 'kode_route' => null, + 'nama_route' => null, + 'type' => $_POST['type'], + ] + ); + if ($query) { + $this->notify('success', 'Mapping obat telah disimpan'); + } else { + $this->notify('danger', 'Mapping obat gagal disimpan'); + } + } + + // if (isset($_POST['update'])) { + // $query = $this->db('mlite_satu_sehat_mapping_obat') + // ->where('kode_brng', $_POST['kode_brng']) + // ->save( + // [ + // 'obat_code' => $_POST['select_kfa'], + // 'obat_system' => '', + // 'obat_display' => $cari_obat['result']['name'], + // 'type' => $_POST['type'] + // ] + // ); + // if ($query) { + // $this->notify('success', 'Mapping obat telah disimpan'); + // } + // } + + if (isset($_POST['hapus'])) { + $query = $this->db('mlite_satu_sehat_mapping_obat') + ->where('kode_brng', $_POST['kode_brng']) + ->delete(); + if ($query) { + $this->notify('success', 'Mapping obat telah dihapus'); + } + } + + redirect(url([ADMIN, 'satu_sehat', 'mappingobat'])); + } + + public function getBunban($periode = '') { $this->_addHeaderFiles(); - $periode = date('Y-m-d'); - if (isset($_GET['periode']) && $_GET['periode'] != '') { - $periode = $_GET['periode']; + if ($periode == '') { + $periode = date('Y-m-d'); + } + if (isset($periode) && $periode != '') { + $periode = $periode; } $data_response = []; + $url = url([ADMIN, 'satu_sehat', 'bunban', $periode]); + $mainMenu = url([ADMIN, 'satu_sehat', 'manage']); + echo 'Tanggal Yang Dipilih : ' . $periode; + echo '
                  + + + + + + '; + echo '
                  '; + $cekbundle = $this->db('mlite_satu_sehat_log')->where('tgl_registrasi', $periode)->where('response', 'Belum')->limit(5)->toArray(); + if (!$cekbundle) { + $limit = 5; + $offset = 0; + if (isset($_GET['offset']) && $_GET['offset'] != '') { + $offset = $_GET['offset']; + } + $result = $this->db('reg_periksa') + ->select('no_rawat') + ->where('reg_periksa.tgl_registrasi', $periode) + ->where('stts', '!=', 'Batal') + ->where('kd_poli', '!=', 'IGD01') + ->where('status_lanjut', 'Ralan') + ->limit($limit) + ->offset($offset) + ->toArray(); + $no = 1; + foreach ($result as $row) { + $no_rawat = $row['no_rawat']; + $cek_data = $this->db('mlite_satu_sehat_log')->where('no_rawat', $no_rawat)->oneArray(); + if (!$cek_data) { + $this->db('mlite_satu_sehat_log')->save([ + 'no_rawat' => $no_rawat, + 'tgl_registrasi' => $periode, + 'response' => 'Belum' + ]); + echo $no_rawat . "
                  "; + echo "Menyimpan data
                  "; + echo '==========================================
                  '; + } else { + echo $no . "Sudah Ada
                  "; + echo '==========================================
                  '; + } + $no++; + } + $offset += $limit; + echo ''; + } else { + foreach ($cekbundle as $row) { + $no_rawat = $row['no_rawat']; + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $no_rawat)->oneArray(); + $row['response'] = null; + if ($mlite_satu_sehat_response['id_encounter'] != '') { + $row['response'] = $mlite_satu_sehat_response['id_encounter']; + $this->db('mlite_satu_sehat_log')->where('no_rawat', $no_rawat)->update([ + 'response' => $mlite_satu_sehat_response['id_encounter'] + ]); + } else { + $row['response'] = $this->getEncounterBundle(convertNorawat($no_rawat), 'all'); + $response = json_decode(json_encode($row['response']), true); + if ($response['issue'][0]['severity'] == 'error') { + $this->db('mlite_satu_sehat_log')->where('no_rawat', $no_rawat)->update([ + 'response' => $response['issue'][0]['details']['text'] + ]); + } + ; + if ($response['entry'][0]['response']['status'] == '201 Created') { + $this->db('mlite_satu_sehat_log')->where('no_rawat', $no_rawat)->update([ + 'response' => $response['entry'][0]['response']['resourceID'] + ]); + } + } + $row['id_encounter'] = isset_or($mlite_satu_sehat_response['id_encounter'], ''); + $row['id_condition'] = isset_or($mlite_satu_sehat_response['id_condition'], ''); + $row['id_observation_ttvtensi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvtensi'], ''); + $row['id_observation_ttvnadi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvnadi'], ''); + $row['id_observation_ttvrespirasi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvrespirasi'], ''); + $row['id_observation_ttvsuhu'] = isset_or($mlite_satu_sehat_response['id_observation_ttvsuhu'], ''); + $row['id_observation_ttvspo2'] = isset_or($mlite_satu_sehat_response['id_observation_ttvspo2'], ''); + $row['id_observation_ttvgcs'] = isset_or($mlite_satu_sehat_response['id_observation_ttvgcs'], ''); + $row['id_observation_ttvtinggi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvtinggi'], ''); + $row['id_observation_ttvberat'] = isset_or($mlite_satu_sehat_response['id_observation_ttvberat'], ''); + $row['id_observation_ttvperut'] = isset_or($mlite_satu_sehat_response['id_observation_ttvperut'], ''); + $row['id_observation_ttvkesadaran'] = isset_or($mlite_satu_sehat_response['id_observation_ttvkesadaran'], ''); + $row['id_procedure'] = isset_or($mlite_satu_sehat_response['id_procedure'], ''); + $row['id_composition'] = isset_or($mlite_satu_sehat_response['id_composition'], ''); + $data_response[] = $row; + } + $json = json_encode($data_response); + $return = json_decode($json, true); + foreach ($return as $value) { + echo '
                  '; + echo 'Encounter : ' . $value['id_encounter'] . '
                  '; + echo 'Condition : ' . $value['id_condition'] . '
                  '; + echo 'Procedure : ' . $value['id_procedure'] . '
                  '; + echo 'Nadi : ' . $value['id_observation_ttvnadi'] . '
                  '; + echo 'Respirasi : ' . $value['id_observation_ttvrespirasi'] . '
                  '; + echo 'Suhu : ' . $value['id_observation_ttvsuhu'] . '
                  '; + // echo 'Poli : '.$this->core->getPoliklinikInfo('nm_poli',$value['kd_poli']); + echo '
                  '; + echo 'Nama Pasien : ' . $this->core->getPasienInfo('nm_pasien', $this->core->getRegPeriksaInfo('no_rkm_medis', $value['no_rawat'])); + echo '
                  '; + echo 'No Rawat : ' . $value['no_rawat']; + echo '
                  '; + echo (json_encode($value['response']) == null) ? '' : json_encode($value['response']); + echo '
                  '; + echo '=========================================='; + } + echo '
                  '; + echo '
                  '; + echo ''; + } + echo ' Menu Utama'; + exit(); + } + + public function getResponse() + { + $this->_addHeaderFiles(); + return $this->draw('response.html'); + } + + public function postResponseApi() + { + $this->_addHeaderFiles(); + // Ambil rentang tanggal dari query string + $start_date = isset($_GET['tanggal_awal']) && $_GET['tanggal_awal'] !== '' ? $_GET['tanggal_awal'] : date('Y-m-d'); + $end_date = isset($_GET['tanggal_akhir']) && $_GET['tanggal_akhir'] !== '' ? $_GET['tanggal_akhir'] : $start_date; + + // Validasi format YYYY-MM-DD + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $start_date)) { + $start_date = date('Y-m-d'); + } + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $end_date)) { + $end_date = $start_date; + } + // Pastikan urutan start <= end + if ($start_date > $end_date) { + $tmp = $start_date; + $start_date = $end_date; + $end_date = $tmp; + } + + $start = intval($_POST['start'] ?? 0); + $length = intval($_POST['length'] ?? 10); + $draw = intval($_POST['draw'] ?? 1); // untuk datatables tracking + + $searchTerm = $_POST['search']['value'] ?? ''; + + $total = $this->db('reg_periksa') + ->where('reg_periksa.tgl_registrasi', '>=', $start_date) + ->where('reg_periksa.tgl_registrasi', '<=', $end_date) + ->where('stts', '!=', 'Batal') + ->where('status_lanjut', 'Ralan') + ->count(); + $query = $this->db('reg_periksa') - ->where('reg_periksa.tgl_registrasi', $periode) + ->join('pasien', 'pasien.no_rkm_medis = reg_periksa.no_rkm_medis') + ->join('dokter', 'dokter.kd_dokter = reg_periksa.kd_dokter') + ->leftJoin('pegawai', 'pegawai.nik = reg_periksa.kd_dokter') + ->where('reg_periksa.tgl_registrasi', '>=', $start_date) + ->where('reg_periksa.tgl_registrasi', '<=', $end_date) ->where('stts', '!=', 'Batal') - // ->limit(30) + ->where('status_lanjut', 'Ralan'); + + if ($searchTerm) { + $query->where(function ($q) use ($searchTerm) { + $q->where('reg_periksa.no_rawat', 'LIKE', "%$searchTerm%") + ->orWhere('reg_periksa.no_rkm_medis', 'LIKE', "%$searchTerm%") + ->orWhere('reg_periksa.tgl_registrasi', 'LIKE', "%$searchTerm%") + ->orWhere('pasien.nm_pasien', 'LIKE', "%$searchTerm%") + ->orWhere('pasien.no_ktp', 'LIKE', "%$searchTerm%") + ->orWhere('dokter.nm_dokter', 'LIKE', "%$searchTerm%") + ->orWhere('reg_periksa.kd_dokter', 'LIKE', "%$searchTerm%") + ->orWhere('pegawai.no_ktp', 'LIKE', "%$searchTerm%"); + }); + } + + $filteredTotal = $query->count(); + + $query_data = $query->select(['reg_periksa.*', 'nm_pasien' => 'pasien.nm_pasien', 'no_ktp_pasien' => 'pasien.no_ktp', 'nm_dokter' => 'dokter.nm_dokter', 'no_ktp_dokter' => 'pegawai.no_ktp']) + ->limit($length) + ->offset($start) ->toArray(); - foreach ($query as $row) { - $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $row['no_rawat'])->oneArray(); + $data_response = []; + foreach ($query_data as $row) { - $row['no_ktp_pasien'] = $this->core->getPasienInfo('no_ktp', $row['no_rkm_medis']); - $row['nm_pasien'] = $this->core->getPasienInfo('nm_pasien', $row['no_rkm_medis']); - $row['nm_dokter'] = $this->core->getDokterInfo('nm_dokter', $row['kd_dokter']); - $row['no_ktp_dokter'] = $this->core->getPegawaiInfo('no_ktp', $row['kd_dokter']); + $mlite_satu_sehat_response = $this->db('mlite_satu_sehat_response')->where('no_rawat', $row['no_rawat'])->oneArray(); + $row['no_rawat_converted'] = convertNoRawat($row['no_rawat']); $row['nm_poli'] = $this->core->getPoliklinikInfo('nm_poli', $row['kd_poli']); + $praktisi_id = $this->db('mlite_satu_sehat_mapping_praktisi')->where('kd_dokter', $row['kd_dokter'])->oneArray(); + $row['praktisi_id'] = (is_array($praktisi_id) && isset($praktisi_id['practitioner_id'])) ? $praktisi_id['practitioner_id'] : ''; + $mlite_billing = $this->db('mlite_billing')->where('no_rawat', $row['no_rawat'])->oneArray(); - if($this->settings->get('satu_sehat.billing') == 'khanza') { - $mlite_billing = $this->db('nota_jalan')->select([ - 'tgl_billing' => 'tanggal' - ]) - ->where('no_rawat', $row['no_rawat']) - ->oneArray(); - if($status_lanjut == 'Ranap') { - $mlite_billing = $this->db('nota_inap')->select([ - 'tgl_billing' => 'tanggal' - ]) - ->where('no_rawat', $row['no_rawat']) - ->oneArray(); - } - } - $row['tgl_pulang'] = isset_or($mlite_billing['tgl_billing'], ''); + + $pemeriksaan_ralan = $this->db('pemeriksaan_ralan')->where('no_rawat', $row['no_rawat'])->oneArray(); + + $row['tgl_pulang'] = isset_or($mlite_billing['tgl_billing'], isset_or($pemeriksaan_ralan['tgl_perawatan'], '')); if ($row['status_lanjut'] == 'Ranap') { $row['kd_kamar'] = $this->core->getKamarInapInfo('kd_kamar', $row['no_rawat']); @@ -2489,8 +6665,8 @@ public function getResponse() } $mlite_satu_sehat_lokasi = $this->db('mlite_satu_sehat_lokasi')->where('kode', $row['kd_poli'])->oneArray(); - $row['id_organisasi'] = $mlite_satu_sehat_lokasi['id_organisasi_satusehat']; - $row['id_lokasi'] = $mlite_satu_sehat_lokasi['id_lokasi_satusehat']; + $row['id_organisasi'] = isset_or($mlite_satu_sehat_lokasi['id_organisasi_satusehat'], ''); + $row['id_lokasi'] = isset_or($mlite_satu_sehat_lokasi['id_lokasi_satusehat'], ''); $row['pemeriksaan'] = $this->db('pemeriksaan_ralan') ->where('no_rawat', $row['no_rawat']) @@ -2513,8 +6689,136 @@ public function getResponse() ->where('prioritas', '1') ->oneArray(); + $row['prosedur_pasien'] = $this->db('prosedur_pasien') + ->join('icd9', 'icd9.kode=prosedur_pasien.kode') + ->where('no_rawat', $row['no_rawat']) + ->where('prosedur_pasien.status', $row['status_lanjut']) + ->where('prioritas', '1') + ->oneArray(); + + $row['adime_gizi'] = $this->db('catatan_adime_gizi') + ->where('no_rawat', $row['no_rawat'])->oneArray(); + + $row['immunization'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') + ->join('mlite_satu_sehat_mapping_obat', 'mlite_satu_sehat_mapping_obat.kode_brng=resep_dokter.kode_brng') + ->where('mlite_satu_sehat_mapping_obat.type', 'vaksin') + ->where('no_rawat', $row['no_rawat'])->oneArray(); + + $row['clinical_impression'] = isset_or($row['pemeriksaan']['penilaian'], ''); + + $row['medications'] = $this->db('resep_obat') + ->join('resep_dokter', 'resep_dokter.no_resep=resep_obat.no_resep') + ->where('no_rawat', $row['no_rawat'])->oneArray(); + + $row['medication_request'] = isset_or($row['medications']['tgl_peresepan'], ''); + + $row['medication_dispense'] = isset_or($row['medications']['tgl_perawatan'], ''); + + $row['medication_statement'] = isset_or($row['medications']['tgl_penyerahan'], ''); + + $row['permintaan_radiologi'] = $this->db('permintaan_radiologi') + ->where('no_rawat', $row['no_rawat']) + ->oneArray(); + + $row['service_request_radiologi'] = isset_or($row['permintaan_radiologi']['tgl_permintaan'], ''); + + $row['specimen_radiologi'] = isset_or($row['permintaan_radiologi']['tgl_sampel'], ''); + + $row['observation_radiologi'] = isset_or($row['permintaan_radiologi']['tgl_hasil'], ''); + + $row['diagnostic_report_radiologi'] = isset_or($row['permintaan_radiologi']['tgl_hasil'], ''); + + $pacs_study = $this->db('mlite_mini_pacs_study') + ->where('no_rawat', $row['no_rawat']) + ->oneArray(); + $row['imaging_study_radiologi'] = isset($pacs_study['id']) ? $pacs_study['id'] : null; + + $row['permintaan_lab'] = $this->db('permintaan_lab') + ->where('no_rawat', $row['no_rawat']) + ->oneArray(); + + $row['service_request_lab_pk'] = isset_or($row['permintaan_lab']['tgl_permintaan'], ''); + + $row['service_request_lab_pa'] = isset_or($row['permintaan_lab']['tgl_permintaan'], ''); + + $row['service_request_lab_mb'] = isset_or($row['permintaan_lab']['tgl_permintaan'], ''); + + $row['specimen_lab_pk'] = isset_or($row['permintaan_lab']['tgl_sampel'], ''); + + $row['specimen_lab_pa'] = $row['permintaan_lab']; + + $row['specimen_lab_mb'] = $row['permintaan_lab']; + + $row['observation_lab_pk'] = isset_or($row['permintaan_lab']['tgl_hasil'], ''); + + $row['observation_lab_pa'] = $row['permintaan_lab']; + + $row['observation_lab_mb'] = $row['permintaan_lab']; + + $row['diagnostic_report_lab_pk'] = isset_or($row['permintaan_lab']['tgl_hasil'], ''); + + $row['diagnostic_report_lab_pa'] = $row['permintaan_lab']; + + $row['diagnostic_report_lab_mb'] = $row['permintaan_lab']; + + $row['care_plan'] = isset_or($row['pemeriksaan']['rtl'], ''); + + $allergy_list = [ + [ + 'deskripsi' => 'Allergy to food', + 'snomed_ct' => '414285001', + 'icd_10' => 'T78.1', + 'category' => 'food' + ], + [ + 'deskripsi' => 'Allergy to drug', + 'snomed_ct' => '416098002', + 'icd_10' => 'T88.7', + 'category' => 'drug' + ], + [ + 'deskripsi' => 'Allergy to nutraceutical', + 'snomed_ct' => '300910009', + 'icd_10' => 'J30.1', + 'category' => 'environment' + ], + [ + 'deskripsi' => 'Allergy to dust', + 'snomed_ct' => '232350006', + 'icd_10' => 'J30.8', + 'category' => 'environment' + ], + [ + 'deskripsi' => 'Allergic disposition', + 'snomed_ct' => '609328004', + 'icd_10' => 'T78.4', + 'category' => 'environment' + ] + ]; + + $allergy_icd10 = array_column($allergy_list, 'icd_10'); + + $row['allergy'] = []; + + $allergy = $this->db('diagnosa_pasien') + ->join('penyakit', 'penyakit.kd_penyakit = diagnosa_pasien.kd_penyakit') + ->where('no_rawat', $row['no_rawat']) + ->where('diagnosa_pasien.status', $row['status_lanjut']) + ->in('diagnosa_pasien.kd_penyakit', $allergy_icd10) + ->oneArray(); + + $allergy_map = array_column($allergy_list, null, 'icd_10'); + + if (!empty($allergy) && isset($allergy_map[$allergy['kd_penyakit']])) { + $row['allergy'][] = $allergy_map[$allergy['kd_penyakit']]; + } + + $row['questionnaire'] = $this->db('catatan_perawatan')->where('no_rawat', $row['no_rawat'])->where('catatan', 'KPS')->oneArray(); + $row['id_encounter'] = isset_or($mlite_satu_sehat_response['id_encounter'], ''); $row['id_condition'] = isset_or($mlite_satu_sehat_response['id_condition'], ''); + $row['id_clinical_impression'] = isset_or($mlite_satu_sehat_response['id_clinical_impression'], ''); $row['id_observation_ttvtensi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvtensi'], ''); $row['id_observation_ttvnadi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvnadi'], ''); $row['id_observation_ttvrespirasi'] = isset_or($mlite_satu_sehat_response['id_observation_ttvrespirasi'], ''); @@ -2527,9 +6831,46 @@ public function getResponse() $row['id_observation_ttvkesadaran'] = isset_or($mlite_satu_sehat_response['id_observation_ttvkesadaran'], ''); $row['id_procedure'] = isset_or($mlite_satu_sehat_response['id_procedure'], ''); $row['id_composition'] = isset_or($mlite_satu_sehat_response['id_composition'], ''); + $row['id_medication_for_request'] = isset_or($mlite_satu_sehat_response['id_medication_for_request'], ''); + $row['id_medication_request'] = isset_or($mlite_satu_sehat_response['id_medication_request'], ''); + $row['id_medication_for_dispense'] = isset_or($mlite_satu_sehat_response['id_medication_for_dispense'], ''); + $row['id_medication_dispense'] = isset_or($mlite_satu_sehat_response['id_medication_dispense'], ''); + $row['id_immunization'] = isset_or($mlite_satu_sehat_response['id_immunization'], ''); + $row['id_procedure'] = isset_or($mlite_satu_sehat_response['id_procedure'], ''); + $row['id_clinical_impression'] = isset_or($mlite_satu_sehat_response['id_clinical_impression'], ''); + $row['id_medication_request'] = isset_or($mlite_satu_sehat_response['id_medication_request'], ''); + $row['id_medication_dispense'] = isset_or($mlite_satu_sehat_response['id_medication_dispense'], ''); + $row['id_medication_statement'] = isset_or($mlite_satu_sehat_response['id_medication_statement'], ''); + $row['id_rad_request'] = isset_or($mlite_satu_sehat_response['id_rad_request'], ''); + $row['id_rad_specimen'] = isset_or($mlite_satu_sehat_response['id_rad_specimen'], ''); + $row['id_rad_observation'] = isset_or($mlite_satu_sehat_response['id_rad_observation'], ''); + $row['id_rad_diagnostic'] = isset_or($mlite_satu_sehat_response['id_rad_diagnostic'], ''); + $row['id_imaging_study'] = isset_or($mlite_satu_sehat_response['id_imaging_study'], ''); + $row['id_lab_pk_request'] = isset_or($mlite_satu_sehat_response['id_lab_pk_request'], ''); + $row['id_service_request_lab_pa'] = isset_or($mlite_satu_sehat_response['id_service_request_lab_pa'], ''); + $row['id_service_request_lab_mb'] = isset_or($mlite_satu_sehat_response['id_service_request_lab_mb'], ''); + $row['id_lab_pk_specimen'] = isset_or($mlite_satu_sehat_response['id_lab_pk_specimen'], ''); + $row['id_specimen_lab_pa'] = isset_or($mlite_satu_sehat_response['id_specimen_lab_pa'], ''); + $row['id_specimen_lab_mb'] = isset_or($mlite_satu_sehat_response['id_specimen_lab_mb'], ''); + $row['id_lab_pk_observation'] = isset_or($mlite_satu_sehat_response['id_lab_pk_observation'], ''); + $row['id_observation_lab_pa'] = isset_or($mlite_satu_sehat_response['id_observation_lab_pa'], ''); + $row['id_observation_lab_mb'] = isset_or($mlite_satu_sehat_response['id_observation_lab_mb'], ''); + $row['id_lab_pk_diagnostic'] = isset_or($mlite_satu_sehat_response['id_lab_pk_diagnostic'], ''); + $row['id_diagnostic_report_lab_pa'] = isset_or($mlite_satu_sehat_response['id_diagnostic_report_lab_pa'], ''); + $row['id_diagnostic_report_lab_mb'] = isset_or($mlite_satu_sehat_response['id_diagnostic_report_lab_mb'], ''); + $row['id_careplan'] = isset_or($mlite_satu_sehat_response['id_careplan'], ''); + $row['id_allergy'] = isset_or($mlite_satu_sehat_response['id_allergy'], ''); + $row['id_questionnaire'] = isset_or($mlite_satu_sehat_response['id_questionnaire'], ''); $data_response[] = $row; } - return $this->draw('response.html', ['data_response' => $data_response]); + // Format hasil + echo json_encode([ + "draw" => $draw, + "recordsFiltered" => $filteredTotal, + "recordsTotal" => $total, + "data" => $data_response + ]); + exit(); } public function gen_uuid() @@ -2559,6 +6900,17 @@ public function gen_uuid() ); } + public function ran_char() + { + $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $randomChars = ''; + + for ($i = 0; $i < 3; $i++) { + $randomChars .= $characters[random_int(0, strlen($characters) - 1)]; + } + return $randomChars; + } + public function convertTimeSatset($waktu) { $zonawaktu = '-7 hours'; @@ -2587,42 +6939,80 @@ public function getKyc() $auth_url = $this->authurl; $api_url = 'https://api-satusehat.kemkes.go.id/kyc/v1/generate-url'; $environment = 'production'; - + // nama petugas/operator Fasilitas Pelayanan Kesehatan (Fasyankes) yang akan melakukan validasi $agent_name = $this->core->getUserInfo('fullname', null, true); - + // NIK petugas/operator Fasilitas Pelayanan Kesehatan (Fasyankes) yang akan melakukan validasi - $agent_nik = $this->core->getPegawaiInfo('no_ktp', $this->core->getUserInfo('username', null, true)); - + $agent_nik = $this->core->getPegawaiInfo('no_ktp', $this->core->getUserInfo('username', null, true)); + // auth to satusehat $auth_result = $this->authenticateWithOAuth2($client_id, $client_secret, $auth_url); - + + // Validate authentication result + if ($auth_result === null) { + error_log('Satu Sehat authentication failed: Invalid client credentials or auth URL'); + return $this->draw('error.html', [ + 'title' => 'Authentication Error', + 'message' => 'Failed to authenticate with Satu Sehat API. Please check your client credentials and try again.' + ]); + } + + // Log successful authentication + error_log('Satu Sehat authentication successful'); + // Example usage - $kyc = new Kyc; - $json = $kyc->generateUrl($agent_name, $agent_nik , $auth_result, $api_url, $environment); - - $validation_web = json_decode($json, TRUE); + try { + $kyc = new Kyc; + $json = $kyc->generateUrl($agent_name, $agent_nik, $auth_result, $api_url, $environment); + + $validation_web = json_decode($json, TRUE); + + if (json_last_error() !== JSON_ERROR_NONE) { + error_log('Satu Sehat KYC JSON Parse Error: ' . json_last_error_msg() . ' - Response: ' . $json); + return $this->draw('error.html', [ + 'title' => 'KYC Response Error', + 'message' => 'Failed to parse KYC response from Satu Sehat API. Please try again later.' + ]); + } + + if (!isset($validation_web["data"]["url"])) { + error_log('Satu Sehat KYC Error: No URL in response - ' . $json); + return $this->draw('error.html', [ + 'title' => 'KYC URL Error', + 'message' => 'KYC URL not found in Satu Sehat API response. Please check your configuration.' + ]); + } - $url = $validation_web["data"]["url"]; + $url = $validation_web["data"]["url"]; + error_log('Satu Sehat KYC URL generated successfully'); - return $this->draw('kyc.html', ['url' => $url]); + return $this->draw('kyc.html', ['url' => $url]); + + } catch (\Exception $e) { + error_log('Satu Sehat KYC Exception: ' . $e->getMessage()); + return $this->draw('error.html', [ + 'title' => 'KYC Generation Error', + 'message' => 'An error occurred while generating KYC URL: ' . $e->getMessage() + ]); + } } - public function authenticateWithOAuth2($clientId, $clientSecret, $tokenUrl) { - + public function authenticateWithOAuth2($clientId, $clientSecret, $tokenUrl) + { $curl = curl_init(); $params = [ 'grant_type' => 'client_credentials', 'client_id' => $clientId, 'client_secret' => $clientSecret ]; - + curl_setopt_array($curl, array( - CURLOPT_URL => "${tokenUrl}/accesstoken?grant_type=client_credentials", + CURLOPT_URL => "$tokenUrl/accesstoken?grant_type=client_credentials", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 0, + CURLOPT_TIMEOUT => 30, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', @@ -2631,25 +7021,77 @@ public function authenticateWithOAuth2($clientId, $clientSecret, $tokenUrl) { 'Content-Type: application/x-www-form-urlencoded' ), )); - + $response = curl_exec($curl); - + $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $curlError = curl_error($curl); + curl_close($curl); - // echo $response; + + // Check for cURL errors + if ($curlError) { + error_log('Satu Sehat OAuth2 cURL Error: ' . $curlError); + return null; + } + + // Check HTTP status code + if ($httpCode !== 200) { + error_log('Satu Sehat OAuth2 HTTP Error: ' . $httpCode . ' - Response: ' . $response); + return null; + } + // Parse the response body $data = json_decode($response, true); - - // Return the access token + + if (json_last_error() !== JSON_ERROR_NONE) { + error_log('Satu Sehat OAuth2 JSON Parse Error: ' . json_last_error_msg() . ' - Response: ' . $response); + return null; + } + + // Check if access token exists in response + if (!isset($data['access_token'])) { + error_log('Satu Sehat OAuth2 Error: No access token in response - ' . json_encode($data)); + return null; + } + + // Log successful authentication (without exposing the token) + error_log('Satu Sehat OAuth2 authentication successful'); + + // Return the access token return $data['access_token']; } + public function get($url) + { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $res = curl_exec($ch); + curl_close($ch); + return $res; + } + + public function postFHIR($url, $token, $data) + { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Content-Type: application/fhir+json", + "Authorization: Bearer $token" + ]); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + $response = curl_exec($ch); + curl_close($ch); + return $response; + } + private function _addHeaderFiles() { $this->core->addCSS(url('assets/css/dataTables.bootstrap.min.css')); - $this->core->addCSS(url('https://cdn.datatables.net/fixedcolumns/4.3.0/css/fixedColumns.dataTables.min.css')); + $this->core->addCSS(url('assets/css/fixedColumns.dataTables.min.css')); $this->core->addJS(url('assets/jscripts/jquery.dataTables.min.js')); $this->core->addJS(url('assets/jscripts/dataTables.bootstrap.min.js')); - $this->core->addJS(url('https://cdn.datatables.net/fixedcolumns/4.3.0/js/dataTables.fixedColumns.min.js')); + $this->core->addJS(url('assets/jscripts/dataTables.fixedColumns.min.js')); $this->core->addCSS(url('assets/css/bootstrap-datetimepicker.css')); $this->core->addJS(url('assets/jscripts/moment-with-locales.js')); $this->core->addJS(url('assets/jscripts/bootstrap-datetimepicker.js')); diff --git a/plugins/satu_sehat/Help.md b/plugins/satu_sehat/Help.md deleted file mode 100644 index 7f5f62d7a..000000000 --- a/plugins/satu_sehat/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
                  - -
                  diff --git a/plugins/satu_sehat/Info.php b/plugins/satu_sehat/Info.php index c22c93e3c..0a3d6206b 100755 --- a/plugins/satu_sehat/Info.php +++ b/plugins/satu_sehat/Info.php @@ -1,13 +1,14 @@ 'Satu Sehat', - 'description' => 'Modul Satu Sehat Kemkes', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'heartbeat', - 'install' => function () use ($core) { + 'name' => 'Satu Sehat', + 'description' => 'Modul Satu Sehat Kemkes', + 'author' => 'Basoro', + 'category' => 'bridging', + 'version' => '1.0', + 'compatibility' => '6.*.*', + 'icon' => 'heartbeat', + 'install' => function () use ($core) { $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'organizationid', '')"); $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'clientid', '')"); $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'secretkey', '')"); @@ -21,9 +22,15 @@ $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'longitude', '')"); $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'latitude', '')"); $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'zonawaktu', 'WIB')"); - $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'billing', 'mlite')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'farmasi', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'laboratorium', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'radiologi', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'praktisiapotek', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'praktisilab', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'praktisirad', '')"); + $core->db()->pdo()->exec("INSERT INTO `mlite_settings` (`module`, `field`, `value`) VALUES ('satu_sehat', 'imaging', 'mini_pacs')"); }, - 'uninstall' => function () use ($core) { + 'uninstall' => function () use ($core) { $core->db()->pdo()->exec("DELETE FROM `mlite_settings` WHERE `module` = 'satu_sehat'"); } ]; diff --git a/plugins/satu_sehat/Kyc.php b/plugins/satu_sehat/Kyc.php index f23d8f9ee..f863437c5 100644 --- a/plugins/satu_sehat/Kyc.php +++ b/plugins/satu_sehat/Kyc.php @@ -2,6 +2,7 @@ namespace Plugins\Satu_Sehat; +use Exception; use phpseclib3\Crypt\PublicKeyLoader; use phpseclib3\Crypt\RSA; use phpseclib3\Crypt\AES; @@ -141,9 +142,23 @@ public function encryptMessage($message, $pubPEM) { //done php_sec_lib public function decryptMessage($message, $privateKey) { + // Check if the response is a JSON error message instead of encrypted data + $trimmedMessage = trim($message); + if (substr($trimmedMessage, 0, 1) === '{') { + // This is a JSON response, likely an error from the server + error_log('Satu Sehat API returned JSON response instead of encrypted data: ' . $message); + return $message; // Return the JSON response as-is for error handling + } + $beginTag = "-----BEGIN ENCRYPTED MESSAGE-----"; $endTag = "-----END ENCRYPTED MESSAGE-----"; + // Check if the message has the expected encrypted format + if (strpos($message, $beginTag) === false || strpos($message, $endTag) === false) { + error_log('Invalid encrypted message format. Response: ' . substr($message, 0, 200)); + throw new \Exception('Invalid encrypted message format received from server'); + } + // Fetch the part of the PEM string between beginTag and endTag $messageContents = substr( $message, @@ -153,20 +168,37 @@ public function decryptMessage($message, $privateKey) // Base64 decode the string to get the binary data $binaryDerString = base64_decode($messageContents); + + if ($binaryDerString === false) { + error_log('Failed to base64 decode encrypted message'); + throw new \Exception('Failed to decode encrypted message'); + } // Split the binary data into wrapped key and encrypted message - $wrappedKeyLength = 256; + $wrappedKeyLength = 256; // RSA 2048-bit key produces 256 bytes when encrypted + + if (strlen($binaryDerString) < $wrappedKeyLength) { + error_log('Binary data too short. Expected at least ' . $wrappedKeyLength . ' bytes, got ' . strlen($binaryDerString)); + throw new \Exception('Encrypted data is too short'); + } + $wrappedKey = substr($binaryDerString, 0, $wrappedKeyLength); $encryptedMessage = substr($binaryDerString, $wrappedKeyLength); - // Unwrap the key using RSA private key - $key = PublicKeyLoader::load($privateKey); - $aesKey = $key->decrypt($wrappedKey); - - // Decrypt the encrypted message using the unwrapped key - $decryptedMessage = $this->aesDecrypt($encryptedMessage, $aesKey); - - return $decryptedMessage; + try { + // Unwrap the key using RSA private key with OAEP padding + $key = PublicKeyLoader::load($privateKey); + $key = $key->withPadding(RSA::ENCRYPTION_OAEP); + $aesKey = $key->decrypt($wrappedKey); + + // Decrypt the encrypted message using the unwrapped key + $decryptedMessage = $this->aesDecrypt($encryptedMessage, $aesKey); + + return $decryptedMessage; + } catch (\Exception $e) { + error_log('RSA decryption failed: ' . $e->getMessage()); + throw new \Exception('RSA decryption failed: ' . $e->getMessage()); + } } //not need php_sec_lib directly @@ -238,7 +270,41 @@ public function generateUrl($agen,$nik_agen,$accessToken, $apiUrl, $environment) curl_close($ch); // Output the response - return $this->decryptMessage($response,$privateKey); + $decryptedResponse = $this->decryptMessage($response, $privateKey); + + // Check if the response is a JSON response + $trimmedResponse = trim($decryptedResponse); + if (substr($trimmedResponse, 0, 1) === '{') { + // Parse JSON to check if it's an error or success response + $responseData = json_decode($decryptedResponse, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + error_log('Failed to parse JSON response: ' . $decryptedResponse); + throw new \Exception('Invalid JSON response from Satu Sehat API'); + } + + // Check if it's an error response (has 'fault' field) + if (isset($responseData['fault'])) { + error_log('Satu Sehat KYC API Error Response: ' . $decryptedResponse); + throw new \Exception('Satu Sehat API Error: ' . json_encode($responseData['fault'])); + } + + // Check if it's a successful response (has 'metadata' with code 200 and 'data' field) + if (isset($responseData['metadata']) && + isset($responseData['metadata']['code']) && + $responseData['metadata']['code'] === '200' && + isset($responseData['data'])) { + // This is a successful response, return it as-is + error_log('Satu Sehat KYC API Success Response: ' . $decryptedResponse); + return $decryptedResponse; + } + + // If it's neither a clear error nor a clear success, log and return + error_log('Satu Sehat KYC API Unknown JSON Response: ' . $decryptedResponse); + return $decryptedResponse; + } + + return $decryptedResponse; } } diff --git a/plugins/satu_sehat/README.md b/plugins/satu_sehat/README.md new file mode 100644 index 000000000..0656bab43 --- /dev/null +++ b/plugins/satu_sehat/README.md @@ -0,0 +1,91 @@ +# Plugin Satu Sehat + +Modul integrasi platform **Satu Sehat** Kementerian Kesehatan RI di mLITE, menggunakan standar FHIR R4 untuk pengiriman data kunjungan, diagnosa, tindakan, obat, laboratorium, dan radiologi ke platform nasional. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Satu Sehat**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Referensi Praktisi + - Referensi Pasien + - Mapping Departemen + - Mapping Lokasi + - Mapping Praktisi + - Mapping Obat + - Mapping Laboratorium + - Mapping Radiologi + - Data Response + - Verifikasi KYC + - Pengaturan + +## Panduan Pengguna (Petugas) + +1. **Referensi Praktisi** + - Cari ID IHS dokter/tenaga kesehatan dari Satu Sehat menggunakan NIK dokter. + - Hasil pencarian menampilkan `practitioner_id` yang diperlukan untuk mapping. + +2. **Referensi Pasien** + - Cari ID IHS pasien dari Satu Sehat menggunakan NIK pasien. + - Digunakan untuk verifikasi identitas pasien sebelum pengiriman data encounter. + +3. **Data Response** + - Lihat riwayat respons FHIR yang diterima dari platform Satu Sehat untuk setiap encounter yang dikirim. + - Gunakan untuk memantau status keberhasilan pengiriman data. + +4. **Verifikasi KYC** + - Lakukan verifikasi KYC (Know Your Customer) pasien melalui integrasi Satu Sehat. + - Pastikan data NIK pasien sudah benar sebelum melakukan verifikasi. + +## Panduan Admin + +1. **Pengaturan (Wajib dikonfigurasi pertama kali)** + - Buka **Satu Sehat → Pengaturan** dan isi: + - **Organization ID**: ID organisasi fasyankes di Satu Sehat. + - **Client ID**: Client ID aplikasi dari konsol Satu Sehat. + - **Secret Key**: Secret key aplikasi dari konsol Satu Sehat. + - **Auth URL**: URL autentikasi OAuth2 (default: environment dev Kemkes). + - **FHIR URL**: URL FHIR R4 (default: environment dev Kemkes). + - **Zona Waktu**: WIB / WITA / WIT — digunakan pada timestamp FHIR. + - **Kode Pos, Kelurahan, Kecamatan, Kabupaten, Propinsi**: kode wilayah administratif fasyankes. + - **Longitude & Latitude**: koordinat lokasi fasyankes. + - **Imaging**: `mini_pacs` (default) — pengaturan sistem imaging radiologi. + - Simpan pengaturan sebelum menggunakan fitur lain. + +2. **Mapping Departemen** + - Daftarkan setiap departemen/poliklinik fasyankes sebagai **Organization** di Satu Sehat. + - Klik **Daftar** pada departemen yang belum memiliki ID Satu Sehat — sistem mengirim request POST ke `/Organization`. + - ID organisasi yang diterima disimpan di tabel `mlite_satu_sehat_departemen`. + - Gunakan **Update** untuk memperbarui data organisasi jika ada perubahan. + +3. **Mapping Lokasi** + - Daftarkan setiap poliklinik/bangsal sebagai **Location** di Satu Sehat. + - Klik **Daftar** — sistem mengirim request POST ke `/Location` dengan data alamat dan koordinat fasyankes. + - ID lokasi yang diterima disimpan di tabel `mlite_satu_sehat_lokasi`. + - Mapping lokasi diperlukan sebelum pengiriman data Encounter. + +4. **Mapping Praktisi** + - Petakan setiap dokter/tenaga kesehatan lokal ke ID IHS di Satu Sehat. + - Masukkan NIK dokter untuk mencari `practitioner_id` dari platform Satu Sehat. + - Data mapping tersimpan di tabel `mlite_satu_sehat_mapping_praktisi`. + +5. **Mapping Obat** + - Petakan kode obat lokal ke kode KFA (Katalog Farmasi Alat Kesehatan) Satu Sehat. + - Gunakan fitur pencarian kode KFA untuk menemukan kode yang sesuai. + - Data mapping tersimpan di tabel mapping obat Satu Sehat. + +6. **Mapping Laboratorium & Mapping Radiologi** + - Petakan jenis pemeriksaan laboratorium dan radiologi lokal ke kode LOINC atau kode standar Satu Sehat yang sesuai. + +7. **Pengiriman Data Encounter** + - Setelah semua mapping selesai, pengiriman Encounter dapat dilakukan dari modul Rawat Jalan/Rawat Inap. + - Encounter mendukung tipe **ambulatory** (rawat jalan) dan **inpatient encounter** (rawat inap). + +## Catatan + +- Konfigurasi awal (Organization ID, Client ID, Secret Key, URL) **wajib** diisi sebelum fitur lain dapat digunakan. +- Urutan setup: Pengaturan → Mapping Departemen → Mapping Lokasi → Mapping Praktisi → Mapping Obat/Lab/Rad. +- Ganti **Auth URL** dan **FHIR URL** ke endpoint produksi Kemkes saat siap go-live (hilangkan `-dev` dari URL). +- Access token OAuth2 diambil otomatis setiap kali ada request FHIR — tidak perlu refresh manual. +- Data NIK pasien harus diisi dengan benar di master pasien agar pencarian ID IHS berhasil. diff --git a/plugins/satu_sehat/Site.php b/plugins/satu_sehat/Site.php new file mode 100644 index 000000000..2e7a3234b --- /dev/null +++ b/plugins/satu_sehat/Site.php @@ -0,0 +1,801 @@ +route('satu-sehat/encounter/(:any)', 'forwardEncounter'); + $this->route('satu-sehat/condition/(:any)', 'forwardCondition'); + $this->route('satu-sehat/observation/(:any)/(:any)', 'forwardObservation'); + $this->route('satu-sehat/procedure/(:any)', 'forwardProcedure'); + $this->route('satu-sehat/diet-gizi/(:any)', 'forwardDietGizi'); + $this->route('satu-sehat/vaksin/(:any)', 'forwardVaksin'); + $this->route('satu-sehat/care-plan/(:any)', 'forwardCarePlan'); + $this->route('satu-sehat/allergy/(:any)', 'forwardAllergy'); + $this->route('satu-sehat/questionnaire/(:any)', 'forwardQuestionnaire'); + $this->route('satu-sehat/clinical-impression/(:any)', 'forwardClinicalImpression'); + $this->route('satu-sehat/medication/(:any)/(:any)', 'forwardMedication'); + $this->route('satu-sehat/medication/(:any)', 'forwardMedication'); + $this->route('satu-sehat/laboratory/(:any)/(:any)', 'forwardLaboratory'); + $this->route('satu-sehat/laboratory/(:any)', 'forwardLaboratory'); + $this->route('satu-sehat/radiology/(:any)/(:any)', 'forwardRadiology'); + $this->route('satu-sehat/radiology/(:any)', 'forwardRadiology'); + $this->route('satu-sehat/forward-norawat/(:any)', 'forwardByNoRawat'); + $this->route('satu-sehat/forward-norawat', 'forwardByNoRawat'); + $this->route('satu-sehat/forward-tanggal/(:any)', 'forwardByDate'); + $this->route('satu-sehat/forward-tanggal', 'forwardByDate'); + } + + public function forwardEncounter($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getEncounter($no_rawat, false); + } + + public function forwardCondition($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getCondition($no_rawat, false); + } + + public function forwardObservation($no_rawat = null, $ttv = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($ttv === null && isset($_GET['ttv'])) { + $ttv = $_GET['ttv']; + } + + // Manual fix for router issue consuming slashes + if ($ttv === null && strpos($no_rawat, '/') !== false) { + $parts = explode('/', $no_rawat); + $last = end($parts); + if (in_array($last, ["tensi", "nadi", "respirasi", "suhu", "spo2", "gcs", "kesadaran", "berat", "tinggi", "perut"])) { + $ttv = $last; + array_pop($parts); + $no_rawat = implode('/', $parts); + } + } + + if ($no_rawat === null || $ttv === null) { + echo json_encode(['error' => 'parameter kosong', 'no_rawat' => htmlspecialchars($no_rawat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'ttv' => htmlspecialchars($ttv, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getObservation($no_rawat, $ttv, false); + } + + public function forwardProcedure($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getProcedure($no_rawat, false); + } + + public function forwardDietGizi($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getDietGizi($no_rawat, false); + } + + public function forwardVaksin($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getVaksin($no_rawat, false); + } + + public function forwardClinicalImpression($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getClinicalImpression($no_rawat, false); + } + + public function forwardMedication($no_rawat = null, $tipe = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($tipe === null && isset($_GET['tipe'])) { + $tipe = $_GET['tipe']; + } + + // Manual fix for router issue consuming slashes + if ($tipe === null && strpos($no_rawat, '/') !== false) { + $parts = explode('/', $no_rawat); + $last = end($parts); + if (in_array($last, ['request', 'dispense', 'statement'])) { + $tipe = $last; + array_pop($parts); + $no_rawat = implode('/', $parts); + } + } + + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + if ($tipe === null) { + $tipe = 'request'; + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getMedication((string)$no_rawat, (string)$tipe, false); + } + + public function forwardCarePlan($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getCarePlan($no_rawat, false); + } + + public function forwardAllergy($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getAllergy($no_rawat, false); + } + + public function forwardQuestionnaire($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getQuestionnaire($no_rawat, false); + } + + public function forwardLaboratory($no_rawat = null, $tipe = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($tipe === null && isset($_GET['tipe'])) { + $tipe = $_GET['tipe']; + } + + // Manual fix for router issue consuming slashes + if ($tipe === null && strpos($no_rawat, '/') !== false) { + $parts = explode('/', $no_rawat); + $last = end($parts); + if (in_array($last, ['request', 'specimen', 'observation', 'diagnostic'])) { + $tipe = $last; + array_pop($parts); + $no_rawat = implode('/', $parts); + } + } + + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + if ($tipe === null) { + $tipe = 'request'; + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getLaboratory((string)$no_rawat, (string)$tipe, false); + } + + public function forwardRadiology($no_rawat = null, $tipe = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($tipe === null && isset($_GET['tipe'])) { + $tipe = $_GET['tipe']; + } + + // Manual fix for router issue consuming slashes + if ($tipe === null && strpos($no_rawat, '/') !== false) { + $parts = explode('/', $no_rawat); + $last = end($parts); + if (in_array($last, ['request', 'specimen', 'observation', 'diagnostic', 'image'])) { + $tipe = $last; + array_pop($parts); + $no_rawat = implode('/', $parts); + } + } + + if ($no_rawat === null) { + echo json_encode(['error' => 'no_rawat kosong']); + exit(); + } + if ($tipe === null) { + $tipe = 'request'; + } + $admin = new \Plugins\Satu_Sehat\Admin($this->core); + $admin->init(); + return $admin->getRadiology((string)$no_rawat, (string)$tipe, false); + } + + public function forwardByDate($tanggal = null) + { + if ($tanggal === null && isset($_GET['tanggal'])) { + $tanggal = $_GET['tanggal']; + } + if ($tanggal === null) { + $tanggal = date('Y-m-d'); + } + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $tanggal)) { + $tanggal = date('Y-m-d'); + } + $rows = $this->db('reg_periksa') + ->select('no_rawat') + ->where('reg_periksa.tgl_registrasi', $tanggal) + ->where('stts', '!=', 'Batal') + ->toArray(); + $list = []; + foreach ($rows as $r) { + $list[] = [ + 'display' => htmlspecialchars($r['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'url' => str_replace('/', '', htmlspecialchars($r['no_rawat'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')) + ]; + } + $encBase = '/satu-sehat/encounter/'; + $condBase = '/satu-sehat/condition/'; + $obsBase = '/satu-sehat/observation/'; + $procBase = '/satu-sehat/procedure/'; + $impBase = '/satu-sehat/clinical-impression/'; + $vaxBase = '/satu-sehat/vaksin/'; + $dietBase = '/satu-sehat/diet-gizi/'; + $careBase = '/satu-sehat/care-plan/'; + $allergyBase = '/satu-sehat/allergy/'; + $questionnaireBase = '/satu-sehat/questionnaire/'; + $medBase = '/satu-sehat/medication/'; + $labBase = '/satu-sehat/laboratory/'; + $radBase = '/satu-sehat/radiology/'; + + echo ' + + + + Forward Satu Sehat + + + + + + +

                  Proses tanggal ' . htmlspecialchars($tanggal, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '

                  + +
                  + +
                  +
                  Ringkasan JSON
                  +
                  
                  +        
                  + + + + + '; + + echo ''; + exit(); + } + + + + public function forwardByNoRawat($no_rawat = null) + { + if ($no_rawat === null && isset($_GET['no_rawat'])) { + $no_rawat = $_GET['no_rawat']; + } + if ($no_rawat === null) { + $no_rawat = ''; + } + $list = []; + if ($no_rawat !== '') { + $list[] = [ + 'display' => htmlspecialchars($no_rawat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), + 'url' => str_replace('/', '', htmlspecialchars($no_rawat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')) + ]; + } + + $encBase = '/satu-sehat/encounter/'; + $condBase = '/satu-sehat/condition/'; + $obsBase = '/satu-sehat/observation/'; + $procBase = '/satu-sehat/procedure/'; + $impBase = '/satu-sehat/clinical-impression/'; + $vaxBase = '/satu-sehat/vaksin/'; + $dietBase = '/satu-sehat/diet-gizi/'; + $careBase = '/satu-sehat/care-plan/'; + $allergyBase = '/satu-sehat/allergy/'; + $questionnaireBase = '/satu-sehat/questionnaire/'; + $medBase = '/satu-sehat/medication/'; + $labBase = '/satu-sehat/laboratory/'; + $radBase = '/satu-sehat/radiology/'; + + echo ' + + + + Forward Satu Sehat + + + + + +

                  Proses no_rawat ' . htmlspecialchars($no_rawat, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '

                  + +
                  + +
                  +
                  Ringkasan JSON
                  +
                  
                  +        
                  + + + + + '; + + echo ''; + exit(); + } + +} diff --git a/plugins/satu_sehat/src/CarePlan.php b/plugins/satu_sehat/src/CarePlan.php new file mode 100644 index 000000000..439380958 --- /dev/null +++ b/plugins/satu_sehat/src/CarePlan.php @@ -0,0 +1,67 @@ +patient_id = $patient_id; + $this->uuid_encounter = $uuid_encounter; + $this->uuid_careplan = $uuid_careplan; + $this->instruction = $instruction; + $this->title = $title; + $this->no_ktp_dokter = $no_ktp_dokter; + } + + public function toJson() + { + $data = [ + "resourceType" => "CarePlan", + "status" => "active", + "intent" => "plan", + "category" => [ + [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "736271009", + "display" => "Outpatient care plan" + ] + ] + ] + ], + "title" => $this->title, + "description" => $this->instruction, + "subject" => [ + "reference" => "Patient/".$this->patient_id, + ], + "encounter" => [ + "reference" => "urn:uuid:".$this->uuid_encounter, + ], + "author" => [ + "reference" => "Practitioner/".$this->no_ktp_dokter, + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_careplan, + "resource" => json_decode($this->toJson(), true), + "request" => [ + "method" => "POST", + "url" => "CarePlan" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/ClinicalImpression.php b/plugins/satu_sehat/src/ClinicalImpression.php new file mode 100644 index 000000000..6a6bbde0c --- /dev/null +++ b/plugins/satu_sehat/src/ClinicalImpression.php @@ -0,0 +1,128 @@ +org_id = $org_id; + $this->uuid_clinical_impression = $uuid_clinical_impression; + $this->no_rawat = $no_rawat; + $this->ihs_patient = $ihs_patient; + $this->nama_pasien = $nama_pasien; + $this->uuid_encounter = $uuid_encounter; + $this->keluhan_utama = $keluhan_utama; + $this->status_clinical_impression = $status_clinical_impression; + } + + public function toJson() + { + $prognosis = $this->status_clinical_impression === 'completed' ? $this->completed() : []; + $coding = $this->status_clinical_impression === 'in-progress' ? $this->inProgress() : []; + $data = array_merge( + [ + "resourceType" => "ClinicalImpression", + "status" => $this->status_clinical_impression, + ], + $coding, + [ + "identifier" => [ + [ + "use" => "official", + "system" => "http://sys-ids.kemkes.go.id/clinicalimpression/" . $this->org_id, + "value" => $this->no_rawat + ] + ], + "subject" => [ + "reference" => "Patient/" . $this->ihs_patient, + "display" => $this->nama_pasien + ], + "encounter" => [ + "reference" => "Encounter/" . $this->uuid_encounter + ], + ], + $prognosis, + [ + "summary" => $this->keluhan_utama, + ] + ); + return $data; + } + + public function inProgress() + { + $data = [ + "code" => [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "312850006", + "display" => "History of disorder" + ] + ] + ], + "prognosisCodeableConcept" => [ + [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "65872000", + "display" => "Fair prognosis" + ] + ] + ] + ] + ]; + return $data; + } + + public function completed() + { + $data = [ + "code" => [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "20481000", + "display" => "Determination of prognosis" + ] + ] + ], + "prognosisCodeableConcept" => [ + [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "65872000", + "display" => "Fair prognosis" + ] + ] + ] + ] + ]; + return $data; + } + + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_clinical_impression, + "resource" => $this->toJson(), + "request" => [ + "method" => "POST", + "url" => "ClinicalImpression" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/Composition.php b/plugins/satu_sehat/src/Composition.php new file mode 100644 index 000000000..e27d51b3e --- /dev/null +++ b/plugins/satu_sehat/src/Composition.php @@ -0,0 +1,89 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_composition = $uuid_composition; + $this->ihs_patient = $ihs_patient; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->nama_pasien = $nama_pasien; + $this->nama_dokter = $nama_dokter; + $this->no_rawat = $no_rawat; + $this->org_id = $org_id; + $this->display_encounter = $display_encounter; + $this->zonawaktu = $zonawaktu; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_composition . '", + "resource": { + "resourceType": "Composition", + "identifier": { + "system": "http://sys-ids.kemkes.go.id/composition/' . $this->org_id . '", + "value": "' . $this->no_rawat . '" + }, + "status": "final", + "type": { + "coding": [ + { + "system": "http://loinc.org", + "code": "18842-5", + "display": "Discharge summary" + } + ] + }, + "category": [ + { + "coding": [ + { + "system": "http://loinc.org", + "code": "LP173421-1", + "display": "Report" + } + ] + } + ], + "subject": { + "reference": "Patient/' . $this->ihs_patient . '", + "display": "' . $this->nama_pasien . '" + }, + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "'.$this->display_encounter.'" + }, + "date": "' . $this->zonawaktu . '", + "author": [ + { + "reference": "Practitioner/' . $this->no_ktp_dokter . '", + "display": "' . $this->nama_dokter . '" + } + ], + "title": "Resume Medis Rawat Jalan", + "custodian": { + "reference": "Organization/' . $this->org_id . '" + } + }, + "request": { + "method": "POST", + "url": "Composition" + } + }'; + } +} diff --git a/plugins/satu_sehat/src/Condition.php b/plugins/satu_sehat/src/Condition.php new file mode 100644 index 000000000..5f5914563 --- /dev/null +++ b/plugins/satu_sehat/src/Condition.php @@ -0,0 +1,76 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_condition = $uuid_condition; + $this->code = $code; + $this->display = $display; + $this->patient_ihs = $patient_ihs; + $this->patient_display = $patient_display; + $this->display_encounter = $display_encounter; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_condition . '", + "resource": { + "resourceType": "Condition", + "clinicalStatus": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/condition-clinical", + "code": "active", + "display": "Active" + } + ] + }, + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/condition-category", + "code": "encounter-diagnosis", + "display": "Encounter Diagnosis" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-10", + "code": "' . $this->code . '", + "display": "' . $this->display . '" + } + ] + }, + "subject": { + "reference": "Patient/' . $this->patient_ihs . '", + "display": "' . $this->patient_display . '" + }, + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "' . $this->display_encounter . '" + } + }, + "request": { + "method": "POST", + "url": "Condition" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/DiagnosticReport.php b/plugins/satu_sehat/src/DiagnosticReport.php new file mode 100644 index 000000000..bc22b3fa9 --- /dev/null +++ b/plugins/satu_sehat/src/DiagnosticReport.php @@ -0,0 +1,91 @@ +uuid_diagnostic_report = $uuid_diagnostic_report; + $this->uuid_specimen = $uuid_specimen; + $this->uuid_encounter = $uuid_encounter; + $this->uuid_service_request = $uuid_service_request; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->ihs_patient = $ihs_patient; + $this->code_loinc = $code_loinc; + $this->display_loinc = $display_loinc; + $this->waktu_hasil = $waktu_hasil; + $this->uuid_observation_lab = $uuid_observation_lab; + } + + public function toJson() + { + + $data = [ + "resourceType" => "DiagnosticReport", + "status" => "final", + "code" => [ + "coding" => [ + [ + "system" => "http://loinc.org", + "code" => $this->code_loinc, + "display" => $this->display_loinc + ] + ] + ], + "subject" => [ + "reference" => "Patient/". $this->ihs_patient, + ], + "encounter" => [ + "reference" => "urn:uuid:".$this->uuid_encounter + ], + "effectiveDateTime" => $this->waktu_hasil, + "issued" => $this->waktu_hasil, + "performer" => [ + [ + "reference" => "Practitioner/" . $this->no_ktp_dokter, + ] + ], + "specimen" => [ + [ + "reference" => "urn:uuid:" . $this->uuid_specimen + ] + ], + "basedOn" => [ + [ + "reference" => "urn:uuid:". $this->uuid_service_request + ] + ], + "result" => [ + [ + "reference" => "urn:uuid:" . $this->uuid_observation_lab + ] + ], + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_diagnostic_report, + "resource" => json_decode($this->toJson(), true), + "request" => [ + "method" => "POST", + "url" => "DiagnosticReport" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/Medication.php b/plugins/satu_sehat/src/Medication.php new file mode 100644 index 000000000..aaf50da0b --- /dev/null +++ b/plugins/satu_sehat/src/Medication.php @@ -0,0 +1,129 @@ +uuid_medication = $uuid_medication; + $this->identifier_org = $identifier_org; + $this->identifier_value = $identifier_value; + $this->kfa_coding = $kfa_coding; + $this->kfa_display = $kfa_display; + $this->form_coding = $form_coding; + $this->form_display = $form_display; + $this->ingredient_coding = $ingredient_coding; + $this->ingredient_display = $ingredient_display; + $this->numerator_code = $numerator_code; + $this->numerator_value = $numerator_value; + $this->denominator_code = $denominator_code; + $this->denominator_system = $denominator_system; + $this->denominator_value = $denominator_value; + $this->no = $no; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:'.$this->uuid_medication.'", + "resource": { + "resourceType": "Medication", + "meta": { + "profile": [ + "https://fhir.kemkes.go.id/r4/StructureDefinition/Medication" + ] + }, + "extension": [ + { + "url": "https://fhir.kemkes.go.id/r4/StructureDefinition/MedicationType", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/medication-type", + "code": "NC", + "display": "Non-compound" + } + ] + } + } + ], + "identifier": [ + { + "use": "official", + "system": "http://sys-ids.kemkes.go.id/medication/'. $this->identifier_org . '", + "value": "'.$this->identifier_value.'-'.$this->no.'" + } + ], + "code": { + "coding": [ + { + "system": "http://sys-ids.kemkes.go.id/kfa", + "code": "'.$this->kfa_coding.'", + "display": "'.$this->kfa_display.'" + } + ] + }, + "status": "active", + "form": { + "coding": [ + { + "system": "http://terminology.kemkes.go.id/CodeSystem/medication-form", + "code": "'.$this->form_coding.'", + "display": "'.$this->form_display.'" + } + ] + }, + "ingredient": [ + { + "itemCodeableConcept": { + "coding": [ + { + "system": "http://sys-ids.kemkes.go.id/kfa", + "code": "'.$this->ingredient_coding.'", + "display": "'.$this->ingredient_display.'" + } + ] + }, + "isActive": true, + "strength": { + "numerator": { + "value": '.$this->numerator_value.', + "system": "http://unitsofmeasure.org", + "code": "'.$this->numerator_code.'" + }, + "denominator": { + "value": '.$this->denominator_value.', + "system": "'.$this->denominator_system.'", + "code": "'.$this->denominator_code.'" + } + } + } + ] + }, + "request": { + "method": "POST", + "url": "Medication" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/MedicationDispense.php b/plugins/satu_sehat/src/MedicationDispense.php new file mode 100644 index 000000000..c7f2a6ea8 --- /dev/null +++ b/plugins/satu_sehat/src/MedicationDispense.php @@ -0,0 +1,170 @@ +uuid_medication_dispense = $uuid_medication_dispense; + $this->organization_id = $organization_id; + $this->identifier_value = $identifier_value; + $this->uuid_medication_for_dispense = $uuid_medication_for_dispense; + $this->medication_name = $medication_name; + $this->ihs_patient = $ihs_patient; + $this->ihs_patient_name = $ihs_patient_name; + $this->uuid_encounter = $uuid_encounter; + $this->practitioner_id = $practitioner_id; + $this->practitioner_name = $practitioner_name; + $this->location_id = $location_id; + $this->uuid_medication_request = $uuid_medication_request; + $this->whenPrepared = $whenPrepared; + $this->whenHanded = $whenHanded; + $this->patient_instruction = $patient_instruction; + $this->dose_value = $dose_value; + $this->dose_unit = $dose_unit; + $this->dose_system = $dose_system; + $this->dose_code = $dose_code; + $this->no = $no; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:'.$this->uuid_medication_dispense.'", + "resource": { + "resourceType": "MedicationDispense", + "identifier": [ + { + "use": "official", + "system": "http://sys-ids.kemkes.go.id/prescription/'.$this->organization_id.'", + "value": "'.$this->identifier_value.'" + }, + { + "use": "official", + "system": "http://sys-ids.kemkes.go.id/prescription-item/'.$this->organization_id.'", + "value": "'.$this->identifier_value.'-'.$this->no.'" + } + ], + "status": "completed", + "category": { + "coding": [ + { + "system": "http://terminology.hl7.org/fhir/CodeSystem/medicationdispense-category", + "code": "outpatient", + "display": "Outpatient" + } + ] + }, + "medicationReference": { + "reference": "urn:uuid:'.$this->uuid_medication_for_dispense.'", + "display": "'.$this->medication_name.'" + }, + "subject": { + "reference": "Patient/'.$this->ihs_patient.'", + "display": "'.$this->ihs_patient_name.'" + }, + "context": { + "reference": "urn:uuid:'.$this->uuid_encounter.'" + }, + "performer": [ + { + "actor": { + "reference": "Practitioner/'.$this->practitioner_id.'", + "display": "Apoteker '.$this->practitioner_name.'" + } + } + ], + "location": { + "reference": "Location/'.$this->location_id.'", + "display": "Farmasi" + }, + "authorizingPrescription": [ + { + "reference": "urn:uuid:'.$this->uuid_medication_request.'" + } + ], + "quantity": { + "value": '.$this->dose_value.', + "system": "'.$this->dose_system.'", + "code": "'.$this->dose_code.'" + }, + "whenPrepared": "'.$this->whenPrepared.'", + "whenHandedOver": "'.$this->whenHanded.'", + "dosageInstruction": [ + { + "sequence": 1, + "additionalInstruction": [ + { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "418577003", + "display": "Take at regular intervals. Complete the prescribed course unless otherwise directed" + } + ] + } + ], + "patientInstruction": "'.$this->patient_instruction.'", + "timing": { + "repeat": { + "frequency": 1, + "period": 1, + "periodUnit": "d" + } + }, + "doseAndRate": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/dose-rate-type", + "code": "ordered", + "display": "Ordered" + } + ] + }, + "doseQuantity": { + "value": '.$this->dose_value.', + "unit": "'.$this->dose_unit.'", + "system": "'.$this->dose_system.'", + "code": "'.$this->dose_code.'" + } + } + ] + } + ] + }, + "request": { + "method": "POST", + "url": "MedicationDispense" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/MedicationRequest.php b/plugins/satu_sehat/src/MedicationRequest.php new file mode 100644 index 000000000..b0433f3ff --- /dev/null +++ b/plugins/satu_sehat/src/MedicationRequest.php @@ -0,0 +1,170 @@ +uuid_medication = $uuid_medication; + $this->uuid_medicationrequest = $uuid_medicationrequest; + $this->organization_id = $organization_id; + $this->identifier_value = $identifier_value; + $this->medication_reference = $medication_reference; + $this->ihs_patient = $ihs_patient; + $this->nama_pasien = $nama_pasien; + $this->time_authored = $time_authored; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->nama_dokter = $nama_dokter; + $this->uuid_condition = $uuid_condition; + $this->uuid_encounter = $uuid_encounter; + $this->reason_reference = $reason_reference; + $this->patient_instruction = $patient_instruction; + $this->route_code = $route_code; + $this->route_display = $route_display; + $this->dose_value = $dose_value; + $this->dose_unit = $dose_unit; + $this->dose_system = $dose_system; + $this->dose_code = $dose_code; + $this->no = $no; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:'.$this->uuid_medicationrequest.'", + "resource": { + "resourceType": "MedicationRequest", + "identifier": [ + { + "use": "official", + "system": "http://sys-ids.kemkes.go.id/prescription/'. $this->organization_id . '", + "value": "'.$this->identifier_value.'" + }, + { + "use": "official", + "system": "http://sys-ids.kemkes.go.id/prescription-item/'. $this->organization_id . '", + "value": "'.$this->identifier_value.'-'.$this->no.'" + } + ], + "status": "completed", + "intent": "order", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/medicationrequest-category", + "code": "outpatient", + "display": "Outpatient" + } + ] + } + ], + "priority": "routine", + "medicationReference": { + "reference": "Medication/'.$this->uuid_medication.'", + "display": "'.$this->medication_reference.'" + }, + "subject": { + "reference": "Patient/' . $this->ihs_patient . '", + "display": "' . $this->nama_pasien . '" + }, + "encounter": { + "reference": "Encounter/' . $this->uuid_encounter . '" + }, + "authoredOn": "'.$this->time_authored.'", + "requester": { + "reference": "Practitioner/' . $this->no_ktp_dokter . '", + "display": "' . $this->nama_dokter . '" + }, + "reasonReference": [ + { + "reference": "Condition/' . $this->uuid_condition . '", + "display": "' . $this->reason_reference . '" + } + ], + "dosageInstruction": [ + { + "sequence": 1, + "patientInstruction": "'.$this->patient_instruction.'", + "route": { + "coding": [ + { + "system": "http://www.whocc.no/atc", + "code": "'.$this->route_code.'", + "display": "'.$this->route_display.'" + } + ] + }, + "doseAndRate": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/dose-rate-type", + "code": "ordered", + "display": "Ordered" + } + ] + }, + "doseQuantity": { + "value": '.$this->dose_value.', + "unit": "'.$this->dose_unit.'", + "system": "'.$this->dose_system.'", + "code": "'.$this->dose_code.'" + } + } + ] + } + ], + "dispenseRequest": { + "dispenseInterval": { + "value": 1, + "unit": "days", + "system": "http://unitsofmeasure.org", + "code": "d" + }, + "quantity": { + "value": '.$this->dose_value.', + "unit": "'.$this->dose_unit.'", + "system": "'.$this->dose_system.'", + "code": "'.$this->dose_code.'" + }, + "performer": { + "reference": "Organization/'. $this->organization_id . '" + } + } + }, + "request": { + "method": "POST", + "url": "MedicationRequest" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/Observation.php b/plugins/satu_sehat/src/Observation.php new file mode 100644 index 000000000..dae8c54f2 --- /dev/null +++ b/plugins/satu_sehat/src/Observation.php @@ -0,0 +1,190 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_observation = $uuid_observation; + $this->ihs_patient = $ihs_patient; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->inProg = $inProg; + $this->zonawaktu = $zonawaktu; + $this->display_nadi = $display_nadi; + $this->observation_type = $observation_type; + $this->uuid_specimen = $uuid_specimen; + $this->uuid_service_request = $uuid_service_request; + $this->code_loinc = $code_loinc; + $this->display_loinc = $display_loinc; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_observation . '", + "resource": { + "resourceType": "Observation", + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "8867-4", + "display": "Heart rate" + } + ] + }, + "subject": { + "reference": "Patient/' . $this->ihs_patient . '" + }, + "performer": [ + { + "reference": "Practitioner/' . $this->no_ktp_dokter . '" + } + ], + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "' . $this->display_nadi . '" + }, + "effectiveDateTime": "' . $this->zonawaktu . '", + "issued": "' . $this->zonawaktu . '", + "valueQuantity": { + "value": '.$this->inProg.', + "unit": "beats/minute", + "system": "http://unitsofmeasure.org", + "code": "/min" + } + }, + "request": { + "method": "POST", + "url": "Observation" + } + },'; + } + + public function toJsonObservation() + { + if ($this->observation_type == 'nadi') { + $category_coding = [ + [ + "system" => "http://terminology.hl7.org/CodeSystem/observation-category", + "code" => "vital-signs", + "display" => "Vital Signs" + ] + ]; + $code_coding = [ + [ + "system" => "http://loinc.org", + "code" => "8867-4", + "display" => "Heart rate" + ] + ]; + $value_additional = [ + "valueQuantity" => [ + "value" => (float) $this->inProg, + "unit" => "beats/minute", + "system" => "http://unitsofmeasure.org", + "code" => "/min" + ] + ]; + + } + + if ($this->observation_type == 'lab') { + $category_coding = [ + [ + "system" => "http://terminology.hl7.org/CodeSystem/observation-category", + "code" => "laboratory", + "display" => "Laboratory" + ] + ]; + $code_coding = [ + [ + "system" => "http://loinc.org", + "code" => $this->code_loinc, + "display" => $this->display_loinc + ] + ]; + $value_additional = [ + "specimen" => [ + "reference" => "urn:uuid:".$this->uuid_specimen + ], + "basedOn" => [ + [ + "reference" => "urn:uuid:".$this->uuid_service_request + ] + ] + ]; + } + + $data = array_merge( + [ + "resourceType" => "Observation", + "status" => "final", + "category" => [ + [ + "coding" => $category_coding + ] + ], + "code" => [ + "coding" => $code_coding + ], + "subject" => [ + "reference" => "Patient/".$this->ihs_patient + ], + "performer" => [ + [ + "reference" => "Practitioner/".$this->no_ktp_dokter + ] + ], + "encounter" => [ + "reference" => "urn:uuid:" . $this->uuid_encounter, + ], + "effectiveDateTime" => $this->zonawaktu, + "issued" => $this->zonawaktu, + ], + $value_additional + ); + + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_observation, + "resource" => json_decode($this->toJsonObservation(), true), + "request" => [ + "method" => "POST", + "url" => "Observation" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/Procedure.php b/plugins/satu_sehat/src/Procedure.php new file mode 100644 index 000000000..753b7a4e0 --- /dev/null +++ b/plugins/satu_sehat/src/Procedure.php @@ -0,0 +1,102 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_procedure = $uuid_procedure; + $this->code_procedure = $code_procedure; + $this->display_procedure = $display_procedure; + $this->ihs_patient = $ihs_patient; + $this->patient_name = $patient_name; + $this->display_encounter = $display_encounter; + $this->zonawaktu = $zonawaktu; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->nama_dokter = $nama_dokter; + $this->coding_code = $coding_code; + $this->coding_display = $coding_display; + } + + public function toJson(){ + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_procedure . '", + "resource": { + "resourceType": "Procedure", + "status": "completed", + "category": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "103693007", + "display": "Diagnostic procedure" + } + ], + "text": "Diagnostic procedure" + }, + "code": { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-9-cm", + "code": "'.$this->code_procedure.'", + "display": "'.$this->display_procedure.'" + } + ] + }, + "subject": { + "reference": "Patient/' . $this->ihs_patient . '", + "display": "' . $this->patient_name . '" + }, + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "'. $this->display_encounter . '" + }, + "performedPeriod": { + "start": "' . $this->zonawaktu . '", + "end": "' . $this->zonawaktu . '" + }, + "performer": [ + { + "actor": { + "reference": "Practitioner/' . $this->no_ktp_dokter . '", + "display": "' . $this->nama_dokter . '" + } + } + ], + "reasonCode": [ + { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-10", + "code": "' . $this->coding_code . '", + "display": "' . $this->coding_display . '" + } + ] + } + ] + }, + "request": { + "method": "POST", + "url": "Procedure" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/QuestionareMedication.php b/plugins/satu_sehat/src/QuestionareMedication.php new file mode 100644 index 000000000..d5460e88e --- /dev/null +++ b/plugins/satu_sehat/src/QuestionareMedication.php @@ -0,0 +1,228 @@ +uuid_questionare = $uuid_questionare; + $this->uuid_encounter = $uuid_encounter; + $this->patient_ihs = $patient_ihs; + $this->patient_name = $patient_name; + $this->practitioner_code = $practitioner_code; + $this->practitioner_name = $practitioner_name; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:'.$this->uuid_questionare.'", + "resource": { + "resourceType": "QuestionnaireResponse", + "questionnaire": "https://fhir.kemkes.go.id/Questionnaire/Q0007", + "status": "completed", + "subject": { + "reference": "Patient/'.$this->patient_ihs.'", + "display": "'.$this->patient_name.'" + }, + "encounter": { + "reference": "urn:uuid:'.$this->uuid_encounter.'" + }, + "authored": "2023-08-31T03:00:00+00:00", + "author": { + "reference": "Practitioner/'.$this->practitioner_code.'", + "display": "Apoteker '.$this->practitioner_name.'" + }, + "source": { + "reference": "Patient/'.$this->patient_ihs.'" + }, + "item": [ + { + "linkId": "1", + "text": "Persyaratan Administrasi", + "item": [ + { + "linkId": "1.1", + "text": "Apakah nama, umur, jenis kelamin, berat badan dan tinggi badan pasien sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "1.2", + "text": "Apakah nama, nomor ijin, alamat dan paraf dokter sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "1.3", + "text": "Apakah tanggal resep sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "1.4", + "text": "Apakah ruangan/unit asal resep sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "2", + "text": "Persyaratan Farmasetik", + "item": [ + { + "linkId": "2.1", + "text": "Apakah nama obat, bentuk dan kekuatan sediaan sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "2.2", + "text": "Apakah dosis dan jumlah obat sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "2.3", + "text": "Apakah stabilitas obat sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "2.4", + "text": "Apakah aturan dan cara penggunaan obat sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + } + ] + }, + { + "linkId": "3", + "text": "Persyaratan Klinis", + "item": [ + { + "linkId": "3.1", + "text": "Apakah ketepatan indikasi, dosis, dan waktu penggunaan obat sudah sesuai?", + "answer": [ + { + "valueCoding": { + "system": "http://terminology.kemkes.go.id/CodeSystem/clinical-term", + "code": "OV000052", + "display": "Sesuai" + } + } + ] + }, + { + "linkId": "3.2", + "text": "Apakah terdapat duplikasi pengobatan?", + "answer": [ + { + "valueBoolean": false + } + ] + }, + { + "linkId": "3.3", + "text": "Apakah terdapat alergi dan reaksi obat yang tidak dikehendaki (ROTD)?", + "answer": [ + { + "valueBoolean": false + } + ] + }, + { + "linkId": "3.4", + "text": "Apakah terdapat kontraindikasi pengobatan?", + "answer": [ + { + "valueBoolean": false + } + ] + }, + { + "linkId": "3.5", + "text": "Apakah terdapat dampak interaksi obat?", + "answer": [ + { + "valueBoolean": false + } + ] + } + ] + } + ] + } + ] + }, + "request": { + "method": "POST", + "url": "QuestionnaireResponse" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/Respiratory.php b/plugins/satu_sehat/src/Respiratory.php new file mode 100644 index 000000000..9bbebbeeb --- /dev/null +++ b/plugins/satu_sehat/src/Respiratory.php @@ -0,0 +1,80 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_respiration = $uuid_respiration; + $this->ihs_patient = $ihs_patient; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->inProg = $inProg; + $this->zonawaktu = $zonawaktu; + $this->display_respiration = $display_respiration; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_respiration . '", + "resource": { + "resourceType": "Observation", + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "9279-1", + "display": "Respiratory rate" + } + ] + }, + "subject": { + "reference": "Patient/' . $this->ihs_patient . '" + }, + "performer": [ + { + "reference": "Practitioner/' . $this->no_ktp_dokter . '" + } + ], + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "'.$this->display_respiration.'" + }, + "effectiveDateTime": "' . $this->zonawaktu . '", + "issued": "' . $this->zonawaktu . '", + "valueQuantity": { + "value": '.$this->inProg.', + "unit": "breaths/minute", + "system": "http://unitsofmeasure.org", + "code": "/min" + } + }, + "request": { + "method": "POST", + "url": "Observation" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/src/ServiceRequest.php b/plugins/satu_sehat/src/ServiceRequest.php new file mode 100644 index 000000000..c63561808 --- /dev/null +++ b/plugins/satu_sehat/src/ServiceRequest.php @@ -0,0 +1,101 @@ +uuid_service_request = $uuid_service_request; + $this->org_id = $org_id; + $this->lab_srid_ordinal = $lab_srid_ordinal; + $this->patient_id = $patient_id; + $this->encounter_id = $encounter_id; + $this->practitioner_id = $practitioner_id; + $this->practitioner_name = $practitioner_name; + $this->code_loinc = $code_loinc; + $this->display_loinc = $display_loinc; + $this->code_kptl = $code_kptl; + $this->display_kptl = $display_kptl; + $this->pemeriksaan = $pemeriksaan; + $this->practitioner_lab = $practitioner_lab; + } + + public function toJson() + { + $data = [ + "resourceType" => "ServiceRequest", + "identifier" => [ + [ + "system" => "http://sys-ids.kemkes.go.id/servicerequest/" . $this->org_id, + "value" => $this->lab_srid_ordinal + ] + ], + "status" => "active", + "intent" => "original-order", + "category" => [ + [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "108252007", + "display" => "Laboratory procedure" + ] + ] + ] + ], + "code" => [ + "coding" => [ + [ + "system" => "http://loinc.org", + "code" => $this->code_loinc, + "display" => $this->display_loinc + ] + ], + "text" => "Pemeriksaan ".$this->pemeriksaan + ], + "subject" => [ + "reference" => "Patient/".$this->patient_id, + ], + "encounter" => [ + "reference" => "urn:uuid:".$this->encounter_id, + ], + "requester" => [ + "reference" => "Practitioner/".$this->practitioner_id, + "display" => $this->practitioner_name + ], + "performer" => [ + [ + "reference" => "Practitioner/10038040334" + ] + ], + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_service_request, + "resource" => json_decode($this->toJson(), true), + "request" => [ + "method" => "POST", + "url" => "ServiceRequest" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} diff --git a/plugins/satu_sehat/src/Specimen.php b/plugins/satu_sehat/src/Specimen.php new file mode 100644 index 000000000..70e1f448d --- /dev/null +++ b/plugins/satu_sehat/src/Specimen.php @@ -0,0 +1,89 @@ +uuid_specimen = $uuid_specimen; + $this->org_id = $org_id; + $this->patient_id = $patient_id; + $this->patient_name = $patient_name; + $this->uuid_service_request = $uuid_service_request; + $this->no_rawat = $no_rawat; + $this->waktu_pengambilan = $waktu_pengambilan; + } + + public function toJson() + { + $data = [ + "resourceType" => "Specimen", + "identifier" => [ + [ + "system" => "http://sys-ids.kemkes.go.id/specimen/" . $this->org_id, + "value" => $this->no_rawat, + "assigner" => [ + "reference" => "Organization/" . $this->org_id, + ] + ] + ], + "status" => "available", + "type" => [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "119297000", + "display" => "Blood specimen (specimen)" + ] + ] + ], + "processing" => [ + [ + "procedure" => [ + "coding" => [ + [ + "system" => "http://snomed.info/sct", + "code" => "9265001", + "display" => "Specimen processing" + ] + ] + ], + "timeDateTime" => $this->waktu_pengambilan, + ] + ], + "subject" => [ + "reference" => "Patient/" . $this->patient_id, + "display" => $this->patient_name + ], + "request" => [ + [ + "reference" => "urn:uuid:" . $this->uuid_service_request, + ] + ], + "receivedTime" => $this->waktu_pengambilan, + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } + + public function toJsonBundle() + { + $data = [ + "fullUrl" => "urn:uuid:" . $this->uuid_specimen, + "resource" => json_decode($this->toJson(), true), + "request" => [ + "method" => "POST", + "url" => "Specimen" + ] + ]; + return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} diff --git a/plugins/satu_sehat/src/Temperature.php b/plugins/satu_sehat/src/Temperature.php new file mode 100644 index 000000000..c23b65aa3 --- /dev/null +++ b/plugins/satu_sehat/src/Temperature.php @@ -0,0 +1,98 @@ +uuid_encounter = $uuid_encounter; + $this->uuid_suhu = $uuid_suhu; + $this->ihs_patient = $ihs_patient; + $this->no_ktp_dokter = $no_ktp_dokter; + $this->suhu = $suhu; + $this->display_encounter_temp = $display_encounter_temp; + $this->code_interpretation = $code_interpretation; + $this->display_interpretation = $display_interpretation; + $this->text_interpretation = $text_interpretation; + $this->zonawaktu = $zonawaktu; + } + + public function toJson() + { + return '{ + "fullUrl": "urn:uuid:' . $this->uuid_suhu . '", + "resource": { + "resourceType": "Observation", + "status": "final", + "category": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/observation-category", + "code": "vital-signs", + "display": "Vital Signs" + } + ] + } + ], + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "8310-5", + "display": "Body temperature" + } + ] + }, + "subject": { + "reference": "Patient/' . $this->ihs_patient . '" + }, + "performer": [ + { + "reference": "Practitioner/' . $this->no_ktp_dokter . '" + } + ], + "encounter": { + "reference": "urn:uuid:' . $this->uuid_encounter . '", + "display": "'.$this->display_encounter_temp.'" + }, + "effectiveDateTime": "' . $this->zonawaktu . '", + "issued": "' . $this->zonawaktu . '", + "valueQuantity": { + "value": '.$this->suhu.', + "unit": "C", + "system": "http://unitsofmeasure.org", + "code": "Cel" + }, + "interpretation": [ + { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation", + "code": "'.$this->code_interpretation.'", + "display": "'.$this->display_interpretation.'" + } + ], + "text": "Di '.$this->text_interpretation.' nilai referensi" + } + ] + }, + "request": { + "method": "POST", + "url": "Observation" + } + },'; + } +} \ No newline at end of file diff --git a/plugins/satu_sehat/view/admin/allergy.html b/plugins/satu_sehat/view/admin/allergy.html new file mode 100755 index 000000000..beb4bcf57 --- /dev/null +++ b/plugins/satu_sehat/view/admin/allergy.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/satu_sehat/view/admin/careplan.html b/plugins/satu_sehat/view/admin/careplan.html new file mode 100755 index 000000000..587320ab1 --- /dev/null +++ b/plugins/satu_sehat/view/admin/careplan.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/satu_sehat/view/admin/clinical.impression.html b/plugins/satu_sehat/view/admin/clinical.impression.html new file mode 100755 index 000000000..621708579 --- /dev/null +++ b/plugins/satu_sehat/view/admin/clinical.impression.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/satu_sehat/view/admin/condition.html b/plugins/satu_sehat/view/admin/condition.html index 3b4a64b24..33b282d22 100755 --- a/plugins/satu_sehat/view/admin/condition.html +++ b/plugins/satu_sehat/view/admin/condition.html @@ -3,8 +3,8 @@ @@ -46,13 +46,13 @@

                  Mapping Departemen Satu Sehat

                  {loop: $satu_sehat_departemen} - {$value.dep_id} - {$value.nama} - {$value.id_organisasi_satusehat} + {?=isset_or($value.dep_id)?} + {?=isset_or($value.nama)?} + {?=isset_or($value.id_organisasi_satusehat)?} {/loop} diff --git a/plugins/satu_sehat/view/admin/dietgizi.html b/plugins/satu_sehat/view/admin/dietgizi.html new file mode 100755 index 000000000..2665b07a4 --- /dev/null +++ b/plugins/satu_sehat/view/admin/dietgizi.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/satu_sehat/view/admin/encounter.html b/plugins/satu_sehat/view/admin/encounter.html index ec9c9d73f..f0c99c7a0 100755 --- a/plugins/satu_sehat/view/admin/encounter.html +++ b/plugins/satu_sehat/view/admin/encounter.html @@ -3,8 +3,8 @@ @@ -28,7 +28,7 @@

                  Mapping Lokasi Satu Sehat

                  @@ -64,19 +64,19 @@

                  Mapping Lokasi Satu Sehat

                  {loop: $satu_sehat_lokasi} - {$value.kode} - {$value.lokasi} - {$value.id_organisasi_satusehat} - {$value.id_lokasi_satusehat} - {$value.longitude} - {$value.latitude} - {$value.altitude} + {?=isset_or($value.kode)?} + {?=isset_or($value.lokasi)?} + {?=isset_or($value.id_organisasi_satusehat)?} + {?=isset_or($value.id_lokasi_satusehat)?} + {?=isset_or($value.longitude)?} + {?=isset_or($value.latitude)?} + {?=isset_or($value.altitude)?} {/loop} diff --git a/plugins/satu_sehat/view/admin/manage.html b/plugins/satu_sehat/view/admin/manage.html index a2faeb1eb..bdf53d77c 100755 --- a/plugins/satu_sehat/view/admin/manage.html +++ b/plugins/satu_sehat/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/satu_sehat/view/admin/mapping.lab.html b/plugins/satu_sehat/view/admin/mapping.lab.html new file mode 100755 index 000000000..edeea3694 --- /dev/null +++ b/plugins/satu_sehat/view/admin/mapping.lab.html @@ -0,0 +1,206 @@ + +

                  Mapping Laboratorium Satu Sehat

                  +
                  + + +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  +

                  + + +

                  +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + {loop: $mapping_lab_satu_sehat} + + + + + + + + + + + {/loop} + +
                  ID TemplateKode PerawatanNama PerawatanCodeDisplaySample CodeSample SystemSample Display
                  {?=isset_or($value.id_template)?}{?=isset_or($value.kd_jenis_prw)?}{?=isset_or($value.Pemeriksaan)?}{?=isset_or($value.code)?}{?=isset_or($value.display)?}{?=isset_or($value.sampel_code, '-')?}{?=isset_or($value.sampel_system, '-')?}{?=isset_or($value.sampel_display, '-')?}
                  +
                  +
                  +
                  + + diff --git a/plugins/satu_sehat/view/admin/mapping.obat.html b/plugins/satu_sehat/view/admin/mapping.obat.html new file mode 100644 index 000000000..87b16ff7a --- /dev/null +++ b/plugins/satu_sehat/view/admin/mapping.obat.html @@ -0,0 +1,194 @@ + +

                  Mapping Obat Satu Sehat

                  +
                  + +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  + + + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + + + + + + + + + {loop: $mapping_obat_satu_sehat} + + + + + + + + + + + + + + + + + + + {/loop} + +
                  Kode Obat LokalKode Obat KFANama Obat KFAKode BahanNama BahanNumeratorSatuan NumeratorDenominatorSatuan DenominatorNama Satuan DenominatorKode SediaanNama SediaanKode RouteNama RouteTipeID Medication
                  {?=isset_or($value.kode_brng)?}{?=isset_or($value.kode_kfa)?}{?=isset_or($value.nama_kfa)?}{?=isset_or($value.kode_bahan)?}{?=isset_or($value.nama_bahan)?}{?=isset_or($value.numerator)?}{?=isset_or($value.satuan_num)?}{?=isset_or($value.denominator)?}{?=isset_or($value.satuan_den)?}{?=isset_or($value.nama_satuan_den)?}{?=isset_or($value.kode_sediaan)?}{?=isset_or($value.nama_sediaan)?}{?=isset_or($value.kode_route)?}{?=isset_or($value.nama_route)?}{?=isset_or($value.type)?}{?=isset_or($value.id_medication, '')?}
                  +
                  +
                  +
                  + + diff --git a/plugins/satu_sehat/view/admin/mapping.praktisi.html b/plugins/satu_sehat/view/admin/mapping.praktisi.html index 50d3fba98..1a33eecf6 100755 --- a/plugins/satu_sehat/view/admin/mapping.praktisi.html +++ b/plugins/satu_sehat/view/admin/mapping.praktisi.html @@ -11,10 +11,21 @@

                  Mapping Praktisi Satu Sehat

                  - {loop: $dokter} - + + {/loop} + +
                  +
                  +
                  +
                  + +
                  @@ -30,22 +41,22 @@

                  Mapping Praktisi Satu Sehat

                  - +
                  - - + + {loop: $mapping_praktisi} - - - + + + {/loop} @@ -53,6 +64,21 @@

                  Mapping Praktisi Satu Sehat

                  + + diff --git a/plugins/satu_sehat/view/admin/medication.html b/plugins/satu_sehat/view/admin/medication.html new file mode 100755 index 000000000..cb2f59bd5 --- /dev/null +++ b/plugins/satu_sehat/view/admin/medication.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/satu_sehat/view/admin/observation.html b/plugins/satu_sehat/view/admin/observation.html index 9633b0c32..5c80d5d85 100755 --- a/plugins/satu_sehat/view/admin/observation.html +++ b/plugins/satu_sehat/view/admin/observation.html @@ -3,8 +3,8 @@
                  ID DokterNama DokterID Dokter & Tenaga MedisNama Dokter & Tenaga Medis ID Praktisi Satu Sehat
                  {$value.kd_dokter}{$value.nm_dokter}{$value.practitioner_id}{?=isset_or($value.kd_dokter)?}{?=isset_or($value.nm_dokter)?}{?=isset_or($value.practitioner_id)?}
                  @@ -29,7 +66,7 @@

                  Data Response Satu Sehat

                  - + @@ -42,6 +79,7 @@

                  Data Response Satu Sehat

                  + @@ -54,44 +92,32 @@

                  Data Response Satu Sehat

                  - - - - {loop: $data_response} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - {/loop} - +
                  No. RM Nama Pasien No. KTP PasienKd. DokterKd. Dokter (ID Praktisi) Nama Dokter No. KTP Dokter Kd. Poli/Unit ID Lokasi ID Encounter ID ConditionID Clinical Impression ID Observation Tensi ID Observation Nadi ID Observation RR ID Observation Kesadaran ID Procedure ID Composition
                  {$value.tgl_registrasi}{$value.no_rawat}{$value.no_rkm_medis}   {$value.nm_pasien}{$value.no_ktp_pasien}{$value.kd_dokter}{$value.nm_dokter}{$value.no_ktp_dokter}{$value.kd_poli}{$value.nm_poli}{$value.stts}{$value.status_lanjut}{$value.status_bayar}{$value.tgl_pulang}{$value.id_organisasi}{$value.id_lokasi}{if: empty($value.id_encounter)}{if: $value.tgl_pulang}{/if}{else}{$value.id_encounter}{/if}{if: empty($value.id_condition)}{if: $value.diagnosa_pasien} {/if}{else}{$value.id_condition}{/if}{if: empty($value.id_observation_ttvtensi)}{if: isset($value.pemeriksaan.tensi)} {/if}{else}{$value.id_observation_ttvtensi}{/if}{if: empty($value.id_observation_ttvnadi)}{if: isset($value.pemeriksaan.nadi)} {/if}{else}{$value.id_observation_ttvnadi}{/if}{if: empty($value.id_observation_ttvrespirasi)}{if: isset($value.pemeriksaan.respirasi)} {/if}{else}{$value.id_observation_ttvrespirasi}{/if}{if: empty($value.id_observation_ttvsuhu)}{if: isset($value.pemeriksaan.suhu_tubuh)} {/if}{else}{$value.id_observation_ttvsuhu}{/if}{if: empty($value.id_observation_ttvspo2)}{if: isset($value.pemeriksaan.spo2)} {/if}{else}{$value.id_observation_ttvspo2}{/if}{if: empty($value.id_observation_ttvgcs)}{if: isset($value.pemeriksaan.gcs)} {/if}{else}{$value.id_observation_ttvgcs}{/if}{if: empty($value.id_observation_ttvtinggi)}{if: isset($value.pemeriksaan.tinggi)} {/if}{else}{$value.id_observation_ttvtinggi}{/if}{if: empty($value.id_observation_ttvberat)}{if: isset($value.pemeriksaan.berat)} {/if}{else}{$value.id_observation_ttvberat}{/if}{if: empty($value.id_observation_ttvperut)}{if: isset($value.pemeriksaan.lingkar_perut)} {/if}{else}{$value.id_observation_ttvperut}{/if}{if: empty($value.id_observation_ttvkesadaran)}{if: isset($value.pemeriksaan.kesadaran)} {/if}{else}{$value.id_observation_ttvkesadaran}{/if}{$value.id_procedure}{$value.id_composition}ID Vaksin/ImunisasiID Medication RequestID Medication DispenseID Medication StatementID Service Request RadiologiID Specimen RadiologiID Observation RadiologiID Diagnostic Report RadiologiImage StudyID Service Request Lab PKID Specimen Lab PKID Observation Lab PKID Diagnostic Report Lab PKID Care PlanID AllergyID Questionnaire
                  @@ -99,32 +125,518 @@

                  Data Response Satu Sehat

                  + \ No newline at end of file + diff --git a/plugins/satu_sehat/view/admin/vaksin.html b/plugins/satu_sehat/view/admin/vaksin.html new file mode 100755 index 000000000..5b7b65885 --- /dev/null +++ b/plugins/satu_sehat/view/admin/vaksin.html @@ -0,0 +1,19 @@ + + + + + diff --git a/plugins/sertisign/Admin.php b/plugins/sertisign/Admin.php new file mode 100644 index 000000000..a45a185d9 --- /dev/null +++ b/plugins/sertisign/Admin.php @@ -0,0 +1,562 @@ + 'manage', + 'TTE QR Visual' => 'signingqr', + 'TTE Invisible' => 'signinginvisible', + 'Webhook Data' => 'datawebhook', + 'Tampil Webhook' => 'tampilwebhook', + 'Pengaturan' => 'settings', + ]; + } + + public function getManage() + { + $sub_modules = [ + ['name' => 'TTE QR Visual', 'url' => url([ADMIN, 'sertisign', 'signingqr']), 'icon' => 'heart', 'desc' => 'TTE QR Visual'], + ['name' => 'TTE Invisible', 'url' => url([ADMIN, 'sertisign', 'signinginvisible']), 'icon' => 'database', 'desc' => 'TTE Invisible'], + ['name' => 'Settings', 'url' => url([ADMIN, 'sertisign', 'settings']), 'icon' => 'clipboard', 'desc' => 'Settings'], + ]; + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); + } + + public function getSigningInvisible() + { + return $this->draw('signing.invisible.html'); + } + + public function postSigningInvisible() + { + if (isset($_FILES['document']) && $_FILES['document']['error'] == 0) { + $document_path = $_FILES['document']['tmp_name']; + $signers = json_decode($_POST['signer'], true); + $page = $_POST['page']; + $flagging = isset($_POST['flagging']) ? json_decode($_POST['flagging'], true) : null; + $pageNumber = $_POST['pageNumber']; + $pageRange = $_POST['pageRange']; + + $result = $this->signingInvisible($document_path, $signers, $page, $flagging, $pageNumber, $pageRange); + + if (isset($result['status']) && $result['status'] == 'error') { + $this->notify('failure', 'TTE Invisible Gagal: ' . $result['message']); + } else { + $this->notify('success', 'TTE Invisible Berhasil'); + } + } else { + $this->notify('failure', 'Dokumen tidak valid'); + } + redirect(url([ADMIN, 'sertisign', 'signinginvisible'])); + } + + public function getSigningQr() + { + return $this->draw('signing.qr.html'); + } + + public function postSigningQr() + { + if (!isset($_FILES['document']) || $_FILES['document']['error'] !== UPLOAD_ERR_OK) { + $this->notify('failure', 'Dokumen tidak valid'); + redirect(url([ADMIN, 'sertisign', 'signingqr'])); + return; + } + + $documentPath = $_FILES['document']['tmp_name']; + + $signer = $_POST['signer'] ?? null; // STRING JSON + $flagging = $_POST['flagging'] ?? null; // STRING JSON + + if (!$signer) { + $this->notify('failure', 'Signer tidak boleh kosong'); + redirect(url([ADMIN, 'sertisign', 'signingqr'])); + return; + } + + $postFields = [ + 'document' => new \CURLFile($documentPath), + 'signer' => $signer, // 🔥 STRING JSON + 'w' => $_POST['w'] ?? '40', + 'h' => $_POST['h'] ?? '40', + ]; + + if ($flagging) { + $postFields['flagging'] = $flagging; // 🔥 STRING JSON + } + + $response = $this->_request( + 'v2/poa/multiple-signing-qr-multiple', + $postFields + ); + + if (($response['success'] ?? false) === true) { + $this->notify( + 'success', + 'TTE berhasil. Transaction ID: ' . + ($response['data']['transaction_id'] ?? '-') + ); + } else { + $this->notify( + 'failure', + 'TTE gagal: ' . ($response['message'] ?? 'Server error') + ); + } + + redirect(url([ADMIN, 'sertisign', 'signingqr'])); + } + +public function postSigningQrERM() +{ + $no_rkm_medis = $_POST['no_rkm_medis'] ?? null; + $no_rawat_enc = $_POST['no_rawat'] ?? null; + $no_rawat = $no_rawat_enc; + + $signer = $_POST['signer'] ?? null; // JSON STRING + $flagging = $_POST['flagging'] ?? null; // JSON STRING + $w = $_POST['w'] ?? '40'; + $h = $_POST['h'] ?? '40'; + + if (!$no_rkm_medis || !$no_rawat) { + $this->notify('failure', 'Parameter pasien tidak lengkap'); + redirect($_SERVER['HTTP_REFERER']); + return; + } + + if (!$signer) { + $this->notify('failure', 'Signer tidak boleh kosong'); + redirect($_SERVER['HTTP_REFERER']); + return; + } + + // 🔐 Sanitasi nama file + $safeRawat = preg_replace('/[^A-Za-z0-9]/', '', $no_rawat); + + $pdfPath = BASE_DIR . '/uploads/sertisign/' + . 'Riwayat_Perawatan_' + . $no_rkm_medis . '_' + . $safeRawat . '.pdf'; + + if (!file_exists($pdfPath)) { + $this->notify('failure', 'File PDF tidak ditemukan' . $pdfPath); + redirect($_SERVER['HTTP_REFERER']); + return; + } + + // 📦 Payload sesuai Postman + $postFields = [ + 'document' => new \CURLFile($pdfPath), + 'signer' => $signer, // 🔥 STRING JSON + 'w' => $w, + 'h' => $h, + ]; + + if ($flagging) { + $postFields['flagging'] = $flagging; // 🔥 STRING JSON + } + + $response = $this->_request( + 'v2/poa/multiple-signing-qr-multiple', + $postFields + ); + + // 🧠 VALIDASI RESPON (INI KUNCI UTAMA) + if ( + isset($response['success']) && + $response['success'] === true && + !empty($response['data']['transaction_id']) + ) { + // OPTIONAL: simpan log transaksi + /* + $this->db->insert('sertisign_log', [ + 'no_rkm_medis' => $no_rkm_medis, + 'no_rawat' => $no_rawat, + 'transaction_id' => $response['data']['transaction_id'], + 'response' => json_encode($response), + 'created_at' => date('Y-m-d H:i:s') + ]); + */ + + // 🧹 Hapus file setelah sukses + // unlink($pdfPath); + + $this->notify( + 'success', + 'TTE berhasil diproses. Transaction ID: ' . + $response['data']['transaction_id'] + ); + } else { + $this->notify( + 'failure', + 'TTE gagal: ' . json_encode($response) . ' | Signer: ' . $signer + ); + } + + redirect($_SERVER['HTTP_REFERER']); +} + + + private function _request(string $endpoint, array $postFields) + { + $apiHost = rtrim($this->settings('sertisign', 'api_host'), '/'); + $apiKey = $this->settings('sertisign', 'api_key'); + + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $apiHost . '/' . ltrim($endpoint, '/'), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $postFields, + CURLOPT_HTTPHEADER => [ + 'Accept: application/json', + 'apikey: ' . $apiKey, + ], + ]); + + $response = curl_exec($curl); + + if ($response === false) { + $error = curl_error($curl); + curl_close($curl); + + return [ + 'success' => false, + 'message' => 'cURL Error: ' . $error + ]; + } + + curl_close($curl); + + return json_decode($response, true); + } + + public function getSettings() + { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'sertisign', 'signingqr'])); + } + $settings = []; + $settings['api_host'] = $this->settings('sertisign', 'api_host'); + $settings['api_key'] = $this->settings('sertisign', 'api_key'); + + return $this->draw('settings.html', ['settings' => $settings]); + } + + public function postSaveSettings() + { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'sertisign', 'signingqr'])); + } + foreach ($_POST as $field => $value) { + $this->settings('sertisign', $field, $value); + } + $this->notify('success', 'Pengaturan berhasil disimpan'); + redirect(url([ADMIN, 'sertisign', 'settings'])); + } + + + // --- API Wrapper Methods --- + + /** + * PoA Register Base Signing + */ + public function registerBase($nik, $name, $dob, $email, $mobile, $selfie_path) + { + $postFields = [ + 'nik' => $nik, + 'name' => $name, + 'dob' => $dob, + 'email' => $email, + 'mobile' => $mobile, + 'selfie' => new \CURLFile( + $selfie_path, + 'image/jpeg', + basename($selfie_path) + ), + ]; + + return $this->_request( + 'v2/poa/register/base', + $postFields + ); + } + + /** + * PoA Register Subscribe + */ + public function registerSubscribe($email, $poa_id) + { + $postFields = [ + 'email' => $email, + 'poa_id' => $poa_id, + ]; + + return $this->_request( + 'v2/poa/register/subscribe', + $postFields + ); + } + + + public function signingQr( + string $document_path, + $signers, + int $w, + int $h, + $page = 'first', + $flagging = null, + $pageNumber = null, + $pageRange = null + ) { + $postFields = [ + 'document' => new \CURLFile( + $document_path, + 'application/pdf', + basename($document_path) + ), + // signer HARUS JSON STRING (sesuai Sertisign) + 'signer' => is_array($signers) ? json_encode($signers) : $signers, + 'w' => (string) $w, + 'h' => (string) $h, + 'page' => $page, + ]; + + if ($flagging) { + // flagging HARUS JSON STRING + $postFields['flagging'] = is_array($flagging) + ? json_encode($flagging) + : $flagging; + } + + if ($pageNumber !== null) { + $postFields['pageNumber'] = $pageNumber; + } + + if ($pageRange !== null) { + $postFields['pageRange'] = $pageRange; + } + + return $this->_request( + 'v2/poa/multiple-signing-qr-multiple', + $postFields + ); + } + + /** + * PoA Multiple Signing Invisible + */ + + public function signingInvisible( + string $document_path, + $signers, + $page = 'first', + $flagging = null, + $pageNumber = null, + $pageRange = null + ) { + $postFields = [ + 'document' => new \CURLFile( + $document_path, + 'application/pdf', + basename($document_path) + ), + // signer HARUS JSON STRING (sesuai Sertisign) + 'signer' => is_array($signers) ? json_encode($signers) : $signers, + 'page' => $page, + ]; + + if ($flagging) { + // flagging HARUS JSON STRING + $postFields['flagging'] = is_array($flagging) + ? json_encode($flagging) + : $flagging; + } + + if ($pageNumber !== null) { + $postFields['pageNumber'] = $pageNumber; + } + + if ($pageRange !== null) { + $postFields['pageRange'] = $pageRange; + } + + return $this->_request( + 'v2/poa/multiple-signing-invisible', + $postFields + ); + } + + /** + * Activate PIN + */ + public function activatePin(string $email) + { + return $this->_request( + 'activate-pin', + ['email' => $email] + ); + } + + /** + * Update PIN Status + */ + public function updatePinStatus(string $email) + { + return $this->_request( + 'update-pin-status', + ['email' => $email] + ); + } + + /** + * Reset PIN + */ + public function resetPin(string $email) + { + return $this->_request( + 'reset-pin', + ['email' => $email] + ); + } + + /** + * Check Token + */ + public function getToken(string $email) + { + return $this->_request( + 'get-token', + ['email' => $email] + ); + } + + /** + * Check Member + */ + public function getMember(string $email) + { + return $this->_request( + 'get-member', + ['email' => $email] + ); + } + + /** + * Upgrade Member + */ + public function upgradeMember(string $email, string $poa_id) + { + return $this->_request( + 'upgrade-poa-member', + [ + 'email' => $email, + 'poa_id' => $poa_id + ] + ); + } + + /** + * Downgrade Member + */ + public function downgradeMember(string $email, string $poa_id) + { + return $this->_request( + 'downgrade-poa-member', + [ + 'email' => $email, + 'poa_id' => $poa_id + ] + ); + } + + /** + * Update Member Status + */ + public function updateMemberStatus(string $email, string $poa_id) + { + return $this->_request( + 'update-member-status', + [ + 'email' => $email, + 'poa_id' => $poa_id + ] + ); + } + +public function getDataWebhook($return = false) +{ + $transactionId = $_GET['transaction_id'] ?? null; + $limit = isset($_GET['limit']) ? (int) $_GET['limit'] : 20; + $offset = isset($_GET['offset']) ? (int) $_GET['offset'] : 0; + + $draw = intval(htmlspecialchars($_GET['draw'] ?? 1, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + $start = intval(htmlspecialchars($_GET['start'] ?? 0, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + $length = intval(htmlspecialchars($_GET['length'] ?? 10, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + + $db = $this->db('mlite_sertisign_webhook'); + + if (!empty($transactionId)) { + $data = $db->where('transaction_id', $transactionId)->oneArray(); + + if (!$data) { + $result = ['success' => false, 'message' => 'Data tidak ditemukan']; + return $return ? $result : print json_encode($result); + } + + $data['payload'] = json_decode($data['payload'], true); + $result = ['success' => true, 'data' => [$data]]; + return $return ? $result : print json_encode($result); + } + + $rows = $db + ->limit($limit) + ->offset($offset) + ->desc('received_at') + ->toArray(); + + foreach ($rows as &$row) { + $row['payload'] = json_decode($row['payload'], true); + } + + $result = [ + 'success' => true, + 'draw' => $draw, + 'total' => count($rows), + 'limit' => $limit, + 'offset' => $offset, + 'recordsTotal' => count($rows), + 'recordsFiltered' => count($rows), + 'data' => $rows + ]; + + if ($return) { + return $result; + } + + header('Content-Type: application/json'); + echo json_encode(htmlspecialchars_array($result)); + exit; +} + +public function getTampilWebhook() +{ + $this->core->addCSS(url('assets/css/datatables.min.css')); + $this->core->addJS(url('assets/jscripts/datatables.min.js')); + + $result = $this->getDataWebhook(true); // 🔥 ambil array, bukan JSON + return $this->draw('tampil.webhook.html', ['data' => htmlspecialchars_array($result)]); +} + + + + // Base64 variants could be added here if needed, but file upload is usually preferred for server-side operations. +} diff --git a/plugins/sertisign/Info.php b/plugins/sertisign/Info.php new file mode 100644 index 000000000..2be1ffd19 --- /dev/null +++ b/plugins/sertisign/Info.php @@ -0,0 +1,18 @@ + 'Sertisign', + 'description' => 'Modul integrasi TTE Sertisign', + 'author' => 'Basoro', + 'version' => '1.0', + 'category' => 'bridging', + 'compatibility' => '6.*.*', + 'icon' => 'sticky-note', + 'install' => function () use ($core) { + $core->db('mlite_settings')->save(['module' => 'sertisign', 'field' => 'api_host', 'value' => 'https://api-stag.sertisign.id/']); + $core->db('mlite_settings')->save(['module' => 'sertisign', 'field' => 'api_key', 'value' => '']); + }, + 'uninstall' => function () use ($core) { + $core->db('mlite_settings')->where('module', 'sertisign')->delete(); + } +]; diff --git a/plugins/sertisign/README.md b/plugins/sertisign/README.md new file mode 100644 index 000000000..e8d719af6 --- /dev/null +++ b/plugins/sertisign/README.md @@ -0,0 +1,73 @@ +# Plugin Sertisign + +Modul integrasi **Tanda Tangan Elektronik (TTE)** menggunakan layanan Sertisign di mLITE, mendukung TTE dengan QR visual maupun tanda tangan tak terlihat (invisible) pada dokumen PDF. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Sertisign**. +- Pilih submenu sesuai kebutuhan: + - Manage + - TTE QR Visual + - TTE Invisible + - Webhook Data + - Tampil Webhook + - Pengaturan + +## Panduan Pengguna (Petugas) + +1. **TTE QR Visual** + - Buka **Sertisign → TTE QR Visual**. + - Upload file PDF yang akan ditandatangani. + - Isi data **Signer** dalam format JSON (email, nama, NIK penandatangan). + - Atur posisi QR: halaman (`first`/`last`/`specific`), lebar (`w`), dan tinggi (`h`) dalam piksel. + - Optionally isi **Flagging** (JSON) untuk metadata tambahan. + - Klik **Proses TTE** — sistem mengirim dokumen ke API Sertisign endpoint `v2/poa/multiple-signing-qr-multiple`. + - Jika berhasil, Transaction ID akan ditampilkan pada notifikasi. + +2. **TTE Invisible** + - Buka **Sertisign → TTE Invisible**. + - Upload file PDF yang akan ditandatangani. + - Isi data **Signer** dalam format JSON. + - Pilih halaman tanda tangan dan optionally isi Flagging. + - Klik **Proses TTE** — sistem mengirim ke endpoint `v2/poa/multiple-signing-invisible`. + - TTE invisible tidak menempatkan gambar QR pada dokumen; tanda tangan tertanam dalam metadata PDF. + +3. **TTE dari ERM (Electronic Medical Record)** + - TTE dapat dipicu langsung dari halaman rekam medis pasien (fitur `postSigningQrERM`). + - File PDF yang ditandatangani harus sudah ada di `uploads/sertisign/` dengan nama format `Riwayat_Perawatan_{no_rkm_medis}_{no_rawat}.pdf`. + - Sertakan parameter `no_rkm_medis` dan `no_rawat` beserta data Signer. + +4. **Tampil Webhook** + - Buka **Sertisign → Tampil Webhook** untuk melihat data callback dari Sertisign. + - Menampilkan daftar webhook yang diterima beserta transaction ID, payload, dan waktu terima. + - Gunakan filter `transaction_id` (via parameter GET) untuk mencari webhook tertentu. + +## Panduan Admin + +1. **Pengaturan (Wajib dikonfigurasi pertama kali)** + - Buka **Sertisign → Pengaturan** dan isi: + - **API Host**: URL base API Sertisign (default: `https://api-stag.sertisign.id/` untuk staging). + - **API Key**: API Key yang diperoleh dari dashboard Sertisign. + - Klik **Simpan** — konfigurasi disimpan ke tabel `mlite_settings` dengan modul `sertisign`. + - Ganti URL ke endpoint produksi saat siap go-live. + +2. **Manajemen Penandatangan (Signer)** + - Sebelum dapat menandatangani, penandatangan harus didaftarkan ke Sertisign: + - **Register Base**: daftarkan penandatangan dengan NIK, nama, tanggal lahir, email, nomor HP, dan foto selfie. + - **Register Subscribe**: hubungkan email penandatangan dengan ID PoA. + - **Activate PIN**: aktifkan PIN penandatangan via email. + - **Reset PIN**: reset PIN jika diperlukan. + - Fungsi-fungsi ini tersedia secara programatik melalui metode API di Admin.php. + +3. **Webhook** + - Daftarkan URL webhook Sertisign ke `{domain}/admin/sertisign/datawebhook`. + - Data webhook yang masuk disimpan otomatis ke tabel `mlite_sertisign_webhook`. + - Monitor data webhook melalui **Tampil Webhook** untuk memastikan callback diterima dengan benar. + +## Catatan + +- Format **Signer** harus berupa JSON string sesuai spesifikasi API Sertisign (bukan array PHP). +- Ukuran QR default adalah 40×40 piksel; sesuaikan `w` dan `h` sesuai kebutuhan dokumen. +- File PDF untuk TTE dari ERM harus sudah digenerate terlebih dahulu dan ditempatkan di `uploads/sertisign/`. +- Ganti `api_host` dari staging (`api-stag.sertisign.id`) ke produksi sebelum digunakan di lingkungan nyata. diff --git a/plugins/sertisign/Site.php b/plugins/sertisign/Site.php new file mode 100644 index 000000000..f4db60f49 --- /dev/null +++ b/plugins/sertisign/Site.php @@ -0,0 +1,108 @@ +route('sertisign/webhook', 'postWebhook'); + } + + public function postWebhook() + { + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + http_response_code(404); + exit; + } + + header('Content-Type: application/json'); + + /* =============================== + * Ambil payload JSON / POST + * =============================== */ + $raw = file_get_contents('php://input'); + $payload = []; + + if (!empty($raw)) { + $json = json_decode($raw, true); + if (json_last_error() === JSON_ERROR_NONE) { + $payload = $json; + } + } + + if (empty($payload)) { + echo json_encode(['error' => 'Payload kosong / tidak valid']); + return; + } + + /* =============================== + * Normalisasi data + * Sertisign biasanya kirim array + * =============================== */ + $data = isset($payload[0]) ? $payload[0] : $payload; + + if (empty($data['transaction_id'])) { + echo json_encode(['error' => 'transaction_id tidak ditemukan']); + return; + } + + $transactionId = $data['transaction_id']; + $documentUrl = $data['document_url'] ?? null; + $status = $data['status'] ?? 'unknown'; + + /* =============================== + * Simpan ke Database + * =============================== */ + $this->db('mlite_sertisign_webhook')->save([ + 'transaction_id' => $transactionId, + 'status' => $status, + 'document_url' => $documentUrl, + 'payload' => json_encode($payload), + 'received_at' => date('Y-m-d H:i:s') + ]); + + /* =============================== + * Simpan file log + * =============================== */ + $basePath = UPLOADS . '/sertisign-log'; + if (!is_dir($basePath)) { + mkdir($basePath, 0777, true); + } + + file_put_contents( + $basePath . '/' . $transactionId . '.json', + json_encode($payload, JSON_PRETTY_PRINT) + ); + + /* =============================== + * Download PDF jika ada + * =============================== */ + $pdfPath = null; + + if (!empty($documentUrl)) { + $pdfPath = $basePath . '/' . $transactionId . '.pdf'; + + try { + $remote = fopen($documentUrl, 'r'); + $local = fopen($pdfPath, 'w'); + stream_copy_to_stream($remote, $local); + fclose($remote); + fclose($local); + } catch (\Throwable $e) { + $pdfPath = null; + } + } + + /* =============================== + * Response ke Sertisign + * =============================== */ + echo json_encode([ + 'success' => true, + 'transaction_id'=> $transactionId, + 'stored' => true, + 'pdf_saved' => $pdfPath ? true : false + ]); + } +} diff --git a/plugins/sertisign/view/admin/manage.html b/plugins/sertisign/view/admin/manage.html new file mode 100644 index 000000000..bdf53d77c --- /dev/null +++ b/plugins/sertisign/view/admin/manage.html @@ -0,0 +1,21 @@ +
                  +
                  + +
                  +
                  diff --git a/plugins/sertisign/view/admin/pdf.view.html b/plugins/sertisign/view/admin/pdf.view.html new file mode 100644 index 000000000..7268ad295 --- /dev/null +++ b/plugins/sertisign/view/admin/pdf.view.html @@ -0,0 +1,19 @@ +
                  +
                  +
                  +
                  +

                  Dokumen TTE Berhasil

                  +
                  +
                  +
                  + Dokumen berhasil ditandatangani! +
                  + + +
                  +
                  +
                  +
                  diff --git a/plugins/sertisign/view/admin/settings.html b/plugins/sertisign/view/admin/settings.html new file mode 100644 index 000000000..d6db1f2ec --- /dev/null +++ b/plugins/sertisign/view/admin/settings.html @@ -0,0 +1,22 @@ +
                  +
                  +
                  +
                  +

                  Pengaturan Sertisign

                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  + +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/sertisign/view/admin/signing.invisible.html b/plugins/sertisign/view/admin/signing.invisible.html new file mode 100644 index 000000000..312b989bf --- /dev/null +++ b/plugins/sertisign/view/admin/signing.invisible.html @@ -0,0 +1,54 @@ +
                  +
                  +
                  +
                  +

                  TTE Invisible

                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +

                  Format JSON: [{"identifier": "email", "pin": "..."}]

                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/sertisign/view/admin/signing.qr.html b/plugins/sertisign/view/admin/signing.qr.html new file mode 100644 index 000000000..27962e29d --- /dev/null +++ b/plugins/sertisign/view/admin/signing.qr.html @@ -0,0 +1,70 @@ +
                  +
                  +
                  +
                  +

                  TTE QR Multi Visual

                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +

                  Format JSON: [{"identifier": "email", "keyword": "...", "qrValue": "...", "pin": "..."}]

                  +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  +
                  + + +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/sertisign/view/admin/tampil.webhook.html b/plugins/sertisign/view/admin/tampil.webhook.html new file mode 100644 index 000000000..dedf6d1dd --- /dev/null +++ b/plugins/sertisign/view/admin/tampil.webhook.html @@ -0,0 +1,85 @@ + + + + + + + + + + +
                  IDTransaction IDStatusReceived AtAksi
                  + + + + + \ No newline at end of file diff --git a/plugins/settings/Admin.php b/plugins/settings/Admin.php index 808d6ccf3..28f9bf64e 100644 --- a/plugins/settings/Admin.php +++ b/plugins/settings/Admin.php @@ -37,11 +37,16 @@ public function getManage() ['name' => 'Pembaruan Sistem', 'url' => url([ADMIN, 'settings', 'updates']), 'icon' => 'cubes', 'desc' => 'Pembaruan sistem'], ['name' => 'Backup & Restore', 'url' => url([ADMIN, 'settings', 'backuprestore']), 'icon' => 'database', 'desc' => 'Backup dan restore database'], ]; - return $this->draw('manage.html', ['sub_modules' => $sub_modules]); + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function getGeneral() { + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'settings', 'manage'])); + } + $this->_addHeaderFiles(); $settings = $this->settings('settings'); $settings['module_pasien'] = $this->db('mlite_modules')->where('dir', 'pasien')->oneArray(); @@ -61,9 +66,17 @@ public function getGeneral() $settings['presensi'] = $this->db('mlite_modules')->where('dir', 'presensi')->oneArray(); $settings['themes'] = $this->_getThemes(); $settings['timezones'] = $this->_getTimezones(); + + $mysql_version = ''; + if (DBDRIVER == 'sqlite') { + $mysql_version = $this->db()->pdo()->query('SELECT sqlite_version()')->fetch()[0]; + } else { + $mysql_version = $this->db()->pdo()->query('SELECT VERSION() as version')->fetch()[0]; + } + $settings['system'] = [ 'php' => PHP_VERSION, - 'mysql' => $this->db()->pdo()->query('SELECT VERSION() as version')->fetch()[0] + 'mysql' => $mysql_version ]; $settings['license'] = []; @@ -90,14 +103,53 @@ public function getGeneral() $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($settings))); $this->tpl->set('url', url([ADMIN, 'settings', 's'])); $this->tpl->set('set_no_rkm_medis', $this->db('set_no_rkm_medis')->oneArray()); - $this->tpl->set('set_nomor_surat', $this->db('mlite_set_nomor_surat')->oneArray()); + $this->tpl->set('set_nomor_surat', $this->settings->get('settings.set_nomor_surat')); return $this->draw('general.html'); } + private function isSafeUrl($url) { + $parsed = parse_url($url); + if (!$parsed || !isset($parsed['scheme']) || strtolower($parsed['scheme']) !== 'https') { + return false; + } + $host = $parsed['host'] ?? ''; + $ips = gethostbynamel($host); + if (!$ips) { + return false; + } + foreach ($ips as $ip) { + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { + return false; + } + } + return true; + } + public function postSaveGeneral() { unset($_POST['save']); + + if (!empty($_POST['_b64'])) { + unset($_POST['_b64']); + $encodedFields = []; + if (!empty($_POST['_b64_fields'])) { + $decodedFields = json_decode($_POST['_b64_fields'], true); + if (is_array($decodedFields)) { + $encodedFields = $decodedFields; + } + } + unset($_POST['_b64_fields']); + foreach ($encodedFields as $field) { + if (isset($_POST[$field]) && is_string($_POST[$field])) { + $decoded = base64_decode($_POST[$field], true); + if ($decoded !== false) { + $_POST[$field] = $decoded; + } + } + } + } + if (($_logo = isset_or($_FILES['logo']['tmp_name'], false))) { $img = new \Systems\Lib\Image; @@ -148,24 +200,32 @@ public function postSaveGeneral() $this->db('set_no_rkm_medis')->save(['no_rkm_medis' => $_POST['set_no_rkm_medis']]); } - if($_POST['set_nomor_surat']) { - $this->db('mlite_set_nomor_surat')->delete(); - $this->db('mlite_set_nomor_surat')->save(['nomor_surat' => $_POST['set_nomor_surat']]); - } - if (!$errors) { $url = "https://mlite.id/datars/save"; - $curlHandle = curl_init(); - curl_setopt($curlHandle, CURLOPT_URL, $url); - curl_setopt($curlHandle, CURLOPT_POSTFIELDS,"nama_instansi=".$_POST['nama_instansi']."&alamat_instansi=".$_POST['alamat']."&kabupaten=".$_POST['kota']."&propinsi=".$_POST['propinsi']."&kontak=".$_POST['nomor_telepon']."&email=".$_POST['email']); - curl_setopt($curlHandle, CURLOPT_HEADER, 0); - curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlHandle, CURLOPT_TIMEOUT,30); - curl_setopt($curlHandle, CURLOPT_POST, 1); - curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false); - curl_exec($curlHandle); - curl_close($curlHandle); + // SSRF protection: validate that the URL is strictly the intended public endpoint + if ($url === "https://mlite.id/datars/save" && $this->isSafeUrl($url)) { + $curlHandle = curl_init(); + curl_setopt($curlHandle, CURLOPT_URL, $url); + curl_setopt($curlHandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); + curl_setopt($curlHandle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS); + curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($curlHandle, CURLOPT_POSTFIELDS, http_build_query([ + 'nama_instansi' => $_POST['nama_instansi'], + 'alamat_instansi' => $_POST['alamat'], + 'kabupaten' => $_POST['kota'], + 'propinsi' => $_POST['propinsi'], + 'kontak' => $_POST['nomor_telepon'], + 'email' => $_POST['email'], + ])); + curl_setopt($curlHandle, CURLOPT_HEADER, 0); + curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curlHandle, CURLOPT_TIMEOUT,30); + curl_setopt($curlHandle, CURLOPT_POST, 1); + curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true); + curl_exec($curlHandle); + curl_close($curlHandle); + } $this->notify('success', 'Pengaturan berhasil disimpan.'); @@ -247,38 +307,215 @@ public function anyTheme($theme = null, $file = null) public function anyUpdates() { + + if ($this->core->getUserInfo('role') != 'admin') { + $this->notify('failure', 'Anda tidak memiliki hak akses untuk halaman ini.'); + redirect(url([ADMIN, 'settings', 'manage'])); + } + $this->tpl->set('allow_curl', intval(function_exists('curl_init'))); $settings = $this->settings('settings'); if (isset($_POST['check'])) { - $url = "https://api.github.com/repos/basoro/mlite/releases/latest"; - $opts = [ - 'http' => [ - 'method' => 'GET', - 'header' => [ - 'User-Agent: PHP' - ] - ] - ]; - $json = file_get_contents($url, false, stream_context_create($opts)); + $url = "https://api.github.com/repos/basoro/mlite/releases/latest"; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_USERAGENT, 'mlite'); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Accept: application/vnd.github+json' + ]); + + $json = curl_exec($ch); + $err = curl_error($ch); + curl_close($ch); + $obj = json_decode($json, true); - + $this->settings('settings', 'update_check', time()); - if (!is_array($obj)) { - $this->tpl->set('error', $obj); + if ($err || !is_array($obj)) { + $this->tpl->set('error', $json); } else { $this->settings('settings', 'update_version', $obj['tag_name']); $this->settings('settings', 'update_changelog', $obj['body']); $this->tpl->set('update_version', $obj['tag_name']); } + } elseif (isset($_POST['upgrade_local'])) { + $upgradeFile = BASE_DIR . '/systems/upgrade.php'; + if (!is_file($upgradeFile)) { + $this->tpl->set('error', "File upgrade tidak ditemukan: systems/upgrade.php"); + return $this->draw('update.html'); + } + + $version = $this->settings->get('settings.version'); + $new_version = include($upgradeFile); + + if ($new_version === true || $new_version === 1) { + // upgrade script didn't return a version number + $new_version = $version; + } + + $this->settings('settings', 'version', $new_version); + $this->settings('settings', 'update_check', time()); + + $this->notify('success', 'Upgrade lokal berhasil dijalankan.'); + redirect(url([ADMIN, 'settings', 'updates'])); + + } elseif (isset($_POST['update_nightly'])) { + if (!class_exists("ZipArchive")) { + $this->tpl->set('error', "ZipArchive is required to update mLITE."); + } + + $zipFile = BASE_DIR . '/tmp/latest.zip'; + $url = "https://github.com/basoro/mlite/archive/refs/heads/master.zip"; + + // Pastikan folder tmp ada + if (!is_dir(BASE_DIR . '/tmp')) { + mkdir(BASE_DIR . '/tmp', 0755, true); + } + + $ch = curl_init($url); + $fp = fopen($zipFile, 'w+'); + + if ($fp === false) { + $this->tpl->set('error', "Gagal membuat file zip: $zipFile. Pastikan permissions folder benar."); + return $this->draw('update.html'); + } + + curl_setopt_array($ch, [ + CURLOPT_FILE => $fp, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_FAILONERROR => true, + CURLOPT_USERAGENT => 'mlite-updater', + CURLOPT_TIMEOUT => 300, + ]); + + $ok = curl_exec($ch); + $err = curl_error($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + fclose($fp); + + if (!$ok || $err || $http_code != 200) { + $this->tpl->set('error', "Download gagal: $err (HTTP $http_code)"); + @unlink($zipFile); + return $this->draw('update.html'); + } + + define("UPGRADABLE", true); + + // Making backup + $backup_date = date('YmdHis'); + $this->rcopy(BASE_DIR.'/systems', BASE_DIR.'/backup/'.$backup_date.'/systems'); + $this->rcopy(BASE_DIR.'/plugins', BASE_DIR.'/backup/'.$backup_date.'/plugins'); + $this->rcopy(BASE_DIR.'/assets', BASE_DIR.'/backup/'.$backup_date.'/assets'); + $this->rcopy(BASE_DIR.'/themes', BASE_DIR.'/backup/'.$backup_date.'/themes'); + $this->rcopy(BASE_DIR.'/config.php', BASE_DIR.'/backup/'.$backup_date.'/config.php'); + $this->rcopy(BASE_DIR.'/manifest.json', BASE_DIR.'/backup/'.$backup_date.'/manifest.json'); + + // Unzip latest update + $zip = new \ZipArchive; + if ($zip->open(BASE_DIR.'/tmp/latest.zip') === TRUE) { + // Extract to base tmp/update + $zip->extractTo(BASE_DIR.'/tmp/update'); + $zip->close(); + } else { + $this->tpl->set('error', "Gagal membuka file zip."); + @unlink(BASE_DIR.'/tmp/latest.zip'); + return $this->draw('update.html'); + } + + // Detect extracted update root folder + $updateBase = BASE_DIR.'/tmp/update'; + $extractedRoot = null; + + // For nightly build from github, it usually extracts to mlite-master + if (is_dir($updateBase.'/mlite-master')) { + $extractedRoot = $updateBase.'/mlite-master'; + } else { + $dirs = glob($updateBase.'/mlite-*', GLOB_ONLYDIR); + if (!empty($dirs)) { + $extractedRoot = $dirs[0]; + } + } + + if (!$extractedRoot && is_dir($updateBase.'/systems')) { + $extractedRoot = $updateBase; + } + + if (!$extractedRoot) { + $this->tpl->set('error', "Update extraction failed: 'mlite-*' folder not found."); + @unlink(BASE_DIR.'/tmp/latest.zip'); + $this->rrmdir(BASE_DIR.'/tmp/update'); + return $this->draw('update.html'); + } + + // Copy files using detected root + $this->rcopy($extractedRoot.'/systems', BASE_DIR.'/systems'); + $this->rcopy($extractedRoot.'/plugins', BASE_DIR.'/plugins'); + $this->rcopy($extractedRoot.'/assets', BASE_DIR.'/assets'); + $this->rcopy($extractedRoot.'/themes', BASE_DIR.'/themes'); + + // Restore defines + $this->rcopy(BASE_DIR.'/backup/'.$backup_date.'/config.php', BASE_DIR.'/config.php'); + $this->rcopy(BASE_DIR.'/backup/'.$backup_date.'/manifest.json', BASE_DIR.'/manifest.json'); + + // Run upgrade script + $version = $settings['version']; + $upgradeFile = $extractedRoot.'/systems/upgrade.php'; + $new_version = $version; + if (is_file($upgradeFile)) { + $new_version = include($upgradeFile); + } + + // Delete all unnecessary files + unlink(BASE_DIR.'/tmp/latest.zip'); + $this->rrmdir(BASE_DIR.'/tmp/update'); + + $this->settings('settings', 'version', $new_version); + $this->settings('settings', 'update_check', time()); + + sleep(2); + $this->notify('success', 'Update Nightly Build berhasil.'); + redirect(url([ADMIN, 'settings', 'updates'])); + } elseif (isset($_POST['update'])) { if (!class_exists("ZipArchive")) { $this->tpl->set('error', "ZipArchive is required to update mLITE."); } + $version = $this->settings->get('settings.update_version'); + $zipFile = BASE_DIR . '/tmp/latest.zip'; + if (!isset($_GET['manual'])) { - $this->download('https://github.com/basoro/mlite/archive/refs/tags/'.$this->settings->get('settings.update_version').'.zip', BASE_DIR.'/tmp/latest.zip'); + + $url = "https://github.com/basoro/mlite/archive/refs/tags/{$version}.zip"; + + $ch = curl_init($url); + $fp = fopen($zipFile, 'w+'); + + curl_setopt_array($ch, [ + CURLOPT_FILE => $fp, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_FAILONERROR => true, + CURLOPT_USERAGENT => 'mlite-updater', + CURLOPT_TIMEOUT => 60, + ]); + + $ok = curl_exec($ch); + $err = curl_error($ch); + + curl_close($ch); + fclose($fp); + + if (!$ok || $err) { + $this->tpl->set('error', "Download gagal: $err"); + @unlink($zipFile); + return $this->draw('update.html'); + } + } else { $package = glob(BASE_DIR.'/mlite-*.zip'); if (!empty($package)) { @@ -302,13 +539,37 @@ public function anyUpdates() // Unzip latest update $zip = new \ZipArchive; $zip->open(BASE_DIR.'/tmp/latest.zip'); + // Extract to base tmp/update $zip->extractTo(BASE_DIR.'/tmp/update'); - // Copy files - $this->rcopy(BASE_DIR.'/tmp/update/mlite-'.$this->settings->get('settings.update_version').'/systems', BASE_DIR.'/systems'); - $this->rcopy(BASE_DIR.'/tmp/update/mlite-'.$this->settings->get('settings.update_version').'/plugins', BASE_DIR.'/plugins'); - $this->rcopy(BASE_DIR.'/tmp/update/mlite-'.$this->settings->get('settings.update_version').'/assets', BASE_DIR.'/assets'); - $this->rcopy(BASE_DIR.'/tmp/update/mlite-'.$this->settings->get('settings.update_version').'/themes', BASE_DIR.'/themes'); + // Detect extracted update root folder + $updateBase = BASE_DIR.'/tmp/update'; + $extractedRoot = null; + $tag = $this->settings->get('settings.update_version'); + if (!empty($tag) && is_dir($updateBase.'/mlite-'.$tag)) { + $extractedRoot = $updateBase.'/mlite-'.$tag; + } else { + $dirs = glob($updateBase.'/mlite-*', GLOB_ONLYDIR); + if (!empty($dirs)) { + $extractedRoot = $dirs[0]; + } + } + // Fallback: direct extraction without wrapper + if (!$extractedRoot && is_dir($updateBase.'/systems')) { + $extractedRoot = $updateBase; + } + if (!$extractedRoot) { + $this->tpl->set('error', "Update extraction failed: 'mlite-*' folder not found."); + $zip->close(); + @unlink(BASE_DIR.'/tmp/latest.zip'); + return $this->draw('update.html'); + } + + // Copy files using detected root + $this->rcopy($extractedRoot.'/systems', BASE_DIR.'/systems'); + $this->rcopy($extractedRoot.'/plugins', BASE_DIR.'/plugins'); + $this->rcopy($extractedRoot.'/assets', BASE_DIR.'/assets'); + $this->rcopy($extractedRoot.'/themes', BASE_DIR.'/themes'); // Restore defines $this->rcopy(BASE_DIR.'/backup/'.$backup_date.'/config.php', BASE_DIR.'/config.php'); @@ -316,12 +577,16 @@ public function anyUpdates() // Run upgrade script $version = $settings['version']; - $new_version = include(BASE_DIR.'/tmp/update/mlite-'.$this->settings->get('settings.update_version').'/systems/upgrade.php'); + $upgradeFile = $extractedRoot.'/systems/upgrade.php'; + $new_version = $version; + if (is_file($upgradeFile)) { + $new_version = include($upgradeFile); + } // Close archive and delete all unnecessary files $zip->close(); unlink(BASE_DIR.'/tmp/latest.zip'); - rrmdir(BASE_DIR.'/tmp/update'); + $this->rrmdir(BASE_DIR.'/tmp/update'); $this->settings('settings', 'version', $new_version); $this->settings('settings', 'update_version', 0); @@ -448,7 +713,15 @@ private function rcopy($source, $dest, $permissions = 0755, $expect = []) mkdir($dest, $permissions, true); } + // Guard: source must be an existing directory before iterating + if (!is_dir($source)) { + return false; + } + $dir = dir($source); + if ($dir === false) { + return false; + } while (false !== $entry = $dir->read()) { if ($entry == '.' || $entry == '..') { continue; @@ -461,6 +734,32 @@ private function rcopy($source, $dest, $permissions = 0755, $expect = []) return true; } + private function rrmdir($dir) + { + if (!file_exists($dir)) { + return; + } + if (is_file($dir) || is_link($dir)) { + @unlink($dir); + return; + } + $items = scandir($dir); + if ($items === false) { + @rmdir($dir); + return; + } + foreach ($items as $item) { + if ($item === '.' || $item === '..') continue; + $path = $dir . DIRECTORY_SEPARATOR . $item; + if (is_dir($path) && !is_link($path)) { + $this->rrmdir($path); + } else { + @unlink($path); + } + } + @rmdir($dir); + } + private function _verifyLicense() { @@ -564,38 +863,48 @@ private function roundSize($bytes) public function anyCekDaftar() { - if(isset($_POST['request_code'])) { - $url = "https://mlite.id/datars/aktif"; - $curlHandle = curl_init(); - curl_setopt($curlHandle, CURLOPT_URL, $url); - curl_setopt($curlHandle, CURLOPT_POSTFIELDS,"email=".$_POST['email']); - curl_setopt($curlHandle, CURLOPT_HEADER, 0); - curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlHandle, CURLOPT_TIMEOUT,30); - curl_setopt($curlHandle, CURLOPT_POST, 1); - curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false); - $response = curl_exec($curlHandle); - curl_close($curlHandle); - $response = json_decode($response, true); - if($response['status'] == 'error') { - $this->notify('failure', 'Request kode validasi pendaftaran aplikasi tidak bisa dilakukan. Silahkan simpan dulu pengaturan aplikasi anda. Atau pastikan email request sama dengan email di pengaturan aplikasi.'); - } else { - $this->notify('success', 'Request kode validasi pendaftaran aplikasi sukses. Silahkan cek inbox email / spam folder yang anda daftarkan.'); + if (isset($_POST['request_code'])) { + $url = "https://mlite.id/datars/aktif"; + // SSRF protection: validate that the URL is strictly the intended public endpoint + if ($url === "https://mlite.id/datars/aktif" && $this->isSafeUrl($url)) { + $curlHandle = curl_init(); + curl_setopt($curlHandle, CURLOPT_URL, $url); + curl_setopt($curlHandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); + curl_setopt($curlHandle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS); + curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($curlHandle, CURLOPT_POSTFIELDS, "email=" . $_POST['email']); + curl_setopt($curlHandle, CURLOPT_HEADER, 0); + curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curlHandle, CURLOPT_TIMEOUT, 30); + curl_setopt($curlHandle, CURLOPT_POST, 1); + curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true); + $response = curl_exec($curlHandle); + curl_close($curlHandle); + $response = json_decode($response, true); + if ($response['status'] == 'error') { + $this->notify('failure', 'Request kode validasi pendaftaran aplikasi tidak bisa dilakukan. Silahkan simpan dulu pengaturan aplikasi anda. Atau pastikan email request sama dengan email di pengaturan aplikasi.'); + } else { + $this->notify('success', 'Request kode validasi pendaftaran aplikasi sukses. Silahkan cek inbox email / spam folder yang anda daftarkan.'); + } + } } - } return $this->draw('cek.daftar.html'); } public function getBackupRestore() { $database = DBNAME; - $get_table = $this->db()->pdo()->prepare("SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$database'"); + if (DBDRIVER == 'sqlite') { + $get_table = $this->db()->pdo()->prepare("SELECT name AS TABLE_NAME FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"); + } else { + $get_table = $this->db()->pdo()->prepare("SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$database'"); + } $get_table->execute(); $result = $get_table->fetchAll(); $backup_files = glob('../backups/*.sql.gz'); // $backup_files = pathinfo($backup_files); - return $this->draw('backup.restore.html', ['databases' => $result, 'files' => $backup_files]); + return $this->draw('backup.restore.html', ['databases' => htmlspecialchars_array($result), 'files' => $backup_files]); } public function getBackupDatabase() @@ -640,6 +949,12 @@ public function getRestoreDatabase() { $file_name = $_GET['filename']; + // Security: Prevent path traversal + if (strpos($file_name, '..') !== false || strpos($file_name, '/') !== false) { + $this->notify('failure', 'Invalid filename.'); + exit(); + } + define("BACKUP_FILE", $file_name); // Script will autodetect if backup file is gzipped based on .gz extension // Report all errors error_reporting(E_ALL); @@ -663,10 +978,64 @@ public function getRestoreDatabase() public function getDeleteDatabase() { $file_name = $_GET['filename']; - unlink('../backups/' . $file_name); + + // Security: Prevent path traversal + if (strpos($file_name, '..') !== false || strpos($file_name, '/') !== false) { + $this->notify('failure', 'Invalid filename.'); + exit(); + } + + if (file_exists('../backups/' . $file_name)) { + unlink('../backups/' . $file_name); + } exit(); } + public function apiSettings() + { + + $username = $this->core->checkAuth('GET'); + if (!$this->core->checkPermission($username, 'can_read', 'settings')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + try { + $settings = $this->settings('settings'); + $settings['themes'] = $this->_getThemes(); + $settings['timezones'] = $this->_getTimezones(); + + return ['status' => 'success', 'data' => $settings]; + } catch (\Exception $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + public function apiSaveSettings() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_write', 'settings')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + try { + foreach ($input as $field => $value) { + if ($field == 'save') continue; + + $this->db('mlite_settings') + ->where('module', 'settings') + ->where('field', $field) + ->save(['value' => $value]); + } + + return ['status' => 'success', 'message' => 'Pengaturan berhasil disimpan.']; + } catch (\Exception $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + private function _addHeaderFiles() { $this->core->addCSS(url('assets/css/bootstrap-colorpicker.css')); diff --git a/plugins/settings/Help.md b/plugins/settings/Help.md deleted file mode 100644 index 616003ede..000000000 --- a/plugins/settings/Help.md +++ /dev/null @@ -1,9 +0,0 @@ -You can display settings data by using construction below: - -``` -{$settings.field-name} -``` - -
                  - -
                  diff --git a/plugins/settings/Info.php b/plugins/settings/Info.php index 7a1f52d7a..167c467d4 100644 --- a/plugins/settings/Info.php +++ b/plugins/settings/Info.php @@ -4,8 +4,9 @@ 'name' => 'Pengaturan', 'description' => 'Pengelolaan pengaturan', 'author' => 'Basoro.ID', + 'category' => 'main', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'wrench', 'install' => function () use ($core) { }, diff --git a/plugins/settings/README.md b/plugins/settings/README.md new file mode 100644 index 000000000..82eac21c4 --- /dev/null +++ b/plugins/settings/README.md @@ -0,0 +1,60 @@ +# Plugin Pengaturan + +Modul konfigurasi sistem mLITE, mencakup pengaturan umum instansi, manajemen tema tampilan, pembaruan sistem, serta backup dan restore database. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Pengaturan**. +- Pilih submenu sesuai kebutuhan: + - Pengaturan + - Umum + - Tema + - Pembaruan + - Backup & Restore + +## Panduan Pengguna (Petugas) + +Plugin ini hanya diakses oleh Administrator sistem. Tidak ada operasional harian untuk petugas biasa. + +## Panduan Admin + +1. **Umum** + - Isi identitas instansi: nama, alamat, kota, propinsi, nomor telepon, email, website. + - Upload **logo** instansi (otomatis dipotong persegi, maks 512×512 px) dan **wallpaper** halaman login. + - Atur zona waktu sistem. + - Konfigurasikan poliklinik dan dokter default (IGD, dokter umum, dll.) jika modul Master aktif. + - Atur format **No Rekam Medis** (`set_no_rkm_medis`) dan format **Nomor Surat**. + - Pilih integrasi aktif: Pasien, IGD, Laboratorium, Radiologi, WhatsApp Gateway, Bridging SEP, Rawat Jalan, Presensi. + - Lihat informasi sistem: versi PHP, versi database, dan status lisensi. + - Aktifkan **Lisensi** dengan memasukkan kode validasi penggunaan. + - Klik **Simpan** — data instansi juga dikirim ke server mLITE untuk registrasi. + +2. **Tema** + - Lihat daftar tema yang tersedia di direktori `themes/`. + - Klik **Aktifkan** untuk mengganti tema tampilan publik yang aktif. + - Klik nama file tema untuk membuka **editor kode** (MarkItUp) dan mengedit template HTML/CSS secara langsung. + - Simpan perubahan file tema — berlaku langsung tanpa restart. + +3. **Pembaruan** + - Klik **Cek Pembaruan** untuk memeriksa versi terbaru dari GitHub (`basoro/mlite`). + - Jika tersedia versi baru, klik **Update** untuk mengunduh dan menginstal otomatis: + - Sistem membuat backup otomatis ke folder `backup/{timestamp}/` sebelum update. + - File `systems/`, `plugins/`, `assets/`, dan `themes/` diperbarui. + - File `config.php` dan `manifest.json` dipertahankan dari backup. + - Script `upgrade.php` dijalankan untuk migrasi database jika diperlukan. + - **Update Nightly**: unduh dan instal versi terbaru dari branch `master` GitHub. + - **Update Manual**: letakkan file `mlite-{versi}.zip` di root direktori, lalu klik Update Manual. + +4. **Backup & Restore** + - **Backup Database**: buat salinan database saat ini dalam format file backup. + - **Restore Database**: pulihkan database dari file backup yang diunggah. + - Lakukan backup rutin sebelum melakukan update sistem atau perubahan konfigurasi besar. + +## Catatan + +- Hanya administrator sistem yang boleh mengakses menu Pengaturan. +- Saat update sistem, backup dilakukan otomatis — namun sangat disarankan untuk melakukan backup manual database terlebih dahulu melalui **Backup & Restore**. +- Jika `FILE_LOCK` aktif di konfigurasi server, pengeditan file tema melalui editor akan dinonaktifkan. +- Update sistem memerlukan ekstensi PHP **ZipArchive** dan akses **curl** aktif di server. +- Setelah update, bersihkan cache browser untuk memastikan perubahan tampilan termuat dengan benar. diff --git a/plugins/settings/inc/Backup_Database.php b/plugins/settings/inc/Backup_Database.php index bdf968417..ad35af1ed 100644 --- a/plugins/settings/inc/Backup_Database.php +++ b/plugins/settings/inc/Backup_Database.php @@ -92,7 +92,11 @@ public function __construct($host, $username, $passwd, $dbName, $charset = 'utf8 $this->charset = $charset; $this->conn = $this->initializeDatabase(); $this->backupDir = BACKUP_DIR ? BACKUP_DIR : '.'; - $this->backupFile = 'backup-'.$this->dbName.'-'.date("Ymd_His", time()).'.sql'; + + // Handle SQLite DB path which might contain slashes + $cleanDbName = basename($this->dbName); + $this->backupFile = 'backup-'.$cleanDbName.'-'.date("Ymd_His", time()).'.sql'; + $this->gzipBackupFile = defined('GZIP_BACKUP_FILE') ? GZIP_BACKUP_FILE : true; $this->disableForeignKeyChecks = defined('DISABLE_FOREIGN_KEY_CHECKS') ? DISABLE_FOREIGN_KEY_CHECKS : true; $this->batchSize = defined('BATCH_SIZE') ? BATCH_SIZE : 1000; // default 1000 rows @@ -100,16 +104,20 @@ public function __construct($host, $username, $passwd, $dbName, $charset = 'utf8 } protected function initializeDatabase() { + if (DBDRIVER == 'sqlite') { + return new \PDO("sqlite:" . $this->dbName); + } + try { $conn = mysqli_connect($this->host, $this->username, $this->passwd, $this->dbName); if (mysqli_connect_errno()) { - throw new Exception('ERROR connecting database: ' . mysqli_connect_error()); + throw new \Exception('ERROR connecting database: ' . mysqli_connect_error()); die(); } if (!mysqli_set_charset($conn, $this->charset)) { mysqli_query($conn, 'SET NAMES '.$this->charset); } - } catch (Exception $e) { + } catch (\Exception $e) { print_r($e->getMessage()); die(); } @@ -124,6 +132,11 @@ protected function initializeDatabase() { */ public function backupTables($tables = '*') { try { + if (DBDRIVER == 'sqlite') { + $this->backupTablesSqlite($tables); + return true; + } + /** * Tables to export */ @@ -139,6 +152,7 @@ public function backupTables($tables = '*') { $sql = 'CREATE DATABASE IF NOT EXISTS `'.$this->dbName.'`'.";\n\n"; $sql .= 'USE `'.$this->dbName."`;\n\n"; + $sql .= "SET sql_mode = '';\n\n"; /** * Disable foreign key checks @@ -245,7 +259,7 @@ public function backupTables($tables = '*') { } else { $this->obfPrint('Backup file succesfully saved to ' . $this->backupDir.'/'.$this->backupFile, 1, 1); } - } catch (Exception $e) { + } catch (\Exception $e) { print_r($e->getMessage()); return false; } @@ -253,6 +267,68 @@ public function backupTables($tables = '*') { return true; } + protected function backupTablesSqlite($tables = '*') { + $pdo = $this->conn; + + if($tables == '*') { + $tables = array(); + $query = $pdo->query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"); + while($row = $query->fetch(\PDO::FETCH_NUM)) { + $tables[] = $row[0]; + } + } else { + $tables = is_array($tables) ? $tables : explode(',', str_replace(' ', '', $tables)); + } + + $sql = "PRAGMA foreign_keys=OFF;\nBEGIN TRANSACTION;\n\n"; + + foreach($tables as $table) { + if( in_array($table, IGNORE_TABLES) ) + continue; + + $this->obfPrint("Backing up `".$table."` table...".str_repeat('.', 50-strlen($table)), 0, 0); + + // Get CREATE TABLE + $stmt = $pdo->query("SELECT sql FROM sqlite_master WHERE type='table' AND name='$table'"); + $createSql = $stmt->fetchColumn(); + $sql .= $createSql . ";\n\n"; + + // Get Data + $stmt = $pdo->query("SELECT * FROM `$table`"); + $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); + + if (count($rows) > 0) { + foreach ($rows as $row) { + $cols = array_keys($row); + $vals = array_values($row); + + $valStrs = []; + foreach ($vals as $val) { + if ($val === null) { + $valStrs[] = "NULL"; + } else { + $valStrs[] = "'" . str_replace("'", "''", $val) . "'"; + } + } + + $sql .= "INSERT INTO `$table` (`" . implode("`, `", $cols) . "`) VALUES (" . implode(", ", $valStrs) . ");\n"; + } + $sql .= "\n"; + } + $this->obfPrint('OK'); + } + + $sql .= "COMMIT;\n"; + + $this->saveFile($sql); + + if ($this->gzipBackupFile) { + $this->gzipBackupFile(); + } else { + $this->obfPrint('Backup file succesfully saved to ' . $this->backupDir.'/'.$this->backupFile, 1, 1); + } + } + /** * Save SQL to file * @param string $sql @@ -268,7 +344,7 @@ protected function saveFile(&$sql) { file_put_contents($this->backupDir.'/'.$this->backupFile, $sql, FILE_APPEND | LOCK_EX); - } catch (Exception $e) { + } catch (\Exception $e) { print_r($e->getMessage()); return false; } diff --git a/plugins/settings/inc/Restore_Database.php b/plugins/settings/inc/Restore_Database.php index d499addc0..85d531059 100644 --- a/plugins/settings/inc/Restore_Database.php +++ b/plugins/settings/inc/Restore_Database.php @@ -47,6 +47,16 @@ class Restore_Database { */ var $disableForeignKeyChecks; + /** + * Backup directory path + */ + var $backupDir; + + /** + * Backup file name + */ + var $backupFile; + /** * Constructor initializes database */ @@ -75,10 +85,14 @@ function __destructor() { } protected function initializeDatabase() { + if (DBDRIVER == 'sqlite') { + return new \PDO("sqlite:" . $this->dbName); + } + try { $conn = mysqli_connect($this->host, $this->username, $this->passwd, $this->dbName); if (mysqli_connect_errno()) { - throw new Exception('ERROR connecting database: ' . mysqli_connect_error()); + throw new \Exception('ERROR connecting database: ' . mysqli_connect_error()); die(); } if (!mysqli_set_charset($conn, $this->charset)) { @@ -92,7 +106,7 @@ protected function initializeDatabase() { mysqli_query($conn, 'SET foreign_key_checks = 0'); } - } catch (Exception $e) { + } catch (\Exception $e) { print_r($e->getMessage()); die(); } @@ -106,6 +120,10 @@ protected function initializeDatabase() { * @param string $tables */ public function restoreDb() { + if (DBDRIVER == 'sqlite') { + return $this->restoreDbSqlite(); + } + try { $sql = ''; $multiLineComment = false; @@ -119,7 +137,7 @@ public function restoreDb() { $backupFileIsGzipped = substr($backupFile, -3, 3) == '.gz' ? true : false; if ($backupFileIsGzipped) { if (!$backupFile = $this->gunzipBackupFile()) { - throw new Exception("ERROR: couldn't gunzip backup file " . $backupDir . '/' . $backupFile); + throw new \Exception("ERROR: couldn't gunzip backup file " . $backupDir . '/' . $backupFile); } } @@ -150,7 +168,7 @@ public function restoreDb() { } $sql = ''; } else { - throw new Exception("ERROR: SQL execution error: " . mysqli_error($this->conn)); + throw new \Exception("ERROR: SQL execution error: " . mysqli_error($this->conn)); } } } else if (preg_match('/\*\/$/', $line)) { @@ -160,9 +178,9 @@ public function restoreDb() { } fclose($handle); } else { - throw new Exception("ERROR: couldn't open backup file " . $backupDir . '/' . $backupFile); + throw new \Exception("ERROR: couldn't open backup file " . $backupDir . '/' . $backupFile); } - } catch (Exception $e) { + } catch (\Exception $e) { print_r($e->getMessage()); return false; } @@ -174,6 +192,113 @@ public function restoreDb() { return true; } + protected function restoreDbSqlite() { + try { + // Force close existing connection to release locks + $this->conn = null; + + // Re-open fresh connection + $pdo = new \PDO("sqlite:" . $this->dbName); + $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + // Optimization settings + $pdo->exec("PRAGMA synchronous = OFF"); + $pdo->exec("PRAGMA journal_mode = MEMORY"); + $pdo->exec("PRAGMA foreign_keys = OFF"); + + $backupDir = $this->backupDir; + $backupFile = $this->backupFile; + + // ... (gunzip logic remains same) + $backupFileIsGzipped = substr($backupFile, -3, 3) == '.gz' ? true : false; + if ($backupFileIsGzipped) { + if (!$backupFile = $this->gunzipBackupFile()) { + throw new \Exception("ERROR: couldn't gunzip backup file " . $backupDir . '/' . $backupFile); + } + } + + // Close connection before replacement to avoid "database is locked" + $pdo = null; + + // Replace the database file + $sourceSql = $backupDir . '/' . $backupFile; + + // If it is a full binary copy or we treat it as import? + // Wait, the file is SQL dump, not binary DB file. + // So we MUST execute SQL. + + // Re-open connection + $pdo = new \PDO("sqlite:" . $this->dbName); + $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + + // Drop all tables first for clean restore + $tablesQuery = $pdo->query("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'"); + $tables = $tablesQuery->fetchAll(\PDO::FETCH_COLUMN); + + $pdo->exec("PRAGMA foreign_keys = OFF"); + $pdo->beginTransaction(); + foreach ($tables as $table) { + $pdo->exec("DROP TABLE IF EXISTS `$table`"); + } + $pdo->commit(); + + // Now execute the dump + $handle = fopen($backupDir . '/' . $backupFile, "r"); + if ($handle) { + $sql = ''; + $multiLineComment = false; + + // $pdo->beginTransaction(); // Dump usually has transaction + + while (($line = fgets($handle)) !== false) { + // ... (existing parsing logic) + $line = trim($line); + if (strlen($line) > 1) { + $lineIsComment = false; + if (preg_match('/^\/\*/', $line)) { + $multiLineComment = true; + $lineIsComment = true; + } + if ($multiLineComment or preg_match('/^\/\//', $line) or preg_match('/^--/', $line)) { + $lineIsComment = true; + } + if (!$lineIsComment) { + $sql .= $line . "\n"; + if (preg_match('/;$/', trim($line))) { + try { + $pdo->exec($sql); + if (preg_match('/^CREATE TABLE `?([^`\s]+)`?/i', $sql, $tableName)) { + $this->obfPrint("Table successfully restored: `" . $tableName[1] . "`"); + } + } catch (\PDOException $e) { + $this->obfPrint("WARNING: " . $e->getMessage()); + } + $sql = ''; + } + } else if (preg_match('/\*\/$/', $line)) { + $multiLineComment = false; + } + } + } + + // $pdo->commit(); + fclose($handle); + } + + } catch (\Exception $e) { + // ... + print_r($e->getMessage()); + return false; + } + + // Cleanup + if ($backupFileIsGzipped) { + unlink($backupDir . '/' . $backupFile); + } + + return true; + } + /* * Gunzip backup file * diff --git a/plugins/settings/view/admin/backup.restore.html b/plugins/settings/view/admin/backup.restore.html index 7453c86bf..d3fc2431b 100644 --- a/plugins/settings/view/admin/backup.restore.html +++ b/plugins/settings/view/admin/backup.restore.html @@ -7,7 +7,7 @@

                  Backup Database

                   {loop: $databases}
                  -    {$value.TABLE_NAME}
                  + {?=isset_or($value.TABLE_NAME)?}
                  {/loop} =============================== Total : {?=count($databases)?} tabel diff --git a/plugins/settings/view/admin/general.html b/plugins/settings/view/admin/general.html index 23362952a..38057c4e5 100644 --- a/plugins/settings/view/admin/general.html +++ b/plugins/settings/view/admin/general.html @@ -1,5 +1,7 @@
                  + +
                  @@ -9,57 +11,57 @@

                  Umum

                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  - +
                  @@ -68,6 +70,7 @@

                  Umum



                  - +
                  @@ -111,7 +115,7 @@

                  Lain-lain

                  @@ -121,7 +125,7 @@

                  Lain-lain

                  @@ -129,7 +133,7 @@

                  Lain-lain

                  @@ -139,7 +143,7 @@

                  Lain-lain

                  @@ -147,7 +151,7 @@

                  Lain-lain

                  @@ -161,7 +165,7 @@

                  Lain-lain

                  Per Dokter @@ -172,7 +176,7 @@

                  Lain-lain

                  Aktif @@ -182,7 +186,7 @@

                  Lain-lain

                  -
                  - +
                  - - + +
                  + + +
                  - +
                  + +
                  + + +
                  +
                  +
                  + + +
                  @@ -350,7 +385,7 @@

                  Status Aplikasi

                  {/if}

                  - {$settings.license.name} + {?=isset_or($settings.license.name)?}

                  {?=domain()?} {if: $settings.license.type == \Systems\Lib\License::UNREGISTERED} @@ -370,19 +405,19 @@

                  Informasi Sistem

                  Versi
                  -
                  {$settings.version}
                  +
                  {?=isset_or($settings.version)?}
                  Status
                  - {$settings.license.name} + {?=isset_or($settings.license.name)?} (Sunting)

                  Versi PHP
                  -
                  {$settings.system.php}
                  +
                  {?=isset_or($settings.system.php)?}
                  Versi MySQL
                  -
                  {$settings.system.mysql}
                  +
                  {?=isset_or($settings.system.mysql)?}

                  @@ -456,11 +491,24 @@ }); var path='{?=url()?}/assets/img/'; - var img_array=new Array('','ataaka.png','bootstrap.png','cerulean.png','cosmo.png','cyborg.png','darkly.png','flatly.png','journal.png','lumen.png','mlite.png','paper.png','readable.png','sandstone.png','simplex.png','slate.png','spacelab.png','superhero.png','united.png','yeti.png'); + var img_array=new Array('','ataaka.png','atilamedika.png','bootstrap.png','cerulean.png','cosmo.png','cyborg.png','darkly.png','flatly.png','journal.png','lumen.png','mlite.png','paper.png','readable.png','sandstone.png','sketchy.png','simplex.png','slate.png','spacelab.png','superhero.png','united.png','yeti.png'); function change_theme(obj,id){ var i=obj.selectedIndex; if (i<1){ return; } document.getElementById(id).src=path+img_array[i]; } + + $('form[action*="saveGeneral"]').on('submit', function() { + var base64EncodedFields = []; + $(this).find('input[type=text]').each(function() { + if (this.name) { + base64EncodedFields.push(this.name); + } + try { + this.value = btoa(unescape(encodeURIComponent(this.value))); + } catch(e) {} + }); + $(this).find('input[name="_b64_fields"]').val(JSON.stringify(base64EncodedFields)); + }); diff --git a/plugins/settings/view/admin/manage.html b/plugins/settings/view/admin/manage.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/settings/view/admin/manage.html +++ b/plugins/settings/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/settings/view/admin/plugin.settings.tab.content.html b/plugins/settings/view/admin/plugin.settings.tab.content.html new file mode 100644 index 000000000..c8532cd3f --- /dev/null +++ b/plugins/settings/view/admin/plugin.settings.tab.content.html @@ -0,0 +1,15 @@ +

                  {?=isset_or($value.desc)?}

                  +{if: !empty($value.content)} + {?=isset_or($value.content)?} +{else} + +{/if} diff --git a/plugins/settings/view/admin/theme.html b/plugins/settings/view/admin/theme.html index 553d2d58c..9d95ca337 100644 --- a/plugins/settings/view/admin/theme.html +++ b/plugins/settings/view/admin/theme.html @@ -2,7 +2,7 @@
                  -

                  {$theme.name}

                  +

                  {?=isset_or($theme.name)?}

                  @@ -13,11 +13,11 @@

                  {$theme.name}

                  - + - +
                  Pembuat{$theme.author} {$theme.email}{?=isset_or($theme.author)?} {?=isset_or($theme.email)?}
                  Versi{$theme.version}{?=isset_or($theme.version)?}
                  {if: $settings.theme == $theme.dir} @@ -41,7 +41,7 @@

                  Sunting

                  @@ -50,8 +50,8 @@

                  Sunting

                  - - + +
                  diff --git a/plugins/settings/view/admin/themes.html b/plugins/settings/view/admin/themes.html index 1fdf11fda..db482c126 100644 --- a/plugins/settings/view/admin/themes.html +++ b/plugins/settings/view/admin/themes.html @@ -3,7 +3,7 @@
                  diff --git a/plugins/settings/view/admin/update.html b/plugins/settings/view/admin/update.html index 607037b2c..9b700348c 100644 --- a/plugins/settings/view/admin/update.html +++ b/plugins/settings/view/admin/update.html @@ -3,7 +3,7 @@
                  Pembaruan
                  - {if: $allow_curl==0} + {if: $allow_curl == 0}
                  Tidak dapat memperbarui sistem dengan konfigurasi CURL. (curl does not exist) Check Error @@ -11,7 +11,7 @@ {/if} {if: isset($error)}
                  - {$error} + {?=isset_or($error)?} System Error
                  {/if} @@ -22,7 +22,7 @@
                  {/if}

                  Terima kasih, perbaruan sistem selalu aman dan up-todate!

                  -

                  Versi: {$settings.version}

                  +

                  Versi: {?=isset_or($settings.version)?}

                  {if: $manual_mode}
                  Manual mode enabled. Pleasy copy latest version to base directory. System will detect it automatically. @@ -59,6 +59,18 @@

                  Changelog:

                  {/if} +
                  + +

                  Nightly Build

                  +

                  Update langsung dari repositori GitHub (branch master). Gunakan dengan resiko sendiri.

                  +
                  + +
                  diff --git a/plugins/surat/Admin.php b/plugins/surat/Admin.php new file mode 100644 index 000000000..0a0b34d8a --- /dev/null +++ b/plugins/surat/Admin.php @@ -0,0 +1,1619 @@ + [ + 'jenis' => 'Laboratorium', + 'marker' => '__SURAT_PERMINTAAN_LAB__', + 'save_route' => 'simpanrujukanlab', + 'verification_type' => 'rujukanlab', + ], + 'rujukanradiologi' => [ + 'jenis' => 'Radiologi', + 'marker' => '__SURAT_PERMINTAAN_RAD__', + 'save_route' => 'simpanrujukanradiologi', + 'verification_type' => 'rujukanradiologi', + ], + ]; + + public function init() + { + $this->_ensureSuratSchema(); + + \Systems\Lib\Event::add('rawat_jalan.surat_menu', function ($row) { + echo '
                • Surat Rujukan
                • '; + echo '
                • Surat Rujukan Lab
                • '; + echo '
                • Surat Rujukan Radiologi
                • '; + echo '
                • Surat Keterangan Sehat
                • '; + echo '
                • Surat Keterangan Sakit
                • '; + echo '
                • Surat Bebas Narkoba
                • '; + echo '
                • Surat Kontrol
                • '; + }); + } + + public function navigation() + { + return [ + 'Kelola' => 'manage', + 'Surat Rujukan' => 'rujukan', + 'Surat Rujukan Lab' => 'rujukanlab', + 'Surat Rujukan Radiologi' => 'rujukanradiologi', + 'Surat Sakit' => 'sakit', + 'Surat Sehat' => 'sehat', + 'Surat Bebas Narkoba' => 'bebasnarkoba', + 'Surat Kematian' => 'kematian', + 'Surat Kontrol' => 'kontrol', + 'Pengaturan Nomor' => 'setting', + ]; + } + + public function getManage() + { + $sub_modules = [ + ['name' => 'Surat Rujukan', 'url' => url([ADMIN, 'surat', 'rujukan']), 'icon' => 'share', 'desc' => 'Cetak Surat Rujukan'], + ['name' => 'Surat Rujukan Lab', 'url' => url([ADMIN, 'surat', 'rujukanlab']), 'icon' => 'flask', 'desc' => 'Cetak Surat Rujukan Lab'], + ['name' => 'Surat Rujukan Radiologi', 'url' => url([ADMIN, 'surat', 'rujukanradiologi']), 'icon' => 'film', 'desc' => 'Cetak Surat Rujukan Radiologi'], + ['name' => 'Surat Sakit', 'url' => url([ADMIN, 'surat', 'sakit']), 'icon' => 'medkit', 'desc' => 'Cetak Surat Keterangan Sakit'], + ['name' => 'Surat Sehat', 'url' => url([ADMIN, 'surat', 'sehat']), 'icon' => 'heart', 'desc' => 'Cetak Surat Keterangan Sehat'], + ['name' => 'Surat Bebas Narkoba', 'url' => url([ADMIN, 'surat', 'bebasnarkoba']), 'icon' => 'shield', 'desc' => 'Cetak Surat Bebas Narkoba'], + ['name' => 'Surat Kematian', 'url' => url([ADMIN, 'surat', 'kematian']), 'icon' => 'file-text-o', 'desc' => 'Cetak Surat Keterangan Kematian'], + ['name' => 'Surat Kontrol', 'url' => url([ADMIN, 'surat', 'kontrol']), 'icon' => 'calendar-check-o', 'desc' => 'Cetak Surat Kontrol'], + ['name' => 'Resume Medis', 'url' => url([ADMIN, 'surat', 'resumemedis']), 'icon' => 'file-text', 'desc' => 'Lihat & Cetak Resume Medis'], + ['name' => 'Pengaturan Nomor', 'url' => url([ADMIN, 'surat', 'setting']), 'icon' => 'cogs', 'desc' => 'Atur Prefix & Nomor Urut per Jenis Surat'], + ]; + + return $this->draw('manage.html', ['sub_modules' => $sub_modules]); + } + + private function _getNomorSuratTypes() + { + return [ + 'sakit' => 'Surat Keterangan Sakit', + 'sehat' => 'Surat Keterangan Sehat', + 'rujukan' => 'Surat Rujukan', + 'rujukanlab' => 'Surat Rujukan Lab', + 'rujukanradiologi' => 'Surat Rujukan Radiologi', + 'bebasnarkoba' => 'Surat Bebas Narkoba', + 'kematian' => 'Surat Keterangan Kematian', + ]; + } + + public function anySetting() + { + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $prefix = trim((string) ($_POST['prefix_surat'] ?? '')); + $this->db('mlite_settings')->where('module', 'settings')->where('field', 'prefix_surat')->save(['value' => $prefix]); + + foreach ($this->_getNomorSuratTypes() as $type => $label) { + if (isset($_POST['nomor'][$type])) { + \Systems\Lib\SuratVerification::setNomorSuratCounterValue($this->core, $type, $_POST['nomor'][$type]); + } + } + + $this->notify('success', 'Pengaturan nomor surat berhasil disimpan.'); + redirect(url([ADMIN, 'surat', 'setting'])); + } + + $types = []; + foreach ($this->_getNomorSuratTypes() as $type => $label) { + $types[] = [ + 'type' => $type, + 'label' => $label, + 'nomor' => \Systems\Lib\SuratVerification::getNomorSuratCounterValue($this->core, $type), + ]; + } + + return $this->draw('setting.html', [ + 'types' => $types, + 'prefix_surat' => trim((string) $this->settings->get('settings.prefix_surat')), + ]); + } + + // SURAT RUJUKAN METHODS + public function anyRujukan($no_rawat = '') + { + return $this->_handleSuratCetak($no_rawat, 'rujukan', 'suratrujukan', 'Surat Rujukan', 'surat rujukan'); + } + + public function getRujukanAdd() + { + $this->_addHeaderFiles(); + if (!empty($redirectData = getRedirectData())) { + $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS); + } else { + $this->assign['form'] = [ + 'id' => '', + 'nomor_surat' => '', + 'no_rawat' => '', + 'no_rkm_medis' => '', + 'nm_pasien' => '', + 'tgl_lahir' => '', + 'umur' => '', + 'jk' => '', + 'alamat' => '', + 'kepada' => '', + 'di' => '', + 'anamnesa' => '', + 'pemeriksaan_fisik' => '', + 'pemeriksaan_penunjang' => '', + 'diagnosa' => '', + 'terapi' => '', + 'alasan_dirujuk' => '', + 'dokter' => '', + 'petugas' => '' + ]; + } + + return $this->draw('rujukan.form.html', ['rujukan' => $this->assign]); + } + + public function getRujukanEdit($id) + { + $this->_addHeaderFiles(); + $row = $this->db('mlite_surat_rujukan')->where('id', $id)->oneArray(); + if (!empty($row) && !$this->_isRujukanPermintaanRow($row)) { + $this->assign['form'] = $row; + return $this->draw('rujukan.form.html', ['rujukan' => $this->assign]); + } else { + redirect(url([ADMIN, 'surat', 'rujukan'])); + } + } + + public function postRujukanSave($id = null) + { + $errors = 0; + + if (!$id) { + $location = url([ADMIN, 'surat', 'rujukan']); + } else { + $location = url([ADMIN, 'surat', 'rujukanedit', $id]); + } + + if (!$errors) { + unset($_POST['save']); + + if (!$id) { + $query = $this->db('mlite_surat_rujukan')->save($_POST); + } else { + $query = $this->db('mlite_surat_rujukan')->where('id', $id)->save($_POST); + } + + if ($query) { + $this->notify('success', 'Simpan sukes'); + } else { + $this->notify('failure', 'Simpan gagal'); + } + + redirect($location, $_POST); + } + + redirect($location, $_POST); + } + + public function getRujukanHapus($id) + { + $row = $this->db('mlite_surat_rujukan')->where('id', $id)->oneArray(); + if (!empty($row) && !$this->_isRujukanPermintaanRow($row) && $this->db('mlite_surat_rujukan')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'rujukan'])); + } + + public function getSuratRujukan($no_rawat) + { + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $surat = \Systems\Lib\SuratVerification::preparePrintRecord($this->core, 'rujukan', [ + 'no_rawat' => revertNoRawat($no_rawat), + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ]); + $nomor_surat = !empty(trim((string)($surat['nomor_surat'] ?? ''))) ? $surat['nomor_surat'] : $this->_getNomorSuratFormat('rujukan'); + $this->tpl->set('surat', $surat); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'])); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.rujukan.html', true); + exit(); + } + + public function anyRujukanLab($no_rawat = '') + { + return $this->_handleRujukanPermintaan($no_rawat, 'Laboratorium', 'rujukanlab', 'Surat Rujukan Lab'); + } + + public function anyRujukanRadiologi($no_rawat = '') + { + return $this->_handleRujukanPermintaan($no_rawat, 'Radiologi', 'rujukanradiologi', 'Surat Rujukan Radiologi'); + } + + public function postSimpanRujukanLab() + { + $this->_saveRujukanPermintaan('rujukanlab'); + } + + public function postSimpanRujukanRadiologi() + { + $this->_saveRujukanPermintaan('rujukanradiologi'); + } + + public function getRujukanLabHapus($id) + { + $this->_hapusRujukanPermintaan($id, 'rujukanlab'); + } + + public function getRujukanRadiologiHapus($id) + { + $this->_hapusRujukanPermintaan($id, 'rujukanradiologi'); + } + + private function _hapusRujukanPermintaan($id, $route) + { + $config = $this->_getRujukanPermintaanConfig($route); + $row = $this->db('mlite_surat_rujukan')->where('id', $id)->oneArray(); + if (!empty($row) && isset($row['di']) && $row['di'] === $config['marker']) { + if ($this->db('mlite_surat_rujukan')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + } else { + $this->notify('failure', 'Data tidak ditemukan atau tidak valid'); + } + redirect(url([ADMIN, 'surat', $route])); + } + + // SURAT SAKIT METHODS + public function anySakit($no_rawat = '') + { + return $this->_handleSuratCetak($no_rawat, 'sakit', 'suratsakit', 'Surat Keterangan Sakit', 'surat keterangan sakit'); + } + + public function getSakitAdd() + { + $this->_addHeaderFiles(); + if (!empty($redirectData = getRedirectData())) { + $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS); + } else { + $this->assign['form'] = [ + 'id' => '', + 'nomor_surat' => '', + 'no_rawat' => '', + 'no_rkm_medis' => '', + 'nm_pasien' => '', + 'tgl_lahir' => '', + 'umur' => '', + 'jk' => '', + 'alamat' => '', + 'keadaan' => '', + 'diagnosa' => '', + 'lama_angka' => '', + 'lama_huruf' => '', + 'tanggal_mulai' => '', + 'tanggal_selesai' => '', + 'dokter' => '', + 'petugas' => '' + ]; + } + + return $this->draw('sakit.form.html', ['sakit' => $this->assign]); + } + + public function getSakitEdit($id) + { + $this->_addHeaderFiles(); + $row = $this->db('mlite_surat_sakit')->where('id', $id)->oneArray(); + if (!empty($row)) { + $this->assign['form'] = $row; + return $this->draw('sakit.form.html', ['sakit' => $this->assign]); + } else { + redirect(url([ADMIN, 'surat', 'sakit'])); + } + } + + public function postSakitSave($id = null) + { + $errors = 0; + + if (!$id) { + $location = url([ADMIN, 'surat', 'sakit']); + } else { + $location = url([ADMIN, 'surat', 'sakit_edit', $id]); + } + + if (!$errors) { + unset($_POST['save']); + + if (!$id) { + $query = $this->db('mlite_surat_sakit')->save($_POST); + } else { + $query = $this->db('mlite_surat_sakit')->where('id', $id)->save($_POST); + } + + if ($query) { + $this->notify('success', 'Simpan sukes'); + } else { + $this->notify('failure', 'Simpan gagal'); + } + + redirect($location, $_POST); + } + + redirect($location, $_POST); + } + + public function getSakitHapus($id) + { + if ($this->db('mlite_surat_sakit')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'sakit'])); + } + + public function getSuratSakit($no_rawat) + { + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $surat = \Systems\Lib\SuratVerification::preparePrintRecord($this->core, 'sakit', [ + 'no_rawat' => revertNoRawat($no_rawat), + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ]); + $nomor_surat = !empty(trim((string)($surat['nomor_surat'] ?? ''))) ? $surat['nomor_surat'] : $this->_getNomorSuratFormat('sakit'); + $this->tpl->set('surat', $surat); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'])); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.sakit.html', true); + exit(); + } + + // SURAT SEHAT METHODS + public function anySehat($no_rawat = '') + { + return $this->_handleSuratCetak($no_rawat, 'sehat', 'suratsehat', 'Surat Keterangan Sehat', 'surat keterangan sehat'); + } + + public function getSehatAdd() + { + $this->_addHeaderFiles(); + if (!empty($redirectData = getRedirectData())) { + $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS); + } else { + $this->assign['form'] = [ + 'id' => '', + 'nomor_surat' => '', + 'no_rawat' => '', + 'no_rkm_medis' => '', + 'nm_pasien' => '', + 'tgl_lahir' => '', + 'umur' => '', + 'jk' => '', + 'alamat' => '', + 'tanggal' => '', + 'berat_badan' => '', + 'tinggi_badan' => '', + 'tensi' => '', + 'gol_darah' => '', + 'riwayat_penyakit' => '', + 'keperluan' => '', + 'dokter' => '', + 'petugas' => '' + ]; + } + + return $this->draw('sehat.form.html', ['sehat' => $this->assign]); + } + + public function getSehatEdit($id) + { + $this->_addHeaderFiles(); + $row = $this->db('mlite_surat_sehat')->where('id', $id)->oneArray(); + if (!empty($row)) { + $this->assign['form'] = $row; + return $this->draw('sehat.form.html', ['sehat' => $this->assign]); + } else { + redirect(url([ADMIN, 'surat', 'sehat'])); + } + } + + public function postSehatSave($id = null) + { + $errors = 0; + + if (!$id) { + $location = url([ADMIN, 'surat', 'sehat']); + } else { + $location = url([ADMIN, 'surat', 'sehat_edit', $id]); + } + + if (!$errors) { + unset($_POST['save']); + + if (!$id) { + $query = $this->db('mlite_surat_sehat')->save($_POST); + } else { + $query = $this->db('mlite_surat_sehat')->where('id', $id)->save($_POST); + } + + if ($query) { + $this->notify('success', 'Simpan sukes'); + } else { + $this->notify('failure', 'Simpan gagal'); + } + + redirect($location, $_POST); + } + + redirect($location, $_POST); + } + + public function getSehatHapus($id) + { + if ($this->db('mlite_surat_sehat')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'sehat'])); + } + + public function getSuratSehat($no_rawat) + { + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $penilaian = $this->db('pemeriksaan_ralan')->where('no_rawat', revertNoRawat($no_rawat))->desc('tgl_perawatan')->desc('jam_rawat')->oneArray(); + $surat = \Systems\Lib\SuratVerification::preparePrintRecord($this->core, 'sehat', [ + 'no_rawat' => revertNoRawat($no_rawat), + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ]); + if (empty(trim((string)($surat['berat_badan'] ?? '')))) $surat['berat_badan'] = $penilaian['berat'] ?? ''; + if (empty(trim((string)($surat['tinggi_badan'] ?? '')))) $surat['tinggi_badan'] = $penilaian['tinggi'] ?? ''; + if (empty(trim((string)($surat['tensi'] ?? '')))) $surat['tensi'] = $penilaian['tensi'] ?? ''; + if (empty(trim((string)($surat['gol_darah'] ?? '')))) { $gd = trim((string)($pasien['gol_darah'] ?? '')); $surat['gol_darah'] = ($gd !== '' && $gd !== '-') ? $gd : ''; } + $nomor_surat = !empty(trim((string)($surat['nomor_surat'] ?? ''))) ? $surat['nomor_surat'] : $this->_getNomorSuratFormat('sehat'); + $this->tpl->set('surat', $surat); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'])); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.sehat.html', true); + exit(); + } + + // SURAT BEBAS NARKOBA METHODS + public function anyBebasNarkoba($no_rawat = '') + { + return $this->_handleSuratCetak($no_rawat, 'bebasnarkoba', 'suratbebasnarkoba', 'Surat Bebas Narkoba', 'surat bebas narkoba'); + } + + public function getBebasNarkobaAdd() + { + $this->_addHeaderFiles(); + if (!empty($redirectData = getRedirectData())) { + $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS); + } else { + $this->assign['form'] = [ + 'id' => '', + 'nomor_surat' => '', + 'no_rawat' => '', + 'no_rkm_medis' => '', + 'nm_pasien' => '', + 'tgl_lahir' => '', + 'umur' => '', + 'jk' => '', + 'alamat' => '', + 'tanggal' => date('Y-m-d'), + 'hasil_pemeriksaan' => 'Negatif narkoba', + 'keperluan' => '', + 'dokter' => '', + 'petugas' => '' + ]; + } + + return $this->draw('bebasnarkoba.form.html', ['bebasnarkoba' => $this->assign]); + } + + public function getBebasNarkobaEdit($id) + { + $this->_addHeaderFiles(); + $row = $this->db('mlite_surat_bebas_narkoba')->where('id', $id)->oneArray(); + if (!empty($row)) { + $this->assign['form'] = $row; + return $this->draw('bebasnarkoba.form.html', ['bebasnarkoba' => $this->assign]); + } + + redirect(url([ADMIN, 'surat', 'bebasnarkoba'])); + } + + public function postBebasNarkobaSave($id = null) + { + $errors = 0; + + if (!$id) { + $location = url([ADMIN, 'surat', 'bebasnarkoba']); + } else { + $location = url([ADMIN, 'surat', 'bebasnarkobaedit', $id]); + } + + if (!$errors) { + unset($_POST['save']); + + if (!$id) { + $query = $this->db('mlite_surat_bebas_narkoba')->save($_POST); + } else { + $query = $this->db('mlite_surat_bebas_narkoba')->where('id', $id)->save($_POST); + } + + if ($query) { + $this->notify('success', 'Simpan sukes'); + } else { + $this->notify('failure', 'Simpan gagal'); + } + + redirect($location, $_POST); + } + + redirect($location, $_POST); + } + + public function getBebasNarkobaHapus($id) + { + if ($this->db('mlite_surat_bebas_narkoba')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'bebasnarkoba'])); + } + + public function getSuratBebasNarkoba($no_rawat) + { + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $surat = $this->db('mlite_surat_bebas_narkoba')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); + + if (empty($surat)) { + $surat = [ + 'nomor_surat' => '', + 'tanggal' => date('Y-m-d'), + 'hasil_pemeriksaan' => 'Negatif narkoba', + 'keperluan' => '', + ]; + } + + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $surat = \Systems\Lib\SuratVerification::preparePrintRecord($this->core, 'bebasnarkoba', array_merge($surat, [ + 'no_rawat' => revertNoRawat($no_rawat), + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ])); + $nomor_surat = !empty(trim((string) ($surat['nomor_surat'] ?? ''))) + ? $surat['nomor_surat'] + : $this->_getNomorSuratFormat('bebasnarkoba'); + $this->tpl->set('surat', $surat); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('nomor_surat_tersimpan', !empty(trim((string) ($surat['nomor_surat'] ?? '')))); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'])); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.bebasnarkoba.html', true); + exit(); + } + + public function postSimpanSuratBebasNarkoba() + { + header('Content-Type: application/json'); + + $data_save = [ + 'nomor_surat' => isset($_POST['nomor_surat']) ? trim($_POST['nomor_surat']) : '', + 'no_rawat' => isset($_POST['no_rawat']) ? trim($_POST['no_rawat']) : '', + 'no_rkm_medis' => isset($_POST['no_rkm_medis']) ? trim($_POST['no_rkm_medis']) : '', + 'nm_pasien' => isset($_POST['nm_pasien']) ? trim($_POST['nm_pasien']) : '', + 'tgl_lahir' => isset($_POST['tgl_lahir']) ? trim($_POST['tgl_lahir']) : '', + 'umur' => isset($_POST['umur']) ? trim($_POST['umur']) : '', + 'jk' => isset($_POST['jk']) ? trim($_POST['jk']) : '', + 'alamat' => isset($_POST['alamat']) ? trim($_POST['alamat']) : '', + 'tanggal' => isset($_POST['tanggal']) ? trim($_POST['tanggal']) : '', + 'hasil_pemeriksaan' => isset($_POST['hasil_pemeriksaan']) ? trim($_POST['hasil_pemeriksaan']) : '', + 'keperluan' => isset($_POST['keperluan']) ? trim($_POST['keperluan']) : '', + 'dokter' => isset($_POST['dokter']) ? trim($_POST['dokter']) : '', + 'petugas' => isset($_POST['petugas']) ? trim($_POST['petugas']) : '' + ]; + + if (checkEmptyFields(['nomor_surat', 'no_rawat', 'no_rkm_medis', 'nm_pasien'], $data_save)) { + echo json_encode(['status' => 'error', 'msg' => 'Data surat belum lengkap']); + exit(); + } + + $existing = $this->db('mlite_surat_bebas_narkoba') + ->where('no_rawat', $data_save['no_rawat']) + ->oneArray(); + $hadNomorBefore = !empty(trim((string) ($existing['nomor_surat'] ?? ''))); + $result = \Systems\Lib\SuratVerification::save($this->core, 'bebasnarkoba', $data_save); + + if ($result['success']) { + if (!$hadNomorBefore && $data_save['nomor_surat'] !== '') { + $this->_incrementNomorSuratCounter('bebasnarkoba'); + } + echo json_encode(['status' => 'success']); + exit(); + } + + echo json_encode(['status' => 'error', 'msg' => 'Gagal menyimpan surat']); + exit(); + } + + // SURAT KEMATIAN METHODS + public function anyKematian($no_rawat = '') + { + return $this->_handleSuratCetak($no_rawat, 'kematian', 'suratkematian', 'Surat Keterangan Kematian', 'surat keterangan kematian'); + } + + public function getSuratKematian($no_rawat) + { + $clean = revertNoRawat($no_rawat); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $clean); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $clean); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $pasien = array_map(function($v) { + return is_string($v) ? preg_replace('/[\r\n\t]+/', ' ', $v) : $v; + }, $pasien ?? []); + $nm_dokter = preg_replace('/[\r\n\t]+/', ' ', (string)$nm_dokter); + $surat = \Systems\Lib\SuratVerification::preparePrintRecord($this->core, 'kematian', [ + 'no_rawat' => $clean, + 'no_rkm_medis' => $no_rkm_medis, + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'no_ktp' => $pasien['no_ktp'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ]); + $nomor_surat = !empty(trim((string)($surat['nomor_surat'] ?? ''))) ? $surat['nomor_surat'] : $this->_getNomorSuratFormat('kematian'); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', $clean); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $this->tpl->set('surat', $this->tpl->noParse_array(htmlspecialchars_array($surat))); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('nomor_surat_tersimpan', !empty(trim((string)($surat['nomor_surat'] ?? '')))); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'] ?? '')); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.kematian.html', true); + exit(); + } + + public function getKematianEdit($id) + { + $row = $this->db('mlite_surat_kematian')->where('id', $id)->oneArray(); + if (!empty($row) && !empty($row['no_rawat'])) { + redirect(url([ADMIN, 'surat', 'suratkematian', convertNorawat($row['no_rawat'])])); + } + redirect(url([ADMIN, 'surat', 'kematian'])); + } + + public function getKematianHapus($id) + { + if ($this->db('mlite_surat_kematian')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'kematian'])); + } + + public function postSimpanSuratKematian() + { + header('Content-Type: application/json'); + $data_save = [ + 'nomor_surat' => trim((string)($_POST['nomor_surat'] ?? '')), + 'no_rawat' => trim((string)($_POST['no_rawat'] ?? '')), + 'no_rkm_medis' => trim((string)($_POST['no_rkm_medis'] ?? '')), + 'nm_pasien' => trim((string)($_POST['nm_pasien'] ?? '')), + 'no_ktp' => trim((string)($_POST['no_ktp'] ?? '')), + 'tgl_lahir' => trim((string)($_POST['tgl_lahir'] ?? '')), + 'umur' => trim((string)($_POST['umur'] ?? '')), + 'jk' => trim((string)($_POST['jk'] ?? '')), + 'alamat' => trim((string)($_POST['alamat'] ?? '')), + 'tanggal_meninggal' => trim((string)($_POST['tanggal_meninggal'] ?? '')), + 'jam_meninggal' => trim((string)($_POST['jam_meninggal'] ?? '')), + 'sebab_kematian' => trim((string)($_POST['sebab_kematian'] ?? '')), + 'keterangan' => trim((string)($_POST['keterangan'] ?? '')), + 'dokter' => trim((string)($_POST['dokter'] ?? '')), + 'petugas' => trim((string)($_POST['petugas'] ?? '')), + ]; + if (checkEmptyFields(['nomor_surat', 'no_rawat', 'no_rkm_medis', 'nm_pasien'], $data_save)) { + echo json_encode(['status' => 'error', 'msg' => 'Data surat belum lengkap']); + exit(); + } + $existing = $this->db('mlite_surat_kematian')->where('no_rawat', $data_save['no_rawat'])->oneArray(); + $hadNomorBefore = !empty(trim((string)($existing['nomor_surat'] ?? ''))); + $result = \Systems\Lib\SuratVerification::save($this->core, 'kematian', $data_save); + if ($result['success']) { + if (!$hadNomorBefore && $data_save['nomor_surat'] !== '') { + $this->_incrementNomorSuratCounter('kematian'); + } + echo json_encode(['status' => 'success']); + exit(); + } + echo json_encode(['status' => 'error', 'msg' => 'Gagal menyimpan surat']); + exit(); + } + + // SURAT KONTROL METHODS + public function anyKontrol($no_rawat = '') + { + if (!empty($no_rawat)) { + redirect(url([ADMIN, 'surat', 'suratkontrol', $no_rawat])); + } + + $this->_addHeaderFiles(); + + $phrase = isset($_GET['s']) ? trim((string) $_GET['s']) : ''; + $page = max(1, (int) (isset($_GET['page']) ? $_GET['page'] : 1)); + $perpage = 10; + + $buildQuery = function () use ($phrase) { + $query = $this->db('booking_registrasi') + ->join('pasien', 'pasien.no_rkm_medis=booking_registrasi.no_rkm_medis') + ->leftJoin('poliklinik', 'poliklinik.kd_poli=booking_registrasi.kd_poli') + ->leftJoin('dokter', 'dokter.kd_dokter=booking_registrasi.kd_dokter') + ->where('booking_registrasi.status', 'Belum'); + if ($phrase !== '') { + $query->where(function ($s) use ($phrase) { + $s->like('pasien.nm_pasien', '%' . $phrase . '%') + ->orLike('pasien.no_rkm_medis', '%' . $phrase . '%'); + }); + } + return $query; + }; + + $total = count($buildQuery()->toArray()); + $rows = $buildQuery() + ->select('booking_registrasi.*, pasien.nm_pasien, pasien.no_rkm_medis, poliklinik.nm_poli, dokter.nm_dokter') + ->desc('booking_registrasi.tanggal_periksa') + ->offset(($page - 1) * $perpage) + ->limit($perpage) + ->toArray(); + + $list = []; + foreach ($rows as $row) { + $row = htmlspecialchars_array($row); + $latestNoRawat = $this->_resolveLatestNoRawatByRM($row['no_rkm_medis']); + $row['printURL'] = !empty($latestNoRawat) ? url([ADMIN, 'surat', 'suratkontrol', convertNorawat($latestNoRawat)]) : ''; + $list[] = $row; + } + + $paginationUrl = url([ADMIN, 'surat', 'kontrol']) . '&s=' . urlencode($phrase) . '&page=%d'; + $pagination = (new \Systems\Lib\Pagination($page, $total, $perpage, $paginationUrl))->nav('pagination', '5'); + + $this->assign['title'] = 'Surat Kontrol'; + $this->assign['searchURL'] = url([ADMIN, 'surat', 'kontrol']); + $this->assign['phrase'] = $phrase; + $this->assign['list'] = $list; + $this->assign['pagination'] = $pagination; + $this->assign['total'] = $total; + + return $this->draw('kontrol.manage.html', ['kontrol' => $this->assign]); + } + + private function _resolveLatestNoRawatByRM($no_rkm_medis) + { + $row = $this->db('reg_periksa') + ->where('no_rkm_medis', $no_rkm_medis) + ->desc('tgl_registrasi') + ->desc('jam_reg') + ->oneArray(); + + return $row['no_rawat'] ?? ''; + } + + public function getSuratKontrol($no_rawat) + { + $clean = revertNoRawat($no_rawat); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $clean); + $kd_poli = $this->core->getRegPeriksaInfo('kd_poli', $clean); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $clean); + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); + $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); + $poliklinik = !empty($kd_poli) ? $this->db('poliklinik')->where('kd_poli', $kd_poli)->oneArray() : []; + $pendingBooking = $this->db('booking_registrasi') + ->leftJoin('poliklinik', 'poliklinik.kd_poli=booking_registrasi.kd_poli') + ->leftJoin('dokter', 'dokter.kd_dokter=booking_registrasi.kd_dokter') + ->where('booking_registrasi.no_rkm_medis', $no_rkm_medis) + ->where('booking_registrasi.status', 'Belum') + ->desc('booking_registrasi.tanggal_periksa') + ->oneArray(); + $pendingSkdp = $this->db('skdp_bpjs') + ->where('no_rkm_medis', $no_rkm_medis) + ->where('status', 'Menunggu') + ->desc('tanggal_rujukan') + ->oneArray(); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $nm_dokter); + $this->tpl->set('sip_dokter', $sip_dokter); + $this->tpl->set('no_rawat', $clean); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $surat = \Systems\Lib\SuratVerification::prepareKontrolRecord($this->core, $no_rkm_medis, [ + 'nm_pasien' => $pasien['nm_pasien'] ?? '', + 'tgl_lahir' => $pasien['tgl_lahir'] ?? '', + 'umur' => !empty($pasien['tgl_lahir']) ? hitungUmur($pasien['tgl_lahir']) : '', + 'jk' => $pasien['jk'] ?? '', + 'alamat' => $pasien['alamat'] ?? '', + 'dokter' => $nm_dokter, + ]); + $belumTersimpan = empty($surat['id']); + if ($belumTersimpan && !empty($pendingBooking)) { + if (!empty($pendingBooking['tanggal_periksa'])) $surat['tanggal_kontrol'] = $pendingBooking['tanggal_periksa']; + if (!empty($pendingBooking['nm_poli'])) $surat['poli_tujuan'] = $pendingBooking['nm_poli']; + if (!empty($pendingBooking['nm_dokter'])) $surat['dokter_tujuan'] = $pendingBooking['nm_dokter']; + } + if ($belumTersimpan && !empty($pendingSkdp['alasan1'])) $surat['keterangan'] = $pendingSkdp['alasan1']; + if (empty(trim((string)($surat['poli_tujuan'] ?? '')))) $surat['poli_tujuan'] = $poliklinik['nm_poli'] ?? ''; + if (empty(trim((string)($surat['dokter_tujuan'] ?? '')))) $surat['dokter_tujuan'] = $nm_dokter; + $this->tpl->set('surat', $this->tpl->noParse_array(htmlspecialchars_array($surat))); + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getVerificationUrl($surat['token_verifikasi'] ?? '')); + echo $this->tpl->draw(MODULES.'/surat/view/admin/surat.kontrol.html', true); + exit(); + } + + public function getKontrolEdit($id) + { + $row = $this->db('mlite_surat_kontrol')->where('id', $id)->oneArray(); + $noRawat = !empty($row['no_rkm_medis']) ? $this->_resolveLatestNoRawatByRM($row['no_rkm_medis']) : ''; + if (!empty($noRawat)) { + redirect(url([ADMIN, 'surat', 'suratkontrol', convertNorawat($noRawat)])); + } + redirect(url([ADMIN, 'surat', 'kontrol'])); + } + + public function getKontrolHapus($id) + { + if ($this->db('mlite_surat_kontrol')->where('id', $id)->delete()) { + $this->notify('success', 'Hapus sukses'); + } else { + $this->notify('failure', 'Hapus gagal'); + } + redirect(url([ADMIN, 'surat', 'kontrol'])); + } + + public function postSimpanSuratKontrol() + { + header('Content-Type: application/json'); + $data_save = [ + 'no_rkm_medis' => trim((string)($_POST['no_rkm_medis'] ?? '')), + 'nm_pasien' => trim((string)($_POST['nm_pasien'] ?? '')), + 'tgl_lahir' => trim((string)($_POST['tgl_lahir'] ?? '')), + 'umur' => trim((string)($_POST['umur'] ?? '')), + 'jk' => trim((string)($_POST['jk'] ?? '')), + 'alamat' => trim((string)($_POST['alamat'] ?? '')), + 'tanggal_kontrol' => trim((string)($_POST['tanggal_kontrol'] ?? '')), + 'poli_tujuan' => trim((string)($_POST['poli_tujuan'] ?? '')), + 'dokter_tujuan' => trim((string)($_POST['dokter_tujuan'] ?? '')), + 'keterangan' => trim((string)($_POST['keterangan'] ?? '')), + 'dokter' => trim((string)($_POST['dokter'] ?? '')), + 'petugas' => trim((string)($_POST['petugas'] ?? '')), + ]; + + if (checkEmptyFields(['no_rkm_medis', 'nm_pasien'], $data_save)) { + echo json_encode(['status' => 'error', 'msg' => 'Data surat belum lengkap']); + exit(); + } + + $result = \Systems\Lib\SuratVerification::saveKontrol($this->core, $data_save); + + if ($result['success']) { + echo json_encode(['status' => 'success']); + exit(); + } + + echo json_encode(['status' => 'error', 'msg' => 'Gagal menyimpan surat']); + exit(); + } + + // RESUME MEDIS METHODS + // resume_pasien dipakai bersama oleh dokter_ralan & dokter_igd. + public function anyResumeMedis() + { + $this->_addHeaderFiles(); + + $phrase = isset($_GET['s']) ? trim((string) $_GET['s']) : ''; + $page = max(1, (int) (isset($_GET['page']) ? $_GET['page'] : 1)); + $perpage = 10; + + $countQ = $this->db('resume_pasien') + ->join('reg_periksa', 'reg_periksa.no_rawat=resume_pasien.no_rawat') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis'); + if ($phrase !== '') { + $countQ->where(function ($s) use ($phrase) { + $s->like('pasien.nm_pasien', '%' . $phrase . '%') + ->orLike('pasien.no_rkm_medis', '%' . $phrase . '%'); + }); + } + $total = count($countQ->toArray()); + + $dataQ = $this->db('resume_pasien') + ->join('reg_periksa', 'reg_periksa.no_rawat=resume_pasien.no_rawat') + ->join('pasien', 'pasien.no_rkm_medis=reg_periksa.no_rkm_medis'); + if ($phrase !== '') { + $dataQ->where(function ($s) use ($phrase) { + $s->like('pasien.nm_pasien', '%' . $phrase . '%') + ->orLike('pasien.no_rkm_medis', '%' . $phrase . '%'); + }); + } + $rows = $dataQ->desc('resume_pasien.no_rawat') + ->offset(($page - 1) * $perpage) + ->limit($perpage) + ->toArray(); + + $list = []; + foreach ($rows as $row) { + $row['printURL'] = url([ADMIN, 'surat', 'resumemediscetak', convertNorawat($row['no_rawat'])]); + $list[] = $row; + } + + $paginationUrl = url([ADMIN, 'surat', 'resumemedis']) . '?s=' . urlencode($phrase) . '&page=%d'; + $paginationObj = new \Systems\Lib\Pagination($page, $total, $perpage, $paginationUrl); + + $this->assign['title'] = 'Resume Medis'; + $this->assign['searchURL'] = url([ADMIN, 'surat', 'resumemedis']); + $this->assign['phrase'] = $phrase; + $this->assign['list'] = $list; + $this->assign['pagination'] = $paginationObj->nav('pagination', '5'); + $this->assign['total'] = $total; + + return $this->draw('resume.medis.form.html', ['resume_medis' => $this->assign]); + } + + public function getResumeMedisCetak($no_rawat) + { + $clean = revertNoRawat($no_rawat); + $reg = $this->db('reg_periksa') + ->join('poliklinik', 'poliklinik.kd_poli=reg_periksa.kd_poli') + ->join('dokter', 'dokter.kd_dokter=reg_periksa.kd_dokter') + ->join('penjab', 'penjab.kd_pj=reg_periksa.kd_pj') + ->where('reg_periksa.no_rawat', $clean) + ->oneArray(); + $pasien = $this->db('pasien') + ->where('no_rkm_medis', $reg['no_rkm_medis'] ?? '') + ->oneArray(); + $resume = $this->db('resume_pasien') + ->join('dokter', 'dokter.kd_dokter=resume_pasien.kd_dokter') + ->where('no_rawat', $clean) + ->oneArray(); + $pemfis = $this->db('pemeriksaan_ralan') + ->where('no_rawat', $clean) + ->desc('tgl_perawatan')->desc('jam_rawat') + ->oneArray(); + $diagnosa_list = $this->db('diagnosa_pasien') + ->join('penyakit', 'penyakit.kd_penyakit=diagnosa_pasien.kd_penyakit') + ->where('diagnosa_pasien.no_rawat', $clean) + ->where('diagnosa_pasien.status', 'Ralan') + ->asc('prioritas') + ->toArray(); + $prosedur_list = $this->db('prosedur_pasien') + ->join('icd9', 'icd9.kode=prosedur_pasien.kode') + ->where('prosedur_pasien.no_rawat', $clean) + ->where('prosedur_pasien.status', 'Ralan') + ->toArray(); + $resep_list = $this->db('resep_dokter') + ->join('resep_obat', 'resep_obat.no_resep=resep_dokter.no_resep') + ->join('databarang', 'databarang.kode_brng=resep_dokter.kode_brng') + ->where('resep_obat.no_rawat', $clean) + ->where('resep_obat.status', 'ralan') + ->toArray(); + + $diagnosa_html = ''; + foreach ($diagnosa_list as $i => $dx) { + if ($diagnosa_html) $diagnosa_html .= '
                  '; + $text = htmlspecialchars(($dx['kd_penyakit'] ?? '') . ' — ' . ($dx['nm_penyakit'] ?? '')); + $diagnosa_html .= $i === 0 ? '' . $text . '' : $text; + } + if (!$diagnosa_html) $diagnosa_html = htmlspecialchars($resume['diagnosa_utama'] ?? '-'); + + $prosedur_html = ''; + foreach ($prosedur_list as $pr) { + if ($prosedur_html) $prosedur_html .= '
                  '; + $prosedur_html .= htmlspecialchars(($pr['kode'] ?? '') . ' — ' . ($pr['deskripsi_panjang'] ?? '')); + } + if (!$prosedur_html) $prosedur_html = htmlspecialchars($resume['prosedur_utama'] ?? '-'); + + $obat_html = ''; + foreach ($resep_list as $ob) { + if ($obat_html) $obat_html .= '
                  '; + $obat_html .= htmlspecialchars(($ob['nama_brng'] ?? '') . ' — ' . ($ob['jml'] ?? '') . ' — ' . ($ob['aturan_pakai'] ?? '')); + } + if (!$obat_html) $obat_html = '-'; + + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $this->tpl->set('reg', $this->tpl->noParse_array(htmlspecialchars_array($reg ?? []))); + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien ?? []))); + $this->tpl->set('resume', $this->tpl->noParse_array(htmlspecialchars_array($resume ?? []))); + $this->tpl->set('pemfis', $this->tpl->noParse_array(htmlspecialchars_array($pemfis ?? []))); + $this->tpl->set('diagnosa_html', $this->tpl->noParse($diagnosa_html)); + $this->tpl->set('prosedur_html', $this->tpl->noParse($prosedur_html)); + $this->tpl->set('obat_html', $this->tpl->noParse($obat_html)); + $this->tpl->set('lab_html', ''); + $this->tpl->set('no_rawat', $clean); + echo $this->tpl->draw(MODULES.'/surat/view/admin/resume.medis.cetak.html', true); + exit(); + } + + // PENGATURAN METHODS + public function getSettings() + { + $this->_addHeaderFiles(); + $this->assign['title'] = 'Pengaturan Surat'; + $this->assign['settings'] = [ + 'surat_rujukan_template' => $this->settings->get('surat.rujukan_template', ''), + 'surat_sakit_template' => $this->settings->get('surat.sakit_template', ''), + 'surat_sehat_template' => $this->settings->get('surat.sehat_template', ''), + 'kepala_surat' => $this->settings->get('surat.kepala_surat', ''), + 'footer_surat' => $this->settings->get('surat.footer_surat', '') + ]; + return $this->draw('settings.html', ['settings' => $this->assign]); + } + + public function postSettingsSave() + { + foreach ($_POST as $key => $value) { + $this->settings->set('surat.' . $key, $value); + } + $this->notify('success', 'Pengaturan berhasil disimpan'); + redirect(url([ADMIN, 'surat', 'settings'])); + } + + private function _addHeaderFiles() + { + $this->core->addCSS(url('assets/css/dataTables.bootstrap.min.css')); + $this->core->addJS(url('assets/jscripts/jquery.dataTables.min.js')); + $this->core->addJS(url('assets/jscripts/dataTables.bootstrap.min.js')); + } + + private function _ensureSuratSchema() + { + \Systems\Lib\SuratVerification::ensureSchema($this->core); + \Systems\Lib\SuratVerification::cleanupDrafts($this->core); + } + + private function _buildRujukanUtamaQuery($phrase = '') + { + $query = $this->_applyRujukanUtamaScope($this->db('mlite_surat_rujukan')); + + if ($phrase !== '') { + $query->where(function ($scope) use ($phrase) { + $scope->like('nomor_surat', '%' . $phrase . '%') + ->orLike('nm_pasien', '%' . $phrase . '%') + ->orLike('no_rkm_medis', '%' . $phrase . '%'); + }); + } + + return $query; + } + + private function _applyRujukanUtamaScope($query) + { + $query->where(function ($scope) { + $scope->notLike('di', '__SURAT_PERMINTAAN_%')->orIsNull('di'); + }); + + return $query; + } + + private function _isRujukanPermintaanRow(array $row): bool + { + return strpos((string) ($row['di'] ?? ''), '__SURAT_PERMINTAAN_') === 0; + } + + private function _getRujukanPermintaanConfig($route) + { + if (!isset(self::RUJUKAN_PERMINTAAN[$route])) { + throw new \InvalidArgumentException('Route surat permintaan tidak dikenali: ' . $route); + } + + return self::RUJUKAN_PERMINTAAN[$route]; + } + + private function _getRujukanPermintaanRecord($no_rawat, $route) + { + $config = $this->_getRujukanPermintaanConfig($route); + + $row = $this->db('mlite_surat_rujukan') + ->where('no_rawat', $no_rawat) + ->where('di', $config['marker']) + ->desc('id') + ->oneArray(); + + return $row ?: []; + } + + private function _getRujukanPermintaanDefaults() + { + return [ + 'nomor_surat' => '', + 'anamnesa' => '', + 'pemeriksaan_fisik' => '', + 'pemeriksaan_penunjang' => '', + 'dokter' => '', + 'petugas' => '', + ]; + } + + private function _getNomorSuratFormat($type = 'umum') + { + return \Systems\Lib\SuratVerification::getNomorSuratPreview($this->core, $type); + } + + private function _incrementNomorSuratCounter($type = 'umum') + { + \Systems\Lib\SuratVerification::incrementNomorSuratCounter($this->core, $type); + } + + private function _saveRujukanPermintaan($route) + { + header('Content-Type: application/json'); + + $config = $this->_getRujukanPermintaanConfig($route); + $data_save = [ + 'nomor_surat' => isset($_POST['nomor_surat']) ? trim($_POST['nomor_surat']) : '', + 'no_rawat' => isset($_POST['no_rawat']) ? trim($_POST['no_rawat']) : '', + 'no_rkm_medis' => isset($_POST['no_rkm_medis']) ? trim($_POST['no_rkm_medis']) : '', + 'nm_pasien' => isset($_POST['nm_pasien']) ? trim($_POST['nm_pasien']) : '', + 'tgl_lahir' => isset($_POST['tgl_lahir']) ? trim($_POST['tgl_lahir']) : '', + 'umur' => isset($_POST['umur']) ? trim($_POST['umur']) : '', + 'jk' => isset($_POST['jk']) ? trim($_POST['jk']) : '', + 'alamat' => isset($_POST['alamat']) ? trim($_POST['alamat']) : '', + 'indikasi' => isset($_POST['indikasi']) ? trim($_POST['indikasi']) : '', + 'permintaan' => isset($_POST['permintaan']) ? trim($_POST['permintaan']) : '', + 'catatan' => isset($_POST['catatan']) ? trim($_POST['catatan']) : '', + 'dokter' => isset($_POST['dokter']) ? trim($_POST['dokter']) : '', + 'petugas' => isset($_POST['petugas']) ? trim($_POST['petugas']) : '', + ]; + + if (checkEmptyFields(['nomor_surat', 'no_rawat', 'no_rkm_medis', 'nm_pasien'], $data_save)) { + echo json_encode(['status' => 'error', 'msg' => 'Data surat belum lengkap']); + exit(); + } + + $existing = $this->_getRujukanPermintaanRecord($data_save['no_rawat'], $route); + $hadNomorBefore = !empty(trim((string) ($existing['nomor_surat'] ?? ''))); + $payload = [ + 'nomor_surat' => $data_save['nomor_surat'], + 'no_rawat' => $data_save['no_rawat'], + 'no_rkm_medis' => $data_save['no_rkm_medis'], + 'nm_pasien' => $data_save['nm_pasien'], + 'tgl_lahir' => $data_save['tgl_lahir'], + 'umur' => $data_save['umur'], + 'jk' => $data_save['jk'], + 'alamat' => $data_save['alamat'], + 'kepada' => 'Permintaan ' . $config['jenis'], + 'di' => $config['marker'], + 'anamnesa' => $data_save['indikasi'], + 'pemeriksaan_fisik' => $data_save['permintaan'], + 'pemeriksaan_penunjang' => $data_save['catatan'], + 'diagnosa' => '', + 'terapi' => '', + 'alasan_dirujuk' => '', + 'dokter' => $data_save['dokter'], + 'petugas' => $data_save['petugas'], + ]; + + if (empty($existing)) { + $result = $this->db('mlite_surat_rujukan')->save($payload); + } else { + $result = $this->db('mlite_surat_rujukan')->where('id', $existing['id'])->save($payload); + } + + if ($result && !$hadNomorBefore && $data_save['nomor_surat'] !== '') { + $this->_incrementNomorSuratCounter($route); + } + + if ($result) { + echo json_encode(['status' => 'success', 'msg' => 'Data berhasil disimpan']); + exit(); + } + + echo json_encode(['status' => 'error', 'msg' => 'Gagal menyimpan ke database']); + exit(); + } + + private function _handleSuratCetak($no_rawat, $route, $printRoute, $title, $jenis) + { + $this->_addHeaderFiles(); + + if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['no_rawat'])) { + $no_rawat_key = $this->_normalizeNoRawatKey($_POST['no_rawat']); + if (empty($no_rawat_key)) { + $this->notify('failure', 'No. Rawat wajib diisi'); + redirect(url([ADMIN, 'surat', $route]), $_POST); + } + redirect(url([ADMIN, 'surat', $printRoute, $no_rawat_key])); + } + + if (!empty($no_rawat)) { + redirect(url([ADMIN, 'surat', $printRoute, $no_rawat])); + } + + $phrase = isset($_GET['s']) ? trim((string) $_GET['s']) : ''; + $page = max(1, (int) (isset($_GET['page']) ? $_GET['page'] : 1)); + $perpage = 10; + $config = $this->_getSuratCetakConfig($route); + $historyList = []; + $pagination = ''; + $total = 0; + + if ($config) { + $countQ = $this->db($config['table']); + if ($config['is_rujukan_utama']) { + $this->_applyRujukanUtamaScope($countQ); + } + if ($phrase !== '') { + $countQ->where(function ($s) use ($phrase) { + $s->like('nomor_surat', '%' . $phrase . '%') + ->orLike('nm_pasien', '%' . $phrase . '%') + ->orLike('no_rkm_medis', '%' . $phrase . '%'); + }); + } + $total = count($countQ->toArray()); + + $dataQ = $this->db($config['table']); + if ($config['is_rujukan_utama']) { + $this->_applyRujukanUtamaScope($dataQ); + } + if ($phrase !== '') { + $dataQ->where(function ($s) use ($phrase) { + $s->like('nomor_surat', '%' . $phrase . '%') + ->orLike('nm_pasien', '%' . $phrase . '%') + ->orLike('no_rkm_medis', '%' . $phrase . '%'); + }); + } + $rows = $dataQ->desc('id')->offset(($page - 1) * $perpage)->limit($perpage)->toArray(); + + $paginationUrl = url([ADMIN, 'surat', $route]) . '&s=' . urlencode($phrase) . '&page=%d'; + $paginationObj = new \Systems\Lib\Pagination($page, $total, $perpage, $paginationUrl); + $pagination = $paginationObj->nav('pagination', '5'); + + foreach ($rows as $row) { + $row = htmlspecialchars_array($row); + $row['editURL'] = url([ADMIN, 'surat', $config['editRoute'], $row['id']]); + $row['deleteURL'] = url([ADMIN, 'surat', $config['deleteRoute'], $row['id']]); + $row['printURL'] = !empty($row['no_rawat']) + ? url([ADMIN, 'surat', $printRoute, convertNorawat($row['no_rawat'])]) + : ''; + $historyList[] = $row; + } + } + + $this->assign['title'] = $title; + $this->assign['description'] = 'Masukkan No. Rawat untuk mencetak ' . $jenis . '.'; + $this->assign['formURL'] = url([ADMIN, 'surat', $route]); + $this->assign['buttonText'] = 'Cetak ' . $title; + $this->assign['example'] = 'Contoh: 2026/05/21/000001'; + $this->assign['form'] = !empty($redirectData = getRedirectData()) + ? filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS) + : ['no_rawat' => '']; + $this->assign['list'] = $historyList; + $this->assign['pagination'] = $pagination; + $this->assign['searchURL'] = url([ADMIN, 'surat', $route]); + $this->assign['phrase'] = $phrase; + $this->assign['total'] = $total; + $this->assign['showHistory'] = true; + + return $this->draw('rujukan.permintaan.form.html', ['permintaan' => $this->assign]); + } + + private function _getSuratCetakConfig($route) + { + $configs = [ + 'rujukan' => [ + 'table' => 'mlite_surat_rujukan', + 'editRoute' => 'rujukanedit', + 'deleteRoute' => 'rujukanhapus', + 'is_rujukan_utama' => true, + ], + 'sakit' => [ + 'table' => 'mlite_surat_sakit', + 'editRoute' => 'sakitedit', + 'deleteRoute' => 'sakithapus', + 'is_rujukan_utama' => false, + ], + 'sehat' => [ + 'table' => 'mlite_surat_sehat', + 'editRoute' => 'sehatedit', + 'deleteRoute' => 'sehathapus', + 'is_rujukan_utama' => false, + ], + 'bebasnarkoba' => [ + 'table' => 'mlite_surat_bebas_narkoba', + 'editRoute' => 'bebasnarkobaedit', + 'deleteRoute' => 'bebasnarkobahapus', + 'is_rujukan_utama' => false, + ], + 'kematian' => [ + 'table' => 'mlite_surat_kematian', + 'editRoute' => 'kematianedit', + 'deleteRoute' => 'kematianhapus', + 'is_rujukan_utama' => false, + ], + ]; + return isset($configs[$route]) ? $configs[$route] : null; + } + + private function _handleRujukanPermintaan($no_rawat, $jenis, $route, $title) + { + $this->_addHeaderFiles(); + + if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['no_rawat'])) { + $no_rawat_key = $this->_normalizeNoRawatKey($_POST['no_rawat']); + + if (empty($no_rawat_key)) { + $this->notify('failure', 'No. Rawat wajib diisi'); + redirect(url([ADMIN, 'surat', $route]), $_POST); + } + + redirect(url([ADMIN, 'surat', $route, $no_rawat_key])); + } + + if (!empty($no_rawat)) { + $this->_printRujukanPermintaan($no_rawat, $jenis, $route); + } + + $config = $this->_getRujukanPermintaanConfig($route); + $phrase = isset($_GET['s']) ? trim((string) $_GET['s']) : ''; + $page = max(1, (int) (isset($_GET['page']) ? $_GET['page'] : 1)); + $perpage = 10; + $historyList = []; + $pagination = ''; + $total = 0; + + $countQ = $this->db('mlite_surat_rujukan')->where('di', $config['marker']); + if ($phrase !== '') { + $countQ->where(function ($s) use ($phrase) { + $s->like('nomor_surat', '%' . $phrase . '%') + ->orLike('nm_pasien', '%' . $phrase . '%') + ->orLike('no_rkm_medis', '%' . $phrase . '%'); + }); + } + $total = count($countQ->toArray()); + + $dataQ = $this->db('mlite_surat_rujukan')->where('di', $config['marker']); + if ($phrase !== '') { + $dataQ->where(function ($s) use ($phrase) { + $s->like('nomor_surat', '%' . $phrase . '%') + ->orLike('nm_pasien', '%' . $phrase . '%') + ->orLike('no_rkm_medis', '%' . $phrase . '%'); + }); + } + $rows = $dataQ->desc('id')->offset(($page - 1) * $perpage)->limit($perpage)->toArray(); + + $paginationUrl = url([ADMIN, 'surat', $route]) . '?s=' . urlencode($phrase) . '&page=%d'; + $paginationObj = new \Systems\Lib\Pagination($page, $total, $perpage, $paginationUrl); + $pagination = $paginationObj->nav('pagination', '5'); + + foreach ($rows as $row) { + $row = htmlspecialchars_array($row); + $row['printURL'] = !empty($row['no_rawat']) + ? url([ADMIN, 'surat', $route, convertNorawat($row['no_rawat'])]) + : ''; + $row['editURL'] = $row['printURL']; + $row['deleteURL'] = url([ADMIN, 'surat', $route . 'hapus', $row['id']]); + $historyList[] = $row; + } + + $this->assign['title'] = $title; + $this->assign['description'] = 'Masukkan No. Rawat untuk mencetak surat permintaan ' . strtolower($jenis) . '.'; + $this->assign['formURL'] = url([ADMIN, 'surat', $route]); + $this->assign['buttonText'] = 'Cetak ' . $title; + $this->assign['example'] = 'Contoh: 2026/05/21/000001'; + $this->assign['form'] = !empty($redirectData = getRedirectData()) + ? filter_var_array($redirectData, FILTER_SANITIZE_FULL_SPECIAL_CHARS) + : ['no_rawat' => '']; + $this->assign['list'] = $historyList; + $this->assign['pagination'] = $pagination; + $this->assign['searchURL'] = url([ADMIN, 'surat', $route]); + $this->assign['phrase'] = $phrase; + $this->assign['total'] = $total; + $this->assign['showHistory'] = true; + + return $this->draw('rujukan.permintaan.form.html', ['permintaan' => $this->assign]); + } + + private function _printRujukanPermintaan($no_rawat, $jenis, $route) + { + $clean_no_rawat = revertNoRawat($no_rawat); + $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', $clean_no_rawat); + $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', $clean_no_rawat); + + if (empty($kd_dokter) || empty($no_rkm_medis)) { + $this->notify('failure', 'No. Rawat tidak ditemukan'); + redirect(url([ADMIN, 'surat', $route])); + } + + $pasien = $this->db('pasien') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') + ->leftJoin('propinsi', 'propinsi.kd_prop=pasien.kd_prop') + ->where('no_rkm_medis', $no_rkm_medis) + ->oneArray(); + + if (empty($pasien)) { + $this->notify('failure', 'Data pasien tidak ditemukan'); + redirect(url([ADMIN, 'surat', $route])); + } + + $requestConfig = $this->_getRujukanPermintaanConfig($route); + $surat = array_merge($this->_getRujukanPermintaanDefaults(), $this->_getRujukanPermintaanRecord($clean_no_rawat, $route)); + $dokter_ttd = $this->resolveRujukanDokterPenandatangan($jenis, $kd_dokter); + + $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); + $this->tpl->set('nm_dokter', $dokter_ttd['nm_dokter']); + $this->tpl->set('sip_dokter', $dokter_ttd['sip_dokter']); + $this->tpl->set('no_rawat', $clean_no_rawat); + $this->tpl->set('jenis_label', $jenis); + $this->tpl->set('judul', 'SURAT PERMINTAAN ' . strtoupper($jenis)); + $nomor_surat = !empty(trim((string) ($surat['nomor_surat'] ?? ''))) + ? $surat['nomor_surat'] + : $this->_getNomorSuratFormat($route); + $this->tpl->set('surat', $this->tpl->noParse_array(htmlspecialchars_array($surat))); + $this->tpl->set('nomor_surat', $nomor_surat); + $this->tpl->set('save_url', url([ADMIN, 'surat', $requestConfig['save_route']])); + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); + $verificationType = $requestConfig['verification_type']; + $this->tpl->set('surat_verifikasi_url', \Systems\Lib\SuratVerification::getRequestVerificationUrl($verificationType, $clean_no_rawat)); + + echo $this->tpl->draw(MODULES.'/surat/view/admin/rujukan.permintaan.html', true); + exit(); + } + + private function resolveRujukanDokterPenandatangan($jenis, $fallbackKdDokter) + { + $jenis = strtolower(trim((string) $jenis)); + $settingKey = $jenis === 'radiologi' ? 'settings.pj_radiologi' : 'settings.pj_laboratorium'; + + $kdDokter = trim((string) $this->settings->get($settingKey)); + if ($kdDokter === '' && $jenis === 'radiologi') { + $kdDokter = trim((string) $this->settings->get('settings.pj_laboratorium')); + } + if ($kdDokter === '') { + $kdDokter = trim((string) $fallbackKdDokter); + } + + $dokter = !empty($kdDokter) ? $this->db('dokter')->where('kd_dokter', $kdDokter)->oneArray() : []; + if (empty($dokter) && !empty($fallbackKdDokter)) { + $dokter = $this->db('dokter')->where('kd_dokter', $fallbackKdDokter)->oneArray(); + $kdDokter = !empty($dokter['kd_dokter']) ? $dokter['kd_dokter'] : $fallbackKdDokter; + } + + $nmDokter = trim((string) ($dokter['nm_dokter'] ?? '')); + if ($nmDokter === '' && $kdDokter !== '') { + $nmDokter = trim((string) $this->core->getPegawaiInfo('nama', $kdDokter)); + } + + $sipDokter = trim((string) ($dokter['no_ijn_praktek'] ?? '')); + if ($sipDokter === '' && $kdDokter !== '') { + $sipDokter = trim((string) $this->core->getDokterInfo('no_ijn_praktek', $kdDokter)); + } + + return [ + 'kd_dokter' => $kdDokter, + 'nm_dokter' => $nmDokter, + 'sip_dokter' => $sipDokter, + ]; + } + + private function _normalizeNoRawatKey($no_rawat) + { + $no_rawat = trim((string) $no_rawat); + + if ($no_rawat === '') { + return ''; + } + + if (strpos($no_rawat, '/') !== false) { + $no_rawat = convertNorawat($no_rawat); + } else { + $no_rawat = preg_replace('/[^0-9]/', '', $no_rawat); + } + + return strlen($no_rawat) === 14 ? $no_rawat : ''; + } +} diff --git a/plugins/surat/Info.php b/plugins/surat/Info.php new file mode 100644 index 000000000..3f9a9e4fc --- /dev/null +++ b/plugins/surat/Info.php @@ -0,0 +1,33 @@ + 'Surat-Surat', + 'description' => 'Modul mLITE surat rujukan, sakit, sehat, dan bebas narkoba', + 'author' => 'Basoro', + 'category' => 'manajemen', + 'version' => '1.1', + 'compatibility' => '5.*.*', + 'icon' => 'code', + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `mlite_surat_bebas_narkoba` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `nomor_surat` varchar(100) DEFAULT NULL, + `no_rawat` varchar(100) DEFAULT NULL, + `no_rkm_medis` varchar(100) DEFAULT NULL, + `nm_pasien` varchar(100) DEFAULT NULL, + `tgl_lahir` varchar(100) DEFAULT NULL, + `umur` varchar(100) DEFAULT NULL, + `jk` varchar(100) DEFAULT NULL, + `alamat` varchar(1000) DEFAULT NULL, + `tanggal` varchar(100) DEFAULT NULL, + `hasil_pemeriksaan` varchar(1000) DEFAULT NULL, + `keperluan` varchar(250) DEFAULT NULL, + `dokter` varchar(100) DEFAULT NULL, + `petugas` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=latin1;"); + }, + 'uninstall' => function() use($core) + { + } +]; diff --git a/plugins/surat/README.md b/plugins/surat/README.md new file mode 100644 index 000000000..980ed3e97 --- /dev/null +++ b/plugins/surat/README.md @@ -0,0 +1,86 @@ +# Plugin Surat-Surat + +Dokumentasi singkat penggunaan modul **Surat-Surat** di mLITE untuk penerbitan surat rujukan, surat keterangan sakit, surat keterangan sehat, dan surat bebas narkoba pasien. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Surat-Surat**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Surat Rujukan + - Surat Rujukan Lab + - Surat Rujukan Radiologi + - Surat Sakit + - Surat Sehat + - Surat Bebas Narkoba + - Surat Kematian + - Surat Kontrol + +## Panduan Pengguna (Petugas) + +1. **Surat Rujukan** + - Buka submenu **Surat Rujukan**. + - Klik **Tambah** untuk membuat surat baru, atau pilih surat dari daftar untuk diedit. + - Isi nomor surat, no rawat, data pasien (nama, tanggal lahir, jenis kelamin, alamat), tujuan faskes rujukan, anamnesa, pemeriksaan fisik, pemeriksaan penunjang, diagnosa, terapi, dan alasan dirujuk. + - Klik **Simpan** untuk menyimpan data. + - Untuk mencetak, buka menu **Rawat Jalan** pada data kunjungan pasien, pilih **Surat Rujukan** dari menu surat yang muncul otomatis. + +2. **Surat Keterangan Sakit** + - Buka submenu **Surat Sakit**. + - Klik **Tambah** atau cari surat yang sudah ada menggunakan kolom pencarian (nomor surat / nama pasien). + - Isi nomor surat, no rawat, data pasien, keadaan umum, diagnosa, lama istirahat (angka dan huruf), tanggal mulai dan selesai. + - Klik **Simpan**. + - Cetak surat dari halaman kunjungan Rawat Jalan melalui menu **Surat Keterangan Sakit**. + +3. **Surat Keterangan Sehat** + - Buka submenu **Surat Sehat**. + - Isi nomor surat, no rawat, data pasien, tanggal periksa, berat badan, tinggi badan, tensi, golongan darah, riwayat penyakit, dan keperluan surat. + - Klik **Simpan**. + - Cetak surat dari halaman kunjungan Rawat Jalan melalui menu **Surat Keterangan Sehat**. + +4. **Surat Bebas Narkoba** + - Buka submenu **Surat Bebas Narkoba**. + - Isi nomor surat, no rawat, data pasien, tanggal pemeriksaan, hasil pemeriksaan, dan keperluan surat. + - Klik **Simpan**. + - Surat juga dapat dibuka dari dropdown **No. RM > Surat-Surat** pada modul pelayanan. + +5. **Surat Kontrol** + - Buka submenu **Surat Kontrol**. + - Isi No. Rawat, klik **Cetak Surat Kontrol**. + - Data pasien terisi otomatis; lengkapi tanggal kontrol berikutnya, poli tujuan, dokter tujuan, dan keterangan. + - Klik **Simpan** lalu **Cetak Surat** untuk mencetak. + - Surat juga dapat dibuka dari dropdown **No. RM > Surat-Surat** pada modul pelayanan. + +6. **Surat Rujukan Lab / Radiologi** + - Buka submenu **Surat Rujukan Lab** atau **Surat Rujukan Radiologi**. + - Masukkan **No. Rawat** pasien. + - Klik tombol cetak untuk membuka surat permintaan pemeriksaan. + +7. **Pencarian Surat** + - Setiap submenu dilengkapi kolom pencarian berdasarkan nomor surat atau nama pasien. + - Gunakan tombol **Edit** untuk mengubah data dan **Hapus** untuk menghapus surat. + +## Panduan Admin + +1. **Pengaturan Kop dan Footer Surat** + - Akses **Pengaturan** (getSettings) pada modul Surat-Surat. + - Isi field **Kepala Surat** untuk kop surat institusi. + - Isi field **Footer Surat** untuk tanda tangan atau informasi penutup. + - Simpan perubahan. + +2. **Template Surat** + - Atur template tampilan untuk masing-masing jenis surat (rujukan, sakit, sehat) melalui field template di halaman Pengaturan. + - Template menentukan tata letak cetak surat yang dihasilkan. + +3. **Integrasi Rawat Jalan** + - Plugin ini terintegrasi otomatis dengan modul Rawat Jalan melalui event `rawat_jalan.surat_menu`. + - Pastikan modul Rawat Jalan aktif agar tautan cetak surat muncul pada halaman kunjungan pasien. + +## Catatan + +- Nomor surat diisi manual; pastikan menggunakan format penomoran yang konsisten sesuai kebijakan fasilitas kesehatan. +- Data dokter dan SIP dokter diambil otomatis dari data kunjungan (no rawat) yang terhubung ke tabel `reg_periksa`, `dokter`, dan `pasien`. +- Surat dicetak langsung dari browser; gunakan fungsi print browser atau tombol Print yang tersedia di halaman cetak. +- Satu no rawat hanya dapat memiliki satu surat per jenis saat disimpan dari halaman cetak; data lama akan tertimpa jika disimpan ulang dengan no rawat yang sama. +- Template cetak surat sekarang menampilkan **No. Rekam Medis** agar identitas pasien konsisten di setiap surat. diff --git a/plugins/surat/Site.php b/plugins/surat/Site.php new file mode 100644 index 000000000..461f96f5d --- /dev/null +++ b/plugins/surat/Site.php @@ -0,0 +1,35 @@ +core, $token); + + $this->setTemplate(false); + echo $this->draw('verifikasi.html', [ + 'verification' => $this->tpl->noParse_array(htmlspecialchars_array($verification)), + ]); + exit(); + } + + if (!isset($_GET['verifikasiPermintaan'])) { + return; + } + + $token = trim((string) $_GET['verifikasiPermintaan']); + $verification = \Systems\Lib\SuratVerification::resolveRequestVerification($this->core, $token); + + $this->setTemplate(false); + echo $this->draw('verifikasi.html', [ + 'verification' => $this->tpl->noParse_array(htmlspecialchars_array($verification)), + ]); + exit(); + } +} diff --git a/plugins/surat/view/admin/bebasnarkoba.form.html b/plugins/surat/view/admin/bebasnarkoba.form.html new file mode 100644 index 000000000..ec23486a8 --- /dev/null +++ b/plugins/surat/view/admin/bebasnarkoba.form.html @@ -0,0 +1,79 @@ +
                  +
                  +
                  +
                  +

                  {if: $bebasnarkoba.form.id}Edit{else}Tambah{/if} Surat Bebas Narkoba

                  +
                  +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + Kembali +
                  +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/bebasnarkoba.manage.html b/plugins/surat/view/admin/bebasnarkoba.manage.html new file mode 100644 index 000000000..a9ffc5dc9 --- /dev/null +++ b/plugins/surat/view/admin/bebasnarkoba.manage.html @@ -0,0 +1,68 @@ +
                  +
                  +
                  +
                  +

                  Kelola Surat Bebas Narkoba

                  +
                  +
                  +
                  +
                  +

                  Jumlah: {?=count($bebasnarkoba.totalRecords)?}

                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + {loop: $bebasnarkoba.list} + + + + + + + + + + + {/loop} + +
                  No. SuratNo. RawatNo. RMNama PasienTanggalHasil PemeriksaanDokterAksi
                  {$value.nomor_surat}{$value.no_rawat}{$value.no_rkm_medis}{$value.nm_pasien}{$value.tanggal}{$value.hasil_pemeriksaan}{$value.dokter} + Edit + Hapus + {if: $value.printURL} + Cetak + {/if} +
                  +
                  + {$bebasnarkoba.pagination} + +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/kontrol.manage.html b/plugins/surat/view/admin/kontrol.manage.html new file mode 100644 index 000000000..379931056 --- /dev/null +++ b/plugins/surat/view/admin/kontrol.manage.html @@ -0,0 +1,84 @@ +
                  +
                  +
                  +
                  +
                  +
                  +

                  + {$kontrol.title} — {$kontrol.total} pasien terjadwal kontrol +

                  +
                  +
                  +
                  + +
                  + +
                  + +
                  +
                  +
                  + +
                  +
                  +
                  +
                  +

                  + Daftar pasien yang dijadwalkan kontrol (dari fitur Jadwal Kontrol) dan belum melakukan kunjungan ulang. +

                  +
                  + + + + + + + + + + + + + {loop: $kontrol.list} + + + + + + + + + {/loop} + {if: !$kontrol.list} + + + + {/if} + +
                  No. RMNama PasienTanggal KontrolPoli TujuanDokterAksi
                  {$value.no_rkm_medis}{$value.nm_pasien}{$value.tanggal_periksa}{$value.nm_poli}{$value.nm_dokter} + {if: $value.printURL} + Cetak + {else} + No. RM tidak ditemukan + {/if} +
                  Tidak ada pasien terjadwal kontrol
                  +
                  + {if: $kontrol.pagination} +
                  + {$kontrol.pagination} +
                  + {/if} +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/manage.html b/plugins/surat/view/admin/manage.html new file mode 100644 index 000000000..a2faeb1eb --- /dev/null +++ b/plugins/surat/view/admin/manage.html @@ -0,0 +1,21 @@ +
                  +
                  + +
                  +
                  diff --git a/plugins/surat/view/admin/resume.medis.cetak.html b/plugins/surat/view/admin/resume.medis.cetak.html new file mode 100644 index 000000000..a04b2a65d --- /dev/null +++ b/plugins/surat/view/admin/resume.medis.cetak.html @@ -0,0 +1,252 @@ + + + + + Resume Medis - {$pasien.nm_pasien} + + + + +
                  + + +
                  + + + + + + +
                  + + +
                  {$settings.nama_instansi}
                  +
                  + {$settings.alamat}, {$settings.kota}, {$settings.propinsi}
                  + Telp: {$settings.nomor_telepon}  |  Email: {$settings.email} +
                  +
                  + +
                  Resume Medis
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Identitas Pasien
                  No. Rekam Medis:{$pasien.no_rkm_medis}
                  No. Kunjungan:{$no_rawat}
                  Nama Pasien:{$pasien.nm_pasien}
                  Jenis Kelamin:{if: $pasien.jk == 'L'}Laki-laki{elseif: $pasien.jk == 'P'}Perempuan{else}-{/if}
                  Tanggal Lahir:{$pasien.tgl_lahir}
                  Penjamin:{$reg.png_jawab}
                  Alamat:{$pasien.alamat}
                  + + + + + + + + + + + + + + + + + + + +
                  Data Kunjungan
                  Tanggal Masuk:{$reg.tgl_registrasi} pukul {$reg.jam_reg}
                  Unit / Poli:{$reg.nm_poli}
                  Dokter DPJP:{$reg.nm_dokter}
                  + + + + + + + + + +
                  Anamnesis
                  Keluhan Utama:{?=nl2br(htmlspecialchars(isset_or($resume.keluhan_utama, isset_or($pemfis.keluhan, '-'))))?}
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Pemeriksaan Fisik
                  Tekanan Darah:{?=isset_or($pemfis.tensi, '-')?} mmHgGCS:{?=isset_or($pemfis.gcs, '-')?}
                  Nadi:{?=isset_or($pemfis.nadi, '-')?} x/mntBerat / Tinggi:{?=isset_or($pemfis.berat, '-')?} kg / {?=isset_or($pemfis.tinggi, '-')?} cm
                  Suhu:{?=isset_or($pemfis.suhu_tubuh, '-')?} °CKesadaran:{?=isset_or($pemfis.kesadaran, '-')?}
                  Respirasi (RR):{?=isset_or($pemfis.respirasi, '-')?} x/mntSpO₂:{?=isset_or($pemfis.spo2, '-')?}
                  + +{if: $lab_html} + + + + + + + + +
                  Hasil Pemeriksaan Penunjang
                  Laboratorium:{$lab_html}
                  +{/if} + + + + + + + + + + + + + + +
                  Diagnosa
                  Diagnosa Masuk:{?=isset_or($resume.keluhan_utama, '-')?}
                  Diagnosa Keluar (ICD-10):{$diagnosa_html}
                  + + + + + + + + + +
                  Tindakan Medis
                  Prosedur / Tindakan (ICD-9):{$prosedur_html}
                  + + + + + + + + + +
                  Terapi / Pengobatan
                  Obat yang Diberikan:{$obat_html}
                  + + + + + + + + + + + + + + +
                  Kondisi Saat Keluar
                  Status Keluar:{?=isset_or($resume.kondisi_pulang, '-')?}
                  Instruksi Lanjutan:{?=nl2br(htmlspecialchars(isset_or($resume.instruksi_lanjutan, '-')))?}
                  + +
                  + {$settings.kota}, {?=date('d F Y')?}
                  + Dokter Penanggung Jawab, +
                  + {$reg.nm_dokter} +
                  + +
                  + + + + + + + + diff --git a/plugins/surat/view/admin/resume.medis.form.html b/plugins/surat/view/admin/resume.medis.form.html new file mode 100644 index 000000000..5a1a4b965 --- /dev/null +++ b/plugins/surat/view/admin/resume.medis.form.html @@ -0,0 +1,91 @@ +
                  +
                  +
                  +
                  +
                  +
                  +

                  + {$resume_medis.title} — {$resume_medis.total} data +

                  +
                  +
                  +
                  + +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + {loop: $resume_medis.list} + + + + + + {/loop} + {if: !$resume_medis.list} + + + + {/if} + +
                  No. RMNama PasienAksi
                  {$value.no_rkm_medis}{$value.nm_pasien} + Print +
                  Tidak ada data
                  +
                  + {if: $resume_medis.pagination} +
                  + {$resume_medis.pagination} +
                  + {/if} +
                  +
                  +
                  +
                  +
                  + diff --git a/plugins/surat/view/admin/rujukan.form.html b/plugins/surat/view/admin/rujukan.form.html new file mode 100644 index 000000000..086ffff16 --- /dev/null +++ b/plugins/surat/view/admin/rujukan.form.html @@ -0,0 +1,99 @@ +
                  +
                  +
                  +
                  +

                  {if: $rujukan.form.id}Edit{else}Tambah{/if} Surat Rujukan

                  +
                  +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + Kembali +
                  +
                  +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/plugins/surat/view/admin/rujukan.manage.html b/plugins/surat/view/admin/rujukan.manage.html new file mode 100644 index 000000000..7bc6dba92 --- /dev/null +++ b/plugins/surat/view/admin/rujukan.manage.html @@ -0,0 +1,70 @@ +
                  +
                  +
                  +
                  +

                  Kelola Surat Rujukan

                  +
                  +
                  +
                  +
                  +

                  Jumlah: {?=count($rujukan.totalRecords)?}

                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + {loop: $rujukan.list} + + + + + + + + + + + {/loop} + +
                  No. SuratNo. RawatNo. RMNama PasienKepadaDiagnosaDokterAksi
                  {$value.nomor_surat}{$value.no_rawat}{$value.no_rkm_medis}{$value.nm_pasien}{$value.kepada}{$value.diagnosa}{$value.dokter} + Edit + Hapus + + Cetak + +
                  +
                  + {$rujukan.pagination} + +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/plugins/surat/view/admin/rujukan.permintaan.form.html b/plugins/surat/view/admin/rujukan.permintaan.form.html new file mode 100644 index 000000000..95a85d092 --- /dev/null +++ b/plugins/surat/view/admin/rujukan.permintaan.form.html @@ -0,0 +1,99 @@ +
                  +
                  +
                  +
                  +

                  {$permintaan.title}

                  +
                  +
                  +

                  {$permintaan.description}

                  +
                  +
                  + + +
                  +

                  Format yang didukung: YYYY/MM/DD/XXXXXX atau tanpa /.

                  + +
                  +
                  +
                  +
                  +
                  + +{if: $permintaan.showHistory} +
                  +
                  +
                  +
                  +
                  +
                  +

                  + Riwayat — {$permintaan.total} data +

                  +
                  +
                  +
                  + +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + {loop: $permintaan.list} + + + + + + + + + {/loop} + {if: !$permintaan.list} + + + + {/if} + +
                  No. SuratNo. RawatNama PasienNo. RMDokterAksi
                  {$value.nomor_surat}{$value.no_rawat}{$value.nm_pasien}{$value.no_rkm_medis}{$value.dokter} + {if: $value.printURL} + Cetak + {/if} + {if: $value.editURL} + Edit + {/if} + {if: $value.deleteURL} + Hapus + {/if} +
                  Tidak ada data
                  +
                  + {if: $permintaan.pagination} +
                  + {$permintaan.pagination} +
                  + {/if} +
                  +
                  +
                  +
                  +{/if} diff --git a/plugins/surat/view/admin/rujukan.permintaan.html b/plugins/surat/view/admin/rujukan.permintaan.html new file mode 100644 index 000000000..c71bcd3e7 --- /dev/null +++ b/plugins/surat/view/admin/rujukan.permintaan.html @@ -0,0 +1,204 @@ + + + + + + +
                  + + + + + + + + + + +
                  + + +

                  {$settings.nama_instansi}
                  + Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  + Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +
                  +
                  +
                  +
                  +

                  {$judul}

                  + Nomor:

                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Nama Pasien:{$pasien.nm_pasien}
                  Tanggal Lahir / Umur:{$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?}
                  Jenis Kelamin:{if: $pasien.jk == 'L'}Laki-Laki{else}Perempuan{/if}
                  Alamat:{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}
                  No. Rawat:{$no_rawat}
                  + + + + + + + + + + + + + + + + + + + + + + +
                  + Dengan hormat, mohon pemeriksaan {$jenis_label} untuk pasien tersebut di bawah ini. +
                  Indikasi / Keluhan: + +
                  Pemeriksaan Diminta: + +
                  Catatan: + +
                  + + + + + + +
                  + {$settings.kota}, {?=date('Y-m-d')?}
                  + Salam Sejawat
                  +
                  + {$nm_dokter} +
                  +
                  + +

                  + + diff --git a/plugins/surat/view/admin/sakit.form.html b/plugins/surat/view/admin/sakit.form.html new file mode 100644 index 000000000..cec15c304 --- /dev/null +++ b/plugins/surat/view/admin/sakit.form.html @@ -0,0 +1,129 @@ +
                  +
                  +
                  +
                  +

                  {if: $sakit.form.id}Edit{else}Tambah{/if} Surat Sakit

                  +
                  +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  + + +
                  + + +
                  +
                  + + +
                  + + +
                  + + +
                  +
                  + + +
                  + +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + Kembali +
                  +
                  +
                  +
                  +
                  +
                  + + \ No newline at end of file diff --git a/plugins/surat/view/admin/sakit.manage.html b/plugins/surat/view/admin/sakit.manage.html new file mode 100644 index 000000000..d5b07c9df --- /dev/null +++ b/plugins/surat/view/admin/sakit.manage.html @@ -0,0 +1,68 @@ +
                  +
                  +
                  +
                  +

                  Kelola Surat Sakit

                  +
                  +
                  +
                  +
                  +

                  Jumlah: {?=count($sakit.totalRecords)?}

                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + {loop: $sakit.list} + + + + + + + + + + + {/loop} + +
                  No. SuratNo. RawatNo. RMNama PasienDiagnosaLama SakitDokterAksi
                  {$value.nomor_surat}{$value.no_rawat}{$value.no_rkm_medis}{$value.nm_pasien}{$value.diagnosa}{$value.lama_angka} {$value.lama_huruf}{$value.dokter} + Edit + Hapus + {if: $value.printURL} + Cetak + {/if} +
                  +
                  + {$sakit.pagination} + +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/sehat.form.html b/plugins/surat/view/admin/sehat.form.html new file mode 100644 index 000000000..66c6201fd --- /dev/null +++ b/plugins/surat/view/admin/sehat.form.html @@ -0,0 +1,101 @@ +
                  +
                  +
                  +
                  +

                  {if: $sehat.form.id}Edit{else}Tambah{/if} Surat Sehat

                  +
                  +
                  +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  + + +
                  +
                  +
                  +
                  + + Kembali +
                  +
                  +
                  +
                  +
                  +
                  \ No newline at end of file diff --git a/plugins/surat/view/admin/sehat.manage.html b/plugins/surat/view/admin/sehat.manage.html new file mode 100644 index 000000000..fd6033725 --- /dev/null +++ b/plugins/surat/view/admin/sehat.manage.html @@ -0,0 +1,68 @@ +
                  +
                  +
                  +
                  +

                  Kelola Surat Sehat

                  +
                  +
                  +
                  +
                  +

                  Jumlah: {?=count($sehat.totalRecords)?}

                  +
                  +
                  +
                  +
                  + +
                  + +
                  +
                  +
                  +
                  +
                  +
                  + + + + + + + + + + + + + + + {loop: $sehat.list} + + + + + + + + + + + {/loop} + +
                  No. SuratNo. RawatNo. RMNama PasienTanggalKeperluanDokterAksi
                  {$value.nomor_surat}{$value.no_rawat}{$value.no_rkm_medis}{$value.nm_pasien}{$value.tanggal}{$value.keperluan}{$value.dokter} + Edit + Hapus + {if: $value.printURL} + Cetak + {/if} +
                  +
                  + {$sehat.pagination} + +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/setting.html b/plugins/surat/view/admin/setting.html new file mode 100644 index 000000000..6c2b61c61 --- /dev/null +++ b/plugins/surat/view/admin/setting.html @@ -0,0 +1,48 @@ +
                  +
                  +
                  +
                  +

                  Pengaturan Nomor Surat

                  +
                  +
                  +
                  +
                  + + + Kode klinik yang muncul di semua nomor surat, contoh: 001/PRANA/VII/2026. Berlaku sama untuk semua jenis surat. +
                  + +
                  + +

                  Nomor Urut per Jenis Surat

                  +

                  + Ini adalah nomor urut BERIKUTNYA yang akan dipakai untuk surat baru dari jenis tersebut. Tiap jenis surat punya urutannya sendiri-sendiri, + jadi membuat satu jenis surat tidak akan membuat nomor jenis surat lain meloncat. Nomor ini juga otomatis kembali ke 001 setiap awal bulan + (per jenis surat), mengikuti bulan/tahun yang tertulis di format nomor surat. +

                  + + + + + + + + + + {loop: $types} + + + + + {/loop} + +
                  Jenis SuratNomor Berikutnya
                  {$value.label} + +
                  + + +
                  +
                  +
                  +
                  +
                  diff --git a/plugins/surat/view/admin/surat.bebasnarkoba.html b/plugins/surat/view/admin/surat.bebasnarkoba.html new file mode 100644 index 000000000..e75611598 --- /dev/null +++ b/plugins/surat/view/admin/surat.bebasnarkoba.html @@ -0,0 +1,296 @@ + + + + + + +
                  +
                  + + + + + + + + + + +
                  + + +

                  {$settings.nama_instansi}
                  + Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  + Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  +
                  +
                  +
                  +
                  +

                  SURAT KETERANGAN BEBAS NARKOBA

                  + Nomor:

                  +
                  +

                  + + + + + + +
                  + Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, menerangkan bahwa;

                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Nama : {$pasien.nm_pasien}
                  No. Rekam Medis : {$pasien.no_rkm_medis}
                  Tanggal Lahir / Umur : {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?}
                  Jenis Kelamin : {if: $pasien.jk == 'L'}Laki-Laki{else}Perempuan{/if}
                  Alamat : {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}
                  +
                  + Berdasarkan hasil pemeriksaan narkoba yang dilakukan pada tanggal + , + pasien dinyatakan + . +
                  +
                  + Surat keterangan ini dipergunakan untuk + . +

                  Demikian surat keterangan ini dibuat dengan sebenarnya untuk dipergunakan sebagaimana mestinya.
                  +

                  + + + + + +
                  +

                  + {$settings.kota}, {?=date('Y-m-d')?}

                  +
                  +
                  +
                  +
                  +
                  +
                  {$nm_dokter}
                  +
                  +
                  + +

                  + diff --git a/plugins/surat/view/admin/surat.kematian.html b/plugins/surat/view/admin/surat.kematian.html new file mode 100644 index 000000000..48b60c67a --- /dev/null +++ b/plugins/surat/view/admin/surat.kematian.html @@ -0,0 +1,345 @@ + + +
                  + + + +
                  + +
                  + + + + + +
                  + + +

                  {$settings.nama_instansi}

                  +

                  + {$settings.alamat}, {$settings.kota}, {$settings.propinsi}
                  + Telp: {$settings.nomor_telepon} - Email: {$settings.email} +

                  +
                  + +
                  +

                  SURAT KETERANGAN KEMATIAN

                  +
                  + Nomor: + + {?=!empty($surat.nomor_surat) ? $surat.nomor_surat : $nomor_surat?} +
                  +
                  + +
                  +

                  + Yang bertanda tangan di bawah ini, Dokter pada {$settings.nama_instansi}, dengan ini menerangkan bahwa pasien yang tersebut di bawah ini: +

                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Nama Lengkap:{$pasien.nm_pasien}
                  NIK:{$pasien.no_ktp}
                  Umur:{$pasien.umur}
                  Jenis Kelamin:{if: $pasien.jk == 'L'}Laki-laki{elseif: $pasien.jk == 'P'}Perempuan{else}-{/if}
                  Alamat:{$pasien.alamat}
                  No. Rawat:{$no_rawat}
                  + +

                  Telah meninggal dunia pada:

                  + + + + + + + + + + + + + + + + + +
                  Tanggal: + + {?=isset_or($surat.tanggal_meninggal, date('d/m/Y'))?} +
                  Pukul: + + {?=isset_or($surat.jam_meninggal, date('H:i'))?} + WIB + WIB +
                  Sebab Kematian: + + {?=isset_or($surat.sebab_kematian)?} +
                  + +

                  + Keterangan: + + + + {?=isset_or($surat.keterangan)?} +

                  + +

                  + Demikian surat keterangan ini dibuat dengan sebenarnya untuk dipergunakan sebagaimana mestinya. +

                  +
                  + +
                  + {$settings.kota}, {?=date('d F Y')?}
                  + Dokter Pemeriksa, +
                  + {$nm_dokter} +
                  + +
                  +
                  + + + + + diff --git a/plugins/surat/view/admin/surat.kontrol.html b/plugins/surat/view/admin/surat.kontrol.html new file mode 100644 index 000000000..36bf427d8 --- /dev/null +++ b/plugins/surat/view/admin/surat.kontrol.html @@ -0,0 +1,313 @@ + + +
                  + + + +
                  + +
                  + + + + + +
                  + + +

                  {$settings.nama_instansi}

                  +

                  + {$settings.alamat}, {$settings.kota}, {$settings.propinsi}
                  + Telp: {$settings.nomor_telepon} - Email: {$settings.email} +

                  +
                  + +
                  +

                  SURAT KONTROL PASIEN

                  +
                  + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Nama Pasien:{$pasien.nm_pasien}
                  Umur:{$pasien.umur} Tahun
                  Jenis Kelamin:{if: $pasien.jk == 'L'}Laki-laki{elseif: $pasien.jk == 'P'}Perempuan{else}-{/if}
                  Alamat:{$pasien.alamat}
                  No. Rekam Medis:{$pasien.no_rkm_medis}
                  Dokter yang Memeriksa:{$nm_dokter}
                  + +

                  Kontrol lagi pada:

                  + + + + + + + + + + + + +
                  Tanggal Kontrol: + {?=!empty($surat.tanggal_kontrol) ? date('d/m/Y', strtotime($surat.tanggal_kontrol)) : date('d/m/Y', strtotime('+7 days'))?} + +
                  Poli Tujuan: + {$surat.poli_tujuan} + +
                  + + +

                  + Keterangan: + {$surat.keterangan} + +

                  + +

                  + Harap Kontrol Tepat Waktu, Terima kasih. +

                  +
                  + +
                  + {$settings.kota}, {?=date('d F Y')?}
                  + Dokter Pemeriksa, +
                  + {$nm_dokter} +
                  + +
                  +
                  + + + + + diff --git a/plugins/surat_rujukan/view/admin/surat.rujukan.html b/plugins/surat/view/admin/surat.rujukan.html similarity index 95% rename from plugins/surat_rujukan/view/admin/surat.rujukan.html rename to plugins/surat/view/admin/surat.rujukan.html index 416d1fae8..466a44419 100644 --- a/plugins/surat_rujukan/view/admin/surat.rujukan.html +++ b/plugins/surat/view/admin/surat.rujukan.html @@ -114,7 +114,7 @@

                  SURAT RUJUKAN

                  - Nomor:

                  + Nomor:

                  @@ -144,6 +144,11 @@

                  No. Rekam Medis +

                  + + @@ -225,7 +230,7 @@



                  diff --git a/plugins/surat/view/admin/surat.sakit.html b/plugins/surat/view/admin/surat.sakit.html new file mode 100644 index 000000000..9b3dda642 --- /dev/null +++ b/plugins/surat/view/admin/surat.sakit.html @@ -0,0 +1,341 @@ + + +
                  + + + +
                  + +
                  +

                  : {$pasien.no_rkm_medis}
                  Tanggal Lahir / Umur :
                  + + + + +
                  + + +

                  {$settings.nama_instansi}

                  +

                  + {$settings.alamat}, {$settings.kota}, {$settings.propinsi}
                  + Telp: {$settings.nomor_telepon} - Email: {$settings.email} +

                  +
                  + +
                  +

                  SURAT KETERANGAN SAKIT

                  +
                  + Nomor: + + {?=!empty($surat.nomor_surat) ? $surat.nomor_surat : $nomor_surat?} +
                  +
                  + +
                  +

                  Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, menerangkan bahwa:

                  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Nama:{$pasien.nm_pasien}
                  No. Rekam Medis:{$pasien.no_rkm_medis}
                  Tanggal Lahir / Umur:{$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?}
                  Jenis Kelamin:{if: $pasien.jk == 'L'}Laki-laki{elseif: $pasien.jk == 'P'}Perempuan{else}-{/if}
                  Alamat:{$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}
                  + +

                  + Berdasarkan hasil pemeriksaan klinis, yang bersangkutan dalam keadaan sakit dengan diagnosa penyakit + {?=isset_or($surat.diagnosa)?}, + dan perlu istirahat selama + {?=isset_or($surat.lama_angka)?} + hari, terhitung mulai tanggal + {?=isset_or($surat.tanggal_mulai, date('d/m/Y'))?} + sampai dengan tanggal + {?=isset_or($surat.tanggal_selesai, date('d/m/Y'))?}. +

                  + +

                  Demikianlah surat keterangan ini dibuat dengan sebenarnya untuk digunakan sebagaimana mestinya.

                  +
                  + +
                  + {$settings.kota}, {?=date('d F Y')?}
                  + Dokter Pemeriksa, +
                  + {$nm_dokter}
                  +
                  + +
                  +
                  + + + + + + diff --git a/plugins/surat_sehat/view/admin/surat.sehat.html b/plugins/surat/view/admin/surat.sehat.html similarity index 95% rename from plugins/surat_sehat/view/admin/surat.sehat.html rename to plugins/surat/view/admin/surat.sehat.html index 2577ee97a..a237d686e 100644 --- a/plugins/surat_sehat/view/admin/surat.sehat.html +++ b/plugins/surat/view/admin/surat.sehat.html @@ -111,7 +111,7 @@

                  SURAT KETERANGAN SEHAT

                  - Nomor:

                  + Nomor:



                  @@ -130,6 +130,11 @@

                  No. Rekam Medis +

                  + + @@ -202,7 +207,7 @@



                  diff --git a/plugins/surat/view/verifikasi.html b/plugins/surat/view/verifikasi.html new file mode 100644 index 000000000..12001e1e4 --- /dev/null +++ b/plugins/surat/view/verifikasi.html @@ -0,0 +1,219 @@ + + + + + + {$verification.title} + + + +
                  +
                  +
                  +
                  + {if: $verification.logo_url} + {$verification.nama_instansi} + {/if} +
                  +

                  {$verification.nama_instansi}

                  +

                  {$verification.alamat_instansi}

                  +

                  Telp: {$verification.nomor_telepon} | Email: {$verification.email}

                  +
                  +
                  + {$verification.status_label} +

                  {$verification.status_text}

                  +
                  + +
                  +
                  +
                  +

                  Jenis Surat

                  +

                  {$verification.jenis_surat}

                  +
                  + {if: $verification.show_nomor_surat} +
                  +

                  Nomor Surat

                  +

                  {$verification.nomor_surat}

                  +
                  + {/if} +
                  +

                  No. Rekam Medis

                  +

                  {$verification.no_rekam_medis}

                  +
                  +
                  +

                  Nama Pasien

                  +

                  {$verification.nama_pasien}

                  +
                  + {if: $verification.show_no_rawat} +
                  +

                  No. Rawat

                  +

                  {$verification.no_rawat}

                  +
                  + {/if} +
                  +

                  Dokter

                  +

                  {$verification.dokter}

                  +
                  +
                  +

                  SIP Dokter

                  +

                  {$verification.sip_dokter}

                  +
                  +
                  +

                  {$verification.keperluan_label}

                  +

                  {$verification.keperluan_value}

                  +
                  +
                  +

                  {$verification.tanggal_label}

                  +

                  {$verification.tanggal_value}

                  +
                  +
                  + + {if: $verification.keterangan_value} +
                  +
                  +

                  Keterangan

                  +

                  {$verification.keterangan_value}

                  +
                  +
                  + {/if} + +
                  + {$verification.ringkasan} +
                  + + +
                  +
                  +
                  + + diff --git a/plugins/surat_rujukan/Admin.php b/plugins/surat_rujukan/Admin.php deleted file mode 100644 index cb2a2a9eb..000000000 --- a/plugins/surat_rujukan/Admin.php +++ /dev/null @@ -1,280 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - return $this->draw('manage.html'); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_mlite_surat_rujukan= $_POST['search_field_mlite_surat_rujukan']; - $search_text_mlite_surat_rujukan = $_POST['search_text_mlite_surat_rujukan']; - - $searchQuery = " "; - if($search_text_mlite_surat_rujukan != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_rujukan." like '%".$search_text_mlite_surat_rujukan."%' ) "; - } - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_rujukan"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_rujukan WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from mlite_surat_rujukan WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'kepada'=>$row['kepada'], -'di'=>$row['di'], -'anamnesa'=>$row['anamnesa'], -'pemeriksaan_fisik'=>$row['pemeriksaan_fisik'], -'pemeriksaan_penunjang'=>$row['pemeriksaan_penunjang'], -'diagnosa'=>$row['diagnosa'], -'terapi'=>$row['terapi'], -'alasan_dirujuk'=>$row['alasan_dirujuk'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=='add') { - -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$kepada = $_POST['kepada']; -$di = $_POST['di']; -$anamnesa = $_POST['anamnesa']; -$pemeriksaan_fisik = $_POST['pemeriksaan_fisik']; -$pemeriksaan_penunjang = $_POST['pemeriksaan_penunjang']; -$diagnosa = $_POST['diagnosa']; -$terapi = $_POST['terapi']; -$alasan_dirujuk = $_POST['alasan_dirujuk']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - $mlite_surat_rujukan_add = $this->db()->pdo()->prepare('INSERT INTO mlite_surat_rujukan VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); - $mlite_surat_rujukan_add->execute([NULL, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $kepada, $di, $anamnesa, $pemeriksaan_fisik, $pemeriksaan_penunjang, $diagnosa, $terapi, $alasan_dirujuk, $dokter, $petugas]); - - } - if ($act=="edit") { - - $id = $_POST['id']; -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$kepada = $_POST['kepada']; -$di = $_POST['di']; -$anamnesa = $_POST['anamnesa']; -$pemeriksaan_fisik = $_POST['pemeriksaan_fisik']; -$pemeriksaan_penunjang = $_POST['pemeriksaan_penunjang']; -$diagnosa = $_POST['diagnosa']; -$terapi = $_POST['terapi']; -$alasan_dirujuk = $_POST['alasan_dirujuk']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - // BUANG FIELD PERTAMA - - $mlite_surat_rujukan_edit = $this->db()->pdo()->prepare("UPDATE mlite_surat_rujukan SET id=?, nomor_surat=?, no_rawat=?, no_rkm_medis=?, nm_pasien=?, tgl_lahir=?, umur=?, jk=?, alamat=?, kepada=?, di=?, anamnesa=?, pemeriksaan_fisik=?, pemeriksaan_penunjang=?, diagnosa=?, terapi=?, alasan_dirujuk=?, dokter=?, petugas=? WHERE id=?"); - $mlite_surat_rujukan_edit->execute([$id, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $kepada, $di, $anamnesa, $pemeriksaan_fisik, $pemeriksaan_penunjang, $diagnosa, $terapi, $alasan_dirujuk, $dokter, $petugas,$id]); - - } - - if ($act=="del") { - $id= $_POST['id']; - $check_db = $this->db()->pdo()->prepare("DELETE FROM mlite_surat_rujukan WHERE id='$id'"); - $result = $check_db->execute(); - $error = $check_db->errorInfo(); - if (!empty($result)){ - $data = array( - 'status' => 'success', - 'msg' => $no_rkm_medis - ); - } else { - $data = array( - 'status' => 'error', - 'msg' => $error['2'] - ); - } - echo json_encode($data); - } - - if ($act=="lihat") { - - $search_field_mlite_surat_rujukan= $_POST['search_field_mlite_surat_rujukan']; - $search_text_mlite_surat_rujukan = $_POST['search_text_mlite_surat_rujukan']; - - $searchQuery = " "; - if($search_text_mlite_surat_rujukan != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_rujukan." like '%".$search_text_mlite_surat_rujukan."%' ) "; - } - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from mlite_surat_rujukan WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'kepada'=>$row['kepada'], -'di'=>$row['di'], -'anamnesa'=>$row['anamnesa'], -'pemeriksaan_fisik'=>$row['pemeriksaan_fisik'], -'pemeriksaan_penunjang'=>$row['pemeriksaan_penunjang'], -'diagnosa'=>$row['diagnosa'], -'terapi'=>$row['terapi'], -'alasan_dirujuk'=>$row['alasan_dirujuk'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($id) - { - $detail = $this->db('mlite_surat_rujukan')->where('id', $id)->toArray(); - echo $this->draw('detail.html', ['detail' => $detail]); - exit(); - } - - public function getSuratRujukan($no_rawat) - { - $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); - $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); - $pasien = $this->db('pasien') - ->join('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') - ->join('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') - ->join('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') - ->join('propinsi', 'propinsi.kd_prop=pasien.kd_prop') - ->where('no_rkm_medis', $no_rkm_medis) - ->oneArray(); - $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); - $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); - $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); - $this->tpl->set('nm_dokter', $nm_dokter); - $this->tpl->set('sip_dokter', $sip_dokter); - $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); - $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); - $this->tpl->set('surat', $this->db('mlite_surat_rujukan')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - echo $this->tpl->draw(MODULES.'/surat_rujukan/view/admin/surat.rujukan.html', true); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/surat_rujukan/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/surat_rujukan/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - - $this->core->addCSS(url([ADMIN, 'surat_rujukan', 'css'])); - $this->core->addJS(url([ADMIN, 'surat_rujukan', 'javascript']), 'footer'); - } - -} diff --git a/plugins/surat_rujukan/Info.php b/plugins/surat_rujukan/Info.php deleted file mode 100644 index 3f7635374..000000000 --- a/plugins/surat_rujukan/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Surat Rujukan', - 'description' => 'Modul mlite surat rujukan untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/surat_rujukan/css/admin/styles.css b/plugins/surat_rujukan/css/admin/styles.css deleted file mode 100644 index fbae7a209..000000000 --- a/plugins/surat_rujukan/css/admin/styles.css +++ /dev/null @@ -1,21 +0,0 @@ -#tbl_mlite_surat_rujukan th, #tbl_mlite_surat_rujukan td, #forTable_mlite_surat_rujukan th, #forTable_mlite_surat_rujukan td { - white-space: nowrap; -} -.dataTables_wrapper th, .dataTables_wrapper td { - white-space: nowrap; -} -.pmd-datatable-pagination { - padding-top: 10px !important; -} -.dataTables_length { - display: inline; -} -.dataTables_paginate { - display: inline; - float: right; -} -@media (max-width:767px) { - .dataTables_length{ - display: none !important; - } -} \ No newline at end of file diff --git a/plugins/surat_rujukan/js/admin/scripts.js b/plugins/surat_rujukan/js/admin/scripts.js deleted file mode 100644 index cd3411cef..000000000 --- a/plugins/surat_rujukan/js/admin/scripts.js +++ /dev/null @@ -1,445 +0,0 @@ -jQuery().ready(function () { - var var_tbl_mlite_surat_rujukan = $('#tbl_mlite_surat_rujukan').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'surat_rujukan','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_mlite_surat_rujukan = $('#search_field_mlite_surat_rujukan').val(); - var search_text_mlite_surat_rujukan = $('#search_text_mlite_surat_rujukan').val(); - - data.search_field_mlite_surat_rujukan = search_field_mlite_surat_rujukan; - data.search_text_mlite_surat_rujukan = search_text_mlite_surat_rujukan; - - } - }, - "columns": [ -{ 'data': 'id' }, -{ 'data': 'nomor_surat' }, -{ 'data': 'no_rawat' }, -{ 'data': 'no_rkm_medis' }, -{ 'data': 'nm_pasien' }, -{ 'data': 'tgl_lahir' }, -{ 'data': 'umur' }, -{ 'data': 'jk' }, -{ 'data': 'alamat' }, -{ 'data': 'kepada' }, -{ 'data': 'di' }, -{ 'data': 'anamnesa' }, -{ 'data': 'pemeriksaan_fisik' }, -{ 'data': 'pemeriksaan_penunjang' }, -{ 'data': 'diagnosa' }, -{ 'data': 'terapi' }, -{ 'data': 'alasan_dirujuk' }, -{ 'data': 'dokter' }, -{ 'data': 'petugas' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2}, -{ 'targets': 3}, -{ 'targets': 4}, -{ 'targets': 5}, -{ 'targets': 6}, -{ 'targets': 7}, -{ 'targets': 8}, -{ 'targets': 9}, -{ 'targets': 10}, -{ 'targets': 11}, -{ 'targets': 12}, -{ 'targets': 13}, -{ 'targets': 14}, -{ 'targets': 15}, -{ 'targets': 16}, -{ 'targets': 17}, -{ 'targets': 18} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // FORM VALIDASI - // ============================================================== - - $("form[name='form_mlite_surat_rujukan']").validate({ - rules: { -nomor_surat: 'required', -no_rawat: 'required', -no_rkm_medis: 'required', -nm_pasien: 'required', -tgl_lahir: 'required', -umur: 'required', -jk: 'required', -alamat: 'required', -kepada: 'required', -di: 'required', -anamnesa: 'required', -pemeriksaan_fisik: 'required', -pemeriksaan_penunjang: 'required', -diagnosa: 'required', -terapi: 'required', -alasan_dirujuk: 'required', -dokter: 'required', -petugas: 'required' - - }, - messages: { -nomor_surat:'nomor_surat tidak boleh kosong!', -no_rawat:'no_rawat tidak boleh kosong!', -no_rkm_medis:'no_rkm_medis tidak boleh kosong!', -nm_pasien:'nm_pasien tidak boleh kosong!', -tgl_lahir:'tgl_lahir tidak boleh kosong!', -umur:'umur tidak boleh kosong!', -jk:'jk tidak boleh kosong!', -alamat:'alamat tidak boleh kosong!', -kepada:'kepada tidak boleh kosong!', -di:'di tidak boleh kosong!', -anamnesa:'anamnesa tidak boleh kosong!', -pemeriksaan_fisik:'pemeriksaan_fisik tidak boleh kosong!', -pemeriksaan_penunjang:'pemeriksaan_penunjang tidak boleh kosong!', -diagnosa:'diagnosa tidak boleh kosong!', -terapi:'terapi tidak boleh kosong!', -alasan_dirujuk:'alasan_dirujuk tidak boleh kosong!', -dokter:'dokter tidak boleh kosong!', -petugas:'petugas tidak boleh kosong!' - - }, - submitHandler: function (form) { - var id= $('#id').val(); -var nomor_surat= $('#nomor_surat').val(); -var no_rawat= $('#no_rawat').val(); -var no_rkm_medis= $('#no_rkm_medis').val(); -var nm_pasien= $('#nm_pasien').val(); -var tgl_lahir= $('#tgl_lahir').val(); -var umur= $('#umur').val(); -var jk= $('#jk').val(); -var alamat= $('#alamat').val(); -var kepada= $('#kepada').val(); -var di= $('#di').val(); -var anamnesa= $('#anamnesa').val(); -var pemeriksaan_fisik= $('#pemeriksaan_fisik').val(); -var pemeriksaan_penunjang= $('#pemeriksaan_penunjang').val(); -var diagnosa= $('#diagnosa').val(); -var terapi= $('#terapi').val(); -var alasan_dirujuk= $('#alasan_dirujuk').val(); -var dokter= $('#dokter').val(); -var petugas= $('#petugas').val(); - - var typeact = $('#typeact').val(); - - var formData = new FormData(form); // tambahan - formData.append('typeact', typeact); // tambahan - - $.ajax({ - url: "{?=url([ADMIN,'surat_rujukan','aksi'])?}", - method: "POST", - contentType: false, // tambahan - processData: false, // tambahan - data: formData, - success: function (data) { - if (typeact == "add") { - alert("Data Berhasil Ditambah"); - } - else if (typeact == "edit") { - alert("Data Berhasil Diubah"); - } - $("#modal_cs").hide(); - location.reload(true); - } - }) - } - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - $('#search_text_mlite_surat_rujukan').keyup(function () { - var_tbl_mlite_surat_rujukan.draw(); - }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_mlite_surat_rujukan").click(function () { - $("#search_text_mlite_surat_rujukan").val(""); - var_tbl_mlite_surat_rujukan.draw(); - }); - - // =========================================== - // Ketika tombol Edit di tekan - // =========================================== - - $("#edit_data_mlite_surat_rujukan").click(function () { - var rowData = var_tbl_mlite_surat_rujukan.rows({ selected: true }).data()[0]; - if (rowData != null) { - - var id = rowData['id']; -var nomor_surat = rowData['nomor_surat']; -var no_rawat = rowData['no_rawat']; -var no_rkm_medis = rowData['no_rkm_medis']; -var nm_pasien = rowData['nm_pasien']; -var tgl_lahir = rowData['tgl_lahir']; -var umur = rowData['umur']; -var jk = rowData['jk']; -var alamat = rowData['alamat']; -var kepada = rowData['kepada']; -var di = rowData['di']; -var anamnesa = rowData['anamnesa']; -var pemeriksaan_fisik = rowData['pemeriksaan_fisik']; -var pemeriksaan_penunjang = rowData['pemeriksaan_penunjang']; -var diagnosa = rowData['diagnosa']; -var terapi = rowData['terapi']; -var alasan_dirujuk = rowData['alasan_dirujuk']; -var dokter = rowData['dokter']; -var petugas = rowData['petugas']; - - - - $("#typeact").val("edit"); - - $('#id').val(id); -$('#nomor_surat').val(nomor_surat); -$('#no_rawat').val(no_rawat); -$('#no_rkm_medis').val(no_rkm_medis); -$('#nm_pasien').val(nm_pasien); -$('#tgl_lahir').val(tgl_lahir); -$('#umur').val(umur); -$('#jk').val(jk); -$('#alamat').val(alamat); -$('#kepada').val(kepada); -$('#di').val(di); -$('#anamnesa').val(anamnesa); -$('#pemeriksaan_fisik').val(pemeriksaan_fisik); -$('#pemeriksaan_penunjang').val(pemeriksaan_penunjang); -$('#diagnosa').val(diagnosa); -$('#terapi').val(terapi); -$('#alasan_dirujuk').val(alasan_dirujuk); -$('#dokter').val(dokter); -$('#petugas').val(petugas); - - $("#id").prop('readonly', true); // GA BISA DIEDIT KALI DISABLE - $('#modal-title').text("Edit Data Surat Rujukan"); - $("#modal_mlite_surat_rujukan").modal(); - } - else { - alert("Silakan pilih data yang akan di edit."); - } - - }); - - // ============================================================== - // TOMBOL DELETE DI CLICK - // ============================================================== - jQuery("#hapus_data_mlite_surat_rujukan").click(function () { - var rowData = var_tbl_mlite_surat_rujukan.rows({ selected: true }).data()[0]; - - - if (rowData) { -var id = rowData['id']; - var a = confirm("Anda yakin akan menghapus data dengan id=" + id); - if (a) { - - $.ajax({ - url: "{?=url([ADMIN,'surat_rujukan','aksi'])?}", - method: "POST", - data: { - id: id, - typeact: 'del' - }, - success: function (data) { - data = JSON.parse(data); - if(data.status === 'success') { - alert(data.msg); - } else { - alert(data.msg); - } - location.reload(true); - } - }) - } - } - else { - alert("Pilih satu baris untuk dihapus"); - } - }); - - // ============================================================== - // TOMBOL TAMBAH DATA DI CLICK - // ============================================================== - jQuery("#tambah_data_mlite_surat_rujukan").click(function () { - - $('#id').val(''); -$('#nomor_surat').val(''); -$('#no_rawat').val(''); -$('#no_rkm_medis').val(''); -$('#nm_pasien').val(''); -$('#tgl_lahir').val(''); -$('#umur').val(''); -$('#jk').val(''); -$('#alamat').val(''); -$('#kepada').val(''); -$('#di').val(''); -$('#anamnesa').val(''); -$('#pemeriksaan_fisik').val(''); -$('#pemeriksaan_penunjang').val(''); -$('#diagnosa').val(''); -$('#terapi').val(''); -$('#alasan_dirujuk').val(''); -$('#dokter').val(''); -$('#petugas').val(''); - - - $("#typeact").val("add"); - $("#id").prop('disabled', false); - - $('#modal-title').text("Tambah Data Surat Rujukan"); - $("#modal_mlite_surat_rujukan").modal(); - }); - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_mlite_surat_rujukan").click(function () { - - var search_field_mlite_surat_rujukan = $('#search_field_mlite_surat_rujukan').val(); - var search_text_mlite_surat_rujukan = $('#search_text_mlite_surat_rujukan').val(); - - $.ajax({ - url: "{?=url([ADMIN,'surat_rujukan','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_mlite_surat_rujukan: search_field_mlite_surat_rujukan, - search_text_mlite_surat_rujukan: search_text_mlite_surat_rujukan - }, - dataType: 'json', - success: function (res) { - var eTable = "

                  : {$pasien.no_rkm_medis}
                  Tanggal Lahir / Umur :
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; - eTable += ""; - } - eTable += "
                  Nomor SuratNo RawatNm PasienTgl LahirUmurJkAlasan DirujukDokter
                  ' + res[i]['nomor_surat'] + '' + res[i]['no_rawat'] + '' + res[i]['nm_pasien'] + '' + res[i]['tgl_lahir'] + '' + res[i]['umur'] + '' + res[i]['jk'] + '' + res[i]['alasan_dirujuk'] + '' + res[i]['dokter'] + '
                  "; - $('#forTable_mlite_surat_rujukan').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_mlite_surat_rujukan").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL mlite_surat_rujukan DI CLICK - // ============================================================== - jQuery("#lihat_detail_mlite_surat_rujukan").click(function (event) { - - var rowData = var_tbl_mlite_surat_rujukan.rows({ selected: true }).data()[0]; - - if (rowData) { - var id = rowData['id']; - var no_rawat = rowData['no_rawat']; - var no_rawat = no_rawat.replace(/\//g,''); - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/surat_rujukan/suratrujukan/' + no_rawat + '?t=' + mlite.token; - window.open(loadURL); - // var modal = $('#modal_detail_mlite_surat_rujukan'); - // var modalContent = $('#modal_detail_mlite_surat_rujukan .modal-content'); - - // modal.off('show.bs.modal'); - // modal.on('show.bs.modal', function () { - // modalContent.load(loadURL); - // }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('l', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,820,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,820,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Mlite Surat Rujukan", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_mlite_surat_rujukan', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_mlite_surat_rujukan.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_mlite_surat_rujukan"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data mlite_surat_rujukan"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/surat_rujukan/view/admin/detail.html b/plugins/surat_rujukan/view/admin/detail.html deleted file mode 100644 index 494e8687a..000000000 --- a/plugins/surat_rujukan/view/admin/detail.html +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/plugins/surat_rujukan/view/admin/manage.html b/plugins/surat_rujukan/view/admin/manage.html deleted file mode 100644 index 417bbf368..000000000 --- a/plugins/surat_rujukan/view/admin/manage.html +++ /dev/null @@ -1,283 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - - - -
                  -
                  -
                  -
                  - Cari : - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  IdNomor SuratNo RawatNo Rkm MedisNm PasienTgl LahirUmurJkAlamatKepadaDiAnamnesaPemeriksaan FisikPemeriksaan PenunjangDiagnosaTerapiAlasan DirujukDokterPetugas
                  -
                  -
                  -
                  -
                  -
                  - - - - - - - diff --git a/plugins/surat_sakit/Admin.php b/plugins/surat_sakit/Admin.php deleted file mode 100644 index 488119058..000000000 --- a/plugins/surat_sakit/Admin.php +++ /dev/null @@ -1,273 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - return $this->draw('manage.html'); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_mlite_surat_sakit= $_POST['search_field_mlite_surat_sakit']; - $search_text_mlite_surat_sakit = $_POST['search_text_mlite_surat_sakit']; - - $searchQuery = " "; - if($search_text_mlite_surat_sakit != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_sakit." like '%".$search_text_mlite_surat_sakit."%' ) "; - } - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_sakit"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_sakit WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from mlite_surat_sakit WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'keadaan'=>$row['keadaan'], -'diagnosa'=>$row['diagnosa'], -'lama_angka'=>$row['lama_angka'], -'lama_huruf'=>$row['lama_huruf'], -'tanggal_mulai'=>$row['tanggal_mulai'], -'tanggal_selesai'=>$row['tanggal_selesai'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=='add') { - - $id = $_POST['id']; -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$keadaan = $_POST['keadaan']; -$diagnosa = $_POST['diagnosa']; -$lama_angka = $_POST['lama_angka']; -$lama_huruf = $_POST['lama_huruf']; -$tanggal_mulai = $_POST['tanggal_mulai']; -$tanggal_selesai = $_POST['tanggal_selesai']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - $mlite_surat_sakit_add = $this->db()->pdo()->prepare('INSERT INTO mlite_surat_sakit VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); - $mlite_surat_sakit_add->execute([$id, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $keadaan, $diagnosa, $lama_angka, $lama_huruf, $tanggal_mulai, $tanggal_selesai, $dokter, $petugas]); - - } - if ($act=="edit") { - - $id = $_POST['id']; -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$keadaan = $_POST['keadaan']; -$diagnosa = $_POST['diagnosa']; -$lama_angka = $_POST['lama_angka']; -$lama_huruf = $_POST['lama_huruf']; -$tanggal_mulai = $_POST['tanggal_mulai']; -$tanggal_selesai = $_POST['tanggal_selesai']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - // BUANG FIELD PERTAMA - - $mlite_surat_sakit_edit = $this->db()->pdo()->prepare("UPDATE mlite_surat_sakit SET id=?, nomor_surat=?, no_rawat=?, no_rkm_medis=?, nm_pasien=?, tgl_lahir=?, umur=?, jk=?, alamat=?, keadaan=?, diagnosa=?, lama_angka=?, lama_huruf=?, tanggal_mulai=?, tanggal_selesai=?, dokter=?, petugas=? WHERE id=?"); - $mlite_surat_sakit_edit->execute([$id, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $keadaan, $diagnosa, $lama_angka, $lama_huruf, $tanggal_mulai, $tanggal_selesai, $dokter, $petugas,$id]); - - } - - if ($act=="del") { - $id= $_POST['id']; - $check_db = $this->db()->pdo()->prepare("DELETE FROM mlite_surat_sakit WHERE id='$id'"); - $result = $check_db->execute(); - $error = $check_db->errorInfo(); - if (!empty($result)){ - $data = array( - 'status' => 'success', - 'msg' => $no_rkm_medis - ); - } else { - $data = array( - 'status' => 'error', - 'msg' => $error['2'] - ); - } - echo json_encode($data); - } - - if ($act=="lihat") { - - $search_field_mlite_surat_sakit= $_POST['search_field_mlite_surat_sakit']; - $search_text_mlite_surat_sakit = $_POST['search_text_mlite_surat_sakit']; - - $searchQuery = " "; - if($search_text_mlite_surat_sakit != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_sakit." like '%".$search_text_mlite_surat_sakit."%' ) "; - } - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from mlite_surat_sakit WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'keadaan'=>$row['keadaan'], -'diagnosa'=>$row['diagnosa'], -'lama_angka'=>$row['lama_angka'], -'lama_huruf'=>$row['lama_huruf'], -'tanggal_mulai'=>$row['tanggal_mulai'], -'tanggal_selesai'=>$row['tanggal_selesai'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($id) - { - $detail = $this->db('mlite_surat_sakit')->where('id', $id)->toArray(); - echo $this->draw('detail.html', ['detail' => $detail]); - exit(); - } - - public function getSuratSakit($no_rawat) - { - $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); - $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); - $pasien = $this->db('pasien') - ->join('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') - ->join('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') - ->join('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') - ->join('propinsi', 'propinsi.kd_prop=pasien.kd_prop') - ->where('no_rkm_medis', $no_rkm_medis) - ->oneArray(); - $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); - $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); - $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); - $this->tpl->set('nm_dokter', $nm_dokter); - $this->tpl->set('sip_dokter', $sip_dokter); - $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); - $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); - $this->tpl->set('surat', $this->db('mlite_surat_sakit')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - echo $this->tpl->draw(MODULES.'/surat_sakit/view/admin/surat.sakit.html', true); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/surat_sakit/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/surat_sakit/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - - $this->core->addCSS(url([ADMIN, 'surat_sakit', 'css'])); - $this->core->addJS(url([ADMIN, 'surat_sakit', 'javascript']), 'footer'); - } - -} diff --git a/plugins/surat_sakit/Info.php b/plugins/surat_sakit/Info.php deleted file mode 100644 index 2e93e33bf..000000000 --- a/plugins/surat_sakit/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Surat Sakit', - 'description' => 'Modul mlite surat sakit untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/surat_sakit/css/admin/styles.css b/plugins/surat_sakit/css/admin/styles.css deleted file mode 100644 index 07bf133b9..000000000 --- a/plugins/surat_sakit/css/admin/styles.css +++ /dev/null @@ -1,21 +0,0 @@ -#tbl_mlite_surat_sakit th, #tbl_mlite_surat_sakit td, #forTable_mlite_surat_sakit th, #forTable_mlite_surat_sakit td { - white-space: nowrap; -} -.dataTables_wrapper th, .dataTables_wrapper td { - white-space: nowrap; -} -.pmd-datatable-pagination { - padding-top: 10px !important; -} -.dataTables_length { - display: inline; -} -.dataTables_paginate { - display: inline; - float: right; -} -@media (max-width:767px) { - .dataTables_length{ - display: none !important; - } -} \ No newline at end of file diff --git a/plugins/surat_sakit/js/admin/scripts.js b/plugins/surat_sakit/js/admin/scripts.js deleted file mode 100644 index 2ae6c6c4b..000000000 --- a/plugins/surat_sakit/js/admin/scripts.js +++ /dev/null @@ -1,434 +0,0 @@ -jQuery().ready(function () { - var var_tbl_mlite_surat_sakit = $('#tbl_mlite_surat_sakit').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'surat_sakit','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_mlite_surat_sakit = $('#search_field_mlite_surat_sakit').val(); - var search_text_mlite_surat_sakit = $('#search_text_mlite_surat_sakit').val(); - - data.search_field_mlite_surat_sakit = search_field_mlite_surat_sakit; - data.search_text_mlite_surat_sakit = search_text_mlite_surat_sakit; - - } - }, - "columns": [ -{ 'data': 'id' }, -{ 'data': 'nomor_surat' }, -{ 'data': 'no_rawat' }, -{ 'data': 'no_rkm_medis' }, -{ 'data': 'nm_pasien' }, -{ 'data': 'tgl_lahir' }, -{ 'data': 'umur' }, -{ 'data': 'jk' }, -{ 'data': 'alamat' }, -{ 'data': 'keadaan' }, -{ 'data': 'diagnosa' }, -{ 'data': 'lama_angka' }, -{ 'data': 'lama_huruf' }, -{ 'data': 'tanggal_mulai' }, -{ 'data': 'tanggal_selesai' }, -{ 'data': 'dokter' }, -{ 'data': 'petugas' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2}, -{ 'targets': 3}, -{ 'targets': 4}, -{ 'targets': 5}, -{ 'targets': 6}, -{ 'targets': 7}, -{ 'targets': 8}, -{ 'targets': 9}, -{ 'targets': 10}, -{ 'targets': 11}, -{ 'targets': 12}, -{ 'targets': 13}, -{ 'targets': 14}, -{ 'targets': 15}, -{ 'targets': 16} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // FORM VALIDASI - // ============================================================== - - $("form[name='form_mlite_surat_sakit']").validate({ - rules: { -id: 'required', -nomor_surat: 'required', -no_rawat: 'required', -no_rkm_medis: 'required', -nm_pasien: 'required', -tgl_lahir: 'required', -umur: 'required', -jk: 'required', -alamat: 'required', -keadaan: 'required', -diagnosa: 'required', -lama_angka: 'required', -lama_huruf: 'required', -tanggal_mulai: 'required', -tanggal_selesai: 'required', -dokter: 'required', -petugas: 'required' - - }, - messages: { -id:'id tidak boleh kosong!', -nomor_surat:'nomor_surat tidak boleh kosong!', -no_rawat:'no_rawat tidak boleh kosong!', -no_rkm_medis:'no_rkm_medis tidak boleh kosong!', -nm_pasien:'nm_pasien tidak boleh kosong!', -tgl_lahir:'tgl_lahir tidak boleh kosong!', -umur:'umur tidak boleh kosong!', -jk:'jk tidak boleh kosong!', -alamat:'alamat tidak boleh kosong!', -keadaan:'keadaan tidak boleh kosong!', -diagnosa:'diagnosa tidak boleh kosong!', -lama_angka:'lama_angka tidak boleh kosong!', -lama_huruf:'lama_huruf tidak boleh kosong!', -tanggal_mulai:'tanggal_mulai tidak boleh kosong!', -tanggal_selesai:'tanggal_selesai tidak boleh kosong!', -dokter:'dokter tidak boleh kosong!', -petugas:'petugas tidak boleh kosong!' - - }, - submitHandler: function (form) { - var id= $('#id').val(); -var nomor_surat= $('#nomor_surat').val(); -var no_rawat= $('#no_rawat').val(); -var no_rkm_medis= $('#no_rkm_medis').val(); -var nm_pasien= $('#nm_pasien').val(); -var tgl_lahir= $('#tgl_lahir').val(); -var umur= $('#umur').val(); -var jk= $('#jk').val(); -var alamat= $('#alamat').val(); -var keadaan= $('#keadaan').val(); -var diagnosa= $('#diagnosa').val(); -var lama_angka= $('#lama_angka').val(); -var lama_huruf= $('#lama_huruf').val(); -var tanggal_mulai= $('#tanggal_mulai').val(); -var tanggal_selesai= $('#tanggal_selesai').val(); -var dokter= $('#dokter').val(); -var petugas= $('#petugas').val(); - - var typeact = $('#typeact').val(); - - var formData = new FormData(form); // tambahan - formData.append('typeact', typeact); // tambahan - - $.ajax({ - url: "{?=url([ADMIN,'surat_sakit','aksi'])?}", - method: "POST", - contentType: false, // tambahan - processData: false, // tambahan - data: formData, - success: function (data) { - if (typeact == "add") { - alert("Data Berhasil Ditambah"); - } - else if (typeact == "edit") { - alert("Data Berhasil Diubah"); - } - $("#modal_cs").hide(); - location.reload(true); - } - }) - } - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - $('#search_text_mlite_surat_sakit').keyup(function () { - var_tbl_mlite_surat_sakit.draw(); - }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_mlite_surat_sakit").click(function () { - $("#search_text_mlite_surat_sakit").val(""); - var_tbl_mlite_surat_sakit.draw(); - }); - - // =========================================== - // Ketika tombol Edit di tekan - // =========================================== - - $("#edit_data_mlite_surat_sakit").click(function () { - var rowData = var_tbl_mlite_surat_sakit.rows({ selected: true }).data()[0]; - if (rowData != null) { - - var id = rowData['id']; -var nomor_surat = rowData['nomor_surat']; -var no_rawat = rowData['no_rawat']; -var no_rkm_medis = rowData['no_rkm_medis']; -var nm_pasien = rowData['nm_pasien']; -var tgl_lahir = rowData['tgl_lahir']; -var umur = rowData['umur']; -var jk = rowData['jk']; -var alamat = rowData['alamat']; -var keadaan = rowData['keadaan']; -var diagnosa = rowData['diagnosa']; -var lama_angka = rowData['lama_angka']; -var lama_huruf = rowData['lama_huruf']; -var tanggal_mulai = rowData['tanggal_mulai']; -var tanggal_selesai = rowData['tanggal_selesai']; -var dokter = rowData['dokter']; -var petugas = rowData['petugas']; - - - - $("#typeact").val("edit"); - - $('#id').val(id); -$('#nomor_surat').val(nomor_surat); -$('#no_rawat').val(no_rawat); -$('#no_rkm_medis').val(no_rkm_medis); -$('#nm_pasien').val(nm_pasien); -$('#tgl_lahir').val(tgl_lahir); -$('#umur').val(umur); -$('#jk').val(jk); -$('#alamat').val(alamat); -$('#keadaan').val(keadaan); -$('#diagnosa').val(diagnosa); -$('#lama_angka').val(lama_angka); -$('#lama_huruf').val(lama_huruf); -$('#tanggal_mulai').val(tanggal_mulai); -$('#tanggal_selesai').val(tanggal_selesai); -$('#dokter').val(dokter); -$('#petugas').val(petugas); - - //$("#id").prop('disabled', true); // GA BISA DIEDIT KALI DISABLE - $('#modal-title').text("Edit Data Surat Sakit"); - $("#modal_mlite_surat_sakit").modal(); - } - else { - alert("Silakan pilih data yang akan di edit."); - } - - }); - - // ============================================================== - // TOMBOL DELETE DI CLICK - // ============================================================== - jQuery("#hapus_data_mlite_surat_sakit").click(function () { - var rowData = var_tbl_mlite_surat_sakit.rows({ selected: true }).data()[0]; - - - if (rowData) { -var id = rowData['id']; - var a = confirm("Anda yakin akan menghapus data dengan id=" + id); - if (a) { - - $.ajax({ - url: "{?=url([ADMIN,'surat_sakit','aksi'])?}", - method: "POST", - data: { - id: id, - typeact: 'del' - }, - success: function (data) { - data = JSON.parse(data); - if(data.status === 'success') { - alert(data.msg); - } else { - alert(data.msg); - } - location.reload(true); - } - }) - } - } - else { - alert("Pilih satu baris untuk dihapus"); - } - }); - - // ============================================================== - // TOMBOL TAMBAH DATA DI CLICK - // ============================================================== - jQuery("#tambah_data_mlite_surat_sakit").click(function () { - - $('#id').val(''); -$('#nomor_surat').val(''); -$('#no_rawat').val(''); -$('#no_rkm_medis').val(''); -$('#nm_pasien').val(''); -$('#tgl_lahir').val(''); -$('#umur').val(''); -$('#jk').val(''); -$('#alamat').val(''); -$('#keadaan').val(''); -$('#diagnosa').val(''); -$('#lama_angka').val(''); -$('#lama_huruf').val(''); -$('#tanggal_mulai').val(''); -$('#tanggal_selesai').val(''); -$('#dokter').val(''); -$('#petugas').val(''); - - - $("#typeact").val("add"); - $("#id").prop('disabled', false); - - $('#modal-title').text("Tambah Data Surat Sakit"); - $("#modal_mlite_surat_sakit").modal(); - }); - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_mlite_surat_sakit").click(function () { - - var search_field_mlite_surat_sakit = $('#search_field_mlite_surat_sakit').val(); - var search_text_mlite_surat_sakit = $('#search_text_mlite_surat_sakit').val(); - - $.ajax({ - url: "{?=url([ADMIN,'surat_sakit','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_mlite_surat_sakit: search_field_mlite_surat_sakit, - search_text_mlite_surat_sakit: search_text_mlite_surat_sakit - }, - dataType: 'json', - success: function (res) { - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; - eTable += ""; - } - eTable += "
                  Nomor SuratNo RawatNm PasienTgl LahirUmurJkLamaTanggal MulaiTanggal SelesaiDokter
                  ' + res[i]['nomor_surat'] + '' + res[i]['no_rawat'] + '' + res[i]['nm_pasien'] + '' + res[i]['tgl_lahir'] + '' + res[i]['umur'] + '' + res[i]['jk'] + '' + res[i]['lama_angka'] + '' + res[i]['tanggal_mulai'] + '' + res[i]['tanggal_selesai'] + '' + res[i]['dokter'] + '
                  "; - $('#forTable_mlite_surat_sakit').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_mlite_surat_sakit").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL mlite_surat_sakit DI CLICK - // ============================================================== - jQuery("#lihat_detail_mlite_surat_sakit").click(function (event) { - - var rowData = var_tbl_mlite_surat_sakit.rows({ selected: true }).data()[0]; - - if (rowData) { - var id = rowData['id']; - var no_rawat = rowData['no_rawat']; - var no_rawat = no_rawat.replace(/\//g,''); - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/surat_sakit/suratsakit/' + no_rawat + '?t=' + mlite.token; - window.open(loadURL); - - // var modal = $('#modal_detail_mlite_surat_sakit'); - // var modalContent = $('#modal_detail_mlite_surat_sakit .modal-content'); - - // modal.off('show.bs.modal'); - // modal.on('show.bs.modal', function () { - // modalContent.load(loadURL); - // }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('l', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,820,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,820,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Mlite Surat Sakit", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_mlite_surat_sakit', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_mlite_surat_sakit.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_mlite_surat_sakit"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data mlite_surat_sakit"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/surat_sakit/view/admin/detail.html b/plugins/surat_sakit/view/admin/detail.html deleted file mode 100644 index 083f2fd2d..000000000 --- a/plugins/surat_sakit/view/admin/detail.html +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/plugins/surat_sakit/view/admin/manage.html b/plugins/surat_sakit/view/admin/manage.html deleted file mode 100644 index 1159d413e..000000000 --- a/plugins/surat_sakit/view/admin/manage.html +++ /dev/null @@ -1,264 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - - - -
                  -
                  -
                  -
                  - Cari : - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - -
                  IdNomor SuratNo RawatNo Rkm MedisNm PasienTgl LahirUmurJkAlamatKeadaanDiagnosaLama AngkaLama HurufTanggal MulaiTanggal SelesaiDokterPetugas
                  -
                  -
                  -
                  -
                  -
                  - - - - - - - diff --git a/plugins/surat_sakit/view/admin/surat.sakit.html b/plugins/surat_sakit/view/admin/surat.sakit.html deleted file mode 100644 index 1edcb6afe..000000000 --- a/plugins/surat_sakit/view/admin/surat.sakit.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - -
                  - - - - - - - - - - -
                  - - -

                  {$settings.nama_instansi}
                  - Alamat: {$settings.alamat} - {$settings.kota} - {$settings.propinsi}
                  - Telepon: {$settings.nomor_telepon} - Email: {$settings.email}

                  -
                  -
                  -
                  -
                  -

                  SURAT KETERANGAN SAKIT

                  - Nomor:

                  -
                  -

                  - - - - - - -
                  - Yang bertanda tangan di bawah ini Dokter {$settings.nama_instansi}, Menerangkan bahwa;

                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  Nama : {$pasien.nm_pasien}
                  Tanggal Lahir / Umur : {$pasien.tgl_lahir} / {?=hitungUmur($pasien.tgl_lahir)?}
                  Jenis Kelamin : {if: $pasien.jk == 'L'}Laki-Laki{/if}{if: $pasien.jk == 'P'}Perempuan{/if}
                  Alamat : {$pasien.alamat}, {$pasien.nm_kel}, {$pasien.nm_kec}, {$pasien.nm_kab}, {$pasien.nm_prop}
                  -
                  - Berdasarkan hasil pemeriksaan klinis, yang bersangkutan dalam keadaan - - dengan diagnosa penyakit , dan perlu istirahat selama ( ) hari, terhitung mulai tanggal sampai dengan tanggal . -

                  Demikianlah surat keterangan ini dibuat dengan sebenarnya untuk digunakan sebagaimana mestinya.
                  -

                  - - - - - -
                  -

                  - {$settings.kota}, {?=date('Y-m-d')?}

                  -

                  - {$nm_dokter} -
                  -
                  - -

                  - diff --git a/plugins/surat_sehat/Admin.php b/plugins/surat_sehat/Admin.php deleted file mode 100644 index ccf2d3551..000000000 --- a/plugins/surat_sehat/Admin.php +++ /dev/null @@ -1,277 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - return $this->draw('manage.html'); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_mlite_surat_sehat= $_POST['search_field_mlite_surat_sehat']; - $search_text_mlite_surat_sehat = $_POST['search_text_mlite_surat_sehat']; - - $searchQuery = " "; - if($search_text_mlite_surat_sehat != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_sehat." like '%".$search_text_mlite_surat_sehat."%' ) "; - } - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_sehat"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_surat_sehat WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from mlite_surat_sehat WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'tanggal'=>$row['tanggal'], -'berat_badan'=>$row['berat_badan'], -'tinggi_badan'=>$row['tinggi_badan'], -'tensi'=>$row['tensi'], -'gol_darah'=>$row['gol_darah'], -'riwayat_penyakit'=>$row['riwayat_penyakit'], -'keperluan'=>$row['keperluan'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=='add') { - - $id = $_POST['id']; -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$tanggal = $_POST['tanggal']; -$berat_badan = $_POST['berat_badan']; -$tinggi_badan = $_POST['tinggi_badan']; -$tensi = $_POST['tensi']; -$gol_darah = $_POST['gol_darah']; -$riwayat_penyakit = $_POST['riwayat_penyakit']; -$keperluan = $_POST['keperluan']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - $mlite_surat_sehat_add = $this->db()->pdo()->prepare('INSERT INTO mlite_surat_sehat VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); - $mlite_surat_sehat_add->execute([$id, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $tanggal, $berat_badan, $tinggi_badan, $tensi, $gol_darah, $riwayat_penyakit, $keperluan, $dokter, $petugas]); - - } - if ($act=="edit") { - - $id = $_POST['id']; -$nomor_surat = $_POST['nomor_surat']; -$no_rawat = $_POST['no_rawat']; -$no_rkm_medis = $_POST['no_rkm_medis']; -$nm_pasien = $_POST['nm_pasien']; -$tgl_lahir = $_POST['tgl_lahir']; -$umur = $_POST['umur']; -$jk = $_POST['jk']; -$alamat = $_POST['alamat']; -$tanggal = $_POST['tanggal']; -$berat_badan = $_POST['berat_badan']; -$tinggi_badan = $_POST['tinggi_badan']; -$tensi = $_POST['tensi']; -$gol_darah = $_POST['gol_darah']; -$riwayat_penyakit = $_POST['riwayat_penyakit']; -$keperluan = $_POST['keperluan']; -$dokter = $_POST['dokter']; -$petugas = $_POST['petugas']; - - - // BUANG FIELD PERTAMA - - $mlite_surat_sehat_edit = $this->db()->pdo()->prepare("UPDATE mlite_surat_sehat SET id=?, nomor_surat=?, no_rawat=?, no_rkm_medis=?, nm_pasien=?, tgl_lahir=?, umur=?, jk=?, alamat=?, tanggal=?, berat_badan=?, tinggi_badan=?, tensi=?, gol_darah=?, riwayat_penyakit=?, keperluan=?, dokter=?, petugas=? WHERE id=?"); - $mlite_surat_sehat_edit->execute([$id, $nomor_surat, $no_rawat, $no_rkm_medis, $nm_pasien, $tgl_lahir, $umur, $jk, $alamat, $tanggal, $berat_badan, $tinggi_badan, $tensi, $gol_darah, $riwayat_penyakit, $keperluan, $dokter, $petugas,$id]); - - } - - if ($act=="del") { - $id= $_POST['id']; - $check_db = $this->db()->pdo()->prepare("DELETE FROM mlite_surat_sehat WHERE id='$id'"); - $result = $check_db->execute(); - $error = $check_db->errorInfo(); - if (!empty($result)){ - $data = array( - 'status' => 'success', - 'msg' => $no_rkm_medis - ); - } else { - $data = array( - 'status' => 'error', - 'msg' => $error['2'] - ); - } - echo json_encode($data); - } - - if ($act=="lihat") { - - $search_field_mlite_surat_sehat= $_POST['search_field_mlite_surat_sehat']; - $search_text_mlite_surat_sehat = $_POST['search_text_mlite_surat_sehat']; - - $searchQuery = " "; - if($search_text_mlite_surat_sehat != ''){ - $searchQuery .= " and (".$search_field_mlite_surat_sehat." like '%".$search_text_mlite_surat_sehat."%' ) "; - } - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from mlite_surat_sehat WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $data[] = array( - 'id'=>$row['id'], -'nomor_surat'=>$row['nomor_surat'], -'no_rawat'=>$row['no_rawat'], -'no_rkm_medis'=>$row['no_rkm_medis'], -'nm_pasien'=>$row['nm_pasien'], -'tgl_lahir'=>$row['tgl_lahir'], -'umur'=>$row['umur'], -'jk'=>$row['jk'], -'alamat'=>$row['alamat'], -'tanggal'=>$row['tanggal'], -'berat_badan'=>$row['berat_badan'], -'tinggi_badan'=>$row['tinggi_badan'], -'tensi'=>$row['tensi'], -'gol_darah'=>$row['gol_darah'], -'riwayat_penyakit'=>$row['riwayat_penyakit'], -'keperluan'=>$row['keperluan'], -'dokter'=>$row['dokter'], -'petugas'=>$row['petugas'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($id) - { - $detail = $this->db('mlite_surat_sehat')->where('id', $id)->toArray(); - echo $this->draw('detail.html', ['detail' => $detail]); - exit(); - } - - public function getSuratSehat($no_rawat) - { - $kd_dokter = $this->core->getRegPeriksaInfo('kd_dokter', revertNoRawat($no_rawat)); - $no_rkm_medis = $this->core->getRegPeriksaInfo('no_rkm_medis', revertNoRawat($no_rawat)); - $pasien = $this->db('pasien') - ->join('kelurahan', 'kelurahan.kd_kel=pasien.kd_kel') - ->join('kecamatan', 'kecamatan.kd_kec=pasien.kd_kec') - ->join('kabupaten', 'kabupaten.kd_kab=pasien.kd_kab') - ->join('propinsi', 'propinsi.kd_prop=pasien.kd_prop') - ->where('no_rkm_medis', $no_rkm_medis) - ->oneArray(); - $nm_dokter = $this->core->getPegawaiInfo('nama', $kd_dokter); - $sip_dokter = $this->core->getDokterInfo('no_ijn_praktek', $kd_dokter); - $this->tpl->set('pasien', $this->tpl->noParse_array(htmlspecialchars_array($pasien))); - $this->tpl->set('nm_dokter', $nm_dokter); - $this->tpl->set('sip_dokter', $sip_dokter); - $this->tpl->set('no_rawat', revertNoRawat($no_rawat)); - $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($this->settings('settings')))); - $this->tpl->set('surat', $this->db('mlite_surat_sehat')->where('no_rawat', revertNoRawat($no_rawat))->oneArray()); - echo $this->tpl->draw(MODULES.'/surat_sehat/view/admin/surat.sehat.html', true); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/surat_sehat/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/surat_sehat/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - - $this->core->addCSS(url([ADMIN, 'surat_sehat', 'css'])); - $this->core->addJS(url([ADMIN, 'surat_sehat', 'javascript']), 'footer'); - } - -} diff --git a/plugins/surat_sehat/Info.php b/plugins/surat_sehat/Info.php deleted file mode 100644 index 2fc33e5c0..000000000 --- a/plugins/surat_sehat/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Surat Sehat', - 'description' => 'Modul mlite surat sehat untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/surat_sehat/css/admin/styles.css b/plugins/surat_sehat/css/admin/styles.css deleted file mode 100644 index 79b25fdd0..000000000 --- a/plugins/surat_sehat/css/admin/styles.css +++ /dev/null @@ -1,21 +0,0 @@ -#tbl_mlite_surat_sehat th, #tbl_mlite_surat_sehat td, #forTable_mlite_surat_sehat th, #forTable_mlite_surat_sehat td { - white-space: nowrap; -} -.dataTables_wrapper th, .dataTables_wrapper td { - white-space: nowrap; -} -.pmd-datatable-pagination { - padding-top: 10px !important; -} -.dataTables_length { - display: inline; -} -.dataTables_paginate { - display: inline; - float: right; -} -@media (max-width:767px) { - .dataTables_length{ - display: none !important; - } -} \ No newline at end of file diff --git a/plugins/surat_sehat/js/admin/scripts.js b/plugins/surat_sehat/js/admin/scripts.js deleted file mode 100644 index d859b7437..000000000 --- a/plugins/surat_sehat/js/admin/scripts.js +++ /dev/null @@ -1,440 +0,0 @@ -jQuery().ready(function () { - var var_tbl_mlite_surat_sehat = $('#tbl_mlite_surat_sehat').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'surat_sehat','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_mlite_surat_sehat = $('#search_field_mlite_surat_sehat').val(); - var search_text_mlite_surat_sehat = $('#search_text_mlite_surat_sehat').val(); - - data.search_field_mlite_surat_sehat = search_field_mlite_surat_sehat; - data.search_text_mlite_surat_sehat = search_text_mlite_surat_sehat; - - } - }, - "columns": [ -{ 'data': 'id' }, -{ 'data': 'nomor_surat' }, -{ 'data': 'no_rawat' }, -{ 'data': 'no_rkm_medis' }, -{ 'data': 'nm_pasien' }, -{ 'data': 'tgl_lahir' }, -{ 'data': 'umur' }, -{ 'data': 'jk' }, -{ 'data': 'alamat' }, -{ 'data': 'tanggal' }, -{ 'data': 'berat_badan' }, -{ 'data': 'tinggi_badan' }, -{ 'data': 'tensi' }, -{ 'data': 'gol_darah' }, -{ 'data': 'riwayat_penyakit' }, -{ 'data': 'keperluan' }, -{ 'data': 'dokter' }, -{ 'data': 'petugas' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2}, -{ 'targets': 3}, -{ 'targets': 4}, -{ 'targets': 5}, -{ 'targets': 6}, -{ 'targets': 7}, -{ 'targets': 8}, -{ 'targets': 9}, -{ 'targets': 10}, -{ 'targets': 11}, -{ 'targets': 12}, -{ 'targets': 13}, -{ 'targets': 14}, -{ 'targets': 15}, -{ 'targets': 16}, -{ 'targets': 17} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // FORM VALIDASI - // ============================================================== - - $("form[name='form_mlite_surat_sehat']").validate({ - rules: { -id: 'required', -nomor_surat: 'required', -no_rawat: 'required', -no_rkm_medis: 'required', -nm_pasien: 'required', -tgl_lahir: 'required', -umur: 'required', -jk: 'required', -alamat: 'required', -tanggal: 'required', -berat_badan: 'required', -tinggi_badan: 'required', -tensi: 'required', -gol_darah: 'required', -riwayat_penyakit: 'required', -keperluan: 'required', -dokter: 'required', -petugas: 'required' - - }, - messages: { -id:'id tidak boleh kosong!', -nomor_surat:'nomor_surat tidak boleh kosong!', -no_rawat:'no_rawat tidak boleh kosong!', -no_rkm_medis:'no_rkm_medis tidak boleh kosong!', -nm_pasien:'nm_pasien tidak boleh kosong!', -tgl_lahir:'tgl_lahir tidak boleh kosong!', -umur:'umur tidak boleh kosong!', -jk:'jk tidak boleh kosong!', -alamat:'alamat tidak boleh kosong!', -tanggal:'tanggal tidak boleh kosong!', -berat_badan:'berat_badan tidak boleh kosong!', -tinggi_badan:'tinggi_badan tidak boleh kosong!', -tensi:'tensi tidak boleh kosong!', -gol_darah:'gol_darah tidak boleh kosong!', -riwayat_penyakit:'riwayat_penyakit tidak boleh kosong!', -keperluan:'keperluan tidak boleh kosong!', -dokter:'dokter tidak boleh kosong!', -petugas:'petugas tidak boleh kosong!' - - }, - submitHandler: function (form) { - var id= $('#id').val(); -var nomor_surat= $('#nomor_surat').val(); -var no_rawat= $('#no_rawat').val(); -var no_rkm_medis= $('#no_rkm_medis').val(); -var nm_pasien= $('#nm_pasien').val(); -var tgl_lahir= $('#tgl_lahir').val(); -var umur= $('#umur').val(); -var jk= $('#jk').val(); -var alamat= $('#alamat').val(); -var tanggal= $('#tanggal').val(); -var berat_badan= $('#berat_badan').val(); -var tinggi_badan= $('#tinggi_badan').val(); -var tensi= $('#tensi').val(); -var gol_darah= $('#gol_darah').val(); -var riwayat_penyakit= $('#riwayat_penyakit').val(); -var keperluan= $('#keperluan').val(); -var dokter= $('#dokter').val(); -var petugas= $('#petugas').val(); - - var typeact = $('#typeact').val(); - - var formData = new FormData(form); // tambahan - formData.append('typeact', typeact); // tambahan - - $.ajax({ - url: "{?=url([ADMIN,'surat_sehat','aksi'])?}", - method: "POST", - contentType: false, // tambahan - processData: false, // tambahan - data: formData, - success: function (data) { - if (typeact == "add") { - alert("Data Berhasil Ditambah"); - } - else if (typeact == "edit") { - alert("Data Berhasil Diubah"); - } - $("#modal_cs").hide(); - location.reload(true); - } - }) - } - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - $('#search_text_mlite_surat_sehat').keyup(function () { - var_tbl_mlite_surat_sehat.draw(); - }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_mlite_surat_sehat").click(function () { - $("#search_text_mlite_surat_sehat").val(""); - var_tbl_mlite_surat_sehat.draw(); - }); - - // =========================================== - // Ketika tombol Edit di tekan - // =========================================== - - $("#edit_data_mlite_surat_sehat").click(function () { - var rowData = var_tbl_mlite_surat_sehat.rows({ selected: true }).data()[0]; - if (rowData != null) { - - var id = rowData['id']; -var nomor_surat = rowData['nomor_surat']; -var no_rawat = rowData['no_rawat']; -var no_rkm_medis = rowData['no_rkm_medis']; -var nm_pasien = rowData['nm_pasien']; -var tgl_lahir = rowData['tgl_lahir']; -var umur = rowData['umur']; -var jk = rowData['jk']; -var alamat = rowData['alamat']; -var tanggal = rowData['tanggal']; -var berat_badan = rowData['berat_badan']; -var tinggi_badan = rowData['tinggi_badan']; -var tensi = rowData['tensi']; -var gol_darah = rowData['gol_darah']; -var riwayat_penyakit = rowData['riwayat_penyakit']; -var keperluan = rowData['keperluan']; -var dokter = rowData['dokter']; -var petugas = rowData['petugas']; - - - - $("#typeact").val("edit"); - - $('#id').val(id); -$('#nomor_surat').val(nomor_surat); -$('#no_rawat').val(no_rawat); -$('#no_rkm_medis').val(no_rkm_medis); -$('#nm_pasien').val(nm_pasien); -$('#tgl_lahir').val(tgl_lahir); -$('#umur').val(umur); -$('#jk').val(jk); -$('#alamat').val(alamat); -$('#tanggal').val(tanggal); -$('#berat_badan').val(berat_badan); -$('#tinggi_badan').val(tinggi_badan); -$('#tensi').val(tensi); -$('#gol_darah').val(gol_darah); -$('#riwayat_penyakit').val(riwayat_penyakit); -$('#keperluan').val(keperluan); -$('#dokter').val(dokter); -$('#petugas').val(petugas); - - //$("#id").prop('disabled', true); // GA BISA DIEDIT KALI DISABLE - $('#modal-title').text("Edit Data Surat Sehat"); - $("#modal_mlite_surat_sehat").modal(); - } - else { - alert("Silakan pilih data yang akan di edit."); - } - - }); - - // ============================================================== - // TOMBOL DELETE DI CLICK - // ============================================================== - jQuery("#hapus_data_mlite_surat_sehat").click(function () { - var rowData = var_tbl_mlite_surat_sehat.rows({ selected: true }).data()[0]; - - - if (rowData) { -var id = rowData['id']; - var a = confirm("Anda yakin akan menghapus data dengan id=" + id); - if (a) { - - $.ajax({ - url: "{?=url([ADMIN,'surat_sehat','aksi'])?}", - method: "POST", - data: { - id: id, - typeact: 'del' - }, - success: function (data) { - data = JSON.parse(data); - if(data.status === 'success') { - alert(data.msg); - } else { - alert(data.msg); - } - location.reload(true); - } - }) - } - } - else { - alert("Pilih satu baris untuk dihapus"); - } - }); - - // ============================================================== - // TOMBOL TAMBAH DATA DI CLICK - // ============================================================== - jQuery("#tambah_data_mlite_surat_sehat").click(function () { - - $('#id').val(''); -$('#nomor_surat').val(''); -$('#no_rawat').val(''); -$('#no_rkm_medis').val(''); -$('#nm_pasien').val(''); -$('#tgl_lahir').val(''); -$('#umur').val(''); -$('#jk').val(''); -$('#alamat').val(''); -$('#tanggal').val(''); -$('#berat_badan').val(''); -$('#tinggi_badan').val(''); -$('#tensi').val(''); -$('#gol_darah').val(''); -$('#riwayat_penyakit').val(''); -$('#keperluan').val(''); -$('#dokter').val(''); -$('#petugas').val(''); - - - $("#typeact").val("add"); - $("#id").prop('disabled', false); - - $('#modal-title').text("Tambah Data Surat Sehat"); - $("#modal_mlite_surat_sehat").modal(); - }); - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_mlite_surat_sehat").click(function () { - - var search_field_mlite_surat_sehat = $('#search_field_mlite_surat_sehat').val(); - var search_text_mlite_surat_sehat = $('#search_text_mlite_surat_sehat').val(); - - $.ajax({ - url: "{?=url([ADMIN,'surat_sehat','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_mlite_surat_sehat: search_field_mlite_surat_sehat, - search_text_mlite_surat_sehat: search_text_mlite_surat_sehat - }, - dataType: 'json', - success: function (res) { - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; - eTable += ""; - } - eTable += "
                  Nomor SuratNo RawatNm PasienTgl LahirUmurJkKeperluanDokter
                  ' + res[i]['nomor_surat'] + '' + res[i]['no_rawat'] + '' + res[i]['nm_pasien'] + '' + res[i]['tgl_lahir'] + '' + res[i]['umur'] + '' + res[i]['jk'] + '' + res[i]['keperluan'] + '' + res[i]['dokter'] + '
                  "; - $('#forTable_mlite_surat_sehat').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_mlite_surat_sehat").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL mlite_surat_sehat DI CLICK - // ============================================================== - jQuery("#lihat_detail_mlite_surat_sehat").click(function (event) { - - var rowData = var_tbl_mlite_surat_sehat.rows({ selected: true }).data()[0]; - - if (rowData) { - var id = rowData['id']; - var no_rawat = rowData['no_rawat']; - var no_rawat = no_rawat.replace(/\//g,''); - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/surat_sehat/suratsehat/' + no_rawat + '?t=' + mlite.token; - window.open(loadURL); - - // var modal = $('#modal_detail_mlite_surat_sehat'); - // var modalContent = $('#modal_detail_mlite_surat_sehat .modal-content'); - - // modal.off('show.bs.modal'); - // modal.on('show.bs.modal', function () { - // modalContent.load(loadURL); - // }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('l', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,820,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,820,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Mlite Surat Sehat", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_mlite_surat_sehat', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_mlite_surat_sehat.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_mlite_surat_sehat"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data mlite_surat_sehat"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/surat_sehat/view/admin/detail.html b/plugins/surat_sehat/view/admin/detail.html deleted file mode 100644 index fd5d1cb32..000000000 --- a/plugins/surat_sehat/view/admin/detail.html +++ /dev/null @@ -1,36 +0,0 @@ - - - diff --git a/plugins/surat_sehat/view/admin/manage.html b/plugins/surat_sehat/view/admin/manage.html deleted file mode 100644 index dc28baae8..000000000 --- a/plugins/surat_sehat/view/admin/manage.html +++ /dev/null @@ -1,273 +0,0 @@ -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - - - -
                  -
                  -
                  -
                  - Cari : - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  IdNomor SuratNo RawatNo Rkm MedisNm PasienTgl LahirUmurJkAlamatTanggalBerat BadanTinggi BadanTensiGol DarahRiwayat PenyakitKeperluanDokterPetugas
                  -
                  -
                  -
                  -
                  -
                  - - - - - - - diff --git a/plugins/triase/Admin.php b/plugins/triase/Admin.php deleted file mode 100644 index d5769e22d..000000000 --- a/plugins/triase/Admin.php +++ /dev/null @@ -1,299 +0,0 @@ - 'manage', - ]; - } - - public function getManage(){ - $this->_addHeaderFiles(); - $enum['cara_masuk'] = $this->core->getEnum('mlite_triase', 'cara_masuk'); - $enum['alat_transportasi'] = $this->core->getEnum('mlite_triase', 'alat_transportasi'); - $enum['alasan_kedatangan'] = $this->core->getEnum('mlite_triase', 'alasan_kedatangan'); - $enum['macam_kasus'] = $this->core->getEnum('mlite_triase', 'macam_kasus'); - $enum['jenis_triase'] = $this->core->getEnum('mlite_triase', 'jenis_triase'); - $enum['kebutuhan_khusus'] = $this->core->getEnum('mlite_triase', 'kebutuhan_khusus'); - $enum['plan'] = $this->core->getEnum('mlite_triase', 'plan'); - $triase_pemeriksaan = $this->db('mlite_triase_pemeriksaan')->toArray(); - $triase_skala = $this->db('mlite_triase_skala')->toArray(); - $kode_pemeriksaan['001'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '001')->toArray(); - $kode_pemeriksaan['002'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '002')->toArray(); - $kode_pemeriksaan['003'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '003')->toArray(); - $kode_pemeriksaan['004'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '004')->toArray(); - $kode_pemeriksaan['005'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '005')->toArray(); - $kode_pemeriksaan['006'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '006')->toArray(); - $kode_pemeriksaan['007'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '007')->toArray(); - $kode_pemeriksaan['008'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', '008')->toArray(); - - $rows_triase_pemeriksaan = $this->db('mlite_triase_pemeriksaan')->toArray(); - $skala_pemeriksaan = []; - foreach($rows_triase_pemeriksaan as $row) { - $rows_kode_pemeriksaan = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', $row['kode_pemeriksaan'])->toArray(); - $row_['kode'] = $row['kode_pemeriksaan']; - $row_['nama_pemeriksaan'] = $row['nama_pemeriksaan']; - foreach($rows_kode_pemeriksaan as $row1) { - $rows_skala = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', $row_['kode'])->group('skala')->toArray(); - $row_['skala'] = []; - foreach($rows_skala as $row2) { - $row2_['skala'] = $row2['skala']; - $row2_['skala_nilai'] = $this->db('mlite_triase_skala')->where('kode_pemeriksaan', $row_['kode'])->where('skala', $row2['skala'])->toArray(); - $row_['skala'][] = $row2_; - } - } - $skala_pemeriksaan[] = $row_; - } - - return $this->draw('manage.html', ['enum' => $enum, 'triase_pemeriksaan' => $triase_pemeriksaan, 'kode_pemeriksaan' => $kode_pemeriksaan, 'skala_pemeriksaan' => $skala_pemeriksaan]); - } - - public function postData(){ - $draw = $_POST['draw']; - $row1 = $_POST['start']; - $rowperpage = $_POST['length']; // Rows display per page - $columnIndex = $_POST['order'][0]['column']; // Column index - $columnName = $_POST['columns'][$columnIndex]['data']; // Column name - $columnSortOrder = $_POST['order'][0]['dir']; // asc or desc - $searchValue = $_POST['search']['value']; // Search value - - ## Custom Field value - $search_field_mlite_triase= $_POST['search_field_mlite_triase']; - $search_text_mlite_triase = $_POST['search_text_mlite_triase']; - - $searchQuery = " "; - if($search_text_mlite_triase != ''){ - $searchQuery .= " and (".$search_field_mlite_triase." like '%".$search_text_mlite_triase."%' ) "; - } - - ## Total number of records without filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_triase"); - $sel->execute(); - $records = $sel->fetch(); - $totalRecords = $records['allcount']; - - ## Total number of records with filtering - $sel = $this->db()->pdo()->prepare("select count(*) as allcount from mlite_triase WHERE 1 ".$searchQuery); - $sel->execute(); - $records = $sel->fetch(); - $totalRecordwithFilter = $records['allcount']; - - ## Fetch records - $sel = $this->db()->pdo()->prepare("select * from mlite_triase WHERE 1 ".$searchQuery." order by ".$columnName." ".$columnSortOrder." limit ".$row1.",".$rowperpage); - $sel->execute(); - $result = $sel->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - foreach($result as $row) { - $data[] = array( - 'no_rawat'=>$row['no_rawat'], -'tgl_kunjungan'=>$row['tgl_kunjungan'], -'cara_masuk'=>$row['cara_masuk'], -'alat_transportasi'=>$row['alat_transportasi'], -'alasan_kedatangan'=>$row['alasan_kedatangan'], -'keterangan_kedatangan'=>$row['keterangan_kedatangan'], -'macam_kasus'=>$row['macam_kasus'], -'tekanan_darah'=>$row['tekanan_darah'], -'nadi'=>$row['nadi'], -'pernapasan'=>$row['pernapasan'], -'suhu'=>$row['suhu'], -'saturasi_o2'=>$row['saturasi_o2'], -'nyeri'=>$row['nyeri'], -'jenis_triase'=>$row['jenis_triase'], -'keluhan_utama'=>$row['keluhan_utama'], -'kebutuhan_khusus'=>$row['kebutuhan_khusus'], -'catatan'=>$row['catatan'], -'plan'=>$row['plan'], -'nik'=>$row['nik'] - - ); - } - - ## Response - $response = array( - "draw" => intval($draw), - "iTotalRecords" => $totalRecords, - "iTotalDisplayRecords" => $totalRecordwithFilter, - "aaData" => $data - ); - - echo json_encode($response); - exit(); - } - - public function postAksi() - { - if(isset($_POST['typeact'])){ - $act = $_POST['typeact']; - }else{ - $act = ''; - } - - if ($act=='add') { - - $no_rawat = $_POST['no_rawat']; -$tgl_kunjungan = $_POST['tgl_kunjungan']; -$cara_masuk = $_POST['cara_masuk']; -$alat_transportasi = $_POST['alat_transportasi']; -$alasan_kedatangan = $_POST['alasan_kedatangan']; -$keterangan_kedatangan = $_POST['keterangan_kedatangan']; -$macam_kasus = $_POST['macam_kasus']; -$tekanan_darah = $_POST['tekanan_darah']; -$nadi = $_POST['nadi']; -$pernapasan = $_POST['pernapasan']; -$suhu = $_POST['suhu']; -$saturasi_o2 = $_POST['saturasi_o2']; -$nyeri = $_POST['nyeri']; -$jenis_triase = $_POST['jenis_triase']; -$keluhan_utama = $_POST['keluhan_utama']; -$kebutuhan_khusus = $_POST['kebutuhan_khusus']; -$catatan = $_POST['catatan']; -$plan = $_POST['plan']; -$nik = $_POST['nik']; - - $mlite_triase_add = $this->db()->pdo()->prepare('INSERT INTO mlite_triase VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); - $mlite_triase_add->execute([$no_rawat, $tgl_kunjungan, $cara_masuk, $alat_transportasi, $alasan_kedatangan, $keterangan_kedatangan, $macam_kasus, $tekanan_darah, $nadi, $pernapasan, $suhu, $saturasi_o2, $nyeri, $jenis_triase, $keluhan_utama, $kebutuhan_khusus, $catatan, $plan, $nik]); - - for($l=0; $l < count($_POST['id_skala_triase']); $l++){ - $mlite_triase_skala = $this->db('mlite_triase_skala')->where('id', $_POST['id_skala_triase'][$l])->oneArray(); - $mlite_triase_detail = $this->db('mlite_triase_detail')->save(['no_rawat' => $no_rawat, 'skala' => $mlite_triase_skala['skala'], 'kode_skala' => $mlite_triase_skala['kode_skala']]); - } - - } - if ($act=="edit") { - - $no_rawat = $_POST['no_rawat']; -$tgl_kunjungan = $_POST['tgl_kunjungan']; -$cara_masuk = $_POST['cara_masuk']; -$alat_transportasi = $_POST['alat_transportasi']; -$alasan_kedatangan = $_POST['alasan_kedatangan']; -$keterangan_kedatangan = $_POST['keterangan_kedatangan']; -$macam_kasus = $_POST['macam_kasus']; -$tekanan_darah = $_POST['tekanan_darah']; -$nadi = $_POST['nadi']; -$pernapasan = $_POST['pernapasan']; -$suhu = $_POST['suhu']; -$saturasi_o2 = $_POST['saturasi_o2']; -$nyeri = $_POST['nyeri']; -$jenis_triase = $_POST['jenis_triase']; -$keluhan_utama = $_POST['keluhan_utama']; -$kebutuhan_khusus = $_POST['kebutuhan_khusus']; -$catatan = $_POST['catatan']; -$plan = $_POST['plan']; -$nik = $_POST['nik']; - - - // BUANG FIELD PERTAMA - - $mlite_triase_edit = $this->db()->pdo()->prepare("UPDATE mlite_triase SET no_rawat=?, tgl_kunjungan=?, cara_masuk=?, alat_transportasi=?, alasan_kedatangan=?, keterangan_kedatangan=?, macam_kasus=?, tekanan_darah=?, nadi=?, pernapasan=?, suhu=?, saturasi_o2=?, nyeri=?, jenis_triase=?, keluhan_utama=?, kebutuhan_khusus=?, catatan=?, plan=?, nik=? WHERE no_rawat=?"); - $mlite_triase_edit->execute([$no_rawat, $tgl_kunjungan, $cara_masuk, $alat_transportasi, $alasan_kedatangan, $keterangan_kedatangan, $macam_kasus, $tekanan_darah, $nadi, $pernapasan, $suhu, $saturasi_o2, $nyeri, $jenis_triase, $keluhan_utama, $kebutuhan_khusus, $catatan, $plan, $nik,$no_rawat]); - - } - - if ($act=="del") { - $no_rawat= $_POST['no_rawat']; - $check_db = $this->db()->pdo()->prepare("DELETE FROM mlite_triase WHERE no_rawat='$no_rawat'"); - $result = $check_db->execute(); - $error = $check_db->errorInfo(); - if (!empty($result)){ - $data = array( - 'status' => 'success', - 'msg' => $no_rkm_medis - ); - } else { - $data = array( - 'status' => 'error', - 'msg' => $error['2'] - ); - } - echo json_encode($data); - } - - if ($act=="lihat") { - - $search_field_mlite_triase= $_POST['search_field_mlite_triase']; - $search_text_mlite_triase = $_POST['search_text_mlite_triase']; - - $searchQuery = " "; - if($search_text_mlite_triase != ''){ - $searchQuery .= " and (".$search_field_mlite_triase." like '%".$search_text_mlite_triase."%' ) "; - } - - $user_lihat = $this->db()->pdo()->prepare("SELECT * from mlite_triase WHERE 1 ".$searchQuery); - $user_lihat->execute(); - $result = $user_lihat->fetchAll(\PDO::FETCH_ASSOC); - - $data = array(); - - foreach($result as $row) { - $data[] = array( - 'no_rawat'=>$row['no_rawat'], -'tgl_kunjungan'=>$row['tgl_kunjungan'], -'cara_masuk'=>$row['cara_masuk'], -'alat_transportasi'=>$row['alat_transportasi'], -'alasan_kedatangan'=>$row['alasan_kedatangan'], -'keterangan_kedatangan'=>$row['keterangan_kedatangan'], -'macam_kasus'=>$row['macam_kasus'], -'tekanan_darah'=>$row['tekanan_darah'], -'nadi'=>$row['nadi'], -'pernapasan'=>$row['pernapasan'], -'suhu'=>$row['suhu'], -'saturasi_o2'=>$row['saturasi_o2'], -'nyeri'=>$row['nyeri'], -'jenis_triase'=>$row['jenis_triase'], -'keluhan_utama'=>$row['keluhan_utama'], -'kebutuhan_khusus'=>$row['kebutuhan_khusus'], -'catatan'=>$row['catatan'], -'plan'=>$row['plan'], -'nik'=>$row['nik'] - ); - } - - echo json_encode($data); - } - exit(); - } - - public function getDetail($no_rawat) - { - $detail = $this->db('mlite_triase')->where('no_rawat', revertNoRawat($no_rawat))->toArray(); - $settings = $this->settings('settings'); - echo $this->draw('detail.html', ['detail' => $detail, 'settings' => $settings]); - exit(); - } - - public function getCss() - { - header('Content-type: text/css'); - echo $this->draw(MODULES.'/triase/css/admin/styles.css'); - exit(); - } - - public function getJavascript() - { - header('Content-type: text/javascript'); - $settings = $this->settings('settings'); - echo $this->draw(MODULES.'/triase/js/admin/scripts.js', ['settings' => $settings]); - exit(); - } - - private function _addHeaderFiles() - { - $this->core->addCSS(url('assets/css/datatables.min.css')); - $this->core->addJS(url('assets/jscripts/jqueryvalidation.js')); - $this->core->addJS(url('assets/jscripts/xlsx.js')); - $this->core->addJS(url('assets/jscripts/jspdf.min.js')); - $this->core->addJS(url('assets/jscripts/jspdf.plugin.autotable.min.js')); - $this->core->addJS(url('assets/jscripts/datatables.min.js')); - - $this->core->addCSS(url([ADMIN, 'triase', 'css'])); - $this->core->addJS(url([ADMIN, 'triase', 'javascript']), 'footer'); - } - -} diff --git a/plugins/triase/Info.php b/plugins/triase/Info.php deleted file mode 100644 index 58107007a..000000000 --- a/plugins/triase/Info.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Triase', - 'description' => 'Modul mlite triase untuk mLITE', - 'author' => 'Basoro', - 'version' => '1.0', - 'compatibility' => '5.*.*', - 'icon' => 'code', - 'install' => function () use ($core) { - }, - 'uninstall' => function() use($core) - { - } - ]; diff --git a/plugins/triase/css/admin/styles.css b/plugins/triase/css/admin/styles.css deleted file mode 100644 index 56fbe6610..000000000 --- a/plugins/triase/css/admin/styles.css +++ /dev/null @@ -1,21 +0,0 @@ -#tbl_mlite_triase th, #tbl_mlite_triase td, #forTable_mlite_triase th, #forTable_mlite_triase td { - white-space: nowrap; -} -.dataTables_wrapper th, .dataTables_wrapper td { - white-space: nowrap; -} -.pmd-datatable-pagination { - padding-top: 10px !important; -} -.dataTables_length { - display: inline; -} -.dataTables_paginate { - display: inline; - float: right; -} -@media (max-width:767px) { - .dataTables_length{ - display: none !important; - } -} \ No newline at end of file diff --git a/plugins/triase/js/admin/scripts.js b/plugins/triase/js/admin/scripts.js deleted file mode 100644 index d15d76c33..000000000 --- a/plugins/triase/js/admin/scripts.js +++ /dev/null @@ -1,473 +0,0 @@ -jQuery().ready(function () { - var var_tbl_mlite_triase = $('#tbl_mlite_triase').DataTable({ - 'processing': true, - 'serverSide': true, - 'serverMethod': 'post', - 'dom': 'Bfrtip', - 'searching': false, - 'select': true, - 'colReorder': true, - "bInfo" : false, - "ajax": { - "url": "{?=url([ADMIN,'triase','data'])?}", - "dataType": "json", - "type": "POST", - "data": function (data) { - - // Read values - var search_field_mlite_triase = $('#search_field_mlite_triase').val(); - var search_text_mlite_triase = $('#search_text_mlite_triase').val(); - - data.search_field_mlite_triase = search_field_mlite_triase; - data.search_text_mlite_triase = search_text_mlite_triase; - - } - }, - "columns": [ -{ 'data': 'no_rawat' }, -{ 'data': 'tgl_kunjungan' }, -{ 'data': 'cara_masuk' }, -{ 'data': 'alat_transportasi' }, -{ 'data': 'alasan_kedatangan' }, -{ 'data': 'keterangan_kedatangan' }, -{ 'data': 'macam_kasus' }, -{ 'data': 'tekanan_darah' }, -{ 'data': 'nadi' }, -{ 'data': 'pernapasan' }, -{ 'data': 'suhu' }, -{ 'data': 'saturasi_o2' }, -{ 'data': 'nyeri' }, -{ 'data': 'jenis_triase' }, -{ 'data': 'keluhan_utama' }, -{ 'data': 'kebutuhan_khusus' }, -{ 'data': 'catatan' }, -{ 'data': 'plan' }, -{ 'data': 'nik' } - - ], - "columnDefs": [ -{ 'targets': 0}, -{ 'targets': 1}, -{ 'targets': 2}, -{ 'targets': 3}, -{ 'targets': 4}, -{ 'targets': 5}, -{ 'targets': 6}, -{ 'targets': 7}, -{ 'targets': 8}, -{ 'targets': 9}, -{ 'targets': 10}, -{ 'targets': 11}, -{ 'targets': 12}, -{ 'targets': 13}, -{ 'targets': 14}, -{ 'targets': 15}, -{ 'targets': 16}, -{ 'targets': 17}, -{ 'targets': 18} - - ], - buttons: [], - "scrollCollapse": true, - // "scrollY": '48vh', - "pageLength":'25', - "lengthChange": true, - "scrollX": true, - dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" - }); - - // ============================================================== - // FORM VALIDASI - // ============================================================== - - $("form[name='form_mlite_triase']").validate({ - rules: { -no_rawat: 'required', -tgl_kunjungan: 'required', -cara_masuk: 'required', -alat_transportasi: 'required', -alasan_kedatangan: 'required', -keterangan_kedatangan: 'required', -macam_kasus: 'required', -tekanan_darah: 'required', -nadi: 'required', -pernapasan: 'required', -suhu: 'required', -saturasi_o2: 'required', -nyeri: 'required', -jenis_triase: 'required', -keluhan_utama: 'required', -kebutuhan_khusus: 'required', -catatan: 'required', -plan: 'required', -nik: 'required' - - }, - messages: { -no_rawat:'no_rawat tidak boleh kosong!', -tgl_kunjungan:'tgl_kunjungan tidak boleh kosong!', -cara_masuk:'cara_masuk tidak boleh kosong!', -alat_transportasi:'alat_transportasi tidak boleh kosong!', -alasan_kedatangan:'alasan_kedatangan tidak boleh kosong!', -keterangan_kedatangan:'keterangan_kedatangan tidak boleh kosong!', -macam_kasus:'macam_kasus tidak boleh kosong!', -tekanan_darah:'tekanan_darah tidak boleh kosong!', -nadi:'nadi tidak boleh kosong!', -pernapasan:'pernapasan tidak boleh kosong!', -suhu:'suhu tidak boleh kosong!', -saturasi_o2:'saturasi_o2 tidak boleh kosong!', -nyeri:'nyeri tidak boleh kosong!', -jenis_triase:'jenis_triase tidak boleh kosong!', -keluhan_utama:'keluhan_utama tidak boleh kosong!', -kebutuhan_khusus:'kebutuhan_khusus tidak boleh kosong!', -catatan:'catatan tidak boleh kosong!', -plan:'plan tidak boleh kosong!', -nik:'nik tidak boleh kosong!' - - }, - submitHandler: function (form) { - var no_rawat= $('#no_rawat').val(); -var tgl_kunjungan= $('#tgl_kunjungan').val(); -var cara_masuk= $('#cara_masuk').val(); -var alat_transportasi= $('#alat_transportasi').val(); -var alasan_kedatangan= $('#alasan_kedatangan').val(); -var keterangan_kedatangan= $('#keterangan_kedatangan').val(); -var macam_kasus= $('#macam_kasus').val(); -var tekanan_darah= $('#tekanan_darah').val(); -var nadi= $('#nadi').val(); -var pernapasan= $('#pernapasan').val(); -var suhu= $('#suhu').val(); -var saturasi_o2= $('#saturasi_o2').val(); -var nyeri= $('#nyeri').val(); -var jenis_triase= $('#jenis_triase').val(); -var keluhan_utama= $('#keluhan_utama').val(); -var kebutuhan_khusus= $('#kebutuhan_khusus').val(); -var catatan= $('#catatan').val(); -var plan= $('#plan').val(); -var nik= $('#nik').val(); - - var typeact = $('#typeact').val(); - - var formData = new FormData(form); // tambahan - formData.append('typeact', typeact); // tambahan - - $.ajax({ - url: "{?=url([ADMIN,'triase','aksi'])?}", - method: "POST", - contentType: false, // tambahan - processData: false, // tambahan - data: formData, - success: function (data) { - if (typeact == "add") { - alert("Data Berhasil Ditambah"); - } - else if (typeact == "edit") { - alert("Data Berhasil Diubah"); - } - $("#modal_cs").hide(); - location.reload(true); - } - }) - } - }); - - // ============================================================== - // KETIKA MENGETIK DI INPUT SEARCH - // ============================================================== - $('#search_text_mlite_triase').keyup(function () { - var_tbl_mlite_triase.draw(); - }); - // ============================================================== - // CLICK TANDA X DI INPUT SEARCH - // ============================================================== - $("#searchclear_mlite_triase").click(function () { - $("#search_text_mlite_triase").val(""); - var_tbl_mlite_triase.draw(); - }); - - // =========================================== - // Ketika tombol Edit di tekan - // =========================================== - - $("#edit_data_mlite_triase").click(function () { - var rowData = var_tbl_mlite_triase.rows({ selected: true }).data()[0]; - if (rowData != null) { - - var no_rawat = rowData['no_rawat']; -var tgl_kunjungan = rowData['tgl_kunjungan']; -var cara_masuk = rowData['cara_masuk']; -var alat_transportasi = rowData['alat_transportasi']; -var alasan_kedatangan = rowData['alasan_kedatangan']; -var keterangan_kedatangan = rowData['keterangan_kedatangan']; -var macam_kasus = rowData['macam_kasus']; -var tekanan_darah = rowData['tekanan_darah']; -var nadi = rowData['nadi']; -var pernapasan = rowData['pernapasan']; -var suhu = rowData['suhu']; -var saturasi_o2 = rowData['saturasi_o2']; -var nyeri = rowData['nyeri']; -var jenis_triase = rowData['jenis_triase']; -var keluhan_utama = rowData['keluhan_utama']; -var kebutuhan_khusus = rowData['kebutuhan_khusus']; -var catatan = rowData['catatan']; -var plan = rowData['plan']; -var nik = rowData['nik']; - - - - $("#typeact").val("edit"); - - $('#no_rawat').val(no_rawat); -$('#tgl_kunjungan').val(tgl_kunjungan); -$('#cara_masuk').val(cara_masuk); -$('#alat_transportasi').val(alat_transportasi); -$('#alasan_kedatangan').val(alasan_kedatangan); -$('#keterangan_kedatangan').val(keterangan_kedatangan); -$('#macam_kasus').val(macam_kasus); -$('#tekanan_darah').val(tekanan_darah); -$('#nadi').val(nadi); -$('#pernapasan').val(pernapasan); -$('#suhu').val(suhu); -$('#saturasi_o2').val(saturasi_o2); -$('#nyeri').val(nyeri); -$('#jenis_triase').val(jenis_triase); -$('#keluhan_utama').val(keluhan_utama); -$('#kebutuhan_khusus').val(kebutuhan_khusus); -$('#catatan').val(catatan); -$('#plan').val(plan); -$('#nik').val(nik); - - //$("#no_rawat").prop('disabled', true); // GA BISA DIEDIT KALI DISABLE - $('#modal-title').text("Edit Data Triase"); - $("#modal_mlite_triase").modal(); - } - else { - alert("Silakan pilih data yang akan di edit."); - } - - }); - - // ============================================================== - // TOMBOL DELETE DI CLICK - // ============================================================== - jQuery("#hapus_data_mlite_triase").click(function () { - var rowData = var_tbl_mlite_triase.rows({ selected: true }).data()[0]; - - - if (rowData) { -var no_rawat = rowData['no_rawat']; - var a = confirm("Anda yakin akan menghapus data dengan no_rawat=" + no_rawat); - if (a) { - - $.ajax({ - url: "{?=url([ADMIN,'triase','aksi'])?}", - method: "POST", - data: { - no_rawat: no_rawat, - typeact: 'del' - }, - success: function (data) { - data = JSON.parse(data); - if(data.status === 'success') { - alert(data.msg); - } else { - alert(data.msg); - } - location.reload(true); - } - }) - } - } - else { - alert("Pilih satu baris untuk dihapus"); - } - }); - - // ============================================================== - // TOMBOL TAMBAH DATA DI CLICK - // ============================================================== - - let searchParams = new URLSearchParams(window.location.search) - - if(window.location.search.indexOf('no_rawat') !== -1) { - $('#search_text_mlite_triase').val(searchParams.get('no_rawat')); - var_tbl_mlite_triase.draw(); - if(searchParams.get('modal') == 'true') { - $("#modal_mlite_triase").modal(); - $('#no_rawat').val(searchParams.get('no_rawat')); - } - } - - jQuery("#tambah_data_mlite_triase").click(function () { - - $('#no_rawat').val(''); - - if(window.location.search.indexOf('no_rawat') !== -1) { - $('#no_rawat').val(searchParams.get('no_rawat')); - } - -$('#tgl_kunjungan').val(''); -$('#cara_masuk').val(''); -$('#alat_transportasi').val(''); -$('#alasan_kedatangan').val(''); -$('#keterangan_kedatangan').val(''); -$('#macam_kasus').val(''); -$('#tekanan_darah').val(''); -$('#nadi').val(''); -$('#pernapasan').val(''); -$('#suhu').val(''); -$('#saturasi_o2').val(''); -$('#nyeri').val(''); -$('#jenis_triase').val(''); -$('#keluhan_utama').val(''); -$('#kebutuhan_khusus').val(''); -$('#catatan').val(''); -$('#plan').val(''); -$('#nik').val('{?=$this->core->getUserInfo('username', null, true)?}'); - - - $("#typeact").val("add"); - $("#no_rawat").prop('disabled', false); - - $('#modal-title').text("Tambah Data Triase"); - $("#modal_mlite_triase").modal(); - }); - - // =========================================== - // Ketika tombol lihat data di tekan - // =========================================== - $("#lihat_data_mlite_triase").click(function () { - - var search_field_mlite_triase = $('#search_field_mlite_triase').val(); - var search_text_mlite_triase = $('#search_text_mlite_triase').val(); - - $.ajax({ - url: "{?=url([ADMIN,'triase','aksi'])?}", - method: "POST", - data: { - typeact: 'lihat', - search_field_mlite_triase: search_field_mlite_triase, - search_text_mlite_triase: search_text_mlite_triase - }, - dataType: 'json', - success: function (res) { - var eTable = "
                  "; - for (var i = 0; i < res.length; i++) { - eTable += ""; - eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; -eTable += ''; - eTable += ""; - } - eTable += "
                  No RawatTgl KunjunganCara MasukAlat TransportasiAlasan KedatanganKeterangan KedatanganMacam KasusTekanan DarahNadiPernapasanSuhuSaturasi O2NyeriJenis TriaseKeluhan UtamaKebutuhan KhususCatatanPlanNik
                  ' + res[i]['no_rawat'] + '' + res[i]['tgl_kunjungan'] + '' + res[i]['cara_masuk'] + '' + res[i]['alat_transportasi'] + '' + res[i]['alasan_kedatangan'] + '' + res[i]['keterangan_kedatangan'] + '' + res[i]['macam_kasus'] + '' + res[i]['tekanan_darah'] + '' + res[i]['nadi'] + '' + res[i]['pernapasan'] + '' + res[i]['suhu'] + '' + res[i]['saturasi_o2'] + '' + res[i]['nyeri'] + '' + res[i]['jenis_triase'] + '' + res[i]['keluhan_utama'] + '' + res[i]['kebutuhan_khusus'] + '' + res[i]['catatan'] + '' + res[i]['plan'] + '' + res[i]['nik'] + '
                  "; - $('#forTable_mlite_triase').html(eTable); - } - }); - - $('#modal-title').text("Lihat Data"); - $("#modal_lihat_mlite_triase").modal(); - }); - - // ============================================================== - // TOMBOL DETAIL mlite_triase DI CLICK - // ============================================================== - jQuery("#lihat_detail_mlite_triase").click(function (event) { - - var rowData = var_tbl_mlite_triase.rows({ selected: true }).data()[0]; - - if (rowData) { - var no_rawat = rowData['no_rawat']; - var baseURL = mlite.url + '/' + mlite.admin; - event.preventDefault(); - var loadURL = baseURL + '/triase/detail/' + no_rawat.replace(/\//g,'') + '?t=' + mlite.token; - - var modal = $('#modal_detail_mlite_triase'); - var modalContent = $('#modal_detail_mlite_triase .modal-content'); - - modal.off('show.bs.modal'); - modal.on('show.bs.modal', function () { - modalContent.load(loadURL); - }).modal(); - return false; - - } - else { - alert("Pilih satu baris untuk detail"); - } - }); - - // =========================================== - // Ketika tombol export pdf di tekan - // =========================================== - $("#export_pdf").click(function () { - - var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ - var img = "{?=base64_encode(file_get_contents(url($settings['logo'])))?}"; - doc.addImage(img, 'JPEG', 20, 10, 50, 50); - doc.setFontSize(20); - doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); - doc.setFontSize(10); - doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); - doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); - doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ - doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ - doc.setFontSize(14); - doc.text("Tabel Data Mlite Triase", 20, 95, null, null, null); - const totalPagesExp = "{total_pages_count_string}"; - doc.autoTable({ - html: '#tbl_lihat_mlite_triase', - startY: 105, - margin: { - left: 20, - right: 20 - }, - styles: { - fontSize: 10, - cellPadding: 5 - }, - didDrawPage: data => { - let footerStr = "Page " + doc.internal.getNumberOfPages(); - if (typeof doc.putTotalPages === 'function') { - footerStr = footerStr + " of " + totalPagesExp; - } - doc.setFontSize(10); - doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); - } - }); - if (typeof doc.putTotalPages === 'function') { - doc.putTotalPages(totalPagesExp); - } - // doc.save('table_data_mlite_triase.pdf') - window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); - - }) - - // =========================================== - // Ketika tombol export xlsx di tekan - // =========================================== - $("#export_xlsx").click(function () { - let tbl1 = document.getElementById("tbl_lihat_mlite_triase"); - let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); - let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); - let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); - const new_workbook = XLSX.utils.book_new(); - XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data mlite_triase"); - XLSX.writeFile(new_workbook, 'tmp_file.xls'); - }) -}); \ No newline at end of file diff --git a/plugins/triase/view/admin/detail.html b/plugins/triase/view/admin/detail.html deleted file mode 100644 index 090886887..000000000 --- a/plugins/triase/view/admin/detail.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - \ No newline at end of file diff --git a/plugins/triase/view/admin/manage.html b/plugins/triase/view/admin/manage.html deleted file mode 100644 index 82a7be5a6..000000000 --- a/plugins/triase/view/admin/manage.html +++ /dev/null @@ -1,409 +0,0 @@ - -
                  -
                  -
                  -
                  -

                  Kelola

                  -
                  -
                  -
                  -
                  -
                  - - - - -
                  - - -
                  -
                  -
                  -
                  -
                  - Cari : - - - - - - - -
                  -
                  -
                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                  No RawatTgl KunjunganCara MasukAlat TransportasiAlasan KedatanganKeterangan KedatanganMacam KasusTekanan DarahNadiPernapasanSuhuSaturasi O2NyeriJenis TriaseKeluhan UtamaKebutuhan KhususCatatanPlanNik
                  -
                  -
                  -
                  -
                  -
                  - - - - - - - - \ No newline at end of file diff --git a/plugins/users/Admin.php b/plugins/users/Admin.php index 2e0af7f0c..b6634136d 100644 --- a/plugins/users/Admin.php +++ b/plugins/users/Admin.php @@ -23,7 +23,111 @@ public function getIndex() ['name' => 'Data Pengguna', 'url' => url([ADMIN, 'users', 'manage']), 'icon' => 'users', 'desc' => 'Data pengguna'], ['name' => 'Tambah Baru', 'url' => url([ADMIN, 'users', 'add']), 'icon' => 'user-plus', 'desc' => 'Tambah pengguna baru'], ]; - return $this->draw('index.html', ['sub_modules' => $sub_modules]); + return $this->draw('index.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); + } + + public function apiSave() + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_write', 'users')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + $input = json_decode(file_get_contents('php://input'), true); + if (!is_array($input)) $input = $_POST; + + $_POST = $input; + + $id = isset($_POST['id']) ? $_POST['id'] : null; + + // admin + if ($id == 1) { + $_POST['access'] = 'all'; + } + + // check if required fields are empty + if (empty($_POST['username']) || empty($_POST['email'])) { + return ['status' => 'error', 'message' => 'Username dan Email wajib diisi.']; + } + + // check if user already exists + if($id == null) { + if ($this->_userAlreadyExists($_POST['username'])) { + return ['status' => 'error', 'message' => 'Pengguna sudah terdaftar.']; + } + } + + // chech if e-mail adress is correct + $_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); + if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { + return ['status' => 'error', 'message' => 'Email salah.']; + } + // check if password is longer than 5 characters + if (isset($_POST['password']) && !empty($_POST['password']) && strlen($_POST['password']) < 8) { + return ['status' => 'error', 'message' => 'Password terlalu pendek. Minimal 8 karakter.']; + } + + // access and cap are already strings from frontend + if (!isset($_POST['access'])) $_POST['access'] = 'dashboard'; + if (!isset($_POST['cap'])) $_POST['cap'] = ''; + $_POST['role'] = $this->_normalizeRoleInput($_POST['role'] ?? []); + + unset($_POST['save']); + unset($_POST['status']); // mlite_users table does not have status column + unset($_POST['password_confirmation']); + + if (!empty($_POST['password'])) { + $_POST['password'] = password_hash($_POST['password'], PASSWORD_BCRYPT); + } else { + unset($_POST['password']); + } + + if (!$id) { // new + try { + $query = $this->db('mlite_users')->save($_POST); + } catch (\Exception $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } else { // edit + try { + $query = $this->db('mlite_users')->where('id', $id)->save($_POST); + } catch (\Exception $e) { + return ['status' => 'error', 'message' => $e->getMessage()]; + } + } + + if ($query) { + return ['status' => 'success', 'message' => 'Pengguna berhasil disimpan.']; + } else { + return ['status' => 'error', 'message' => 'Gagal menyimpan pengguna.']; + } + } + + public function apiDelete($id = null) + { + $username = $this->core->checkAuth('POST'); + if (!$this->core->checkPermission($username, 'can_write', 'users')) { + return ['status' => 'error', 'message' => 'Invalid User Permission Credentials']; + } + if (!$id) { + $input = json_decode(file_get_contents('php://input'), true); + $id = isset($input['id']) ? $input['id'] : null; + } + + if (!$id) { + return ['status' => 'error', 'message' => 'ID tidak ditemukan.']; + } + + if ($id != 1 && $this->core->getUserInfo('id') != $id && ($user = $this->db('mlite_users')->oneArray($id))) { + if ($this->db('mlite_users')->delete($id)) { + if (is_array($user) && !empty($user['avatar'])) { + @unlink(UPLOADS."/users/".$user['avatar']); + } + return ['status' => 'success', 'message' => 'Pengguna berhasil dihapus.']; + } else { + return ['status' => 'error', 'message' => 'Tidak dapat menghapus pengguna.']; + } + } + return ['status' => 'error', 'message' => 'Tidak diizinkan menghapus pengguna ini.']; } /** @@ -36,7 +140,9 @@ public function getManage() if (empty($row['fullname'])) { $row['fullname'] = '----'; } + $row['role'] = implode(', ', $this->_parseRoles($row['role'] ?? '')); $row['editURL'] = url([ADMIN, 'users', 'edit', $row['id']]); + $row['permURL'] = url([ADMIN, 'users', 'permission', $row['id']]); $row['delURL'] = url([ADMIN, 'users', 'delete', $row['id']]); } $this->core->addCSS(url('assets/css/dataTables.bootstrap.min.css')); @@ -54,12 +160,12 @@ public function getAdd() if($this->db('mlite_modules')->where('dir', 'kepegawaian')->oneArray()) { $this->_addInfoUser(); } - $this->_getInfoRole(); if (!empty($redirectData = getRedirectData())) { - $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_STRING); + $this->assign['form'] = $redirectData; } else { $this->assign['form'] = ['username' => '', 'email' => '', 'fullname' => '', 'description' => '', 'role' => '', 'cap' => '']; } + $this->_getInfoRole($this->assign['form']['role'] ?? ''); $this->assign['title'] = 'Pengguna baru'; $this->assign['modules'] = $this->_getModules('all'); @@ -68,8 +174,9 @@ public function getAdd() $this->assign['cap'] = $this->_getInfoCap(); } $this->assign['avatarURL'] = url(MODULES.'/users/img/default.png'); + $this->assign['usersForCopy'] = $this->_getUsersForCopy(); - return $this->draw('form.html', ['users' => $this->assign]); + return $this->draw('form.html', ['users' => htmlspecialchars_array($this->assign)]); } /** @@ -80,20 +187,21 @@ public function getEdit($id) if($this->db('mlite_modules')->where('dir', 'kepegawaian')->oneArray()) { $this->_addInfoUser(); } - $this->_getInfoRole(); $user = $this->db('mlite_users')->oneArray($id); - if (!empty($user)) { + if (!empty($user) && is_array($user)) { $this->assign['form'] = $user; + $this->_getInfoRole($user['role'] ?? ''); $this->assign['title'] = 'Sunting pengguna'; - $this->assign['modules'] = $this->_getModules($user['access']); + $this->assign['modules'] = $this->_getModules(isset($user['access']) ? $user['access'] : null); $this->assign['cap'] = []; if($this->db('mlite_modules')->where('dir', 'kepegawaian')->oneArray()) { - $this->assign['cap'] = $this->_getInfoCap($user['cap']); + $this->assign['cap'] = $this->_getInfoCap(isset($user['cap']) ? $user['cap'] : null); } - $this->assign['avatarURL'] = url(UPLOADS.'/users/'.$user['avatar']); + $this->assign['avatarURL'] = url(UPLOADS.'/users/'.(isset($user['avatar']) ? $user['avatar'] : 'default.png')); + $this->assign['usersForCopy'] = $this->_getUsersForCopy(); - return $this->draw('form.html', ['users' => $this->assign]); + return $this->draw('form.html', ['users' => htmlspecialchars_array($this->assign)]); } else { redirect(url([ADMIN, 'users', 'manage'])); } @@ -125,10 +233,13 @@ public function postSave($id = null) } // check if user already exists - if ($this->_userAlreadyExists($id)) { + if($id == null) { + if ($this->_userAlreadyExists($_POST['username'])) { $errors++; $this->notify('failure', 'Pengguna sudah terdaftar.'); + } } + // chech if e-mail adress is correct $_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { @@ -140,6 +251,7 @@ public function postSave($id = null) $errors++; $this->notify('failure', 'Password terlalu pendek. Minimal 8 karakter serta memuat kombinasi huruf besar, huruf kecil, angka, dan karakter khusus '); } + $_POST['role'] = $this->_normalizeRoleInput($_POST['role'] ?? []); // access to modules if ((count($_POST['access']) == count($this->_getModules())) || ($id == 1)) { $_POST['access'] = 'all'; @@ -195,7 +307,7 @@ public function postSave($id = null) if ($query) { if (isset($img) && $img->getInfos('width')) { - if (isset($user)) { + if (isset($user) && is_array($user) && !empty($user['avatar'])) { unlink(UPLOADS."/users/".$user['avatar']); } @@ -220,7 +332,7 @@ public function getDelete($id) { if ($id != 1 && $this->core->getUserInfo('id') != $id && ($user = $this->db('mlite_users')->oneArray($id))) { if ($this->db('mlite_users')->delete($id)) { - if (!empty($user['avatar'])) { + if (is_array($user) && !empty($user['avatar'])) { unlink(UPLOADS."/users/".$user['avatar']); } @@ -232,6 +344,95 @@ public function getDelete($id) redirect(url([ADMIN, 'users', 'manage'])); } + /** + * manage user permissions + */ + public function getPermission($id) + { + $user = $this->db('mlite_users')->oneArray($id); + if (!$user) { + redirect(url([ADMIN, 'users', 'manage'])); + } + + $modules = $this->db('mlite_modules')->toArray(); + $permissions = []; + + foreach ($modules as $module) { + $dir = $module['dir']; + $details = $this->core->getModuleInfo($dir); + $name = isset($details['name']) ? $details['name'] : $dir; + + $existing = $this->db('mlite_crud_permissions') + ->where('user', $user['username']) + ->where('module', $dir) + ->oneArray(); + + if (!$existing) { + $existing = [ + 'can_create' => 'true', + 'can_read' => 'true', + 'can_update' => 'true', + 'can_delete' => 'true' + ]; + } + + $permissions[] = [ + 'dir' => $dir, + 'name' => $name, + 'can_create' => $existing['can_create'] == 'true', + 'can_read' => $existing['can_read'] == 'true', + 'can_update' => $existing['can_update'] == 'true', + 'can_delete' => $existing['can_delete'] == 'true', + ]; + } + + return $this->draw('permission.html', ['user' => $user, 'permissions' => $permissions]); + } + + /** + * save user permissions + */ + public function postSavePermission($id) + { + $user = $this->db('mlite_users')->oneArray($id); + if (!$user) { + redirect(url([ADMIN, 'users', 'manage'])); + } + + $modules = $this->db('mlite_modules')->toArray(); + foreach ($modules as $module) { + $dir = $module['dir']; + + $can_create = isset($_POST['permissions'][$dir]['can_create']) ? 'true' : 'false'; + $can_read = isset($_POST['permissions'][$dir]['can_read']) ? 'true' : 'false'; + $can_update = isset($_POST['permissions'][$dir]['can_update']) ? 'true' : 'false'; + $can_delete = isset($_POST['permissions'][$dir]['can_delete']) ? 'true' : 'false'; + + $existing = $this->db('mlite_crud_permissions') + ->where('user', $user['username']) + ->where('module', $dir) + ->oneArray(); + + $data = [ + 'user' => $user['username'], + 'module' => $dir, + 'can_create' => $can_create, + 'can_read' => $can_read, + 'can_update' => $can_update, + 'can_delete' => $can_delete + ]; + + if ($existing) { + $this->db('mlite_crud_permissions')->where('id', $existing['id'])->save($data); + } else { + $this->db('mlite_crud_permissions')->save($data); + } + } + + $this->notify('success', 'Hak akses pengguna berhasil disimpan.'); + redirect(url([ADMIN, 'users', 'permission', $id])); + } + private function _addInfoUser() { // get users $rows = $this->db('pegawai')->where('stts_aktif', '!=', 'KELUAR')->toArray(); @@ -244,25 +445,75 @@ private function _addInfoUser() { } } + /** + * Get users with access for copy functionality + * @return array + */ + private function _getUsersForCopy() { + $users = $this->db('mlite_users') + ->select('id, username, fullname, access') + ->where('id', '!=', 1) // Exclude admin user + ->toArray(); + + // Filter out empty or null access + $filteredUsers = array_filter($users, function($user) { + return !empty($user['access']) && $user['access'] !== 'dashboard'; + }); + + return array_values($filteredUsers); + } + /** * list of active user roles * @return array */ - private function _getInfoRole() { + private function _getInfoRole($selectedRoles = null) { $role = array('pengguna','kasir','rekammedis','radiologi','laboratorium','paramedis','apoteker','medis','manajemen','admin'); + $selectedRoles = $this->_parseRoles($selectedRoles); if (count($role)) { $this->assign['role'] = []; foreach($role as $row) { - $this->assign['role'][] = $row; + $this->assign['role'][] = [ + 'name' => $row, + 'attr' => in_array($row, $selectedRoles, true) ? 'selected' : '' + ]; } } } + private function _parseRoles($roleValue): array + { + if (is_array($roleValue)) { + return array_values(array_filter(array_map('trim', $roleValue))); + } + + if (!is_string($roleValue) || trim($roleValue) === '') { + return []; + } + + $decoded = json_decode($roleValue, true); + if (is_array($decoded)) { + return array_values(array_filter(array_map('trim', $decoded))); + } + + return array_values(array_filter(array_map('trim', explode(',', $roleValue)))); + } + + private function _normalizeRoleInput($roleInput): string + { + $roles = $this->_parseRoles($roleInput); + if (empty($roles)) { + return ''; + } + + return implode(',', array_values(array_unique($roles))); + } + private function _getInfoCap($kd_poli = null) { $result = []; - $rows = $this->db()->pdo()->prepare("(SELECT kd_poli AS cap, nm_poli AS nm_cap FROM poliklinik) UNION (SELECT kd_bangsal AS cap, nm_bangsal AS nm_cap FROM bangsal)"); + $rows = $this->db()->pdo()->prepare("SELECT kd_poli AS cap, nm_poli AS nm_cap FROM poliklinik UNION SELECT kd_bangsal AS cap, nm_bangsal AS nm_cap FROM bangsal"); $rows->execute(); $rows = $rows->fetchAll(); @@ -273,16 +524,19 @@ private function _getInfoCap($kd_poli = null) } foreach ($rows as $row) { - if (empty($kd_poliArray)) { - $attr = ''; - } else { - if (in_array($row['cap'], $kd_poliArray)) { - $attr = 'selected'; - } else { + // Check if $row is valid array before accessing its elements + if ($row && is_array($row) && isset($row['cap']) && isset($row['nm_cap'])) { + if (empty($kd_poliArray)) { $attr = ''; + } else { + if (in_array($row['cap'], $kd_poliArray)) { + $attr = 'selected'; + } else { + $attr = ''; + } } + $result[] = ['cap' => $row['cap'], 'nm_cap' => $row['nm_cap'], 'attr' => $attr]; } - $result[] = ['cap' => $row['cap'], 'nm_cap' => $row['nm_cap'], 'attr' => $attr]; } return $result; } @@ -306,16 +560,24 @@ private function _getModules($access = null) if ($row['dir'] != 'dashboard') { $details = $this->core->getModuleInfo($row['dir']); - if (empty($accessArray)) { - $attr = ''; - } else { - if (in_array($row['dir'], $accessArray) || ($accessArray[0] == 'all')) { - $attr = 'selected'; - } else { + // Check if $details is valid array before accessing its elements + if ($details && is_array($details)) { + if (empty($accessArray)) { $attr = ''; + } else { + if (in_array($row['dir'], $accessArray) || (isset($accessArray[0]) && $accessArray[0] == 'all')) { + $attr = 'selected'; + } else { + $attr = ''; + } } + $result[] = [ + 'dir' => $row['dir'], + 'name' => isset($details['name']) ? $details['name'] : $row['dir'], + 'icon' => isset($details['icon']) ? $details['icon'] : 'folder', + 'attr' => $attr + ]; } - $result[] = ['dir' => $row['dir'], 'name' => $details['name'], 'icon' => $details['icon'], 'attr' => $attr]; } } return $result; @@ -325,13 +587,9 @@ private function _getModules($access = null) * check if user already exists * @return array */ - private function _userAlreadyExists($id = null) + private function _userAlreadyExists($username) { - if (!$id) { // new - $count = $this->db('mlite_users')->where('username', $_POST['username'])->count(); - } else { // edit - $count = $this->db('mlite_users')->where('username', $_POST['username'])->where('id', '<>', $id)->count(); - } + $count = $this->db('mlite_users')->where('username', $username)->count(); if ($count > 0) { return true; } else { diff --git a/plugins/users/Help.md b/plugins/users/Help.md deleted file mode 100644 index db2d98023..000000000 --- a/plugins/users/Help.md +++ /dev/null @@ -1,3 +0,0 @@ -
                  - -
                  diff --git a/plugins/users/Info.php b/plugins/users/Info.php index afc192edd..e554a302a 100644 --- a/plugins/users/Info.php +++ b/plugins/users/Info.php @@ -4,8 +4,9 @@ 'name' => 'Pengguna', 'description' => 'Pengelolaan pengguna', 'author' => 'Basoro.ID', + 'category' => 'main', 'version' => '1.1', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'user', 'pages' => ['Login' => 'login'], diff --git a/plugins/users/README.md b/plugins/users/README.md new file mode 100644 index 000000000..ea86389ed --- /dev/null +++ b/plugins/users/README.md @@ -0,0 +1,58 @@ +# Plugin Pengguna + +Dokumentasi singkat penggunaan modul **Pengguna** di mLITE untuk pengelolaan akun, hak akses, dan peran pengguna sistem. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **Pengguna**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Data Pengguna + - Tambah Baru + +## Panduan Pengguna (Petugas) + +Modul ini umumnya hanya diakses oleh admin. Petugas dengan hak akses terbatas dapat: + +1. **Melihat Daftar Pengguna** + - Buka submenu **Data Pengguna** untuk melihat seluruh akun yang terdaftar. + - Tabel menampilkan username, nama lengkap, email, dan aksi (edit, hak akses, hapus). + +2. **Mengubah Data Sendiri** + - Pengguna dapat mengubah data pribadi melalui menu edit akun masing-masing. + - Password minimal 8 karakter (wajib mengandung kombinasi huruf besar, huruf kecil, angka, dan karakter khusus). + +## Panduan Admin + +1. **Tambah Pengguna Baru** + - Buka submenu **Tambah Baru**. + - Isi **username** (unik), **email** (valid), **nama lengkap**, **deskripsi**, dan **password** (minimal 8 karakter). + - Pilih **Role** pengguna: `pengguna`, `kasir`, `rekammedis`, `radiologi`, `laboratorium`, `paramedis`, `apoteker`, `medis`, `manajemen`, atau `admin`. + - Centang modul-modul yang dapat diakses pengguna ini, atau biarkan semua tercentang untuk akses penuh. + - Jika modul kepegawaian aktif, pilih **Cap** (poliklinik/bangsal) untuk membatasi akses per unit. + - Unggah foto avatar (opsional; akan di-crop otomatis menjadi persegi 512×512 px). + - Klik **Simpan**. + +2. **Edit Pengguna** + - Dari **Data Pengguna**, klik tombol **Edit** pada baris pengguna yang dituju. + - Ubah data yang diperlukan; kosongkan field password jika tidak ingin menggantinya. + - Fitur **Salin Hak Akses** tersedia untuk menyalin konfigurasi akses modul dari pengguna lain. + +3. **Hak Akses CRUD per Modul** + - Klik tombol **Hak Akses** pada baris pengguna di tabel Data Pengguna. + - Atur izin **Buat (Create)**, **Baca (Read)**, **Ubah (Update)**, dan **Hapus (Delete)** untuk setiap modul yang terpasang. + - Klik **Simpan** untuk menerapkan perubahan hak akses. + +4. **Hapus Pengguna** + - Klik tombol **Hapus** pada baris pengguna. + - Akun admin (ID=1) dan akun yang sedang login tidak dapat dihapus. + - Avatar pengguna akan ikut dihapus dari server secara otomatis. + +## Catatan + +- Username bersifat unik; sistem menolak pendaftaran dengan username yang sudah ada. +- Pengguna dengan akses `all` dapat mengakses seluruh modul yang terpasang. +- Hak akses CRUD diatur secara terpisah dari hak akses modul; keduanya perlu dikonfigurasi untuk kendali akses yang lengkap. +- Pengguna yang sedang login tidak dapat menghapus akunnya sendiri. +- Jika modul kepegawaian aktif, pengguna dapat dikaitkan ke data pegawai untuk pembatasan akses per poliklinik atau bangsal. diff --git a/plugins/icd_10/css/admin/styles.css b/plugins/users/css/admin/styles.css similarity index 78% rename from plugins/icd_10/css/admin/styles.css rename to plugins/users/css/admin/styles.css index 2f2d21ac1..086770133 100644 --- a/plugins/icd_10/css/admin/styles.css +++ b/plugins/users/css/admin/styles.css @@ -1,4 +1,4 @@ -#tbl_penyakit th, #tbl_penyakit td, #forTable_penyakit th, #forTable_penyakit td { +#tbl_mlite_users th, #tbl_mlite_users td, #forTable_mlite_users th, #forTable_mlite_users td { white-space: nowrap; } .dataTables_wrapper th, .dataTables_wrapper td { diff --git a/plugins/users/js/admin/scripts.js b/plugins/users/js/admin/scripts.js new file mode 100644 index 000000000..7d6a1564b --- /dev/null +++ b/plugins/users/js/admin/scripts.js @@ -0,0 +1,511 @@ +jQuery().ready(function () { + var var_tbl_mlite_users = $('#tbl_mlite_users').DataTable({ + 'processing': true, + 'serverSide': true, + 'serverMethod': 'post', + 'dom': 'Bfrtip', + 'searching': false, + 'select': true, + 'colReorder': true, + "bInfo" : false, + "ajax": { + "url": "{?=url([ADMIN,'users','data'])?}", + "dataType": "json", + "type": "POST", + "data": function (data) { + + // Read values + var search_field_mlite_users = $('#search_field_mlite_users').val(); + var search_text_mlite_users = $('#search_text_mlite_users').val(); + + data.search_field_mlite_users = search_field_mlite_users; + data.search_text_mlite_users = search_text_mlite_users; + + } + }, + "columns": [ +{ 'data': 'id' }, +{ 'data': 'username' }, +{ 'data': 'fullname' }, +{ 'data': 'description' }, +// { 'data': 'password' }, +{ 'data': 'avatar' }, +{ 'data': 'email' }, +{ 'data': 'role' }, +{ 'data': 'cap' }, +{ 'data': 'access' } + + ], + "columnDefs": [ +{ 'targets': 0}, +{ 'targets': 1}, +{ 'targets': 2}, +{ 'targets': 3}, +{ 'targets': 4}, +{ 'targets': 5}, +{ 'targets': 6}, +{ 'targets': 7}, +{ 'targets': 8}, +// { 'targets': 9} + + ], + buttons: [], + "scrollCollapse": true, + // "scrollY": '48vh', + "pageLength":'25', + "lengthChange": true, + "scrollX": true, + dom: "<'row'<'col-sm-12'tr>><<'pmd-datatable-pagination' l i p>>" + }); + + // Configure long press + let longPressTimer; + let longPressDelay = 500; // milliseconds + + // Context menu configuration + $.contextMenu({ + selector: '#tbl_mlite_users tbody tr', + trigger: 'right', // for right-click + events: { + show: function(options) { + // Highlight the selected row + $(this).addClass('selected'); + }, + hide: function(options) { + // Remove highlight + $(this).removeClass('selected'); + } + }, + callback: function(key, options) { + // Get the data from the selected row + let table = $('#tbl_mlite_users').DataTable(); + let data = table.row(this).data(); + + // Handle menu actions + switch(key) { + case "individual_menu": + individual_menu(data); + break; + } + }, + items: { + "individual_menu": {name: "Individual Menu", icon: "fa-edit"} + } + }); + + // Add touch support for mobile devices + $('#tbl_mlite_users tbody').on('touchstart', 'tr', function(e) { + let row = $(this); + longPressTimer = setTimeout(function() { + // Trigger context menu + row.contextMenu({x: e.originalEvent.touches[0].pageX, y: e.originalEvent.touches[0].pageY}); + }, longPressDelay); + }).on('touchend touchcancel', 'tr', function() { + // Clear timer if touch ends before longpress delay + clearTimeout(longPressTimer); + }); + + // ============================================================== + // FORM VALIDASI + // ============================================================== + + $("form[name='form_mlite_users']").validate({ + rules: { +id: 'required', +username: 'required', +fullname: 'required', +description: 'required', +password: 'required', +avatar: 'required', +email: 'required', +role: 'required', +cap: 'required', +access: 'required' + + }, + messages: { +id:'id tidak boleh kosong!', +username:'username tidak boleh kosong!', +fullname:'fullname tidak boleh kosong!', +description:'description tidak boleh kosong!', +password:'password tidak boleh kosong!', +avatar:'avatar tidak boleh kosong!', +email:'email tidak boleh kosong!', +role:'role tidak boleh kosong!', +cap:'cap tidak boleh kosong!', +access:'access tidak boleh kosong!' + + }, + submitHandler: function (form) { + var id= $('#id').val(); +var username= $('#username').val(); +var fullname= $('#fullname').val(); +var description= $('#description').val(); +var password= $('#password').val(); +var avatar= $('#avatar').val(); +var email= $('#email').val(); +var role= $('#role').val(); +var cap= $('#cap').val(); +var access= $('#access').val(); + + var typeact = $('#typeact').val(); + + var formData = new FormData(form); // tambahan + formData.append('typeact', typeact); // tambahan + + $.ajax({ + url: "{?=url([ADMIN,'users','aksi'])?}", + method: "POST", + contentType: false, // tambahan + processData: false, // tambahan + data: formData, + success: function (data) { + try { + data = JSON.parse(data); + var audio = new Audio('{?=url()?}/assets/sound/' + data.status + '.mp3'); + audio.play(); + if (data.status === "success") { + bootbox.alert(data.message); + $("#modal_mlite_users").modal('hide'); + var_tbl_mlite_users.draw(); + } else { + bootbox.alert("Gagal: " + data.message); + } + } catch (e) { + bootbox.alert("Terjadi kesalahan saat memproses respons server."); + } + } + }) + } + }); + + // ============================================================== + // CLICK ICON SEARCH DI INPUT SEARCH + // ============================================================== + $("#search_mlite_users").click(function () { + var_tbl_mlite_users.draw(); + }); + + // =========================================== + // Ketika tombol Edit di tekan + // =========================================== + + $("#edit_data_mlite_users").click(function () { + var rowData = var_tbl_mlite_users.rows({ selected: true }).data()[0]; + if (rowData != null) { + + var id = rowData['id']; +var username = rowData['username']; +var fullname = rowData['fullname']; +var description = rowData['description']; +var password = rowData['password']; +var avatar = rowData['avatar']; +var email = rowData['email']; +var role = rowData['role']; +var cap = rowData['cap']; +var access = rowData['access']; + + + + $("#typeact").val("edit"); + + $('#id').val(id); +$('#username').val(username); +$('#fullname').val(fullname); +$('#description').val(description); +$('#password').val(password); +$('#avatar').val(avatar); +$('#email').val(email); +$('#role').val(role); +$('#cap').val(cap); +$('#access').val(access); + + $("#id").prop('readonly', true); // GA BISA DIEDIT KALAU READONLY + $('#modal-title').text("Edit Data Users"); + $("#modal_mlite_users").modal(); + } + else { + alert("Silakan pilih data yang akan di edit."); + } + + }); + + // ============================================================== + // TOMBOL DELETE DI CLICK + // ============================================================== + jQuery("#hapus_data_mlite_users").click(function () { + var rowData = var_tbl_mlite_users.rows({ selected: true }).data()[0]; + + + if (rowData) { +var id = rowData['id']; + bootbox.confirm("Anda yakin akan menghapus data dengan id = " + id + "?", function(result) { + if (result) { + $.ajax({ + url: "{?=url([ADMIN,'users','aksi'])?}", + method: "POST", + data: { + id: id, + typeact: 'del' + }, + success: function (data) { + try { + data = JSON.parse(data); + var audio = new Audio('{?=url()?}/assets/sound/' + data.status + '.mp3'); + audio.play(); + bootbox.alert(data.message); + if(data.status === 'success') { + var_tbl_mlite_users.draw(); + } + } catch (e) { + bootbox.alert("Terjadi kesalahan saat menghapus."); + } + }, + error: function () { + bootbox.alert("Gagal terhubung ke server."); + } + }); + } + }); + } + else { + bootbox.alert("Pilih satu baris untuk dihapus"); + } + }); + + // ============================================================== + // TOMBOL TAMBAH DATA DI CLICK + // ============================================================== + + if(window.location.search.indexOf('no_rawat') !== -1) { + let searchParams = new URLSearchParams(window.location.search) + $('#search_text_mlite_users').val(searchParams.get('no_rawat')); + var_tbl_mlite_users.draw(); + if(searchParams.get('modal') == 'true') { + $("#modal_mlite_users").modal(); + $('#no_rawat').val(searchParams.get('no_rawat')); + } + } + + jQuery("#tambah_data_mlite_users").click(function () { + + $('#id').val(''); +$('#username').val(''); +$('#fullname').val(''); +$('#description').val(''); +$('#password').val(''); +$('#avatar').val(''); +$('#email').val(''); +$('#role').val(''); +$('#cap').val(''); +$('#access').val(''); + + + if(window.location.search.indexOf('no_rawat') !== -1) { + $('#no_rawat').val(searchParams.get('no_rawat')); + } + + $("#typeact").val("add"); + $("#id").prop('disabled', false); + + $('#modal-title').text("Tambah Data Users"); + $("#modal_mlite_users").modal(); + }); + + // =========================================== + // Ketika tombol lihat data di tekan + // =========================================== + $("#lihat_data_mlite_users").click(function () { + + var search_field_mlite_users = $('#search_field_mlite_users').val(); + var search_text_mlite_users = $('#search_text_mlite_users').val(); + + $.ajax({ + url: "{?=url([ADMIN,'users','aksi'])?}", + method: "POST", + data: { + typeact: 'lihat', + search_field_mlite_users: search_field_mlite_users, + search_text_mlite_users: search_text_mlite_users + }, + dataType: 'json', + success: function (res) { + var eTable = "
                  "; + for (var i = 0; i < res.length; i++) { + eTable += ""; + eTable += ''; +eTable += ''; +eTable += ''; +eTable += ''; +// eTable += ''; +eTable += ''; +eTable += ''; +eTable += ''; +eTable += ''; +eTable += ''; + eTable += ""; + } + eTable += "
                  IdUsernameFullnameDescriptionAvatarEmailRoleCapAccess
                  ' + res[i]['id'] + '' + res[i]['username'] + '' + res[i]['fullname'] + '' + res[i]['description'] + '' + res[i]['password'] + '' + res[i]['avatar'] + '' + res[i]['email'] + '' + res[i]['role'] + '' + res[i]['cap'] + '' + res[i]['access'] + '
                  "; + $('#forTable_mlite_users').html(eTable); + } + }); + + $('#modal-title').text("Lihat Data"); + $("#modal_lihat_mlite_users").modal(); + }); + + // ============================================================== + // TOMBOL DETAIL mlite_users DI CLICK + // ============================================================== + jQuery("#lihat_detail_mlite_users").click(function (event) { + + var rowData = var_tbl_mlite_users.rows({ selected: true }).data()[0]; + + if (rowData) { +var id = rowData['id']; + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var loadURL = baseURL + '/users/detail/' + id + '?t=' + mlite.token; + + var modal = $('#modal_detail_mlite_users'); + var modalContent = $('#modal_detail_mlite_users .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + modalContent.load(loadURL); + }).modal(); + return false; + + } + else { + bootbox.alert("Pilih satu baris untuk detail"); + } + }); + + // =========================================== + // Ketika tombol export pdf di tekan + // =========================================== + $("#export_pdf").click(function () { + + var doc = new jsPDF('p', 'pt', 'A4'); /* pilih 'l' atau 'p' */ + var img = "{?=base64_encode(file_get_contents(url(ADMIN . '/' . $settings['logo'])))?}"; + doc.addImage(img, 'JPEG', 20, 10, 50, 50); + doc.setFontSize(20); + doc.text("{$settings.nama_instansi}", 80, 35, null, null, null); + doc.setFontSize(10); + doc.text("{$settings.alamat} - {$settings.kota} - {$settings.propinsi}", 80, 46, null, null, null); + doc.text("Telepon: {$settings.nomor_telepon} - Email: {$settings.email}", 80, 56, null, null, null); + doc.line(20,70,572,70,null); /* doc.line(20,70,820,70,null); --> Jika landscape */ + doc.line(20,72,572,72,null); /* doc.line(20,72,820,72,null); --> Jika landscape */ + doc.setFontSize(14); + doc.text("Tabel Data Mlite Users", 20, 95, null, null, null); + const totalPagesExp = "{total_pages_count_string}"; + doc.autoTable({ + html: '#tbl_lihat_mlite_users', + startY: 105, + margin: { + left: 20, + right: 20 + }, + styles: { + fontSize: 10, + cellPadding: 5 + }, + didDrawPage: data => { + let footerStr = "Page " + doc.internal.getNumberOfPages(); + if (typeof doc.putTotalPages === 'function') { + footerStr = footerStr + " of " + totalPagesExp; + } + doc.setFontSize(10); + doc.text(footerStr, data.settings.margin.left, doc.internal.pageSize.height - 10); + } + }); + if (typeof doc.putTotalPages === 'function') { + doc.putTotalPages(totalPagesExp); + } + // doc.save('table_data_mlite_users.pdf') + window.open(doc.output('bloburl'), '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); + + }) + + // =========================================== + // Ketika tombol export xlsx di tekan + // =========================================== + $("#export_xlsx").click(function () { + let tbl1 = document.getElementById("tbl_lihat_mlite_users"); + let worksheet_tmp1 = XLSX.utils.table_to_sheet(tbl1); + let a = XLSX.utils.sheet_to_json(worksheet_tmp1, { header: 1 }); + let worksheet1 = XLSX.utils.json_to_sheet(a, { skipHeader: true }); + const new_workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(new_workbook, worksheet1, "Data mlite_users"); + XLSX.writeFile(new_workbook, 'tmp_file.xls'); + }) + + // =========================================== + // Ketika tombol chart di tekan + // =========================================== + + $("#view_chart").click(function () { + var baseURL = mlite.url + '/' + mlite.admin; + window.open(baseURL + '/users/chart?t=' + mlite.token, '_blank',"toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes"); + }) + + $("form[name='form_mlite_users_menu']").validate({ + rules: { + id: 'required' }, + messages: { + id:'id tidak boleh kosong!' + }, + submitHandler: function (form) { + var id= $('#id').val(); + var typeact = $('#typeact').val(); + + var formData = new FormData(form); // tambahan + formData.append('typeact', typeact); // tambahan + + $.ajax({ + url: "{?=url([ADMIN,'users','aksimenu'])?}", + method: "POST", + contentType: false, // tambahan + processData: false, // tambahan + data: formData, + success: function (data) { + console.log(data); + data = JSON.parse(data); + var audio = new Audio('{?=url()?}/assets/sound/' + data.status + '.mp3'); + audio.play(); + if(data.status === 'success') { + bootbox.alert('Data menu individula dengan nama pengguna ' + data.msg + ' telah ditambahkan.'); + } else { + bootbox.alert('' + data.msg + ''); + } + } + }); + } + }); + +}); + +function individual_menu(rowData) { + if (rowData != null) { + var id = rowData['id']; + var baseURL = mlite.url + '/' + mlite.admin; + event.preventDefault(); + var loadURL = baseURL + '/users/menu/' + id + '?t=' + mlite.token; + window.location.href = loadURL; + return false; + + } + else { + alert("Silakan pilih data yang akan di edit."); + } +} + +// Avatar +var reader = new FileReader(); +reader.addEventListener("load", function() { + $("#avatar").attr('src', reader.result); +}, false); +$("input[name=fileToUpload]").change(function() { + reader.readAsDataURL(this.files[0]); +}); diff --git a/plugins/users/view/admin/form.html b/plugins/users/view/admin/form.html index 700355c23..c50511fde 100644 --- a/plugins/users/view/admin/form.html +++ b/plugins/users/view/admin/form.html @@ -2,64 +2,59 @@
                  -

                  {$users.title}

                  +

                  {?=isset_or($users.title)?}

                  {if: !empty($users.user)}
                  {else}
                  - +
                  {/if}
                  - +
                  - +
                  - +
                  - +
                  - - {loop: $users.role} - + {/loop} - {else} - - - {/if}
                  {if: !empty($users.cap)} @@ -67,19 +62,39 @@

                  {$users.title}

                  {/if}
                  - - -
                  + + + + +
                  @@ -106,4 +121,51 @@

                  {$users.title}

                  $(this).remove(); return false; }) + + // Tombol copy akses + $('#btnToggleCopyAccess').on('click', function() { + var copyForm = $('#copyAccessForm'); + var button = $(this); + + if (copyForm.is(':visible')) { + copyForm.slideUp(); + button.html(' Copy Akses'); + button.removeClass('btn-warning').addClass('btn-success'); + } else { + copyForm.slideDown(); + button.html(' Tutup Copy Akses'); + button.removeClass('btn-success').addClass('btn-warning'); + } + }); + + // Enable/disable Tombol Salin Akses + $('#copyAccessFromUser').on('change', function() { + var selectedValue = $(this).val(); + $('#btnCopyAccess').prop('disabled', !selectedValue); + }); + + // Copy access from selected user + $('#btnCopyAccess').on('click', function() { + var selectedOption = $('#copyAccessFromUser option:selected'); + var access = selectedOption.data('access'); + + if(access) { + $('#accessSelect option').prop('selected', false); + + // Check if access is 'all' - select all available modules + if(access.trim() === 'all') { + $('#accessSelect option').prop('selected', true); + } else { + // Normal case - select specific modules + var accessArray = access.split(','); + $.each(accessArray, function(index, value) { + $('#accessSelect option[value="' + value.trim() + '"]').prop('selected', true); + }); + } + + $('#accessSelect').trigger('change'); + + //alert('Akses berhasil disalin dari pengguna: ' + selectedOption.text()); + } + }); diff --git a/plugins/users/view/admin/index.html b/plugins/users/view/admin/index.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/users/view/admin/index.html +++ b/plugins/users/view/admin/index.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/users/view/admin/manage.html b/plugins/users/view/admin/manage.html index 004338047..7fe80e58c 100644 --- a/plugins/users/view/admin/manage.html +++ b/plugins/users/view/admin/manage.html @@ -21,17 +21,20 @@

                  Kelola Pengguna

                  {loop: $users} - {$value.username} - {$value.fullname} - {$value.email} - {$value.role} - {$value.cap} - {$value.access} + {?=isset_or($value.username)?} + {?=isset_or($value.fullname)?} + {?=isset_or($value.email)?} + {?=isset_or($value.role)?} + {?=isset_or($value.cap)?} + {?=isset_or($value.access)?} - + - + + + + diff --git a/plugins/users/view/admin/permission.html b/plugins/users/view/admin/permission.html new file mode 100644 index 000000000..de0a2bd20 --- /dev/null +++ b/plugins/users/view/admin/permission.html @@ -0,0 +1,49 @@ +
                  +
                  +
                  +
                  +

                  Hak Akses Pengguna: {?=isset_or($user.username)?}

                  +
                  +
                  + +
                  + + + + + + + + + + + + {loop: $permissions} + + + + + + + + {/loop} + +
                  ModulCreateReadUpdateDelete
                  {?=isset_or($value.name)?} + + + + + + + +
                  +
                  +
                  + + Kembali +
                  + +
                  +
                  +
                  +
                  diff --git a/plugins/users/view/login.html b/plugins/users/view/login.html index 5d899c971..4f982fe08 100644 --- a/plugins/users/view/login.html +++ b/plugins/users/view/login.html @@ -4,14 +4,14 @@ - {$mlite.nama_instansi} - - - + {?=isset_or($mlite.nama_instansi)?} + + + - + - + @@ -19,20 +19,20 @@ - + - - - - - - - - - - + + + + + + + + + + - + @@ -45,6 +45,19 @@
                  + {if: isset($_SESSION['mlite_otp_pending'])} +

                  Verifikasi WhatsApp OTP

                  +
                  +
                  +
                  + +
                  +
                  +
                  + + Batal (Login Ulang) +
                  + {else}
                  @@ -64,17 +77,18 @@
                  + {/if}
                  {if: $mlite.notify} -
                  {$mlite.notify.text}
                  +
                  {?=isset_or($mlite.notify.text)?}
                  {/if}
                  Made with by drg. F. Basoro. - {$mlite.powered}. + {?=isset_or($mlite.powered)?}.
                  @@ -82,7 +96,7 @@ if ("serviceWorker" in navigator) { window.addEventListener("load", () => { navigator.serviceWorker - .register("{$mlite.path}/service-worker.js") + .register("{?=isset_or($mlite.path)?}/service-worker.js") .then((swReg) => { console.log("Service Worker is registered", swReg); }) diff --git a/plugins/utd/Admin.php b/plugins/utd/Admin.php index b5d56876b..bc644a39d 100644 --- a/plugins/utd/Admin.php +++ b/plugins/utd/Admin.php @@ -26,17 +26,17 @@ public function getManage() ['name' => 'Stok Darah', 'url' => url([ADMIN, 'utd', 'stokdarah']), 'icon' => 'database', 'desc' => 'Data Donor'], ['name' => 'Komponen Darah', 'url' => url([ADMIN, 'utd', 'komponendarah']), 'icon' => 'clipboard', 'desc' => 'Komponen Donor'], ]; - return $this->draw('manage.html', ['sub_modules' => $sub_modules]); + return $this->draw('manage.html', ['sub_modules' => htmlspecialchars_array($sub_modules)]); } public function getPendonor() { $this->_addHeaderFiles(); $pendonor = $this->db('utd_pendonor') - ->join('propinsi', 'propinsi.kd_prop=utd_pendonor.kd_prop') - ->join('kabupaten', 'kabupaten.kd_kab=utd_pendonor.kd_kab') - ->join('kecamatan', 'kecamatan.kd_kec=utd_pendonor.kd_kec') - ->join('kelurahan', 'kelurahan.kd_kel=utd_pendonor.kd_kel') + ->leftJoin('propinsi', 'propinsi.kd_prop=utd_pendonor.kd_prop') + ->leftJoin('kabupaten', 'kabupaten.kd_kab=utd_pendonor.kd_kab') + ->leftJoin('kecamatan', 'kecamatan.kd_kec=utd_pendonor.kd_kec') + ->leftJoin('kelurahan', 'kelurahan.kd_kel=utd_pendonor.kd_kel') ->toArray(); return $this->draw('data.pendonor.html', [ 'pendonor' => $pendonor, @@ -112,7 +112,7 @@ public function postCetak() { $this->db()->pdo()->exec("DELETE FROM `mlite_temporary`"); $cari = $_POST['cari']; - $this->db()->pdo()->exec("INSERT INTO `mlite_temporary` ( + $stmt = $this->db()->pdo()->prepare("INSERT INTO `mlite_temporary` ( `temp1`, `temp2`, `temp3`, @@ -130,33 +130,43 @@ public function postCetak() ) SELECT * FROM `utd_pendonor` - WHERE (`no_pendonor` LIKE '%$cari%' OR `nama` LIKE '%$cari%' OR `alamat` LIKE '%$cari%') + WHERE (`no_pendonor` LIKE :cari OR `nama` LIKE :cari OR `alamat` LIKE :cari) "); - - $cetak = $this->db('mlite_temporary')->toArray(); - return $this->draw('cetak.utd.html', ['cetak' => $cetak]); + $stmt->execute([':cari' => "%$cari%"]); exit(); } public function getCetakPendonor() { - $mpdf = new \Mpdf\Mpdf([ - 'mode' => 'utf-8', - 'orientation' => 'L' - ]); + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'orientation' => 'L' + ]); + + $mpdf->SetHTMLHeader($this->core->setPrintHeader()); + $mpdf->SetHTMLFooter($this->core->setPrintFooter()); + + // ambil data yang sama + $cetak = $this->db('mlite_temporary')->toArray(); - $mpdf->SetHTMLHeader($this->core->setPrintHeader()); - $mpdf->SetHTMLFooter($this->core->setPrintFooter()); - - $url = url(ADMIN.'/tmp/cetak.utd.html'); - $html = file_get_contents($url); - $mpdf->WriteHTML($this->core->setPrintCss(),\Mpdf\HTMLParserMode::HEADER_CSS); - $mpdf->WriteHTML($html,\Mpdf\HTMLParserMode::HTML_BODY); + // inject ke template + $this->tpl->set('cetak', $cetak); - // Output a PDF file directly to the browser - $mpdf->Output(); - exit(); + // render HTML TANPA HTTP + $html = $this->draw('cetak.utd.html', ['cetak' => $cetak]); + $mpdf->WriteHTML( + $this->core->setPrintCss(), + \Mpdf\HTMLParserMode::HEADER_CSS + ); + + $mpdf->WriteHTML( + $html, + \Mpdf\HTMLParserMode::HTML_BODY + ); + + $mpdf->Output(); + exit; } public function getDonor() @@ -338,26 +348,49 @@ public function anyWilayah() public function getKartuDonor($no_pendonor) { - $pdf=new PDF_Code128('L', 'mm', array(59,98)); - $pdf->AddPage(); - $pdf->SetFont('Arial','',10); - $pdf->Code128(9,35,$no_pendonor,80,20); - $pdf->SetFont('Arial','B',16); - $pdf->SetXY(8,0); - $pdf->Cell(0,35,$no_pendonor); - $pdf->Output('kartudonor_'.$no_pendonor.'.pdf','I'); + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => [98, 59], // width x height (mm) + 'margin_left' => 5, + 'margin_right' => 5, + 'margin_top' => 5, + 'margin_bottom' => 5, + ]); + + $html = ' +
                  +
                  + KARTU DONOR +
                  + + + +
                  + '.$no_pendonor.' +
                  +
                  + '; + + $mpdf->WriteHTML($html); + $mpdf->Output('kartudonor_'.$no_pendonor.'.pdf', 'I'); + exit; } + public function setNoPendonor() { $date = date('Y-m-d'); - $last_no = $this->db()->pdo()->prepare("SELECT ifnull(MAX(CONVERT(RIGHT(no_pendonor,6),signed)),0) FROM utd_pendonor"); - $last_no->execute(); - $last_no = $last_no->fetch(); - if(empty($last_no[0])) { - $last_no[0] = '000000'; + $urut = $this->db('utd_pendonor') + ->nextRightNumber('no_pendonor', 6); + if(empty($urut)) { + $urut = '000000'; } - $next_no = sprintf('%06s', ($last_no[0] + 1)); + $next_no = sprintf('%06s', $urut); $next_no = 'UTD'.$next_no; return $next_no; diff --git a/plugins/utd/Info.php b/plugins/utd/Info.php index 5689e4a4b..bc71ae9e6 100644 --- a/plugins/utd/Info.php +++ b/plugins/utd/Info.php @@ -4,8 +4,9 @@ 'name' => 'UTD', 'description' => 'Modul unit transfusi darah untuk mLITE', 'author' => 'Basoro', + 'category' => 'layanan', 'version' => '1.0', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'heart', 'install' => function () use ($core) { }, diff --git a/plugins/utd/README.md b/plugins/utd/README.md new file mode 100644 index 000000000..8b71a094e --- /dev/null +++ b/plugins/utd/README.md @@ -0,0 +1,55 @@ +# Plugin UTD + +Dokumentasi singkat penggunaan modul **UTD** (Unit Transfusi Darah) di mLITE untuk pengelolaan pendonor, data donor, stok darah, dan komponen darah. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **UTD**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Data Pendonor + - Data Donor + - Stok Darah + - Komponen Darah + +## Panduan Pengguna (Petugas) + +1. **Data Pendonor** + - Buka submenu **Data Pendonor**. + - Klik **Tambah** untuk mendaftarkan pendonor baru; nomor pendonor dibuat otomatis dengan format `UTD000001`. + - Isi data lengkap: nama, alamat (dengan pencarian wilayah propinsi/kabupaten/kecamatan/kelurahan), golongan darah, tanggal lahir, dan data kontak. + - Klik **Simpan** untuk menyimpan, atau **Update** untuk mengubah data pendonor yang ada. + - Gunakan tombol **Kartu Donor** untuk mencetak kartu barcode pendonor (format PDF kartu nama 98×59 mm). + - Gunakan fitur **Cetak** untuk mencetak daftar pendonor ke PDF (orientasi landscape). + - Jika WA Gateway aktif, nomor pendonor dapat dikirim via WhatsApp. + +2. **Data Donor** + - Buka submenu **Data Donor**. + - Catat setiap kegiatan donor darah: pilih pendonor dari daftar, isi tanggal donor, golongan darah, volume, dan petugas yang bertugas. + - Klik **Simpan** untuk data baru atau **Update** untuk memperbarui. + - Hapus data donor dengan tombol **Hapus**. + +3. **Stok Darah** + - Buka submenu **Stok Darah**. + - Tambahkan kantong darah dengan mengisi nomor kantong, pilih komponen darah, golongan darah, tanggal ambil, dan tanggal kedaluwarsa. + - Gunakan **Update** untuk memperbarui status kantong yang sudah dipakai atau **Hapus** untuk menghapus. + +## Panduan Admin + +1. **Komponen Darah** + - Buka submenu **Komponen Darah**. + - Tambah komponen darah baru dengan mengisi kode dan nama komponen (misal: WB, PRC, FFP, TC). + - Klik **Simpan** untuk data baru atau **Update** untuk mengubah kode/nama komponen. + - Komponen darah ini digunakan sebagai referensi pada input Stok Darah. + +2. **Pencarian Wilayah** + - Pada form Data Pendonor, tersedia pencarian live (AJAX) untuk propinsi, kabupaten, kecamatan, dan kelurahan. + - Jika wilayah belum ada di database, sistem akan menambahkannya secara otomatis saat menyimpan data pendonor. + +## Catatan + +- Nomor pendonor dibuat otomatis oleh sistem dengan format `UTD` + 6 digit urut; tidak perlu diisi manual. +- Cetak daftar pendonor menggunakan tombol **Cetak** di halaman Data Pendonor; data yang dicetak difilter berdasarkan kata kunci pencarian. +- Stok darah perlu dipantau secara rutin untuk memastikan tidak ada kantong darah yang melewati tanggal kedaluwarsa. +- Integrasi dengan plugin **WA Gateway** memungkinkan pengiriman notifikasi WhatsApp kepada pendonor. diff --git a/plugins/utd/view/admin/cetak.utd.html b/plugins/utd/view/admin/cetak.utd.html index 10bb1d0c2..bba0b51ea 100644 --- a/plugins/utd/view/admin/cetak.utd.html +++ b/plugins/utd/view/admin/cetak.utd.html @@ -16,14 +16,14 @@

                  Data Pendonor

                  {loop: $cetak} - {$value.temp1} - {$value.temp2} - {$value.temp3} - {$value.temp4} - {$value.temp6} - {$value.temp7} - {$value.temp12} / {$value.temp13} - {$value.temp14} + {?=isset_or($value.temp1)?} + {?=isset_or($value.temp2)?} + {?=isset_or($value.temp3)?} + {?=isset_or($value.temp4)?} + {?=isset_or($value.temp6)?} + {?=isset_or($value.temp7)?} + {?=isset_or($value.temp12)?} / {?=isset_or($value.temp13)?} + {?=isset_or($value.temp14)?} {/loop} diff --git a/plugins/utd/view/admin/data.donor.html b/plugins/utd/view/admin/data.donor.html index fa3af6add..25028ae9b 100644 --- a/plugins/utd/view/admin/data.donor.html +++ b/plugins/utd/view/admin/data.donor.html @@ -32,7 +32,7 @@

                  @@ -101,7 +101,7 @@

                  @@ -172,7 +172,7 @@

                  @@ -229,43 +229,43 @@

                  {if: $donor} {loop: $donor} - {$value.no_donor} - {$value.nama} - {$value.no_pendonor} - {$value.no_telp} - {$value.tanggal} - {$value.dinas} - {$value.tensi} - {$value.no_bag} - {$value.jenis_bag} - {$value.jenis_donor} - {$value.tempat_aftap} - {$value.petugas_aftap} - {$value.hbsag} - {$value.hcv} - {$value.hiv} - {$value.spilis} - {$value.malaria} - {$value.petugas_u_saring} - {$value.status} + {?=isset_or($value.no_donor)?} + {?=isset_or($value.nama)?} + {?=isset_or($value.no_pendonor)?} + {?=isset_or($value.no_telp)?} + {?=isset_or($value.tanggal)?} + {?=isset_or($value.dinas)?} + {?=isset_or($value.tensi)?} + {?=isset_or($value.no_bag)?} + {?=isset_or($value.jenis_bag)?} + {?=isset_or($value.jenis_donor)?} + {?=isset_or($value.tempat_aftap)?} + {?=isset_or($value.petugas_aftap)?} + {?=isset_or($value.hbsag)?} + {?=isset_or($value.hcv)?} + {?=isset_or($value.hiv)?} + {?=isset_or($value.spilis)?} + {?=isset_or($value.malaria)?} + {?=isset_or($value.petugas_u_saring)?} + {?=isset_or($value.status)?} {/loop} {/if} diff --git a/plugins/utd/view/admin/komponen.darah.html b/plugins/utd/view/admin/komponen.darah.html index 3a2ed0780..49cc70328 100644 --- a/plugins/utd/view/admin/komponen.darah.html +++ b/plugins/utd/view/admin/komponen.darah.html @@ -92,25 +92,25 @@

                  {if: $komponendarah} {loop: $komponendarah} - {$value.kode} - {$value.nama} - {$value.lama} - {$value.jasa_sarana} - {$value.paket_bhp} - {$value.kso} - {$value.manajemen} - {$value.total} - {$value.pembatalan} + {?=isset_or($value.kode)?} + {?=isset_or($value.nama)?} + {?=isset_or($value.lama)?} + {?=isset_or($value.jasa_sarana)?} + {?=isset_or($value.paket_bhp)?} + {?=isset_or($value.kso)?} + {?=isset_or($value.manajemen)?} + {?=isset_or($value.total)?} + {?=isset_or($value.pembatalan)?} {/loop} {/if} diff --git a/plugins/utd/view/admin/manage.html b/plugins/utd/view/admin/manage.html index a2faeb1eb..bdf53d77c 100644 --- a/plugins/utd/view/admin/manage.html +++ b/plugins/utd/view/admin/manage.html @@ -4,14 +4,14 @@ {loop: $sub_modules}
                • diff --git a/plugins/utd/view/admin/stok.darah.html b/plugins/utd/view/admin/stok.darah.html index 3779c67af..0f23c3617 100644 --- a/plugins/utd/view/admin/stok.darah.html +++ b/plugins/utd/view/admin/stok.darah.html @@ -32,7 +32,7 @@

                  @@ -128,23 +128,23 @@

                  {if: $stokdarah} {loop: $stokdarah} - {$value.no_kantong} - {$value.kode_komponen} - {$value.golongan_darah} - {$value.resus} - {$value.tanggal_aftap} - {$value.tanggal_kadaluarsa} - {$value.asal_darah} - {$value.status} + {?=isset_or($value.no_kantong)?} + {?=isset_or($value.kode_komponen)?} + {?=isset_or($value.golongan_darah)?} + {?=isset_or($value.resus)?} + {?=isset_or($value.tanggal_aftap)?} + {?=isset_or($value.tanggal_kadaluarsa)?} + {?=isset_or($value.asal_darah)?} + {?=isset_or($value.status)?} {/loop} {/if} diff --git a/plugins/vclaim/Admin.php b/plugins/vclaim/Admin.php index ac7d31b1f..783a6d6e5 100644 --- a/plugins/vclaim/Admin.php +++ b/plugins/vclaim/Admin.php @@ -43,7 +43,7 @@ public function navigation() public function getManage() { $parsedown = new \Systems\Lib\Parsedown(); - $readme_file = MODULES . '/vclaim/Help.md'; + $readme_file = MODULES . '/vclaim/README.md'; $readme = $parsedown->text($this->tpl->noParse(file_get_contents($readme_file))); return $this->draw('manage.html', ['readme' => $readme]); } @@ -104,77 +104,130 @@ public function postSaveSEP() $_POST['nmppkpelayanan'] = $this->settings->get('settings.nama_instansi'); $_POST['sep_user'] = $this->core->getUserInfo('fullname', null, true); - $data = [ - 'request' => [ - 't_sep' => [ - 'noKartu' => $_POST['no_kartu'], - 'tglSep' => $_POST['tglsep'], - 'ppkPelayanan' => $_POST['kdppkpelayanan'], - 'jnsPelayanan' => $_POST['jnspelayanan'], - 'klsRawat' => [ - 'klsRawatHak' => $_POST['klsrawat'], - 'klsRawatNaik' => '', - 'pembiayaan' => '', - 'penanggungJawab' => '' - ], - 'noMR' => $_POST['nomr'], - 'rujukan' => [ - 'asalRujukan' => $_POST['asal_rujukan'], - 'tglRujukan' => $_POST['tglrujukan'], - 'noRujukan' => $_POST['norujukan'], - 'ppkRujukan' => $_POST['kdppkrujukan'] - ], - 'catatan' => $_POST['catatan'], - 'diagAwal' => $_POST['diagawal'], - 'poli' => [ - 'tujuan' => $_POST['kdpolitujuan'], - 'eksekutif' => $_POST['eksekutif'] - ], - 'cob' => [ - 'cob' => $_POST['cob'] - ], - 'katarak' => [ - 'katarak' => $_POST['katarak'] - ], - 'jaminan' => [ - 'lakaLantas' => $_POST['lakalantas'], - 'noLP' => $_POST['noLp'], - 'penjamin' => [ - 'tglKejadian' => $_POST['tglkkl'], - 'keterangan' => $_POST['keterangankkl'], - 'suplesi' => [ - 'suplesi' => $_POST['suplesi'], - 'noSepSuplesi' => $_POST['no_sep_suplesi'], - 'lokasiLaka' => [ - 'kdPropinsi' => $_POST['kdprop'], - 'kdKabupaten' => $_POST['kdkab'], - 'kdKecamatan' => $_POST['kdkec'] + #model + if (empty($_POST['no_sep'])) { + $data = [ + 'request' => [ + 't_sep' => [ + 'noKartu' => $_POST['no_kartu'], + 'tglSep' => $_POST['tglsep'], + 'ppkPelayanan' => $_POST['kdppkpelayanan'], + 'jnsPelayanan' => $_POST['jnspelayanan'], + 'klsRawat' => [ + 'klsRawatHak' => $_POST['klsrawat'], + 'klsRawatNaik' => '', + 'pembiayaan' => '', + 'penanggungJawab' => '' + ], + 'noMR' => $_POST['nomr'], + 'rujukan' => [ + 'asalRujukan' => $_POST['asal_rujukan'], + 'tglRujukan' => $_POST['tglrujukan'], + 'noRujukan' => $_POST['norujukan'], + 'ppkRujukan' => $_POST['kdppkrujukan'] + ], + 'catatan' => $_POST['catatan'], + 'diagAwal' => $_POST['diagawal'], + 'poli' => [ + 'tujuan' => $_POST['kdpolitujuan'], + 'eksekutif' => $_POST['eksekutif'] + ], + 'cob' => [ + 'cob' => $_POST['cob'] + ], + 'katarak' => [ + 'katarak' => $_POST['katarak'] + ], + 'jaminan' => [ + 'lakaLantas' => $_POST['lakalantas'], + 'noLP' => $_POST['noLp'], + 'penjamin' => [ + 'tglKejadian' => $_POST['tglkkl'], + 'keterangan' => $_POST['keterangankkl'], + 'suplesi' => [ + 'suplesi' => $_POST['suplesi'], + 'noSepSuplesi' => $_POST['no_sep_suplesi'], + 'lokasiLaka' => [ + 'kdPropinsi' => $_POST['kdprop'], + 'kdKabupaten' => $_POST['kdkab'], + 'kdKecamatan' => $_POST['kdkec'] + ] ] ] - ] - ], - 'tujuanKunj' => $_POST['tujuanKunj'], - 'flagProcedure' => $_POST['flagProcedure'], - 'kdPenunjang' => $_POST['kdPenunjang'], - 'assesmentPel' => $_POST['assesmentPel'], - 'skdp' => [ - 'noSurat' => $_POST['noskdp'], - 'kodeDPJP' => $_POST['kddpjp'] - ], - 'dpjpLayan' => $_POST['kddpjppelayanan'], - 'noTelp' => $_POST['notelep'], - 'user' => $_POST['sep_user'] + ], + 'tujuanKunj' => $_POST['tujuanKunj'], + 'flagProcedure' => $_POST['flagProcedure'], + 'kdPenunjang' => $_POST['kdPenunjang'], + 'assesmentPel' => $_POST['assesmentPel'], + 'skdp' => [ + 'noSurat' => $_POST['noskdp'], + 'kodeDPJP' => $_POST['kddpjp'] + ], + 'dpjpLayan' => $_POST['kddpjppelayanan'], + 'noTelp' => $_POST['notelep'], + 'user' => $_POST['sep_user'] + ] ] - ] - ]; + ]; + $url = $this->api_url . 'SEP/2.0/insert'; + } else { + $data = [ + 'request' => [ + 't_sep' => [ + 'noSep' => $_POST['no_sep'], + 'klsRawat' => [ + 'klsRawatHak' => $_POST['klsrawat'], + 'klsRawatNaik' => isset($_POST['klsnaik']) ? $_POST['klsnaik'] : '', + 'pembiayaan' => isset($_POST['pembiayaan']) ? $_POST['pembiayaan'] : '', + 'penanggungJawab' => isset($_POST['pjnaikkelas']) ? $_POST['pjnaikkelas'] : '' + ], + 'noMR' => $_POST['nomr'], + 'catatan' => $_POST['catatan'], + 'diagAwal' => $_POST['diagawal'], + 'poli' => [ + 'tujuan' => $_POST['kdpolitujuan'], + 'eksekutif' => $_POST['eksekutif'] + ], + 'cob' => [ + 'cob' => $_POST['cob'] + ], + 'katarak' => [ + 'katarak' => $_POST['katarak'] + ], + 'jaminan' => [ + 'lakaLantas' => $_POST['lakalantas'], + 'penjamin' => [ + 'tglKejadian' => $_POST['tglkkl'], + 'keterangan' => $_POST['keterangankkl'], + 'suplesi' => [ + 'suplesi' => $_POST['suplesi'], + 'noSepSuplesi' => $_POST['no_sep_suplesi'], + 'lokasiLaka' => [ + 'kdPropinsi' => $_POST['kdprop'], + 'kdKabupaten' => $_POST['kdkab'], + 'kdKecamatan' => $_POST['kdkec'] + ] + ] + ] + ], + 'dpjpLayan' => $_POST['kddpjppelayanan'], + 'noTelp' => $_POST['notelep'], + 'user' => $_POST['sep_user'] + ] + ] + ]; + $url = $this->api_url . 'SEP/2.0/update'; + } $data = json_encode($data); - - $url = $this->api_url . 'SEP/2.0/insert'; - $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + // echo $data; + if (empty($_POST['no_sep'])) { + $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } else { + $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + } $data = json_decode($output, true); - if ($data == NULL) { echo 'Koneksi ke server BPJS terputus. Silahkan ulangi beberapa saat lagi!'; @@ -190,8 +243,8 @@ public function postSaveSEP() if ($data != null) { $data = '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; @@ -267,7 +320,7 @@ public function postSaveSEP() 'prb' => $_POST['prolanis_prb'] ]); } - echo $_POST['sep_no_sep']; + echo htmlspecialchars($_POST['sep_no_sep'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } else { $simpan_sep = $this->db('bridging_sep_internal')->save([ 'no_sep' => $_POST['sep_no_sep'], @@ -329,7 +382,7 @@ public function postSaveSEP() 'prb' => $_POST['prolanis_prb'] ]); } - echo $_POST['sep_no_sep']; + echo htmlspecialchars($_POST['sep_no_sep']); } } else { echo '{ @@ -341,7 +394,7 @@ public function postSaveSEP() } } else { - echo $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); @@ -377,9 +430,9 @@ public function postHapusSEP() $hapus_sep = $this->db('bridging_sep')->where('no_sep', $_POST['no_sep'])->delete(); $hapus_sep_internal = $this->db('bridging_sep_internal')->where('no_sep', $_POST['no_sep'])->delete(); $hapus_prb = $this->db('bpjs_prb')->where('no_sep', $_POST['no_sep'])->delete(); - echo $data['metaData']['message'] . '!! Menghapus data SEP dengan nomor ' . $_POST['no_sep'] . '....'; + echo htmlspecialchars($data['metaData']['message'] . '!! Menghapus data SEP dengan nomor ' . $_POST['no_sep'] . '....', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } else { - echo $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -408,7 +461,7 @@ public function getCetakSEP($no_sep) $poliklinik = $this->db('poliklinik')->toArray(); $dokter = $this->db('dokter')->toArray(); - echo $this->draw('cetak.sep.html', ['data_sep' => $data_sep, 'poliklinik' => $poliklinik, 'dokter' => $dokter]); + echo $this->draw('cetak.sep.html', ['data_sep' => htmlspecialchars_array($data_sep), 'poliklinik' => htmlspecialchars_array($poliklinik), 'dokter' => htmlspecialchars_array($dokter)]); exit(); } @@ -431,7 +484,7 @@ public function getCetakSEPInternal($no_sep) $potensi_prb = $this->db('bpjs_prb')->where('no_sep', $no_sep)->oneArray(); $data_sep['potensi_prb'] = $potensi_prb['prb']; - echo $this->draw('cetak.sep.internal.html', ['data_sep' => $data_sep]); + echo $this->draw('cetak.sep.internal.html', ['data_sep' => htmlspecialchars_array($data_sep)]); exit(); } @@ -444,7 +497,7 @@ public function getCetakSRB($no_sep) ->where('bridging_sep.no_sep', $no_sep)->oneArray(); $obat_srb = $this->db('bridging_srb_bpjs_obat')->where('no_srb',$data_sep['no_srb'])->toArray(); - echo $this->draw('cetak.srb.html', ['data_sep' => $data_sep,'obat_srb'=>$obat_srb]); + echo $this->draw('cetak.srb.html', ['data_sep' => htmlspecialchars_array($data_sep),'obat_srb'=>htmlspecialchars_array($obat_srb)]); exit(); } @@ -550,26 +603,26 @@ public function postSyncSEP() if ($data != null) { $data = '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; $data = json_decode($data, true); } else { - $data = '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; - $data = json_decode($data, true); + $code = "5000"; // Default error code + $data = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; } $jenis_pelayanan = '2'; if ($data['response']['jnsPelayanan'] == 'Rawat Inap') { $jenis_pelayanan = '1'; } - // echo json_encode($data); + // echo json_encode(htmlspecialchars_array($data)); $data_rujukan = []; $no_telp = "00000000"; if ($data['response']['noRujukan'] == "") { @@ -596,22 +649,21 @@ public function postSyncSEP() $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); } if ($data_rujukan != null) { - $data_rujukan = '{ - "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" - }, - "response": ' . $decompress . '}'; - $data_rujukan = json_decode($data_rujukan, true); - } else { - $data_rujukan = '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; - $data_rujukan = json_decode($data_rujukan, true); - } + $data_rujukan = '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; + $data_rujukan = json_decode($data_rujukan, true); + } else { + $data_rujukan = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; + } // echo json_encode($data_rujukan); $no_telp = $data_rujukan['response']['rujukan']['peserta']['mr']['noTelepon']; @@ -723,7 +775,7 @@ public function getCariByNoRujukanModal($searchBy, $keyword) $url = $this->api_url . '' . $url; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -734,19 +786,14 @@ public function getCariByNoRujukanModal($searchBy, $keyword) if ($json != null) { $json = '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; $this->tpl->set('rujukan', json_encode($json, JSON_PRETTY_PRINT)); echo $this->tpl->draw(MODULES . '/vclaim/view/admin/rujukan.modal.html', true); } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -760,28 +807,24 @@ public function getDiagnosa($keyword) $url = $this->api_url . 'referensi/diagnosa/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); - $code = $json['metaData']['code']; - $message = $json['metaData']['message']; - $stringDecrypt = stringDecrypt($key, $json['response']); - $decompress = '""'; - if (!empty($stringDecrypt)) { - $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); - } - if ($json != null) { - echo '{ - "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" - }, - "response": ' . $decompress . '}'; + //echo json_encode(htmlspecialchars_array($json)); + + if ($json && isset($json['metaData'])) { + $code = $json['metaData']['code']; + $message = $json['metaData']['message']; + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + echo '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -795,7 +838,7 @@ public function getDiagnosaPrb() $url = $this->api_url . 'referensi/diagnosaprb'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -806,17 +849,12 @@ public function getDiagnosaPrb() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -830,7 +868,7 @@ public function getObatPrb($keyword) $url = $this->api_url . 'referensi/obatprb/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -841,17 +879,12 @@ public function getObatPrb($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -866,7 +899,7 @@ public function getPoli($keyword) $url = $this->api_url . 'referensi/poli/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -877,17 +910,12 @@ public function getPoli($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -901,7 +929,7 @@ public function getFaskes($kd_faskes = null, $jns_faskes = null) $url = $this->api_url . 'referensi/faskes/' . $kd_faskes . '/' . $jns_faskes; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -912,17 +940,12 @@ public function getFaskes($kd_faskes = null, $jns_faskes = null) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -935,7 +958,7 @@ public function getDokterDpjp($jnsPelayanan, $tglPelayanan, $spesialis) $url = $this->api_url . 'referensi/dokter/pelayanan/' . $jnsPelayanan . '/tglPelayanan/' . $tglPelayanan . '/Spesialis/' . $spesialis; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -946,17 +969,12 @@ public function getDokterDpjp($jnsPelayanan, $tglPelayanan, $spesialis) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -970,7 +988,7 @@ public function getPropinsi() $url = $this->api_url . 'referensi/propinsi'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -981,17 +999,12 @@ public function getPropinsi() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1005,7 +1018,7 @@ public function getKabupaten($kdPropinsi) $url = $this->api_url . 'referensi/kabupaten/propinsi/' . $kdPropinsi; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1016,17 +1029,12 @@ public function getKabupaten($kdPropinsi) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1040,7 +1048,7 @@ public function getKecamatan($kdKabupaten) $url = $this->api_url . 'referensi/kecamatan/kabupaten/' . $kdKabupaten; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1051,17 +1059,12 @@ public function getKecamatan($kdKabupaten) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1075,7 +1078,7 @@ public function getProcedure($keyword) $url = $this->api_url . 'referensi/procedure/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1086,17 +1089,12 @@ public function getProcedure($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1110,7 +1108,7 @@ public function getKelasRawat() $url = $this->api_url . 'referensi/kelasrawat'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1121,17 +1119,12 @@ public function getKelasRawat() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1145,7 +1138,7 @@ public function getDokter($keyword) $url = $this->api_url . 'referensi/dokter/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1156,17 +1149,12 @@ public function getDokter($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); @@ -1182,7 +1170,7 @@ public function getFinger($keyword) $url = $this->api_url . '/SEP/FingerPrint/Peserta/' . $keyword . '/TglPelayanan/'.$dateNow.''; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1193,17 +1181,12 @@ public function getFinger($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); @@ -1219,7 +1202,7 @@ public function getFrista($keyword) $url = $this->api_url . '/SEP/FingerPrint/Peserta/' . $keyword . '/TglPelayanan/'.$dateNow.''; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1230,17 +1213,12 @@ public function getFrista($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); @@ -1271,7 +1249,7 @@ public function getApproveFinger($keyword) $url = $this->api_url . '/Sep/aprovalSEP'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1282,19 +1260,13 @@ public function getApproveFinger($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $data . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } - exit(); } @@ -1307,7 +1279,7 @@ public function getSpesialistik() $url = $this->api_url . 'referensi/spesialistik'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1318,17 +1290,12 @@ public function getSpesialistik() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1342,7 +1309,7 @@ public function getRuangRawat() $url = $this->api_url . 'referensi/ruangrawat'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1353,17 +1320,12 @@ public function getRuangRawat() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1377,7 +1339,7 @@ public function getCaraKeluar() $url = $this->api_url . 'referensi/carakeluar'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1388,17 +1350,12 @@ public function getCaraKeluar() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1412,7 +1369,7 @@ public function getPascaPulang() $url = $this->api_url . 'referensi/pascapulang'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1423,17 +1380,12 @@ public function getPascaPulang() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1447,7 +1399,7 @@ public function getByNoKartu($noKartu, $tglPelayananSEP) $url = $this->api_url . 'Peserta/nokartu/' . $noKartu . '/tglSEP/' . $tglPelayananSEP; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1458,17 +1410,12 @@ public function getByNoKartu($noKartu, $tglPelayananSEP) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1482,7 +1429,7 @@ public function getByNIK($nik, $tglPelayananSEP) $url = $this->api_url . 'Peserta/nik/' . $nik . '/tglSEP/' . $tglPelayananSEP; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1493,17 +1440,12 @@ public function getByNIK($nik, $tglPelayananSEP) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1573,7 +1515,7 @@ public function postInsertSEP($data = []) $url = $this->api_url . 'SEP/2.0/insert'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); exit(); } @@ -1586,7 +1528,7 @@ public function postUpdateSEP($data = []) $url = $this->api_url . 'SEP/2.0/Update'; $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1597,8 +1539,8 @@ public function postUpdateSEP($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -1632,7 +1574,7 @@ public function getDeleteSEP($sep) $url = $this->api_url . 'SEP/2.0/delete'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1643,17 +1585,12 @@ public function getDeleteSEP($sep) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1678,7 +1615,7 @@ public function postDeleteSuratKontrol() $url = $this->api_url . 'RencanaKontrol/Delete'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1689,17 +1626,12 @@ public function postDeleteSuratKontrol() if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1713,7 +1645,7 @@ public function getCariSEP($keyword) $url = $this->api_url . 'SEP/' . $keyword; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1724,17 +1656,12 @@ public function getCariSEP($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'] ?? 'Unknown error', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1748,7 +1675,7 @@ public function getSuplesiJasaRaharja($noKartu, $tglPelayanan) $url = $this->api_url . 'sep/JasaRaharja/Suplesi/' . $noKartu . '/tglPelayanan/' . $tglPelayanan; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1759,17 +1686,12 @@ public function getSuplesiJasaRaharja($noKartu, $tglPelayanan) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1782,7 +1704,7 @@ public function postPengajuanPenjaminanSep($data = []) $url = $this->api_url . 'Sep/pengajuanSEP'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1793,17 +1715,12 @@ public function postPengajuanPenjaminanSep($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -1816,7 +1733,7 @@ public function postApprovalPenjaminanSep($data = []) $url = $this->api_url . 'Sep/aprovalSEP'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1827,8 +1744,8 @@ public function postApprovalPenjaminanSep($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -1851,7 +1768,7 @@ public function __postUpdateTglPlg($data = []) $url = $this->api_url . 'Sep/updtglplg'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1862,8 +1779,8 @@ public function __postUpdateTglPlg($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -1877,7 +1794,7 @@ public function __postUpdateTglPlg($data = []) exit(); } - public function getUpdateTglPlg() + public function postUpdateTglPlg2() { date_default_timezone_set('UTC'); $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); @@ -1886,21 +1803,21 @@ public function getUpdateTglPlg() $data = [ 'request' => [ 't_sep' => [ - 'noSep' => $sep, - 'statusPulang' => '1', + 'noSep' => $_POST['sep'], + 'statusPulang' => $_POST['status_pulang'], 'noSuratMeninggal' => '', 'tglMeninggal' => '', - 'tglPulang' => '2023-01-01', + 'tglPulang' => $_POST['tanggal_pulang'], 'noLPManual' => '', - 'user' => 'Admin' + 'user' => $this->core->getUserInfo('username', null, true) ] ] ]; - - $url = $this->api_url . 'Sep/2.0/updtglplg'; - $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $data = json_encode($data); + $url = $this->api_url . 'SEP/2.0/updtglplg'; + $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + echo json_encode($json); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1915,6 +1832,11 @@ public function getUpdateTglPlg() "message": "' . $message . '" }, "response": ' . $decompress . '}'; + if($code == '200'){ + $update = $this->db('bridging_sep')->where('no_sep', $_POST['sep'])->update([ + 'tglpulang' => $_POST['tanggal_pulang'] + ]); + } } else { echo '{ "metaData": { @@ -1926,16 +1848,30 @@ public function getUpdateTglPlg() exit(); } - public function getInacbgSEP($keyword) + public function getUpdateTglPlg() { date_default_timezone_set('UTC'); $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); $key = $this->consid . $this->secretkey . $tStamp; - $url = $this->api_url . 'sep/cbg/' . $keyword; - $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $data = [ + 'request' => [ + 't_sep' => [ + 'noSep' => $_POST['no_sep'], + 'statusPulang' => $_POST['status_pulang'], + 'noSuratMeninggal' => '', + 'tglMeninggal' => '', + 'tglPulang' => $_POST['tgl_pulang'], + 'noLPManual' => '', + 'user' => 'Admin' + ] + ] + ]; + + $url = $this->api_url . 'Sep/2.0/updtglplg'; + $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1946,17 +1882,76 @@ public function getInacbgSEP($keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + } + exit(); + } + + public function getInacbgSEP($keyword) + { + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + + $url = $this->api_url . 'sep/cbg/' . $keyword; + $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $json = json_decode($output, true); + //echo json_encode(htmlspecialchars_array($json)); + $code = $json['metaData']['code']; + $message = $json['metaData']['message']; + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + if ($json != null) { echo '{ "metaData": { - "code": "5000", - "message": "ERROR" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + "response": ' . $decompress . '}'; + } else { + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + } + exit(); + } + + public function getSepInternal($noSep) + { + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + + $url = $this->api_url . 'SEP/Internal/' . $noSep; + $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $json = json_decode($output, true); + $code = $json['metaData']['code']; + $message = $json['metaData']['message']; + if($code == '200'){ + $sep_internal = $json['response']; + $stringDecrypt = stringDecrypt($key, $sep_internal); + $decompress = ""; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + if ($json != null) { + echo '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; + } else { + echo json_encode($json); + } + } else { + echo json_encode($json); } exit(); } @@ -1970,7 +1965,7 @@ public function postInsertRujukan($data = []) $url = $this->api_url . 'Rujukan/insert'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -1981,17 +1976,12 @@ public function postInsertRujukan($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2005,7 +1995,7 @@ public function postUpdateRujukan($data = []) $url = $this->api_url . 'Rujukan/update'; $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2016,22 +2006,17 @@ public function postUpdateRujukan($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } - public function postDeleteRujukan($data = []) + public function postDeleteRujukan($data = [],$isReturn = true) { date_default_timezone_set('UTC'); $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); @@ -2040,7 +2025,9 @@ public function postDeleteRujukan($data = []) $url = $this->api_url . 'Rujukan/delete'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + if($isReturn){ + return $json; + } $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2051,17 +2038,12 @@ public function postDeleteRujukan($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2080,7 +2062,7 @@ public function getCariByNoRujukan($searchBy, $keyword) $url = $this->api_url . '' . $url; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $jsonresponse = $json['response']; @@ -2092,17 +2074,12 @@ public function getCariByNoRujukan($searchBy, $keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2122,7 +2099,7 @@ public function getCariByNoKartu($searchBy, $keyword, $multi = false) $url = $this->api_url . '' . $url; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2133,8 +2110,8 @@ public function getCariByNoKartu($searchBy, $keyword, $multi = false) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -2162,7 +2139,7 @@ public function getCariByTglRujukan($searchBy, $keyword) $url = $this->api_url . '' . $url; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; @@ -2174,40 +2151,25 @@ public function getCariByTglRujukan($searchBy, $keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; $noKunjungan = []; $i = 1; foreach ($json['response']['rujukan'] as $key => $value) { - //$keyword = $value['noKunjungan']; - /*if ($searchBy == 'RS') { - $url = 'Rujukan/RS/'.$keyword; - } else { - $url = 'Rujukan/'.$keyword; - } - $url = $this->api_url.''.$url; - $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); - $json = json_decode($output, true); - echo json_encode($json);*/ $row['Nomor'] = $i++; - $row['noKunjungan'] = '' . $value['noKunjungan'] . ''; - $row['Poliklinik'] = '[' . $value['poliRujukan']['kode'] . '] ' . $value['poliRujukan']['nama']; - $row['Diagnosa'] = '[' . $value['diagnosa']['kode'] . '] ' . $value['diagnosa']['nama']; - $row['Perujuk'] = '[' . $value['provPerujuk']['kode'] . '] ' . $value['provPerujuk']['nama']; - $row['Tanggal'] = $value['tglKunjungan']; + $row['noKunjungan'] = '' . htmlspecialchars($value['noKunjungan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . ''; + $row['Poliklinik'] = '[' . htmlspecialchars($value['poliRujukan']['kode'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '] ' . htmlspecialchars($value['poliRujukan']['nama'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $row['Diagnosa'] = '[' . htmlspecialchars($value['diagnosa']['kode'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '] ' . htmlspecialchars($value['diagnosa']['nama'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $row['Perujuk'] = '[' . htmlspecialchars($value['provPerujuk']['kode'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '] ' . htmlspecialchars($value['provPerujuk']['nama'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $row['Tanggal'] = htmlspecialchars($value['tglKunjungan'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $noKunjungan[] = $row; } - echo json_encode($noKunjungan); + echo json_encode(htmlspecialchars_array($noKunjungan)); } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2239,7 +2201,7 @@ public function getCariByTglRujukan_BackUp($searchBy, $keyword) $url = $this->api_url.''.$url; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $row['noRujukan'] = $value['noKunjungan']; $listRujukan[] = $row; } @@ -2255,17 +2217,12 @@ public function getCariByTglRujukan_BackUp($searchBy, $keyword) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2279,7 +2236,7 @@ public function postInsertLPK($data = []) $url = $this->api_url . 'LPK/insert'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2290,17 +2247,12 @@ public function postInsertLPK($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2314,7 +2266,7 @@ public function postUpdateLPK($data = []) $url = $this->api_url . 'LPK/update'; $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2325,17 +2277,12 @@ public function postUpdateLPK($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2349,7 +2296,7 @@ public function postDeleteLPK($data = []) $url = $this->api_url . 'LPK/delete'; $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2360,17 +2307,12 @@ public function postDeleteLPK($data = []) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2384,7 +2326,7 @@ public function getCariLPK($tglMasuk, $jnsPelayanan) $url = $this->api_url . 'LPK/TglMasuk/' . $tglMasuk . '/JnsPelayanan/' . $jnsPelayanan; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2395,8 +2337,8 @@ public function getCariLPK($tglMasuk, $jnsPelayanan) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -2419,7 +2361,7 @@ public function getDataKunjungan($tglSep, $jnsPelayanan) $url = $this->api_url . 'Monitoring/Kunjungan/Tanggal/' . $tglSep . '/JnsPelayanan/' . $jnsPelayanan; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2430,8 +2372,8 @@ public function getDataKunjungan($tglSep, $jnsPelayanan) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { @@ -2454,7 +2396,7 @@ public function getDataKlaim($tglPulang, $jnsPelayanan, $statusKlaim) $url = $this->api_url . 'Monitoring/Klaim/Tanggal/' . $tglPulang . '/JnsPelayanan/' . $jnsPelayanan . '/Status/' . $statusKlaim; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2465,17 +2407,12 @@ public function getDataKlaim($tglPulang, $jnsPelayanan, $statusKlaim) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2489,7 +2426,7 @@ public function getHistoriPelayanan($noKartu, $tglAwal, $tglAkhir) $url = $this->api_url . 'monitoring/HistoriPelayanan/NoKartu/' . $noKartu . '/tglMulai/' . $tglAwal . '/tglAkhir/' . $tglAkhir; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - // echo json_encode($json); + // echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2500,17 +2437,12 @@ public function getHistoriPelayanan($noKartu, $tglAwal, $tglAkhir) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2524,7 +2456,7 @@ public function getDataKlaimJasaRaharja($tglMulai, $tglAkhir) $url = $this->api_url . 'monitoring/JasaRaharja/tglMulai/' . $tglMulai . '/tglAkhir/' . $tglAkhir; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -2535,17 +2467,12 @@ public function getDataKlaimJasaRaharja($tglMulai, $tglAkhir) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -2559,8 +2486,8 @@ public function getSPRI($no_kartu, $no_rawat) $this->tpl->set('spri', $this->tpl->noParse_array(htmlspecialchars_array($bridging_surat_pri_bpjs))); $this->tpl->set('maping_dokter_dpjpvclaim', $this->tpl->noParse_array(htmlspecialchars_array($maping_dokter_dpjpvclaim))); $this->tpl->set('maping_poli_bpjs', $this->tpl->noParse_array(htmlspecialchars_array($maping_poli_bpjs))); - $this->tpl->set('no_kartu', $no_kartu); - $this->tpl->set('no_rawat', revertNorawat($no_rawat)); + $this->tpl->set('no_kartu', htmlspecialchars($no_kartu, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + $this->tpl->set('no_rawat', htmlspecialchars(revertNorawat($no_rawat), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); echo $this->draw('spri.html'); exit(); } @@ -2573,6 +2500,13 @@ public function getSPRIDisplay($no_kartu, $no_rawat) exit(); } + public function getSPRIData($no_surat) + { + $bridging_surat_pri_bpjs = $this->db('bridging_surat_pri_bpjs')->where('no_surat', $no_surat)->toArray(); + echo json_encode($bridging_surat_pri_bpjs[0]); + exit(); + } + public function postSaveSPRI($no_kartu, $no_rawat) { date_default_timezone_set('UTC'); @@ -2595,7 +2529,6 @@ public function postSaveSPRI($no_kartu, $no_rawat) $url = $this->api_url . 'RencanaKontrol/InsertSPRI'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $data = json_decode($output, true); - //echo $data['metaData']['message']; if ($data == NULL) { echo 'Koneksi ke server BPJS terputus. Silahkan ulangi beberapa saat lagi!'; } else if ($data['metaData']['code'] == 200) { @@ -2621,106 +2554,208 @@ public function postSaveSPRI($no_kartu, $no_rawat) 'no_sep' => '-' ]); } else { - echo $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } - function getAddAntrian($no_rkm_medis, $no_rawat, $nomor_rujukan, $jenis_kunjungan) { - - $date = date('Y-m-d'); - $time = date('H:i:s'); - $tentukan_hari=date('D',strtotime(date('Y-m-d'))); - - $day = array( - 'Sun' => 'AKHAD', - 'Mon' => 'SENIN', - 'Tue' => 'SELASA', - 'Wed' => 'RABU', - 'Thu' => 'KAMIS', - 'Fri' => 'JUMAT', - 'Sat' => 'SABTU' - ); - $hari=$day[$tentukan_hari]; - - $reg_periksa = $this->db('reg_periksa')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); - $maping_dokter_dpjpvclaim = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter', $reg_periksa['kd_dokter'])->oneArray(); - $maping_poli_bpjs = $this->db('maping_poli_bpjs')->where('kd_poli_rs', $reg_periksa['kd_poli'])->oneArray(); - $jadwaldokter = $this->db('jadwal')->where('kd_dokter', $reg_periksa['kd_dokter'])->where('kd_poli', $reg_periksa['kd_poli'])->where('hari_kerja', $hari)->oneArray(); - - $no_urut_reg = substr($reg_periksa['no_reg'], 0, 3); - $minutes = $no_urut_reg * 10; - $cek_kuota['jam_mulai'] = date('H:i:s',strtotime('+'.$minutes.' minutes',strtotime($jadwaldokter['jam_mulai']))); - - $kodebooking = $this->settings->get('settings.ppk_bpjs').''.convertNorawat($reg_periksa['no_rawat']).''.$maping_poli_bpjs['kd_poli_bpjs'].''.$reg_periksa['no_reg']; - - $nomorreferensi = $nomor_rujukan; + public function postUpdateSPRI($no_surat) + { + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + $_POST['sep_user'] = $this->core->getUserInfo('fullname', null, true); $data = [ - 'kodebooking' => $kodebooking, - 'jenispasien' => 'JKN', - 'nomorkartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), - 'nik' => $this->core->getPasienInfo('no_ktp', $no_rkm_medis), - 'nohp' => $this->core->getPasienInfo('no_tlp', $no_rkm_medis), - 'kodepoli' => $maping_poli_bpjs['kd_poli_bpjs'], - 'namapoli' => $maping_poli_bpjs['nm_poli_bpjs'], - 'pasienbaru' => '0', - 'norm' => $no_rkm_medis, - 'tanggalperiksa' => $date, - 'kodedokter' => $maping_dokter_dpjpvclaim['kd_dokter_bpjs'], - 'namadokter' => $maping_dokter_dpjpvclaim['nm_dokter_bpjs'], - 'jampraktek' => substr($jadwaldokter['jam_mulai'],0,5).'-'.substr($jadwaldokter['jam_selesai'],0,5), - 'jeniskunjungan' => $jenis_kunjungan, - 'nomorreferensi' => $nomorreferensi, - 'nomorantrean' => $maping_poli_bpjs['kd_poli_bpjs'].'-'.$reg_periksa['no_reg'], - 'angkaantrean' => $reg_periksa['no_reg'], - 'estimasidilayani' => strtotime($reg_periksa['tgl_registrasi'].' '.$cek_kuota['jam_mulai']) * 1000, - 'sisakuotajkn' => $jadwaldokter['kuota']-ltrim($reg_periksa['no_reg'],'0'), - 'kuotajkn' => intval($jadwaldokter['kuota']), - 'sisakuotanonjkn' => $jadwaldokter['kuota']-ltrim($reg_periksa['no_reg'],'0'), - 'kuotanonjkn' => intval($jadwaldokter['kuota']), - 'keterangan' => 'Peserta harap 30 menit lebih awal guna pencatatan administrasi.' + 'request' => [ + 'noSPRI' => $no_surat, + 'kodeDokter' => $_POST['dokter'], + 'poliKontrol' => $_POST['poli'], + 'tglRencanaKontrol' => $_POST['tanggal_periksa'], + 'user' => $_POST['sep_user'] + ] ]; - $request = json_encode($data, JSON_PRETTY_PRINT); + $data = json_encode($data); + print_r($data); + $url = $this->api_url . 'RencanaKontrol/UpdateSPRI'; + $output = BpjsService::put($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $data = json_decode($output, true); + //echo $data['metaData']['message']; + if ($data == NULL) { + echo 'Koneksi ke server BPJS terputus. Silahkan ulangi beberapa saat lagi!'; + } else if ($data['metaData']['code'] == 200) { + $stringDecrypt = stringDecrypt($key, $data['response']); + $decompress = '""'; + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + $spri = json_decode($decompress, true); + //echo $spri['noSPRI']; + $maping_dokter_dpjpvclaim = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter_bpjs', $_POST['dokter'])->oneArray(); + $maping_poli_bpjs = $this->db('maping_poli_bpjs')->where('kd_poli_bpjs', $_POST['poli'])->oneArray(); + $bridging_surat_pri_bpjs = $this->db('bridging_surat_pri_bpjs')->where('no_surat', $no_surat)->update([ + 'tgl_surat' => $_POST['tanggal_surat'], + 'no_surat' => $spri['noSPRI'], + 'tgl_rencana' => $_POST['tanggal_periksa'], + 'kd_dokter_bpjs' => $_POST['dokter'], + 'nm_dokter_bpjs' => $maping_dokter_dpjpvclaim['nm_dokter_bpjs'], + 'kd_poli_bpjs' => $_POST['poli'], + 'nm_poli_bpjs' => $maping_poli_bpjs['nm_poli_bpjs'], + ]); + } else { + echo $data['metaData']['message']; + } + exit(); + } + + public function postDeleteSPRI($no_surat) + { date_default_timezone_set('UTC'); $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); - $key = $this->settings->get('jkn_mobile.BpjsConsID') . $this->settings->get('jkn_mobile.BpjsSecretKey') . $tStamp; + $key = $this->consid . $this->secretkey . $tStamp; + $_POST['sep_user'] = $this->core->getUserInfo('fullname', null, true); - $url = $this->settings->get('jkn_mobile.BpjsAntrianUrl').'antrean/add'; - $output = BpjsService::post($url, $data, $this->settings->get('jkn_mobile.BpjsConsID'), $this->settings->get('jkn_mobile.BpjsSecretKey'), $this->settings->get('jkn_mobile.BpjsUserKey'), NULL); + $data = [ + 'request' => [ + 't_suratkontrol' => [ + 'noSuratKontrol' => $no_surat, + 'user' => $_POST['sep_user'] + ], + ] + ]; + + $data = json_encode($data); + print_r($data); + $url = $this->api_url . 'RencanaKontrol/Delete'; + $output = BpjsService::delete($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $data = json_decode($output, true); - $response = json_encode($data, JSON_PRETTY_PRINT); - if($data['metadata']['code'] == 200 || $data['metadata']['code'] == 208) { - $this->db('mlite_antrian_referensi')->save([ - 'tanggal_periksa' => $date, - 'no_rkm_medis' => $no_rkm_medis, - 'nomor_kartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), - 'nomor_referensi' => $nomorreferensi, - 'kodebooking' => $kodebooking, - 'jenis_kunjungan' => $jenis_kunjungan, - 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['code'].': '.$data['metadata']['message'] - ]); - $status = 'Antrian telah dikirim'; - } else if ($data == null) { - $this->db('mlite_antrian_referensi')->save([ - 'tanggal_periksa' => $date, - 'no_rkm_medis' => $no_rkm_medis, - 'nomor_kartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), - 'nomor_referensi' => $nomorreferensi, - 'kodebooking' => $kodebooking, - 'jenis_kunjungan' => $jenis_kunjungan, - 'status_kirim' => 'Sudah', - 'keterangan' => $data['metadata']['code'].' null : null '.$data['metadata']['message'] - ]); - $status = 'Antrian telah dikirim'; + //echo $data['metaData']['message']; + if ($data == NULL) { + echo 'Koneksi ke server BPJS terputus. Silahkan ulangi beberapa saat lagi!'; + } else if ($data['metaData']['code'] == 200) { + $bridging_surat_pri_bpjs = $this->db('bridging_surat_pri_bpjs')->where('no_surat', $no_surat)->delete(); } else { - $status = 'Gagal kirim antrian'; + echo htmlentities($data['metaData']['message']); } + exit(); + } + + function getAddAntrian($no_rkm_medis, $no_rawat, $nomor_rujukan, $jenis_kunjungan) { - echo $this->draw('add.antrian.html', ['request' => $request, 'response' => $response, 'status' => $status]); + try { + if (empty($no_rkm_medis) || empty($no_rawat) || empty($nomor_rujukan) || empty($jenis_kunjungan)) { + throw new \Exception("Parameter tidak lengkap."); + } + + $date = date('Y-m-d'); + $time = date('H:i:s'); + $tentukan_hari=date('D',strtotime(date('Y-m-d'))); + + $day = array( + 'Sun' => 'AKHAD', + 'Mon' => 'SENIN', + 'Tue' => 'SELASA', + 'Wed' => 'RABU', + 'Thu' => 'KAMIS', + 'Fri' => 'JUMAT', + 'Sat' => 'SABTU' + ); + $hari=$day[$tentukan_hari]; + + $reg_periksa = $this->db('reg_periksa')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); + if (!$reg_periksa) { + throw new \Exception("Data registrasi tidak ditemukan."); + } + + $maping_dokter_dpjpvclaim = $this->db('maping_dokter_dpjpvclaim')->where('kd_dokter', $reg_periksa['kd_dokter'])->oneArray(); + $maping_poli_bpjs = $this->db('maping_poli_bpjs')->where('kd_poli_rs', $reg_periksa['kd_poli'])->oneArray(); + $jadwaldokter = $this->db('jadwal')->where('kd_dokter', $reg_periksa['kd_dokter'])->where('kd_poli', $reg_periksa['kd_poli'])->where('hari_kerja', $hari)->oneArray(); + + if (!$maping_dokter_dpjpvclaim || !$maping_poli_bpjs || !$jadwaldokter) { + throw new \Exception("Data mapping dokter/poli atau jadwal tidak lengkap."); + } + + $no_urut_reg = substr($reg_periksa['no_reg'], 0, 3); + $minutes = $no_urut_reg * 10; + $cek_kuota['jam_mulai'] = date('H:i:s',strtotime('+'.$minutes.' minutes',strtotime($jadwaldokter['jam_mulai']))); + + $kodebooking = $this->settings->get('settings.ppk_bpjs').''.convertNorawat($reg_periksa['no_rawat']).''.$maping_poli_bpjs['kd_poli_bpjs'].''.$reg_periksa['no_reg']; + + $nomorreferensi = $nomor_rujukan; + + $data = [ + 'kodebooking' => $kodebooking, + 'jenispasien' => 'JKN', + 'nomorkartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), + 'nik' => $this->core->getPasienInfo('no_ktp', $no_rkm_medis), + 'nohp' => $this->core->getPasienInfo('no_tlp', $no_rkm_medis), + 'kodepoli' => $maping_poli_bpjs['kd_poli_bpjs'], + 'namapoli' => $maping_poli_bpjs['nm_poli_bpjs'], + 'pasienbaru' => '0', + 'norm' => $no_rkm_medis, + 'tanggalperiksa' => $date, + 'kodedokter' => $maping_dokter_dpjpvclaim['kd_dokter_bpjs'], + 'namadokter' => $maping_dokter_dpjpvclaim['nm_dokter_bpjs'], + 'jampraktek' => substr($jadwaldokter['jam_mulai'],0,5).'-'.substr($jadwaldokter['jam_selesai'],0,5), + 'jeniskunjungan' => $jenis_kunjungan, + 'nomorreferensi' => $nomorreferensi, + 'nomorantrean' => $maping_poli_bpjs['kd_poli_bpjs'].'-'.$reg_periksa['no_reg'], + 'angkaantrean' => $reg_periksa['no_reg'], + 'estimasidilayani' => strtotime($reg_periksa['tgl_registrasi'].' '.$cek_kuota['jam_mulai']) * 1000, + 'sisakuotajkn' => $jadwaldokter['kuota']-ltrim($reg_periksa['no_reg'],'0'), + 'kuotajkn' => intval($jadwaldokter['kuota']), + 'sisakuotanonjkn' => $jadwaldokter['kuota']-ltrim($reg_periksa['no_reg'],'0'), + 'kuotanonjkn' => intval($jadwaldokter['kuota']), + 'keterangan' => 'Peserta harap 30 menit lebih awal guna pencatatan administrasi.' + ]; + $request = json_encode($data, JSON_PRETTY_PRINT); + $data = json_encode($data); + + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->settings->get('jkn_mobile.BpjsConsID') . $this->settings->get('jkn_mobile.BpjsSecretKey') . $tStamp; + + $url = $this->settings->get('jkn_mobile.BpjsAntrianUrl').'antrean/add'; + $output = BpjsService::post($url, $data, $this->settings->get('jkn_mobile.BpjsConsID'), $this->settings->get('jkn_mobile.BpjsSecretKey'), $this->settings->get('jkn_mobile.BpjsUserKey'), NULL); + $data = json_decode($output, true); + $response = json_encode($data, JSON_PRETTY_PRINT); + + if(isset($data['metadata']['code']) && ($data['metadata']['code'] == 200 || $data['metadata']['code'] == 208)) { + $this->db('mlite_antrian_referensi')->save([ + 'tanggal_periksa' => $date, + 'no_rkm_medis' => $no_rkm_medis, + 'nomor_kartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), + 'nomor_referensi' => $nomorreferensi, + 'kodebooking' => $kodebooking, + 'jenis_kunjungan' => $jenis_kunjungan, + 'status_kirim' => 'Sudah', + 'keterangan' => $data['metadata']['code'].': '.$data['metadata']['message'] + ]); + $status = 'Antrian telah dikirim'; + } else if ($data == null) { + // Log null response but consider as sent? Maybe should be 'Gagal' + $this->db('mlite_antrian_referensi')->save([ + 'tanggal_periksa' => $date, + 'no_rkm_medis' => $no_rkm_medis, + 'nomor_kartu' => $this->core->getPasienInfo('no_peserta', $no_rkm_medis), + 'nomor_referensi' => $nomorreferensi, + 'kodebooking' => $kodebooking, + 'jenis_kunjungan' => $jenis_kunjungan, + 'status_kirim' => 'Sudah', + 'keterangan' => 'Response null' + ]); + $status = 'Antrian telah dikirim (Response Null)'; + } else { + $status = 'Gagal kirim antrian: ' . (isset($data['metadata']['message']) ? $data['metadata']['message'] : 'Unknown error'); + } + + } catch (\Exception $e) { + $status = 'Error: ' . $e->getMessage(); + $request = isset($request) ? $request : ''; + $response = isset($response) ? $response : json_encode(['error' => $e->getMessage()]); + } + + echo $this->draw('add.antrian.html', ['request' => htmlspecialchars($request, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'response' => htmlspecialchars($response, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'), 'status' => htmlspecialchars($status, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')]); exit(); } @@ -2740,6 +2775,13 @@ public function getSync_SEP($no_kartu, $no_rawat) exit(); } + public function getAproval_SEP($no_kartu) + { + $this->tpl->set('no_kartu', $no_kartu); + echo $this->draw('form.aproval.html'); + exit(); + } + public function getSyncSepDisplay($no_kartu) { $bridging_sep = $this->db('bridging_sep') @@ -2751,6 +2793,152 @@ public function getSyncSepDisplay($no_kartu) exit(); } + public function getSepPulang($no_sep) + { + $this->tpl->set('no_sep', $no_sep); + echo $this->draw('sep_pulang.html'); + exit(); + } + + public function getAprovalSepDisplay($bln_aproval, $tahun_aproval) + { + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + + $url = $this->api_url . 'Sep/persetujuanSEP/list/bulan/' . $bln_aproval . '/tahun/' . $tahun_aproval; + $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); + $json = json_decode($output, true); + + if ($json && isset($json['metaData'])) { + $code = $json['metaData']['code']; + $message = $json['metaData']['message']; + $stringDecrypt = stringDecrypt($key, $json['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + echo '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; + } else { + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + } + exit(); + } + + public function postSaveAprovalSEP() + { + $date = date('Y-m-d'); + date_default_timezone_set('UTC'); + $tStamp = strval(time() - strtotime("1970-01-01 00:00:00")); + $key = $this->consid . $this->secretkey . $tStamp; + + $request = [ + 'request' => [ + 't_sep' => [ + 'noKartu' => $_POST['noKartu'], + 'tglSep' => $_POST['tglSep'], + 'jnsPelayanan' => $_POST['jnsPelayanan'], + 'jnsPengajuan' => $_POST['jnsPengajuan'], + 'keterangan' => $_POST['keterangan'], + 'user' => $this->core->getUserInfo('username', null, true) + ] + ] + ]; + + header('Content-type: application/x-www-form-urlencoded'); + // echo json_encode($request); + $request = json_encode($request); + + $url = $this->settings->get('settings.BpjsApiUrl') . 'Sep/pengajuanSEP'; + $consid = $this->settings->get('settings.BpjsConsID'); + $secretkey = $this->settings->get('settings.BpjsSecretKey'); + $userkey = $this->settings->get('settings.BpjsUserKey'); + $output = BpjsService::post($url, $request, $consid, $secretkey, $userkey, $tStamp); + $data = json_decode($output, true); + // print_r(htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + $code = $data['metaData']['code']; + $message = $data['metaData']['message']; + + if ($data && isset($data['metaData'])) { + $stringDecrypt = stringDecrypt($key, $data['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + $data = '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; + $data = json_decode($data, true); + } else { + $code = "5000"; // Default error code + $data = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; + } + if ($code == 200 or $code == 201) { + $request = [ + 'request' => [ + 't_sep' => [ + 'noKartu' => $_POST['noKartu'], + 'tglSep' => $_POST['tglSep'], + 'jnsPelayanan' => $_POST['jnsPelayanan'], + 'jnsPengajuan' => $_POST['jnsPengajuan'], + 'keterangan' => $_POST['keterangan'], + 'user' => $this->core->getUserInfo('username', null, true) + ] + ] + ]; + + header('Content-type: application/x-www-form-urlencoded'); + $request = json_encode($request); + + $url = $this->settings->get('settings.BpjsApiUrl') . 'Sep/aprovalSEP'; + $consid = $this->settings->get('settings.BpjsConsID'); + $secretkey = $this->settings->get('settings.BpjsSecretKey'); + $userkey = $this->settings->get('settings.BpjsUserKey'); + $output = BpjsService::post($url, $request, $consid, $secretkey, $userkey, $tStamp); + $data = json_decode($output, true); + // echo $data; + print_r(htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + + if ($data && isset($data['metaData'])) { + $code = $data['metaData']['code']; + $message = $data['metaData']['message']; + $stringDecrypt = stringDecrypt($key, $data['response']); + $decompress = '""'; + if (!empty($stringDecrypt)) { + $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); + } + $data = '{ + "metaData": { + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" + }, + "response": ' . $decompress . '}'; + $data = json_decode($data, true); + } else { + $data = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; + } + } + exit(); + } + public function postSaveSyncSEP() { $date = date('Y-m-d'); @@ -2776,19 +2964,18 @@ public function postSaveSyncSEP() if ($data != null) { $data = '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; $data = json_decode($data, true); } else { - $data = '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; - $data = json_decode($data, true); + $data = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; } $url_rujukan = $this->settings->get('settings.BpjsApiUrl') . 'Rujukan/' . $data['response']['noRujukan']; @@ -2809,19 +2996,18 @@ public function postSaveSyncSEP() if ($data_rujukan != null) { $data_rujukan = '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; $data_rujukan = json_decode($data_rujukan, true); } else { - $data_rujukan = '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; - $data_rujukan = json_decode($data_rujukan, true); + $data_rujukan = [ + "metaData" => [ + "code" => "5000", + "message" => "ERROR" + ], + "response" => "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."]; } $no_telp = $data_rujukan['response']['rujukan']['peserta']['mr']['noTelepon']; @@ -2929,7 +3115,7 @@ public function getKontrol($no_kartu) ->where('bridging_sep.no_kartu', $no_kartu) ->toArray(); $sep = $this->db('bridging_sep')->where('no_kartu',$no_kartu)->desc('tglsep')->oneArray(); - $this->tpl->set('no_sep',$sep['no_sep']); + $this->tpl->set('no_sep', isset($sep['no_sep']) ? $sep['no_sep'] : ''); $this->tpl->set('kontrol', $this->tpl->noParse_array(htmlspecialchars_array($bridging_surat_kontrol_bpjs))); $this->tpl->set('maping_dokter_dpjpvclaim', $this->tpl->noParse_array(htmlspecialchars_array($maping_dokter_dpjpvclaim))); $this->tpl->set('maping_poli_bpjs', $this->tpl->noParse_array(htmlspecialchars_array($maping_poli_bpjs))); @@ -2963,7 +3149,10 @@ public function postSaveKontrol() 'kodeDokter' => $_POST['dokter'], 'poliKontrol' => $_POST['poli'], 'tglRencanaKontrol' => $_POST['tanggal_periksa'], - 'user' => $_POST['sep_user'] + 'user' => $_POST['sep_user'], + 'formPRB' => [ + 'kdStatusPRB' => $_POST['id_prb'], + ] ] ]; $statusUrl = 'insert'; @@ -2982,7 +3171,6 @@ public function postSaveKontrol() $statusUrl = 'Update'; $method = 'put'; } - $data = json_encode($data); $url = $this->api_url . 'RencanaKontrol/' . $statusUrl; @@ -3088,7 +3276,7 @@ public function postSaveKontrol() } } } else { - echo $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -3096,7 +3284,7 @@ public function postSaveKontrol() public function getRujukKeluar($no_kartu) { $this->_addHeaderFiles(); - $rujuk_keluar = $this->db('bridging_rujukan_bpjs') + $rujuk_keluar = $this->db('bridging_rujukan_bpjs')->select(['bridging_rujukan_bpjs.*', 'bridging_sep.no_kartu', 'bridging_sep.no_rawat']) ->join('bridging_sep', 'bridging_sep.no_sep=bridging_rujukan_bpjs.no_sep') ->where('bridging_sep.no_kartu', $no_kartu) ->toArray(); @@ -3109,6 +3297,7 @@ public function getRujukKeluar($no_kartu) public function getRujukKeluarDisplay($no_kartu) { $rujuk_keluar = $this->db('bridging_rujukan_bpjs') + ->select(['bridging_rujukan_bpjs.*', 'bridging_sep.no_kartu', 'bridging_sep.no_rawat']) ->join('bridging_sep', 'bridging_sep.no_sep=bridging_rujukan_bpjs.no_sep') ->where('bridging_sep.no_kartu', $no_kartu) ->toArray(); @@ -3118,6 +3307,31 @@ public function getRujukKeluarDisplay($no_kartu) exit(); } + public function postDeleteRujukKeluar() + { + $no_sep = $_POST['no_sep']; + $no_rujukan = $_POST['no_rujukan']; + $data = [ + 'request' => [ + "t_rujukan" => [ + "noRujukan" => $no_rujukan, + "user" => "Coba Ws" + ] + ] + ]; + $output = $this->postDeleteRujukan(json_encode($data)); + if ($output == NULL) { + echo 'Koneksi ke server BPJS terputus. Silahkan ulangi beberapa saat lagi!'; + } else if ($output['metaData']['code'] == 200) { + $this->db('bridging_rujukan_bpjs')->where('no_sep', $no_sep)->where('no_rujukan', $no_rujukan)->delete(); + echo 'Data Rujukan telah dihapus!!'; + } else { + echo htmlspecialchars($output['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $this->db('bridging_rujukan_bpjs')->where('no_sep', $no_sep)->where('no_rujukan', $no_rujukan)->delete(); + } + exit(); + } + public function postSaveRujukKeluar() { date_default_timezone_set('UTC'); @@ -3169,7 +3383,7 @@ public function postSaveRujukKeluar() 'jnsPelayanan' => $_POST['jns_rujuk'], 'diagRujukan' => $_POST['sep_diagnosa_kode_rujuk'], 'nama_diagRujukan' => $_POST['sep_diagnosa_nama_rujuk'], - 'tipeRujukan' => $_POST['tanggal_periksa'], + 'tipeRujukan' => $_POST['tipe_rujuk'], 'poliRujukan' => $_POST['sep_spesialis_kode_rujuk'], 'nama_poliRujukan' => $_POST['sep_spesialis_nama_rujuk'], 'user' => $_POST['sep_user'], @@ -3179,7 +3393,7 @@ public function postSaveRujukKeluar() echo 'Sukses Simpan'; } } else { - echo $data['metaData']['code'] . ' ' . $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['code'] . ' ' . $data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -3195,9 +3409,9 @@ public function getSrb($no_kartu, $no_rawat) $alamat = $this->core->getPasienInfo('alamat', $reg); $this->tpl->set('no_kartu', $no_kartu); $this->tpl->set('alamat', $alamat); - $this->tpl->set('no_sep', $rujuk_keluar['no_sep']); - $this->tpl->set('kddpjp', $rujuk_keluar['kddpjp']); - $this->tpl->set('nmdpjp', $rujuk_keluar['nmdpdjp']); + $this->tpl->set('no_sep', isset($rujuk_keluar['no_sep']) ? $rujuk_keluar['no_sep'] : ''); + $this->tpl->set('kddpjp', isset($rujuk_keluar['kddpjp']) ? $rujuk_keluar['kddpjp'] : ''); + $this->tpl->set('nmdpjp', isset($rujuk_keluar['nmdpdjp']) ? $rujuk_keluar['nmdpdjp'] : ''); echo $this->draw('srb.html'); exit(); } @@ -3247,7 +3461,7 @@ public function postSaveSrb() $data = json_encode($data); - echo $data; + echo htmlspecialchars($data, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $url = $this->api_url . 'PRB/insert'; $output = BpjsService::$method($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $data = json_decode($output, true); @@ -3259,7 +3473,7 @@ public function postSaveSrb() $decompress = '""'; $decompress = \LZCompressor\LZString::decompressFromEncodedURIComponent(($stringDecrypt)); $spri = json_decode($decompress, true); - echo $spri['noSRB']; + echo htmlspecialchars($spri['noSRB'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); $bridging_srb_bpjs = $this->db('bridging_srb_bpjs')->save([ 'no_sep' => $_POST['no_sep'], @@ -3285,7 +3499,7 @@ public function postSaveSrb() 'signa2' => $_POST['signa2'], ]); } else { - echo $data['metaData']['code'] . ' ' . $data['metaData']['message']; + echo htmlspecialchars($data['metaData']['code'] . ' ' . $data['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -3301,7 +3515,7 @@ public function getDataKontrol($no_kartu,$tanggal) $url = $this->api_url . '/RencanaKontrol/ListRencanaKontrol/Bulan/'.$bulan.'/Tahun/'.$tahun.'/Nokartu/'.$no_kartu.'/filter/2'; $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - //echo json_encode($json); + //echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -3312,17 +3526,12 @@ public function getDataKontrol($no_kartu,$tanggal) if ($json != null) { echo '{ "metaData": { - "code": "' . $code . '", - "message": "' . $message . '" + "code": "' . htmlspecialchars($code, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '", + "message": "' . htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '" }, "response": ' . $decompress . '}'; } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -3331,7 +3540,7 @@ public function getDirujuk($no_rawat) { $bridging_sep = $this->db('bridging_sep')->where('no_rawat', revertNoRawat($no_rawat))->oneArray(); $dirujuk = $this->db('bridging_rujukan_bpjs')->where('no_sep', $bridging_sep['no_sep'])->toArray(); - echo $this->draw('dirujuk.html', ['bridging_sep' => isset_or($bridging_sep, ''), 'dirujuk' => $dirujuk]); + echo $this->draw('dirujuk.html', ['bridging_sep' => htmlspecialchars_array(isset_or($bridging_sep, [])), 'dirujuk' => htmlspecialchars_array($dirujuk)]); exit(); } @@ -3361,7 +3570,7 @@ public function postDiRujukSave() $url = $this->api_url . 'Rujukan/2.0/insert'; $output = BpjsService::post($url, $data, $this->consid, $this->secretkey, $this->user_key, $tStamp); $json = json_decode($output, true); - echo json_encode($json); + echo json_encode(htmlspecialchars_array($json)); $code = $json['metaData']['code']; $message = $json['metaData']['message']; $stringDecrypt = stringDecrypt($key, $json['response']); @@ -3394,12 +3603,7 @@ public function postDiRujukSave() } } else { - echo '{ - "metaData": { - "code": "5000", - "message": "ERROR" - }, - "response": "ADA KESALAHAN ATAU SAMBUNGAN KE SERVER BPJS TERPUTUS."}'; + echo htmlspecialchars($json['metaData']['message'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } exit(); } @@ -3407,7 +3611,7 @@ public function postDiRujukSave() public function getDirujukTampil($noSep) { $bridging_rujukan_bpjs = $this->db('bridging_rujukan_bpjs')->where('no_sep', $noSep)->toArray(); - echo $this->draw('dirujuk.tampil.html', ['dirujuk' => $bridging_rujukan_bpjs]); + echo $this->draw('dirujuk.tampil.html', ['dirujuk' => htmlspecialchars_array($bridging_rujukan_bpjs)]); exit(); } @@ -3415,7 +3619,7 @@ public function getMappingPoli() { $this->_addHeaderFiles(); $poliklinik = $this->db('poliklinik')->where('status','1')->toArray(); - return $this->draw('mappingpoli.html', ['row' => $this->db('maping_poli_bpjs')->toArray(), 'poliklinik' => $poliklinik]); + return $this->draw('mappingpoli.html', ['row' => htmlspecialchars_array($this->db('maping_poli_bpjs')->toArray()), 'poliklinik' => htmlspecialchars_array($poliklinik)]); } public function postPoliklinik_Save() @@ -3454,7 +3658,7 @@ public function getMappingDokter() { $this->_addHeaderFiles(); $dokter = $this->db('dokter')->where('status','1')->toArray(); - return $this->draw('mappingdokter.html', ['row' => $this->db('maping_dokter_dpjpvclaim')->toArray(), 'dokter' => $dokter]); + return $this->draw('mappingdokter.html', ['row' => htmlspecialchars_array($this->db('maping_dokter_dpjpvclaim')->toArray()), 'dokter' => htmlspecialchars_array($dokter)]); } public function postDokter_Save() diff --git a/plugins/vclaim/Help.md b/plugins/vclaim/Help.md deleted file mode 100644 index 9c3c2d02b..000000000 --- a/plugins/vclaim/Help.md +++ /dev/null @@ -1,43 +0,0 @@ -### BPJS Kesehatan Indonesia -mLITE Library package to access BPJS Kesehatan API. -This package is a wrapper of BPJS VClaim Web Service -https://dvlp.bpjs-kesehatan.go.id/VClaim-Katalog - -#### Example Usage -```php -// use Referensi service -// https://dvlp.bpjs-kesehatan.go.id/VClaim-Katalog/Referensi - -public function getDiagnosa($keyword) -{ - $url = $this->api_url.'referensi/diagnosa/'.$keyword; - $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key); - $json = json_decode($output, true); - var_dump($json); - exit(); -} - -//use Peserta service -//https://dvlp.bpjs-kesehatan.go.id/VClaim-Katalog/Peserta - -public function getByNoKartu($noKartu, $tglPelayananSEP) -{ - $url = $this->api_url.'Peserta/nokartu/'.$noKartu.'/tglSEP/'.$tglPelayananSEP; - $output = BpjsService::get($url, NULL, $this->consid, $this->secretkey, $this->user_key); - $json = json_decode($output, true); - var_dump($json); - exit(); -} -``` - - -#### Supported Services (WIP) - -- [√] Referensi -- [√] Peserta -- [√] SEP -- [√] Rujukan -- [x] Rencana Kontrol -- [x] PRB -- [√] Lembar Pengajuan Klaim -- [√] Monitoring diff --git a/plugins/vclaim/Info.php b/plugins/vclaim/Info.php index 486d5ab4f..9ba64522f 100644 --- a/plugins/vclaim/Info.php +++ b/plugins/vclaim/Info.php @@ -4,8 +4,9 @@ 'name' => 'VClaim Request', 'description' => 'Modul vclaim api untuk mLITE', 'author' => 'Basoro', + 'category' => 'bridging', 'version' => '1.1', - 'compatibility' => '5.*.*', + 'compatibility' => '6.*.*', 'icon' => 'database', 'install' => function () use ($core) { diff --git a/plugins/vclaim/README.md b/plugins/vclaim/README.md new file mode 100644 index 000000000..d9ea4cab0 --- /dev/null +++ b/plugins/vclaim/README.md @@ -0,0 +1,82 @@ +# Plugin VClaim Request + +Dokumentasi singkat penggunaan modul **VClaim Request** di mLITE untuk bridging API VClaim BPJS Kesehatan, pengelolaan SEP, rujukan, PRB, dan monitoring klaim. + +## Akses Modul + +- Masuk ke panel admin mLITE. +- Buka menu **VClaim Request**. +- Pilih submenu sesuai kebutuhan: + - Kelola + - Referensi + - Peserta + - Rencana Kontrol + - SEP + - Rujukan + - PRB + - Lembar Pengajuan Klaim + - Monitoring + - Mapping Poli + - Mapping Dokter + +## Panduan Pengguna (Petugas) + +1. **Peserta** + - Cari data peserta BPJS berdasarkan nomor kartu atau NIK. + - Hasil query menampilkan data peserta, status keaktifan, dan kelas rawat dari API VClaim. + +2. **SEP (Surat Eligibilitas Peserta)** + - Buka submenu **SEP** untuk membuat, mengubah, atau menghapus SEP. + - Isi data SEP: nomor kartu peserta, tanggal pelayanan, jenis pelayanan, poliklinik, dokter DPJP, nomor rujukan, dan kelas rawat. + - Klik **Simpan** untuk mengirim SEP ke API VClaim. + - Gunakan **Cetak SEP** untuk mencetak SEP standar atau **Cetak SEP Internal** untuk format internal RS. + - Gunakan **Cetak SRB** (Surat Rujukan Balik) untuk mencetak SRB pasien. + +3. **Rujukan** + - Cari data rujukan pasien dari Faskes Tingkat Pertama berdasarkan nomor rujukan. + - Tampilkan detail rujukan termasuk diagnosa dan tanggal berlaku. + +4. **Rencana Kontrol** + - Buat dan kelola rencana kontrol ulang pasien setelah rawat inap. + - Isi data: nomor SEP, tanggal rencana kontrol, poliklinik tujuan, dan dokter. + +5. **PRB (Program Rujuk Balik)** + - Kelola data PRB pasien penyakit kronis. + - Isi diagnosa PRB, obat PRB, dan keterangan program. + +6. **Lembar Pengajuan Klaim (LPK)** + - Tampilkan LPK untuk keperluan verifikasi klaim rawat inap. + - Filter berdasarkan tanggal dan nomor SEP. + +7. **Monitoring** + - Pantau status klaim yang sudah diajukan melalui dashboard monitoring. + - Filter berdasarkan periode dan jenis pelayanan. + +8. **Referensi** + - Akses data referensi API VClaim: daftar diagnosa ICD-10, prosedur, faskes, dokter DPJP, spesialistik, ruang rawat, cara keluar, dan pasca pulang. + +## Panduan Admin + +1. **Konfigurasi API BPJS VClaim** + - Pastikan kredensial API VClaim sudah diisi pada **Pengaturan** sistem mLITE: + - `BpjsConsID`: Consumer ID dari BPJS + - `BpjsSecretKey`: Secret Key dari BPJS + - `BpjsUserKey`: User Key dari BPJS + - `BpjsApiUrl`: URL API VClaim (production/staging) + - Tanpa kredensial yang valid, seluruh fungsi bridging tidak akan bekerja. + +2. **Mapping Poli** + - Buka submenu **Mapping Poli** untuk memetakan kode poliklinik internal RS ke kode spesialistik BPJS. + - Mapping ini digunakan saat pembuatan SEP agar kode poli sesuai dengan referensi VClaim. + +3. **Mapping Dokter** + - Buka submenu **Mapping Dokter** untuk memetakan kode dokter internal ke kode dokter DPJP BPJS. + - Pastikan semua dokter yang melayani pasien BPJS sudah di-mapping. + +## Catatan + +- Seluruh fungsi di modul ini memerlukan koneksi internet aktif ke server API BPJS VClaim. +- SEP yang sudah dikirim ke BPJS tidak dapat dihapus sembarangan; koordinasikan dengan petugas BPJS sebelum membatalkan SEP. +- QR Code SEP disimpan otomatis di folder `uploads/qrcode/sep/` saat SEP berhasil dibuat. +- Gunakan submenu **Referensi** untuk memverifikasi kode diagnosa, prosedur, dan faskes sebelum mengisi form SEP. +- Halaman Kelola menampilkan dokumentasi ini (README.md) sebagai panduan cepat bagi pengguna. diff --git a/plugins/vclaim/view/admin/add.antrian.html b/plugins/vclaim/view/admin/add.antrian.html index c4b939d45..3ba0c3a83 100644 --- a/plugins/vclaim/view/admin/add.antrian.html +++ b/plugins/vclaim/view/admin/add.antrian.html @@ -4,11 +4,11 @@

                  - {$settings.nama_instansi} + {?=isset_or($settings.nama_instansi)?}
                  @@ -82,11 +82,11 @@ @@ -104,7 +104,7 @@ :
                  - {$data_sep.potensi_prb} + {?=isset_or($data_sep.potensi_prb)?}
                  - +
                  - {$data_sep.no_sep} + {?=isset_or($data_sep.no_sep)?}
                  @@ -121,7 +121,7 @@ : - {$data_sep.tglsep} + {?=isset_or($data_sep.tglsep)?} @@ -138,7 +138,7 @@ : - {$data_sep.no_kartu} (MR: {$data_sep.nomr}) + {?=isset_or($data_sep.no_kartu)?} (MR: {?=isset_or($data_sep.nomr)?}) Peserta @@ -147,7 +147,7 @@ : - {$data_sep.peserta} + {?=isset_or($data_sep.peserta)?} @@ -164,7 +164,7 @@ : - {$data_sep.nama_pasien} ({$data_sep.jkel}) + {?=isset_or($data_sep.nama_pasien)?} ({?=isset_or($data_sep.jkel)?}) COB @@ -190,7 +190,7 @@ : - {$data_sep.tanggal_lahir} + {?=isset_or($data_sep.tanggal_lahir)?} Jns. Rawat @@ -216,7 +216,7 @@ : - {$data_sep.notelep} + {?=isset_or($data_sep.notelep)?} Kls. Rawat @@ -225,7 +225,7 @@ : - Kelas {$data_sep.klsrawat} + Kelas {?=isset_or($data_sep.klsrawat)?} @@ -242,7 +242,7 @@ : - {$data_sep.nmpolitujuan} + {?=isset_or($data_sep.nmpolitujuan)?}
                  - {$data_sep.nama_pasien}
                  + {?=isset_or($data_sep.nama_pasien)?}
                  ----------------------------------- @@ -419,7 +419,7 @@
                  @@ -429,7 +429,7 @@ @@ -459,7 +459,7 @@ + diff --git a/plugins/vclaim/view/admin/form.sep.html b/plugins/vclaim/view/admin/form.sep.html index 393848048..df393175b 100644 --- a/plugins/vclaim/view/admin/form.sep.html +++ b/plugins/vclaim/view/admin/form.sep.html @@ -16,6 +16,7 @@
                  NIK:
                  No. MR:
                  Tgl. Lahir:
                  Peserta:
                  +
                  Prov Umum:
                  Status:
                  @@ -129,6 +130,25 @@

                  +
                  +
                  +

                  + SEP Internal +

                  +
                  +
                  +
                  +
                  + + +
                  + +
                  +
                  +
                  +
                  @@ -161,7 +181,7 @@

                  - +
                  @@ -442,7 +462,7 @@

                  - +
                  @@ -511,6 +531,7 @@

                  +
                  +