query('hasil_skrining'); $fasyankes_filter = $request->query('fasyankes'); $tgl_mulai = $request->query('tgl_mulai'); $tgl_selesai = $request->query('tgl_selesai'); $search = $request->query('search'); $role = session('role'); $fasyankes_petugas = session('fasyankes'); $fasyankes_list = DB::table('fasyankes') ->select('nama_fasyankes') ->distinct() ->get(); // FIX UTAMA: WAJIB LEFT JOIN $query = DB::table('skrining') ->leftJoin('users', 'skrining.id_user', '=', 'users.id_user') ->select( 'skrining.*', DB::raw("COALESCE(users.nama_lengkap, 'Pengguna Umum') as nama_lengkap"), 'users.nik', 'users.alamat', 'users.no_telp', 'users.jenis_kelamin', 'users.tgl_lahir', 'users.nama_fasyankes' ); // FILTER KEAMANAN if ($role !== 'super_admin') { if (empty($fasyankes_petugas)) { $petugas = DB::table('petugas') ->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes') ->where('petugas.id_petugas', session('petugas_id')) ->select('fasyankes.nama_fasyankes') ->first(); if ($petugas && !empty($petugas->nama_fasyankes)) { $fasyankes_petugas = $petugas->nama_fasyankes; } } if (empty($fasyankes_petugas)) { $query->whereRaw('1 = 0'); } else { $query->where('users.nama_fasyankes', 'like', '%' . trim($fasyankes_petugas) . '%'); } } else { if (!empty($fasyankes_filter)) { $query->where('users.nama_fasyankes', 'like', '%' . trim($fasyankes_filter) . '%'); } } // FILTER STATUS if (!empty($status)) { $query->where('skrining.hasil_skrining', $status); } // FILTER TANGGAL if (!empty($tgl_mulai) && !empty($tgl_selesai)) { $query->whereDate('skrining.tgl_skrining', '>=', $tgl_mulai) ->whereDate('skrining.tgl_skrining', '<=', $tgl_selesai); } // FILTER SEARCH if (!empty($search)) { $query->where(function ($q) use ($search) { $q->where('users.nama_lengkap', 'like', "%{$search}%") ->orWhere('users.nik', 'like', "%{$search}%"); }); } $skrining = $query->orderBy('skrining.tgl_skrining', 'desc') ->paginate(20) ->appends($request->all()); return view('skrining', compact('skrining', 'fasyankes_list')); } public function store(Request $request) { $request->validate([ 'id_user' => 'required', 'hasil_skrining' => 'required' ]); try { // =================================================== // CEK SKRINING TERAKHIR (BATAS 1 BULAN) // =================================================== $skriningTerakhir = DB::table('skrining') ->where('id_user', $request->id_user) ->orderBy('tgl_skrining', 'desc') ->first(); if ($skriningTerakhir) { $tanggalTerakhir = Carbon::parse( $skriningTerakhir->tgl_skrining ); $bolehSkriningLagi = $tanggalTerakhir ->copy() ->addMonth(); if (Carbon::now()->lt($bolehSkriningLagi)) { return response()->json([ 'status' => 'warning', 'message' => 'Skrining hanya dapat dilakukan 1 bulan sekali.', 'next_skrining' => $bolehSkriningLagi ->translatedFormat('d F Y') ], 403); } } // =================================================== // SIMPAN DATA SKRINING // =================================================== DB::table('skrining')->insert([ 'id_user' => $request->id_user, 'tgl_skrining' => Carbon::now(), 'jwb_batuk' => $request->jwb_batuk, 'jwb_batuk_lain' => $request->jwb_batuk_lain, 'jwb_berat_badan' => $request->jwb_berat_badan, 'jwb_demam' => $request->jwb_demam, 'jwb_keringat_malam' => $request->jwb_keringat_malam, 'jwb_pembesaran_kelenjar' => $request->jwb_pembesaran_kelenjar, 'hasil_skrining' => $request->hasil_skrining, ]); return response()->json([ 'status' => 'success', 'message' => 'Data berhasil disimpan' ], 201); } catch (\Exception $e) { return response()->json([ 'status' => 'error', 'message' => $e->getMessage() ], 500); } } /** * UNTUK MOBILE (API: Ambil Riwayat Per User) */ public function index(Request $request) { $id_user = $request->query('id_user'); if (!$id_user) { return response()->json([ 'message' => 'ID User tidak ditemukan' ], 400); } $riwayat = DB::table('skrining') ->where('id_user', $id_user) ->orderBy('tgl_skrining', 'desc') ->get(); return response()->json($riwayat, 200); } public function export(Request $request) { // 1. Ambil data identitas dari Session $role_user = session('role'); $fasyankes_user = session('fasyankes'); // 2. Ambil parameter filter dari Request $hasil_skrining = $request->query('hasil_skrining'); $fasyankes_filter = $request->query('fasyankes'); $tgl_mulai = $request->query('tgl_mulai'); $tgl_selesai = $request->query('tgl_selesai'); $search = $request->query('search'); // 3. Bangun Query Utama $query = DB::table('skrining') ->leftJoin('users', 'skrining.id_user', '=', 'users.id_user') ->select( 'users.nama_lengkap', 'users.nik', 'users.alamat', 'users.no_telp', 'users.nama_fasyankes', 'skrining.tgl_skrining', 'skrining.hasil_skrining', 'skrining.jwb_batuk', 'skrining.jwb_keringat_malam', 'skrining.jwb_demam', 'skrining.jwb_batuk_lain', 'skrining.jwb_pembesaran_kelenjar', 'skrining.jwb_berat_badan' ); // =================================================== // FILTER KEAMANAN EXPORT // =================================================== if ($role_user !== 'super_admin') { if (empty($fasyankes_user)) { $query->whereRaw('1 = 0'); } else { $query->where('users.nama_fasyankes', $fasyankes_user); } } else { if (!empty($fasyankes_filter)) { $query->where('users.nama_fasyankes', $fasyankes_filter); } } // =================================================== // FILTER PENCARIAN // =================================================== if (!empty($hasil_skrining)) { $query->where('skrining.hasil_skrining', $hasil_skrining); } if (!empty($tgl_mulai) && !empty($tgl_selesai)) { $query->whereDate('skrining.tgl_skrining', '>=', $tgl_mulai) ->whereDate('skrining.tgl_skrining', '<=', $tgl_selesai); } if (!empty($search)) { $query->where(function ($q) use ($search) { $q->where('users.nama_lengkap', 'like', "%{$search}%") ->orWhere('users.nik', 'like', "%{$search}%"); }); } // 6. Eksekusi Query $results = $query->orderBy('skrining.tgl_skrining', 'desc')->get(); // 7. Export Excel (.xls) $filename = "Laporan_Skrining_" . date('Ymd_His') . ".xls"; header("Content-Type: application/vnd.ms-excel"); header("Content-Disposition: attachment; filename=\"$filename\""); header("Pragma: no-cache"); header("Expires: 0"); echo ''; echo ''; if ($results->count() > 0) { foreach ($results as $row) { echo ''; } } else { echo ''; } echo '
Nama Pasien NIK Alamat No. Telp Fasyankes Tgl Skrining Hasil Batuk Batuk Lain Keringat Malam Demam BB Turun Pembesaran Kelenjar
' . $row->nama_lengkap . ' ' . "'" . $row->nik . ' ' . $row->alamat . ' ' . $row->no_telp . ' ' . ($row->nama_fasyankes ?? '-') . ' ' . date('d/m/Y H:i', strtotime($row->tgl_skrining)) . ' ' . $row->hasil_skrining . ' ' . ($row->jwb_batuk == 1 ? 'Ya' : 'Tidak') . ' ' . ($row->jwb_batuk_lain == 1 ? 'Ya' : 'Tidak') . ' ' . ($row->jwb_keringat_malam == 1 ? 'Ya' : 'Tidak') . ' ' . ($row->jwb_demam == 1 ? 'Ya' : 'Tidak') . ' ' . ($row->jwb_berat_badan == 1 ? 'Ya' : 'Tidak') . ' ' . ($row->jwb_pembesaran_kelenjar == 1 ? 'Ya' : 'Tidak') . '
Data tidak ditemukan
'; // 8. Log Aktivitas DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Export Excel Data Skrining', 'created_at' => now(), 'updated_at' => now() ]); exit; } public function jadikanPasien(Request $request, $id) { $dataSkrining = DB::table('skrining') ->leftJoin('users', 'skrining.id_user', '=', 'users.id_user') ->where('skrining.id_skrining', $id) ->select( 'skrining.id_skrining', 'skrining.id_user', 'users.nama_lengkap', 'users.nik', 'users.nama_fasyankes' ) ->first(); if (!$dataSkrining) { return response()->json([ 'message' => 'Data skrining tidak ditemukan!' ], 404); } if (!$dataSkrining->id_user) { return response()->json([ 'message' => 'User skrining tidak valid!' ], 422); } // VALIDASI DATA MEDIS SAJA $request->validate([ 'tgl_mulai' => 'required|date|before_or_equal:today', 'tgl_estimasi_selesai' => 'required|date', 'jam_minum' => 'required', 'diagnosa' => 'nullable|string', ]); // CEK APAKAH SUDAH ADA DI PASIEN_MEDIS $cekPasienMedis = DB::table('pasien_medis') ->where('id_user', $dataSkrining->id_user) ->first(); if ($cekPasienMedis) { return response()->json([ 'status' => 'warning', 'message' => $dataSkrining->nama_lengkap . ' sudah menjadi pasien.' ], 409); } if ($request->hasFile('file_lab')) { foreach ($request->file('file_lab') as $file) { $path = $file->store('lab', 'public'); DB::table('file_pasien')->insert([ 'id_user' => $dataSkrining->id_user, 'nama_file' => $file->getClientOriginalName(), 'path_file' => $path, 'created_at' => now(), 'updated_at' => now(), ]); } } if ($cekPasienMedis) { return response()->json([ 'status' => 'warning', 'message' => $dataSkrining->nama_lengkap . ' sudah menjadi pasien.' ], 409); } // SUPER ADMIN BOLEH SET FASYANKES $namaFasyankesFix = $dataSkrining->nama_fasyankes; if (session('role') === 'super_admin') { if (!empty($request->nama_fasyankes)) { $namaFasyankesFix = $request->nama_fasyankes; } } try { DB::transaction(function () use ($request, $dataSkrining, $namaFasyankesFix) { // UPDATE ROLE USERS -> PASIEN DB::table('users') ->where('id_user', $dataSkrining->id_user) ->update([ 'role' => 'pasien', 'nama_fasyankes' => $namaFasyankesFix, 'updated_at' => now() ]); // INSERT PASIEN MEDIS (COPY ID_USER) DB::table('pasien_medis')->insert([ 'id_user' => $dataSkrining->id_user, 'pengobatan_ke' => 1, 'diagnosa' => $request->diagnosa, 'tgl_mulai_pengobatan' => $request->tgl_mulai, 'tgl_estimasi_selesai' => $request->tgl_estimasi_selesai, 'jam_minum' => $request->jam_minum, 'status_kesehatan' => 'Masih Proses', ]); // LOG AKTIVITAS DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Menjadikan pasien dari skrining ID ' . $dataSkrining->id_skrining . ' (User ID ' . $dataSkrining->id_user . ')', 'created_at' => now(), 'updated_at' => now() ]); }); return response()->json([ 'message' => 'Berhasil menjadikan pasien!' ]); } catch (\Exception $e) { return response()->json([ 'message' => 'Gagal simpan: ' . $e->getMessage() ], 500); } } /** * Hapus skrining (khusus super admin) */ public function destroy($id) { if (session('role') !== 'super_admin') { return response()->json([ 'message' => 'Akses ditolak!' ], 403); } $dataSkrining = DB::table('skrining') ->join('users', 'skrining.id_user', '=', 'users.id_user') ->where('skrining.id_skrining', $id) ->select( 'skrining.id_skrining', 'users.nama_lengkap' ) ->first(); if (!$dataSkrining) { return response()->json([ 'message' => 'Data skrining tidak ditemukan!' ], 404); } DB::table('skrining') ->where('id_skrining', $id) ->delete(); DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Menghapus data skrining milik ' . $dataSkrining->nama_lengkap, 'created_at' => now(), 'updated_at' => now() ]); return response()->json([ 'message' => 'Berhasil menghapus data skrining' ]); } public function cekPasien($id_user = null) { // Validasi pencegahan jika Javascript mengirim parameter yang rusak/kosong if (!$id_user || $id_user === 'null' || $id_user === 'undefined') { return response()->json([ 'exists' => false ]); } // Cek keberadaan di database $exists = DB::table('pasien_medis') ->where('id_user', $id_user) ->exists(); return response()->json([ 'exists' => $exists ]); } }