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 '
| 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 | ||||||||||||