Compare commits

...
470 Commits
Author SHA1 Message Date
Dwi Swandhana 97de187bc8 update 2026-08-19 14:27:05 +07:00
Dwi Swandhana 5b284fd0d3 update 2026-08-18 05:16:08 +07:00
Dwi Swandhana 6c6520b3eb update 2026-08-13 10:27:05 +07:00
Dwi Swandhana 59d448360f update 2026-08-13 10:25:13 +07:00
Dwi Swandhana 3decbec88e update 2026-08-12 10:51:17 +07:00
Dwi Swandhana c3af859439 update 2026-08-10 10:45:31 +07:00
Dwi Swandhana ec2c3178ee update 2026-08-10 09:43:15 +07:00
Dwi Swandhana fd3068bead update 2026-08-09 13:25:49 +07:00
Dwi Swandhana 550fc64763 update 2026-08-09 13:16:47 +07:00
Dwi Swandhana 58e27eb92b update 2026-08-09 12:56:27 +07:00
Dwi Swandhana 765bfd91f3 update 2026-08-09 12:52:13 +07:00
Dwi Swandhana 36582a9811 update 2026-08-09 12:50:25 +07:00
Dwi Swandhana d764663f35 update 2026-08-09 12:49:08 +07:00
Dwi Swandhana 14301f7216 update 2026-08-09 12:44:29 +07:00
Dwi Swandhana 9dc9bccc76 update 2026-08-09 12:43:08 +07:00
Dwi Swandhana 36ad5d7af2 update 2026-08-09 12:40:12 +07:00
Dwi Swandhana a04c5330d5 update 2026-08-09 12:36:44 +07:00
Dwi Swandhana 3ef25c9e95 update 2026-08-09 12:23:07 +07:00
Dwi Swandhana b82a799e20 update 2026-08-06 19:32:16 +07:00
Dwi Swandhana f0dc7987a9 update 2026-08-06 17:59:06 +07:00
Dwi Swandhana 73a9ac103e update 2026-08-06 17:57:59 +07:00
Dwi Swandhana 3e6b70d7bd update 2026-08-05 15:45:34 +07:00
Dwi Swandhana 136470d4ba update 2026-08-05 15:37:52 +07:00
Dwi Swandhana 9363533c3c update 2026-08-04 15:23:34 +07:00
Dwi Swandhana b93784be6a update 2026-08-04 15:04:13 +07:00
Dwi Swandhana caa039b5b4 update 2026-08-04 11:34:17 +07:00
Dwi Swandhana d8fc98d1a8 update 2026-08-04 11:15:59 +07:00
Dwi Swandhana fd865f6756 update 2026-08-04 09:49:25 +07:00
Dwi Swandhana 587267b63a update 2026-08-04 06:24:43 +07:00
Dwi Swandhana 08a62487ab update 2026-08-04 06:22:45 +07:00
Dwi Swandhana bb2c893872 update 2026-08-04 06:11:52 +07:00
Dwi Swandhana 3192425fc6 update 2026-08-04 06:05:18 +07:00
Dwi Swandhana c2cbdff4e5 update 2026-08-04 06:01:06 +07:00
Dwi Swandhana d369d3754b update 2026-08-04 05:55:29 +07:00
Dwi Swandhana 2bf4cac343 update 2026-08-04 05:34:07 +07:00
Dwi Swandhana 207c9ef17d update 2026-08-04 05:32:25 +07:00
Dwi Swandhana f97105aeb0 update 2026-08-04 04:58:13 +07:00
Dwi Swandhana 60681f08cc update 2026-08-03 18:34:45 +07:00
Dwi Swandhana b957be735d update 2026-08-02 20:21:35 +07:00
Dwi Swandhana 3e1ed72727 update 2026-08-02 10:46:34 +07:00
Dwi Swandhana 334728e16e update 2026-08-02 05:31:32 +07:00
Dwi Swandhana 16f541ca77 update 2026-08-02 05:23:11 +07:00
Dwi Swandhana cd07dee705 update 2026-08-01 20:59:08 +07:00
Dwi Swandhana c7771029ee update 2026-08-01 20:55:51 +07:00
Dwi Swandhana 19c3e0b6d4 update 2026-08-01 20:44:49 +07:00
Dwi Swandhana d5f6f2812c update 2026-08-01 20:42:19 +07:00
Dwi Swandhana 4ebcbf0869 update 2026-08-01 20:37:14 +07:00
Dwi Swandhana 8e87beeb9f update 2026-08-01 20:33:09 +07:00
Dwi Swandhana 2f60f36307 update 2026-08-01 17:05:17 +07:00
Dwi Swandhana 03855a99b1 update 2026-08-01 17:04:47 +07:00
Dwi Swandhana 0891978d46 update 2026-08-01 17:02:31 +07:00
Dwi Swandhana a3a98b13e3 update 2026-08-01 12:18:05 +07:00
Dwi Swandhana 119f73403e update 2026-08-01 12:15:25 +07:00
Dwi Swandhana 410916f963 update 2026-07-31 14:05:55 +07:00
Dwi Swandhana d1e6ab0133 update 2026-07-29 05:23:37 +07:00
Dwi Swandhana 73b2e1ca7c update 2026-07-29 05:08:33 +07:00
Dwi Swandhana 9cc78b23e0 update 2026-07-22 16:36:21 +07:00
Dwi Swandhana 213270ede1 update 2026-07-22 16:33:42 +07:00
Dwi Swandhana e04d43dfdf update 2026-07-22 14:06:01 +07:00
Dwi Swandhana 848f0e4100 update 2026-07-22 13:32:12 +07:00
Dwi Swandhana 5774d55f71 update 2026-07-22 10:01:55 +07:00
Dwi Swandhana 9e4774bd5e update 2026-07-22 09:07:43 +07:00
Dwi Swandhana 92dc35396b update 2026-07-22 05:47:03 +07:00
Dwi Swandhana 040284ec29 update 2026-07-22 05:38:14 +07:00
Dwi Swandhana b222a79283 update 2026-07-22 05:34:34 +07:00
Dwi Swandhana 32db765b98 update 2026-07-22 05:18:55 +07:00
Dwi Swandhana 6d0f9a8bf6 update 2026-07-21 19:08:27 +07:00
Dwi Swandhana d944647129 update 2026-07-21 05:45:47 +07:00
Dwi Swandhana 707e2cb841 update 2026-07-20 11:25:33 +07:00
Dwi Swandhana 0123036226 update 2026-07-20 05:58:11 +07:00
Dwi Swandhana 08984801f9 update 2026-07-19 21:54:01 +07:00
Dwi Swandhana 82dc63822e update 2026-07-19 21:41:33 +07:00
Dwi Swandhana d1e9fe03d6 update 2026-07-19 21:37:35 +07:00
Dwi Swandhana 8a233d6c1b update 2026-07-19 21:32:48 +07:00
Dwi Swandhana 335355a5ba update 2026-07-19 21:25:03 +07:00
Dwi Swandhana 4450076726 update 2026-07-19 21:23:09 +07:00
Dwi Swandhana 5e097c1abc update 2026-07-19 21:16:52 +07:00
Dwi Swandhana 92117e3320 update 2026-07-19 21:16:38 +07:00
Dwi Swandhana 3f0f6534d7 update 2026-07-19 21:09:16 +07:00
Dwi Swandhana 7febb03b5d update 2026-07-19 20:57:33 +07:00
Dwi Swandhana 30e39875c0 update 2026-07-19 20:47:08 +07:00
Dwi Swandhana 616f0658d6 update 2026-07-12 18:38:11 +07:00
Dwi Swandhana 9b831791f5 update 2026-07-11 11:26:25 +07:00
Dwi Swandhana 79ff65d87c update 2026-07-11 06:32:24 +07:00
Dwi Swandhana d6bba3e216 update 2026-07-11 06:21:16 +07:00
Dwi Swandhana 943282e3f9 update 2026-07-06 10:25:31 +07:00
Dwi Swandhana 0f93db0431 update 2026-07-06 10:08:26 +07:00
Dwi Swandhana f2dbbf9f5e update 2026-07-06 10:06:29 +07:00
Dwi Swandhana 741ac2dffd update 2026-07-06 09:25:59 +07:00
Dwi Swandhana 510e8a2352 update 2026-07-04 09:36:08 +07:00
Dwi Swandhana 146bab0a46 update 2026-07-04 05:17:15 +07:00
Dwi Swandhana d725332bc3 update 2026-07-04 05:13:44 +07:00
Dwi Swandhana 67ff560077 update 2026-07-03 21:04:10 +07:00
Dwi Swandhana 0f8c73bc50 update 2026-07-03 20:58:47 +07:00
Dwi Swandhana f857eec85c update 2026-07-03 20:48:38 +07:00
Dwi Swandhana ed92325536 update 2026-06-19 20:19:34 +07:00
Dwi Swandhana 9a65fa8227 update 2026-06-17 05:04:21 +07:00
Dwi Swandhana 480db23635 update 2026-06-15 06:01:37 +07:00
Dwi Swandhana 7758df12f2 update 2026-06-15 05:53:14 +07:00
Dwi Swandhana cc11aecb10 update 2026-06-15 05:49:25 +07:00
Dwi Swandhana 513eacbfa1 update 2026-06-15 05:40:35 +07:00
Dwi Swandhana d3ac4fc33f update 2026-06-11 12:07:23 +08:00
Dwi Swandhana f7cb75c9cf update 2026-06-09 18:02:18 +07:00
Dwi Swandhana b793755d95 update 2026-06-09 08:56:30 +07:00
Dwi Swandhana fb6e11c0e6 update 2026-06-08 11:38:15 +07:00
Dwi Swandhana 305c87de9a update 2026-06-08 11:36:47 +07:00
Dwi Swandhana 3660303c3c update 2026-06-06 06:26:23 +07:00
Dwi Swandhana 050ff69068 update 2026-06-05 04:57:21 +07:00
Dwi Swandhana 5064baa89e update 2026-06-04 15:21:11 +07:00
Dwi Swandhana 8ee7760ad4 update 2026-06-04 15:15:39 +07:00
Dwi Swandhana c6522590fa update 2026-06-03 18:05:00 +07:00
Dwi Swandhana 90c7a70214 update 2026-06-03 17:58:55 +07:00
Dwi Swandhana 46c6c2f48b update 2026-05-31 04:51:20 +07:00
Dwi Swandhana dd227a88b3 update 2026-05-25 08:22:29 +07:00
Dwi Swandhana 0ffa8786c2 update 2026-05-25 04:56:48 +07:00
Dwi Swandhana 9fa23b9826 update 2026-05-21 09:56:40 +07:00
Dwi Swandhana 3e9e8daea6 update 2026-05-21 06:37:14 +07:00
Dwi Swandhana acac1fe3c8 update 2026-05-19 20:34:27 +07:00
Dwi Swandhana 714b6ab26d update 2026-05-19 20:19:36 +07:00
Dwi Swandhana a9c6cf12ca update 2026-05-19 17:51:09 +07:00
Dwi Swandhana 930cf48cfe update 2026-05-18 12:46:11 +07:00
Dwi Swandhana a0a2e79067 update 2026-05-18 12:36:14 +07:00
Dwi Swandhana c78d15e67a update 2026-05-18 12:24:18 +07:00
Dwi Swandhana c70d7ebb93 update 2026-05-17 06:26:52 +07:00
Dwi Swandhana 03090cbe74 update 2026-05-17 04:11:19 +07:00
Dwi Swandhana 45b4f41e57 update 2026-05-14 04:51:12 +07:00
Dwi Swandhana dd14d2ddf5 update 2026-05-13 19:05:23 +07:00
Dwi Swandhana 493dfe18eb update 2026-05-13 15:29:02 +07:00
Dwi Swandhana 49e94c3fb5 Fix mikro expertise auto-open and early warning target logic 2026-05-09 05:47:10 +07:00
Dwi Swandhana 4d942523d1 update 2026-05-08 18:32:53 +07:00
Dwi Swandhana 35d8211a65 update 2026-05-07 19:29:23 +07:00
Dwi Swandhana b6f2e66729 update 2026-05-07 19:24:37 +07:00
Dwi Swandhana 4ffd7fa681 update 2026-05-07 15:21:50 +07:00
Dwi Swandhana 362a70fa1a update 2026-05-07 14:51:25 +07:00
Dwi Swandhana cf6fd529b0 update 2026-05-07 11:31:05 +07:00
Dwi Swandhana 9ec56cbf5d update 2026-05-07 11:27:13 +07:00
Dwi Swandhana 4cfd4307a8 update 2026-05-07 11:20:25 +07:00
Dwi Swandhana 264e383b67 update 2026-05-07 11:19:28 +07:00
Dwi Swandhana 8863dbb85f update 2026-05-07 10:48:22 +07:00
Dwi Swandhana da5105f219 update 2026-05-07 09:40:31 +07:00
Dwi Swandhana a6b180378b update 2026-05-07 09:39:01 +07:00
Dwi Swandhana 667e5924a8 update 2026-05-07 09:33:52 +07:00
Dwi Swandhana ea436f76d8 update 2026-05-07 06:01:15 +07:00
Dwi Swandhana 206a90ff2f update 2026-05-07 05:57:19 +07:00
Dwi Swandhana 52cc4a58cf update 2026-05-07 05:56:36 +07:00
Dwi Swandhana 229c0dd9f3 update 2026-05-07 05:51:43 +07:00
Dwi Swandhana 4a48063931 Fix BD ASTM frame reassembly and result parsing 2026-05-07 05:23:37 +07:00
Dwi Swandhana 04ad16f72a update 2026-05-05 06:00:03 +07:00
Dwi Swandhana 22a877f2e7 update 2026-05-04 17:55:00 +07:00
Dwi Swandhana df3396a776 update 2026-05-04 15:32:55 +07:00
Dwi Swandhana b751d782c4 update 2026-05-04 08:17:54 +07:00
Dwi Swandhana 453e3db3a3 update 2026-05-04 08:02:34 +07:00
Dwi Swandhana a0bd6b645c update 2026-05-04 08:00:33 +07:00
Dwi Swandhana 16eac8512e update 2026-05-04 06:32:22 +07:00
Dwi Swandhana fe89a024a1 update 2026-05-02 12:57:27 +07:00
Dwi Swandhana 38ffa918c3 update 2026-05-01 04:58:51 +07:00
Dwi Swandhana d8c6ab7b55 Align target deadlines in early warning and reports 2026-04-29 09:55:00 +07:00
Dwi Swandhana bb680d41d3 update 2026-04-24 13:58:35 +07:00
Dwi Swandhana 4971ad0d5a update 2026-04-24 13:45:00 +07:00
Dwi Swandhana 008400f1e0 update 2026-04-24 13:39:52 +07:00
Dwi Swandhana b3caf1691d update 2026-04-23 14:31:36 +07:00
Dwi Swandhana 1a1d58e60a update 2026-04-23 13:55:32 +07:00
Dwi Swandhana 1b41f3e6ee update 2026-04-21 10:37:05 +07:00
Dwi Swandhana 93ee78982f update 2026-04-21 09:37:50 +07:00
Dwi Swandhana 7ca1e3a96e update 2026-04-20 15:37:11 +07:00
Dwi Swandhana e3086919b7 update 2026-04-20 09:59:14 +07:00
Dwi Swandhana f52b4a42e1 update 2026-04-20 09:54:57 +07:00
Dwi Swandhana 0c3a29e3b6 update 2026-04-20 09:52:42 +07:00
Dwi Swandhana 8628087bfc update 2026-04-20 09:50:38 +07:00
Dwi Swandhana f964939863 update 2026-04-20 09:46:42 +07:00
Dwi Swandhana b139161cca update 2026-04-20 09:42:28 +07:00
Dwi Swandhana 2abb6027a6 Support multiple species rows in glass report 2026-04-20 09:38:05 +07:00
Dwi Swandhana 5c5bf0ce19 Split glass report into three tables 2026-04-20 05:15:17 +07:00
Dwi Swandhana f301de8cb5 Support ASTM framing for GeneXpert responses 2026-04-16 17:56:50 +07:00
Dwi Swandhana b7195cc629 Expand GenXpert assay mapping and use assay-based responses 2026-04-15 18:39:01 +07:00
Dwi Swandhana 2b91b18275 Align GeneXpert query handling with passive server mode 2026-04-14 11:02:10 +07:00
Dwi Swandhana 676ec49cb2 update 2026-04-14 09:54:48 +07:00
Dwi Swandhana b34a379333 update 2026-04-14 09:22:37 +07:00
Dwi Swandhana 0c17c91f92 update 2026-04-14 09:21:30 +07:00
Dwi Swandhana 20ca52ca4d update 2026-04-13 16:46:42 +07:00
Duidev Software House 2371584fdc update 2026-04-13 16:45:02 +07:00
Dwi Swandhana fa0ebaa045 update 2026-04-13 16:44:51 +07:00
Dwi Swandhana e2975ea6f2 update 2026-04-12 18:45:51 +07:00
Dwi Swandhana cfc9ec5b76 update 2026-04-12 09:17:33 +07:00
Dwi Swandhana 1e9f6f9ddf update 2026-04-12 09:10:28 +07:00
Dwi Swandhana ed406bad08 update 2026-04-10 22:23:17 +07:00
Dwi Swandhana 4d025dc57d update 2026-04-10 22:15:49 +07:00
Dwi Swandhana 4f7575c7d4 update 2026-04-10 20:01:01 +07:00
Dwi Swandhana e1a3598472 Enable GenExpert auto polling and flag eligible TCM orders 2026-04-10 19:45:42 +07:00
Dwi Swandhana 6e9951adf6 update 2026-04-10 18:21:26 +07:00
Dwi Swandhana 9716fc05f6 update 2026-04-10 18:16:52 +07:00
Dwi Swandhana b0da4e5433 update 2026-04-10 18:11:25 +07:00
Dwi Swandhana f84131e6bf update 2026-04-10 08:00:22 +07:00
Dwi Swandhana 9751007863 update 2026-04-08 05:44:57 +07:00
Dwi Swandhana 68f6ecc98e update 2026-04-07 18:17:38 +07:00
Dwi Swandhana e850444e12 update 2026-04-07 12:39:11 +07:00
Dwi Swandhana 8a96f58858 update 2026-04-07 12:21:24 +07:00
Dwi Swandhana 15095734b1 update 2026-04-07 12:16:36 +07:00
Dwi Swandhana 500f97f63e update 2026-04-06 14:33:35 +07:00
Dwi Swandhana 4f3bb88f68 update 2026-04-04 09:19:19 +07:00
Dwi Swandhana d5c4438b75 update 2026-04-04 07:21:13 +07:00
Dwi Swandhana 0e733aa14a update 2026-04-04 06:58:02 +07:00
Dwi Swandhana cd1a8d64b9 update 2026-04-04 06:45:03 +07:00
Dwi Swandhana 80d03ac5c1 update 2026-04-04 06:43:44 +07:00
Duidev Software House a979b16df4 update 2026-04-04 05:55:40 +07:00
Dwi Swandhana 4da0cc6253 update 2026-04-04 05:55:28 +07:00
Dwi Swandhana bbc6dee2c9 update 2026-03-15 12:13:55 +07:00
Dwi Swandhana 6a009108e7 update 2026-03-15 05:54:27 +07:00
Dwi Swandhana e3afceee52 Tambahkan notifikasi nilai kritis 2026-03-15 05:51:26 +07:00
Dwi Swandhana 89d254eae8 update 2026-03-13 14:50:47 +07:00
Dwi Swandhana 5a6dfc2a1e update 2026-03-13 13:32:22 +07:00
Dwi Swandhana b418df929f update 2026-03-13 13:31:40 +07:00
Dwi Swandhana 7870c17cfc Merge branch 'main' of https://github.com/servdal/lis 2026-03-13 12:42:28 +07:00
Dwi Swandhana d6fd25c41a Tambah tab Master Barang 2026-03-13 12:39:52 +07:00
Duidev Software House 2ae99ec5a0 update 2026-03-13 12:32:03 +07:00
Dwi Swandhana 5d3a3eecd0 Improve GudangPos barcode fields 2026-03-13 12:31:48 +07:00
Dwi Swandhana 6fb3f5a629 Perbarui cetak dan stok barcode 2026-03-13 12:24:10 +07:00
Dwi Swandhana 52ee41e50c update 2026-03-11 14:23:55 +07:00
Duidev Software House d6b59cce4c update 2026-03-11 14:19:51 +07:00
Dwi Swandhana e03381c6aa update 2026-03-11 14:19:37 +07:00
Dwi Swandhana 3eb845b503 update 2026-03-10 13:54:58 +07:00
Dwi Swandhana 5aed126889 update 2026-03-10 13:53:06 +07:00
Dwi Swandhana 2e0461b528 update 2026-03-09 07:28:02 +07:00
Dwi Swandhana 95d2f6e507 update 2026-03-09 07:24:56 +07:00
Dwi Swandhana a1ac1f888b update 2026-03-08 18:35:58 +07:00
Dwi Swandhana f7bf4ddf1a update 2026-03-07 05:03:07 +07:00
Dwi Swandhana 490e580bd1 update 2026-03-06 20:19:23 +07:00
Dwi Swandhana f27c7430c3 update 2026-03-06 15:04:30 +07:00
Dwi Swandhana e7de471d8a update 2026-03-06 15:02:24 +07:00
Dwi Swandhana 6ed786db1b update 2026-03-06 14:56:24 +07:00
Dwi Swandhana 4ce48077e6 update 2026-03-06 13:31:04 +07:00
Dwi Swandhana ba793c03f2 update 2026-03-06 13:06:25 +07:00
Dwi Swandhana a67f5fc607 update 2026-03-06 12:59:23 +07:00
Dwi Swandhana 5f37ce8def update 2026-03-06 12:58:40 +07:00
Dwi Swandhana 9bd38a470e update 2026-03-06 12:42:46 +07:00
Dwi Swandhana 3754ae3531 update 2026-03-06 12:40:29 +07:00
Dwi Swandhana 27ef021783 update 2026-03-06 12:32:36 +07:00
Dwi Swandhana fa26a01143 update 2026-03-06 12:31:39 +07:00
Dwi Swandhana 2dffd56816 update 2026-03-06 06:54:18 +07:00
Dwi Swandhana ab438f0c55 update 2026-03-06 06:52:40 +07:00
Dwi Swandhana 5d6afc19af update 2026-03-05 18:51:46 +07:00
Dwi Swandhana c290ac693b update 2026-03-05 18:49:37 +07:00
Dwi Swandhana e3094ff717 update 2026-03-05 18:30:28 +07:00
Dwi Swandhana 38251402b8 update 2026-03-05 17:07:50 +07:00
Dwi Swandhana afa2aa1447 update 2026-03-05 17:07:02 +07:00
Dwi Swandhana d6824037d2 update 2026-03-05 16:01:31 +07:00
Dwi Swandhana 004085d0e5 update 2026-03-05 16:00:22 +07:00
Dwi Swandhana d9e1af195c update 2026-03-05 12:09:10 +07:00
Dwi Swandhana 934c90c412 update 2026-03-05 12:07:34 +07:00
Dwi Swandhana f1a5e63800 update 2026-03-05 10:41:00 +07:00
Dwi Swandhana beb9777832 update 2026-03-05 10:40:12 +07:00
Dwi Swandhana aca2d9d745 update 2026-03-05 09:59:42 +07:00
Dwi Swandhana 97fce44ad3 update 2026-03-05 06:42:28 +07:00
Dwi Swandhana cfdf71f816 update 2026-03-05 06:41:56 +07:00
Dwi Swandhana 2782f43290 update 2026-03-05 06:20:47 +07:00
Dwi Swandhana b945d8198a update 2026-03-05 06:19:36 +07:00
Dwi Swandhana f930494592 update 2026-03-05 06:12:21 +07:00
Dwi Swandhana fc0864de08 update 2026-03-05 06:11:58 +07:00
Dwi Swandhana 632fff4230 update 2026-03-05 06:10:10 +07:00
Dwi Swandhana 72041e07ce update 2026-03-04 20:17:46 +07:00
Dwi Swandhana ec0612a1dc update 2026-03-04 20:10:15 +07:00
Dwi Swandhana c96552789e update 2026-03-04 19:01:23 +07:00
Dwi Swandhana 08bddf171a update 2026-03-04 18:43:13 +07:00
Dwi Swandhana 28d8b283fb update 2026-03-04 18:42:02 +07:00
Dwi Swandhana bbd4a82d49 update 2026-03-04 18:40:24 +07:00
Dwi Swandhana b4d3e2987b update 2026-03-04 18:39:05 +07:00
Dwi Swandhana ff7b6288aa update 2026-03-04 18:37:37 +07:00
Dwi Swandhana e308134a67 update 2026-03-04 18:36:23 +07:00
Dwi Swandhana be74b25ae3 update 2026-03-04 18:35:14 +07:00
Dwi Swandhana b7fba7a91c update 2026-03-04 17:50:06 +07:00
Dwi Swandhana f389483da1 update 2026-03-04 17:49:49 +07:00
Dwi Swandhana 1cfb63ab60 update 2026-03-04 17:45:11 +07:00
Dwi Swandhana ae003aaa2f update 2026-03-04 17:44:17 +07:00
Dwi Swandhana 5cc7ec4fcf update 2026-03-04 17:43:19 +07:00
Dwi Swandhana 4a8006c399 update 2026-03-04 17:42:00 +07:00
Dwi Swandhana e0ac8dd30d update 2026-03-03 11:41:15 +07:00
Dwi Swandhana d59f1a9807 update 2026-02-28 14:50:28 +07:00
Dwi Swandhana 90e9382d30 update 2026-02-28 10:19:23 +07:00
Dwi Swandhana 9f3ce0c1b7 update 2026-02-26 12:43:50 +07:00
Dwi Swandhana b41981b798 update 2026-02-26 12:19:42 +07:00
Dwi Swandhana 86d4a2354b update 2026-02-26 10:03:29 +07:00
Dwi Swandhana b353f00659 update 2026-02-25 11:24:30 +07:00
Dwi Swandhana 9d33a2eb51 update 2026-02-25 11:23:28 +07:00
Dwi Swandhana e0edd03157 update 2026-02-24 17:20:42 +07:00
Dwi Swandhana d18c5abd78 update 2026-02-24 17:17:51 +07:00
Dwi Swandhana c3d0929cda update 2026-02-24 16:59:06 +07:00
Dwi Swandhana 354f869b13 update 2026-02-23 17:46:27 +07:00
Dwi Swandhana 6d23d9c97d Tambahkan menu expired gudang 2026-02-23 17:41:14 +07:00
Dwi Swandhana 93c5e9ef09 update 2026-02-23 05:45:38 +07:00
Dwi Swandhana 9960f1337d update 2026-02-22 06:29:51 +07:00
Dwi Swandhana 26c559b3c6 Add MyLA Vitek3 flag handling 2026-02-22 06:25:04 +07:00
Dwi Swandhana c35df25932 update 2026-02-21 19:04:15 +07:00
Dwi Swandhana af2dd2f819 update 2026-02-21 18:58:12 +07:00
Dwi Swandhana aed5885eb1 update 2026-02-21 06:37:46 +07:00
Dwi Swandhana 41cbe00299 update 2026-02-21 06:32:31 +07:00
Dwi Swandhana b8a94e4508 update 2026-02-21 06:26:45 +07:00
Dwi Swandhana 9f1a28ae97 update 2026-02-21 06:21:04 +07:00
Dwi Swandhana 9b39dfb856 update 2026-02-21 06:18:29 +07:00
Dwi Swandhana 924610e36e update 2026-02-21 06:14:05 +07:00
Dwi Swandhana 074a260c8c update 2026-02-21 06:10:17 +07:00
Dwi Swandhana 3c63cb5d22 update 2026-02-21 06:06:56 +07:00
Dwi Swandhana 5274d53681 update 2026-02-21 05:44:43 +07:00
Dwi Swandhana f2e562564d update 2026-02-21 05:39:38 +07:00
Dwi Swandhana dea0da9357 update 2026-02-21 05:32:08 +07:00
Dwi Swandhana b8c61a054b update 2026-02-21 05:29:24 +07:00
Dwi Swandhana f7ccea75dc update 2026-02-21 05:28:47 +07:00
Dwi Swandhana 3b61faafbd update 2026-02-21 05:12:55 +07:00
Dwi Swandhana 1dac4b9e2a update 2026-02-19 09:51:19 +07:00
Dwi Swandhana 638bec1c1c update 2026-02-19 09:47:50 +07:00
Dwi Swandhana fddfe775ce update 2026-02-19 09:42:12 +07:00
Dwi Swandhana 6d859d1c6a Fix tp error persistence 2026-02-19 09:24:28 +07:00
Dwi Swandhana b5ee2d995e update 2026-02-17 15:45:42 +07:00
Dwi Swandhana c018b31c22 update 2026-02-13 09:17:54 +07:00
Dwi Swandhana 37826bd08f update 2026-02-12 10:24:06 +07:00
Dwi Swandhana a6807575a2 update 2026-02-09 03:50:56 +07:00
Dwi Swandhana a39f26e226 update 2026-02-08 18:43:37 +07:00
Dwi Swandhana 81c5249575 Tambahkan restart otomatis saat ters 2026-02-08 05:03:50 +07:00
Dwi Swandhana 6acae8ddc5 update 2026-02-06 05:12:07 +07:00
Dwi Swandhana 539d0a8b50 update 2026-02-05 05:59:37 +07:00
Dwi Swandhana 6f5f9c179e update 2026-02-04 15:52:21 +07:00
Dwi Swandhana 7f0f7439c0 update 2026-02-04 11:10:25 +07:00
Dwi Swandhana cd14cdfdb4 update 2026-02-04 08:31:33 +07:00
Dwi Swandhana 9ab8aa2f52 update 2026-02-04 07:58:54 +07:00
Dwi Swandhana 434727a6eb update 2026-02-03 13:02:47 +07:00
Dwi Swandhana 2592d8190e update 2026-02-03 12:58:52 +07:00
Dwi Swandhana f2c2e3441e update 2026-02-02 08:43:59 +07:00
Dwi Swandhana cbc7fcd1be update 2026-02-01 09:57:12 +07:00
Dwi Swandhana d56a218253 update 2026-02-01 09:25:26 +07:00
Dwi Swandhana 077a8af2c2 push 2026-02-01 05:11:30 +07:00
Dwi Swandhana 475ff6ef9b push 2026-02-01 05:08:16 +07:00
Dwi Swandhana b242d6726d update 2026-01-31 17:50:07 +07:00
Dwi Swandhana 55b9698f69 update 2026-01-31 16:17:54 +07:00
Dwi Swandhana 897bbba085 update 2026-01-31 15:57:11 +07:00
Dwi Swandhana 3af340d09d update 2026-01-31 15:51:45 +07:00
Dwi Swandhana 11bc7e172f update 2026-01-31 06:45:48 +07:00
Dwi Swandhana d8ff19c9b2 update 2026-01-30 21:07:15 +07:00
Dwi Swandhana 083de5fb96 update 2026-01-30 19:55:57 +07:00
Dwi Swandhana 41139d3df5 update 2026-01-30 19:50:40 +07:00
Dwi Swandhana 5865d44110 Add Listener Pyhton 2026-01-30 19:06:58 +07:00
Dwi Swandhana 32cd616fac push 2026-01-30 10:09:23 +07:00
Dwi Swandhana db0695803e push 2026-01-30 10:05:59 +07:00
Dwi Swandhana c8542b2816 push 2026-01-30 10:02:03 +07:00
Dwi Swandhana 06ea1415cc push 2026-01-30 10:00:28 +07:00
Dwi Swandhana 8bb448229c push 2026-01-30 09:48:31 +07:00
Dwi Swandhana 5c255e2e83 push 2026-01-30 09:46:59 +07:00
Dwi Swandhana a9ea401f65 push 2026-01-30 09:45:38 +07:00
Dwi Swandhana b0586dac0a push 2026-01-30 09:44:33 +07:00
Dwi Swandhana ae32330ed7 push 2026-01-30 09:42:18 +07:00
Dwi Swandhana 2f66799ba3 push 2026-01-30 09:40:39 +07:00
Dwi Swandhana 55a1229440 push 2026-01-30 09:39:19 +07:00
Dwi Swandhana c2b25fa4ca push 2026-01-30 09:36:19 +07:00
Dwi Swandhana 2752193752 push 2026-01-30 07:47:02 +07:00
Dwi Swandhana 7e53d8e1da push 2026-01-30 07:41:18 +07:00
Dwi Swandhana 03f087212f push 2026-01-30 06:31:22 +07:00
Dwi Swandhana f773ae23da push 2026-01-30 06:30:11 +07:00
Dwi Swandhana 756a6ccc68 push 2026-01-30 06:27:16 +07:00
Dwi Swandhana 1e1b2fafed push 2026-01-30 06:25:24 +07:00
Dwi Swandhana 355ba42865 update 2026-01-25 17:09:41 +07:00
Dwi Swandhana eff628ae2a update 2026-01-25 16:54:36 +07:00
Dwi Swandhana 5df034f972 update 2026-01-25 16:44:03 +07:00
Dwi Swandhana 9f0d1118b0 update 2026-01-21 19:08:54 +07:00
Dwi Swandhana ddef9f4ffb update 2026-01-21 19:01:24 +07:00
Dwi Swandhana 62fa8c2f9f update 2026-01-20 11:30:09 +07:00
Dwi Swandhana beb0efa075 update 2026-01-20 11:28:49 +07:00
Dwi Swandhana 42a2424721 update 2026-01-20 09:46:12 +07:00
Dwi Swandhana 6b79efb025 update 2026-01-20 04:45:24 +07:00
Dwi Swandhana c7d542522e update 2026-01-19 20:12:34 +07:00
Dwi Swandhana 7ec8d0dbcc update 2026-01-19 20:12:08 +07:00
lismikrovendor 43cd6afde8 update 2026-01-19 20:08:22 +07:00
Dwi Swandhana 607a867376 update 2026-01-19 19:46:32 +07:00
Dwi Swandhana 9e3368d69d update 2026-01-19 19:46:32 +07:00
Dwi Swandhana 13259e78c8 update 2026-01-14 14:24:43 +07:00
Dwi Swandhana 7140bb4e2e update 2026-01-14 09:05:03 +07:00
Dwi Swandhana cb2f8f1a28 update 2026-01-14 09:01:03 +07:00
Dwi Swandhana e1297e0a68 update 2026-01-14 08:33:37 +07:00
Dwi Swandhana 14130282ed update 2026-01-14 08:29:18 +07:00
Dwi Swandhana fca937d1de update 2026-01-14 08:25:26 +07:00
Duidev Software House b7eea4a204 update 2026-01-11 10:14:38 +07:00
Duidev Software House 6d9752dca5 update 2026-01-11 10:07:12 +07:00
Duidev Software House 321be52826 update 2026-01-11 09:20:09 +07:00
Duidev Software House 9ce76551b9 update 2026-01-11 09:18:18 +07:00
Duidev Software House 62dd01964a update 2026-01-11 09:07:49 +07:00
Duidev Software House 7517e70146 update 2026-01-11 05:28:12 +07:00
Duidev Software House dd662cdb9f update 2026-01-10 09:27:00 +07:00
Duidev Software House 1549af8344 update 2026-01-09 20:38:24 +07:00
Duidev Software ff8c7d4c6d update 2026-01-08 04:34:55 +07:00
Duidev Software 54160e2e19 update 2026-01-06 09:55:02 +07:00
Duidev Software 58cb578332 update 2026-01-06 09:15:27 +07:00
Duidev Software bf70061993 update 2026-01-06 09:12:03 +07:00
Duidev Software cf60f77f13 update 2026-01-06 08:40:23 +07:00
Duidev Software 3cd985682f update 2026-01-06 08:32:15 +07:00
Duidev Software 8616d20d9c update 2026-01-06 06:32:32 +07:00
Duidev Software 950de788d5 update 2026-01-06 06:29:11 +07:00
Duidev Software 1d1a300a85 update 2026-01-06 06:14:22 +07:00
Duidev Software a7aaf4befe update 2026-01-06 06:11:08 +07:00
Duidev Software 3e5501faa6 update 2026-01-06 05:07:35 +07:00
Duidev Software 403cc24bc9 update 2026-01-05 07:42:35 +07:00
Duidev Software f011f8e71e update 2026-01-04 20:59:24 +07:00
Duidev Software 8d81bd606e update 2026-01-04 20:57:58 +07:00
Duidev Software 6cba217e92 update 2026-01-04 20:54:50 +07:00
Duidev Software 5d40f403f1 update 2026-01-04 20:51:47 +07:00
Duidev Software f943337f7c update 2026-01-04 20:49:41 +07:00
Duidev Software 22076a7b11 update 2026-01-04 20:34:45 +07:00
Duidev Software a8988d3675 update 2026-01-04 20:05:59 +07:00
Duidev Software 146197af3a update 2026-01-04 19:59:14 +07:00
Duidev Software edc26692f9 update 2026-01-04 16:36:17 +07:00
Duidev Software 06e9c199b7 Fix platform php version constraint to 8.4 generic 2026-01-02 17:10:14 +07:00
Duidev Software 337dfdb5dd update 2026-01-02 17:05:08 +07:00
Duidev Software 5571e206db update 2026-01-02 17:01:39 +07:00
Duidev Software a9afeeb12d update 2026-01-02 16:58:29 +07:00
Duidev Software 4583ac6cd7 update 2026-01-02 16:42:43 +07:00
Duidev Software 98d6b688e9 Update 2026-01-02 13:25:45 +07:00
Duidev Software 8be6231df6 update 2026-01-02 09:05:59 +07:00
Duidev Software e7c6d50141 update 2025-12-30 05:29:05 +07:00
Duidev Software 3e9db11a83 update 2025-12-29 19:58:01 +07:00
Duidev Software House b5ebccf366 update 2025-12-15 12:07:38 +07:00
Duidev Software House 78b9d8a4ee update 2025-12-12 13:02:00 +07:00
Duidev Software House 3d3a60c747 update 2025-12-08 19:23:51 +07:00
Duidev Software House 48dd3b9009 Update 2025-12-07 14:33:14 +07:00
Duidev Software House 6882563cb6 Update 2025-12-07 10:21:24 +07:00
Duidev Software House e63353db3d update 2025-12-05 19:38:39 +07:00
Duidev Software House fdbe9c2522 Update 2025-11-30 08:49:12 +07:00
Duidev Software House d228103a89 update 2025-11-29 21:54:46 +07:00
Duidev Software House 3d093a3c30 Update 2025-11-24 04:33:06 +07:00
Duidev Software House 0ad8bf110e update 2025-11-18 11:17:22 +07:00
Duidev Software House 0adb7b2a76 Update 2025-11-12 19:47:15 +07:00
Duidev Software House b2c5df08a2 Merge branch 'main' of https://git.rssa.top/dwi_vendor/lis 2025-11-10 05:06:31 +07:00
Duidev Software House 8f079b9f6c Update 2025-11-10 05:06:23 +07:00
dwi_vendor aa0a7897cf add Composer 2025-11-09 17:31:51 +07:00
Duidev Software House 0520d51179 update 2025-11-09 09:57:46 +07:00
Duidev Software House fda1ef3a5c Update 2025-11-06 07:14:08 +07:00
Duidev Software House 6dd49e447b Update 2025-11-03 07:19:12 +07:00
Duidev Software House c0373c9436 update 2025-10-30 18:31:45 +07:00
Duidev Software House 34d324c886 Update 2025-10-30 13:09:35 +07:00
Duidev Software House c0c7c1b5fd update 2025-10-27 08:09:17 +07:00
Duidev Software House 90ab13dafd Update 2025-10-17 12:18:18 +07:00
Duidev Software House 53564306e0 Update 2025-10-15 15:48:27 +07:00
Duidev Software House dd4e5e451f update 2025-10-14 16:26:26 +07:00
Duidev Software House b2facc5b0e Update 2025-10-14 08:12:10 +07:00
Duidev Software House 5d172ab337 Update 2025-10-14 07:59:56 +07:00
Duidev Software House 684705b383 update 2025-10-12 23:06:46 +07:00
Duidev Software House bf4093e01d Merge branch 'main' of https://git.rssa.top/dwi_vendor/lis 2025-10-12 22:07:40 +07:00
Duidev Software House 0851bc4b1d Update 2025-10-12 22:06:02 +07:00
Duidev Software House 1cfcc4de31 Update 2025-10-07 20:21:16 +08:00
Duidev Software House 49685c7727 Update 2025-10-04 16:22:29 +07:00
Duidev Software House 5dde5579e2 Update 2025-10-04 10:00:04 +07:00
Duidev Software House 8fd45c65d5 Update 2025-10-02 16:19:17 +07:00
Duidev Software House 406580dc83 Update 2025-10-01 20:47:17 +07:00
Duidev Software House 2c12dd043e Update 2025-10-01 04:36:02 +07:00
Duidev Software House 2d87021d60 Update Banner dan Report 2025-09-25 20:03:12 +07:00
Duidev Software House eafd657bfa Update 2025-09-24 08:33:09 +07:00
Duidev Software House b107ab9ba7 Update 2025-09-23 14:33:23 +07:00
Duidev Software House e8d66dec74 Update 2025-09-20 09:32:52 +07:00
Duidev Software House 8e6070e745 Update 2025-09-19 05:35:32 +07:00
Duidev Software House 21a48fb4d7 Update 2025-09-18 21:15:06 +07:00
Duidev Software House 326b3c1285 Update 2025-09-17 05:03:15 +07:00
Duidev Software House 36ebf1bdd6 Update API 2025-09-16 05:33:49 +07:00
Duidev Software House 1f52717e5c Update 2025-09-11 13:45:02 +07:00
Duidev Software House 89c33c0d5a Update 2025-09-11 13:44:59 +07:00
Duidev Software House 9c261cd32d Update 2025-09-09 20:07:05 +07:00
servdal cf81c9503b Update Cara Baca 2025-09-05 18:16:41 +07:00
servdal ab65bfb585 Update View 2025-09-05 08:07:58 +07:00
servdal 7794fc6fdf update-index 9b1f3a4..b8c6f5e 100644 2025-09-05 07:52:42 +07:00
servdal 9c78f7c088 Update htdocs/app/Services/AstmMessageService.php 2025-09-04 12:22:55 +07:00
servdal f0b5e64d16 Update 2025-09-04 04:10:52 +07:00
servdal caf54a9dd7 Update Database Stuktur 2025-09-02 20:02:03 +07:00
servdal 9979ce3335 Update Services 2025-09-02 12:43:59 +07:00
servdal 2ea8ce8c88 Update Database Seeder and add ruangan.json 2025-09-02 08:42:27 +07:00
servdal 968200880d fix .gitignore rules 2025-08-31 21:13:46 +07:00
servdal 33d5d88045 fix .gitignore rules 2025-08-31 21:02:48 +07:00
15282 changed files with 165238 additions and 2013017 deletions

No files matched your search

Vendored
BIN
View File
Binary file not shown.
+18 -5
View File
@@ -2,13 +2,26 @@
mergekemain.sh
# Ignore Laravel cache, logs, and storage
/htdocs/storage/*
/database
!/htdocs/storage/.gitignore
/htdocs/.DS_Store
/htdocs/.env
/htdocs/vendor/
/htdocs/database/seeders/data/
/htdocs/listenerlis/
/htdocs/storage/*.key
/htdocs/storage/logs/*
/htdocs/storage/framework/cache/*
/htdocs/storage/framework/sessions/*
/htdocs/storage/framework/views/*
/node_modules/
/npm-debug.log
/yarn-error.log
# Ignore bootstrap cache
/htdocs/bootstrap/cache/*
/htdocs/listenerlis/listener.log
/htdocs/listenerlis/tcp_raw_data.bin
.env
!/htdocs/bootstrap/cache/.gitignore
.DS_Store
Thumbs.db
.DS_Store
+630
View File
@@ -0,0 +1,630 @@
# MyLIS-RSSA
### Microbiology Laboratory Information System
---
## Bahasa Indonesia
**MyLIS-RSSA** adalah ekosistem aplikasi Laboratory Information System untuk layanan mikrobiologi RSUD Dr. Saiful Anwar. Repo ini berisi aplikasi web/backend Laravel, aplikasi pendamping mobile/desktop Flutter, dan service listener Python untuk komunikasi alat laboratorium.
Sistem ini membantu alur kerja laboratorium mulai dari penerimaan order, registrasi sampel, pengelompokan pemeriksaan, input expertise, verifikasi hasil, pelaporan, notifikasi nilai kritis, sampai integrasi dengan SIMRS dan instrumen laboratorium.
---
### Aplikasi di Dalam Repo
#### 1. LIS Web & Backend (`htdocs`)
Aplikasi utama berbasis Laravel untuk operasional laboratorium. Modul ini menangani autentikasi, dashboard, pendaftaran pasien/sampel, daftar pemeriksaan, template hasil, expertise, laporan, label/barcode, logbook, biorepository, gudang BHP, API mobile, backup cloud, dan integrasi SIMRS.
Ringkasan fungsi:
- Registrasi order dari SIMRS melalui endpoint `registerpasien`, `registerulang`, dan `registerjson`.
- Pengelolaan pasien, dokter, poli/ruangan, user, template jawaban, dan subjawaban.
- Worklist pemeriksaan mikrobiologi berdasarkan buku/kategori sampel.
- Input dan cetak hasil pemeriksaan, adendum, label, form, dan laporan.
- Dashboard Early Warning System dan notifikasi nilai kritis.
- Modul logbook PPDS/SPV, biorepository, dan SIMBHP.
- API `/api/mobile` untuk aplikasi MyLIS Flutter.
- Utilitas backup/restore database ke cloud dan export/simulasi payload register API.
#### 2. MyLIS Flutter (`mylis`)
Aplikasi mobile/desktop pendamping untuk akses cepat ke LIS Laravel. Aplikasi ini dipakai untuk login, cek koneksi server, dashboard, pencarian sampel, scanner barcode, Early Warning System, penerimaan pekerjaan awal, daftar pemeriksaan, detail pemeriksaan, notifikasi nilai kritis, dan pengisian expertise native.
Screen expertise yang tersedia:
- `CCI`
- `Kultur`
- `Pewarna Langsung`
- `TBC`
- `Viral Load`
- `IgM IgG Leptospira`
- `PCR COVID`
#### 3. Listener Instrumen (`listener`)
Service Python untuk komunikasi dengan instrumen laboratorium, terutama jalur serial/TCP dan GeneXpert. Service ini membaca, memproses, dan mengirim pesan instrumen seperti ASTM/HL7, lalu menyimpan atau meneruskan data ke database LIS.
Ringkasan fungsi:
- Listener TCP untuk GeneXpert.
- Komunikasi serial untuk perangkat seperti Vitek dan BACTEC.
- Mapping kode pemeriksaan LIS ke host test code alat.
- Antrean order instrumen dan pemrosesan hasil.
- Logging harian dan log per thread untuk troubleshooting.
---
### Cara Kerja Aplikasi
Alur utama sistem:
```text
SIMRS / user web
-> Laravel LIS menerima order dan data pasien
-> Sampel masuk ke worklist mikrobiologi
-> Petugas menerima, memproses, dan mengisi hasil/expertise
-> Supervisor melakukan verifikasi atau finalisasi
-> Hasil dicetak, dikirim, atau diekstrak kembali ke SIMRS
```
Alur mobile:
```text
MyLIS Flutter
-> login ke Laravel melalui /api/mobile/login
-> mengambil dashboard, worklist, detail pemeriksaan, dan template expertise
-> menyimpan draft, preliminary, final, atau kirim ke SPV
-> Laravel menyimpan perubahan ke database LIS
```
Alur instrumen:
```text
Instrumen laboratorium
-> listener Python menerima ASTM/HL7/serial/TCP
-> data diparse dan dicocokkan dengan order/sampel
-> hasil atau status instrumen disimpan ke database
-> Laravel menampilkan hasil untuk proses validasi dan pelaporan
```
Alur backup cloud:
```text
Server production
-> pg_dump database
-> upload file .backup secara chunked ke cloud
-> restore dapat dilakukan dengan download backup terbaru dan pg_restore
```
Detail backup, restore, export payload `registerApi`, dan simulasi kirim data SIMRS tersedia di [htdocs/README.md](/Users/duidev/htdocs/lis/htdocs/README.md).
---
### Teknologi
- **Backend**: Laravel 10, PHP 8.1+ dengan platform Composer PHP 8.4.
- **API & Auth**: Laravel route API, token terenkripsi untuk mobile, Laravel Sanctum/Passport tersedia di dependency.
- **Frontend Web**: Blade, Bootstrap, jQuery, DataTables, Livewire 3, Vite.
- **Database**: konfigurasi `.env` mendukung MySQL; deployment/backup production juga memakai PostgreSQL untuk database `lismikro`.
- **Reporting & Dokumen**: TCPDF, FPDI, PhpSpreadsheet, QR/barcode generator.
- **Integrasi**: HL7, ASTM, serial communication, FTP, HTTP client Guzzle, bridging BPJS.
- **Mobile/Desktop**: Flutter, Dart, Material UI, HTTP client, shared preferences, URL launcher, mobile scanner.
- **Listener Engine**: Python 3, Flask, SQLAlchemy, psycopg2, pyserial, hl7.
- **Runtime Ops**: Artisan commands, cron backup, optional Docker Compose.
---
### Instalasi LIS Web & Backend (`htdocs`)
Prasyarat:
- PHP 8.1 atau lebih baru.
- Composer.
- Node.js dan npm.
- Database MySQL atau PostgreSQL sesuai konfigurasi deployment.
- Ekstensi PHP yang dibutuhkan Laravel dan package proyek.
Langkah instalasi:
```bash
cd htdocs
composer install
npm install
cp .env.example .env
php artisan key:generate
```
Sesuaikan konfigurasi utama di `.env`:
```env
APP_URL=https://lis.swandhana.test
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_lis
DB_USERNAME=root
DB_PASSWORD=
```
Jalankan migrasi bila database target memang disiapkan dari migration project:
```bash
php artisan migrate
```
Jalankan aplikasi lokal:
```bash
php artisan serve
npm run dev
```
Build aset production:
```bash
npm run build
```
Perintah verifikasi yang umum:
```bash
php artisan route:list
php artisan route:list --path=mobile
php -l app/Http/Controllers/MobileApiController.php
```
---
### Instalasi MyLIS Flutter (`mylis`)
Prasyarat:
- Flutter SDK sesuai `pubspec.yaml` (`Dart SDK ^3.12.2`).
- Android Studio/Xcode sesuai platform target.
- Server Laravel LIS yang bisa diakses dari device atau simulator.
Langkah instalasi:
```bash
cd mylis
flutter pub get
flutter run
```
Jalankan dengan URL Laravel tertentu:
```bash
flutter run --dart-define=LIS_BASE_URL=https://lis.swandhana.test/
```
Build aplikasi:
```bash
flutter build apk --debug
flutter build ios --debug --no-codesign
flutter build macos --debug
```
Verifikasi:
```bash
flutter analyze
flutter test
```
---
### Instalasi Listener Instrumen (`listener`)
Prasyarat:
- Python 3.
- Akses jaringan ke database LIS dan instrumen laboratorium.
- Akses port serial/TCP sesuai alat yang dipakai.
Langkah instalasi:
```bash
cd listener
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
Jalankan listener utama:
```bash
python app.py
```
Jalankan listener GeneXpert khusus:
```bash
python geneexpert.py
```
Catatan konfigurasi:
- `app.py` dan `geneexpert.py` masih menyimpan mapping IP, port, perangkat, dan database di dalam file.
- Pastikan `DATABASE_URL`, `TARGET_MAPPING`, `DEVICE_CONFIGS`, port serial, dan port TCP sesuai lingkungan produksi.
- Default port penting: TCP GeneXpert `6001` dan HTTP trigger `6002`.
---
### API Mobile Utama
Prefix endpoint:
```text
/api/mobile
```
Endpoint utama:
- `GET /api/mobile/ping`
- `POST /api/mobile/login`
- `GET /api/mobile/dashboard`
- `GET /api/mobile/critical-values`
- `POST /api/mobile/critical-values/{id}/mark-read`
- `GET /api/mobile/early-warning`
- `GET /api/mobile/examinations/search`
- `GET /api/mobile/initial-work/samples`
- `POST /api/mobile/initial-work/samples/{id}/accept`
- `POST /api/mobile/initial-work/samples/{id}/reject`
- `GET /api/mobile/books/{master}/examinations`
- `GET /api/mobile/examinations/{id}`
- `GET /api/mobile/examinations/{id}/expertise`
- `POST /api/mobile/examinations/{id}/expertise/template`
- `POST /api/mobile/examinations/{id}/expertise`
---
### Manual Book
Panduan pengguna dapat diunduh melalui:
```text
http://10.10.123.218/manual.pdf
```
---
### Dukungan Pengembangan
Aplikasi ini dikembangkan oleh **CV. Swandhana**.
Alamat:
```text
Jl. Lamandau 18A, Bunulrejo, Blimbing, Malang
```
Kontak WhatsApp:
```text
081359108565
```
Pengembangan juga didukung oleh kolaborasi antara pengembang dan AI assistant seperti ChatGPT/Gemini untuk dokumentasi, refactoring, dan percepatan pekerjaan teknis.
---
### Lisensi
Proyek ini menggunakan lisensi **MIT**. Lihat file `LICENSE` jika tersedia di distribusi project.
---
## English Version
**MyLIS-RSSA** is a Laboratory Information System ecosystem for the microbiology service at RSUD Dr. Saiful Anwar. This repository contains a Laravel web/backend application, a Flutter mobile/desktop companion app, and a Python listener service for laboratory instrument communication.
The system supports laboratory workflows from order intake, sample registration, examination grouping, expertise entry, result verification, reporting, critical value notification, to SIMRS and instrument integration.
---
### Applications in This Repository
#### 1. LIS Web & Backend (`htdocs`)
The main Laravel application for laboratory operations. It handles authentication, dashboards, patient/sample registration, examination lists, result templates, expertise, reports, labels/barcodes, logbooks, biorepository, BHP inventory, mobile APIs, cloud backup, and SIMRS integration.
Main capabilities:
- Order registration from SIMRS through `registerpasien`, `registerulang`, and `registerjson`.
- Management of patients, doctors, clinics/rooms, users, answer templates, and sub-answers.
- Microbiology worklists grouped by sample book/category.
- Result entry, result printing, addendum, labels, forms, and reports.
- Early Warning System dashboard and critical value notifications.
- PPDS/SPV logbook, biorepository, and SIMBHP modules.
- `/api/mobile` endpoints for the MyLIS Flutter app.
- Cloud database backup/restore and register API payload export/simulation utilities.
#### 2. MyLIS Flutter (`mylis`)
A mobile/desktop companion app for fast access to the Laravel LIS. It supports login, server ping, dashboard, sample search, barcode scanning, Early Warning System, initial work acceptance, examination lists, examination details, critical value notifications, and native expertise entry.
Available expertise screens:
- `CCI`
- `Kultur`
- `Pewarna Langsung`
- `TBC`
- `Viral Load`
- `IgM IgG Leptospira`
- `PCR COVID`
#### 3. Instrument Listener (`listener`)
A Python service for laboratory instrument communication, especially serial/TCP and GeneXpert workflows. It receives, processes, and sends instrument messages such as ASTM/HL7, then stores or forwards the data to the LIS database.
Main capabilities:
- TCP listener for GeneXpert.
- Serial communication for devices such as Vitek and BACTEC.
- Mapping from LIS examination names to instrument host test codes.
- Instrument order queue and result processing.
- Daily logs and per-thread logs for troubleshooting.
---
### How the System Works
Main workflow:
```text
SIMRS / web user
-> Laravel LIS receives orders and patient data
-> samples enter the microbiology worklist
-> staff accept, process, and enter results/expertise
-> supervisor verifies or finalizes the result
-> result is printed, sent, or extracted back to SIMRS
```
Mobile workflow:
```text
MyLIS Flutter
-> logs in to Laravel through /api/mobile/login
-> fetches dashboard, worklist, examination details, and expertise templates
-> saves draft, preliminary, final, or sends to SPV
-> Laravel persists the changes to the LIS database
```
Instrument workflow:
```text
Laboratory instrument
-> Python listener receives ASTM/HL7/serial/TCP messages
-> data is parsed and matched with orders/samples
-> instrument results or statuses are stored in the database
-> Laravel displays the result for validation and reporting
```
Cloud backup workflow:
```text
Production server
-> pg_dump database
-> uploads .backup file to cloud in chunks
-> restore can download the latest backup and run pg_restore
```
Detailed backup, restore, `registerApi` payload export, and SIMRS payload simulation notes are available in [htdocs/README.md](/Users/duidev/htdocs/lis/htdocs/README.md).
---
### Technology Stack
- **Backend**: Laravel 10, PHP 8.1+ with Composer platform PHP 8.4.
- **API & Auth**: Laravel API routes, encrypted token for mobile, Laravel Sanctum/Passport available in dependencies.
- **Web Frontend**: Blade, Bootstrap, jQuery, DataTables, Livewire 3, Vite.
- **Database**: `.env` supports MySQL; production/backup deployment also uses PostgreSQL for the `lismikro` database.
- **Reporting & Documents**: TCPDF, FPDI, PhpSpreadsheet, QR/barcode generator.
- **Integrations**: HL7, ASTM, serial communication, FTP, Guzzle HTTP client, BPJS bridging.
- **Mobile/Desktop**: Flutter, Dart, Material UI, HTTP client, shared preferences, URL launcher, mobile scanner.
- **Listener Engine**: Python 3, Flask, SQLAlchemy, psycopg2, pyserial, hl7.
- **Runtime Ops**: Artisan commands, cron backup, optional Docker Compose.
---
### Installing LIS Web & Backend (`htdocs`)
Requirements:
- PHP 8.1 or newer.
- Composer.
- Node.js and npm.
- MySQL or PostgreSQL database depending on the target deployment.
- PHP extensions required by Laravel and this project's packages.
Installation:
```bash
cd htdocs
composer install
npm install
cp .env.example .env
php artisan key:generate
```
Adjust the main `.env` configuration:
```env
APP_URL=https://lis.swandhana.test
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_lis
DB_USERNAME=root
DB_PASSWORD=
```
Run migrations when the target database is meant to be prepared from this project's migrations:
```bash
php artisan migrate
```
Run locally:
```bash
php artisan serve
npm run dev
```
Build production assets:
```bash
npm run build
```
Common verification commands:
```bash
php artisan route:list
php artisan route:list --path=mobile
php -l app/Http/Controllers/MobileApiController.php
```
---
### Installing MyLIS Flutter (`mylis`)
Requirements:
- Flutter SDK matching `pubspec.yaml` (`Dart SDK ^3.12.2`).
- Android Studio/Xcode depending on the target platform.
- A Laravel LIS server reachable from the device or simulator.
Installation:
```bash
cd mylis
flutter pub get
flutter run
```
Run with a specific Laravel URL:
```bash
flutter run --dart-define=LIS_BASE_URL=https://lis.swandhana.test/
```
Build:
```bash
flutter build apk --debug
flutter build ios --debug --no-codesign
flutter build macos --debug
```
Verification:
```bash
flutter analyze
flutter test
```
---
### Installing Instrument Listener (`listener`)
Requirements:
- Python 3.
- Network access to the LIS database and laboratory instruments.
- Serial/TCP port access according to the target instruments.
Installation:
```bash
cd listener
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
Run the main listener:
```bash
python app.py
```
Run the dedicated GeneXpert listener:
```bash
python geneexpert.py
```
Configuration notes:
- `app.py` and `geneexpert.py` still keep IP, port, device, and database mapping inside the files.
- Make sure `DATABASE_URL`, `TARGET_MAPPING`, `DEVICE_CONFIGS`, serial ports, and TCP ports match the production environment.
- Important default ports: GeneXpert TCP `6001` and HTTP trigger `6002`.
---
### Main Mobile API
Endpoint prefix:
```text
/api/mobile
```
Main endpoints:
- `GET /api/mobile/ping`
- `POST /api/mobile/login`
- `GET /api/mobile/dashboard`
- `GET /api/mobile/critical-values`
- `POST /api/mobile/critical-values/{id}/mark-read`
- `GET /api/mobile/early-warning`
- `GET /api/mobile/examinations/search`
- `GET /api/mobile/initial-work/samples`
- `POST /api/mobile/initial-work/samples/{id}/accept`
- `POST /api/mobile/initial-work/samples/{id}/reject`
- `GET /api/mobile/books/{master}/examinations`
- `GET /api/mobile/examinations/{id}`
- `GET /api/mobile/examinations/{id}/expertise`
- `POST /api/mobile/examinations/{id}/expertise/template`
- `POST /api/mobile/examinations/{id}/expertise`
---
### Manual Book
User manual:
```text
http://10.10.123.218/manual.pdf
```
---
### Development Support
This application is developed by **CV. Swandhana**.
Address:
```text
Jl. Lamandau 18A, Bunulrejo, Blimbing, Malang
```
WhatsApp:
```text
081359108565
```
Development is also supported by collaboration between developers and AI assistants such as ChatGPT/Gemini for documentation, refactoring, and technical acceleration.
---
### License
This project uses the **MIT** license. See the `LICENSE` file if it is available in the project distribution.
BIN
View File
Binary file not shown.
+12
View File
@@ -64,3 +64,15 @@ BPJS_CONSID="2112121"
BPJS_SECRET_KEY="121212121"
BPJS_BASE_URL="https://new-api.bpjs-kesehatan.go.id:8080"
BPJS_SERVICE_NAME="new-vclaim-rest"
CLOUD_BACKUP_API_URL=https://duidev.com
CLOUD_BACKUP_API_TOKEN=
CLOUD_BACKUP_NAME=lismikro
CLOUD_BACKUP_CHUNK_SIZE=1048576
CLOUD_BACKUP_DOWNLOAD_PATH=
CLOUD_BACKUP_PG_RESTORE=pg_restore
CLOUD_BACKUP_DB_HOST=10.10.123.193
CLOUD_BACKUP_DB_PORT=5002
CLOUD_BACKUP_DB_DATABASE=lismikro
CLOUD_BACKUP_DB_USERNAME=lismikro
CLOUD_BACKUP_DB_PASSWORD=
+271 -1
View File
@@ -47,9 +47,279 @@ Untuk panduan pengguna atau manual book dari LIS, dapat diunduh melalui link ber
- **Bootstrap** (Frontend)
- **jQuery** (Frontend)
## Backup Database ke Cloud
Backup database dijalankan dari server production `10.10.123.218`. Database yang di-backup berada di server PostgreSQL `10.10.123.193`, lalu file hasil backup `.backup` dikirim secara bertahap/chunked ke `https://duidev.com` sebagai cadangan cloud.
Alur backup:
```text
10.10.123.218 -> pg_dump dari 10.10.123.193 -> upload .backup ke duidev.com
```
Alur restore:
```text
10.10.123.218 -> download backup terbaru dari duidev.com -> pg_restore ke 10.10.123.193
```
### Konfigurasi Server Production
Tambahkan konfigurasi berikut di file `.env` server production `10.10.123.218`:
```env
CLOUD_BACKUP_API_URL=https://duidev.com
CLOUD_BACKUP_API_TOKEN=isi_token_rahasia_yang_sama_dengan_duidev
CLOUD_BACKUP_NAME=lismikro
CLOUD_BACKUP_CHUNK_SIZE=1048576
CLOUD_BACKUP_DB_HOST=10.10.123.193
CLOUD_BACKUP_DB_PORT=5002
CLOUD_BACKUP_DB_DATABASE=lismikro
CLOUD_BACKUP_DB_USERNAME=lismikro
CLOUD_BACKUP_DB_PASSWORD=
```
Jika password PostgreSQL sudah disimpan di `.pgpass`, `CLOUD_BACKUP_DB_PASSWORD` boleh dikosongkan.
Setelah mengubah `.env`, jalankan:
```bash
php artisan config:clear
```
### Password PostgreSQL Tanpa Prompt
Buat file `~/.pgpass` pada user Linux yang menjalankan cron:
```text
10.10.123.193:5002:lismikro:lismikro:PASSWORD_DATABASE
```
Lalu amankan permission-nya:
```bash
chmod 600 ~/.pgpass
```
### Script Backup Harian
Contoh file `/home/mikro/project/backup.sh`:
```bash
#!/bin/bash
echo "===== Backup mulai: $(date '+%Y-%m-%d %H:%M:%S') ====="
BACKUP_DIR="/home/mikro/project/backups"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
FILE="$BACKUP_DIR/lismikro_$DATE.backup"
mkdir -p "$BACKUP_DIR"
pg_dump -h 10.10.123.193 -p 5002 -U lismikro -d lismikro -F c -v -f "$FILE"
STATUS=$?
if [ $STATUS -eq 0 ]; then
echo "Backup berhasil: $FILE"
cd /home/mikro/project/htdocs
php artisan backup:upload-file "$FILE" --retries=10 --retry-delay=15 --timeout=300
UPLOAD_STATUS=$?
if [ $UPLOAD_STATUS -eq 0 ]; then
echo "Upload cloud berhasil"
else
echo "Upload cloud gagal dengan status: $UPLOAD_STATUS"
fi
find "$BACKUP_DIR" -type f -name "lismikro_*.backup" -mtime +2 -delete
else
echo "Backup gagal dengan status: $STATUS"
fi
echo "===== Backup selesai: $(date '+%Y-%m-%d %H:%M:%S') ====="
echo ""
```
Aktifkan script:
```bash
chmod +x /home/mikro/project/backup.sh
```
### Crontab
Jalankan backup setiap hari jam `23:59`:
```cron
59 23 * * * /home/mikro/project/backup.sh >> /home/mikro/project/backup.log 2>&1
```
Lihat log:
```bash
tail -n 100 /home/mikro/project/backup.log
```
### Upload Manual
Jika sudah memiliki file `.backup` dan ingin mengirim ulang ke cloud:
```bash
cd /home/mikro/project/htdocs
php artisan backup:upload-file /home/mikro/project/backups/lismikro_YYYY-MM-DD_HH-MM-SS.backup
```
Jika upload pernah gagal dengan HTTP `524`, gunakan chunk lebih kecil dan retry lebih banyak:
```bash
php artisan backup:upload-file /home/mikro/project/backups/lismikro_YYYY-MM-DD_HH-MM-SS.backup \
--chunk-size=1048576 \
--retries=10 \
--retry-delay=15 \
--timeout=300
```
### Download Backup Terbaru
Untuk download saja tanpa restore:
```bash
cd /home/mikro/project/htdocs
php artisan backup:restore-latest --download-only
```
### Restore Penuh ke Database
Restore dijalankan dari server production `10.10.123.218` dan target database adalah `10.10.123.193`.
```bash
cd /home/mikro/project/htdocs
php artisan backup:restore-latest
```
Jika ingin langsung restore tanpa pertanyaan konfirmasi:
```bash
php artisan backup:restore-latest --yes
```
Perintah restore memakai `pg_restore --clean --if-exists --no-owner` secara default. Pastikan `pg_restore` tersedia di server production.
## Export Reverse Payload `registerApi`
Perintah ini menarik data dari tabel `periksa` berdasarkan tanggal tertentu, lalu mengubahnya kembali menjadi JSON dengan key yang sama seperti payload awal `registerApi`.
Contoh export berdasarkan tanggal daftar:
```bash
php artisan register-api:export 2026-08-01 --pretty
```
Simpan hasil ke file:
```bash
php artisan register-api:export 2026-08-01 --pretty --output=/home/mikro/project/export-register-api-2026-08-01.json
```
Secara default filter memakai kolom `daftar`. Jika ingin memakai tanggal lain:
```bash
php artisan register-api:export 2026-08-01 --column=tanggalregis --pretty
php artisan register-api:export 2026-08-01 --column=tanggalsampel --pretty
```
Format JSON yang dihasilkan:
```json
{
"tanggal": "2026-08-01",
"filter_column": "daftar",
"total": 1,
"data": [
{
"norm": "RM001",
"nama": "Nama Pasien",
"alamat": "Alamat Pasien",
"kota": "Kota",
"tgllahir": "1990-01-01",
"nohap": "0000000000",
"kelamin": "L",
"urgensi": "Elective",
"beratbadan": "0",
"nik": "0",
"nobpjs": "0",
"drpeminta": "Dokter Peminta",
"asalpasien": "Rawat Jalan",
"diagnosa": "Diagnosa",
"statusbayar": null,
"nomor_lab": "ORDER001",
"jenispembayaran": "UMM",
"klinisi": "Dokter Peminta",
"jenispemeriksaan": "Jenis Pemeriksaan",
"spesimen": "Sputum",
"kodespesimen": "SPT",
"pengambilan": null,
"keteranganrujukan": "RSSA Malang",
"namarspengirim": "RSSA Malang",
"tanggalregis": "2026-08-01",
"tanggalsampel": "2026-08-01",
"asalpengirim": null
}
]
}
```
### Simulasi Kirim Data Seperti SIMRS
Setelah file JSON dibuat dari `register-api:export`, data dapat dikirim ulang ke endpoint `registerApi` seolah-olah berasal dari SIMRS.
Tes tanpa mengirim data:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --dry-run
```
Kirim ke endpoint default dari `APP_URL/registerpasien`:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json
```
Kirim ke endpoint tertentu:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json \
--url=http://10.10.123.218/registerpasien
```
Batasi pengiriman untuk uji coba:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --limit=5
```
Tambahkan jeda antar request, misalnya `500` milidetik:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --delay=500
```
Berhenti jika ada request gagal:
```bash
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --stop-on-error
```
Contoh alur lengkap:
```bash
php artisan register-api:export 2026-08-01 --pretty --output=/home/mikro/project/export-register-api-2026-08-01.json
php artisan register-api:send-export /home/mikro/project/export-register-api-2026-08-01.json --url=http://10.10.123.218/registerpasien
```
## Kontribusi
Jika Anda ingin berkontribusi pada proyek ini, silakan buat **pull request** atau **issue** terkait.
## Lisensi
Proyek ini dilisensikan di bawah lisensi MIT. Lihat file **LICENSE** untuk informasi lebih lanjut.
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BioCabinet extends Model
{
protected $table = 'bio_cabinets';
protected $guarded = [];
public function racks()
{
return $this->hasMany(BioRack::class, 'cabinet_id');
}
public function specimens()
{
return $this->hasMany(BioSpecimen::class, 'cabinet_id');
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BioRack extends Model
{
protected $table = 'bio_racks';
protected $guarded = [];
public function cabinet()
{
return $this->belongsTo(BioCabinet::class, 'cabinet_id');
}
public function specimens()
{
return $this->hasMany(BioSpecimen::class, 'rack_id');
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class BioSpecimen extends Model
{
protected $table = 'bio_specimens';
protected $guarded = [];
protected $appends = ['storage_days'];
public function cabinet()
{
return $this->belongsTo(BioCabinet::class, 'cabinet_id');
}
public function rack()
{
return $this->belongsTo(BioRack::class, 'rack_id');
}
public function getStorageDaysAttribute()
{
if (!$this->stored_at) {
return 0;
}
return Carbon::parse($this->stored_at)->diffInDays(Carbon::now());
}
}
@@ -0,0 +1,155 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
use Symfony\Component\Process\Process;
class BackupRestoreLatestCommand extends Command
{
protected $signature = 'backup:restore-latest
{--url= : Base URL server cloud backup}
{--token= : Token API cloud backup}
{--name= : Nama backup}
{--output= : Lokasi file download}
{--file= : Pakai file backup lokal, tanpa download}
{--download-only : Hanya download, tidak restore}
{--host= : Host PostgreSQL target}
{--port= : Port PostgreSQL target}
{--database= : Database PostgreSQL target}
{--username= : Username PostgreSQL target}
{--password= : Password PostgreSQL target, opsional jika .pgpass sudah ada}
{--clean=1 : Jalankan pg_restore --clean}
{--if-exists=1 : Jalankan pg_restore --if-exists}
{--no-owner=1 : Jalankan pg_restore --no-owner}
{--yes : Lewati konfirmasi restore}';
protected $description = 'Download backup terbaru dari duidev.com dan restore penuh ke PostgreSQL.';
public function handle(): int
{
$backupName = (string) ($this->option('name') ?: config('cloud_backup.backup_name', 'lismikro'));
$file = $this->option('file')
? (string) $this->option('file')
: $this->downloadLatest($backupName);
if (!$file || !File::exists($file)) {
$this->error('File backup tidak ditemukan.');
return Command::FAILURE;
}
$this->info('File backup siap: ' . $file);
if ($this->option('download-only')) {
return Command::SUCCESS;
}
$host = (string) ($this->option('host') ?: config('cloud_backup.db_host'));
$port = (string) ($this->option('port') ?: config('cloud_backup.db_port'));
$database = (string) ($this->option('database') ?: config('cloud_backup.db_database'));
$username = (string) ($this->option('username') ?: config('cloud_backup.db_username'));
if (!$this->option('yes') && !$this->confirm("Restore penuh ke database {$database} di {$host}:{$port}?", false)) {
$this->warn('Restore dibatalkan.');
return Command::FAILURE;
}
$command = [
(string) config('cloud_backup.pg_restore', 'pg_restore'),
'-h', $host,
'-p', $port,
'-U', $username,
'-d', $database,
'-v',
];
if ((int) $this->option('clean') === 1) {
$command[] = '--clean';
}
if ((int) $this->option('if-exists') === 1) {
$command[] = '--if-exists';
}
if ((int) $this->option('no-owner') === 1) {
$command[] = '--no-owner';
}
$command[] = $file;
$env = null;
$password = (string) ($this->option('password') ?: config('cloud_backup.db_password'));
if ($password !== '') {
$env = ['PGPASSWORD' => $password];
}
$process = new Process($command, base_path(), $env, null, null);
$process->setTimeout(null);
$this->info('Menjalankan pg_restore...');
$process->run(function (string $type, string $buffer): void {
$this->output->write($buffer);
});
if (!$process->isSuccessful()) {
$this->error('Restore gagal dengan kode: ' . $process->getExitCode());
return Command::FAILURE;
}
$this->info('Restore selesai.');
return Command::SUCCESS;
}
private function downloadLatest(string $backupName): ?string
{
$baseUrl = rtrim((string) ($this->option('url') ?: config('cloud_backup.api_url')), '/');
$token = (string) ($this->option('token') ?: config('cloud_backup.api_token'));
if ($baseUrl === '' || $token === '') {
$this->error('CLOUD_BACKUP_API_URL dan CLOUD_BACKUP_API_TOKEN wajib diisi.');
return null;
}
$output = $this->option('output')
? (string) $this->option('output')
: (string) config('cloud_backup.download_path');
File::ensureDirectoryExists(dirname($output), 0750, true);
$metadata = Http::withToken($token)
->timeout(60)
->get($baseUrl . '/api/backups/latest', ['backup_name' => $backupName]);
if (!$metadata->successful()) {
$this->error('Gagal membaca metadata backup terbaru. HTTP ' . $metadata->status());
$this->line($metadata->body());
return null;
}
$info = $metadata->json();
$this->info('Backup terbaru: ' . ($info['file'] ?? '-'));
$download = Http::withToken($token)
->timeout(0)
->sink($output)
->get($baseUrl . '/api/backups/latest/download', ['backup_name' => $backupName]);
if (!$download->successful()) {
File::delete($output);
$this->error('Gagal download backup. HTTP ' . $download->status());
$this->line($download->body());
return null;
}
if (!empty($info['sha256']) && hash_file('sha256', $output) !== strtolower((string) $info['sha256'])) {
File::delete($output);
$this->error('Checksum file download tidak sesuai.');
return null;
}
return $output;
}
}
@@ -0,0 +1,145 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class BackupUploadFileCommand extends Command
{
protected $signature = 'backup:upload-file
{file : Path file .backup yang akan dikirim}
{--url= : Base URL server cloud backup}
{--token= : Token API cloud backup}
{--name= : Nama backup}
{--chunk-size= : Ukuran chunk dalam byte}
{--retries=5 : Jumlah percobaan ulang setiap chunk}
{--retry-delay=10 : Jeda percobaan ulang dalam detik}
{--timeout=300 : Timeout request upload dalam detik}';
protected $description = 'Upload file backup ke duidev.com secara bertahap/chunked.';
public function handle(): int
{
$file = (string) $this->argument('file');
if (!is_file($file) || !is_readable($file)) {
$this->error('File backup tidak ditemukan atau tidak bisa dibaca: ' . $file);
return Command::FAILURE;
}
$baseUrl = rtrim((string) ($this->option('url') ?: config('cloud_backup.api_url')), '/');
$token = (string) ($this->option('token') ?: config('cloud_backup.api_token'));
$backupName = (string) ($this->option('name') ?: config('cloud_backup.backup_name', 'lismikro'));
$chunkSize = (int) ($this->option('chunk-size') ?: config('cloud_backup.chunk_size', 5 * 1024 * 1024));
$retries = max(1, (int) $this->option('retries'));
$retryDelay = max(0, (int) $this->option('retry-delay'));
$timeout = max(30, (int) $this->option('timeout'));
if ($baseUrl === '' || $token === '') {
$this->error('CLOUD_BACKUP_API_URL dan CLOUD_BACKUP_API_TOKEN wajib diisi.');
return Command::FAILURE;
}
if ($chunkSize < 1024 * 1024) {
$this->error('Chunk size minimal 1 MB.');
return Command::FAILURE;
}
$size = filesize($file);
$checksum = hash_file('sha256', $file);
$totalChunks = (int) ceil($size / $chunkSize);
$uploadId = now()->format('YmdHis') . '_' . Str::random(16);
$endpoint = $baseUrl . '/api/backups/chunk';
$this->info('Upload backup: ' . basename($file));
$this->info('Upload ID: ' . $uploadId);
$this->info('Total chunk: ' . $totalChunks);
$handle = fopen($file, 'rb');
if (!$handle) {
$this->error('Gagal membuka file backup.');
return Command::FAILURE;
}
try {
for ($index = 0; $index < $totalChunks; $index++) {
$chunk = fread($handle, $chunkSize);
if ($chunk === false) {
$this->error('Gagal membaca chunk ke-' . $index);
return Command::FAILURE;
}
$response = $this->uploadChunk(
endpoint: $endpoint,
token: $token,
chunk: $chunk,
chunkIndex: $index,
payload: [
'backup_name' => $backupName,
'upload_id' => $uploadId,
'filename' => basename($file),
'chunk_index' => $index,
'total_chunks' => $totalChunks,
'total_size' => $size,
'checksum' => $checksum,
],
retries: $retries,
retryDelay: $retryDelay,
timeout: $timeout
);
if (!$response || !$response->successful()) {
$this->error('Upload chunk ke-' . $index . ' gagal. HTTP ' . ($response?->status() ?: '-'));
$this->line($response?->body() ?: 'Tidak ada response dari server.');
return Command::FAILURE;
}
$this->line('Chunk ' . ($index + 1) . '/' . $totalChunks . ' terkirim.');
}
} finally {
fclose($handle);
}
$this->info('Upload backup selesai.');
return Command::SUCCESS;
}
private function uploadChunk(
string $endpoint,
string $token,
string $chunk,
int $chunkIndex,
array $payload,
int $retries,
int $retryDelay,
int $timeout
): ?Response {
$response = null;
for ($attempt = 1; $attempt <= $retries; $attempt++) {
try {
$response = Http::withToken($token)
->timeout($timeout)
->attach('chunk', $chunk, 'chunk_' . $chunkIndex . '.part')
->post($endpoint, $payload);
if ($response->successful()) {
return $response;
}
$this->warn('Chunk ' . ($chunkIndex + 1) . ' gagal percobaan ' . $attempt . '/' . $retries . '. HTTP ' . $response->status());
} catch (\Throwable $e) {
$this->warn('Chunk ' . ($chunkIndex + 1) . ' gagal percobaan ' . $attempt . '/' . $retries . ': ' . $e->getMessage());
}
if ($attempt < $retries && $retryDelay > 0) {
sleep($retryDelay);
}
}
return $response;
}
}
@@ -0,0 +1,138 @@
<?php
namespace App\Console\Commands;
use App\Periksa;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
class ExportRegisterApiByDateCommand extends Command
{
protected $signature = 'register-api:export
{date : Tanggal data periksa, format YYYY-MM-DD}
{--column=daftar : Kolom tanggal untuk filter, contoh daftar/tanggalregis/tanggalsampel}
{--output= : Simpan hasil JSON ke file}
{--pretty : Format JSON agar mudah dibaca}';
protected $description = 'Export data periksa per tanggal ke format JSON payload registerApi.';
public function handle(): int
{
$date = $this->argument('date');
$column = (string) $this->option('column');
if (!$this->isValidDate($date)) {
$this->error('Format tanggal harus YYYY-MM-DD.');
return Command::FAILURE;
}
if (!in_array($column, ['daftar', 'tanggalregis', 'tanggalsampel'], true)) {
$this->error('Kolom tanggal hanya boleh: daftar, tanggalregis, tanggalsampel.');
return Command::FAILURE;
}
$records = Periksa::with('getPasien')
->whereDate($column, $date)
->orderBy($column)
->orderBy('id')
->get()
->map(fn (Periksa $periksa) => $this->mapPeriksaToRegisterPayload($periksa))
->values();
$payload = [
'tanggal' => $date,
'filter_column' => $column,
'total' => $records->count(),
'data' => $records,
];
$jsonOptions = JSON_UNESCAPED_SLASHES;
if ($this->option('pretty')) {
$jsonOptions |= JSON_PRETTY_PRINT;
}
$json = json_encode($payload, $jsonOptions);
if ($json === false) {
$this->error('Gagal membuat JSON.');
return Command::FAILURE;
}
if ($this->option('output')) {
$output = (string) $this->option('output');
File::ensureDirectoryExists(dirname($output));
File::put($output, $json . PHP_EOL);
$this->info('Export selesai: ' . $output);
$this->info('Total data: ' . $records->count());
return Command::SUCCESS;
}
$this->line($json);
return Command::SUCCESS;
}
private function mapPeriksaToRegisterPayload(Periksa $periksa): array
{
$pasien = $periksa->getPasien;
$tanggalLahir = $this->formatDate($periksa->tgllahirpasien ?? $pasien?->tgl_lahir);
$tanggalRegis = $this->formatDate($periksa->tanggalregis) ?: $this->formatDate($periksa->daftar);
$tanggalSampel = $this->formatDate($periksa->tanggalsampel) ?: $tanggalRegis;
$diagnosa = $periksa->klinis ?: null;
$klinisi = $periksa->klinisi ?: null;
return [
'norm' => $periksa->noregister,
'nama' => $periksa->nmpasien,
'alamat' => $periksa->alamatpasien ?: config('global.addressapps'),
'kota' => $pasien?->kota ?: config('global.subdomainapps'),
'tgllahir' => $tanggalLahir ?: date('Y-m-d'),
'nohap' => $periksa->tlppasien ?: '0000000000',
'kelamin' => $periksa->jkpasien ?: 'L',
'urgensi' => $periksa->urgensi ?: 'Elective',
'beratbadan' => (string) ($periksa->berat ?? '0'),
'nik' => $periksa->ktp ?: '0',
'nobpjs' => $periksa->bpjs ?: '0',
'drpeminta' => $klinisi,
'asalpasien' => $periksa->asalpasien,
'diagnosa' => $diagnosa,
'statusbayar' => null,
'nomor_lab' => $periksa->orderid,
'jenispembayaran' => $periksa->asuransi ?: 'UMM',
'klinisi' => $klinisi,
'jenispemeriksaan' => $periksa->reques,
'spesimen' => $periksa->nm_spesimen,
'kodespesimen' => $periksa->kd_spesimen,
'pengambilan' => $periksa->pengambilan,
'keteranganrujukan' => $periksa->nmrs ?: 'RSSA Malang',
'namarspengirim' => $periksa->nmrs ?: 'RSSA Malang',
'tanggalregis' => $tanggalRegis ?: date('Y-m-d'),
'tanggalsampel' => $tanggalSampel ?: date('Y-m-d'),
'asalpengirim' => $periksa->asalpengirim,
];
}
private function isValidDate(string $date): bool
{
try {
$parsed = Carbon::createFromFormat('Y-m-d', $date);
} catch (\Throwable) {
return false;
}
return $parsed && $parsed->format('Y-m-d') === $date;
}
private function formatDate(mixed $value): ?string
{
if (!$value) {
return null;
}
try {
return Carbon::parse($value)->format('Y-m-d');
} catch (\Throwable) {
return null;
}
}
}
@@ -3,8 +3,9 @@
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Services\AstmMessageService;
use App\DataListiner;
class ProcessAstmMessages extends Command
{
@@ -22,13 +23,12 @@ class ProcessAstmMessages extends Command
public function handle()
{
// Ambil data dari DataListener
$dataListener = DataListiner::whereNull('processed')->get();
if ($dataListener) {
$jumlah = count($dataListener);
$pesan = $this->astmMessageService->processAstmMessages($dataListener);
$this->info($jumlah.' Message processed '.$pesan.' at '.date('Y-m-d H:i:s'));
} else {
$this->info('Skipped Proses at '.date('Y-m-d H:i:s'));
$dataLocal = DB::table('lis_phoenix')->whereNull('processed')->get();
if ($dataLocal) {
$jumlah = count($dataLocal);
$pesan = $this->astmMessageService->processAstmMessagesLokal($dataLocal);
$this->info($jumlah.' Message processed Data Lokal '.$pesan.' at '.date('Y-m-d H:i:s'));
}
$this->info('Skipped Proses at '.date('Y-m-d H:i:s'));
}
}
@@ -0,0 +1,115 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
class SendRegisterApiExportCommand extends Command
{
protected $signature = 'register-api:send-export
{file : Path file JSON hasil register-api:export}
{--url= : URL endpoint registerApi, default APP_URL/registerpasien}
{--delay=0 : Jeda antar kirim dalam milidetik}
{--limit=0 : Batasi jumlah data yang dikirim, 0 berarti semua}
{--start=0 : Mulai dari index data ke-n, 0 berarti dari awal}
{--dry-run : Tampilkan payload tanpa mengirim}
{--stop-on-error : Berhenti jika ada request gagal}';
protected $description = 'Simulasi kirim payload registerApi dari file JSON export seolah-olah dikirim oleh SIMRS.';
public function handle(): int
{
$file = (string) $this->argument('file');
if (!File::exists($file) || !is_readable($file)) {
$this->error('File JSON tidak ditemukan atau tidak bisa dibaca: ' . $file);
return Command::FAILURE;
}
$content = File::get($file);
$decoded = json_decode($content, true);
if (!is_array($decoded)) {
$this->error('File bukan JSON valid.');
return Command::FAILURE;
}
$rows = $this->extractRows($decoded);
if (empty($rows)) {
$this->warn('Tidak ada data untuk dikirim.');
return Command::SUCCESS;
}
$start = max(0, (int) $this->option('start'));
$limit = max(0, (int) $this->option('limit'));
$delay = max(0, (int) $this->option('delay'));
$endpoint = $this->endpoint();
$rows = array_slice($rows, $start, $limit > 0 ? $limit : null);
$total = count($rows);
$success = 0;
$failed = 0;
$this->info('Endpoint: ' . $endpoint);
$this->info('Total payload: ' . $total);
foreach ($rows as $index => $payload) {
$sequence = $start + $index + 1;
$label = $payload['nomor_lab'] ?? $payload['norm'] ?? $sequence;
if ($this->option('dry-run')) {
$this->line('[' . $sequence . '] DRY RUN ' . $label . ': ' . json_encode($payload, JSON_UNESCAPED_SLASHES));
$success++;
continue;
}
$response = Http::asJson()
->acceptJson()
->timeout(120)
->post($endpoint, $payload);
if ($response->successful()) {
$success++;
$this->line('[' . $sequence . '] OK ' . $label . ' HTTP ' . $response->status() . ' ' . $response->body());
} else {
$failed++;
$this->error('[' . $sequence . '] GAGAL ' . $label . ' HTTP ' . $response->status() . ' ' . $response->body());
if ($this->option('stop-on-error')) {
break;
}
}
if ($delay > 0 && $index < $total - 1) {
usleep($delay * 1000);
}
}
$this->info('Selesai. Berhasil: ' . $success . ', gagal: ' . $failed);
return $failed > 0 ? Command::FAILURE : Command::SUCCESS;
}
private function extractRows(array $decoded): array
{
if (isset($decoded['data']) && is_array($decoded['data'])) {
return $decoded['data'];
}
if (array_is_list($decoded)) {
return $decoded;
}
return [$decoded];
}
private function endpoint(): string
{
$url = (string) $this->option('url');
if ($url !== '') {
return $url;
}
return rtrim((string) config('app.url'), '/') . '/registerpasien';
}
}
@@ -0,0 +1,124 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class SyncPoliFromJson extends Command
{
protected $signature = 'poli:sync-json {--path= : Path file JSON poli, default database/seeders/data/poli.json} {--dry-run : Cek data tanpa menulis ke database}';
protected $description = 'Update atau create data poli dari file JSON berdasarkan id tanpa truncate.';
public function handle(): int
{
$path = $this->resolvePath($this->option('path') ?: database_path('seeders/data/poli.json'));
$data = $this->readJson($path);
$updated = 0;
$created = 0;
$unchanged = 0;
DB::transaction(function () use ($data, &$updated, &$created, &$unchanged) {
foreach ($data as $row) {
$id = (int) $row['id'];
$payload = [
'poli' => $row['poli'] ?? null,
'subpoli' => $row['subpoli'] ?? null,
'subsubpoli' => $row['subsubpoli'] ?? null,
'modaliti' => $row['modaliti'] ?? null,
'kelompok' => $row['kelompok'] ?? null,
'modaliti2' => isset($row['modaliti2']) ? (string) $row['modaliti2'] : null,
'created_at' => $row['created_at'] ?? now(),
'updated_at' => $row['updated_at'] ?? now(),
];
$existing = DB::table('poli')->where('id', $id)->first();
if ($existing === null) {
$created++;
if (!$this->option('dry-run')) {
DB::table('poli')->insert(array_merge(['id' => $id], $payload));
}
continue;
}
if ($this->isSameRow($existing, $payload)) {
$unchanged++;
continue;
}
$updated++;
if (!$this->option('dry-run')) {
DB::table('poli')->where('id', $id)->update($payload);
}
}
});
$mode = $this->option('dry-run') ? 'DRY RUN' : 'DONE';
$this->info("{$mode}: {$created} created, {$updated} updated, {$unchanged} unchanged.");
return self::SUCCESS;
}
private function resolvePath(string $path): string
{
if ($path !== '' && $path[0] === '/') {
return $path;
}
return base_path($path);
}
private function readJson(string $path): array
{
if (!is_file($path)) {
throw new \RuntimeException("File JSON poli tidak ditemukan: {$path}");
}
$json = file_get_contents($path);
if ($json === false) {
throw new \RuntimeException("Gagal membaca file JSON poli: {$path}");
}
$data = json_decode($json, true);
if (!is_array($data)) {
throw new \RuntimeException("Format JSON poli tidak valid: {$path}");
}
$ids = [];
foreach ($data as $index => $row) {
if (!is_array($row) || !isset($row['id'])) {
throw new \RuntimeException('Data poli baris '.($index + 1).' tidak memiliki id.');
}
$id = (int) $row['id'];
if (isset($ids[$id])) {
throw new \RuntimeException("Duplikasi id poli pada JSON: {$id}");
}
$ids[$id] = true;
}
return $data;
}
private function isSameRow(object $existing, array $payload): bool
{
foreach ($payload as $key => $value) {
if ((string) ($existing->{$key} ?? '') !== (string) ($value ?? '')) {
return false;
}
}
return true;
}
}
+2
View File
@@ -17,6 +17,8 @@ class Kernel extends ConsoleKernel
//$schedule->command('app:sync-lab-results-f-t-p')->everyThirtyMinutes();
//$schedule->command('app:sync-lab-results-serial')->everyThirtyMinutes();
$schedule->command('astm:process-messages')->everyFiveMinutes();
$schedule->command('backup:clean')->daily()->at('01:00');
$schedule->command('backup:run')->daily()->at('01:30');
}
/**
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CriticalValueSample extends Model
{
protected $table = 'critical_value_samples';
protected $guarded = [];
}
@@ -0,0 +1,316 @@
<?php
namespace App\Http\Controllers;
use App\BioCabinet;
use App\BioRack;
use App\BioSpecimen;
use App\Periksa;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Session;
use Validator;
class BiorepositoryController extends Controller
{
public function index()
{
if (Session::get('previlage') == '') {
return redirect('/login');
}
$data = [];
$data['cabinetOptions'] = BioCabinet::orderBy('name', 'ASC')->get();
$data['totalCabinets'] = BioCabinet::count();
$data['totalRacks'] = BioRack::count();
$data['totalSpecimens'] = BioSpecimen::count();
$data['specimenRows'] = BioSpecimen::with(['cabinet', 'rack'])
->orderBy('stored_at', 'DESC')
->orderBy('id', 'DESC')
->get();
$data['oldestSpecimen'] = BioSpecimen::with(['cabinet', 'rack'])
->whereNotNull('stored_at')
->orderBy('stored_at', 'ASC')
->first();
$data['oldestStorageDays'] = 0;
if ($data['oldestSpecimen']) {
$data['oldestStorageDays'] = Carbon::parse($data['oldestSpecimen']->stored_at)->diffInDays(Carbon::now());
}
return view('admin.biorepository', $data);
}
public function storeCabinet(Request $request)
{
$validator = Validator::make($request->all(), [
'code' => 'required|max:50|unique:bio_cabinets,code',
'name' => 'required|max:150',
'location' => 'nullable|max:200',
'notes' => 'nullable',
]);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
BioCabinet::create([
'code' => $request->input('code'),
'name' => $request->input('name'),
'location' => $request->input('location'),
'notes' => $request->input('notes'),
]);
return redirect('/biorepository')->with('success', 'Lemari biorepository berhasil ditambahkan.');
}
public function storeRack(Request $request)
{
$validator = Validator::make($request->all(), [
'cabinet_id' => 'required|exists:bio_cabinets,id',
'code' => 'required|max:50',
'name' => 'required|max:150',
'slot_count' => 'required|integer|min:1|max:20',
'level' => 'required|integer|min:4|max:6',
'box_number' => 'required|integer|min:1|max:20',
'capacity' => 'required|integer|min:16|max:100',
'notes' => 'nullable',
]);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
$exists = BioRack::where('cabinet_id', $request->input('cabinet_id'))
->where('code', $request->input('code'))
->exists();
if ($exists) {
return back()->withErrors(['code' => 'Kode rack sudah dipakai pada lemari ini.'])->withInput();
}
$nextRackNumber = ((int) BioRack::where('cabinet_id', $request->input('cabinet_id'))->max('rack_number')) + 1;
BioRack::create([
'cabinet_id' => $request->input('cabinet_id'),
'code' => $request->input('code'),
'name' => $request->input('name'),
'slot_count' => $request->input('slot_count'),
'level' => $request->input('level'),
'rack_number' => $nextRackNumber,
'box_number' => $request->input('box_number'),
'capacity' => $request->input('capacity'),
'notes' => $request->input('notes'),
]);
return redirect('/biorepository')->with('success', 'Rack berhasil ditambahkan.');
}
public function storeSpecimen(Request $request)
{
$validator = Validator::make($request->all(), [
'rack_id' => 'required|exists:bio_racks,id',
'kategorisimpan' => 'required|in:A,B,C,D',
'shelfnomor' => 'required|integer|min:1',
'raknomor' => 'required|integer|min:1',
'slotnomor' => 'required|integer|min:1',
'boxnomor' => 'required|integer|min:1',
'tubenomor' => 'required|integer|min:1',
'nmbakteri' => 'nullable|max:200',
'strain' => 'nullable|in:Gram Negatif,Gram Positif',
'stored_at' => 'required|date',
'volume' => 'nullable|numeric|min:0',
'volume_ambil' => 'nullable|numeric|min:0',
'existing_specimen_id' => 'nullable|integer',
]);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
$rack = BioRack::find($request->input('rack_id'));
$expectedRackNo = $rack->rack_number ?: $rack->id;
$slotCount = (int) ($rack->slot_count ?: 1);
$boxCount = (int) ($rack->box_number ?: 1);
if ((int) $request->input('raknomor') !== (int) $expectedRackNo) {
return back()->withErrors(['slotnomor' => 'Posisi slot tidak sesuai dengan konfigurasi rack.'])->withInput();
}
if ((int) $request->input('slotnomor') < 1 || (int) $request->input('slotnomor') > $slotCount) {
return back()->withErrors(['slotnomor' => 'Slot melebihi konfigurasi rack.'])->withInput();
}
if ((int) $request->input('shelfnomor') < 1 || (int) $request->input('shelfnomor') > (int) $rack->level) {
return back()->withErrors(['shelfnomor' => 'Shelf melebihi konfigurasi slot.'])->withInput();
}
if ((int) $request->input('boxnomor') < 1 || (int) $request->input('boxnomor') > $boxCount) {
return back()->withErrors(['boxnomor' => 'Box melebihi konfigurasi shelf.'])->withInput();
}
if ((int) $request->input('tubenomor') < 1 || (int) $request->input('tubenomor') > (int) $rack->capacity) {
return back()->withErrors(['tubenomor' => 'Nomor tube melebihi kapasitas box pada shelf ini.'])->withInput();
}
$slotTaken = BioSpecimen::where('rack_id', $rack->id)
->where('slot_number', $request->input('slotnomor'))
->where('shelf_number', $request->input('shelfnomor'))
->where('box_number', $request->input('boxnomor'))
->where('tube_number', $request->input('tubenomor'))
->first();
if ($slotTaken) {
$existingId = (int) $request->input('existing_specimen_id');
if ($existingId !== (int) $slotTaken->id) {
return back()->withErrors(['tubenomor' => 'Posisi tube pada shelf ini sudah terisi spesimen.'])->withInput();
}
$volumeAmbil = (float) $request->input('volume_ambil');
if ($volumeAmbil <= 0) {
return back()->withErrors(['volume_ambil' => 'Isi volume yang diambil dari spesimen.'])->withInput();
}
$volumeSekarang = (float) ($slotTaken->volume ?? 0);
if ($volumeAmbil > $volumeSekarang) {
return back()->withErrors(['volume_ambil' => 'Volume diambil melebihi sisa volume spesimen.'])->withInput();
}
$slotTaken->volume = (string) ($volumeSekarang - $volumeAmbil);
$slotTaken->save();
return redirect('/biorepository')->with('success', 'Pengambilan volume berhasil. Sisa volume diperbarui.');
}
if (!$request->filled('nmbakteri') || !$request->filled('strain')) {
return back()->withErrors(['nmbakteri' => 'Nama bakteri dan strain wajib diisi untuk spesimen baru.'])->withInput();
}
if (!$request->filled('volume')) {
return back()->withErrors(['volume' => 'Volume awal spesimen wajib diisi.'])->withInput();
}
$atccByUser = strtoupper(preg_replace('/[^A-Za-z0-9]/', '', Session::get('nama', 'UNKNOWN')));
if ($atccByUser === '') {
$atccByUser = 'UNKNOWN';
}
$generatedCode = implode('-', [
$request->input('kategorisimpan'),
$request->input('shelfnomor'),
$request->input('raknomor'),
$request->input('slotnomor'),
$request->input('boxnomor'),
$request->input('tubenomor'),
]);
$baseCode = $generatedCode;
$counter = 1;
while (BioSpecimen::where('specimen_code', $generatedCode)->exists()) {
$counter++;
$generatedCode = $baseCode.'-'.$counter;
}
$sampleid = $request->input('sampleid');
if ($sampleid) {
$cekdata = Periksa::where('nofoto', $sampleid)->first();
if ($cekdata) {
$sampleid = $cekdata->id;
} else {
$sampleid = null;
}
} else {
$sampleid = null;
}
BioSpecimen::create([
'cabinet_id' => $rack->cabinet_id,
'rack_id' => $rack->id,
'specimen_code' => $generatedCode,
'specimen_name' => $request->input('nmbakteri'),
'category_storage' => $request->input('kategorisimpan'),
'shelf_number' => $request->input('shelfnomor'),
'rack_number' => $request->input('raknomor'),
'slot_number' => $request->input('slotnomor'),
'box_number' => $request->input('boxnomor'),
'tube_number' => $request->input('tubenomor'),
'bacteria_name' => $request->input('nmbakteri'),
'strain' => $request->input('strain'),
'atcc' => $request->input('atcc') ?? $atccByUser,
'input_by' => Session::get('nama'),
'sampleid' => $sampleid,
'stored_at' => $request->input('stored_at'),
'storage_condition' => $this->mapStorageCondition($request->input('kategorisimpan')),
'volume' => (string) $request->input('volume'),
'notes' => $request->input('notes'),
]);
return redirect('/biorepository')->with('success', 'Spesimen berhasil disimpan ke slot terpilih.');
}
public function deleteSpecimen($id)
{
if (Session::get('previlage') == '') {
return redirect('/login');
}
$specimen = BioSpecimen::find($id);
if (!$specimen) {
return redirect('/biorepository')->withErrors(['specimen' => 'Data spesimen tidak ditemukan.']);
}
$specimen->delete();
return redirect('/biorepository')->with('success', 'Spesimen berhasil dihapus.');
}
public function deleteRack($id)
{
if (Session::get('previlage') == '') {
return redirect('/login');
}
$rack = BioRack::find($id);
if (!$rack) {
return redirect('/biorepository')->withErrors(['rack' => 'Data rack tidak ditemukan.']);
}
BioSpecimen::where('rack_id', $rack->id)->delete();
$rack->delete();
return redirect('/biorepository')->with('success', 'Rack dan semua spesimennya berhasil dihapus.');
}
public function deleteCabinet($id)
{
if (Session::get('previlage') == '') {
return redirect('/login');
}
$cabinet = BioCabinet::find($id);
if (!$cabinet) {
return redirect('/biorepository')->withErrors(['cabinet' => 'Data lemari tidak ditemukan.']);
}
$rackIds = BioRack::where('cabinet_id', $cabinet->id)->pluck('id')->toArray();
if (!empty($rackIds)) {
BioSpecimen::whereIn('rack_id', $rackIds)->delete();
BioRack::whereIn('id', $rackIds)->delete();
}
$cabinet->delete();
return redirect('/biorepository')->with('success', 'Lemari beserta rack dan spesimennya berhasil dihapus.');
}
private function mapStorageCondition($category)
{
$mapping = [
'A' => 'Suhu Ruang',
'B' => '4 Derajat',
'C' => '20 Derajat',
'D' => '80 Derajat',
];
return $mapping[$category] ?? 'Tidak Diketahui';
}
}
@@ -1,5 +1,6 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
@@ -10,6 +11,7 @@ use App\Pasien;
use App\Riwayat;
use App\Rekaplogbook;
use App\PeriksaTest;
use Fawno\PhpSerial\SerialDio;
use Fawno\PhpSerial\SerialConfig;
use DateTime;
@@ -25,10 +27,93 @@ use Aranyasen\HL7\Segments\PID;
use Aranyasen\HL7\Segments\OBX;
use Aranyasen\HL7\Segments\NTE;
use Aranyasen\HL7\Segments\EVN;
use Session;
class Controller extends BaseController
{
use AuthorizesRequests, ValidatesRequests;
private function cekBatasAtas($value, $rule) {
if (!$rule) return false;
// 1. Cek apakah rule mengandung tanda > atau ≥
// Kita gunakan array untuk mengecek berbagai kemungkinan simbol
$validSymbols = ['>', '≥', '&gt;', '>='];
$found = false;
foreach ($validSymbols as $symbol) {
if (str_contains($rule, $symbol)) {
$found = true;
break;
}
}
if (!$found) return false;
// Ambil angkanya
$angka = (int) filter_var($rule, FILTER_SANITIZE_NUMBER_INT);
// 2. Gunakan >= agar angka 17 tetap dianggap 'S' (Sensitive/Suspect)
return $value >= $angka;
}
private function cekMidRange($value, $rule) {
if (!$rule) return false;
$rule = trim($rule);
if ($rule === '-' || $rule === '') return false;
if (!str_contains($rule, '-')) return false;
[$min, $max] = array_map('trim', explode('-', $rule));
if (!is_numeric($min) || !is_numeric($max)) return false;
// Midrange biasanya sudah benar, tapi pastikan casting int/float sesuai kebutuhan
return $value >= (int)$min && $value <= (int)$max;
}
private function cekBatasBawah($value, $rule) {
if (!$rule) return false;
// 1. Cek apakah rule mengandung tanda < atau ≤
$validSymbols = ['<', '≤', '&lt;', '<='];
$found = false;
foreach ($validSymbols as $symbol) {
if (str_contains($rule, $symbol)) {
$found = true;
break;
}
}
if (!$found) return false;
$angka = (int) filter_var($rule, FILTER_SANITIZE_NUMBER_INT);
// 2. Gunakan <= agar angka 13 tetap dianggap 'R' (Resistant)
return $value <= $angka;
}
protected function cekInterpretasi($value, $data) {
try {
if ($value === null || $data === null) {
} else if ($value === '') {
} else if ($data->batasatas == $value){
return "S";
} else if ($data->batasbawah == $value){
return "R";
} else {
if ($this->cekBatasAtas($value, $data->batasatas)) {
return "S";
}
if ($this->cekMidRange($value, $data->midrange)) {
return "I";
}
if ($this->cekBatasBawah($value, $data->batasbawah)) {
return "R";
}
}
} catch (\Exception $e) {
return null;
}
}
protected function getStyledValue($value, $color, $strong = false) {
return $strong ? "<strong><font color=\"$color\">$value</font></strong>" : "<font color=\"$color\">$value</font>";
}
@@ -175,6 +260,13 @@ class Controller extends BaseController
protected function getDefaultData($jenis, $master, $mulai, $akhir, $valcari) {
$query = Periksa::whereNotNull('nofoto');
if ($jenis == 'ThisDay') {
return $query->where(function($q) {
$q->where(function($sub) {
$sub->where('status', '!=', 'Selesai')
->where('status', 'not like', 'Dibatalkan%');
})->orWhereNull('status');
});
} else if ($jenis == 'ThisDayPendaftaran') {
return $query->whereDate('daftar', Carbon::today());
} else if ($jenis == 'mundur2') {
return $query->whereDate('daftar', '>=', Carbon::today()->subDays(2));
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load diff
File diff suppressed because it is too large Load diff
@@ -0,0 +1,162 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Response;
use ZipArchive;
use JsonMachine\Items;
class JsonTransferController extends Controller
{
protected $exportPath = 'database/seeders/data/';
public function index(){
//POSTGRESS
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
$tableNames = array_map(fn($t) => $t->tablename, $tables);
//MYSQL
//$tables = DB::select('SHOW TABLES');
//$tableNames = array_map('current', $tables);
$tableInfo = [];
foreach ($tableNames as $table) {
$filePath = base_path($this->exportPath . $table . '.json');
$fileSize = file_exists($filePath) ? filesize($filePath) : null;
$tableInfo[] = [
'name' => $table,
'size' => $fileSize,
];
}
return view('backup', compact('tableInfo'));
}
public function generate(){
$exportPath = base_path($this->exportPath);
if (!is_dir($exportPath)) {
mkdir($exportPath, 0777, true);
}
$tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
$tableNames = array_map(fn($t) => $t->tablename, $tables);
foreach ($tableNames as $table) {
try {
$filePath = $exportPath . $table . '.json';
$handle = fopen($filePath, 'w');
fwrite($handle, "[\n");
$first = true;
foreach (DB::table($table)->cursor() as $row) {
$jsonRow = json_encode($row, JSON_UNESCAPED_UNICODE);
if (!$first) {
fwrite($handle, ",\n");
} else {
$first = false;
}
fwrite($handle, $jsonRow);
}
fwrite($handle, "\n]");
fclose($handle);
} catch (\Exception $e) {
\Log::warning("Gagal ekspor tabel $table: " . $e->getMessage());
continue;
}
}
return redirect()->back()->with('success', 'Semua tabel berhasil diekspor tanpa kehabisan memori.');
}
public function downloadTable($table){
$file = base_path($this->exportPath . $table . '.json');
if (!file_exists($file)) {
return abort(404, 'File tidak ditemukan.');
}
return response()->download($file);
}
public function downloadAll(){
$zipFile = base_path('database/seeders/data/all_json.zip');
$zip = new ZipArchive;
File::delete($zipFile);
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
foreach (File::files(base_path($this->exportPath)) as $file) {
$zip->addFile($file->getRealPath(), basename($file));
}
$zip->close();
}
return response()->download($zipFile);
}
public function importTable($table) {
set_time_limit(0);
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 0);
$path = base_path($this->exportPath . $table . '.json');
if (!file_exists($path)) {
return back()->with('error', "File tidak ditemukan.");
}
DB::disableQueryLog();
try {
DB::beginTransaction();
DB::statement("TRUNCATE TABLE $table RESTART IDENTITY CASCADE");
$items = Items::fromFile($path);
$chunk = [];
$batchSize = 1000;
$counter = 0;
foreach ($items as $row) {
$data = (array) $row;
unset($data['id']);
$chunk[] = $data;
$counter++;
if (count($chunk) >= $batchSize) {
DB::table($table)->insert($chunk);
$chunk = [];
if ($counter % 5000 == 0) {
gc_collect_cycles();
}
}
}
if (!empty($chunk)) {
DB::table($table)->insert($chunk);
}
$resetSequenceSql = "SELECT setval(pg_get_serial_sequence('$table', 'id'), COALESCE(MAX(id), 1)) FROM $table";
DB::statement($resetSequenceSql);
DB::commit();
DB::enableQueryLog();
return back()->with('success', 'Import berhasil!');
} catch (\Exception $e) {
DB::rollBack();
\Log::error("Import Error $table: " . $e->getMessage());
return back()->with('error', "Error 500 Details: " . $e->getMessage());
}
}
public function pull(Request $request){
if (session('previlage') !== 'developer') {
abort(403, 'Akses ditolak. Anda tidak memiliki izin untuk menjalankan git pull.');
}
$gitPath = base_path();
$output = shell_exec("cd {$gitPath} && git pull 2>&1");
if (auth()->check()) {
Log::info('Git pull executed by user: ' . auth()->user()->email.' at '.now());
}
return back()->with('git_output', $output);
}
}
@@ -1,116 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class LisController extends Controller
{
/**
* Alamat IP dan port dari service Python/Flask.
* Sebaiknya diletakkan di file .env
* LIS_SERVICE_URL=http://127.0.0.1:5000
*/
protected $lisServiceUrl;
public function __construct()
{
// Mengambil URL service dari file .env, dengan fallback default
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
/**
* Mengirim perintah untuk mendaftarkan tes pasien baru ke GeneXpert.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function registerPatient(Request $request)
{
// Validasi input dari request (sangat direkomendasikan)
$validatedData = $request->validate([
'patient_name' => 'required|string|max:100',
'patient_id' => 'required|string|max:50',
'sample_id' => 'required|string|max:50',
'test_code' => 'required|string|max:20',
'test_name' => 'sometimes|string|max:50',
'dob' => 'sometimes|date_format:Ymd',
'gender' => 'sometimes|string|in:M,F,O,U',
]);
// Membangun payload sesuai format yang diharapkan oleh app.py
$payload = [
'command' => 'register_patient',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30) // Set timeout 30 detik
->post($this->lisServiceUrl . '/command', $payload);
// Cek jika request gagal di level HTTP
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat registrasi.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503); // Service Unavailable
}
// Mengembalikan response dari service Python ke client
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504); // Gateway Timeout
}
}
/**
* Mengirim perintah untuk meminta ulang hasil tes berdasarkan Sample ID.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function requestResult(Request $request)
{
// Validasi input
$validatedData = $request->validate([
'sample_id' => 'required|string|max:50',
]);
// Membangun payload
$payload = [
'command' => 'request_result',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503);
}
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504);
}
}
}
+594 -207
View File
@@ -13,50 +13,21 @@ use App\Jawaban;
use App\Pasien;
use App\User;
use App\Jadwalperiksa;
use App\PendaftaranOnListiner;
use Yajra\DataTables\Facades\DataTables;
use Carbon\Carbon;
use DateTime;
use Session;
use Illuminate\Support\Facades\Log;
class ListController extends Controller
{
public function index() {
if (Session::get('previlage') == ''){
return redirect('/login');
} else {
$polis = Poli::all();
$ruangans = Ruangan::all();
$dokters = Dokter::all();
$answers = Jawaban::all();
$details = Subjawaban::all();
$ruangpolis = Ruangan::groupBy('poli')->select('poli')->get();
$data = [];
$i = 0;
foreach ($ruangpolis as $ruangpoli) {
$j = 0;
$ruangpoli = $ruangpoli->poli;
$rooms = Ruangan::where('poli', $ruangpoli)->get();
foreach ($rooms as $room) {
$data['ruangans'][$i][$j]['id'] = $room->id;
$data['ruangans'][$i][$j]['ruangan'] = $room->ruangan;
$j++;
}
$i++;
}
$x = 0;
foreach ($ruangpolis as $ruangpoli) {
$data['ruangpolis'][$x] = $ruangpoli->poli;
$x++;
}
$data['polis'] = $polis;
$data['dokters'] = $dokters;
$data['answers'] = $answers;
$data['details'] = $details;
return view('admin.list', $data);
return redirect('/pendaftaran');
}
}
public function getList(Request $request) {
$jenis = $request->input('jenis');
@@ -65,155 +36,425 @@ class ListController extends Controller
$lokasi = $request->input('poli');
$valcari = $request->input('valcari');
$master = $request->input('master');
if ($jenis == 'verificationppds'){
$valcari = $request->input('poli');
$lamanurlhasil = url('/').'/hasil/';
if ($jenis === null){$jenis = '';}
if ($master == 'logbook') {
list($start, $end) = explode(' - ', $mulai);
$startDate = Carbon::createFromFormat('m/d/Y', $start)->format('Y-m-d');
$endDate = Carbon::createFromFormat('m/d/Y', $end)->format('Y-m-d');
$arraylist = Periksa::select('id', 'mulai', 'akhir', 'noloket', 'nofoto', 'noregister', 'asalpasien', 'nmrs', 'pasien_id', 'nmpasien', 'jkpasien', 'tgllahirpasien', 'tlppasien', 'alamatpasien', 'reques', 'usia', 'berat', 'ruangan_id', 'ruangan', 'dokter_id', 'ppdssenior', 'middleppds', 'ppdsjunior', 'ppdsmiddle2', 'ppdsjunior2', 'analis', 'excutor', 'nmdokter', 'nmppdssenior', 'nmmiddleppds', 'nmppdsjunior', 'nmppdsmiddle2', 'nmppdsjunior2', 'nmanalis', 'nmexcutor', 'klinisi', 'klinis', 'keterangan', 'kesimpulan', 'poli_id', 'asuransi', 'urgensi', 'diagnosa', 'diagnosa2', 'modality', 'dlp', 'daftar', 'foto', 'tgldraft', 'nmdrafter', 'baca', 'nmpembaca', 'verifikasi', 'export', 'tgladendum', 'nmadendum', 'filefoto', 'status', 'created_at', 'updated_at',
DB::raw("CASE
WHEN ppdssenior = $valcari THEN 'SENIOR'
WHEN middleppds = $valcari THEN 'MIDDLE'
WHEN ppdsjunior = $valcari THEN 'JUNIOR'
WHEN ppdsmiddle2 = $valcari THEN 'MIDDLE'
ELSE 'JUNIOR'
END AS role"));
$arraylist = $arraylist->whereBetween('daftar', [$startDate, $endDate]);
$arraylist = $arraylist->where(function($query) use ($valcari) {
$query->where('ppdssenior', $valcari)
->orWhere('middleppds', $valcari)
->orWhere('ppdsjunior', $valcari)
->orWhere('ppdsmiddle2', $valcari)
->orWhere('ppdsjunior2', $valcari);
})->get();
} else if ($master == 'pengambilan') {
$arraylist = Periksa::select(
DB::raw("CONCAT('<span class=\"badge badge-success\">', nofoto, '</span>') as tlsnofoto"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', noregister, '</span>') as tlsnoregister"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', nmpasien, '</span>') as tlsnama"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', urgensi, '</span>') as tlsurgensi"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', reques, '</span>') as tlsreques"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', ruangan, '</span>') as tlsruangan"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', daftar, '</span>') as tlsdaftar"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', status, '</span>') as tlsstatus"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', jkpasien, '</span>') as tlsjk"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', asalpasien, '</span>') as asalpasien"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', kd_spesimen, '</span>') as kd_spesimen"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', nm_spesimen, '</span>') as nm_spesimen"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', nmanalis, '</span>') as nmanalis"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', nmppdssenior, '</span>') as nmppdssenior"),
DB::raw("CONCAT('<span class=\"badge badge-success\">', nmdokter, '</span>') as nmdokter"),
DB::raw("DATE(verifikasi) as daftartgl"),
DB::raw("TO_CHAR(verifikasi, 'HH24:MI:SS') as daftarjam"),
'nofoto')->whereNotNull('verifikasi')->where('status', '!=', 'Arsip');
if ($valcari != ''){
if ($jenis == 'norm'){
$arraylist = $arraylist->where('noregister', $valcari);
} else {
$arraylist = $arraylist->where('nofoto', $valcari);
}
}
if ($akhir != '' AND $mulai != $akhir){
$arraylist = $arraylist->whereBetween('verifikasi', [$mulai, $akhir]);
} else {
if ($jenis == 'ThisDay' OR $jenis == ''){
if ($mulai == '' OR is_null($mulai)){ $mulai = date('Y-m-d'); }
$arraylist = $arraylist->whereDate('verifikasi', $mulai);
} else if ($jenis == 'mundur2'){
$arraylist = $arraylist->whereDate('verifikasi', '>=', Carbon::today()->subDays(2));
} else if ($jenis == 'mundur3'){
$arraylist = $arraylist->whereDate('verifikasi', '>=', Carbon::today()->subDays(2));
} else {
if ($mulai == $akhir){
$arraylist = $arraylist->whereDate('verifikasi', $mulai);
} else {
$arraylist = $arraylist->whereBetween('verifikasi', [$mulai, $akhir]);
}
}
}
$arraylist = $arraylist->get();
} else if ($master == 'verificationppds' OR $jenis == 'verificationppds') {
$arraylist = Periksa::select(
'id', 'mulai', 'akhir', 'orderid', 'noloket', 'nofoto', 'noregister', 'asalpasien', 'nmrs', 'pasien_id', 'nmpasien',
'jkpasien', 'tgllahirpasien', 'tlppasien', 'alamatpasien', 'reques', 'usia', 'berat', 'ktp', 'bpjs', 'ruangan_id',
'ruangan', 'dokter_id', 'ppdssenior', 'middleppds', 'ppdsjunior', 'ppdsmiddle2', 'ppdsjunior2', 'analis', 'excutor',
'nmdokter', 'nmppdssenior', 'nmmiddleppds', 'nmppdsjunior', 'nmppdsmiddle2', 'nmppdsjunior2', 'nmanalis', 'nmexcutor',
'klinisi', 'klinis', 'keterangan', 'kesimpulan', 'poli_id', 'asuransi', 'urgensi', 'diagnosa', 'diagnosa2', 'modality',
'kd_spesimen', 'nm_spesimen', 'dlp', 'daftar', 'foto', 'tgldraft', 'nmdrafter', 'baca', 'nmpembaca', 'verifikasi',
'export', 'tgladendum', 'nmadendum', 'filefoto', 'pendaftar', 'status', 'created_at', 'updated_at',
'bhp_media', 'bhp_potsputum', 'bhp_poturine', 'bhp_oshe', 'bhp_obyekglass', 'bhp_botolbd', 'bhp_parafilm',
'bhp_tips', 'bhp_cottonswab', 'bhp_antibiotiktambahan', 'id_esbl', 'id_mrsa', 'rating', 'nmpendaftar',
DB::raw("DATE(daftar) as daftartgl"),
DB::raw("TO_CHAR(daftar, 'HH24:MI:SS') as daftarjam"),
DB::raw("TO_CHAR(export, 'HH24:MI:SS') as cetakjam"),
DB::raw("TO_CHAR(verifikasi, 'HH24:MI:SS') as verifikasijam"),
DB::raw("TO_CHAR(baca, 'HH24:MI:SS') as bacajam"),
DB::raw("TO_CHAR(foto, 'HH24:MI:SS') as fotojam"),
DB::raw("CASE WHEN jkpasien = 'L' THEN '1' ELSE '' END AS l"),
DB::raw("CASE WHEN jkpasien = 'P' THEN '1' ELSE '' END AS p"),
DB::raw("CONCAT('https://10.10.123.218/hasil/', nofoto::text) as urlhasil"),
DB::raw("CASE WHEN asuransi IN ('JKN', 'BPJS') THEN '1' ELSE '' END AS jkn"),
DB::raw("CASE WHEN asuransi = 'Billing' THEN '1' ELSE '' END AS billing"),
DB::raw("CASE WHEN asuransi = 'GCU' THEN '1' ELSE '' END AS gcu"),
DB::raw("CASE WHEN asuransi IN ('MANDIRI', 'Umum') THEN '1' ELSE '' END AS umum"),
DB::raw("CASE WHEN asuransi = 'SWASTA' THEN '1' ELSE '' END AS swasta"),
DB::raw("CASE WHEN asuransi = 'TAG' THEN '1' ELSE '' END AS tag"),
DB::raw("CASE WHEN urgensi != 'CITO' THEN '1' ELSE '' END AS elective"),
DB::raw("CASE WHEN urgensi = 'CITO' THEN '1' ELSE '' END AS cito"),
DB::raw("CASE
WHEN status IS NULL THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status = '' THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status LIKE '%Dibatalkan%' THEN '<font color=grey>Batal</font>'
WHEN status LIKE '%Pemeriksaan Sampel%' THEN '<font color=green>Pemeriksaan Sampel</font>'
WHEN status LIKE '%Proses Analisis Sampel%' THEN '<strong>Diperiksa</strong>'
WHEN status LIKE '%Draft%' THEN '<font color=green>Draft</font>'
WHEN status LIKE '%Expertise%' THEN '<strong><font color=green>Expertise</font></strong>'
WHEN status LIKE '%Decliend%' THEN '<strong><font color=red>Decliend</font></strong>'
WHEN status LIKE '%Selesai%' THEN '<span class=\"badge badge-success\">Selesai</span>'
WHEN status LIKE '%Arsip%' THEN '<span class=\"badge badge-primary\">Arsip</span>'
WHEN status LIKE '%Data Vitek di Terima%' THEN '<span class=\"badge badge-warning\">Data Vitek di Terima</span>'
ELSE CONCAT('<span class=\"badge badge-info\">', status::text, '</span>')
END AS tlsstatus"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nofoto::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nofoto::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nofoto::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nofoto::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nofoto::text, '</span>')
ELSE CONCAT('<font color=red>', nofoto::text, '</font>')
END AS tlsnofoto"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', noregister::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', noregister::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', noregister::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', noregister::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', noregister::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', noregister::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', noregister::text, '</span>')
ELSE CONCAT('<font color=red>', noregister::text, '</font>')
END AS tlsnoregister"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nmpasien::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nmpasien::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nmpasien::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nmpasien::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nmpasien::text, '</span>')
ELSE CONCAT('<font color=red>', nmpasien::text, '</font>')
END AS tlsnama"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', reques::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', reques::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', reques::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', reques::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', reques::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', reques::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', reques::text, '</span>')
ELSE CONCAT('<font color=red>', reques::text, '</font>')
END AS tlsreques")
);
if ($lokasi == 'allspv'){
$arraylist = $arraylist->where('status', 'LIKE', 'Expertise Saved (Un Verified)')->whereNull('periksa.verifikasi');
} else {
$arraylist = $arraylist->where('status', 'LIKE', 'Expertise Saved (Un Verified)')->whereNull('periksa.verifikasi')->where('periksa.dokter_id', Session('id'));
}
$arraylist = $arraylist->get();
} else {
$cairansteril = [15,16,43,47,48,66,96,205,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223];
$cci = 20;
$darah = [7,8,13,17,29,33,44,107,114,115,199,200,201,202];
$feces = [37,38,148,149,204];
$hiv = 30;
$kukukulit = [165,179,180,181,183,184,185,187,188,189,190,192,194,195,196,198];
$kulturtb = [26,40,45,52,53,56,60,61,68,69,75,92,102,122,123,136,137,144,145,152,153,233];
$pusdanjaringan = [18,19,32,35,46,49,50,54,57,58,59,72,160,182,186,191,193,197,206,207,208,224,225,226,227,228,234,235,236,237];
$sputum = [1,12,23,24,36,39,229,230,231,232];
$swab = [2,4,5,9,10,11,21,22,27,34,41,42,51,63,64,65,85,86,87,88,93,97,118,67,121,125,126,127,128,129,130,132,133,134,135,140,147,158,159,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178];
$tcmnontb = [79,80,81,82,83,84,203];
$tcmtb = [14,28,55,62,94,104,105,124,138,146];
$urine = [3,6,25,31,154,155,156,157];
//jikabukan_array_tambahkan_kurung
$mapped = array_merge(
$cairansteril,
[$cci],
$darah,
$feces,
[$hiv],
$kukukulit,
$kulturtb,
$pusdanjaringan,
$sputum,
$swab,
$tcmnontb,
$tcmtb,
$urine
);
$batasWaktu = Carbon::now()->subHours(7*24);
Periksa::whereNull('status')->where('created_at', '<', $batasWaktu)->update([
'status' => 'Dibatalkan (Arsip)',
'updated_at' => now()
]);
$arraylist = Periksa::select(
'id', 'mulai', 'akhir', 'orderid', 'noloket', 'nofoto', 'noregister', 'asalpasien', 'nmrs', 'pasien_id', 'nmpasien',
'jkpasien', 'tgllahirpasien', 'tlppasien', 'alamatpasien', 'reques', 'usia', 'berat', 'ktp', 'bpjs', 'ruangan_id',
'ruangan', 'dokter_id', 'ppdssenior', 'middleppds', 'ppdsjunior', 'ppdsmiddle2', 'ppdsjunior2', 'analis', 'excutor',
'nmdokter', 'nmppdssenior', 'nmmiddleppds', 'nmppdsjunior', 'nmppdsmiddle2', 'nmppdsjunior2', 'nmanalis', 'nmexcutor',
'klinisi', 'klinis', 'keterangan', 'kesimpulan', 'poli_id', 'asuransi', 'urgensi', 'diagnosa', 'diagnosa2', 'modality',
'kd_spesimen', 'nm_spesimen', 'dlp', 'daftar', 'foto', 'tgldraft', 'nmdrafter', 'baca', 'nmpembaca', 'verifikasi',
'export', 'tgladendum', 'nmadendum', 'filefoto', 'pendaftar', 'status', 'created_at', 'updated_at',
'bhp_media', 'bhp_potsputum', 'bhp_poturine', 'bhp_oshe', 'bhp_obyekglass', 'bhp_botolbd', 'bhp_parafilm',
'bhp_tips', 'bhp_cottonswab', 'bhp_antibiotiktambahan', 'id_esbl', 'id_mrsa', 'rating', 'nmpendaftar', 'tanggalregis', 'tanggalsampel', 'pengambilan', 'asalpengirim',
DB::raw("DATE(daftar) as daftartgl"),
DB::raw("TO_CHAR(daftar, 'HH24:MI:SS') as daftarjam"),
DB::raw("TO_CHAR(export, 'HH24:MI:SS') as cetakjam"),
DB::raw("TO_CHAR(verifikasi, 'HH24:MI:SS') as verifikasijam"),
DB::raw("TO_CHAR(baca, 'HH24:MI:SS') as bacajam"),
DB::raw("TO_CHAR(foto, 'HH24:MI:SS') as fotojam"),
DB::raw("CASE WHEN jkpasien = 'L' THEN '1' ELSE '' END AS l"),
DB::raw("CASE WHEN jkpasien = 'P' THEN '1' ELSE '' END AS p"),
DB::raw("CONCAT('https://10.10.123.218/hasil/', nofoto::text) as urlhasil"),
DB::raw("CASE WHEN asuransi IN ('JKN', 'BPJS') THEN '1' ELSE '' END AS jkn"),
DB::raw("CASE WHEN asuransi = 'Billing' THEN '1' ELSE '' END AS billing"),
DB::raw("CASE WHEN asuransi = 'GCU' THEN '1' ELSE '' END AS gcu"),
DB::raw("CASE WHEN asuransi IN ('MANDIRI', 'Umum') THEN '1' ELSE '' END AS umum"),
DB::raw("CASE WHEN asuransi = 'SWASTA' THEN '1' ELSE '' END AS swasta"),
DB::raw("CASE WHEN asuransi = 'TAG' THEN '1' ELSE '' END AS tag"),
DB::raw("CASE WHEN urgensi != 'CITO' THEN '1' ELSE '' END AS elective"),
DB::raw("CASE WHEN urgensi = 'CITO' THEN '1' ELSE '' END AS cito"),
DB::raw("CASE
WHEN status IS NULL THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status = '' THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status LIKE '%Dibatalkan%' THEN '<font color=grey>Batal</font>'
WHEN status LIKE '%Pemeriksaan Sampel%' THEN '<font color=green>Pemeriksaan Sampel</font>'
WHEN status LIKE '%Proses Analisis Sampel%' THEN '<strong>Diperiksa</strong>'
WHEN status LIKE '%Draft%' THEN '<font color=green>Draft</font>'
WHEN status LIKE '%Expertise%' THEN '<strong><font color=green>Expertise</font></strong>'
WHEN status LIKE '%Decliend%' THEN '<strong><font color=red>Decliend</font></strong>'
WHEN status LIKE '%Selesai%' THEN '<span class=\"badge badge-success\">Selesai</span>'
WHEN status LIKE '%Arsip%' THEN '<span class=\"badge badge-primary\">Arsip</span>'
WHEN status LIKE '%Pemeriksaan awal%' THEN '<span class=\"badge badge-primary\">Pemeriksaan awal</span>'
WHEN status LIKE '%Data Vitek di Terima%' THEN '<span class=\"badge badge-warning\">Data Vitek di Terima</span>'
ELSE CONCAT('<span class=\"badge badge-info\">', status::text, '</span>')
END AS tlsstatus"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nofoto::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nofoto::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nofoto::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nofoto::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', nofoto::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nofoto::text, '</span>')
ELSE CONCAT('<font color=red>', nofoto::text, '</font>')
END AS tlsnofoto"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', noregister::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', noregister::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', noregister::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', noregister::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', noregister::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', noregister::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', noregister::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', noregister::text, '</span>')
ELSE CONCAT('<font color=red>', noregister::text, '</font>')
END AS tlsnoregister"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nmpasien::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nmpasien::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nmpasien::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nmpasien::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', nmpasien::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nmpasien::text, '</span>')
ELSE CONCAT('<font color=red>', nmpasien::text, '</font>')
END AS tlsnama"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', reques::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', reques::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', reques::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', reques::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', reques::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', reques::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', reques::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', reques::text, '</span>')
ELSE CONCAT('<font color=red>', reques::text, '</font>')
END AS tlsreques")
);
if ($master == 'ABSES'){
$arraylist = $arraylist->where('nm_spesimen', 'ABSES HEPAR');
} else if ($master == 'PERITONEUM'){
$arraylist = $arraylist->where('nm_spesimen', 'C. PERITONEUM');
} else if ($master == 'PLEURA'){
$arraylist = $arraylist->where('nm_spesimen', 'C. PLEURA');
} else if ($master == 'SENDI'){
$arraylist = $arraylist->where('nm_spesimen', 'C. SENDI');
} else if ($master == 'PERITONEUM'){
$arraylist = $arraylist->where('nm_spesimen', 'C. PERITONEUM');
} else if ($master == 'ASPIRASI'){
$arraylist = $arraylist->where('nm_spesimen', 'CAIRAN ASPIRASI');
} else if ($master == 'HIDUNG'){
$arraylist = $arraylist->where('nm_spesimen', 'SWAB HIDUNG');
} else if ($master == 'SWABLAIN'){
$arraylist = $arraylist->where('nm_spesimen', 'SWAB LAIN LAIN<');
} else if ($master == 'TELINGA'){
$arraylist = $arraylist->where('nm_spesimen', 'SWAB TELINGA');
} else if ($master == 'TENGGOROKAN'){
$arraylist = $arraylist->where('nm_spesimen', 'SWAB TENGGOROKAN');
} else if ($master == 'TUBO'){
$arraylist = $arraylist->where('nm_spesimen', 'TUBO O');
} else if ($master == 'buku01'){
$arraylist = $arraylist->whereIn('poli_id', $cairansteril);
} else if ($master == 'buku02') {
$arraylist = $arraylist->where('poli_id', $cci);
} else if ($master == 'buku03') {
$arraylist = $arraylist->whereIn('poli_id', $darah);
} else if ($master == 'buku04') {
$arraylist = $arraylist->where('poli_id', $hiv);
} else if ($master == 'buku05') {
$arraylist = $arraylist->whereIn('poli_id', $kukukulit);
} else if ($master == 'buku06') {
$arraylist = $arraylist->whereIn('poli_id', $kulturtb);
} else if ($master == 'buku07') {
$arraylist = $arraylist->whereIn('poli_id', $pusdanjaringan);
} else if ($master == 'buku08') {
$arraylist = $arraylist->whereIn('poli_id', $sputum);
} else if ($master == 'buku09') {
$arraylist = $arraylist->whereIn('poli_id', $swab);
} else if ($master == 'buku10') {
$arraylist = $arraylist->whereIn('poli_id', $tcmtb);
} else if ($master == 'buku11') {
$arraylist = $arraylist->whereIn('poli_id', $tcmnontb);
} else if ($master == 'buku12') {
$arraylist = $arraylist->whereIn('poli_id', $urine);
} else if ($master == 'buku13') {
$arraylist = $arraylist->whereIn('poli_id', $feces);
} else if ($master == 'buku0') {
$arraylist = $arraylist->whereNotIn('poli_id', $mapped);
} else if ($master == '' OR $master == 'all' OR $master == 'mikro'){
// no filter
} else {
$arraylist = $arraylist->where('nm_spesimen', $master);
}
if ($jenis == 'ThisDay') {
$arraylist = $arraylist->where(function($q) {
$q->where(function($sub) {
$sub->whereNotNull('status')
->whereNotIn('status', ['', 'Selesai', 'Arsip', 'Penerimaan Sampel'])
->where('status', 'not like', 'Dibatalkan%');
});
});
} else if ($jenis == 'ThisDayPendaftaran') {
$arraylist = $arraylist->whereDate('daftar', Carbon::today());
} else if ($jenis == 'mundur2') {
$arraylist = $arraylist->whereDate('daftar', '>=', Carbon::today()->subDays(2));
} else if ($jenis == 'mundur3') {
$arraylist = $arraylist->whereDate('daftar', '>=', Carbon::today()->subDays(3));
} else if ($jenis === 'searchbydate') {
$mulai = $mulai ?: date("Y-m-d");
$akhir = $akhir ?: date("Y-m-d");
if ($mulai >= $akhir) {
$akhir = date('Y-m-d', strtotime($akhir . ' +1 day'));
}
$arraylist = $arraylist->whereBetween('daftar', [$mulai, $akhir]);
} else if ($jenis === 'searchbydatemanual') {
$mulai = $mulai ?: date("Y-m-d");
$akhir = $akhir ?: date("Y-m-d");
if ($mulai >= $akhir) {
$akhir = date('Y-m-d', strtotime($akhir . ' +1 day'));
}
$arraylist = $arraylist->whereBetween('daftar', [$mulai, $akhir])->whereNotIn('pendaftar', ['supervisor', 'admin', 'analis', 'ppds', 'developer']);
} else if ($jenis === 'norm'){
$arraylist = $arraylist->where('noregister', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'nofoto'){
$arraylist = $arraylist->where('nofoto', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'rekues'){
$arraylist = $arraylist->where('reques', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'keterangan'){
$arraylist = $arraylist->where('keterangan', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'kesimpulan'){
$arraylist = $arraylist->where('kesimpulan', 'LIKE', '%'.$valcari.'%');
} else {
$arraylist = $arraylist->where('nmpasien', 'LIKE', '%'.$valcari.'%');
}
if ($jenis == 'ThisDayPendaftaran'){
$arraylist = $arraylist->orderBy('updated_at', 'ASC')->orderBy('id', 'DESC')->get();
} else {
$arraylist = $arraylist->orderBy('id', 'DESC')->get();
}
}
$total = 0;
$data = $this->getDataBasedOnMaster($master, $jenis, $mulai, $akhir, $valcari);
if (!empty($data)){
$dataArray = $data->get()->toArray();
$total = count($dataArray);
$arraylist = array_map(function ($list) use ($master) {
$tgl = $list['tgllahirpasien'];
$poli_id = $list['poli_id'];
$foto = $list['foto'];
$baca = $list['baca'];
$export = $list['export'];
$nofoto = $list['nofoto'];
$noregister = $list['noregister'];
$usia = $list['usia'];
$urgensi = $list['urgensi'];
$reques = $list['reques'];
$ruangan = $list['ruangan'];
$daftar = $list['daftar'];
$status = $list['status'];
$asalpasien = $list['asalpasien'];
$dokter_id = $list['dokter_id'];
$ppdssenior = $list['ppdssenior'];
$middleppds = $list['middleppds'];
$ppdsjunior = $list['ppdsjunior'];
$middleppds2= $list['ppdsmiddle2'];
$ppdsjunior2= $list['ppdsjunior2'];
$pasiedin = $list['pasien_id'];
$keterangan = $list['keterangan'];
$kesimpulan = $list['kesimpulan'];
$verifikasi = $list['verifikasi'];
$nama = $list['nmpasien'];
$jk = $list['jkpasien'];
$telpon = $list['tlppasien'];
$alamat = $list['alamatpasien'];
$tgllahir = $list['tgllahirpasien'];
$ktp = $list['ktp'];
$bpjs = $list['bpjs'];
$nmpendaftar= $list['pendaftar'];
if ($nmpendaftar == 'supervisor' OR $nmpendaftar == 'admin' OR $nmpendaftar == 'analis' OR $nmpendaftar == 'ppds' OR $nmpendaftar == 'developer'){
$nmpendaftar = $list['nmpendaftar'];
} else {
$nmpendaftar = 'SIMRS';
}
$from = $verifikasi ? \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $verifikasi) : null;
$to = $verifikasi ? \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $verifikasi)->toString() : '';
if ($from && $from->isValid()) {
$durasi = $verifikasi ? \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $verifikasi)->diffForHumans($from) : 'On Progress';
} else {
$durasi = 'On Progress';
}
if ($middleppds2 != 0){
$ppdsas = 'Middle';
$otherppds = $list['nmppdsmiddle2'];
} else {
$ppdsas = 'Junior';
$otherppds = $ppdsjunior2;
$otherppds = $list['nmppdsjunior2'];
}
$arrdaftar = explode(" ", $daftar);
$tgldaftar = $arrdaftar[0];
$jamdaftar = $arrdaftar[1];
$daftar = $tgldaftar;
$tglfoto = $foto ?: date("Y-m-d H:i:s");
$datatampilan = $this->setStatusStyles($status, $nofoto, $noregister, $nama, $telpon, $jk, $usia, $urgensi, $reques, $ruangan, $daftar, $asalpasien);
return [
'asalpasien' => $list['asalpasien'],
'tlsnofoto' => $datatampilan['nofoto'],
'tlsnoregister' => $datatampilan['noregister'],
'tlsnama' => $datatampilan['nama'],
'tlsjk' => $datatampilan['jk'],
'tlsusia' => $datatampilan['usia'],
'tlsurgensi' => ($list['urgensi'] == 'CITO') ? '<span style="background-color: red;">C I T O</span>' : $datatampilan['urgensi'],
'tlsreques' => $datatampilan['reques'],
'tlsruangan' => $list['ruangan'],
'tlsdaftar' => $datatampilan['daftar'],
'tlsstatus' => $datatampilan['status'],
'id' => $list['id'],
'nofoto' => $nofoto,
'noregister' => $noregister,
'nama' => $nama,
'jk' => $jk,
'usia' => $usia,
'urgensi' => $urgensi,
'poli' => $reques,
'idpasien' => $pasiedin,
'ruangan' => $ruangan,
'daftar' => $list['daftar'],
'daftartgl' => $daftar,
'daftarjam' => $jamdaftar,
'status' => $status,
'dokter' => $master != 'kiriman' ? $list['nmdokter'] : '',
'ppds1' => $master != 'kiriman' ? $list['nmppdssenior'] : '',
'ppds2' => $master != 'kiriman' ? $list['nmmiddleppds'] : '',
'ppds3' => $master != 'kiriman' ? $list['nmppdsjunior'] : '',
'keterangan' => $keterangan,
'kesimpulan' => $kesimpulan,
'noloket' => $list['noloket'],
'idruangan' => $list['ruangan_id'],
'iddokter' => $list['dokter_id'],
'ppdssenior' => $list['ppdssenior'],
'middleppds' => $list['middleppds'],
'ppdsjunior' => $list['ppdsjunior'],
'diagnosa' => $list['diagnosa'],
'diagnosa2' => $list['diagnosa2'],
'kd_spesimen' => $list['kd_spesimen'],
'nm_spesimen' => $list['nm_spesimen'],
'berat' => $list['berat'],
'klinis' => $list['klinis'],
'klinisi' => $list['klinisi'],
'filefoto' => $list['filefoto'],
'dlp' => $list['dlp'],
'analis' => $list['analis'],
'excutor' => $list['excutor'],
'modality' => $list['modality'],
'viewfoto' => $list['foto'],
'tglfoto' => $tglfoto,
'nmppdssenior' => $list['nmppdssenior'],
'nmmiddleppds' => $list['nmmiddleppds'],
'nmppdsjunior' => $list['nmppdsjunior'],
'nmppdsmiddle2' => $list['nmppdsmiddle2'],
'nmppdsjunior2' => $list['nmppdsjunior2'],
'nmanalis' => $list['nmanalis'],
'nmexcutor' => $list['nmexcutor'],
'telpon' => $list['tlppasien'],
'asuransi' => $list['asuransi'],
'tgllahir' => $list['tgllahirpasien'],
'alamat' => $list['alamatpasien'],
'poli_id' => $list['poli_id'],
'nmpendaftar' => $nmpendaftar,
'timestamp1' => $from ? $from->toString() : null,
'timestamp2' => $to,
'durasi' => $durasi,
'ppdsas' => $ppdsas,
'otherppds' => $otherppds,
'ktp' => $ktp,
'bpjs' => $bpjs,
];
}, $dataArray);
}
$response = [
'message' => 'List Laporan',
'data' => $arraylist,
'total' => $total
];
return response()->json($response, 200);
echo json_encode($arraylist);
}
public function listDetail(Request $request) {
$id = $request->input('id');
@@ -265,31 +506,6 @@ class ListController extends Controller
'orderid' => $getdata->orderid,
]);
try {
if ($getdata->kd_spesimen != '' AND $getdata->nm_spesimen != ''){
PendaftaranOnListiner::updateOrCreate(
[
'rnoreg' => $getdata->nofoto,
],
[
'rtglast' => date('Y-m-d'),
'norm' => $getdata->noregister,
'nama' => $getdata->nmpasien,
'alamat' => $getdata->alamatpasien,
'telp' => $getdata->tlppasien,
'hp' => $getdata->tlppasien,
'tgllahir' => $getdata->tgllahirpasien,
'umur' => $getdata->usia,
'rjenis' => $getdata->jkpasien,
'kodedok' => Session('id'),
'namadok' => Session('nama'),
'ruangan' => $getdata->ruangan,
'tes' => '',
'alat' => 'All',
'kd_spesimen' => $getdata->kd_spesimen,
'nm_spesimen' => $getdata->nm_spesimen,
]
);
}
return response()->json(['status' => 'Sukses', 'message' => 'Data Order Berhasil di Gandakan'], 201);
} catch (Exception $e) {
return response()->json(['status' => 'Sukses', 'message' => 'Data Order Berhasil di Gandakan'], 201);
@@ -338,4 +554,175 @@ class ListController extends Controller
}
}
public function getListDataTables(Request $request){
$jenis = $request->input('jenis');
$mulai = $request->input('mulai');
$akhir = $request->input('akhir');
$lokasi = $request->input('lokasi');
$valcari = $request->input('valcari');
$master = $request->input('master');
$arraylist = Periksa::select(
'id', 'mulai', 'akhir', 'orderid', 'noloket', 'nofoto', 'noregister', 'asalpasien', 'nmrs', 'pasien_id', 'nmpasien',
'jkpasien', 'tgllahirpasien', 'tlppasien', 'alamatpasien', 'reques', 'usia', 'berat', 'ktp', 'bpjs', 'ruangan_id',
'ruangan', 'dokter_id', 'ppdssenior', 'middleppds', 'ppdsjunior', 'ppdsmiddle2', 'ppdsjunior2', 'analis', 'excutor',
'nmdokter', 'nmppdssenior', 'nmmiddleppds', 'nmppdsjunior', 'nmppdsmiddle2', 'nmppdsjunior2', 'nmanalis', 'nmexcutor',
'klinisi', 'klinis', 'keterangan', 'kesimpulan', 'poli_id', 'asuransi', 'urgensi', 'diagnosa', 'diagnosa2', 'modality',
'kd_spesimen', 'nm_spesimen', 'dlp', 'daftar', 'foto', 'tgldraft', 'nmdrafter', 'baca', 'nmpembaca', 'verifikasi',
'export', 'tgladendum', 'nmadendum', 'filefoto', 'pendaftar', 'status', 'created_at', 'updated_at',
'bhp_media', 'bhp_potsputum', 'bhp_poturine', 'bhp_oshe', 'bhp_obyekglass', 'bhp_botolbd', 'bhp_parafilm',
'bhp_tips', 'bhp_cottonswab', 'bhp_antibiotiktambahan', 'id_esbl', 'id_mrsa', 'rating', 'nmpendaftar',
DB::raw("DATE(daftar) as daftartgl"),
DB::raw("TO_CHAR(daftar, 'HH24:MI:SS') as daftarjam"),
DB::raw("TO_CHAR(export, 'HH24:MI:SS') as cetakjam"),
DB::raw("TO_CHAR(verifikasi, 'HH24:MI:SS') as verifikasijam"),
DB::raw("TO_CHAR(baca, 'HH24:MI:SS') as bacajam"),
DB::raw("TO_CHAR(foto, 'HH24:MI:SS') as fotojam"),
DB::raw("CASE WHEN jkpasien = 'L' THEN '1' ELSE '' END AS l"),
DB::raw("CASE WHEN jkpasien = 'P' THEN '1' ELSE '' END AS p"),
DB::raw("CONCAT('https://10.10.123.218/hasil/', nofoto::text) as urlhasil"),
DB::raw("CASE WHEN asuransi IN ('JKN', 'BPJS') THEN '1' ELSE '' END AS jkn"),
DB::raw("CASE WHEN asuransi = 'Billing' THEN '1' ELSE '' END AS billing"),
DB::raw("CASE WHEN asuransi = 'GCU' THEN '1' ELSE '' END AS gcu"),
DB::raw("CASE WHEN asuransi IN ('MANDIRI', 'Umum') THEN '1' ELSE '' END AS umum"),
DB::raw("CASE WHEN asuransi = 'SWASTA' THEN '1' ELSE '' END AS swasta"),
DB::raw("CASE WHEN asuransi = 'TAG' THEN '1' ELSE '' END AS tag"),
DB::raw("CASE WHEN urgensi != 'CITO' THEN '1' ELSE '' END AS elective"),
DB::raw("CASE WHEN urgensi = 'CITO' THEN '1' ELSE '' END AS cito"),
DB::raw("CASE
WHEN status IS NULL THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status = '' THEN '<span class=\"badge badge-danger\">NEW</span>'
WHEN status LIKE '%Dibatalkan%' THEN '<font color=grey>Batal</font>'
WHEN status LIKE '%Pemeriksaan Sampel%' THEN '<font color=green>Pemeriksaan Sampel</font>'
WHEN status LIKE '%Proses Analisis Sampel%' THEN '<strong>Diperiksa</strong>'
WHEN status LIKE '%Draft%' THEN '<font color=green>Draft</font>'
WHEN status LIKE '%Expertise%' THEN '<strong><font color=green>Expertise</font></strong>'
WHEN status LIKE '%Decliend%' THEN '<strong><font color=red>Decliend</font></strong>'
WHEN status LIKE '%Selesai%' THEN '<span class=\"badge badge-success\">Selesai</span>'
WHEN status LIKE '%Arsip%' THEN '<span class=\"badge badge-primary\">Arsip</span>'
WHEN status LIKE '%Pemeriksaan awal%' THEN '<span class=\"badge badge-primary\">Pemeriksaan awal</span>'
WHEN status LIKE '%Data Vitek di Terima%' THEN '<span class=\"badge badge-warning\">Data Vitek di Terima</span>'
ELSE CONCAT('<span class=\"badge badge-info\">', status::text, '</span>')
END AS tlsstatus"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nofoto::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nofoto::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nofoto::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nofoto::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nofoto::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nofoto::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', nofoto::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nofoto::text, '</span>')
ELSE CONCAT('<font color=red>', nofoto::text, '</font>')
END AS tlsnofoto"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', noregister::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', noregister::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', noregister::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', noregister::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', noregister::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', noregister::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', noregister::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', noregister::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', noregister::text, '</span>')
ELSE CONCAT('<font color=red>', noregister::text, '</font>')
END AS tlsnoregister"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', nmpasien::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', nmpasien::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', nmpasien::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', nmpasien::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', nmpasien::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', nmpasien::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', nmpasien::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', nmpasien::text, '</span>')
ELSE CONCAT('<font color=red>', nmpasien::text, '</font>')
END AS tlsnama"),
DB::raw("CASE
WHEN status IS NULL THEN CONCAT('<span class=\"badge badge-danger\">', reques::text, '</span>')
WHEN status LIKE '%Dibatalkan%' THEN CONCAT('<font color=grey>', reques::text, '</font>')
WHEN status LIKE '%Pemeriksaan Sampel%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Proses Analisis Sampel%' THEN CONCAT('<strong>', reques::text, '</strong>')
WHEN status LIKE '%Draft%' THEN CONCAT('<font color=green>', reques::text, '</font>')
WHEN status LIKE '%Expertise%' THEN CONCAT('<strong><font color=green>', reques::text, '</font></strong>')
WHEN status LIKE '%Decliend%' THEN CONCAT('<strong><font color=red>', reques::text, '</font></strong>')
WHEN status LIKE '%Selesai%' THEN CONCAT('<span class=\"badge badge-success\">', reques::text, '</span>')
WHEN status LIKE '%Pemeriksaan awal%' THEN CONCAT('<span class=\"badge badge-primary\">', reques::text, '</span>')
WHEN status LIKE '%Arsip%' THEN CONCAT('<span class=\"badge badge-primary\">', reques::text, '</span>')
ELSE CONCAT('<font color=red>', reques::text, '</font>')
END AS tlsreques")
);
if ($jenis == 'ThisDay') {
$arraylist = $arraylist->where(function($q) {
$q->where(function($sub) {
$sub->whereNotIn('status', ['Selesai', 'Arsip'])
->where('status', 'not like', 'Dibatalkan%');
})->orWhereNull('status');
});
} else if ($jenis == 'ThisDayPendaftaran') {
$arraylist = $arraylist->whereDate('daftar', Carbon::today());
} else if ($jenis == 'mundur2') {
$arraylist = $arraylist->whereDate('daftar', '>=', Carbon::today()->subDays(2));
} else if ($jenis == 'mundur3') {
$arraylist = $arraylist->whereDate('daftar', '>=', Carbon::today()->subDays(3));
} else if ($jenis === 'searchbydate') {
$mulai = $mulai ?: date("Y-m-d");
$akhir = $akhir ?: date("Y-m-d");
if ($mulai >= $akhir) {
$akhir = date('Y-m-d', strtotime($akhir . ' +1 day'));
}
$arraylist = $arraylist->whereBetween('daftar', [$mulai, $akhir]);
} else if ($jenis === 'searchbydatemanual') {
$mulai = $mulai ?: date("Y-m-d");
$akhir = $akhir ?: date("Y-m-d");
if ($mulai >= $akhir) {
$akhir = date('Y-m-d', strtotime($akhir . ' +1 day'));
}
$arraylist = $arraylist->whereBetween('daftar', [$mulai, $akhir])->whereNotIn('pendaftar', ['supervisor', 'admin', 'analis', 'ppds', 'developer']);
} else if ($jenis === 'norm'){
$arraylist = $arraylist->where('noregister', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'nofoto'){
$arraylist = $arraylist->where('nofoto', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'rekues'){
$arraylist = $arraylist->where('reques', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'keterangan'){
$arraylist = $arraylist->where('keterangan', 'LIKE', '%'.$valcari.'%');
} else if ($jenis === 'kesimpulan'){
$arraylist = $arraylist->where('kesimpulan', 'LIKE', '%'.$valcari.'%');
} else {
$arraylist = $arraylist->where('nmpasien', 'LIKE', '%'.$valcari.'%');
}
$arraylist->whereIn('status', ['Penerimaan Sampel', 'Pemeriksaan Sampel', 'Pemeriksaan Awal'])->orderBy('id', 'DESC');
return DataTables::of($arraylist)
->addColumn('aksi', function ($row) {
return '
<div class="btn-group-vertical mb-2">
<button type="button" class="btn btn-sm btn-outline-primary waves-effect" onClick="btnMarking('.$row->id.')">
<i class="me-50 fa fa-flag"></i>
</button>
</div>';
})
->addColumn('batalaksi', function ($row) {
return '
<button type="button" class="btn btn-sm btn-danger waves-effect" onClick="btnBatal('.$row->id.')">
<i class="me-50 fa fa-ban"></i> Kembalikan ke Loket
</button>';
})
->rawColumns(['aksi', 'tlsstatus', 'tlsnofoto', 'tlsnoregister', 'tlsnama', 'tlsreques', 'batalaksi'])
->make(true);
}
}
File diff suppressed because it is too large Load diff
@@ -106,7 +106,7 @@ class PasienController extends Controller
} else {
try {
$client = new Client();
$res = $client->request('GET', env('GETPASIEN_API'), ['query' => ['limit' => 10, 'nomedis' => $norm]]);
$res = $client->request('GET', 'https://gomed.rssa.my.id/api/account/pasien', ['query' => ['limit' => 10, 'nomedis' => $norm]]);
$response_data = json_decode($res->getBody()->getContents());
if (isset($response_data->response[0])) {
$hasil = $response_data->response[0];
+96 -522
View File
@@ -3,14 +3,9 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Poli;
use App\Ruangan;
use App\Organisms;
use App\XFiles;
use App\SIMBHPJenis;
use App\SIMBHPReport;
use App\User;
use App\Periksa;
use Validator;
use Session;
@@ -19,558 +14,137 @@ class PoliController extends Controller
{
public function index() {
if (Session::get('previlage') == ''){
return redirect('/login');
} else {
$data = [];
$data['polis'] = Poli::all();
$data['ruangans'] = Ruangan::all();
return redirect('/login');
} else {
$data = [];
$data['polis'] = Poli::all();
$data['ruangans'] = Ruangan::all();
return view('admin.poli', $data);
}
}
public function viewGudangIndex() {
if (Session::get('previlage') == ''){
return redirect('/login');
} else {
$tasks = [];
$homebase = url("/");
$sekarang = date("Y-m-d");
$pegawais = User::select('id', 'nama', 'previlage')->orderBy('nama', 'ASC')->get();
$cdatane = SIMBHPJenis::all();
$cjenis = count($cdatane);
if ($cjenis == 0){
$tasks['jjenis'][0]['jenis'] = 'Belum Ada Jenis Barang';
$tasks['jjenis'][0]['satuan'] = '';
} else {
$i = 0;
foreach($cdatane as $rdata){
$tasks['jjenis'][$i]['jenis'] = $rdata->jenis;
$tasks['jjenis'][$i]['satuan'] = $rdata->satuan;
$i++;
}
}
$getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->groupBy('marking')->first();
if (isset($getdebet->pemasukan)){
$totpemasukan = $getdebet->pemasukan;
} else { $totpemasukan = 0 ;}
$getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->groupBy('marking')->first();
if (isset($getkredit->pengeluaran)){
$totpepengeluaran = $getkredit->pengeluaran;
} else { $totpepengeluaran = 0 ;}
$tasks['masuk'] = $totpemasukan;
$tasks['keluar'] = $totpepengeluaran;
$tasks['pegawai'] = $pegawais;
$tasks['tahunne'] = date("Y");
$tasks['tanggal'] = $sekarang;
$tasks['sidebar'] = 'simbhp';
$previlage = Session('previlage');
return view('admin.gudang', $tasks);
}
}
public function storePoli(Request $request) {
$validator = Validator::make($request->all(), [
'poli' => 'required',
'poli' => 'required',
'modaliti' => 'required'
$validator = Validator::make($request->all(), [
'poli' => 'required',
'poli' => 'required',
'modaliti' => 'required'
]);
if($validator->fails()) {
return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']);
} else {
$poli = $request->input('poli');
$subpoli = $request->input('subpoli');
$subsubpoli = $request->input('subsubpoli');
$modaliti = $request->input('modaliti');
Poli::create([
'poli' => $request->input('poli'),
'subpoli' => $request->input('subpoli'),
'subsubpoli'=> $request->input('subsubpoli'),
'modaliti' => $request->input('modaliti'),
'modaliti2' => $request->input('modaliti2')
]);
$tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Saved..!!';
return response()->json(['status' => 'success', 'message' => $tulis]);
}
}
public function getListPoli() {
$results = Poli::orderBy('subpoli', 'ASC')->get();
echo json_encode($results);
}
public function updatePoli(Request $request) {
$validator = Validator::make($request->all(), [
'id' => 'required',
'poli' => 'required',
'subpoli' => 'required',
'modaliti' => 'required'
]);
if($validator->fails()) {
if($validator->fails()) {
return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']);
} else {
$id = $request->input('id');
$poli = $request->input('poli');
$subpoli = $request->input('subpoli');
$subsubpoli = $request->input('subsubpoli');
Poli::where('id', $id)->update([
'poli' => $poli,
'subpoli' => $subpoli,
'subsubpoli'=> $subsubpoli,
'modaliti' => $request->input('modaliti'),
'modaliti2' => $request->input('modaliti2')
]);
$tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Updated..!!';
return response()->json(['status' => 'success', 'message' => $tulis]);
$poli = $request->input('poli');
$subpoli = $request->input('subpoli');
$subsubpoli = $request->input('subsubpoli');
Poli::create([
'poli' => $request->input('poli'),
'subpoli' => $request->input('subpoli'),
'subsubpoli'=> $request->input('subsubpoli'),
'modaliti' => $request->input('modaliti'),
'modaliti2' => $request->input('modaliti2'),
'kelompok' => $request->input('kelompok')
]);
Periksa::where('reques', $subpoli)->update([
'kd_spesimen' => $request->input('subsubpoli'),
'nm_spesimen' => $request->input('modaliti'),
]);
$tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Saved..!!';
return response()->json(['status' => 'success', 'message' => $tulis]);
}
}
public function deletePoli(Request $request) {
$id = $request->id;
$poli = Poli::find($id);
$poli->delete();
return back();
public function getListPoli() {
$results = Poli::orderBy('subpoli', 'ASC')->get();
echo json_encode($results);
}
public function updatePoli(Request $request) {
$validator = Validator::make($request->all(), [
'id' => 'required',
'poli' => 'required',
'subpoli' => 'required',
'modaliti' => 'required'
]);
if($validator->fails()) {
return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']);
} else {
$id = $request->input('id');
$poli = $request->input('poli');
$subpoli = $request->input('subpoli');
$subsubpoli = $request->input('subsubpoli');
$kelompok = $request->input('kelompok');
Poli::where('id', $id)->update([
'poli' => $poli,
'subpoli' => $subpoli,
'subsubpoli'=> $subsubpoli,
'modaliti' => $request->input('modaliti'),
'modaliti2' => $request->input('modaliti2'),
'kelompok' => $request->input('kelompok')
]);
if ($kelompok != ''){
Periksa::where('reques', $subpoli)->whereNull('status')->update([
'dlp' => $kelompok
]);
}
Periksa::where('reques', $subpoli)->update([
'kd_spesimen' => $subsubpoli,
'nm_spesimen' => $request->input('modaliti'),
]);
$tulis = 'Data '.$poli.' '.$subpoli.' '.$subsubpoli.' Updated..!!';
return response()->json(['status' => 'success', 'message' => $tulis]);
}
}
public function deletePoli(Request $request) {
$id = $request->id;
$poli = Poli::find($id);
$poli->delete();
return back();
}
public function storeRuangan(Request $request) {
$validator = Validator::make($request->all(), [
'poli' => 'required',
'ruangan' => 'required'
$validator = Validator::make($request->all(), [
'poli' => 'required',
'ruangan' => 'required'
]);
if($validator->fails()) {
return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']);
} else {
Ruangan::create([
'poli' => $request->input('poli'),
'ruangan' => $request->input('ruangan')
'poli' => $request->input('poli'),
'ruangan' => $request->input('ruangan')
]);
Session::flash('message', 'Data berhasil disimpan');
Session::flash('message', 'Data berhasil disimpan');
Session::flash('alert-class', 'alert-success');
return back();
}
}
public function getListRuangan(Request $request) {
$results = Ruangan::all();
$results = Ruangan::all();
echo json_encode($results);
}
public function updateRuangan(Request $request) {
$validator = Validator::make($request->all(), [
'id' => 'required',
'poli' => 'required',
'ruangan' => 'required'
'id' => 'required',
'poli' => 'required',
'ruangan' => 'required'
]);
if($validator->fails()) {
return response()->json(['status' => 'error', 'message' => 'Please fill input field or fill with right input']);
} else {
$id = $request->input('id');
$id = $request->input('id');
Ruangan::where('id', $id)->update([
'poli' => $request->input('poli'),
'ruangan' => $request->input('ruangan')
'poli' => $request->input('poli'),
'ruangan' => $request->input('ruangan')
]);
}
}
public function deleteRuangan(Request $request) {
$id = $request->id;
$ruangan = Ruangan::find($id);
$id = $request->id;
$ruangan = Ruangan::find($id);
$ruangan->delete();
return back();
}
public function jsonRekapbhp() {
$tahun = date("Y");
$thnlalu = $tahun - 1;
$totale = 0;
$arraysurat = [];
$getdata = SIMBHPJenis::all();
if (!empty($getdata)){
foreach($getdata as $hasil){
$jenis = $hasil->kodejenis;
$satuan = $hasil->satuan;
$tlsjenis = $hasil->jenis;;
$getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $tlsjenis)->groupBy('jenis')->first();
if (isset($getdebet->pemasukan)){
$totpemasukan = $getdebet->pemasukan;
} else { $totpemasukan = 0 ;}
$getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $tlsjenis)->groupBy('jenis')->first();
if (isset($getkredit->pengeluaran)){
$totpepengeluaran = $getkredit->pengeluaran;
} else { $totpepengeluaran = 0 ;}
$saldoakhir = $totpemasukan - $totpepengeluaran;
$arraysurat[] = array(
'id' => $hasil->id,
'satuan' => $satuan,
'jenis' => $jenis,
'tlsjenis' => $tlsjenis,
'saldo' => number_format( $saldoakhir , 0 , '.' , ',' ),
);
}
}
echo json_encode($arraysurat);
}
public function jsonReportbhp(Request $request) {
$bulan = $request->input('val01');
$tahun = $request->input('val02');
$hasil = [];
if ($tahun == 'ALL'){
$bulan = date("m");
$tahun = date("Y");
$getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get();
} else {
if ($bulan == 'ALL'){
$getdata = SIMBHPReport::where('tahun', $tahun)->orderBy('id', 'DESC')->get();
} else {
$getdata = SIMBHPReport::where('bulan', $bulan)->where('tahun', $tahun)->orderBy('id', 'DESC')->get();
}
}
foreach($getdata as $rdata){
$dd = $rdata->tanggal;
$mm = $rdata->bulan;
$yy = $rdata->tahun;
$pengeluaran= $rdata->pengeluaran;
$pemasukan = $rdata->pemasukan;
if ($mm < 10){
$tgllengkap = $dd.'-0'.$mm.'-'.$yy;
} else {
$tgllengkap = $dd.'-'.$mm.'-'.$yy;
}
if ($pengeluaran == '' OR $pengeluaran == 0) {$total = $pemasukan;}
else { $total = $pengeluaran; }
$hasil[] = array(
'id' => $rdata->id,
'tanggal' => $rdata->tanggal,
'bulan' => $rdata->bulan,
'tahun' => $rdata->tahun,
'deskripsi' => $rdata->deskripsi,
'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ),
'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ),
'jenis' => $rdata->jenis,
'keterangan' => $rdata->keterangan,
'tgllengkap' => $tgllengkap,
'total' => $total,
);
}
echo json_encode($hasil);
}
public function jsonReportbhpPaginated(Request $request) {
$tanggal = $request->input('tanggal');
$deskripsi = $request->input('deskripsi');
$kategori = $request->input('kategori');
$lm = 10;
$limit = ($request->input('limit') == null ? $lm : $request->input('limit'));
$order = ($request->input('order') == null ? 'id desc' : $request->input('order'));
$data = new SIMBHPReport;
if ($kategori != null AND $kategori != '') $data = $data->where('jenis', $kategori);
if ($tanggal != null AND $tanggal != '') $data = $data->where('created_at', 'LIKE', '%'.$tanggal.'%');
if ($deskripsi != null AND $deskripsi != '') $data = $data->where('deskripsi', 'LIKE', '%'.$deskripsi.'%');
$data = $data->orderByRaw($order)->paginate($limit);
$hasil = [];
$totaldata = $data->total();
$debet = 0;
$kredit = 0;
if (!empty($data)){
foreach($data as $rdata){
$dd = $rdata->tanggal;
$mm = $rdata->bulan;
$yy = $rdata->tahun;
$pengeluaran = $rdata->pengeluaran;
$pemasukan = $rdata->pemasukan;
$deskripsi = $rdata->deskripsi;
$jenis = $rdata->jenis;
$debet = $debet + $pemasukan;
$kredit = $kredit + $pengeluaran;
$cekjenis = SIMBHPJenis::where('kodejenis', $jenis)->first();
if (isset($cekjenis->id)){
$kodejenis = $cekjenis->kodejenis;
$jenis = $cekjenis->jenis;
$satuan = $cekjenis->satuan;
} else {
$kodejenis = $jenis;
$jenis = '';
$satuan = '';
}
if ($jenis != ''){
$deskripsi = '<strong>'.$jenis.'</strong><br />'.$deskripsi;
}
if ($mm < 10){
$tgllengkap = $yy.'-0'.$mm.'-'.$dd;
} else {
$tgllengkap = $yy.'-'.$mm.'-'.$dd;
}
if ($pengeluaran == '' OR $pengeluaran == 0) {
$total = $pemasukan;
$jentrans = 'PEMASUKAN';
}
else {
$total = $pengeluaran;
$jentrans = 'PENGELUARAN';
}
$hasil[] = array(
'id' => $rdata->id,
'tanggal' => $rdata->tanggal,
'bulan' => $rdata->bulan,
'tahun' => $rdata->tahun,
'tlsdeskripsi' => $deskripsi,
'deskripsi' => $rdata->deskripsi,
'pemasukan' => number_format( $pemasukan , 0 , '.' , ',' ),
'pengeluaran' => number_format( $pengeluaran , 0 , '.' , ',' ),
'jenis' => $kodejenis,
'keterangan' => $rdata->keterangan,
'tgllengkap' => $tgllengkap,
'created_at' => $rdata->created_at,
'nominal' => $total.' '.$satuan,
'jentrans' => $jentrans,
);
}
}
$response = [
'message' => 'List Data',
'data' => $hasil,
'totaldata' => $totaldata
];
return response()->json($response, 200);
}
public function exAddbarang(Request $request) {
$deskripsi = $request->input('set01');
$pos = $request->input('set02');
$tanggal = $request->input('set03');
$jumlah = $request->input('set04');
$jenis = $request->input('set05');
$postujuan = $request->input('set06');
$alasan = $request->input('set07');
$nama = Session('nama');
if ($tanggal == '' OR is_null($tanggal)){
$tanggal = date("d-m-Y");
}
$total = (int)str_replace(',','',$jumlah);
if ($jenis == 'jenis'){ $jumlah = '-';}
if ($deskripsi != '' and $pos != '' and $tanggal != '' and $jumlah != '' and $jenis != ''){
if ($jenis == 'jenis'){
$jenis = $request->input('set02');
$satuan = $request->input('set03');
$idne = $request->input('set04');
$kodejenis = preg_replace('/\s+/', '', $jenis);
if ($idne == 'new' OR $idne == ''){
$ceksudah = SIMBHPJenis::where('kodejenis', $kodejenis)->where('satuan', $satuan)->count();
if ($ceksudah != 0){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']);
return back();
} else {
$input = SIMBHPJenis::create([
'kodejenis' => $kodejenis,
'jenis' => $jenis,
'satuan' => $satuan,
]);
if ($input){
return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Ditambahkan']);
return back();
} else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']);
return back();
}
}
} else {
$ceksudah = SIMBHPJenis::where('id', '!=', $idne)->where('kodejenis', $kodejenis)->where('satuan', $satuan)->count();
if ($ceksudah != 0){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Sudah Ada, Silahkan Masukkan Jenis Barang Lain']);
return back();
} else {
$input = SIMBHPJenis::where('id', $idne)->update([
'kodejenis' => $kodejenis,
'jenis' => $jenis,
'satuan' => $satuan,
]);
if ($input){
return response()->json(['status' => 'Success', 'message' => 'Data '.$jenis.' Sukses Diupdate']);
return back();
} else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => $jenis.' Gagal di masukkan, silahkan ulangi beberapa saat lagi']);
return back();
}
}
}
} else {
$ahrf = explode("-", $tanggal);
$tahun = $ahrf[0];
if(isset($ahrf[1])){
$wulan = (int)$ahrf[1];
} else { $wulan = date("m"); $wulan = (int)$wulan; }
if(isset($ahrf[2])){
$dino = (int)$ahrf[2];
} else { $dino = date("d"); }
if ($jenis == 'pemasukan'){
$bayar = SIMBHPReport::create([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'deskripsi' => $deskripsi,
'pemasukan' => $total,
'pengeluaran' => null,
'jenis' => $pos,
'keterangan' => '',
'marking' => '',
]);
} else if ($jenis == 'pengeluaran'){
$getnama = User::where('id', $deskripsi)->first();
$nama = $getnama->nama ?? 'Unkown';
$deskripsi = 'Diterima oleh '.$nama;
$getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $pos)->groupBy('jenis')->first();
if (isset($getdebet->pemasukan)){
$totpemasukan = $getdebet->pemasukan;
} else { $totpemasukan = 0 ;}
$getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $pos)->groupBy('jenis')->first();
if (isset($getkredit->pengeluaran)){
$totpepengeluaran = $getkredit->pengeluaran;
} else { $totpepengeluaran = 0 ;}
$totpepengeluaran = $totpepengeluaran + $total;
if ($totpepengeluaran > $totpemasukan){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']);
return back();
} else {
$bayar = SIMBHPReport::create([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'deskripsi' => $deskripsi,
'pemasukan' => null,
'pengeluaran' => $total,
'jenis' => $pos,
'keterangan' => '',
'marking' => '',
]);
}
} else if ($jenis == 'editor'){
if ($alasan == ''){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']);
return back();
} else {
$getdebet = SIMBHPReport::select(DB::raw('SUM(pemasukan) as pemasukan'))->where('jenis', $pos)->groupBy('jenis')->first();
if (isset($getdebet->pemasukan)){
$totpemasukan = $getdebet->pemasukan;
} else { $totpemasukan = 0 ;}
$getkredit = SIMBHPReport::select(DB::raw('SUM(pengeluaran) as pengeluaran'))->where('jenis', $pos)->groupBy('jenis')->first();
if (isset($getkredit->pengeluaran)){
$totpepengeluaran = $getkredit->pengeluaran;
} else { $totpepengeluaran = 0 ;}
$totpepengeluaran = $totpepengeluaran + $total;
$rdatalama = SIMBHPReport::where('id', $postujuan)->first();
$ldeskripsi = $rdatalama->deskripsi;
$lpemasukan = $rdatalama->pemasukan;
$lpengeluaran = $rdatalama->pengeluaran;
$ljenis = $rdatalama->jenis;
$marking = $rdatalama->marking;
if ($lpengeluaran == '' OR $lpengeluaran == 0) {
$ltotal = number_format( $lpemasukan , 0 , '.' , ',' );
if ($marking != ''){
SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'pengeluaran' => $total
]);
}
$bayar = SIMBHPReport::where('id', $postujuan)->update([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'deskripsi' => $deskripsi,
'jenis' => $pos,
'pemasukan' => $total,
'keterangan' => $alasan,
'updated_at' => date("Y-m-d H:i:s")
]);
} else {
$totpepengeluaran = $totpepengeluaran + $total;
if ($totpepengeluaran > $totpemasukan){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Nominal Melebihi Stok']);
return back();
} else {
$ltotal = number_format( $lpengeluaran , 0 , '.' , ',' );
if ($marking != ''){
SIMBHPReport::where('marking', $marking)->whereNotIn('id', [$postujuan])->update([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'pemasukan' => $total
]);
}
$bayar = SIMBHPReport::where('id', $postujuan)->update([
'tanggal' => $dino,
'bulan' => $wulan,
'tahun' => $tahun,
'deskripsi' => $deskripsi,
'jenis' => $pos,
'pengeluaran' => $total,
'keterangan' => $alasan,
'updated_at' => date("Y-m-d H:i:s")
]);
}
}
$baris1 = '<table class="table table-bordered table-striped"><tr><td colspan=2><p align=center><b>Data Lama</b></p></td><td colspan=2><p align=center><b>Data Perubahan</b></p></td></tr>';
$baris2 = '<tr><td>Deskripsi</td><td>'.$ldeskripsi.'</td><td><font color=red>Diubah Menjadi</font></td><td>'.$deskripsi.'</td></tr>';
$baris3 = '<tr><td>Jenis</td><td>'.$ljenis.'</td><td><font color=red>Diubah Menjadi</font></td><td>'.$pos.'</td></tr>';
$baris4 = '<tr><td>Total</td><td>'.$ltotal.'</td><td><font color=red>Diubah Menjadi</font></td><td>'.$jumlah.'</td></tr>';
$baris5 = '<tr><td><b>Dengan Alasan</b></td><td colspan=3>'.$alasan.'</td</tr>';
$baris6 = '<tr><td><b>Eksekutor</b></td><td colspan=3>'.Session('nama').'</td</tr></table>';
$perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6;
Xfiles::create([
'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(),
'xtabel' => 'History SIMBHP',
'xjenis' => '',
'xfile' => $perubahan
]);
}
} else {
if ($alasan == ''){
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Alasan Perubahan Data Wajib Di Isi!!!']);
return back();
}
else {
$rdatalama = SIMBHPReport::where('id', $postujuan)->first();
$ldeskripsi = $rdatalama->deskripsi;
$lpemasukan = $rdatalama->pemasukan;
$lpengeluaran = $rdatalama->pengeluaran;
$ljenis = $rdatalama->jenis;
$marking = $rdatalama->marking;
if ($lpengeluaran == '' or $lpengeluaran == 0) {
$ltotal = number_format( $lpemasukan , 0 , '.' , ',' );
} else {
$ltotal = number_format( $lpengeluaran , 0 , '.' , ',' );
}
$baris1 = '<table class="table table-bordered table-striped"><tr><td colspan=2><p align=center><b>Data Lama</b></p></td><td colspan=2><p align=center><b>Data Perubahan</b></p></td></tr>';
$baris2 = '<tr><td>Deskripsi</td><td>'.$ldeskripsi.'</td><td colspan=2><font color=red>DIHAPUS</font></td></tr>';
$baris3 = '<tr><td>Jenis</td><td>'.$ljenis.'</td><td colspan=2><font color=red>DIHAPUS</font></td></tr>';
$baris4 = '<tr><td>Total</td><td>'.$ltotal.'</td><td colspan=2><font color=red>DIHAPUS</font></td></tr>';
$baris5 = '<tr><td><b>Dengan Alasan</b></td><td colspan=3>'.$alasan.'</td</tr>';
$baris6 = '<tr><td><b>Eksekutor</b></td><td colspan=3>'.Session('nama').'</td</tr></table>';
$perubahan = $baris1.$baris2.$baris3.$baris4.$baris5.$baris6;
Xfiles::create([
'xmarking' => 'SIMBHP-'.$postujuan.'-'.time(),
'xtabel' => 'History SIMBHP',
'xjenis' => '',
'xfile' => $perubahan
]);
if ($marking != ''){
$bayar = SIMBHPReport::where('marking', $marking)->delete();
} else {
$bayar = SIMBHPReport::where('id', $postujuan)->delete();
}
}
}
if ($bayar){
return response()->json(['status' => 'Success', 'message' => 'Transaksi '.$jenis.' Sukses Dilaksanakan']);
return back();
} else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Update Gagal, Pastikan Data Yang anda Isi Sudah Sesuai']);
return back();
}
}
}
else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Gagal', 'message' => 'Pastikan Formnya Anda Isi dengan Lengkap']);
return back();
}
}
}
File diff suppressed because it is too large Load diff
@@ -9,7 +9,8 @@ use App\Jawaban;
use App\Subjawaban;
use App\SiraB;
use App\Organisms;
use App\Periksa;
use App\KomponenJawaban;
use Validator;
use Picqer\Barcode\BarcodeGeneratorPNG;
use Session;
@@ -246,6 +247,7 @@ class TemplateController extends Controller
try {
$id = $request->id;
$tabel = $request->tabel;
$data = null;
$pesan = 'Unkown Error';
if ($tabel == 'Organisme'){
if ($id == 'new'){
@@ -276,8 +278,9 @@ class TemplateController extends Controller
return back();
}
} else if ($tabel == 'Speciment'){
$kodelama = '';
if ($id == 'new'){
$ceksudah = Organisms::where('name', $request->name)->where('category', $request->category)->where('kelompok', $request->kelompok)->count();
$ceksudah = Organisms::where('name', $request->name)->where('kelompok', $request->kelompok)->count();
if ($ceksudah == 0){
$data = new Organisms;
$inputData = $request->except(['id', 'tabel', '_token']);
@@ -287,9 +290,11 @@ class TemplateController extends Controller
$pesan = $request->name.' ('.$request->category.') Sudah ada, Mohon ubah Data sebelum simpan kembali';
}
} else {
$ceksudah = Organisms::where('id', '!=', $id)->where('name', $request->name)->where('category', $request->category)->where('kelompok', $request->kelompok)->count();
$ceksudah = Organisms::where('id', '!=', $id)->where('name', $request->name)->where('kelompok', $request->kelompok)->count();
if ($ceksudah == 0){
$data = Organisms::find($id);
$kodelama = $data->category;
$kodebaru = $request->category;
$inputData = $request->except(['id', 'tabel', '_token']);
$data->update($inputData);
} else {
@@ -297,6 +302,9 @@ class TemplateController extends Controller
}
}
if ($data){
if ($kodelama != ''){
Periksa::where('kd_spesimen', $kodelama)->update(['kd_spesimen' => $kodebaru]);
}
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Success', 'message' => 'Saved']);
return back();
} else {
@@ -306,7 +314,6 @@ class TemplateController extends Controller
} else if ($tabel == 'Parameter'){
$getdatalama = Organisms::where('kelompok', $request->kelompok)->first();
$category = $getdatalama->category ?? $request->kelompok;
if ($id == 'new'){
$ceksudah = Organisms::where('name', $request->name)->where('category', $category)->where('kelompok', $request->kelompok)->count();
if ($ceksudah == 0){
@@ -337,6 +344,95 @@ class TemplateController extends Controller
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Failed', 'message' => 'Unkown Error']);
return back();
}
} else if ($tabel == 'BioRepository'){
$kategorisimpan = $request->kategorisimpan;
$shelfnomor = $request->shelfnomor;
$raknomor = $request->raknomor;
$slotnomor = $request->slotnomor;
$boxnomor = $request->boxnomor;
$tubenomor = $request->tubenomor;
$nomor = $kategorisimpan.''.$shelfnomor.''.$raknomor.''.$slotnomor.''.$boxnomor.'-'.$tubenomor;
$data = KomponenJawaban::where('id', $id)->update([
'isidata' => $request->nmbakteri,
'nobiorepository' => $nomor,
'strain' => $request->strain,
'atcc' => $request->atcc,
'sample' => $request->nmbakteri,
'tglpenyimpanan' => $request->tglpenyimpanan,
'created_by' => $request->created_by
]);
if ($data){
return response()->json(['icon' => 'success', 'warna' => '#5ba035', 'status' => 'Success', 'message' => 'Saved']);
return back();
} else {
return response()->json(['icon' => 'error', 'warna' => '#bf441d', 'status' => 'Failed', 'message' => 'Unkown Error']);
return back();
}
} else if ($tabel == 'uploadexcelsirab'){
$path = $_FILES['file']['tmp_name'];
$sukses = 0;
$error = '';
$baris = '1';
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load($path);
$getalldata = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
foreach($getalldata as $val){
if(is_null($val['H']) OR $val['H'] == 'kodedok' OR $val['H'] == ''){
//
} else {
$baris++;
$setmanual = $val['A'] ?? '';
$subantibiotik = $val['B'] ?? '';
$diskcontent = $val['C'] ?? '';
$batasatas = $val['D'] ?? '';
$midrange = $val['E'] ?? '';
$batasbawah = $val['F'] ?? '';
$sumber = $val['G'] ?? '';
$kodedok = $val['H'] ?? '';
if ($kodedok == '' OR $subantibiotik == '' OR $diskcontent == '' OR $sumber == '' OR $setmanual == ''){
$error .= $baris.' Data KodeDok '.$kodedok.' dengan Antibiotik '.$subantibiotik.' dan DiskContent '.$diskcontent.' Sumber '.$sumber.' Untuk Set Manual '.$setmanual.' tidak lengkap; <br />';
} else {
$cekada = SiraB::where('kodedok', $kodedok)->where('setmanual', $setmanual)->where('subantibiotik', $subantibiotik)->where('diskcontent', $diskcontent)->where('sumber', $sumber)->first();
if (isset($cekada->id)){
$idsirab = $cekada->id;
$updatesirab = SiraB::where('id', $idsirab)->update([
'batasatas' => $batasatas,
'midrange' => $midrange,
'batasbawah' => $batasbawah,
]);
if ($updatesirab){
$sukses++;
} else {
$error .= 'ID '.$idsirab.' Gagal diupdate; <br />';
}
} else {
$cekada2 = SiraB::where('kodedok', $kodedok)->where('subantibiotik', $subantibiotik)->where('diskcontent', $diskcontent)->where('sumber', $sumber)->first();
if (isset($cekada2->id)){
$idsirab = $cekada2->id;
$updatesirab = SiraB::where('id', $idsirab)->update([
'setmanual' => $setmanual,
'batasatas' => $batasatas,
'midrange' => $midrange,
'batasbawah' => $batasbawah,
]);
if ($updatesirab){
$sukses++;
} else {
$error .= 'ID '.$idsirab.' Gagal diupdate; <br />';
}
} else {
$error .= $baris.' Data KodeDok '.$kodedok.' dengan Antibiotik '.$subantibiotik.' dan DiskContent '.$diskcontent.' tidak ditemukan untuk Antiobik manual Group '.$setmanual.'; <br />';
}
}
}
}
}
if ($error == ''){
$pesanakhir = 'Sukses mengupdate '.$sukses.' data.';
} else {
$pesanakhir = 'Sukses mengupdate '.$sukses.' data dengan catatan: <br />'.$error;
}
echo $pesanakhir;
} else {
if ($id == 'new'){
$data = new SiraB;
+16 -13
View File
@@ -19,21 +19,24 @@ class UserController extends Controller
if (Session::get('previlage') == ''){
return redirect('/login');
} else {
if ($cekkelompok == 'supervisor' OR $cekkelompok == 'admin' OR $cekkelompok == 'developer'){
$users = User::all();
if ($cekkelompok == 'supervisor' OR $cekkelompok == 'developer'){
$getsetting = Setting::where('id', '1')->first();
$data = [];
$data['users'] = User::orderBy('nama', 'ASC')->get();
$data['pacsaddr'] = $getsetting->pacs ?? '';
$data['zfpaddr'] = $getsetting->zfp ?? '';
$data['port'] = $getsetting->port ?? '';
$data['portzfp'] = $getsetting->portzfp ?? '';
$data['username'] = $getsetting->username ?? '';
$data['password'] = $getsetting->password ?? '';
return view('admin.user', $data);
} else {
$users = User::where('previlage', $cekkelompok)->get();
$data = [];
$data['kalimatheader'] = 'Access Denied';
$data['kalimatbody'] = 'Laman khusus SPV';
return view('errors.error', $data);
}
$getsetting = Setting::where('id', '1')->first();
$data = [];
$data['users'] = $users;
$data['pacsaddr'] = $getsetting->pacs ?? '';
$data['zfpaddr'] = $getsetting->zfp ?? '';
$data['port'] = $getsetting->port ?? '';
$data['portzfp'] = $getsetting->portzfp ?? '';
$data['username'] = $getsetting->username ?? '';
$data['password'] = $getsetting->password ?? '';
return view('admin.user', $data);
}
}
public function exSetting(Request $request) {
@@ -12,6 +12,6 @@ class VerifyCsrfToken extends Middleware
* @var array<int, string>
*/
protected $except = [
'registerpasien', 'registerjson', 'ekstrakhasil', 'prosesbatal', 'cekaksess'
'registerpasien', 'registerjson', 'ekstrakhasil', 'prosesbatal', 'cekaksess', 'ekstrakexpertise', 'getnolabnorm', 'registerulang'
];
}
+101
View File
@@ -0,0 +1,101 @@
<?php
namespace App\Livewire;
use App\BioCabinet;
use App\BioRack;
use Livewire\Component;
class BiorepositoryVisual extends Component
{
public ?int $selectedCabinetId = null;
public ?int $selectedRackId = null;
public ?int $selectedSlot = null;
public ?int $selectedShelf = null;
public ?int $selectedBox = null;
public function mount(): void
{
$this->selectedCabinetId = BioCabinet::orderBy('name', 'ASC')->value('id');
}
public function selectCabinet(int $cabinetId): void
{
$this->selectedCabinetId = $cabinetId;
$this->selectedRackId = null;
$this->resetPosition();
}
public function selectRack(int $rackId): void
{
$this->selectedRackId = $rackId;
$this->resetPosition();
}
public function selectSlot(int $slot): void
{
$this->selectedSlot = $slot;
$this->selectedShelf = null;
$this->selectedBox = null;
}
public function selectShelf(int $shelf): void
{
$this->selectedShelf = $shelf;
$this->selectedBox = null;
}
public function selectBox(int $box): void
{
$this->selectedBox = $box;
}
public function render()
{
$cabinets = BioCabinet::withCount(['racks', 'specimens'])
->orderBy('name', 'ASC')
->get();
if (!$this->selectedCabinetId && $cabinets->isNotEmpty()) {
$this->selectedCabinetId = (int) $cabinets->first()->id;
}
$selectedCabinet = $this->selectedCabinetId
? BioCabinet::with([
'racks' => function ($query) {
$query->withCount('specimens')
->orderBy('rack_number', 'ASC')
->orderBy('code', 'ASC');
},
])->find($this->selectedCabinetId)
: null;
$selectedRack = $this->selectedRackId
? BioRack::with(['specimens' => function ($query) {
$query->orderBy('slot_number', 'ASC')
->orderBy('shelf_number', 'ASC')
->orderBy('box_number', 'ASC')
->orderBy('tube_number', 'ASC');
}])->find($this->selectedRackId)
: null;
if ($selectedRack && (int) $selectedRack->cabinet_id !== (int) $this->selectedCabinetId) {
$selectedRack = null;
$this->selectedRackId = null;
$this->resetPosition();
}
return view('livewire.biorepository-visual', [
'cabinets' => $cabinets,
'selectedCabinet' => $selectedCabinet,
'selectedRack' => $selectedRack,
]);
}
private function resetPosition(): void
{
$this->selectedSlot = null;
$this->selectedShelf = null;
$this->selectedBox = null;
}
}
+428
View File
@@ -0,0 +1,428 @@
<?php
namespace App\Livewire;
use App\Services\SimbhpStockService;
use App\SIMBHPJenis;
use App\SIMBHPReport;
use App\User;
use Carbon\Carbon;
use Livewire\Component;
use Livewire\Attributes\On;
use Livewire\WithPagination;
use Illuminate\Support\Facades\DB;
class GudangPos extends Component
{
use WithPagination;
public string $tanggal = '';
public string $namaRuangan = '';
public string $penerimaId = '';
public string $penerimaManual = '';
public string $scan = '';
public string $selectedKode = '';
public string $satuanTransaksi = 'besar';
public int $qty = 1;
public string $keterangan = '';
public string $search = '';
/**
* @var array<int, array{kode:string, jenis:string, qty:int, satuan_transaksi:string}>
*/
public array $cart = [];
public function mount(): void
{
$this->tanggal = date('Y-m-d');
$firstUserId = User::orderBy('nama', 'ASC')->value('id');
$this->penerimaId = $firstUserId ? (string) $firstUserId : '';
}
public function updatingSearch(): void
{
$this->resetPage();
}
public function scanLookup(): void
{
$service = app(SimbhpStockService::class);
$raw = (string) $this->scan;
$parsed = $service->parseBarcode($raw);
$kode = (string) ($parsed['kode'] ?? '');
$jenisId = $parsed['jenis_id'] ?? null;
$this->scan = '';
if ($kode === '' && (is_null($jenisId) || (int) $jenisId <= 0)) {
$this->toast('error', 'Kode barcode kosong.');
return;
}
$jenis = $service->getJenisByKode($raw);
if (!$jenis) {
$this->toast('error', 'Kode barang tidak ditemukan.');
return;
}
$saldoBase = $service->getStockBaseByJenis((string) ($jenis->jenis ?? ''));
if ($saldoBase <= 0) {
$this->toast('error', 'Stok kosong untuk ' . ((string) ($jenis->jenis ?? 'barang')) . '.');
return;
}
$this->selectedKode = (string) ($jenis->kodejenis ?? '');
$this->qty = 1;
$this->keterangan = '';
$this->satuanTransaksi = (string) ($parsed['satuan_transaksi'] ?? 'besar');
$this->syncSatuanAvailability();
$this->dispatch('gudangpos-open-modal');
}
#[On('gudangpos-select')]
public function selectProduct(string $kode): void
{
$service = app(SimbhpStockService::class);
$kode = $service->sanitizeKode($kode);
$jenis = $service->getJenisByKode($kode);
if (!$jenis) {
$this->toast('error', 'Kode barang tidak ditemukan: ' . $kode);
return;
}
$saldoBase = $service->getStockBaseByJenis((string) ($jenis->jenis ?? ''));
if ($saldoBase <= 0) {
$this->toast('error', 'Stok kosong untuk ' . ((string) ($jenis->jenis ?? 'barang')) . '.');
return;
}
$this->selectedKode = (string) ($jenis->kodejenis ?? '');
$this->qty = 1;
$this->keterangan = '';
$this->syncSatuanAvailability();
$this->dispatch('gudangpos-open-modal');
}
#[On('gudangpos-refresh')]
public function refreshComponent(): void
{
// Force rerender + keep UI responsive when stok berubah dari tab lain.
$this->resetPage();
}
public function addSelected(): void
{
$service = app(SimbhpStockService::class);
$kode = $service->sanitizeKode($this->selectedKode);
if ($kode === '') {
$this->toast('error', 'Pilih barang dulu (scan barcode / klik daftar produk).');
return;
}
$jenis = $service->getJenisByKode($kode);
if (!$jenis) {
$this->toast('error', 'Kode barang tidak ditemukan: ' . $kode);
return;
}
$qty = (int) $this->qty;
$keterangan = trim((string) $this->keterangan);
if ($qty <= 0) {
$this->toast('error', 'Jumlah harus lebih dari 0.');
return;
}
$setting = $service->getUnitSetting($jenis);
if ($this->satuanTransaksi === 'kecil' && !$setting['has_breakdown']) {
$this->satuanTransaksi = 'besar';
$this->toast('info', 'Barang ini tidak memiliki satuan kecil, otomatis pakai satuan besar.');
}
$found = false;
foreach ($this->cart as $i => $line) {
if (
($line['kode'] ?? '') === $kode
&& ($line['satuan_transaksi'] ?? '') === $this->satuanTransaksi
&& trim((string) ($line['keterangan'] ?? '')) === $keterangan
) {
$this->cart[$i]['qty'] = ((int) ($this->cart[$i]['qty'] ?? 0)) + $qty;
$found = true;
break;
}
}
if (!$found) {
$this->cart[] = [
'kode' => $kode,
'jenis' => (string) ($jenis->jenis ?? ''),
'qty' => $qty,
'satuan_transaksi' => $this->satuanTransaksi,
'keterangan' => $keterangan,
];
}
$this->qty = 1;
$this->keterangan = '';
$this->dispatch('gudangpos-close-modal');
$this->dispatch('gudangpos-focus', field: 'scan');
}
public function removeLine(int $index): void
{
if (!isset($this->cart[$index])) {
return;
}
array_splice($this->cart, $index, 1);
}
public function processCart(): void
{
if (count($this->cart) === 0) {
$this->toast('info', 'Keranjang masih kosong.');
return;
}
if ($this->penerimaId === '') {
$this->toast('error', 'Penerima wajib dipilih.');
return;
}
$tanggal = trim((string) $this->tanggal);
if ($tanggal === '') {
$this->toast('error', 'Tanggal wajib diisi.');
return;
}
try {
$date = Carbon::parse($tanggal);
} catch (\Throwable $e) {
$this->toast('error', 'Format tanggal tidak valid.');
return;
}
$namaRuangan = trim((string) $this->namaRuangan);
if ($namaRuangan === '') {
$this->toast('error', 'Nama ruang wajib diisi.');
return;
}
if ($this->penerimaId === '__manual__') {
$penerima = trim((string) $this->penerimaManual);
if ($penerima === '') {
$this->toast('error', 'Nama penerima manual wajib diisi.');
return;
}
} else {
$user = User::select('id', 'nama')->find((int) $this->penerimaId);
if (!$user) {
$this->toast('error', 'Penerima tidak ditemukan.');
return;
}
$penerima = trim((string) ($user->nama ?? ''));
}
$service = app(SimbhpStockService::class);
$prepared = [];
$stockCache = [];
foreach ($this->cart as $line) {
$kode = $service->sanitizeKode((string) ($line['kode'] ?? ''));
$qty = (int) ($line['qty'] ?? 0);
$satuan = (string) ($line['satuan_transaksi'] ?? 'besar');
$keterangan = trim((string) ($line['keterangan'] ?? ''));
if ($kode === '' || $qty <= 0) {
$this->toast('error', 'Ada item keranjang yang tidak valid.');
return;
}
$jenis = $service->getJenisByKode($kode);
if (!$jenis) {
$this->toast('error', 'Kode barang tidak ditemukan: ' . $kode);
return;
}
$setting = $service->getUnitSetting($jenis);
if ($satuan === 'kecil' && !$setting['has_breakdown']) {
$satuan = 'besar';
}
$qtyBase = $service->calculateBaseQty($jenis, $qty, $satuan);
$jenisNama = (string) ($jenis->jenis ?? '');
if (!array_key_exists($jenisNama, $stockCache)) {
$stockCache[$jenisNama] = $service->getStockBaseByJenis($jenisNama);
}
if ($qtyBase > $stockCache[$jenisNama]) {
if ((int) $stockCache[$jenisNama] <= 0) {
$this->toast('error', 'Stok kosong untuk ' . $jenisNama . '.');
} else {
$this->toast('error', 'Stok tidak cukup untuk ' . $jenisNama . '.');
}
return;
}
$stockCache[$jenisNama] -= $qtyBase;
$prepared[] = [
'jenis' => $jenis,
'qty' => $qty,
'qty_base' => $qtyBase,
'satuan_transaksi' => $satuan,
'keterangan' => $keterangan,
];
}
DB::transaction(function () use ($prepared, $date, $penerima, $namaRuangan) {
foreach ($prepared as $row) {
/** @var SIMBHPJenis $jenis */
$jenis = $row['jenis'];
SIMBHPReport::create([
'tanggal' => (int) $date->format('d'),
'bulan' => (int) $date->format('m'),
'tahun' => (int) $date->format('Y'),
'deskripsi' => 'Ruangan: ' . $namaRuangan . ' | Diterima oleh ' . ($penerima !== '' ? $penerima : 'Unknown'),
'pemasukan' => null,
'pengeluaran' => (int) $row['qty'],
'qty_base' => (int) $row['qty_base'],
'satuan_transaksi' => (string) $row['satuan_transaksi'],
'masa_expired' => null,
'jenis' => (string) ($jenis->jenis ?? ''),
'keterangan' => (string) ($row['keterangan'] ?? ''),
'marking' => '',
]);
}
});
$this->cart = [];
$this->qty = 1;
$this->keterangan = '';
$this->penerimaManual = '';
$this->toast('success', 'Barang keluar berhasil diproses.');
$this->dispatch('gudang-refresh');
$this->dispatch('gudangpos-close-modal');
$this->dispatch('gudangpos-focus', field: 'scan');
}
public function updatedSelectedKode(): void
{
$this->syncSatuanAvailability();
}
public function updatedSatuanTransaksi(): void
{
$this->syncSatuanAvailability();
}
private function syncSatuanAvailability(): void
{
$service = app(SimbhpStockService::class);
$kode = $service->sanitizeKode($this->selectedKode);
if ($kode === '') {
return;
}
$jenis = $service->getJenisByKode($kode);
if (!$jenis) {
return;
}
$setting = $service->getUnitSetting($jenis);
if (!$setting['has_breakdown'] && $this->satuanTransaksi === 'kecil') {
$this->satuanTransaksi = 'besar';
}
}
private function toast(string $type, string $message): void
{
$this->dispatch('gudangpos-toast', type: $type, message: $message);
}
public function render()
{
$service = app(SimbhpStockService::class);
$users = User::select('id', 'nama', 'previlage')->orderBy('nama', 'ASC')->get();
$query = SIMBHPJenis::query()->orderBy('jenis', 'ASC');
$search = trim((string) $this->search);
if ($search !== '') {
$searchLike = '%' . $search . '%';
$driver = DB::connection()->getDriverName();
$operator = ($driver === 'pgsql') ? 'ILIKE' : 'LIKE';
$query->where(function ($q) use ($searchLike, $operator) {
$q->where('jenis', $operator, $searchLike)
->orWhere('kodejenis', $operator, $searchLike);
});
}
$products = $query->paginate(12);
$jenisNames = $products->getCollection()->pluck('jenis')->filter()->values()->all();
$stockMap = $service->getStockBaseByJenisMany($jenisNames);
$latestExpiredMap = [];
if (count($jenisNames) > 0) {
$expiredRows = SIMBHPReport::query()
->select('jenis', DB::raw('MAX(masa_expired) as latest_expired'))
->whereIn('jenis', $jenisNames)
->whereNotNull('masa_expired')
->whereNotNull('pemasukan')
->where('pemasukan', '>', 0)
->groupBy('jenis')
->get();
foreach ($expiredRows as $row) {
$jenisNama = (string) ($row->jenis ?? '');
$expired = (string) ($row->latest_expired ?? '');
if ($jenisNama !== '' && $expired !== '') {
$expiredDate = Carbon::parse($expired)->startOfDay();
$today = Carbon::today();
$daysLeft = $today->diffInDays($expiredDate, false);
$badgeClass = 'success';
if ($daysLeft < 0) {
$badgeClass = 'danger';
} elseif ($daysLeft <= 30) {
$badgeClass = 'warning';
}
$latestExpiredMap[$jenisNama] = [
'date' => $expiredDate->format('d-m-Y'),
'badge_class' => $badgeClass,
];
}
}
}
$selectedJenis = null;
$selectedStockDisplay = null;
$selectedSetting = null;
$selectedLatestExpired = null;
$kode = $service->sanitizeKode($this->selectedKode);
if ($kode !== '') {
$selectedJenis = $service->getJenisByKode($kode);
if ($selectedJenis) {
$saldoBase = $service->getStockBaseByJenis((string) $selectedJenis->jenis);
$selectedSetting = $service->getUnitSetting($selectedJenis);
$selectedStockDisplay = $service->formatStockDisplay(
$saldoBase,
(string) ($selectedJenis->satuan ?? ''),
(string) ($selectedJenis->satuan_kecil ?? ''),
(int) ($selectedJenis->konversi_kecil ?? 1),
);
$selectedLatestExpired = $latestExpiredMap[(string) $selectedJenis->jenis] ?? null;
}
}
return view('livewire.gudang-pos', [
'users' => $users,
'products' => $products,
'stockMap' => $stockMap,
'latestExpiredMap' => $latestExpiredMap,
'selectedJenis' => $selectedJenis,
'selectedStockDisplay' => $selectedStockDisplay,
'selectedSetting' => $selectedSetting,
'selectedLatestExpired' => $selectedLatestExpired,
]);
}
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Paslab extends Model
{
protected $table = "paslab";
protected $primaryKey = "urut";
public $timestamps = false;
protected $guarded = [];
}
+56
View File
@@ -3,6 +3,10 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\KomponenJawaban;
use App\Riwayat;
use App\ResultSample;
use App\PertumKolomNi;
class Periksa extends Model
{
@@ -52,4 +56,56 @@ class Periksa extends Model
{
return $this->hasOne('App\Logbook','id','diagnosa');
}
public function komponen()
{
return $this->hasMany(KomponenJawaban::class, 'accnumber', 'nofoto');
}
public function riwayats()
{
return $this->hasMany(Riwayat::class, 'nofoto', 'nofoto');
}
public function rawResult()
{
return $this->hasOne(ResultSample::class, 'accession_number', 'nofoto');
}
public function pertumkolomni()
{
return $this->hasMany(PertumKolomNi::class, 'orderid', 'id');
}
public function lastMediaBAP()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media BAP')
->latest();
}
public function lastMediaCAP()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media CAP')
->latest();
}
public function lastMediaMcConkey()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media Mc Conkey')
->latest();
}
public function lastMediaSDA()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media SDA')
->latest();
}
public function lastMediaSelLain()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media Selektif lainnya')
->latest();
}
public function lastMediaTamLain()
{
return $this->hasOne(PertumKolomNi::class, 'orderid', 'id')
->where('media', 'Media Tambahan Lainnya')
->latest();
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class PertumKolomNi extends Model
{
protected $table = "pertumkolomni";
protected $guarded = [];
}
+6 -2
View File
@@ -8,10 +8,14 @@ class Poli extends Model
{
protected $table = "poli";
protected $fillable = [
'id',
'poli',
'subpoli',
'subsubpoli',
'modaliti',
'modaliti2',
'modaliti',
'kelompok',
'modaliti2',
'created_at',
'updated_at',
];
}
@@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class RekapPenerimaanSamplePrintHistory extends Model
{
protected $table = 'rekap_penerimaan_sample_print_histories';
protected $guarded = [];
}
File diff suppressed because it is too large Load diff
+212
View File
@@ -0,0 +1,212 @@
<?php
namespace App\Services;
use App\SIMBHPJenis;
use Illuminate\Support\Facades\DB;
class SimbhpStockService
{
/**
* Barcode format:
* - MAIN (satuan besar): 91{ID(8-digit)}1 (example: 91000001231)
* - BREAKDOWN (satuan kecil): 91{ID(8-digit)}2 (example: 91000001232)
*
* Backward compatibility:
* - {KODE}-B / {KODE}-K
* - plain {KODE} treated as "besar"
*
* @return array{kode:string, jenis_id:int|null, satuan_transaksi:string, barcode_value:string}
*/
public function parseBarcode(string $raw): array
{
$raw = $this->sanitizeKode($raw);
if ($raw === '') {
return [
'kode' => '',
'jenis_id' => null,
'satuan_transaksi' => 'besar',
'barcode_value' => '',
];
}
if (preg_match('/^91(\d{8})([12])$/', $raw, $m)) {
$id = (int) ltrim((string) $m[1], '0');
$unitDigit = (string) $m[2];
return [
'kode' => '',
'jenis_id' => $id > 0 ? $id : null,
'satuan_transaksi' => ($unitDigit === '2') ? 'kecil' : 'besar',
'barcode_value' => $raw,
];
}
if (preg_match('/^(.*)-(B|K)$/', $raw, $m)) {
$base = $this->sanitizeKode((string) $m[1]);
$suffix = (string) $m[2];
return [
'kode' => $base,
'jenis_id' => null,
'satuan_transaksi' => ($suffix === 'K') ? 'kecil' : 'besar',
'barcode_value' => $base . '-' . $suffix,
];
}
return [
'kode' => $raw,
'jenis_id' => null,
'satuan_transaksi' => 'besar',
'barcode_value' => $raw,
];
}
public function sanitizeKode(string $kode): string
{
$kode = strtoupper(trim($kode));
$kode = preg_replace('/\s+/', '', $kode);
$kode = preg_replace('/[^A-Z0-9._-]/', '', $kode);
return substr($kode, 0, 40);
}
public function getJenisByKode(string $kode): ?SIMBHPJenis
{
$parsed = $this->parseBarcode($kode);
$jenisId = $parsed['jenis_id'] ?? null;
if (!is_null($jenisId) && (int) $jenisId > 0) {
return SIMBHPJenis::where('id', (int) $jenisId)->first();
}
$kode = $parsed['kode'] ?? '';
if ($kode === '') {
return null;
}
return SIMBHPJenis::where('kodejenis', $kode)->first();
}
public function makeBarcodeValue(int $jenisId, string $satuanTransaksi = 'besar'): string
{
if ($jenisId <= 0) {
return '';
}
$idPart = str_pad((string) $jenisId, 8, '0', STR_PAD_LEFT);
$unitDigit = ($satuanTransaksi === 'kecil') ? '2' : '1';
return '91' . $idPart . $unitDigit;
}
/**
* @return array{has_breakdown: bool, konversi: int, satuan_kecil: string}
*/
public function getUnitSetting(SIMBHPJenis $jenis): array
{
$satuanKecil = trim((string) ($jenis->satuan_kecil ?? ''));
$konversi = (int) ($jenis->konversi_kecil ?? 1);
if ($konversi <= 0) {
$konversi = 1;
}
$hasBreakdown = ($satuanKecil !== '' && $konversi > 1);
return [
'has_breakdown' => $hasBreakdown,
'konversi' => $konversi,
'satuan_kecil' => $satuanKecil,
];
}
public function calculateBaseQty(SIMBHPJenis $jenis, int $qtyInput, string $satuanTransaksi = 'besar'): int
{
$qtyInput = (int) $qtyInput;
if ($qtyInput < 0) {
$qtyInput = 0;
}
$setting = $this->getUnitSetting($jenis);
$konversi = (int) ($setting['konversi'] ?? 1);
if ($konversi <= 0) {
$konversi = 1;
}
if ($satuanTransaksi === 'kecil') {
return $qtyInput;
}
return $qtyInput * $konversi;
}
public function getStockBaseByJenis(string $jenisNama): int
{
$jenisNama = trim((string) $jenisNama);
if ($jenisNama === '') {
return 0;
}
$row = DB::table('simbhpreport')
->where('jenis', $jenisNama)
->selectRaw("SUM(CASE WHEN pemasukan IS NOT NULL AND pemasukan > 0 THEN COALESCE(qty_base, pemasukan) ELSE 0 END) AS masuk_base")
->selectRaw("SUM(CASE WHEN pengeluaran IS NOT NULL AND pengeluaran > 0 THEN COALESCE(qty_base, pengeluaran) ELSE 0 END) AS keluar_base")
->first();
$masuk = (int) ($row->masuk_base ?? 0);
$keluar = (int) ($row->keluar_base ?? 0);
return $masuk - $keluar;
}
/**
* @param array<int, string> $jenisNames
* @return array<string, int> map jenis => saldo_base
*/
public function getStockBaseByJenisMany(array $jenisNames): array
{
$jenisNames = array_values(array_filter(array_map(function ($v) {
return trim((string) $v);
}, $jenisNames)));
if (count($jenisNames) === 0) {
return [];
}
$rows = DB::table('simbhpreport')
->whereIn('jenis', $jenisNames)
->select('jenis')
->selectRaw("SUM(CASE WHEN pemasukan IS NOT NULL AND pemasukan > 0 THEN COALESCE(qty_base, pemasukan) ELSE 0 END) AS masuk_base")
->selectRaw("SUM(CASE WHEN pengeluaran IS NOT NULL AND pengeluaran > 0 THEN COALESCE(qty_base, pengeluaran) ELSE 0 END) AS keluar_base")
->groupBy('jenis')
->get();
$map = [];
foreach ($rows as $row) {
$jenis = (string) ($row->jenis ?? '');
if ($jenis === '') {
continue;
}
$map[$jenis] = ((int) ($row->masuk_base ?? 0)) - ((int) ($row->keluar_base ?? 0));
}
foreach ($jenisNames as $jenis) {
if (!array_key_exists($jenis, $map)) {
$map[$jenis] = 0;
}
}
return $map;
}
public function formatStockDisplay(int $saldoBase, string $satuanBesar, string $satuanKecil, int $konversi): string
{
$saldoBase = (int) $saldoBase;
$konversi = (int) $konversi;
if ($konversi <= 1 || trim($satuanKecil) === '') {
return number_format($saldoBase, 0, '.', ',') . ' ' . $satuanBesar;
}
$besar = intdiv($saldoBase, $konversi);
$kecil = $saldoBase % $konversi;
return number_format($besar, 0, '.', ',') . ' ' . $satuanBesar . ' + ' . number_format($kecil, 0, '.', ',') . ' ' . $satuanKecil;
}
}
View File
+10 -4
View File
@@ -8,21 +8,23 @@
"php": "^8.1",
"aamdsam/bridging-bpjs": "^1.11",
"aranyasen/hl7": "^3.1",
"arcanedev/log-viewer": "^10.1",
"elibyy/tcpdf-laravel": "^11.1",
"fawno/php-serial": "^2.0",
"guzzlehttp/guzzle": "^7.8",
"halaxa/json-machine": "^1.2",
"laravel/framework": "^10.10",
"laravel/passport": "^11.10",
"laravel/sanctum": "^3.3",
"laravel/tinker": "^2.8",
"munafio/chatify": "^1.6",
"livewire/livewire": "^3.5",
"onecentlin/laravel-adminer": "^7.0",
"opcodesio/log-viewer": "^3.21",
"phpoffice/phpspreadsheet": "^3.3",
"picqer/php-barcode-generator": "^3.2",
"pusher/pusher-php-server": "^7.2",
"setasign/fpdi": "^2.6",
"simplesoftwareio/simple-qrcode": "^4.2"
"simplesoftwareio/simple-qrcode": "^4.2",
"spatie/laravel-backup": "^9.3",
"yajra/laravel-datatables-oracle": "^10.11"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
@@ -66,7 +68,11 @@
}
},
"config": {
"platform": {
"php": "8.4"
},
"optimize-autoloader": true,
"platform-check": false,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
+1760 -1207
View File
File diff suppressed because it is too large Load diff
Binary file not shown.
+2 -2
View File
@@ -70,7 +70,7 @@ return [
|
*/
'timezone' => 'UTC',
'timezone' => 'Asia/Jakarta',
/*
|--------------------------------------------------------------------------
@@ -182,7 +182,7 @@ return [
*/
'aliases' => Facade::defaultAliases()->merge([
// 'Example' => App\Facades\Example::class,
'PDFCREATOR' => Elibyy\TCPDF\Facades\TCPDF::class,
])->toArray(),
];
+341
View File
@@ -0,0 +1,341 @@
<?php
return [
'backup' => [
/*
* The name of this application. You can use this name to monitor
* the backups.
*/
'name' => env('APP_NAME', 'laravel-backup'),
'source' => [
'files' => [
/*
* The list of directories and files that will be included in the backup.
*/
'include' => [
base_path(),
],
/*
* These directories and files will be excluded from the backup.
*
* Directories used by the backup process will automatically be excluded.
*/
'exclude' => [
base_path('vendor'),
base_path('node_modules'),
],
/*
* Determines if symlinks should be followed.
*/
'follow_links' => false,
/*
* Determines if it should avoid unreadable folders.
*/
'ignore_unreadable_directories' => false,
/*
* This path is used to make directories in resulting zip-file relative
* Set to `null` to include complete absolute path
* Example: base_path()
*/
'relative_path' => null,
],
/*
* The names of the connections to the databases that should be backed up
* MySQL, PostgreSQL, SQLite and Mongo databases are supported.
*
* The content of the database dump may be customized for each connection
* by adding a 'dump' key to the connection settings in config/database.php.
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'excludeTables' => [
* 'table_to_exclude_from_backup',
* 'another_table_to_exclude'
* ]
* ],
* ],
*
* If you are using only InnoDB tables on a MySQL server, you can
* also supply the useSingleTransaction option to avoid table locking.
*
* E.g.
* 'mysql' => [
* ...
* 'dump' => [
* 'useSingleTransaction' => true,
* ],
* ],
*
* For a complete list of available customization options, see https://github.com/spatie/db-dumper
*/
'databases' => [
env('DB_CONNECTION', 'mysql'),
],
],
/*
* The database dump can be compressed to decrease disk space usage.
*
* Out of the box Laravel-backup supplies
* Spatie\DbDumper\Compressors\GzipCompressor::class.
*
* You can also create custom compressor. More info on that here:
* https://github.com/spatie/db-dumper#using-compression
*
* If you do not want any compressor at all, set it to null.
*/
'database_dump_compressor' => null,
/*
* If specified, the database dumped file name will contain a timestamp (e.g.: 'Y-m-d-H-i-s').
*/
'database_dump_file_timestamp_format' => null,
/*
* The base of the dump filename, either 'database' or 'connection'
*
* If 'database' (default), the dumped filename will contain the database name.
* If 'connection', the dumped filename will contain the connection name.
*/
'database_dump_filename_base' => 'database',
/*
* The file extension used for the database dump files.
*
* If not specified, the file extension will be .archive for MongoDB and .sql for all other databases
* The file extension should be specified without a leading .
*/
'database_dump_file_extension' => '',
'destination' => [
/*
* The compression algorithm to be used for creating the zip archive.
*
* If backing up only database, you may choose gzip compression for db dump and no compression at zip.
*
* Some common algorithms are listed below:
* ZipArchive::CM_STORE (no compression at all; set 0 as compression level)
* ZipArchive::CM_DEFAULT
* ZipArchive::CM_DEFLATE
* ZipArchive::CM_BZIP2
* ZipArchive::CM_XZ
*
* For more check https://www.php.net/manual/zip.constants.php and confirm it's supported by your system.
*/
'compression_method' => ZipArchive::CM_DEFAULT,
/*
* The compression level corresponding to the used algorithm; an integer between 0 and 9.
*
* Check supported levels for the chosen algorithm, usually 1 means the fastest and weakest compression,
* while 9 the slowest and strongest one.
*
* Setting of 0 for some algorithms may switch to the strongest compression.
*/
'compression_level' => 9,
/*
* The filename prefix used for the backup zip file.
*/
'filename_prefix' => '',
/*
* The disk names on which the backups will be stored.
*/
'disks' => [
'local',
],
],
/*
* The directory where the temporary files will be stored.
*/
'temporary_directory' => storage_path('app/backup-temp'),
/*
* The password to be used for archive encryption.
* Set to `null` to disable encryption.
*/
'password' => env('BACKUP_ARCHIVE_PASSWORD'),
/*
* The encryption algorithm to be used for archive encryption.
* You can set it to `null` or `false` to disable encryption.
*
* When set to 'default', we'll use ZipArchive::EM_AES_256 if it is
* available on your system.
*/
'encryption' => 'default',
/*
* The number of attempts, in case the backup command encounters an exception
*/
'tries' => 1,
/*
* The number of seconds to wait before attempting a new backup if the previous try failed
* Set to `0` for none
*/
'retry_delay' => 0,
],
/*
* You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'.
* For Slack you need to install laravel/slack-notification-channel.
*
* You can also use your own notification classes, just make sure the class is named after one of
* the `Spatie\Backup\Notifications\Notifications` classes.
*/
'notifications' => [
'notifications' => [
\Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['mail'],
\Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['mail'],
],
/*
* Here you can specify the notifiable to which the notifications should be sent. The default
* notifiable will use the variables specified in this config file.
*/
'notifiable' => \Spatie\Backup\Notifications\Notifiable::class,
'mail' => [
'to' => '[email protected]',
'from' => [
'address' => env('MAIL_FROM_ADDRESS', '[email protected]'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
],
'slack' => [
'webhook_url' => '',
/*
* If this is set to null the default channel of the webhook will be used.
*/
'channel' => null,
'username' => null,
'icon' => null,
],
'discord' => [
'webhook_url' => '',
/*
* If this is an empty string, the name field on the webhook will be used.
*/
'username' => '',
/*
* If this is an empty string, the avatar on the webhook will be used.
*/
'avatar_url' => '',
],
],
/*
* Here you can specify which backups should be monitored.
* If a backup does not meet the specified requirements the
* UnHealthyBackupWasFound event will be fired.
*/
'monitor_backups' => [
[
'name' => env('APP_NAME', 'laravel-backup'),
'disks' => ['local'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
/*
[
'name' => 'name of the second app',
'disks' => ['local', 's3'],
'health_checks' => [
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
\Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
],
],
*/
],
'cleanup' => [
/*
* The strategy that will be used to cleanup old backups. The default strategy
* will keep all backups for a certain amount of days. After that period only
* a daily backup will be kept. After that period only weekly backups will
* be kept and so on.
*
* No matter how you configure it the default strategy will never
* delete the newest backup.
*/
'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
'default_strategy' => [
/*
* The number of days for which backups must be kept.
*/
'keep_all_backups_for_days' => 7,
/*
* After the "keep_all_backups_for_days" period is over, the most recent backup
* of that day will be kept. Older backups within the same day will be removed.
* If you create backups only once a day, no backups will be removed yet.
*/
'keep_daily_backups_for_days' => 16,
/*
* After the "keep_daily_backups_for_days" period is over, the most recent backup
* of that week will be kept. Older backups within the same week will be removed.
* If you create backups only once a week, no backups will be removed yet.
*/
'keep_weekly_backups_for_weeks' => 8,
/*
* After the "keep_weekly_backups_for_weeks" period is over, the most recent backup
* of that month will be kept. Older backups within the same month will be removed.
*/
'keep_monthly_backups_for_months' => 4,
/*
* After the "keep_monthly_backups_for_months" period is over, the most recent backup
* of that year will be kept. Older backups within the same year will be removed.
*/
'keep_yearly_backups_for_years' => 2,
/*
* After cleaning up the backups remove the oldest backup until
* this amount of megabytes has been reached.
* Set null for unlimited size.
*/
'delete_oldest_backups_when_using_more_megabytes_than' => 5000,
],
/*
* The number of attempts, in case the cleanup command encounters an exception
*/
'tries' => 1,
/*
* The number of seconds to wait before attempting a new cleanup if the previous try failed
* Set to `0` for none
*/
'retry_delay' => 0,
],
];
+16
View File
@@ -0,0 +1,16 @@
<?php
return [
'api_url' => env('CLOUD_BACKUP_API_URL', 'https://duidev.com'),
'api_token' => env('CLOUD_BACKUP_API_TOKEN'),
'backup_name' => env('CLOUD_BACKUP_NAME', 'lismikro'),
'chunk_size' => (int) env('CLOUD_BACKUP_CHUNK_SIZE', 5 * 1024 * 1024),
'download_path' => env('CLOUD_BACKUP_DOWNLOAD_PATH', storage_path('app/cloud-backups/lismikro_latest.backup')),
'pg_restore' => env('CLOUD_BACKUP_PG_RESTORE', 'pg_restore'),
'db_host' => env('CLOUD_BACKUP_DB_HOST', '10.10.123.193'),
'db_port' => env('CLOUD_BACKUP_DB_PORT', '5002'),
'db_database' => env('CLOUD_BACKUP_DB_DATABASE', 'lismikro'),
'db_username' => env('CLOUD_BACKUP_DB_USERNAME', 'lismikro'),
'db_password' => env('CLOUD_BACKUP_DB_PASSWORD'),
];
-3
View File
@@ -58,9 +58,6 @@ return [
'prefix_indexes'=> true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
+4 -4
View File
@@ -1,14 +1,14 @@
<?php
return [
'Title' => 'LIS',
'namaapps' => 'Laboratory Information System',
'Title' => 'MyLIS-RSSA',
'namaapps' => 'Mikrobiologi Information System',
'domainapps' => 'RSUD Dr. Saiful Anwar',
'subdomainapps' => 'Kota Malang',
'subsubdomainapps' => 'Jawa Timur',
'addressapps' => 'Jl. Lamandau 18A Bunulrejo Blimbing Malang',
'kota' => 'Lumajang',
'kota' => 'Malang',
'emailapps' => '[email protected]',
'lamanapps' => 'https://lis.swandhana.test',
'lamanapps' => 'https://mylis.rssa.id',
'logofrontapps' => 'header.png',
];
?>
+309 -123
View File
@@ -1,146 +1,332 @@
<?php
use Arcanedev\LogViewer\Contracts\Utilities\Filesystem;
use Opcodes\LogViewer\Enums\SortingMethod;
use Opcodes\LogViewer\Enums\SortingOrder;
use Opcodes\LogViewer\Enums\Theme;
return [
/* -----------------------------------------------------------------
| Log files storage path
| -----------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| Log Viewer
|--------------------------------------------------------------------------
| Log Viewer can be disabled, so it's no longer accessible via browser.
|
*/
'storage-path' => storage_path('logs'),
'enabled' => env('LOG_VIEWER_ENABLED', true),
/* -----------------------------------------------------------------
| Log files pattern
| -----------------------------------------------------------------
*/
'api_only' => env('LOG_VIEWER_API_ONLY', false),
'pattern' => [
'prefix' => Filesystem::PATTERN_PREFIX, // 'laravel-'
'date' => Filesystem::PATTERN_DATE, // '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
'extension' => Filesystem::PATTERN_EXTENSION, // '.log'
'require_auth_in_production' => false,
/*
|--------------------------------------------------------------------------
| Log Viewer Domain
|--------------------------------------------------------------------------
| You may change the domain where Log Viewer should be active.
| If the domain is empty, all domains will be valid.
|
*/
'route_domain' => null,
/*
|--------------------------------------------------------------------------
| Log Viewer Route
|--------------------------------------------------------------------------
| Log Viewer will be available under this URL.
|
*/
'route_path' => 'log-viewer',
/*
|--------------------------------------------------------------------------
| Log Viewer Assets Path
|--------------------------------------------------------------------------
| The path to the Log Viewer assets.
|
*/
'assets_path' => 'vendor/log-viewer',
/*
|--------------------------------------------------------------------------
| Back to system URL
|--------------------------------------------------------------------------
| When set, displays a link to easily get back to this URL.
| Set to `null` to hide this link.
|
| Optional label to display for the above URL.
|
*/
'back_to_system_url' => config('app.url', null),
'back_to_system_label' => null, // Displayed by default: "Back to {{ app.name }}"
/*
|--------------------------------------------------------------------------
| Log Viewer time zone.
|--------------------------------------------------------------------------
| The time zone in which to display the times in the UI. Defaults to
| the application's timezone defined in config/app.php.
|
*/
'timezone' => null,
/*
|--------------------------------------------------------------------------
| Log Viewer datetime format.
|--------------------------------------------------------------------------
| The format used to display timestamps in the UI.
|
*/
'datetime_format' => 'Y-m-d H:i:s',
/*
|--------------------------------------------------------------------------
| Log Viewer route middleware.
|--------------------------------------------------------------------------
| Optional middleware to use when loading the initial Log Viewer page.
|
*/
'middleware' => [
'web',
\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
],
/* -----------------------------------------------------------------
| Locale
| -----------------------------------------------------------------
| Supported locales :
| 'auto', 'ar', 'bg', 'de', 'en', 'es', 'et', 'fa', 'fr', 'hu', 'hy', 'id', 'it', 'ja', 'ko', 'nl',
| 'pl', 'pt-BR', 'ro', 'ru', 'sv', 'th', 'tr', 'zh-TW', 'zh'
*/
/*
|--------------------------------------------------------------------------
| Log Viewer API middleware.
|--------------------------------------------------------------------------
| Optional middleware to use on every API request. The same API is also
| used from within the Log Viewer user interface.
|
*/
'locale' => 'auto',
'api_middleware' => [
\Opcodes\LogViewer\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
],
/* -----------------------------------------------------------------
| Theme
| -----------------------------------------------------------------
| Supported themes :
| 'bootstrap-5'
| 'bootstrap-4'
| 'bootstrap-3'
|
| You can make your own theme by adding a folder to the views directory and specifying it here.
*/
'api_stateful_domains' => env('LOG_VIEWER_API_STATEFUL_DOMAINS') ? explode(',', env('LOG_VIEWER_API_STATEFUL_DOMAINS')) : null,
'theme' => 'bootstrap-5',
/*
|--------------------------------------------------------------------------
| Log Viewer Remote hosts.
|--------------------------------------------------------------------------
| Log Viewer supports viewing Laravel logs from remote hosts. They must
| be running Log Viewer as well. Below you can define the hosts you
| would like to show in this Log Viewer instance.
|
*/
/* -----------------------------------------------------------------
| Route settings
| -----------------------------------------------------------------
*/
'route' => [
'enabled' => true,
'attributes' => [
'prefix' => 'log-viewer',
'middleware' => env('ARCANEDEV_LOGVIEWER_MIDDLEWARE') ? explode(',', env('ARCANEDEV_LOGVIEWER_MIDDLEWARE')) : null,
'hosts' => [
'local' => [
'name' => ucfirst(env('APP_ENV', 'local')),
],
'show' => 'log-viewer::logs.show'
],
/* -----------------------------------------------------------------
| Log entries per page
| -----------------------------------------------------------------
| This defines how many logs & entries are displayed per page.
*/
'per-page' => 30,
/* -----------------------------------------------------------------
| Download settings
| -----------------------------------------------------------------
*/
'download' => [
'prefix' => 'laravel-',
'extension' => 'log',
],
/* -----------------------------------------------------------------
| Menu settings
| -----------------------------------------------------------------
*/
'menu' => [
'filter-route' => 'log-viewer::logs.filter',
'icons-enabled' => true,
],
/* -----------------------------------------------------------------
| Icons
| -----------------------------------------------------------------
*/
'icons' => [
/**
* Font awesome >= 4.3
* http://fontawesome.io/icons/
*/
'all' => 'fa fa-fw fa-list', // http://fontawesome.io/icon/list/
'emergency' => 'fa fa-fw fa-bug', // http://fontawesome.io/icon/bug/
'alert' => 'fa fa-fw fa-bullhorn', // http://fontawesome.io/icon/bullhorn/
'critical' => 'fa fa-fw fa-heartbeat', // http://fontawesome.io/icon/heartbeat/
'error' => 'fa fa-fw fa-times-circle', // http://fontawesome.io/icon/times-circle/
'warning' => 'fa fa-fw fa-exclamation-triangle', // http://fontawesome.io/icon/exclamation-triangle/
'notice' => 'fa fa-fw fa-exclamation-circle', // http://fontawesome.io/icon/exclamation-circle/
'info' => 'fa fa-fw fa-info-circle', // http://fontawesome.io/icon/info-circle/
'debug' => 'fa fa-fw fa-life-ring', // http://fontawesome.io/icon/life-ring/
],
/* -----------------------------------------------------------------
| Colors
| -----------------------------------------------------------------
*/
'colors' => [
'levels' => [
'empty' => '#D1D1D1',
'all' => '#8A8A8A',
'emergency' => '#B71C1C',
'alert' => '#D32F2F',
'critical' => '#F44336',
'error' => '#FF5722',
'warning' => '#FF9100',
'notice' => '#4CAF50',
'info' => '#1976D2',
'debug' => '#90CAF9',
// 'staging' => [
// 'name' => 'Staging',
// 'host' => 'https://staging.example.com/log-viewer',
// 'auth' => [ // Example of HTTP Basic auth
// 'username' => 'username',
// 'password' => 'password',
// ],
// 'verify_server_certificate' => true,
// ],
//
'production' => [
'name' => 'Production',
'host' => 'https://example.com/log-viewer',
'auth' => [
'token' => env('LOG_VIEWER_PRODUCTION_TOKEN'),
],
'headers' => [
'X-Foo' => 'Bar',
],
'verify_server_certificate' => true,
],
],
/* -----------------------------------------------------------------
| Strings to highlight in stack trace
| -----------------------------------------------------------------
*/
/*
|--------------------------------------------------------------------------
| Include file patterns
|--------------------------------------------------------------------------
|
*/
'highlight' => [
'^#\d+',
'^Stack trace:',
'include_files' => [
'*.log',
'**/*.log',
// You can include paths to other log types as well, such as apache, nginx, and more.
// This key => value pair can be used to rename and group multiple paths into one folder in the UI.
'/var/log/httpd/*' => 'Apache',
'/var/log/nginx/*' => 'Nginx',
// MacOS Apple Silicon logs
'/opt/homebrew/var/log/nginx/*',
'/opt/homebrew/var/log/httpd/*',
'/opt/homebrew/var/log/php-fpm.log',
'/opt/homebrew/var/log/postgres*log',
'/opt/homebrew/var/log/redis*log',
'/opt/homebrew/var/log/supervisor*log',
// '/absolute/paths/supported',
],
/*
|--------------------------------------------------------------------------
| Exclude file patterns.
|--------------------------------------------------------------------------
| This will take precedence over included files.
|
*/
'exclude_files' => [
// 'my_secret.log'
],
/*
|--------------------------------------------------------------------------
| Hide unknown files.
|--------------------------------------------------------------------------
| The include/exclude options above might catch files which are not
| logs supported by Log Viewer. In that case, you can hide them
| from the UI and API calls by setting this to true.
|
*/
'hide_unknown_files' => true,
/*
|--------------------------------------------------------------------------
| Shorter stack trace filters.
|--------------------------------------------------------------------------
| Lines containing any of these strings will be excluded from the full log.
| This setting is only active when the function is enabled via the user interface.
|
*/
'shorter_stack_trace_excludes' => [
'/vendor/symfony/',
'/vendor/laravel/framework/',
'/vendor/barryvdh/laravel-debugbar/',
],
/*
|--------------------------------------------------------------------------
| Cache driver
|--------------------------------------------------------------------------
| Cache driver to use for storing the log indices. Indices are used to speed up
| log navigation. Defaults to your application's default cache driver.
|
*/
'cache_driver' => env('LOG_VIEWER_CACHE_DRIVER', null),
/*
|--------------------------------------------------------------------------
| Cache key prefix
|--------------------------------------------------------------------------
| Log Viewer prefixes all the cache keys created with this value. If for
| some reason you would like to change this prefix, you can do so here.
| The format of Log Viewer cache keys is:
| {prefix}:{version}:{rest-of-the-key}
|
*/
'cache_key_prefix' => 'lv',
/*
|--------------------------------------------------------------------------
| Chunk size when scanning log files lazily
|--------------------------------------------------------------------------
| The size in MB of files to scan before updating the progress bar when searching across all files.
|
*/
'lazy_scan_chunk_size_in_mb' => 50,
'strip_extracted_context' => true,
/*
|--------------------------------------------------------------------------
| Per page options
|--------------------------------------------------------------------------
| Define the available options for number of results per page
|
*/
'per_page_options' => [10, 25, 50, 100, 250, 500],
/*
|--------------------------------------------------------------------------
| Default settings for Log Viewer
|--------------------------------------------------------------------------
| These settings determine the default behaviour of Log Viewer. Many of
| these can be persisted for the user in their browser's localStorage,
| if the `use_local_storage` option is set to true.
|
*/
'defaults' => [
// Whether to use browser's localStorage to store user preferences.
// If true, user preferences saved in the browser will take precedence over the defaults below.
'use_local_storage' => true,
// Method to sort the folders. Other options: `Alphabetical`, `ModifiedTime`
'folder_sorting_method' => SortingMethod::ModifiedTime,
// Order to sort the folders. Other options: `Ascending`, `Descending`
'folder_sorting_order' => SortingOrder::Descending,
// Method for sorting log-files into directories. Other options: `Alphabetical`, `ModifiedTime`
'file_sorting_method' => SortingMethod::ModifiedTime,
// Order to sort the logs. Other options: `Ascending`, `Descending`
'log_sorting_order' => SortingOrder::Descending,
// Number of results per page. Must be one of the above `per_page_options` values
'per_page' => 25,
// Color scheme for the Log Viewer. Other options: `System`, `Light`, `Dark`
'theme' => Theme::System,
// Whether to enable `Shorter Stack Traces` option by default
'shorter_stack_traces' => false,
],
/*
|--------------------------------------------------------------------------
| Exclude IP from identifiers
|--------------------------------------------------------------------------
| By default, file and folder identifiers include the server's IP address
| to ensure uniqueness. In load-balanced environments with shared storage,
| this can cause "No results" errors. Set to true to exclude IP addresses
| from identifier generation for consistent results across servers.
|
*/
'exclude_ip_from_identifiers' => env('LOG_VIEWER_EXCLUDE_IP_FROM_IDENTIFIERS', false),
/*
|--------------------------------------------------------------------------
| Root folder prefix
|--------------------------------------------------------------------------
| The prefix for log files inside Laravel's `storage/logs` folder.
| Log Viewer does not show the full path to these files in the UI,
| but only the filename prefixed with this value.
|
*/
'root_folder_prefix' => 'root',
];
@@ -18,7 +18,7 @@ return new class extends Migration
$table->string('jk', 1)->nullable();
$table->date('tgl_lahir')->nullable();
$table->string('kota', 50)->nullable();
$table->string('alamat', 100)->nullable();
$table->text('alamat')->nullable();
$table->string('telpon', 50)->nullable();
$table->string('nik', 50)->nullable();
$table->string('bpjs', 50)->nullable();
@@ -15,6 +15,7 @@ return new class extends Migration
$table->id();
$table->timestamp('mulai')->nullable();
$table->timestamp('akhir')->nullable();
$table->string('orderid', 255)->nullable();
$table->string('nofoto', 50)->nullable();
$table->integer('noloket')->nullable();
$table->string('noregister', 150)->nullable();
@@ -25,7 +26,7 @@ return new class extends Migration
$table->string('jkpasien', 5)->nullable();
$table->date('tgllahirpasien')->nullable();
$table->string('tlppasien', 50)->nullable();
$table->string('alamatpasien', 50)->nullable();
$table->text('alamatpasien')->nullable();
$table->string('reques', 150)->nullable();
$table->string('usia', 25)->nullable();
$table->string('ktp', 25)->nullable();
@@ -50,7 +51,7 @@ return new class extends Migration
$table->string('nmanalis', 250)->nullable();
$table->string('nmexcutor', 250)->nullable();
$table->string('klinisi', 250)->nullable();
$table->string('klinis', 250)->nullable();
$table->text('klinis')->nullable();
$table->integer('poli_id')->nullable();
$table->text('keterangan')->nullable();
$table->text('kesimpulan')->nullable();
@@ -17,6 +17,7 @@ return new class extends Migration
$table->string('subpoli', 250)->nullable();
$table->string('subsubpoli', 250)->nullable();
$table->string('modaliti', 150)->nullable();
$table->string('kelompok', 150)->nullable();
$table->string('modaliti2', 150)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
@@ -18,6 +18,8 @@ class CreateOrganismsTable extends Migration
$table->string('name');
$table->string('category');
$table->string('kelompok');
$table->string('satuan')->nullable();
$table->string('nilai')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
@@ -18,13 +18,15 @@ return new class extends Migration
$table->string('antibiotik', 150)->nullable();
$table->string('subantibiotik', 150)->nullable();
$table->string('diskcontent', 100)->nullable();
$table->integer('batasatas')->nullable();
$table->string('batasatas', 150)->nullable();
$table->string('midrange', 150)->nullable();
$table->integer('batasbawah')->nullable();
$table->string('batasbawah', 150)->nullable();
$table->string('sumber', 255)->nullable();
$table->string('kodedok', 50)->nullable();
$table->string('atu', 50)->nullable();
$table->string('kelompok', 50)->nullable();
$table->integer('cek')->nullable();
$table->string('setmanual', 255)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
@@ -13,12 +13,18 @@ return new class extends Migration
{
Schema::create('rekapantibiotik', function (Blueprint $table) {
$table->id();
$table->string('kuman', 255)->nullable();
$table->string('antibiotic', 150)->nullable();
$table->string('resistance', 150)->nullable();
$table->string('value', 150)->nullable();
$table->string('interpretation', 150)->nullable();
$table->string('glassreportname', 150)->nullable();
$table->integer('orderid')->nullable();
$table->boolean('printrow')->nullable();
$table->boolean('printcol')->nullable();
$table->string('batasatas', 150)->nullable();
$table->string('midrange', 150)->nullable();
$table->string('batasbawah', 150)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('db_komponenjawaban', function (Blueprint $table) {
$table->id();
$table->string('accnumber', 100)->nullable();
$table->string('template', 100)->nullable();
$table->string('komponen', 255)->nullable();
$table->text('isidata')->nullable();
$table->string('nobiorepository', 100)->nullable();
$table->string('strain', 255)->nullable();
$table->string('atcc', 255)->nullable();
$table->string('sample', 255)->nullable();
$table->date('tglpenyimpanan', 100)->nullable();
$table->string('created_by', 255)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('db_komponenjawaban');
}
};
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pertumkolomni', function (Blueprint $table) {
$table->id();
$table->integer('orderid')->nullable();
$table->date('tglpenyimpanan', 100)->nullable();
$table->string('media', 100)->nullable();
$table->string('kuman', 100)->nullable();
$table->string('hemolisa', 255)->nullable();
$table->string('katalase', 255)->nullable();
$table->string('koagulase', 255)->nullable();
$table->string('oksidase', 255)->nullable();
$table->string('lainnya', 255)->nullable();
$table->string('status', 255)->nullable();
$table->string('tindaklanjut', 255)->nullable();
$table->string('created_by', 255)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pertumkolomni');
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('bio_cabinets', function (Blueprint $table) {
$table->id();
$table->string('code', 50)->unique();
$table->string('name', 150);
$table->string('location', 200)->nullable();
$table->text('notes')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
public function down(): void
{
Schema::dropIfExists('bio_cabinets');
}
};
@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('bio_racks', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('cabinet_id')->index();
$table->string('code', 50);
$table->string('name', 150);
$table->integer('level')->default(1);
$table->integer('capacity')->default(0);
$table->text('notes')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
$table->unique(['cabinet_id', 'code']);
});
}
public function down(): void
{
Schema::dropIfExists('bio_racks');
}
};
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('bio_specimens', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('cabinet_id')->index();
$table->unsignedBigInteger('rack_id')->index();
$table->string('specimen_code', 100)->unique();
$table->string('specimen_name', 200);
$table->string('patient_name', 200)->nullable();
$table->date('collected_at')->nullable();
$table->date('stored_at');
$table->string('volume', 50)->nullable();
$table->string('storage_condition', 100)->nullable();
$table->text('notes')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
public function down(): void
{
Schema::dropIfExists('bio_specimens');
}
};
@@ -0,0 +1,98 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('bio_racks', function (Blueprint $table) {
if (!Schema::hasColumn('bio_racks', 'rack_number')) {
$table->integer('rack_number')->nullable()->after('level');
}
if (!Schema::hasColumn('bio_racks', 'box_number')) {
$table->integer('box_number')->nullable()->after('rack_number');
}
});
Schema::table('bio_specimens', function (Blueprint $table) {
if (!Schema::hasColumn('bio_specimens', 'category_storage')) {
$table->string('category_storage', 1)->nullable()->after('specimen_name');
}
if (!Schema::hasColumn('bio_specimens', 'shelf_number')) {
$table->integer('shelf_number')->nullable()->after('category_storage');
}
if (!Schema::hasColumn('bio_specimens', 'rack_number')) {
$table->integer('rack_number')->nullable()->after('shelf_number');
}
if (!Schema::hasColumn('bio_specimens', 'slot_number')) {
$table->integer('slot_number')->nullable()->after('rack_number');
}
if (!Schema::hasColumn('bio_specimens', 'box_number')) {
$table->integer('box_number')->nullable()->after('slot_number');
}
if (!Schema::hasColumn('bio_specimens', 'tube_number')) {
$table->integer('tube_number')->nullable()->after('box_number');
}
if (!Schema::hasColumn('bio_specimens', 'bacteria_name')) {
$table->string('bacteria_name', 200)->nullable()->after('tube_number');
}
if (!Schema::hasColumn('bio_specimens', 'strain')) {
$table->string('strain', 50)->nullable()->after('bacteria_name');
}
if (!Schema::hasColumn('bio_specimens', 'atcc')) {
$table->string('atcc', 150)->nullable()->after('strain');
}
if (!Schema::hasColumn('bio_specimens', 'input_by')) {
$table->string('input_by', 150)->nullable()->after('atcc');
}
});
}
public function down(): void
{
Schema::table('bio_racks', function (Blueprint $table) {
if (Schema::hasColumn('bio_racks', 'rack_number')) {
$table->dropColumn('rack_number');
}
if (Schema::hasColumn('bio_racks', 'box_number')) {
$table->dropColumn('box_number');
}
});
Schema::table('bio_specimens', function (Blueprint $table) {
if (Schema::hasColumn('bio_specimens', 'category_storage')) {
$table->dropColumn('category_storage');
}
if (Schema::hasColumn('bio_specimens', 'shelf_number')) {
$table->dropColumn('shelf_number');
}
if (Schema::hasColumn('bio_specimens', 'rack_number')) {
$table->dropColumn('rack_number');
}
if (Schema::hasColumn('bio_specimens', 'slot_number')) {
$table->dropColumn('slot_number');
}
if (Schema::hasColumn('bio_specimens', 'box_number')) {
$table->dropColumn('box_number');
}
if (Schema::hasColumn('bio_specimens', 'tube_number')) {
$table->dropColumn('tube_number');
}
if (Schema::hasColumn('bio_specimens', 'bacteria_name')) {
$table->dropColumn('bacteria_name');
}
if (Schema::hasColumn('bio_specimens', 'strain')) {
$table->dropColumn('strain');
}
if (Schema::hasColumn('bio_specimens', 'atcc')) {
$table->dropColumn('atcc');
}
if (Schema::hasColumn('bio_specimens', 'input_by')) {
$table->dropColumn('input_by');
}
});
}
};
@@ -0,0 +1,56 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('simbhpjenis', function (Blueprint $table) {
if (!Schema::hasColumn('simbhpjenis', 'satuan_kecil')) {
$table->string('satuan_kecil', 100)->nullable()->after('satuan');
}
if (!Schema::hasColumn('simbhpjenis', 'konversi_kecil')) {
$table->integer('konversi_kecil')->default(1)->after('satuan_kecil');
}
if (!Schema::hasColumn('simbhpjenis', 'stok_minimum')) {
$table->integer('stok_minimum')->default(0)->after('konversi_kecil');
}
});
Schema::table('simbhpreport', function (Blueprint $table) {
if (!Schema::hasColumn('simbhpreport', 'qty_base')) {
$table->integer('qty_base')->nullable()->after('pengeluaran');
}
if (!Schema::hasColumn('simbhpreport', 'satuan_transaksi')) {
$table->string('satuan_transaksi', 20)->nullable()->after('qty_base');
}
});
}
public function down(): void
{
Schema::table('simbhpreport', function (Blueprint $table) {
if (Schema::hasColumn('simbhpreport', 'qty_base')) {
$table->dropColumn('qty_base');
}
if (Schema::hasColumn('simbhpreport', 'satuan_transaksi')) {
$table->dropColumn('satuan_transaksi');
}
});
Schema::table('simbhpjenis', function (Blueprint $table) {
if (Schema::hasColumn('simbhpjenis', 'satuan_kecil')) {
$table->dropColumn('satuan_kecil');
}
if (Schema::hasColumn('simbhpjenis', 'konversi_kecil')) {
$table->dropColumn('konversi_kecil');
}
if (Schema::hasColumn('simbhpjenis', 'stok_minimum')) {
$table->dropColumn('stok_minimum');
}
});
}
};
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('simbhpreport', function (Blueprint $table) {
if (!Schema::hasColumn('simbhpreport', 'masa_expired')) {
$table->date('masa_expired')->nullable()->after('satuan_transaksi');
}
});
}
public function down(): void
{
Schema::table('simbhpreport', function (Blueprint $table) {
if (Schema::hasColumn('simbhpreport', 'masa_expired')) {
$table->dropColumn('masa_expired');
}
});
}
};
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('rekap_penerimaan_sample_print_histories', function (Blueprint $table) {
$table->id();
$table->date('tanggal')->nullable();
$table->integer('printed_by_id')->nullable();
$table->string('printed_by_name', 250)->nullable();
$table->timestamp('printed_at')->nullable();
$table->text('row_ids')->nullable();
$table->longText('rows_payload')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('rekap_penerimaan_sample_print_histories');
}
};
@@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('critical_value_samples', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('periksa_id')->unique();
$table->string('nofoto', 50)->nullable();
$table->string('noregister', 150)->nullable();
$table->string('nmpasien', 200)->nullable();
$table->string('nm_spesimen', 255)->nullable();
$table->timestamp('critical_set_at')->nullable();
$table->unsignedBigInteger('critical_set_by_user_id')->nullable();
$table->string('critical_set_by_name', 150)->nullable();
$table->timestamp('followed_up_at')->nullable();
$table->unsignedBigInteger('followed_up_by_user_id')->nullable();
$table->string('followed_up_by_name', 150)->nullable();
$table->timestamps();
$table->index('nofoto');
$table->index('critical_set_at');
$table->index('followed_up_at');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('critical_value_samples');
}
};
@@ -0,0 +1,41 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('critical_value_samples', function (Blueprint $table) {
// Snapshot from periksa for easier listing.
$table->string('asalpasien', 250)->nullable()->after('noregister');
// Follow-up details recorded when marking as read.
$table->string('follow_up_status', 25)->nullable()->after('followed_up_by_name'); // reported|not_reported
$table->string('follow_up_method', 50)->nullable()->after('follow_up_status');
$table->string('follow_up_recipient', 250)->nullable()->after('follow_up_method');
$table->string('follow_up_reason', 250)->nullable()->after('follow_up_recipient');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('critical_value_samples', function (Blueprint $table) {
$table->dropColumn([
'asalpasien',
'follow_up_status',
'follow_up_method',
'follow_up_recipient',
'follow_up_reason',
]);
});
}
};
@@ -0,0 +1,78 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('simbhpjenis', function (Blueprint $table) {
if (!Schema::hasColumn('simbhpjenis', 'barcode_besar')) {
$table->string('barcode_besar', 20)->nullable()->after('kodejenis');
}
if (!Schema::hasColumn('simbhpjenis', 'barcode_kecil')) {
$table->string('barcode_kecil', 20)->nullable()->after('barcode_besar');
}
});
if (!Schema::hasColumn('simbhpjenis', 'barcode_besar')) {
return;
}
DB::table('simbhpjenis')
->orderBy('id', 'ASC')
->chunkById(200, function ($rows) {
foreach ($rows as $row) {
$id = (int) ($row->id ?? 0);
if ($id <= 0) {
continue;
}
$idPart = str_pad((string) $id, 8, '0', STR_PAD_LEFT);
$barcodeBesar = '91' . $idPart . '1';
$existingBesar = isset($row->barcode_besar) ? trim((string) $row->barcode_besar) : '';
$existingKecil = isset($row->barcode_kecil) ? trim((string) $row->barcode_kecil) : '';
$satuanKecil = isset($row->satuan_kecil) ? trim((string) $row->satuan_kecil) : '';
$konversi = (int) ($row->konversi_kecil ?? 1);
if ($konversi <= 0) {
$konversi = 1;
}
$hasBreakdown = ($satuanKecil !== '' && $konversi > 1);
$update = [];
if ($existingBesar === '') {
$update['barcode_besar'] = $barcodeBesar;
}
if ($hasBreakdown) {
$barcodeKecil = '91' . $idPart . '2';
if ($existingKecil === '') {
$update['barcode_kecil'] = $barcodeKecil;
}
}
if (count($update) > 0) {
DB::table('simbhpjenis')->where('id', $id)->update($update);
}
}
}, 'id');
}
public function down(): void
{
Schema::table('simbhpjenis', function (Blueprint $table) {
if (Schema::hasColumn('simbhpjenis', 'barcode_kecil')) {
$table->dropColumn('barcode_kecil');
}
if (Schema::hasColumn('simbhpjenis', 'barcode_besar')) {
$table->dropColumn('barcode_besar');
}
});
}
};
@@ -0,0 +1,48 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (!Schema::hasColumn('periksa', 'tanggalregis')) {
$table->date('tanggalregis')->nullable()->after('tgladendum');
}
if (!Schema::hasColumn('periksa', 'tanggalsampel')) {
$table->date('tanggalsampel')->nullable()->after('tanggalregis');
}
if (!Schema::hasColumn('periksa', 'pengambilan')) {
$table->string('pengambilan', 255)->nullable()->after('diagnosa2');
}
});
Schema::table('pertumkolomni', function (Blueprint $table) {
if (!Schema::hasColumn('pertumkolomni', 'keterangan')) {
$table->text('keterangan')->nullable()->after('tindaklanjut');
}
});
}
public function down(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (Schema::hasColumn('periksa', 'tanggalregis')) {
$table->dropColumn('tanggalregis');
}
if (Schema::hasColumn('periksa', 'tanggalsampel')) {
$table->dropColumn('tanggalsampel');
}
if (Schema::hasColumn('periksa', 'pengambilan')) {
$table->dropColumn('pengambilan');
}
});
Schema::table('pertumkolomni', function (Blueprint $table) {
if (Schema::hasColumn('pertumkolomni', 'keterangan')) {
$table->dropColumn('keterangan');
}
});
}
};
@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('bio_specimens', function (Blueprint $table) {
if (!Schema::hasColumn('bio_specimens', 'atcc')) {
$table->string('atcc', 150)->nullable()->after('strain');
}
if (!Schema::hasColumn('bio_specimens', 'sampleid')) {
$table->string('sampleid', 150)->nullable()->after('atcc');
}
});
}
public function down(): void
{
Schema::table('bio_specimens', function (Blueprint $table) {
if (Schema::hasColumn('bio_specimens', 'atcc')) {
$table->dropColumn('atcc');
}
if (Schema::hasColumn('bio_specimens', 'sampleid')) {
$table->dropColumn('sampleid');
}
});
}
};
@@ -0,0 +1,27 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (!Schema::hasColumn('periksa', 'asalpengirim')) {
$table->string('asalpengirim', 150)->nullable()->after('order_id');
}
});
}
public function down(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (Schema::hasColumn('periksa', 'asalpengirim')) {
$table->dropColumn('asalpengirim');
}
});
}
};
@@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('bio_racks', function (Blueprint $table) {
if (!Schema::hasColumn('bio_racks', 'slot_count')) {
$table->integer('slot_count')->default(1)->after('name');
}
});
DB::table('bio_racks')
->where(function ($query) {
$query->whereNull('slot_count')
->orWhere('slot_count', '<=', 1);
})
->orderBy('id')
->get(['id', 'level'])
->each(function ($rack) {
DB::table('bio_racks')
->where('id', $rack->id)
->update(['slot_count' => max((int) ($rack->level ?? 1), 1)]);
});
}
public function down(): void
{
Schema::table('bio_racks', function (Blueprint $table) {
if (Schema::hasColumn('bio_racks', 'slot_count')) {
$table->dropColumn('slot_count');
}
});
}
};
@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('poli', function (Blueprint $table) {
if (!Schema::hasColumn('poli', 'kelompok')) {
$table->string('kelompok', 150)->nullable();
}
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('poli', function (Blueprint $table) {
if (Schema::hasColumn('poli', 'kelompok')) {
$table->dropColumn('kelompok');
}
});
}
};
@@ -0,0 +1,72 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
if (!Schema::hasTable('poli')) {
Schema::create('poli', function (Blueprint $table) {
$table->id();
$table->string('poli', 250)->nullable();
$table->string('subpoli', 250)->nullable();
$table->string('subsubpoli', 250)->nullable();
$table->string('modaliti', 150)->nullable();
$table->string('kelompok', 150)->nullable();
$table->string('modaliti2', 150)->nullable();
$table->timestamp('created_at')->nullable();
$table->timestamp('updated_at')->nullable();
});
return;
}
Schema::table('poli', function (Blueprint $table) {
if (!Schema::hasColumn('poli', 'poli')) {
$table->string('poli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'subpoli')) {
$table->string('subpoli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'subsubpoli')) {
$table->string('subsubpoli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'modaliti')) {
$table->string('modaliti', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'kelompok')) {
$table->string('kelompok', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'modaliti2')) {
$table->string('modaliti2', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'created_at')) {
$table->timestamp('created_at')->nullable();
}
if (!Schema::hasColumn('poli', 'updated_at')) {
$table->timestamp('updated_at')->nullable();
}
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Kolom poli dipakai data production, rollback tidak menghapus kolom.
}
};
+47 -6
View File
@@ -4,6 +4,10 @@ namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Database\Seeders\JawabanSeeder;
use Database\Seeders\OrganismSeeder;
use Database\Seeders\SirabSeeder;
use App\User;
class DatabaseSeeder extends Seeder
@@ -13,11 +17,48 @@ class DatabaseSeeder extends Seeder
*/
public function run(): void
{
User::create([
'nama' => 'Administrator',
'username' => 'admin',
'password' => bcrypt('semangat'),
'previlage' => 'developer'
]);
$ceksudah = User::where('username', 'admin')->count();
if ($ceksudah == 0){
User::create([
'nama' => 'Administrator',
'username' => 'admin',
'password' => bcrypt('semangat'),
'previlage' => 'developer',
]);
}
$ceksudah = User::where('username', 'doktestes')->count();
if ($ceksudah == 0){
User::create([
'nama' => 'doktestes',
'username' => 'doktestes',
'password' => bcrypt('doktestes'),
'previlage' => 'supervisor',
]);
}
$ceksudah = User::where('username', 'ppdstes')->count();
if ($ceksudah == 0){
User::create([
'nama' => 'ppdstes',
'username' => 'ppdstes',
'password' => bcrypt('ppdstes'),
'previlage' => 'ppds',
]);
}
$ceksudah = User::where('username', 'analistes')->count();
if ($ceksudah == 0){
User::create([
'nama' => 'analistes',
'username' => 'analistes',
'password' => bcrypt('analistes'),
'previlage' => 'analis',
]);
}
$json1 = file_get_contents(database_path('seeders/data/ruangan.json'));
$data1 = json_decode($json1, true);
DB::table('ruangan')->insert($data1);
$this->call(JawabanSeeder::class);
$this->call(OrganismSeeder::class);
$this->call(SirabSeeder::class);
$this->call(PoliSeeder::class);
}
}
+318 -1
View File
@@ -22,7 +22,324 @@ class JawabanSeeder extends Seeder
['kategori' => '1', 'judul' => 'Pewarna Langsung', 'subjawaban' => '', 'kesimpulan' => ''],
['kategori' => '1', 'judul' => 'TBC', 'subjawaban' => '', 'kesimpulan' => ''],
['kategori' => '1', 'judul' => 'Viral Load', 'subjawaban' => '', 'kesimpulan' => ''],
['kategori' => '1', 'judul' => 'PCR COVID', 'subjawaban' => '', 'kesimpulan' => '']
['kategori' => '1', 'judul' => 'PCR COVID', 'subjawaban' => '', 'kesimpulan' => ''],
['kategori' => '1', 'judul' => 'IgM IgG Leptospira', 'subjawaban' => '', 'kesimpulan' => '']
]);
DB::table('dokter')->insert([
[ 'id' => 2, 'nama' => 'NON DOKTER', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'ND', 'alamat' => 'UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 196, 'nama' => 'Dr.dr.MOCHAMAD BACHTIAR BUDIANTO,Sp.B(K)Onk,FINACS,FICS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BO_003', 'alamat' => 'BEDAH ONKOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 231, 'nama' => 'dr.RATRI ISTIQOMAH,Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_006', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 344, 'nama' => 'dr.SYAIFULLAH ASMIRAGANI,Sp.OT. Subsp. O.T.B(K),MMRS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_002', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 361, 'nama' => 'Prof.Dr.dr.ACHMAD RUDIJANTO,Sp.PD-KEMD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_021', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 377, 'nama' => 'dr.ANGGUN PUTRI YUNIASWAN,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_011', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 389, 'nama' => 'dr.ARIF WIDIATMOKO,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_006', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 395, 'nama' => 'dr.AUNUR ROFIQ, Sp.DVE, Subsp.DAI,FINSDV,FAADV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_002', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 397, 'nama' => 'dr.AZIZA MATINU KARIMA,Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_007', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 398, 'nama' => 'dr.BADRUL MUNIR,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_010', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 400, 'nama' => 'dr.BAGUS PUTU PUTRA SURYANA,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_007', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 405, 'nama' => 'dr.BOGI PRATOMO WIBOWO,Sp.PD-KGEH', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_008', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 411, 'nama' => 'dr.CATUR ARI SETIANTO,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_013', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 412, 'nama' => 'Dr.dr.CESARIUS SINGGIH W.,Sp.PD-KR', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_015', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 417, 'nama' => 'dr.DEARISA SURYA YUDHANTARA,Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_005', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 421, 'nama' => 'dr.DESSIKA RAHMAWATI,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_011', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 425, 'nama' => 'dr.DEWI INDIASTARI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_024', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 427, 'nama' => 'dr.DHANY PRAFITA EKASARI,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_012', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 428, 'nama' => 'Dr.dr.DHELYA WIDASMARA,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_007', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 435, 'nama' => 'dr.DIDI CANDRADIKUSUMA,Sp.PD-KPTI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_016', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 444, 'nama' => 'dr.DJOKO HERI HERMANTO,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_010', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 447, 'nama' => 'Prof.dr.DJOKO WAHONO S.,Sp.PD-KEMD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_002', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 457, 'nama' => 'dr.EKO ARI SETIJONO M.,Sp.S(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_005', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 486, 'nama' => 'dr.FRILYA RACHMA PUTRI,Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_004', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 501, 'nama' => 'dr.HERI SUTANTO,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_023', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 503, 'nama' => 'dr.HERWINDA BRAHMANTI,Sp.KK,M.Sc', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_008', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 506, 'nama' => 'dr.IIN NOOR CHOZIN,Sp.P', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_007', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 531, 'nama' => 'dr.LAKSMI SASIARINI,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_018', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 535, 'nama' => 'dr.LITA SETYOWATIE,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_010', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 536, 'nama' => 'dr.MACHLUSIL HUSNA,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_007', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 565, 'nama' => 'dr.NGAKAN PUTU PARSAMA PUTRA,Sp.P(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_002', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 569, 'nama' => 'dr.NINIEK BUDIARTI,Sp.PD-KPTI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_011', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 594, 'nama' => 'dr.REZKI TANTULAR,Sp.P', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_010', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 595, 'nama' => 'dr.RIA DAMAYANTI,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_016', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 602, 'nama' => 'dr.RODHIYAN RAKHMATIAR,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_015', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 606, 'nama' => 'dr.RULLI ROSANDI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_020', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 612, 'nama' => 'dr.SHAHDEVI NANDAR KURNIAWAN,Sp.S(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_008', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 613, 'nama' => 'dr.SHINTA OKTYA WARDHANI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_012', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 614, 'nama' => 'dr.SINTA MURLISTYARINI,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_009', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 627, 'nama' => 'dr.SRI BUDHI RIANAWATI,Sp.S(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_006', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 630, 'nama' => 'dr.SRI SOENARTI,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_013', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 636, 'nama' => 'dr.SUCI PRAWITASARI,Sp.KK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_013', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 643, 'nama' => 'dr.SUPRIONO,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_014', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 644, 'nama' => 'dr.SURYANTI DWI PRATIWI,Sp.P(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_008', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 648, 'nama' => 'dr.SYIFA MUSTIKA,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_022', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 661, 'nama' => 'dr.TRI WAHJU ASTUTI,M.Kes,Sp.P(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_005', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 664, 'nama' => 'dr.UNGKY AGUS SETYAWAN,Sp.P', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_009', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 675, 'nama' => 'dr.WINARNI DIAN DWIASTUTI WISNU PUTRI,Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_008', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 690, 'nama' => 'dr.ZAMRONI AFIF,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_012', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 698, 'nama' => 'dr.AGUNG RIYANTO BUDI SANTOSO,Sp.OT,Subsp.T.L.B.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_009', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 705, 'nama' => 'dr.AHMAD DIAN WAHYUDIONO,Sp.THT-KL(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_010', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 714, 'nama' => 'dr.ANANTO SATYA PRADANA DRAJAT,Sp.OT', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_013', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 715, 'nama' => 'dr.ANDHIKA YUDISTIRA,Sp.OT,Subsp.O.T.B(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_012', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 719, 'nama' => 'dr.ANDRI KUSTONO,Sp.U', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_008', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 729, 'nama' => 'dr.ANNY SULISTIYOWATI,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_008', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 733, 'nama' => 'dr.ARIES BUDIANTO,Sp.B-KBD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BD_003', 'alamat' => 'BEDAH DIGESTIF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 736, 'nama' => 'dr.ARTONO ISHARANTO,Sp.B.TKV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_002', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 737, 'nama' => 'dr.ARVIANSYAH,Sp.B.P.R.E', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BP_003', 'alamat' => 'BEDAH PLASTIK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 740, 'nama' => 'dr.AULIA ABDUL HAMID ABDULLAH, M.BioMed. Sc, Sp.M (K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_016', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 745, 'nama' => 'dr.BESUT DARYANTO,Sp.U(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_002', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 757, 'nama' => 'dr.DEBBY SHINTIYA DEWI,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_009', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 777, 'nama' => 'dr.DONNY WISNU WARDHANA,Sp.BS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BS_004', 'alamat' => 'BEDAH SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 781, 'nama' => 'dr.DWICHA RAHMAWANSA S.,Sp.B-KBD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BD_006', 'alamat' => 'BEDAH DIGESTIF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 783, 'nama' => 'Dr.dr.EDI HANDOKO,Sp.THT-KL(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_005', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 784, 'nama' => 'Dr.dr.EDI MUSTAMSIR,Sp.OT,Subsp.P.L(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_003', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 790, 'nama' => 'dr.ELISABETH PRAJANTI S.,Sp.BP-RE', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BP_006', 'alamat' => 'BEDAH PLASTIK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 801, 'nama' => 'Dr.dr.FARHAD BAL`AFIF,Sp.BS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BS_003', 'alamat' => 'BEDAH SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 823, 'nama' => 'dr.HENDRADI SURJOTOMO,Sp.THT-KL(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_008', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 825, 'nama' => 'dr.HERA DWI NOVITA,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_017', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 827, 'nama' => 'dr.HERMAN YOSEF LIMPAT WIHASTYOKO,Sp.BP-RE.,Subsp.K.M.(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BP_002', 'alamat' => 'BEDAH PLASTIK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 829, 'nama' => 'dr.HERWINDO DICKY PUTRANTO,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_018', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 830, 'nama' => 'dr.HERY SUSILO,Sp.B(K)Onk', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BO_004', 'alamat' => 'BEDAH ONKOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 831, 'nama' => 'dr.HIDAYAT SUYUTI,PhD,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_024', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 840, 'nama' => 'dr.IMAM SUSENO BAYUADI,Sp.B-TKV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_004', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 844, 'nama' => 'dr.IRIANA MAHARANI,Sp.THT-KL(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_011', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 846, 'nama' => 'dr.ISTAN IRMANSYAH,Sp.OT,Subsp.Onk.Ort.R(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_004', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 858, 'nama' => 'dr.KOERNIA KUSUMA WARDHANA,Sp.B-TKV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_003', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 859, 'nama' => 'dr.KRISNA YUARNO PHATAMA,Sp.OT,Subsp.P.L.(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_010', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 861, 'nama' => 'dr.KURNIA PENTA SEPUTRA,Sp.U(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_004', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 864, 'nama' => 'dr.LELY RETNO WULANDARI,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_010', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 869, 'nama' => 'dr.LULIK INGGARWATI,Sp.B,Sp.BA(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BA_002', 'alamat' => 'BEDAH ANAK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 876, 'nama' => 'dr.MEDIANTO,Sp.U', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_009', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 878, 'nama' => 'dr.MEYRNA HERYANING PUTRI,Sp.THT-KL', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_013', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 883, 'nama' => 'dr.MOHAMMAD DWIJO MURDIYO,Sp.THT-KL', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_012', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 894, 'nama' => 'dr.NADIA ARTHA DEWI,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_011', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 895, 'nama' => 'dr.NANDA WAHYU ANANDITA,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_012', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 901, 'nama' => 'dr.NINA HANDAYANI,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_019', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 911, 'nama' => 'dr.OVI SOFIA,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_020', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 912, 'nama' => 'dr.PAKSI SATYAGRAHA,M.Kes,Sp.U(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_005', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 913, 'nama' => 'dr.PANJI SANANTA,Sp.OT, Subsp.A (K),MKed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_006', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 915, 'nama' => 'dr.PRADANA NURHADI,Sp.U', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_006', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 942, 'nama' => 'dr.ROSY ALDINA,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_013', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 950, 'nama' => 'dr.SATRIA PANDU PERSADA ISMA,Sp.OT,Subsp.Onk.Ort.R.(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_007', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 953, 'nama' => 'dr.SESKOATI PRAYITNANINGSIH,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_014', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 954, 'nama' => 'dr.SETYO SUGIHARTO,Sp.B-KBD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BD_002', 'alamat' => 'BEDAH DIGESTIF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 960, 'nama' => 'dr.SOEHARTONO,Sp.THT-KL(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_009', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 967, 'nama' => 'dr.TAUFIQ NUR BUDAYA,Sp.U', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_007', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 970, 'nama' => 'dr.THOMAS ERWIN CHRISTIAN JUNUS HUWAE,Sp.OT,Subsp.T.L.B.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_005', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 972, 'nama' => 'dr.TITOK HARIYANTO,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_021', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 975, 'nama' => 'dr.TOMMY ALFANDY NAZWAR,Sp.BS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BS_006', 'alamat' => 'BEDAH SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 978, 'nama' => 'dr.TRIANA BUDI SULISTYA,Sp.M(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_015', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 986, 'nama' => 'dr.WILMA AGUSTINA,Sp.B.P.R.E', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BP_004', 'alamat' => 'BEDAH PLASTIK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 989, 'nama' => 'dr.WINO VRIEDA VIERLIA,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_023', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 995, 'nama' => 'dr.YUDI SISWANTO,MSc,M.Ked-Klin,Sp.B.P.R.E', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BP_005', 'alamat' => 'BEDAH PLASTIK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 999, 'nama' => 'dr.MUHAMMAD IRAWAN,Sp.A. M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_035', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1013, 'nama' => 'Dr.dr.BAMBANG RAHARDJO,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_008', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1041, 'nama' => 'dr.HERMAWAN WIBISONO,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_016', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1042, 'nama' => 'Dr.dr.I WAYAN ARSANA WIYASA,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_007', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1065, 'nama' => 'dr.MUKHAMAD NORYANTO,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_010', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1067, 'nama' => 'dr.MULYO HADI WIBOWO,Sp.OG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_023', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1076, 'nama' => 'dr.NUGRAHANTI PRASETYORINI,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_011', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1080, 'nama' => 'Dr.dr.RAHAJENG,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_012', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1097, 'nama' => 'dr.SUHENI NINIK HARIYATI,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_019', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1101, 'nama' => 'Dr.dr.SUTRISNO,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_005', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1104, 'nama' => 'Dr.dr.TATIT NURSETA,Sp.OG(K)Onk', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_014', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1117, 'nama' => 'dr.YAHYA IRWANTO,Sp.OG(K)Onk', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_015', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1123, 'nama' => 'dr.A.SUSANTO NUGROHO,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_007', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1136, 'nama' => 'dr.ARIANI,M.Kes,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_011', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1138, 'nama' => 'dr.ASTRID KRISTINA KARDANI,Sp.A(K).,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_028', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1141, 'nama' => 'dr.BRIGITTA IDA RESITA VEBRIANTI C.,Sp.A(K),M.Kes', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_023', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1145, 'nama' => 'dr.DESY WULANDARI,Sp.A,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_032', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1156, 'nama' => 'dr.DYAHRIS KOENTARTIWI,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_021', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1157, 'nama' => 'dr.EKO SULISTIJONO,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_012', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1169, 'nama' => 'dr.ERY OLIVIANTO,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_020', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1177, 'nama' => 'dr.HAJENG WULANDARI,Sp.A.,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_033', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1179, 'nama' => 'dr.HARJOEDI ADJI TJAHJONO,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_008', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1188, 'nama' => 'dr.IRENE RATRIDEWI,Sp.A(K),M.Kes', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_006', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1189, 'nama' => 'dr.IRFAN AGUS SALIM,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_034', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1199, 'nama' => 'Dr.dr.KRISNI SOEBANDIJAH,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_009', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1200, 'nama' => 'dr.KURNIAWAN TAUFIQ KADAFI,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_024', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1227, 'nama' => 'dr.NUGROHO DANU TRI SUBROTO,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_031', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1234, 'nama' => 'dr.PRASETYA ISMAIL PERMADI,Sp.A,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_025', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1257, 'nama' => 'dr.SAPTADI YULIARTO,Sp.A(K),M.Kes', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_018', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1258, 'nama' => 'Dr.dr.SATRIO WIBOWO,Sp.A(K),M.si.Med', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_015', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1259, 'nama' => 'dr.SAVITRI LAKSMI WINAPUTRI,Sp.A', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_030', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1260, 'nama' => 'dr.SETYA MITHRA HARTIASTUTI,Sp.A,M.Si.Med', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_027', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1265, 'nama' => 'dr.SONY WICAKSONO,Sp.A,M.Kes', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_029', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1280, 'nama' => 'dr.WISNU BARLIANTO,MSi.Med,Sp.A(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_016', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1313, 'nama' => 'dr.ENDANG INDERAWATI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_001', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1328, 'nama' => 'Dr.dr.I WAYAN AGUNG INDRAWAN,Sp.OG(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_009', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1349, 'nama' => 'dr.MUHAYATI KUSUMA WARDHANI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_011', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1403, 'nama' => 'dr.WIYANTI ANA OKTAVIA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_010', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1411, 'nama' => 'drg.ANGELIQUE JULIKADEWI,Sp.Ort', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_006', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1412, 'nama' => 'drg.ANGGANI PRASASTI,Sp.KG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_005', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1415, 'nama' => 'drg.EVA RIAMA PANDIANGAN,Sp.BM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_009', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1416, 'nama' => 'drg.FAIDAH,Sp.KG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_010', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1417, 'nama' => 'drg.FERTY PURNAWATIE', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_018', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1419, 'nama' => 'drg.LELY INDRIASARI,Sp.KGA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_011', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1423, 'nama' => 'drg.MOHAMAD SAMSUL ARIFIN', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_013', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1430, 'nama' => 'drg.RIFIANA TAKANAMITA,Sp.Perio', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_019', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1431, 'nama' => 'drg.RINDA ARIYANTI,Sp.Ort', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_007', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1432, 'nama' => 'drg.ROBINSON PASARIBU,Sp.BM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_002', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1436, 'nama' => 'drg.SUKEKSI DYAH INTANNINGRUM,Sp.KGA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_014', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1437, 'nama' => 'drg.SUZY RATNA DINARTI,Sp.Pros', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_016', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1441, 'nama' => 'drg.VANRISTA PARIENDRA,Sp.KG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_015', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1447, 'nama' => 'dr.ALI HAEDAR,Sp.EM,KPEC,FAHA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_007', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1458, 'nama' => 'dr.ARI PRASETYADJATI,Sp.EM, KDM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_002', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1463, 'nama' => 'dr.AURICK YUDHA NAGARA,Sp.EM,KPEC', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_009', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1480, 'nama' => 'dr.DWI WARDOYO TRIYULIARTO,Sp.EM,KEC', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_003', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1524, 'nama' => 'dr.MUNSIFAH ZAIYANAH,Sp.EM,KTox', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_004', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1558, 'nama' => 'dr.SURYANTO EKO AGUNG NUGROHO,Sp.EM,KDM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_005', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1564, 'nama' => 'dr.TAUFIQ ABDULLAH,Sp.EM,KTox', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_008', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1577, 'nama' => 'dr.YUDDY IMOWANTO,Sp.EM,KEC', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_006', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1611, 'nama' => 'dr.BUYUNG HARTIYO LAKSONO,Sp.An(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_007', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1726, 'nama' => 'dr.TAUFIQ AGUS SISWAGAMA,Sp.An', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_010', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1742, 'nama' => 'dr.WIDANTO,Sp.B,Sp.BA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BA_003', 'alamat' => 'BEDAH ANAK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1788, 'nama' => 'dr.DIANAWATI EKASARI,S.Ked', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_007', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1793, 'nama' => 'dr.DYAH AYU FAHMI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_006', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1806, 'nama' => 'dr.EVIRA TIYAKUSUMA,Sp.MK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_005', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1813, 'nama' => 'dr.FRIDA SEPTYOWATI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_004', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1893, 'nama' => 'Dr.dr.SUSANTHY DJAJALAKSANA,Sp.P(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_004', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1909, 'nama' => 'dr.WAHYU PURNOMO', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_002', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1925, 'nama' => 'dr.ACHMAD BAYHAQI NASIR ASLAM,Sp.Rad(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_006', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1927, 'nama' => 'dr.AGUNG SETYAWAN,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_003', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1943, 'nama' => 'dr.DINI RACHMA ERAWATI,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_005', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1950, 'nama' => 'dr.FARAH NURDIANA,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_008', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1962, 'nama' => 'dr.IRMA DARINAFITRI,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_002', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1966, 'nama' => 'dr.LIANA KARLIASARI,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_012', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1984, 'nama' => 'dr.SISWIDIYATI,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_009', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 1998, 'nama' => 'Prof.Dr.dr.YUYUN YUENIWATI P,M.Kes,Sp.Rad(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_011', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2352, 'nama' => 'dr.AGUSTIN ISKANDAR,M.Kes,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_009', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2363, 'nama' => 'dr.CATUR SUCI SUTRISNANI,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_002', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2369, 'nama' => 'dr.DIAN SUKMA HANGGARA,Sp.PK,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_011', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2390, 'nama' => 'Dr.dr.HANI SUSIANTI,Sp.PK(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_003', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2399, 'nama' => 'dr.INDAH ADHITA WULANDA,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_007', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2404, 'nama' => 'dr.JUNE LEGIAWATI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_008', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2410, 'nama' => 'Prof.Dr.dr.KUSWORINI,M.Kes,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_014', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2416, 'nama' => 'dr.MAIMUN ZULHAIDAH A.,M.Kes,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_001', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2449, 'nama' => 'dr.SINGGIH PUDJO WAHONO,Sp.PK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_006', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2453, 'nama' => 'dr.SITI FATONAH,Sp.PK(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_005', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2485, 'nama' => 'dr.DEWI SANTOSANINGSIH,SpMK,MKes,Phd', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_007', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2493, 'nama' => 'dr.NURIMA DIYAH PUJI HASTUTI, Sp.MK, M.Ked.Klin', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_001', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2497, 'nama' => 'dr.SIWIPENI IRMAWANTI,M.Biomed.,Sp.MK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_009', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2504, 'nama' => 'dr.AINA ANGELINA,Sp.PA,Subsp H.L.E,(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_008', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2506, 'nama' => 'dr.ARIF SATRIA HARDIKA,Sp.PA,Subsp O.G.P.(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_002', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2508, 'nama' => 'dr.DIAH PRABAWATI RETNANI,Sp.PA(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_003', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2512, 'nama' => 'dr.EVIANA NORAHMAWATI,Sp.PA(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_004', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2516, 'nama' => 'dr.KENTY WANTRI ANITA,M.Kes,Sp.PA(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_006', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2518, 'nama' => 'dr.M.LUQMAN FADLI,Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_009', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2525, 'nama' => 'dr.RA.ROSE KHASANA DEWI,Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_010', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2539, 'nama' => 'dr.DWI INDRIANI LESTARI,Sp.RM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_002', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2548, 'nama' => 'dr.MOHAMMAD BARLIAN NUGROHO,Sp.KFR', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_005', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2553, 'nama' => 'dr.RAHMAD,Sp.KFR', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_006', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2556, 'nama' => 'dr.SAMIAH RACHMAWATI,Sp.KFR', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_007', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2573, 'nama' => 'dr.ERIKO PRAWESTININGTYAS,Sp.F', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'FM_002', 'alamat' => 'IKF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2574, 'nama' => 'dr.ETTY KURNIA,Sp.F', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'FM_003', 'alamat' => 'IKF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2577, 'nama' => 'dr.MUHAMMAD FAHRUL,Sp.F', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'FM_001', 'alamat' => 'IKF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2587, 'nama' => 'dr.WENING PRASTOWO,Sp.F', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'FM_004', 'alamat' => 'IKF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2695, 'nama' => 'dr.MUCHAMMAD FAHRUL UDIN,Sp.A(K) M.Kes', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_026', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2784, 'nama' => 'dr.ANNA FUJI RAHIMAH,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_015', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2785, 'nama' => 'dr.ARDIAN RIZAL,Sp.JP(K),FIHA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_012', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2790, 'nama' => 'dr.BUDI SATRIJO,Sp.JP(K),FIHA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_013', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2792, 'nama' => 'dr.CHOLID TRI TJAHJONO,M.Kes,Sp.JP(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_006', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2814, 'nama' => 'dr.HENY MARTINI,Sp.JP(K)FIHA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_005', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2821, 'nama' => 'dr.INDRA PRASETYA,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_016', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2835, 'nama' => 'dr.MOHAMMAD SAIFUR ROHMAN,Sp.JP,(K),Ph.D', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_007', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2839, 'nama' => 'dr.NOVI KURNIANINGSIH,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_011', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2849, 'nama' => 'dr.SASMOJO WIDITO,Sp.JP(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_004', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2850, 'nama' => 'dr.SETYASIH ANJARWANI,Sp.JP(K),FIHA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_009', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2861, 'nama' => 'dr.VALERINNA YOGIBUANA S.P.,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_018', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2884, 'nama' => 'dr.FAJAR WAHYU ATMOKO', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_014', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2895, 'nama' => 'dr.SARAH INDERAYANTI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_009', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2905, 'nama' => 'dr.WIDODO MARDI SANTOSO,Sp.S', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_009', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2910, 'nama' => 'dr.ALFRED JULIUS PETRARIZKY,Sp.Onk.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RP_002', 'RADIOTERAPI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2923, 'nama' => 'dr.RAFIQ SULISTYO NUGROHO,Sp.Onk.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RP_001', 'RADIOTERAPI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2935, 'nama' => 'dr.ACHMAD RIFAI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_026', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2944, 'nama' => 'Dr.dr.ATMA GUNAWAN,Sp.PD(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_006', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 2980, 'nama' => 'dr.NUR SAMSU,Sp.PD-KGH', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_019', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3007, 'nama' => 'dr.AHMAD FEZA FADLURRAHMAN,Sp.An-TI., Subsp.An.Kv. (K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_013', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3013, 'nama' => 'dr.ARIE ZAINUL FATONI,Sp.An', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_011', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3014, 'nama' => 'Dr.dr.ASWOCO ANDYK ASMORO,Sp.An(FIPM)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_003', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3041, 'nama' => 'dr.ISNGADI,M.Kes,Sp.An(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_006', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3047, 'nama' => 'dr.KARMINI,Sp.An(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_002', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3068, 'nama' => 'dr.RISTIAWAN MUJI LAKSONO,Sp.An.KMN', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_008', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3072, 'nama' => 'dr.RUDDI HARTONO,Sp.An', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_009', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3073, 'nama' => 'dr.RUDY VITRALUDYONO,Sp.An', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_012', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3087, 'nama' => 'dr.WIWI JAYA,Sp.An (K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_005', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3090, 'nama' => 'dr.HERWINDO PUDJO BRAHMANTYO,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_025', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3092, 'nama' => 'dr.ZUHROTUN ULYA, Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_009', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3102, 'nama' => 'dr.HARTADI TANJOYO, Sp.Em', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'EM_010', 'alamat' => 'EMERGENCY', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3103, 'nama' => 'dr.INDRASTUTI NORMAHAYU, Sp.Rad(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_001', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3104, 'nama' => 'dr.ERY SATRIAWAN,Sp.OT', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_014', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3105, 'nama' => 'dr.WELLA KAROLINA, Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_019', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3106, 'nama' => 'dr.VENY MAYANGSARI,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_020', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3107, 'nama' => 'dr.PERDANA ADITYA RAHMAN,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_028', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3109, 'nama' => 'dr.RIZKI EKAPUTRA HANDOKO,Sp.THT-KL', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_014', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3110, 'nama' => 'dr.NINA NUR ARIFAH,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_030', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3113, 'nama' => 'dr.ZENDY SAGITA,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_025', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3114, 'nama' => 'dr.HABIBA AURORA,M.Biomed,Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_010', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3115, 'nama' => 'dr.HENDY SETYO YUDHANTO,Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_001', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3117, 'nama' => 'dr.HERU SULISTYO,Sp.B-KBD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BD_007', 'alamat' => 'BEDAH DIGESTIF', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3118, 'nama' => 'dr.VATIEN RAHMAWATI,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_026', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3121, 'nama' => 'dr.NUGRAHITA SAFIRAWIDI WITJAKSONO', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_017', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3125, 'nama' => 'dr.RUDI PRIYO UTOMO,Sp.OG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_024', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3126, 'nama' => 'dr.FADILAH MUTAQIN,Sp.A, M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_036', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3127, 'nama' => 'dr.ANGGIA PRAMESWARI WARDHANA,Sp.OG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_025', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3128, 'nama' => 'dr.ANDREW WILLIAM TULLE,M.Sc.', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_006', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3129, 'nama' => 'dr.AYU YESI AGUSTINA,Sp.An-TI,Subsp.T. I (K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_014', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3130, 'nama' => 'dr.SYAHRUL CHILMI,M.Biomed,SpPK,Ph.D', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPK_020', 'alamat' => 'LAB.PK', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3131, 'nama' => 'drg.HIRZI ASDYAKSA,Sp.BM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'GM_020', 'alamat' => 'GIMU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3132, 'nama' => 'dr.AYUNITA TRI WIRATTAMI,Sp.THT-KL', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_015', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3134, 'nama' => 'dr.EKO NOFIYANTO, Sp.An-TI.MMRS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_015', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3135, 'nama' => 'dr.ADHIKA PRASTYA WIKANANDA,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_021', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3136, 'nama' => 'dr.FANNIYAH,Sp.An-TI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_016', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3137, 'nama' => 'dr.MUHAMAD AKBAR SIDIQ,Sp.An-TI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_017', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3138, 'nama' => 'dr.NUR SHELLA PUTRI BASUKI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_021', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3140, 'nama' => 'dr.MELINDA, Sp.A, M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'AN_036', 'alamat' => 'IKA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3141, 'nama' => 'dr.ETIK MERTIANTI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_031', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3142, 'nama' => 'dr.EDEN SURYOIMAN WINOTO,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_032', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3143, 'nama' => 'dr.RINADHI REZA BRAMANTYA,Sp.PD-KEMD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_033', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3144, 'nama' => 'dr.CHRISTIAN SURYA EKA PUTRA,Sp.P', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_014', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3145, 'nama' => 'dr.GUTAMA UTAMA ARYA PRINGGA,Sp.KFR,M.Ked Klin', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_009', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3146, 'nama' => 'dr.GRACELIA RUTH ELISABETH D,Sp.B.TKV,M.Med.KI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_005', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3147, 'nama' => 'dr.SINUNG WIKANADI,Sp.B., Sp.BA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BA_004', 'alamat' => 'BEDAH ANAK', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3148, 'nama' => 'dr.MILANITALIA GADYS ROSANDI,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_034', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3149, 'nama' => 'dr.NYOMAN SATVIKA DHARMA,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_035', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3150, 'nama' => 'dr.MIRZA ZAKA PRATAMA,SpPD,M.Biomed', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_036', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3151, 'nama' => 'dr.DOMY PRADANA PUTRA,SpOT', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_015', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3152, 'nama' => 'dr.BERLIAN ANGGRAENI PUTRI,Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_011', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3153, 'nama' => 'dr.DICKI TRIANGGA PUTRA, Sp.KJ', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JW_010', 'alamat' => 'JIWA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3154, 'nama' => 'dr.YUYUN KUSNANINGRUM,Sp.MK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_010', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3155, 'nama' => 'Dr.ADINDA AMALIA DANI, Sp.DV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_014', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3188, 'nama' => 'dr.AHMAD THOHIR,Sp.M', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MT_027', 'alamat' => 'MATA', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3221, 'nama' => 'dr.CHAIDAR MUTTAQIN, Sp.BTKV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_006', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3222, 'nama' => 'dr.AULIA HANUM, Sp.Rad', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RO_013', 'alamat' => 'RADIOLOGI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3229, 'nama' => 'dr.FITRI INDAH SARI, Sp.P', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'PR_015', 'alamat' => 'PARU', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3230, 'nama' => 'dr.ADEYCA AMARYLLIS RISA PUTRI, Sp.N', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'SR_018', 'alamat' => 'SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3231, 'nama' => 'dr.DEA ARIE KURNIAWAN,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_022', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3232, 'nama' => 'dr.PRISCA ANINDHITA FAJARPENI,Sp.B', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_006', 'alamat' => 'BEDAH ONKOLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3233, 'nama' => 'dr.IHDA DIAN KUSUMA, M.Biomed, Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_012', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3234, 'nama' => 'dr.DWI FITRIANTI ARIEZA PUTRI, Sp.FM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'FM_006', 'alamat' => 'IKF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3235, 'nama' => 'dr.DEWI ARUM SAWITRI,Sp.AN-TI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_018', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3236, 'nama' => 'dr.MUHAMMAD FARLYZHAR YUSUF,Sp.An-TI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'IC_019', 'alamat' => 'ANESTHESI', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3237, 'nama' => 'dr.DANDY DRESTANTO ADIWIGNYO,Sp.OT', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BR_016', 'alamat' => 'BEDAH ORTOPEDI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3238, 'nama' => 'dr.ADIN YAN PERMANA,Sp.OG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_026', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3239, 'nama' => 'dr.FACHRIY BALAFIF,M.Ked.klin,Sp.BS', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BS_007', 'alamat' => 'BEDAH SARAF', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3240, 'nama' => 'dr.MOCHAMMAD PUTRO ARGO,Sp.OG', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_027', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3241, 'nama' => 'dr.EDI WIBOWO,Sp.U', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'URO_010', 'alamat' => 'BEDAH UROLOGI', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3242, 'nama' => 'dr.YORDAN WICAKSONO ASHARI,Sp.JP', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'JT_023', 'alamat' => 'JANTUNG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3243, 'nama' => 'dr.YULIANA AYU RAHAYU MANIK', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_022', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3244, 'nama' => 'dr.CYNTIA PUTRI WIDYASARI', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_023', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3245, 'nama' => 'dr.FADHILLAH SALMAN SOFYAN', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_024', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3246, 'nama' => 'dr.VITA FEBRYLIA ADZIMA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_025', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3247, 'nama' => 'dr.ANDRANISSA AMALIA PASHIRA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_026', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3248, 'nama' => 'dr.SRI SAYEKTININGSIH,MM', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_027', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3250, 'nama' => 'dr.R.GALIH AGUNG PRAGIWAKSANA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DU_029', 'alamat' => 'DOKTER UMUM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3251, 'nama' => 'dr.NURRAHMA WAHYU FITRIYANI,M.MedED,Sp.DV', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'KL_015', 'alamat' => 'KULKEL', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3284, 'nama' => 'dr.RIZKI EKAPUTRA HANDOKO,Sp.THT-KL', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'HT_014', 'alamat' => 'THT', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3317, 'nama' => 'dr.NAYLA RAHMADIANI,Sp.PA', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'LPA_013', 'alamat' => 'LAB.PA', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3350, 'nama' => 'dr.MOCHAMAD FACHRUREZA,Sp.PD', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'DL_037', 'alamat' => 'IPD', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3351, 'nama' => 'dr.KRESNA AGUNG PRABOWO, Sp.B.Subsp.B.V.E(K)', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'BT_007', 'alamat' => 'BEDAH THORAX', 'created_at' => '2025-08-02 07:15:10', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3384, 'nama' => 'dr.ADITYO PRABOWO,Sp.OG,M.Ked.Klin', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'OG_028', 'alamat' => 'OBG', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3385, 'nama' => 'dr. IMALIA AYUNAZHARY', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'RH_010', 'alamat' => 'IRM', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51'],
[ 'id' => 3386, 'nama' => 'dr. MOHAMMAD AGUNG MARZAH, Sp.MK.', 'jk' => '', 'tgl_lahir' => null, 'kota' => 'MK_011', 'alamat' => 'LAB.MIKRO', 'created_at' => '2025-08-02 07:14:51', 'updated_at' => '2025-08-02 07:14:51']
]);
}
}
+20 -19
View File
@@ -279,19 +279,16 @@ class OrganismSeeder extends Seeder
['name' => 'Budding Cell 1-5/LPB (2+)', 'category' => 'BC', 'kelompok' => 'mikroorganisme'],
['name' => 'Budding Cell 6-30/LPB (3+)', 'category' => 'BC', 'kelompok' => 'mikroorganisme'],
['name' => 'Budding Cell &gt;30/LPB (4+)', 'category' => 'BC', 'kelompok' => 'mikroorganisme'],
['name' => 'Pseudohifa (+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Hifa (+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Hifa &lt;1/LPB (1+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Hifa 1-5/LPB (2+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Hifa 6-30/LPB (3+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Hifa &gt;30/LPB (4+)', 'category' => 'HIFA', 'kelompok' => 'mikroorganisme'],
['name' => 'Bacil Gram Positif &lt;1/LPB (1+)', 'category' => 'BGP', 'kelompok' => 'mikroorganisme'],
['name' => 'Bacil Gram Positif 1-5/LPB (2+)', 'category' => 'BGP', 'kelompok' => 'mikroorganisme'],
['name' => 'Bacil Gram Positif 6-30/LPB (3+)', 'category' => 'BGP', 'kelompok' => 'mikroorganisme'],
['name' => 'Bacil Gram Positif &gt;30/LPB (4+)', 'category' => 'BGP', 'kelompok' => 'mikroorganisme'],
['name' => 'Tidak ditemukan morfologi budding cells', 'category' => 'id_sputum', 'kelompok' => 'Sputum'],
['name' => 'Ditemukan morfologi budding cells', 'category' => 'id_sputum', 'kelompok' => 'Sputum'],
['name' => 'Tidak ditemukan morfologi budding cells', 'category' => 'id_swabtenggorok', 'kelompok' => 'Swab Tenggorok'],
@@ -343,14 +340,22 @@ class OrganismSeeder extends Seeder
['name' => 'Ditemukan morfologi bakteri berspora di sub terminal', 'category' => 'id_pewarnaanspora', 'kelompok' => 'Pewarnaan Spora'],
['name' => 'Ditemukan morfologi bakteri berspora di sentral', 'category' => 'id_pewarnaanspora', 'kelompok' => 'Pewarnaan Spora'],
['name' => 'Tidak diitemukan morfologi bakteri berspora', 'category' => 'id_pewarnaanspora', 'kelompok' => 'Pewarnaan Spora'],
['name' => 'KGP 1+ &#646; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 2+ &#646; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 3+ &#646; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 4+ &#646; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 1+ &#946; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 2+ &#946; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 3+ &#946; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 4+ &#946; hemolisa', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'Ditemukan morfologi <i>Inclusion Bodies</i> dan <i>Reticulate Bodies</i>', 'category' => 'id_pewarnaangiesma', 'kelompok' => 'Pewarnaan Giemsa'],
['name' => 'Tidak ditemukan morfologi <i>Inclusion Bodies</i> dan <i>Reticulate Bodies</i>', 'category' => 'id_pewarnaangiesma', 'kelompok' => 'Pewarnaan Giemsa'],
['name' => 'Ditemukan morfologi kista <i>tropozoid</i>', 'category' => 'id_pewarnaangiesma', 'kelompok' => 'Pewarnaan Giemsa'],
['name' => 'Tidak Ditemukan morfologi kista <i>tropozoid</i>', 'category' => 'id_pewarnaangiesma', 'kelompok' => 'Pewarnaan Giemsa'],
['name' => 'Ditemukan morfologi Hifa', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Ditemukan morfologi <i>Budding Cell</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Ditemukan morfologi <i>Conidia</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Ditemukan morfologi Hifa dan <i>Budding Cell</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Ditemukan morfologi Hifa dan <i>Conidia</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Ditemukan morfologi <i>Budding Cell</i> dan <i>Conidia</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Tidak ditemukan morfologi <i>Budding Cell</i>, Hifa dan <i>Conidia</i>', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'Tidak ditemukan morfologi <i>Budding Cell</i> dan Hifa', 'category' => 'id_pewarnaankoh', 'kelompok' => 'Pewarnaan KOH'],
['name' => 'KGP 1+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 2+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 3+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 4+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'BGN 1+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'BGN 2+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'BGN 3+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
@@ -375,14 +380,10 @@ class OrganismSeeder extends Seeder
['name' => 'BGP Coryneform 2+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'BGP Coryneform 3+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'BGP Coryneform 4+', 'category' => 'id_mediabap', 'kelompok' => 'Media BAP'],
['name' => 'KGP 1+ &#646; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 2+ &#646; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 3+ &#646; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 4+ &#646; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 1+ &#946; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 2+ &#946; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 3+ &#946; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 4+ &#946; hemolisa', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 1+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 2+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 3+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'KGP 4+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'BGN 1+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'BGN 2+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
['name' => 'BGN 3+', 'category' => 'id_mediacap', 'kelompok' => 'Media CAP'],
+120
View File
@@ -0,0 +1,120 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class PoliSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$this->ensureTableAndColumns();
DB::table('poli')->truncate();
foreach (array_chunk($this->jsonData(), 500) as $chunk) {
DB::table('poli')->insert($chunk);
}
$this->resetAutoIncrement();
}
private function ensureTableAndColumns(): void
{
if (!Schema::hasTable('poli')) {
Schema::create('poli', function (Blueprint $table) {
$table->id();
$table->string('poli', 250)->nullable();
$table->string('subpoli', 250)->nullable();
$table->string('subsubpoli', 250)->nullable();
$table->string('modaliti', 150)->nullable();
$table->string('kelompok', 150)->nullable();
$table->string('modaliti2', 150)->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
return;
}
Schema::table('poli', function (Blueprint $table) {
if (!Schema::hasColumn('poli', 'poli')) {
$table->string('poli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'subpoli')) {
$table->string('subpoli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'subsubpoli')) {
$table->string('subsubpoli', 250)->nullable();
}
if (!Schema::hasColumn('poli', 'modaliti')) {
$table->string('modaliti', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'kelompok')) {
$table->string('kelompok', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'modaliti2')) {
$table->string('modaliti2', 150)->nullable();
}
if (!Schema::hasColumn('poli', 'created_at')) {
$table->timestamp('created_at')->useCurrent();
}
if (!Schema::hasColumn('poli', 'updated_at')) {
$table->timestamp('updated_at')->useCurrent();
}
});
}
private function jsonData(): array
{
$path = database_path('seeders/data/poli.json');
$json = file_get_contents($path);
if ($json === false) {
throw new \RuntimeException("Gagal membuka file seeder poli: {$path}");
}
$data = json_decode($json, true);
if (!is_array($data)) {
throw new \RuntimeException("Format JSON seeder poli tidak valid: {$path}");
}
return $data;
}
private function resetAutoIncrement(): void
{
$driver = DB::getDriverName();
if ($driver === 'pgsql') {
DB::statement("
SELECT setval(
pg_get_serial_sequence('poli', 'id'),
(SELECT COALESCE(MAX(id), 1) FROM poli),
(SELECT COUNT(*) > 0 FROM poli)
)
");
return;
}
if ($driver === 'mysql') {
$nextId = ((int) DB::table('poli')->max('id')) + 1;
DB::statement("ALTER TABLE poli AUTO_INCREMENT = {$nextId}");
}
}
}
File diff suppressed because it is too large Load diff
File diff suppressed because it is too large Load diff
+141
View File
@@ -0,0 +1,141 @@
[
{"id":32,"poli":"Core","ruangan":"R.TIND. SPIROMETRI - IRNA I","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":33,"poli":"Core","ruangan":"R.TIND. ECHO - IPJT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":34,"poli":"Core","ruangan":"IGD - P1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":35,"poli":"Core","ruangan":"IGD - P2 COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":36,"poli":"Core","ruangan":"IGD - TRIASE COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":37,"poli":"Core","ruangan":"R.TIND. THT - IRNA II","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":38,"poli":"Core","ruangan":"R.BUGENVILE - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":39,"poli":"Core","ruangan":"R.HCU INFEKSI MELATI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":40,"poli":"Core","ruangan":"R. ESWL","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":41,"poli":"Core","ruangan":"R.TIND. NEUROLOGI - IRNA 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":42,"poli":"Core","ruangan":"R.TIND. CAPD - INST. DIALISIS","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":43,"poli":"Core","ruangan":"R.BENGAWAN SOLO - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":44,"poli":"Core","ruangan":"OK LOKAL R. 21","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":45,"poli":"Core","ruangan":"R. USG","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":46,"poli":"Core","ruangan":"R.TINDAKAN KEMOTERAPI - IRJ","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":47,"poli":"Core","ruangan":"R.TIND. TRANSFUSI THALASEMIA - IRNA IV","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":48,"poli":"Core","ruangan":"R.HCU SARANGAN - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":49,"poli":"Core","ruangan":"ANESTESI dan TERAPI INTENSIF","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":50,"poli":"Core","ruangan":"IGD - TRIASE","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":51,"poli":"Core","ruangan":"THT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":52,"poli":"Core","ruangan":"MATA","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":53,"poli":"Core","ruangan":"R.TIND. BEDAH - IBS","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":54,"poli":"Core","ruangan":"R.TIND. REHABILITASI JANTUNG - IPJT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":55,"poli":"Core","ruangan":"PARU","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":56,"poli":"Core","ruangan":"JANTUNG","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":57,"poli":"Core","ruangan":"KULIT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":58,"poli":"Core","ruangan":"REHAB MEDIK","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":59,"poli":"Core","ruangan":"SARAF","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":60,"poli":"Core","ruangan":"GIZI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":61,"poli":"Core","ruangan":"OBG","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":62,"poli":"Core","ruangan":"ONKOLOGI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":63,"poli":"Core","ruangan":"R.ICU KAPUAS B - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":64,"poli":"Core","ruangan":"KOMPLEMENTER","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":65,"poli":"Core","ruangan":"GCU","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":66,"poli":"Core","ruangan":"HEMATO-ONKOLOGI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":67,"poli":"Core","ruangan":"HOME CARE","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":68,"poli":"Core","ruangan":"R.BARITO - KLS VIP A","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":69,"poli":"Core","ruangan":"R.BARITO - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":70,"poli":"Core","ruangan":"R.HCU RANU GRATI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":71,"poli":"Core","ruangan":"IGD - P0","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":72,"poli":"Core","ruangan":"R.SEMERU - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":73,"poli":"Core","ruangan":"RADIOTERAPI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":74,"poli":"Core","ruangan":"R.HCU CISADANE - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":75,"poli":"Core","ruangan":"KLINIK COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":76,"poli":"Core","ruangan":"KLINIK TB-MDR","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":77,"poli":"Core","ruangan":"KLINIK GIGI & MULUT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":78,"poli":"Core","ruangan":"R.PARANGTRITIS - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":79,"poli":"Core","ruangan":"R.ICU INFEKSI MELATI - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":80,"poli":"Core","ruangan":"R.KELIMUTU - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":81,"poli":"Core","ruangan":"IGD - P2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":82,"poli":"Core","ruangan":"R.LOSARI - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":83,"poli":"Core","ruangan":"R.HCU BRANTAS - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":84,"poli":"Core","ruangan":"IGD - P3 COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":85,"poli":"Core","ruangan":"SEKSI REKAM MEDIK","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":86,"poli":"Core","ruangan":"R.BENGAWAN SOLO - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":87,"poli":"Core","ruangan":"LAB PATOLOGI ANATOMI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":88,"poli":"Core","ruangan":"R. BMD","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":89,"poli":"Core","ruangan":"R. KATETERISASI JANTUNG","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":90,"poli":"Core","ruangan":"R. ECHOCARDIOGRAFI DAN IMAGING","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":91,"poli":"Core","ruangan":"R. PREVENSI DAN REHABILITASI JANTUNG","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":92,"poli":"Core","ruangan":"R.TIND. APHARESIS - IRNA 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":93,"poli":"Core","ruangan":"DALAM","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":94,"poli":"Core","ruangan":"R. Konsul Terapi Intensif","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":95,"poli":"Core","ruangan":"ANAK","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":96,"poli":"Core","ruangan":"BEDAH","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":97,"poli":"Core","ruangan":"R. INTENSIF KABER","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":98,"poli":"Core","ruangan":"GIGI DAN MULUT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":99,"poli":"Core","ruangan":"R.RANU KUMBOLO (BAYI) - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":100,"poli":"Core","ruangan":"R. ECHOCARDIOGRAPHY IRNA 4","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":101,"poli":"Core","ruangan":"PSIKIATRI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":102,"poli":"Core","ruangan":"R.RINJANI - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":103,"poli":"Core","ruangan":"R.RINJANI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":104,"poli":"Core","ruangan":"R.RINJANI - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":105,"poli":"Core","ruangan":"R.TIND. UROLOGI - IRNA II","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":106,"poli":"Core","ruangan":"R.CVCU MUSI - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":107,"poli":"Core","ruangan":"IGD - P3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":108,"poli":"Core","ruangan":"R.HCU MAHAKAM - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":109,"poli":"Core","ruangan":"R.BARITO - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":110,"poli":"Core","ruangan":"LAB SENTRAL","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":111,"poli":"Core","ruangan":"R.BUNAKEN - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":112,"poli":"Core","ruangan":"R.KELIMUTU - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":113,"poli":"Core","ruangan":"R.TIND. ENDOSCOPY - IRNA 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":114,"poli":"Core","ruangan":"R.GILI TRAWANGAN - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":115,"poli":"Core","ruangan":"R.GILI TRAWANGAN - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":116,"poli":"Core","ruangan":"R.TONDANO - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":117,"poli":"Core","ruangan":"R.TIND. SPIROMETRI - IRNA IV","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":118,"poli":"Core","ruangan":"R.TIND. REHABILITASI MEDIK - IRM","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":119,"poli":"Core","ruangan":"R.TIND. RADIOTERAPI - INST. RADIOTERAPI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":120,"poli":"Core","ruangan":"R.TIND. MEDICAL CHECK UP JANTUNG - IPJT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":121,"poli":"Core","ruangan":"IGD - P0 COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":122,"poli":"Core","ruangan":"R.BARITO - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":123,"poli":"Core","ruangan":"R.TIND. BERSALIN - IRNA III","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":124,"poli":"Core","ruangan":"R.TIND. MATA - IRNA II","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":125,"poli":"Core","ruangan":"FARMASI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":126,"poli":"Core","ruangan":"IKF DAN MEDIKOLEGAL","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":127,"poli":"Core","ruangan":"R.TIND. BRONCHOSCOPY - IRNA 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":128,"poli":"Core","ruangan":"R.TIND. HEMODIALISIS - INST. DIALISIS","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":129,"poli":"Core","ruangan":"IGD - P1 COVID","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":130,"poli":"Core","ruangan":"INSTALASI PELATIHAN","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":131,"poli":"Core","ruangan":"BIDANG DIKLIT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":132,"poli":"Core","ruangan":"ITIKOM","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":133,"poli":"Core","ruangan":"BAGIAN UMUM","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":134,"poli":"Core","ruangan":"BAGIAN KEUANGAN & AKUNTANSI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":135,"poli":"Core","ruangan":"IPL","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":136,"poli":"Core","ruangan":"R.GILI TRAWANGAN - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":137,"poli":"Core","ruangan":"R.TIND. KATETERISASI JANTUNG - IPJT","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":138,"poli":"Core","ruangan":"R.TIND. CAPD - IRNA IV","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":139,"poli":"Core","ruangan":"R.TIND. ECHO - IRNA IV","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":140,"poli":"Core","ruangan":"R.HCU CILIWUNG - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":141,"poli":"Core","ruangan":"R.PICU KRAKATAU - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":142,"poli":"Core","ruangan":"RADIOLOGI","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":143,"poli":"Core","ruangan":"R.BUNAKEN - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":144,"poli":"Core","ruangan":"R.TOBA (BAYI) - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":145,"poli":"Core","ruangan":"R.TOBA (BAYI) KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":146,"poli":"Core","ruangan":"R.NICU MANINJAU - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":147,"poli":"Core","ruangan":"R.GALUNGGUNG - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":148,"poli":"Core","ruangan":"R.PANGANDARAN - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":149,"poli":"Core","ruangan":"R.MAWAR - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":150,"poli":"Core","ruangan":"R.MAWAR - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":151,"poli":"Core","ruangan":"R.TOBA (IBU) - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":152,"poli":"Core","ruangan":"R.BROMO - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":153,"poli":"Core","ruangan":"R.TOBA (IBU) - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":154,"poli":"Core","ruangan":"R.JIMBARAN - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":155,"poli":"Core","ruangan":"R.HCU KAWI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":156,"poli":"Core","ruangan":"R.NUSA DUA - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":157,"poli":"Core","ruangan":"R.KERINCI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":158,"poli":"Core","ruangan":"R.KERINCI - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":159,"poli":"Core","ruangan":"RUANG ROE - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":160,"poli":"Core","ruangan":"R.RANU KUMBOLO - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":161,"poli":"Core","ruangan":"R.SINGKARAK - KLS 3","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":162,"poli":"Core","ruangan":"R.LANTAI 2 - KLS I","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":163,"poli":"Core","ruangan":"R.ICU KAPUAS A - KLS 1","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":164,"poli":"Core","ruangan":"R.LANTAI 4 - KLS VIP A","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":165,"poli":"Core","ruangan":"KLINIK TB-SO","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":166,"poli":"Core","ruangan":"R.LANTAI 3 - KLS VIP A","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":167,"poli":"Core","ruangan":"R.ICU KAPUAS C - KLS 1 (Dewasa)","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":168,"poli":"Core","ruangan":"KLINIK PEL. UTAMA GRAND PAVILIUN","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":170,"poli":"Core","ruangan":"R.HCU RANU PANI - KLS 2","created_at":"2024-09-23 10:13:14","updated_at":"2024-09-23 10:13:14"},
{"id":169,"poli":"Core","ruangan":"LAB MIKROBIOLOGI","created_at":"2024-09-23 10:13:14","updated_at":"2026-02-04 13:55:48"}
]
File diff suppressed because it is too large Load diff
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'رسالة استثناء: :message',
'exception_trace' => 'تتبع الإستثناء: :trace',
'exception_message_title' => 'رسالة استثناء',
'exception_trace_title' => 'تتبع الإستثناء',
'backup_failed_subject' => 'أخفق النسخ الاحتياطي لل :application_name',
'backup_failed_body' => 'مهم: حدث خطأ أثناء النسخ الاحتياطي :application_name',
'backup_successful_subject' => 'نسخ احتياطي جديد ناجح ل :application_name',
'backup_successful_subject_title' => 'نجاح النسخ الاحتياطي الجديد!',
'backup_successful_body' => 'أخبار عظيمة، نسخة احتياطية جديدة ل :application_name تم إنشاؤها بنجاح على القرص المسمى :disk_name.',
'cleanup_failed_subject' => 'فشل تنظيف النسخ الاحتياطي للتطبيق :application_name .',
'cleanup_failed_body' => 'حدث خطأ أثناء تنظيف النسخ الاحتياطية ل :application_name',
'cleanup_successful_subject' => 'تنظيف النسخ الاحتياطية ل :application_name تمت بنجاح',
'cleanup_successful_subject_title' => 'تنظيف النسخ الاحتياطية تم بنجاح!',
'cleanup_successful_body' => 'تنظيف النسخ الاحتياطية ل :application_name على القرص المسمى :disk_name تم بنجاح.',
'healthy_backup_found_subject' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name صحية',
'healthy_backup_found_subject_title' => 'النسخ الاحتياطية ل :application_name صحية',
'healthy_backup_found_body' => 'تعتبر النسخ الاحتياطية ل :application_name صحية. عمل جيد!',
'unhealthy_backup_found_subject' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية',
'unhealthy_backup_found_subject_title' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية. :problem',
'unhealthy_backup_found_body' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name غير صحية.',
'unhealthy_backup_found_not_reachable' => 'لا يمكن الوصول إلى وجهة النسخ الاحتياطي. :error',
'unhealthy_backup_found_empty' => 'لا توجد نسخ احتياطية لهذا التطبيق على الإطلاق.',
'unhealthy_backup_found_old' => 'تم إنشاء أحدث النسخ الاحتياطية في :date وتعتبر قديمة جدا.',
'unhealthy_backup_found_unknown' => 'عذرا، لا يمكن تحديد سبب دقيق.',
'unhealthy_backup_found_full' => 'النسخ الاحتياطية تستخدم الكثير من التخزين. الاستخدام الحالي هو :disk_usage وهو أعلى من الحد المسموح به من :disk_limit.',
'no_backups_info' => 'لم يتم عمل نسخ احتياطية حتى الآن',
'application_name' => 'اسم التطبيق',
'backup_name' => 'اسم النسخ الاحتياطي',
'disk' => 'القرص',
'newest_backup_size' => 'أحدث حجم للنسخ الاحتياطي',
'number_of_backups' => 'عدد النسخ الاحتياطية',
'total_storage_used' => 'إجمالي مساحة التخزين المستخدمة',
'newest_backup_date' => 'أحدث تاريخ النسخ الاحتياطي',
'oldest_backup_date' => 'أقدم تاريخ نسخ احتياطي',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Съобщение за изключение: :message',
'exception_trace' => 'Проследяване на изключение: :trace',
'exception_message_title' => 'Съобщение за изключение',
'exception_trace_title' => 'Проследяване на изключение',
'backup_failed_subject' => 'Неуспешно резервно копие на :application_name',
'backup_failed_body' => 'Важно: Възникна грешка при архивиране на :application_name',
'backup_successful_subject' => 'Успешно ново резервно копие на :application_name',
'backup_successful_subject_title' => 'Успешно ново резервно копие!',
'backup_successful_body' => 'Чудесни новини, ново резервно копие на :application_name беше успешно създадено на диска с име :disk_name.',
'cleanup_failed_subject' => 'Почистването на резервните копия на :application_name не бе успешно.',
'cleanup_failed_body' => 'Възникна грешка при почистването на резервните копия на :application_name',
'cleanup_successful_subject' => 'Почистването на архивите на :application_name е успешно',
'cleanup_successful_subject_title' => 'Почистването на резервните копия е успешно!',
'cleanup_successful_body' => 'Почистването на резервни копия на :application_name на диска с име :disk_name беше успешно.',
'healthy_backup_found_subject' => 'Резервните копия за :application_name на диск :disk_name са здрави',
'healthy_backup_found_subject_title' => 'Резервните копия за :application_name са здрави',
'healthy_backup_found_body' => 'Резервните копия за :application_name се считат за здрави. Добра работа!',
'unhealthy_backup_found_subject' => 'Важно: Резервните копия за :application_name не са здрави',
'unhealthy_backup_found_subject_title' => 'Важно: Резервните копия за :application_name не са здрави. :проблем',
'unhealthy_backup_found_body' => 'Резервните копия за :application_name на диск :disk_name не са здрави.',
'unhealthy_backup_found_not_reachable' => 'Дестинацията за резервни копия не може да бъде достигната. :грешка',
'unhealthy_backup_found_empty' => 'Изобщо няма резервни копия на това приложение.',
'unhealthy_backup_found_old' => 'Последното резервно копие, направено на :date, се счита за твърде старо.',
'unhealthy_backup_found_unknown' => 'За съжаление не може да се определи точна причина.',
'unhealthy_backup_found_full' => 'Резервните копия използват твърде много място за съхранение. Текущото използване е :disk_usage, което е по-високо от разрешеното ограничение на :disk_limit.',
'no_backups_info' => 'Все още не са правени резервни копия',
'application_name' => 'Име на приложението',
'backup_name' => 'Име на резервно копие',
'disk' => 'Диск',
'newest_backup_size' => 'Най-новият размер на резервно копие',
'number_of_backups' => 'Брой резервни копия',
'total_storage_used' => 'Общо използвано дисково пространство',
'newest_backup_date' => 'Най-нова дата на резервно копие',
'oldest_backup_date' => 'Най-старата дата на резервно копие',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'এক্সসেপশন বার্তা: :message',
'exception_trace' => 'এক্সসেপশন ট্রেস: :trace',
'exception_message_title' => 'এক্সসেপশন message',
'exception_trace_title' => 'এক্সসেপশন ট্রেস',
'backup_failed_subject' => ':application_name এর ব্যাকআপ ব্যর্থ হয়েছে।',
'backup_failed_body' => 'গুরুত্বপূর্ণঃ :application_name ব্যাক আপ করার সময় একটি ত্রুটি ঘটেছে।',
'backup_successful_subject' => ':application_name এর নতুন ব্যাকআপ সফল হয়েছে।',
'backup_successful_subject_title' => 'নতুন ব্যাকআপ সফল হয়েছে!',
'backup_successful_body' => 'খুশির খবর, :application_name এর নতুন ব্যাকআপ :disk_name ডিস্কে সফলভাবে তৈরি হয়েছে।',
'cleanup_failed_subject' => ':application_name ব্যাকআপগুলি সাফ করতে ব্যর্থ হয়েছে।',
'cleanup_failed_body' => ':application_name ব্যাকআপগুলি সাফ করার সময় একটি ত্রুটি ঘটেছে।',
'cleanup_successful_subject' => ':application_name এর ব্যাকআপগুলি সফলভাবে সাফ করা হয়েছে।',
'cleanup_successful_subject_title' => 'ব্যাকআপগুলি সফলভাবে সাফ করা হয়েছে!',
'cleanup_successful_body' => ':application_name এর ব্যাকআপগুলি :disk_name ডিস্ক থেকে সফলভাবে সাফ করা হয়েছে।',
'healthy_backup_found_subject' => ':application_name এর ব্যাকআপগুলি :disk_name ডিস্কে স্বাস্থ্যকর অবস্থায় আছে।',
'healthy_backup_found_subject_title' => ':application_name এর ব্যাকআপগুলি স্বাস্থ্যকর অবস্থায় আছে।',
'healthy_backup_found_body' => ':application_name এর ব্যাকআপগুলি স্বাস্থ্যকর বিবেচনা করা হচ্ছে। Good job!',
'unhealthy_backup_found_subject' => 'গুরুত্বপূর্ণঃ :application_name এর ব্যাকআপগুলি অস্বাস্থ্যকর অবস্থায় আছে।',
'unhealthy_backup_found_subject_title' => 'গুরুত্বপূর্ণঃ :application_name এর ব্যাকআপগুলি অস্বাস্থ্যকর অবস্থায় আছে। :problem',
'unhealthy_backup_found_body' => ':disk_name ডিস্কের :application_name এর ব্যাকআপগুলি অস্বাস্থ্যকর অবস্থায় আছে।',
'unhealthy_backup_found_not_reachable' => 'ব্যাকআপ গন্তব্যে পৌঁছানো যায় নি। :error',
'unhealthy_backup_found_empty' => 'এই অ্যাপ্লিকেশনটির কোনও ব্যাকআপ নেই।',
'unhealthy_backup_found_old' => 'সর্বশেষ ব্যাকআপ যেটি :date এই তারিখে করা হয়েছে, সেটি খুব পুরানো।',
'unhealthy_backup_found_unknown' => 'দুঃখিত, সঠিক কারণ নির্ধারণ করা সম্ভব হয়নি।',
'unhealthy_backup_found_full' => 'ব্যাকআপগুলি অতিরিক্ত স্টোরেজ ব্যবহার করছে। বর্তমান ব্যবহারের পরিমান :disk_usage যা অনুমোদিত সীমা :disk_limit এর বেশি।',
'no_backups_info' => 'কোনো ব্যাকআপ এখনও তৈরি হয়নি',
'application_name' => 'আবেদনের নাম',
'backup_name' => 'ব্যাকআপের নাম',
'disk' => 'ডিস্ক',
'newest_backup_size' => 'নতুন ব্যাকআপ আকার',
'number_of_backups' => 'ব্যাকআপের সংখ্যা',
'total_storage_used' => 'ব্যবহৃত মোট সঞ্চয়স্থান',
'newest_backup_date' => 'নতুন ব্যাকআপের তারিখ',
'oldest_backup_date' => 'পুরানো ব্যাকআপের তারিখ',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Zpráva výjimky: :message',
'exception_trace' => 'Stopa výjimky: :trace',
'exception_message_title' => 'Zpráva výjimky',
'exception_trace_title' => 'Stopa výjimky',
'backup_failed_subject' => 'Záloha :application_name neuspěla',
'backup_failed_body' => 'Důležité: Při záloze :application_name se vyskytla chyba',
'backup_successful_subject' => 'Úspěšná nová záloha :application_name',
'backup_successful_subject_title' => 'Úspěšná nová záloha!',
'backup_successful_body' => 'Dobrá zpráva, na disku jménem :disk_name byla úspěšně vytvořena nová záloha :application_name.',
'cleanup_failed_subject' => 'Vyčištění záloh :application_name neuspělo.',
'cleanup_failed_body' => 'Při čištění záloh :application_name se vyskytla chyba',
'cleanup_successful_subject' => 'Vyčištění záloh :application_name úspěšné',
'cleanup_successful_subject_title' => 'Vyčištění záloh bylo úspěšné!',
'cleanup_successful_body' => 'Vyčištění záloh :application_name na disku jménem :disk_name bylo úspěšné.',
'healthy_backup_found_subject' => 'Zálohy pro :application_name na disku :disk_name jsou zdravé',
'healthy_backup_found_subject_title' => 'Zálohy pro :application_name jsou zdravé',
'healthy_backup_found_body' => 'Zálohy pro :application_name jsou považovány za zdravé. Dobrá práce!',
'unhealthy_backup_found_subject' => 'Důležité: Zálohy pro :application_name jsou nezdravé',
'unhealthy_backup_found_subject_title' => 'Důležité: Zálohy pro :application_name jsou nezdravé. :problem',
'unhealthy_backup_found_body' => 'Zálohy pro :application_name na disku :disk_name jsou nezdravé.',
'unhealthy_backup_found_not_reachable' => 'Nelze se dostat k cíli zálohy. :error',
'unhealthy_backup_found_empty' => 'Tato aplikace nemá vůbec žádné zálohy.',
'unhealthy_backup_found_old' => 'Poslední záloha vytvořená dne :date je považována za příliš starou.',
'unhealthy_backup_found_unknown' => 'Omlouváme se, nemůžeme určit přesný důvod.',
'unhealthy_backup_found_full' => 'Zálohy zabírají příliš mnoho místa na disku. Aktuální využití disku je :disk_usage, což je vyšší než povolený limit :disk_limit.',
'no_backups_info' => 'Zatím nebyly vytvořeny žádné zálohy',
'application_name' => 'Název aplikace',
'backup_name' => 'Název zálohy',
'disk' => 'Disk',
'newest_backup_size' => 'Velikost nejnovější zálohy',
'number_of_backups' => 'Počet záloh',
'total_storage_used' => 'Celková využitá kapacita úložiště',
'newest_backup_date' => 'Datum nejnovější zálohy',
'oldest_backup_date' => 'Datum nejstarší zálohy',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Fejlbesked: :message',
'exception_trace' => 'Fejl trace: :trace',
'exception_message_title' => 'Fejlbesked',
'exception_trace_title' => 'Fejl trace',
'backup_failed_subject' => 'Backup af :application_name fejlede',
'backup_failed_body' => 'Vigtigt: Der skete en fejl under backup af :application_name',
'backup_successful_subject' => 'Ny backup af :application_name oprettet',
'backup_successful_subject_title' => 'Ny backup!',
'backup_successful_body' => 'Gode nyheder - der blev oprettet en ny backup af :application_name på disken :disk_name.',
'cleanup_failed_subject' => 'Oprydning af backups for :application_name fejlede.',
'cleanup_failed_body' => 'Der skete en fejl under oprydning af backups for :application_name',
'cleanup_successful_subject' => 'Oprydning af backups for :application_name gennemført',
'cleanup_successful_subject_title' => 'Backup oprydning gennemført!',
'cleanup_successful_body' => 'Oprydningen af backups for :application_name på disken :disk_name er gennemført.',
'healthy_backup_found_subject' => 'Alle backups for :application_name på disken :disk_name er OK',
'healthy_backup_found_subject_title' => 'Alle backups for :application_name er OK',
'healthy_backup_found_body' => 'Alle backups for :application_name er ok. Godt gået!',
'unhealthy_backup_found_subject' => 'Vigtigt: Backups for :application_name fejlbehæftede',
'unhealthy_backup_found_subject_title' => 'Vigtigt: Backups for :application_name er fejlbehæftede. :problem',
'unhealthy_backup_found_body' => 'Backups for :application_name på disken :disk_name er fejlbehæftede.',
'unhealthy_backup_found_not_reachable' => 'Backup destinationen kunne ikke findes. :error',
'unhealthy_backup_found_empty' => 'Denne applikation har ingen backups overhovedet.',
'unhealthy_backup_found_old' => 'Den seneste backup fra :date er for gammel.',
'unhealthy_backup_found_unknown' => 'Beklager, en præcis årsag kunne ikke findes.',
'unhealthy_backup_found_full' => 'Backups bruger for meget plads. Nuværende disk forbrug er :disk_usage, hvilket er mere end den tilladte grænse på :disk_limit.',
'no_backups_info' => 'Der blev ikke foretaget nogen sikkerhedskopier endnu',
'application_name' => 'Applikationens navn',
'backup_name' => 'Backup navn',
'disk' => 'Disk',
'newest_backup_size' => 'Nyeste backup-størrelse',
'number_of_backups' => 'Antal sikkerhedskopier',
'total_storage_used' => 'Samlet lagerplads brugt',
'newest_backup_date' => 'Nyeste backup-størrelse',
'oldest_backup_date' => 'Ældste backup-størrelse',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Fehlermeldung: :message',
'exception_trace' => 'Fehlerverfolgung: :trace',
'exception_message_title' => 'Fehlermeldung',
'exception_trace_title' => 'Fehlerverfolgung',
'backup_failed_subject' => 'Backup von :application_name konnte nicht erstellt werden',
'backup_failed_body' => 'Wichtig: Beim Backup von :application_name ist ein Fehler aufgetreten',
'backup_successful_subject' => 'Erfolgreiches neues Backup von :application_name',
'backup_successful_subject_title' => 'Erfolgreiches neues Backup!',
'backup_successful_body' => 'Gute Nachrichten, ein neues Backup von :application_name wurde erfolgreich erstellt und in :disk_name gepeichert.',
'cleanup_failed_subject' => 'Aufräumen der Backups von :application_name schlug fehl.',
'cleanup_failed_body' => 'Beim aufräumen der Backups von :application_name ist ein Fehler aufgetreten',
'cleanup_successful_subject' => 'Aufräumen der Backups von :application_name backups erfolgreich',
'cleanup_successful_subject_title' => 'Aufräumen der Backups erfolgreich!',
'cleanup_successful_body' => 'Aufräumen der Backups von :application_name in :disk_name war erfolgreich.',
'healthy_backup_found_subject' => 'Die Backups von :application_name in :disk_name sind gesund',
'healthy_backup_found_subject_title' => 'Die Backups von :application_name sind Gesund',
'healthy_backup_found_body' => 'Die Backups von :application_name wurden als gesund eingestuft. Gute Arbeit!',
'unhealthy_backup_found_subject' => 'Wichtig: Die Backups für :application_name sind nicht gesund',
'unhealthy_backup_found_subject_title' => 'Wichtig: Die Backups für :application_name sind ungesund. :problem',
'unhealthy_backup_found_body' => 'Die Backups für :application_name in :disk_name sind ungesund.',
'unhealthy_backup_found_not_reachable' => 'Das Backup Ziel konnte nicht erreicht werden. :error',
'unhealthy_backup_found_empty' => 'Es gibt für die Anwendung noch gar keine Backups.',
'unhealthy_backup_found_old' => 'Das letzte Backup am :date ist zu lange her.',
'unhealthy_backup_found_unknown' => 'Sorry, ein genauer Grund konnte nicht gefunden werden.',
'unhealthy_backup_found_full' => 'Die Backups verbrauchen zu viel Platz. Aktuell wird :disk_usage belegt, dass ist höher als das erlaubte Limit von :disk_limit.',
'no_backups_info' => 'Bisher keine Backups vorhanden',
'application_name' => 'Applikationsname',
'backup_name' => 'Backup Name',
'disk' => 'Speicherort',
'newest_backup_size' => 'Neuste Backup-Größe',
'number_of_backups' => 'Anzahl Backups',
'total_storage_used' => 'Gesamter genutzter Speicherplatz',
'newest_backup_date' => 'Neustes Backup',
'oldest_backup_date' => 'Ältestes Backup',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Exception message: :message',
'exception_trace' => 'Exception trace: :trace',
'exception_message_title' => 'Exception message',
'exception_trace_title' => 'Exception trace',
'backup_failed_subject' => 'Failed backup of :application_name',
'backup_failed_body' => 'Important: An error occurred while backing up :application_name',
'backup_successful_subject' => 'Successful new backup of :application_name',
'backup_successful_subject_title' => 'Successful new backup!',
'backup_successful_body' => 'Great news, a new backup of :application_name was successfully created on the disk named :disk_name.',
'cleanup_failed_subject' => 'Cleaning up the backups of :application_name failed.',
'cleanup_failed_body' => 'An error occurred while cleaning up the backups of :application_name',
'cleanup_successful_subject' => 'Clean up of :application_name backups successful',
'cleanup_successful_subject_title' => 'Clean up of backups successful!',
'cleanup_successful_body' => 'The clean up of the :application_name backups on the disk named :disk_name was successful.',
'healthy_backup_found_subject' => 'The backups for :application_name on disk :disk_name are healthy',
'healthy_backup_found_subject_title' => 'The backups for :application_name are healthy',
'healthy_backup_found_body' => 'The backups for :application_name are considered healthy. Good job!',
'unhealthy_backup_found_subject' => 'Important: The backups for :application_name are unhealthy',
'unhealthy_backup_found_subject_title' => 'Important: The backups for :application_name are unhealthy. :problem',
'unhealthy_backup_found_body' => 'The backups for :application_name on disk :disk_name are unhealthy.',
'unhealthy_backup_found_not_reachable' => 'The backup destination cannot be reached. :error',
'unhealthy_backup_found_empty' => 'There are no backups of this application at all.',
'unhealthy_backup_found_old' => 'The latest backup made on :date is considered too old.',
'unhealthy_backup_found_unknown' => 'Sorry, an exact reason cannot be determined.',
'unhealthy_backup_found_full' => 'The backups are using too much storage. Current usage is :disk_usage which is higher than the allowed limit of :disk_limit.',
'no_backups_info' => 'No backups were made yet',
'application_name' => 'Application name',
'backup_name' => 'Backup name',
'disk' => 'Disk',
'newest_backup_size' => 'Newest backup size',
'number_of_backups' => 'Number of backups',
'total_storage_used' => 'Total storage used',
'newest_backup_date' => 'Newest backup date',
'oldest_backup_date' => 'Oldest backup date',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Mensaje de la excepción: :message',
'exception_trace' => 'Traza de la excepción: :trace',
'exception_message_title' => 'Mensaje de la excepción',
'exception_trace_title' => 'Traza de la excepción',
'backup_failed_subject' => 'Copia de seguridad de :application_name fallida',
'backup_failed_body' => 'Importante: Ocurrió un error al realizar la copia de seguridad de :application_name',
'backup_successful_subject' => 'Se completó con éxito la copia de seguridad de :application_name',
'backup_successful_subject_title' => '¡Nueva copia de seguridad creada con éxito!',
'backup_successful_body' => 'Buenas noticias, una nueva copia de seguridad de :application_name fue creada con éxito en el disco llamado :disk_name.',
'cleanup_failed_subject' => 'La limpieza de copias de seguridad de :application_name falló.',
'cleanup_failed_body' => 'Ocurrió un error mientras se realizaba la limpieza de copias de seguridad de :application_name',
'cleanup_successful_subject' => 'La limpieza de copias de seguridad de :application_name se completó con éxito',
'cleanup_successful_subject_title' => '!Limpieza de copias de seguridad completada con éxito!',
'cleanup_successful_body' => 'La limpieza de copias de seguridad de :application_name en el disco llamado :disk_name se completo con éxito.',
'healthy_backup_found_subject' => 'Las copias de seguridad de :application_name en el disco :disk_name están en buen estado',
'healthy_backup_found_subject_title' => 'Las copias de seguridad de :application_name están en buen estado',
'healthy_backup_found_body' => 'Las copias de seguridad de :application_name se consideran en buen estado. ¡Buen trabajo!',
'unhealthy_backup_found_subject' => 'Importante: Las copias de seguridad de :application_name están en mal estado',
'unhealthy_backup_found_subject_title' => 'Importante: Las copias de seguridad de :application_name están en mal estado. :problem',
'unhealthy_backup_found_body' => 'Las copias de seguridad de :application_name en el disco :disk_name están en mal estado.',
'unhealthy_backup_found_not_reachable' => 'No se puede acceder al destino de la copia de seguridad. :error',
'unhealthy_backup_found_empty' => 'No existe ninguna copia de seguridad de esta aplicación.',
'unhealthy_backup_found_old' => 'La última copia de seguriad hecha en :date es demasiado antigua.',
'unhealthy_backup_found_unknown' => 'Lo siento, no es posible determinar la razón exacta.',
'unhealthy_backup_found_full' => 'Las copias de seguridad están ocupando demasiado espacio. El espacio utilizado actualmente es :disk_usage el cual es mayor que el límite permitido de :disk_limit.',
'no_backups_info' => 'Aún no se hicieron copias de seguridad',
'application_name' => 'Nombre de la aplicación',
'backup_name' => 'Nombre de la copia de seguridad',
'disk' => 'Disco',
'newest_backup_size' => 'Tamaño de copia de seguridad más reciente',
'number_of_backups' => 'Número de copias de seguridad',
'total_storage_used' => 'Almacenamiento total utilizado',
'newest_backup_date' => 'Fecha de la copia de seguridad más reciente',
'oldest_backup_date' => 'Fecha de la copia de seguridad más antigua',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'پیغام خطا: :message',
'exception_trace' => 'جزییات خطا: :trace',
'exception_message_title' => 'پیغام خطا',
'exception_trace_title' => 'جزییات خطا',
'backup_failed_subject' => 'پشتیبان‌گیری :application_name با خطا مواجه شد.',
'backup_failed_body' => 'پیغام مهم: هنگام پشتیبان‌گیری از :application_name خطایی رخ داده است. ',
'backup_successful_subject' => 'نسخه پشتیبان جدید :application_name با موفقیت ساخته شد.',
'backup_successful_subject_title' => 'پشتیبان‌گیری موفق!',
'backup_successful_body' => 'خبر خوب، به تازگی نسخه پشتیبان :application_name روی دیسک :disk_name با موفقیت ساخته شد. ',
'cleanup_failed_subject' => 'پاک‌‌سازی نسخه پشتیبان :application_name انجام نشد.',
'cleanup_failed_body' => 'هنگام پاک‌سازی نسخه پشتیبان :application_name خطایی رخ داده است.',
'cleanup_successful_subject' => 'پاک‌سازی نسخه پشتیبان :application_name با موفقیت انجام شد.',
'cleanup_successful_subject_title' => 'پاک‌سازی نسخه پشتیبان!',
'cleanup_successful_body' => 'پاک‌سازی نسخه پشتیبان :application_name روی دیسک :disk_name با موفقیت انجام شد.',
'healthy_backup_found_subject' => 'نسخه پشتیبان :application_name روی دیسک :disk_name سالم بود.',
'healthy_backup_found_subject_title' => 'نسخه پشتیبان :application_name سالم بود.',
'healthy_backup_found_body' => 'نسخه پشتیبان :application_name به نظر سالم میاد. دمت گرم!',
'unhealthy_backup_found_subject' => 'خبر مهم: نسخه پشتیبان :application_name سالم نبود.',
'unhealthy_backup_found_subject_title' => 'خبر مهم: نسخه پشتیبان :application_name سالم نبود. :problem',
'unhealthy_backup_found_body' => 'نسخه پشتیبان :application_name روی دیسک :disk_name سالم نبود.',
'unhealthy_backup_found_not_reachable' => 'مقصد پشتیبان‌گیری در دسترس نبود. :error',
'unhealthy_backup_found_empty' => 'برای این برنامه هیچ نسخه پشتیبانی وجود ندارد.',
'unhealthy_backup_found_old' => 'آخرین نسخه پشتیبان برای تاریخ :date است، که به نظر خیلی قدیمی میاد. ',
'unhealthy_backup_found_unknown' => 'متاسفانه دلیل دقیقی قابل تعیین نیست.',
'unhealthy_backup_found_full' => 'نسخه‌های پشتیبان حجم زیادی اشغال کرده‌اند. میزان دیسک استفاده‌شده :disk_usage است که از میزان مجاز :disk_limit فراتر رفته است. ',
'no_backups_info' => 'هنوز نسخه پشتیبان تهیه نشده است',
'application_name' => 'نام نرم‌افزار',
'backup_name' => 'نام نسخه پشتیبان',
'disk' => 'دیسک',
'newest_backup_size' => 'اندازه جدیدترین نسخه پشتیبان',
'number_of_backups' => 'تعداد نسخه‌های پشتیبان',
'total_storage_used' => 'کل فضای ذخیره‌سازی استفاده‌شده',
'newest_backup_date' => 'تاریخ جدیدترین نسخه پشتیبان',
'oldest_backup_date' => 'تاریخ قدیمی‌ترین نسخه پشتیبان',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Virheilmoitus: :message',
'exception_trace' => 'Virhe, jäljitys: :trace',
'exception_message_title' => 'Virheilmoitus',
'exception_trace_title' => 'Virheen jäljitys',
'backup_failed_subject' => ':application_name varmuuskopiointi epäonnistui',
'backup_failed_body' => 'HUOM!: :application_name varmuuskoipionnissa tapahtui virhe',
'backup_successful_subject' => ':application_name varmuuskopioitu onnistuneesti',
'backup_successful_subject_title' => 'Uusi varmuuskopio!',
'backup_successful_body' => 'Hyviä uutisia! :application_name on varmuuskopioitu levylle :disk_name.',
'cleanup_failed_subject' => ':application_name varmuuskopioiden poistaminen epäonnistui.',
'cleanup_failed_body' => ':application_name varmuuskopioiden poistamisessa tapahtui virhe.',
'cleanup_successful_subject' => ':application_name varmuuskopiot poistettu onnistuneesti',
'cleanup_successful_subject_title' => 'Varmuuskopiot poistettu onnistuneesti!',
'cleanup_successful_body' => ':application_name varmuuskopiot poistettu onnistuneesti levyltä :disk_name.',
'healthy_backup_found_subject' => ':application_name varmuuskopiot levyllä :disk_name ovat kunnossa',
'healthy_backup_found_subject_title' => ':application_name varmuuskopiot ovat kunnossa',
'healthy_backup_found_body' => ':application_name varmuuskopiot ovat kunnossa. Hieno homma!',
'unhealthy_backup_found_subject' => 'HUOM!: :application_name varmuuskopiot ovat vialliset',
'unhealthy_backup_found_subject_title' => 'HUOM!: :application_name varmuuskopiot ovat vialliset. :problem',
'unhealthy_backup_found_body' => ':application_name varmuuskopiot levyllä :disk_name ovat vialliset.',
'unhealthy_backup_found_not_reachable' => 'Varmuuskopioiden kohdekansio ei ole saatavilla. :error',
'unhealthy_backup_found_empty' => 'Tästä sovelluksesta ei ole varmuuskopioita.',
'unhealthy_backup_found_old' => 'Viimeisin varmuuskopio, luotu :date, on liian vanha.',
'unhealthy_backup_found_unknown' => 'Virhe, tarkempaa tietoa syystä ei valitettavasti ole saatavilla.',
'unhealthy_backup_found_full' => 'Varmuuskopiot vievät liikaa levytilaa. Tällä hetkellä käytössä :disk_usage, mikä on suurempi kuin sallittu tilavuus (:disk_limit).',
'no_backups_info' => 'Varmuuskopioita ei vielä tehty',
'application_name' => 'Sovelluksen nimi',
'backup_name' => 'Varmuuskopion nimi',
'disk' => 'Levy',
'newest_backup_size' => 'Uusin varmuuskopion koko',
'number_of_backups' => 'Varmuuskopioiden määrä',
'total_storage_used' => 'Käytetty tallennustila yhteensä',
'newest_backup_date' => 'Uusin varmuuskopion koko',
'oldest_backup_date' => 'Vanhin varmuuskopion koko',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => "Message de l'exception : :message",
'exception_trace' => "Trace de l'exception : :trace",
'exception_message_title' => "Message de l'exception",
'exception_trace_title' => "Trace de l'exception",
'backup_failed_subject' => 'Échec de la sauvegarde de :application_name',
'backup_failed_body' => 'Important : Une erreur est survenue lors de la sauvegarde de :application_name',
'backup_successful_subject' => 'Succès de la sauvegarde de :application_name',
'backup_successful_subject_title' => 'Sauvegarde créée avec succès !',
'backup_successful_body' => 'Bonne nouvelle, une nouvelle sauvegarde de :application_name a été créée avec succès sur le disque nommé :disk_name.',
'cleanup_failed_subject' => 'Le nettoyage des sauvegardes de :application_name a echoué.',
'cleanup_failed_body' => 'Une erreur est survenue lors du nettoyage des sauvegardes de :application_name',
'cleanup_successful_subject' => 'Succès du nettoyage des sauvegardes de :application_name',
'cleanup_successful_subject_title' => 'Sauvegardes nettoyées avec succès !',
'cleanup_successful_body' => 'Le nettoyage des sauvegardes de :application_name sur le disque nommé :disk_name a été effectué avec succès.',
'healthy_backup_found_subject' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont saines',
'healthy_backup_found_subject_title' => 'Les sauvegardes pour :application_name sont saines',
'healthy_backup_found_body' => 'Les sauvegardes pour :application_name sont considérées saines. Bon travail !',
'unhealthy_backup_found_subject' => 'Important : Les sauvegardes pour :application_name sont corrompues',
'unhealthy_backup_found_subject_title' => 'Important : Les sauvegardes pour :application_name sont corrompues. :problem',
'unhealthy_backup_found_body' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont corrompues.',
'unhealthy_backup_found_not_reachable' => "La destination de la sauvegarde n'est pas accessible. :error",
'unhealthy_backup_found_empty' => "Il n'y a aucune sauvegarde pour cette application.",
'unhealthy_backup_found_old' => 'La dernière sauvegarde du :date est considérée trop vieille.',
'unhealthy_backup_found_unknown' => 'Désolé, une raison exacte ne peut être déterminée.',
'unhealthy_backup_found_full' => 'Les sauvegardes utilisent trop d\'espace disque. L\'utilisation actuelle est de :disk_usage alors que la limite autorisée est de :disk_limit.',
'no_backups_info' => 'Aucune sauvegarde n\'a encore été effectuée',
'application_name' => "Nom de l'application",
'backup_name' => 'Nom de la sauvegarde',
'disk' => 'Disque',
'newest_backup_size' => 'Taille de la sauvegarde la plus récente',
'number_of_backups' => 'Nombre de sauvegardes',
'total_storage_used' => 'Stockage total utilisé',
'newest_backup_date' => 'Date de la sauvegarde la plus récente',
'oldest_backup_date' => 'Date de la sauvegarde la plus ancienne',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'הודעת חריגה: :message',
'exception_trace' => 'מעקב חריגה: :trace',
'exception_message_title' => 'הודעת חריגה',
'exception_trace_title' => 'מעקב חריגה',
'backup_failed_subject' => 'כשל בגיבוי של :application_name',
'backup_failed_body' => 'חשוב: אירעה שגיאה במהלך גיבוי היישום :application_name',
'backup_successful_subject' => 'גיבוי חדש מוצלח של :application_name',
'backup_successful_subject_title' => 'גיבוי חדש מוצלח!',
'backup_successful_body' => 'חדשות טובות, גיבוי חדש של :application_name נוצר בהצלחה על הדיסק בשם :disk_name.',
'cleanup_failed_subject' => 'נכשל בניקוי הגיבויים של :application_name',
'cleanup_failed_body' => 'אירעה שגיאה במהלך ניקוי הגיבויים של :application_name',
'cleanup_successful_subject' => 'ניקוי הגיבויים של :application_name בוצע בהצלחה',
'cleanup_successful_subject_title' => 'ניקוי הגיבויים בוצע בהצלחה!',
'cleanup_successful_body' => 'ניקוי הגיבויים של :application_name על הדיסק בשם :disk_name בוצע בהצלחה.',
'healthy_backup_found_subject' => 'הגיבויים של :application_name על הדיסק :disk_name תקינים',
'healthy_backup_found_subject_title' => 'הגיבויים של :application_name תקינים',
'healthy_backup_found_body' => 'הגיבויים של :application_name נחשבים לתקינים. עבודה טובה!',
'unhealthy_backup_found_subject' => 'חשוב: הגיבויים של :application_name אינם תקינים',
'unhealthy_backup_found_subject_title' => 'חשוב: הגיבויים של :application_name אינם תקינים. :problem',
'unhealthy_backup_found_body' => 'הגיבויים של :application_name על הדיסק :disk_name אינם תקינים.',
'unhealthy_backup_found_not_reachable' => 'לא ניתן להגיע ליעד הגיבוי. :error',
'unhealthy_backup_found_empty' => 'אין גיבויים של היישום הזה בכלל.',
'unhealthy_backup_found_old' => 'הגיבוי האחרון שנעשה בתאריך :date נחשב כישן מדי.',
'unhealthy_backup_found_unknown' => 'מצטערים, לא ניתן לקבוע סיבה מדויקת.',
'unhealthy_backup_found_full' => 'הגיבויים משתמשים בשטח אחסון רב מידי. שימוש הנוכחי הוא :disk_usage, שגבול המותר הוא :disk_limit.',
'no_backups_info' => 'לא נעשו עדיין גיבויים',
'application_name' => 'שם היישום',
'backup_name' => 'שם הגיבוי',
'disk' => 'דיסק',
'newest_backup_size' => 'גודל הגיבוי החדש ביותר',
'number_of_backups' => 'מספר הגיבויים',
'total_storage_used' => 'סך האחסון המופעל',
'newest_backup_date' => 'תאריך הגיבוי החדש ביותר',
'oldest_backup_date' => 'תאריך הגיבוי הישן ביותר',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'अपवाद संदेश: :message',
'exception_trace' => 'अपवाद निशान: :trace',
'exception_message_title' => 'अपवादी संदेश',
'exception_trace_title' => 'अपवाद निशान',
'backup_failed_subject' => ':application_name का बैकअप असफल रहा',
'backup_failed_body' => 'जरूरी सुचना: :application_name का बैकअप लेते समय असफल रहे',
'backup_successful_subject' => ':application_name का बैकअप सफल रहा',
'backup_successful_subject_title' => 'बैकअप सफल रहा!',
'backup_successful_body' => 'खुशखबर, :application_name का बैकअप :disk_name पर संग्रहित करने मे सफल रहे.',
'cleanup_failed_subject' => ':application_name के बैकअप की सफाई असफल रही.',
'cleanup_failed_body' => ':application_name के बैकअप की सफाई करते समय कुछ बाधा आयी है.',
'cleanup_successful_subject' => ':application_name के बैकअप की सफाई सफल रही',
'cleanup_successful_subject_title' => 'बैकअप की सफाई सफल रही!',
'cleanup_successful_body' => ':application_name का बैकअप जो :disk_name नाम की डिस्क पर संग्रहित है, उसकी सफाई सफल रही.',
'healthy_backup_found_subject' => ':disk_name नाम की डिस्क पर संग्रहित :application_name के बैकअप स्वस्थ है',
'healthy_backup_found_subject_title' => ':application_name के सभी बैकअप स्वस्थ है',
'healthy_backup_found_body' => 'बहुत बढ़िया! :application_name के सभी बैकअप स्वस्थ है.',
'unhealthy_backup_found_subject' => 'जरूरी सुचना : :application_name के बैकअप अस्वस्थ है',
'unhealthy_backup_found_subject_title' => 'जरूरी सुचना : :application_name के बैकअप :problem के बजेसे अस्वस्थ है',
'unhealthy_backup_found_body' => ':disk_name नाम की डिस्क पर संग्रहित :application_name के बैकअप अस्वस्थ है',
'unhealthy_backup_found_not_reachable' => ':error के बजेसे बैकअप की मंजिल तक पोहोच नहीं सकते.',
'unhealthy_backup_found_empty' => 'इस एप्लीकेशन का कोई भी बैकअप नहीं है.',
'unhealthy_backup_found_old' => 'हालहीमें :date को लिया हुआ बैकअप बहुत पुराना है.',
'unhealthy_backup_found_unknown' => 'माफ़ कीजिये, सही कारण निर्धारित नहीं कर सकते.',
'unhealthy_backup_found_full' => 'सभी बैकअप बहुत ज्यादा जगह का उपयोग कर रहे है. फ़िलहाल सभी बैकअप :disk_usage जगह का उपयोग कर रहे है, जो की :disk_limit अनुमति सीमा से अधिक का है.',
'no_backups_info' => 'अभी तक कोई बैकअप नहीं बनाया गया था',
'application_name' => 'आवेदन का नाम',
'backup_name' => 'बैकअप नाम',
'disk' => 'डिस्क',
'newest_backup_size' => 'नवीनतम बैकअप आकार',
'number_of_backups' => 'बैकअप की संख्या',
'total_storage_used' => 'उपयोग किया गया कुल संग्रहण',
'newest_backup_date' => 'नवीनतम बैकअप आकार',
'oldest_backup_date' => 'सबसे पुराना बैकअप आकार',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Greška: :message',
'exception_trace' => 'Praćenje greške: :trace',
'exception_message_title' => 'Greška',
'exception_trace_title' => 'Praćenje greške',
'backup_failed_subject' => 'Neuspješno sigurnosno kopiranje za :application_name',
'backup_failed_body' => 'Važno: Došlo je do greške prilikom sigurnosnog kopiranja za :application_name',
'backup_successful_subject' => 'Uspješno sigurnosno kopiranje za :application_name',
'backup_successful_subject_title' => 'Uspješno sigurnosno kopiranje!',
'backup_successful_body' => 'Nova sigurnosna kopija za :application_name je uspješno spremljena na disk :disk_name.',
'cleanup_failed_subject' => 'Neuspješno čišćenje sigurnosnih kopija za :application_name',
'cleanup_failed_body' => 'Došlo je do greške prilikom čišćenja sigurnosnih kopija za :application_name',
'cleanup_successful_subject' => 'Uspješno čišćenje sigurnosnih kopija za :application_name',
'cleanup_successful_subject_title' => 'Uspješno čišćenje sigurnosnih kopija!',
'cleanup_successful_body' => 'Sigurnosne kopije za :application_name su uspješno očišćene s diska :disk_name.',
'healthy_backup_found_subject' => 'Sigurnosne kopije za :application_name na disku :disk_name su zdrave',
'healthy_backup_found_subject_title' => 'Sigurnosne kopije za :application_name su zdrave',
'healthy_backup_found_body' => 'Sigurnosne kopije za :application_name se smatraju zdravima. Svaka čast!',
'unhealthy_backup_found_subject' => 'Važno: Sigurnosne kopije za :application_name su nezdrave',
'unhealthy_backup_found_subject_title' => 'Važno: Sigurnosne kopije za :application_name su nezdrave. :problem',
'unhealthy_backup_found_body' => 'Sigurnosne kopije za :application_name na disku :disk_name su nezdrave.',
'unhealthy_backup_found_not_reachable' => 'Destinacija sigurnosne kopije nije dohvatljiva. :error',
'unhealthy_backup_found_empty' => 'Nijedna sigurnosna kopija ove aplikacije ne postoji.',
'unhealthy_backup_found_old' => 'Zadnja sigurnosna kopija generirana na datum :date smatra se prestarom.',
'unhealthy_backup_found_unknown' => 'Isprike, ali nije moguće odrediti razlog.',
'unhealthy_backup_found_full' => 'Sigurnosne kopije zauzimaju previše prostora. Trenutno zauzeće je :disk_usage što je više od dozvoljenog ograničenja od :disk_limit.',
'no_backups_info' => 'Nema sigurnosnih kopija',
'application_name' => 'Naziv aplikacije',
'backup_name' => 'Naziv sigurnosne kopije',
'disk' => 'Disk',
'newest_backup_size' => 'Veličina najnovije sigurnosne kopije',
'number_of_backups' => 'Broj sigurnosnih kopija',
'total_storage_used' => 'Ukupno zauzeće',
'newest_backup_date' => 'Najnovija kopija na datum',
'oldest_backup_date' => 'Najstarija kopija na datum',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => 'Pesan pengecualian: :message',
'exception_trace' => 'Jejak pengecualian: :trace',
'exception_message_title' => 'Pesan pengecualian',
'exception_trace_title' => 'Jejak pengecualian',
'backup_failed_subject' => 'Gagal backup :application_name',
'backup_failed_body' => 'Penting: Sebuah error terjadi ketika membackup :application_name',
'backup_successful_subject' => 'Backup baru sukses dari :application_name',
'backup_successful_subject_title' => 'Backup baru sukses!',
'backup_successful_body' => 'Kabar baik, sebuah backup baru dari :application_name sukses dibuat pada disk bernama :disk_name.',
'cleanup_failed_subject' => 'Membersihkan backup dari :application_name yang gagal.',
'cleanup_failed_body' => 'Sebuah error teradi ketika membersihkan backup dari :application_name',
'cleanup_successful_subject' => 'Sukses membersihkan backup :application_name',
'cleanup_successful_subject_title' => 'Sukses membersihkan backup!',
'cleanup_successful_body' => 'Pembersihan backup :application_name pada disk bernama :disk_name telah sukses.',
'healthy_backup_found_subject' => 'Backup untuk :application_name pada disk :disk_name sehat',
'healthy_backup_found_subject_title' => 'Backup untuk :application_name sehat',
'healthy_backup_found_body' => 'Backup untuk :application_name dipertimbangkan sehat. Kerja bagus!',
'unhealthy_backup_found_subject' => 'Penting: Backup untuk :application_name tidak sehat',
'unhealthy_backup_found_subject_title' => 'Penting: Backup untuk :application_name tidak sehat. :problem',
'unhealthy_backup_found_body' => 'Backup untuk :application_name pada disk :disk_name tidak sehat.',
'unhealthy_backup_found_not_reachable' => 'Tujuan backup tidak dapat terjangkau. :error',
'unhealthy_backup_found_empty' => 'Tidak ada backup pada aplikasi ini sama sekali.',
'unhealthy_backup_found_old' => 'Backup terakhir dibuat pada :date dimana dipertimbahkan sudah sangat lama.',
'unhealthy_backup_found_unknown' => 'Maaf, sebuah alasan persisnya tidak dapat ditentukan.',
'unhealthy_backup_found_full' => 'Backup menggunakan terlalu banyak kapasitas penyimpanan. Penggunaan terkini adalah :disk_usage dimana lebih besar dari batas yang diperbolehkan yaitu :disk_limit.',
'no_backups_info' => 'Belum ada backup yang dibuat',
'application_name' => 'Nama aplikasi',
'backup_name' => 'Nama cadangan',
'disk' => 'Disk',
'newest_backup_size' => 'Ukuran cadangan terbaru',
'number_of_backups' => 'Jumlah cadangan',
'total_storage_used' => 'Total penyimpanan yang digunakan',
'newest_backup_date' => 'Ukuran cadangan terbaru',
'oldest_backup_date' => 'Ukuran cadangan tertua',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => "Messaggio dell'eccezione: :message",
'exception_trace' => "Traccia dell'eccezione: :trace",
'exception_message_title' => "Messaggio dell'eccezione",
'exception_trace_title' => "Traccia dell'eccezione",
'backup_failed_subject' => 'Fallito il backup di :application_name',
'backup_failed_body' => 'Importante: Si è verificato un errore durante il backup di :application_name',
'backup_successful_subject' => 'Creato nuovo backup di :application_name',
'backup_successful_subject_title' => 'Nuovo backup creato!',
'backup_successful_body' => 'Grande notizia, un nuovo backup di :application_name è stato creato con successo sul disco :disk_name.',
'cleanup_failed_subject' => 'Pulizia dei backup di :application_name fallita.',
'cleanup_failed_body' => 'Si è verificato un errore durante la pulizia dei backup di :application_name',
'cleanup_successful_subject' => 'Pulizia dei backup di :application_name avvenuta con successo',
'cleanup_successful_subject_title' => 'Pulizia dei backup avvenuta con successo!',
'cleanup_successful_body' => 'La pulizia dei backup di :application_name sul disco :disk_name è avvenuta con successo.',
'healthy_backup_found_subject' => 'I backup per :application_name sul disco :disk_name sono sani',
'healthy_backup_found_subject_title' => 'I backup per :application_name sono sani',
'healthy_backup_found_body' => 'I backup per :application_name sono considerati sani. Bel Lavoro!',
'unhealthy_backup_found_subject' => 'Importante: i backup per :application_name sono corrotti',
'unhealthy_backup_found_subject_title' => 'Importante: i backup per :application_name sono corrotti. :problem',
'unhealthy_backup_found_body' => 'I backup per :application_name sul disco :disk_name sono corrotti.',
'unhealthy_backup_found_not_reachable' => 'Impossibile raggiungere la destinazione di backup. :error',
'unhealthy_backup_found_empty' => 'Non esiste alcun backup di questa applicazione.',
'unhealthy_backup_found_old' => 'L\'ultimo backup fatto il :date è considerato troppo vecchio.',
'unhealthy_backup_found_unknown' => 'Spiacenti, non è possibile determinare una ragione esatta.',
'unhealthy_backup_found_full' => 'I backup utilizzano troppa memoria. L\'utilizzo corrente è :disk_usage che è superiore al limite consentito di :disk_limit.',
'no_backups_info' => 'Non sono stati ancora effettuati backup',
'application_name' => "Nome dell'applicazione",
'backup_name' => 'Nome di backup',
'disk' => 'Disco',
'newest_backup_size' => 'Dimensione backup più recente',
'number_of_backups' => 'Numero di backup',
'total_storage_used' => 'Spazio di archiviazione totale utilizzato',
'newest_backup_date' => 'Data del backup più recente',
'oldest_backup_date' => 'Data del backup più vecchio',
];
+45
View File
@@ -0,0 +1,45 @@
<?php
return [
'exception_message' => '例外のメッセージ: :message',
'exception_trace' => '例外の追跡: :trace',
'exception_message_title' => '例外のメッセージ',
'exception_trace_title' => '例外の追跡',
'backup_failed_subject' => ':application_name のバックアップに失敗しました。',
'backup_failed_body' => '重要: :application_name のバックアップ中にエラーが発生しました。',
'backup_successful_subject' => ':application_name のバックアップに成功しました。',
'backup_successful_subject_title' => 'バックアップに成功しました!',
'backup_successful_body' => '朗報です。ディスク :disk_name へ :application_name のバックアップが成功しました。',
'cleanup_failed_subject' => ':application_name のバックアップ削除に失敗しました。',
'cleanup_failed_body' => ':application_name のバックアップ削除中にエラーが発生しました。',
'cleanup_successful_subject' => ':application_name のバックアップ削除に成功しました。',
'cleanup_successful_subject_title' => 'バックアップ削除に成功しました!',
'cleanup_successful_body' => 'ディスク :disk_name に保存された :application_name のバックアップ削除に成功しました。',
'healthy_backup_found_subject' => 'ディスク :disk_name への :application_name のバックアップは正常です。',
'healthy_backup_found_subject_title' => ':application_name のバックアップは正常です。',
'healthy_backup_found_body' => ':application_name へのバックアップは正常です。いい仕事してますね!',
'unhealthy_backup_found_subject' => '重要: :application_name のバックアップに異常があります。',
'unhealthy_backup_found_subject_title' => '重要: :application_name のバックアップに異常があります。 :problem',
'unhealthy_backup_found_body' => ':disk_name への :application_name のバックアップに異常があります。',
'unhealthy_backup_found_not_reachable' => 'バックアップ先にアクセスできませんでした。 :error',
'unhealthy_backup_found_empty' => 'このアプリケーションのバックアップは見つかりませんでした。',
'unhealthy_backup_found_old' => ':date に保存された直近のバックアップが古すぎます。',
'unhealthy_backup_found_unknown' => '申し訳ございません。予期せぬエラーです。',
'unhealthy_backup_found_full' => 'バックアップがディスク容量を圧迫しています。現在の使用量 :disk_usage は、許可された限界値 :disk_limit を超えています。',
'no_backups_info' => 'バックアップはまだ作成されていません',
'application_name' => 'アプリケーション名',
'backup_name' => 'バックアップ名',
'disk' => 'ディスク',
'newest_backup_size' => '最新のバックアップサイズ',
'number_of_backups' => 'バックアップ数',
'total_storage_used' => '使用された合計ストレージ',
'newest_backup_date' => '最新のバックアップ日時',
'oldest_backup_date' => '最も古いバックアップ日時',
];
Loaded 100 of 15282 files, more files were not shown because too many files have changed in this diff. Show more