with('error', 'Session login hilang, silakan login ulang'); } $petugas = DB::table('petugas') ->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes') ->where('petugas.id_petugas', $id_petugas) ->select( 'petugas.*', 'fasyankes.nama_fasyankes' ) ->first(); if (!$petugas) { return redirect('/')->with('error', 'Data petugas tidak ditemukan'); } $query = DB::table('users') ->leftJoin('pasien_medis', function ($join) { $join->on('users.id_user', '=', 'pasien_medis.id_user') ->whereRaw('pasien_medis.id_medis = ( SELECT MIN(pm2.id_medis) FROM pasien_medis pm2 WHERE pm2.id_user = users.id_user )'); }) ->select( 'users.id_user', 'pasien_medis.id_medis', 'users.nik', 'users.nama_lengkap', 'users.email', 'users.tgl_lahir', 'users.alamat', DB::raw(" TRIM( REGEXP_SUBSTR( users.alamat, 'RT/RW[[:space:]]*[0-9]+/[0-9]+' ) ) AS rt_rw "), DB::raw(" TRIM( SUBSTRING_INDEX(users.alamat, ', RT/RW', 1) ) AS dusun "), DB::raw(" TRIM( REPLACE( SUBSTRING_INDEX( SUBSTRING_INDEX(users.alamat, ', Kecamatan', 1), ', Desa', -1 ), 'Desa ', '' ) ) AS desa "), DB::raw(" TRIM( REPLACE( SUBSTRING_INDEX(users.alamat, 'Kecamatan ', -1), 'Kecamatan ', '' ) ) AS kecamatan "), 'users.no_telp', 'users.jenis_kelamin', 'users.nama_fasyankes', 'pasien_medis.diagnosa', 'pasien_medis.tgl_mulai_pengobatan', 'pasien_medis.status_kesehatan', 'pasien_medis.jam_minum' ) ->where('users.role', 'pasien'); // PETUGAS BIASA HANYA LIHAT FASYANKES SENDIRI if ($petugas->role !== 'super_admin') { $query->where('users.nama_fasyankes', $petugas->nama_fasyankes); } // SEARCH if ($request->filled('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('users.nama_lengkap', 'LIKE', "%{$search}%") ->orWhere('users.nik', 'LIKE', "%{$search}%") ->orWhere('users.nama_fasyankes', 'LIKE', "%{$search}%"); if (session('role') == 'super_admin') { $q->orWhere('users.email', 'LIKE', "%{$search}%"); } }); } // FILTER STATUS if ($request->filled('status')) { $query->where('pasien_medis.status_kesehatan', $request->status); } // FILTER DESA if ($request->filled('desa')) { $desa = strtoupper(trim($request->desa)); $query->whereRaw( 'UPPER(users.alamat) LIKE ?', ["%DESA {$desa}%"] ); } // FILTER FASYANKES if ($request->filled('fasyankes')) { $query->where('users.nama_fasyankes', $request->fasyankes); } // FILTER TANGGAL if ($request->filled('start_date') && $request->filled('end_date')) { $query->whereBetween( 'pasien_medis.tgl_mulai_pengobatan', [$request->start_date, $request->end_date] ); } elseif ($request->filled('start_date')) { $query->where( 'pasien_medis.tgl_mulai_pengobatan', '>=', $request->start_date ); } $pasiens = $query ->orderBy('users.nama_lengkap', 'asc') ->paginate(20); // AMBIL LIST FASYANKES UNTUK FILTER + FORM $listFasyankes = DB::table('fasyankes') ->orderBy('nama_fasyankes', 'asc') ->get(); return view( 'data-pasien', compact( 'pasiens', 'petugas', 'listFasyankes' ) ); } public function store(Request $request) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $id_petugas = session('petugas_id'); if (!$id_petugas) { return redirect('/')->with('error', 'Session login hilang, silakan login ulang'); } $petugas = DB::table('petugas') ->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes') ->where('petugas.id_petugas', $id_petugas) ->select( 'petugas.*', 'fasyankes.nama_fasyankes' ) ->first(); $request->validate([ 'nik' => 'required|digits:16', 'nama' => 'required', 'email' => 'required|email', 'tgl_lahir' => 'required|date', 'telp' => 'required', 'jenis_kelamin' => 'required|in:L,P', 'dusun' => 'required', 'rtrw' => 'required', 'desa' => 'required', 'kecamatan' => 'required', 'riwayat' => 'required|array', 'riwayat.*.diagnosa' => 'required', 'riwayat.*.tgl_mulai' => 'required|date|before_or_equal:today', 'riwayat.*.tgl_selesai' => 'required|date', 'riwayat.*.jam_minum' => 'required', 'riwayat.*.status_kesehatan' => 'required|in:Masih Proses,Sembuh,Gagal,Meninggal', 'riwayat.*.file_awal' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', 'riwayat.*.file_56_hari' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', 'riwayat.*.file_168_hari' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', ]); // CEK HANYA NIK (NIK TIDAK BOLEH DUPLIKAT) $cekUserNik = DB::table('users')->where('nik', $request->nik)->first(); if ($cekUserNik) { return redirect()->back()->with('error', 'Pasien sudah terdaftar di sistem / aplikasi mobile (NIK sudah digunakan).'); } $alamatLengkap = $request->dusun . ", RT/RW " . $request->rtrw . ", Desa " . $request->desa . ", Kecamatan " . $request->kecamatan; $passwordOtomatis = date( 'dmY', strtotime($request->tgl_lahir) ); // SUPER ADMIN BISA PILIH FASYANKES $namaFasyankes = $petugas->role === 'super_admin' ? $request->nama_fasyankes : $petugas->nama_fasyankes; DB::transaction(function () use ( $request, $alamatLengkap, $passwordOtomatis, $namaFasyankes, $id_petugas ) { $id_user = DB::table('users')->insertGetId([ 'nik' => $request->nik, 'password' => Hash::make($passwordOtomatis), 'nama_lengkap' => strtoupper($request->nama), 'email' => $request->email, 'tgl_lahir' => $request->tgl_lahir, 'jenis_kelamin' => $request->jenis_kelamin, 'no_telp' => $request->telp, 'alamat' => strtoupper($alamatLengkap), 'nama_fasyankes' => $namaFasyankes, 'role' => 'pasien', 'created_at' => now(), 'updated_at' => now() ]); // MULTI FILE UPLOAD (TABEL file_pasien) // ========================= // SIMPAN SEMUA RIWAYAT // ========================= if ($request->has('riwayat')) { foreach ($request->riwayat as $index => $item) { $id_medis = DB::table('pasien_medis')->insertGetId([ 'id_user' => $id_user, 'pengobatan_ke' => $index + 1, 'diagnosa' => $item['diagnosa'] ?? null, 'tgl_mulai_pengobatan' => $item['tgl_mulai'] ?? null, 'tgl_estimasi_selesai' => $item['tgl_selesai'] ?? null, 'jam_minum' => $item['jam_minum'] ?? null, 'status_kesehatan' => $item['status_kesehatan'] ?? 'Masih Proses' ]); $uploads = [ 'file_awal' => 'awal', 'file_56_hari' => '56_hari', 'file_168_hari' => '168_hari' ]; foreach ($uploads as $field => $tahap) { $file = $request->file( "riwayat.$index.$field" ); if (!$file) { continue; } $path = $file->store( 'file_pasien', 'public' ); DB::table('file_pasien') ->insert([ 'id_user' => $id_user, 'id_medis' => $id_medis, 'tahap' => $tahap, 'nama_file' => $file->getClientOriginalName(), 'path_file' => $path, 'created_at' => now(), 'updated_at' => now() ]); } } } DB::table('log_aktivitas')->insert([ 'id_petugas' => $id_petugas, 'aktivitas' => 'Menambahkan pasien baru: ' . $request->nama, 'created_at' => now(), 'updated_at' => now() ]); }); return redirect()->back()->with( 'success', 'Pasien berhasil ditambahkan' ); } private function cekIzinUploadTahap($id_medis, $tahap) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $medis = DB::table('pasien_medis') ->where('id_medis', $id_medis) ->first(); if (!$medis) { return false; } // TAMBAHAN INI if ( in_array( strtolower($medis->status_kesehatan), ['gagal', 'meninggal'] ) ) { return false; } $hariBerjalan = Carbon::parse($medis->tgl_mulai_pengobatan) ->diffInDays(now()); if ($tahap == 'awal') { return true; } if ($tahap == '56_hari') { return $hariBerjalan >= 56; } if ($tahap == '168_hari') { return $hariBerjalan >= 168; } return false; } public function update(Request $request, $id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { $id_petugas = session('petugas_id'); $petugas = DB::table('petugas') ->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes') ->where('petugas.id_petugas', $id_petugas) ->select( 'petugas.*', 'fasyankes.nama_fasyankes' ) ->first(); $request->validate([ // ========================= // DATA IDENTITAS // ========================= 'nik' => 'required|digits:16|unique:users,nik,' . $id . ',id_user', 'nama' => 'required|string', 'email' => 'required|email', 'telp' => 'required', 'tgl_lahir' => 'required|date', 'jenis_kelamin' => 'required|in:L,P', 'dusun' => 'required', 'rtrw' => 'required', 'desa' => 'required', 'kecamatan' => 'required', // ========================= // FASYANKES // ========================= 'nama_fasyankes' => session('role') == 'super_admin' ? 'required' : 'nullable', // ========================= // RIWAYAT PENGOBATAN // ========================= 'riwayat' => 'required|array|min:1', 'riwayat.*.diagnosa' => 'required', 'riwayat.*.jam_minum' => 'required', 'riwayat.*.tgl_mulai' => 'required|date|before_or_equal:today', 'riwayat.*.tgl_selesai' => 'required|date', 'riwayat.*.status_kesehatan' => 'required', // ========================= // FILE LAB // ========================= 'riwayat.*.file_awal' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', 'riwayat.*.file_56_hari' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', 'riwayat.*.file_168_hari' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120', ]); $desa = trim($request->desa); $kecamatan = trim($request->kecamatan); // HAPUS PREFIX JIKA SUDAH ADA $desa = preg_replace('/^Desa\s+/i', '', $desa); $kecamatan = preg_replace('/^Kecamatan\s+/i', '', $kecamatan); $alamatLengkap = trim($request->dusun) . ", RT/RW " . trim($request->rtrw) . ", Desa " . $desa . ", Kecamatan " . $kecamatan; $namaFasyankes = $petugas->role === 'super_admin' ? $request->nama_fasyankes : $petugas->nama_fasyankes; DB::transaction(function () use ( $request, $id, $alamatLengkap, $namaFasyankes, $id_petugas ) { // ========================= // UPDATE DATA USER // ========================= DB::table('users') ->where('id_user', $id) ->update([ 'nama_lengkap' => strtoupper($request->nama), 'nik' => $request->nik, 'email' => $request->email, 'no_telp' => $request->telp, 'jenis_kelamin' => $request->jenis_kelamin === 'L' ? 'L' : 'P', 'tgl_lahir' => $request->tgl_lahir, 'alamat' => strtoupper($alamatLengkap), 'nama_fasyankes' => $namaFasyankes, 'updated_at' => now() ]); // ========================= // LOOP SEMUA RIWAYAT // ========================= $idRiwayatTerkirim = []; if ($request->has('riwayat')) { foreach ($request->riwayat as $index => $item) { // ========================= // UPDATE RIWAYAT LAMA // ========================= if (!empty($item['id_medis'])) { DB::table('pasien_medis') ->where('id_medis', $item['id_medis']) ->update([ 'diagnosa' => $item['diagnosa'] ?? null, 'tgl_mulai_pengobatan' => $item['tgl_mulai'] ?? null, 'tgl_estimasi_selesai' => $item['tgl_selesai'] ?? null, 'jam_minum' => $item['jam_minum'] ?? null, 'status_kesehatan' => $item['status_kesehatan'] ?? 'Masih Proses', ]); $idRiwayatTerkirim[] = $item['id_medis']; $uploads = [ 'file_awal' => 'awal', 'file_56_hari' => '56_hari', 'file_168_hari' => '168_hari' ]; foreach ($uploads as $field => $tahap) { $file = $request->file( "riwayat.$index.$field" ); if (!$file) { continue; } if ( !$this->cekIzinUploadTahap( $item['id_medis'], $tahap ) ) { throw new \Exception( 'Belum waktunya upload file' ); } $fileLama = DB::table('file_pasien') ->where( 'id_medis', $item['id_medis'] ) ->where( 'tahap', $tahap ) ->first(); if ($fileLama) { if ( Storage::disk('public') ->exists( $fileLama->path_file ) ) { Storage::disk('public') ->delete( $fileLama->path_file ); } DB::table('file_pasien') ->where( 'id_file', $fileLama->id_file ) ->delete(); } $path = $file->store( 'file_pasien', 'public' ); DB::table('file_pasien') ->insert([ 'id_user' => $id, 'id_medis' => $item['id_medis'], 'tahap' => $tahap, 'nama_file' => $file->getClientOriginalName(), 'path_file' => $path, 'created_at' => now(), 'updated_at' => now() ]); } } // ========================= // INSERT RIWAYAT BARU // ========================= else { $jumlahPengobatan = DB::table('pasien_medis') ->where('id_user', $id) ->count(); $newId = DB::table('pasien_medis') ->insertGetId([ 'id_user' => $id, 'pengobatan_ke' => $jumlahPengobatan + 1, 'diagnosa' => $item['diagnosa'] ?? null, 'tgl_mulai_pengobatan' => $item['tgl_mulai'] ?? null, 'tgl_estimasi_selesai' => $item['tgl_selesai'] ?? null, 'jam_minum' => $item['jam_minum'] ?? null, 'status_kesehatan' => $item['status_kesehatan'] ?? 'Masih Proses', ]); $idRiwayatTerkirim[] = $newId; $uploads = [ 'file_awal' => 'awal', 'file_56_hari' => '56_hari', 'file_168_hari' => '168_hari' ]; foreach ($uploads as $field => $tahap) { $file = $request->file( "riwayat.$index.$field" ); if (!$file) { continue; } if ( !$this->cekIzinUploadTahap( $newId, $tahap ) ) { continue; } $path = $file->store( 'file_pasien', 'public' ); DB::table('file_pasien') ->insert([ 'id_user' => $id, 'id_medis' => $newId, 'tahap' => $tahap, 'nama_file' => $file->getClientOriginalName(), 'path_file' => $path, 'created_at' => now(), 'updated_at' => now() ]); } } } // ========================= // HAPUS RIWAYAT YANG DIHAPUS DARI FORM // ========================= $riwayatLama = DB::table('pasien_medis') ->where('id_user', $id) ->pluck('id_medis') ->toArray(); $yangDihapus = array_diff( $riwayatLama, $idRiwayatTerkirim ); if (!empty($yangDihapus)) { // ========================= // HAPUS FILE DARI STORAGE // ========================= $files = DB::table('file_pasien') ->whereIn('id_medis', $yangDihapus) ->get(); foreach ($files as $file) { if ( $file->path_file && Storage::disk('public')->exists($file->path_file) ) { Storage::disk('public') ->delete($file->path_file); } } // ========================= // HAPUS FILE DATABASE // ========================= DB::table('file_pasien') ->whereIn('id_medis', $yangDihapus) ->delete(); // ========================= // HAPUS RIWAYAT // ========================= DB::table('pasien_medis') ->whereIn('id_medis', $yangDihapus) ->delete(); } } // ========================= // LOG AKTIVITAS // ========================= DB::table('log_aktivitas')->insert([ 'id_petugas' => $id_petugas, 'aktivitas' => 'Mengupdate data pasien ID: ' . $id, 'created_at' => now(), 'updated_at' => now() ]); }); DashboardController::updateNotifikasiHariIni($id); return redirect('/data-pasien') ->with('success', 'Data berhasil diupdate'); } catch (\Exception $e) { return redirect()->back() ->with('error', $e->getMessage()); } } public function destroy($id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $pasien = DB::table('users') ->where('id_user', $id) ->first(); // PUTUSKAN RELASI SKRINING DENGAN PASIEN DB::table('skrining') ->where('id_user', $id) ->update([ 'id_user' => null ]); // HAPUS FILE PASIEN DARI STORAGE $files = DB::table('file_pasien') ->where('id_user', $id) ->get(); foreach ($files as $f) { if ($f->path_file && Storage::disk('public')->exists($f->path_file)) { Storage::disk('public')->delete($f->path_file); } } DB::transaction(function () use ($id) { DB::table('file_pasien') ->where('id_user', $id) ->delete(); DB::table('pasien_medis') ->where('id_user', $id) ->delete(); DB::table('users') ->where('id_user', $id) ->delete(); }); DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Menghapus pasien: ' . ($pasien->nama_lengkap ?? 'Unknown'), 'created_at' => now(), 'updated_at' => now() ]); return response()->json([ 'success' => true ]); } public function updateStatus(Request $request, $id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { $status = $request->status_kesehatan ?? $request->status; if (!$status) { return response()->json([ 'success' => false, 'message' => 'Data status tidak ditemukan' ], 400); } DB::table('pasien_medis') ->where('id_medis', $id) ->update([ 'status_kesehatan' => $status ]); DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Mengubah status pasien ID: ' . $id . ' menjadi ' . $status, 'created_at' => now(), 'updated_at' => now() ]); return response()->json([ 'success' => true, 'message' => 'Status berhasil diperbarui' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Server Error: ' . $e->getMessage() ], 500); } } public function show($id_medis) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } // AMBIL DATA MEDIS YANG DIKLIK $medisAktif = DB::table('pasien_medis') ->where('id_medis', $id_medis) ->first(); if (!$medisAktif) { abort(404); } // AMBIL SEMUA RIWAYAT PENGOBATAN PASIEN $riwayat_pengobatan = DB::table('pasien_medis') ->where('id_user', $medisAktif->id_user) ->orderBy('pengobatan_ke', 'asc') ->get(); // AMBIL DATA USER $user = DB::table('users') ->where('id_user', $medisAktif->id_user) ->first(); // GABUNGKAN USER + RIWAYAT $pasien = (object)[ 'id_user' => $user->id_user, 'nama_lengkap' => $user->nama_lengkap, 'nik' => $user->nik, 'alamat' => $user->alamat, 'no_telp' => $user->no_telp, 'jenis_kelamin' => $user->jenis_kelamin, 'nama_fasyankes' => $user->nama_fasyankes, 'riwayat_pengobatan' => $riwayat_pengobatan ]; // ========================================= // GENERATE PROGRESS UNTUK SETIAP PENGOBATAN // ========================================= foreach ($riwayat_pengobatan as $r) { // AMBIL MONITORING BERDASARKAN ID_MEDIS $monitoring = DB::table('monitoring_obat') ->where('id_medis', $r->id_medis) ->get(); // ========================= // HITUNG HARI BERJALAN // ========================= $tglMulai = Carbon::parse($r->tgl_mulai_pengobatan)->startOfDay(); $sekarang = Carbon::now(); // Default hari berjalan = hari sekarang $hariAktif = $tglMulai->diffInDays($sekarang) + 1; $hariAktif = $hariAktif; if ($sekarang->format('H:i:s') !== '00:00:00') { $hariAktif = $hariAktif - 1; } // Minimal 0 if ($hariAktif < 0) { $hariAktif = 0; } // Maksimal 168 if ($hariAktif > 168) { $hariAktif = 168; } // ========================= // TAHAP AWAL // ========================= $tahap_awal = []; for ($i = 1; $i <= 56; $i++) { $record = $monitoring ->where('tahap', 'awal') ->where('hari_ke', $i) ->first(); if ($record) { $tahap_awal[$i] = [ 'status' => $record->status == 1 ? 'done' : 'missed', 'jam' => $record->jam_konfirmasi, ]; } else { if ($i > $hariAktif) { $tahap_awal[$i] = [ 'status' => 'pending', 'jam' => null, ]; } else { $tahap_awal[$i] = [ 'status' => 'missed', 'jam' => null, ]; } } } // ========================= // TAHAP LANJUTAN // ========================= $tahap_lanjutan = []; for ($i = 1; $i <= 112; $i++) { $hariGlobal = 56 + $i; $record = $monitoring ->where('tahap', 'lanjutan') ->where('hari_ke', $i) ->first(); if ($record) { $tahap_lanjutan[$i] = [ 'status' => $record->status == 1 ? 'done' : 'missed', 'jam' => $record->jam_konfirmasi, ]; } else { if ($hariGlobal > $hariAktif) { $tahap_lanjutan[$i] = [ 'status' => 'pending', 'jam' => null, ]; } else { $tahap_lanjutan[$i] = [ 'status' => 'missed', 'jam' => null, ]; } } } // ========================= // HITUNG MISSED // ========================= $jumlah_missed = 0; foreach ($tahap_awal as $hari => $item) { if ( $hari <= $hariAktif && $item['status'] == 'missed' ) { $jumlah_missed++; } } foreach ($tahap_lanjutan as $hari => $item) { $hariGlobal = 56 + $hari; if ( $hariGlobal <= $hariAktif && $item['status'] == 'missed' ) { $jumlah_missed++; } } // SIMPAN KE OBJECT RIWAYAT $r->tahap_awal = $tahap_awal; $r->tahap_lanjutan = $tahap_lanjutan; $r->jumlah_missed = $jumlah_missed; } return view( 'detail-pasien', compact('pasien') ); } public function detailPasien($id_medis) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } // Ambil data pasien + user $pasien = DB::table('pasien_medis') ->join('users', 'users.id_user', '=', 'pasien_medis.id_user') ->where('pasien_medis.id_medis', $id_medis) ->first(); // Ambil monitoring $monitoring = DB::table('monitoring_obat') ->where('id_medis', $id_medis) ->get() ->groupBy(function ($item) { return $item->tahap . '-' . $item->hari_ke; }); // Fungsi generate hari $generateHari = function ($totalHari, $tahap) use ($monitoring) { $data = []; for ($i = 1; $i <= $totalHari; $i++) { $key = $tahap . '-' . $i; if (isset($monitoring[$key])) { $item = $monitoring[$key]->first(); $data[$i] = [ 'status' => $item->status == 1 ? 'done' : 'missed', 'jam' => $item->jam_konfirmasi ]; } else { $data[$i] = [ 'status' => 'missed', 'jam' => null ]; } } return $data; }; $tahap_awal = $generateHari(56, 'awal'); $tahap_lanjutan = $generateHari(112, 'lanjutan'); // Hitung jumlah hari missed $jumlah_missed = collect($tahap_awal) ->merge($tahap_lanjutan) ->filter(fn($item) => $item['status'] == 'missed') ->count(); return view('detail-pasien', compact( 'pasien', 'tahap_awal', 'tahap_lanjutan', 'jumlah_missed' )); } public function exportExcel(Request $request) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { while (ob_get_level() > 0) { ob_end_clean(); } $id_petugas = session('petugas_id'); $petugas = DB::table('petugas') ->leftJoin('fasyankes', 'petugas.id_fasyankes', '=', 'fasyankes.id_fasyankes') ->where('petugas.id_petugas', $id_petugas) ->select( 'petugas.*', 'fasyankes.nama_fasyankes' ) ->first(); $query = DB::table('users') ->leftJoin('pasien_medis', function ($join) { $join->on('users.id_user', '=', 'pasien_medis.id_user') ->whereRaw('pasien_medis.id_medis = ( SELECT MAX(pm2.id_medis) FROM pasien_medis pm2 WHERE pm2.id_user = users.id_user )'); }) ->where('users.role', 'pasien'); // PETUGAS BIASA if ($petugas->role !== 'super_admin') { $query->where( 'users.nama_fasyankes', $petugas->nama_fasyankes ); } if ($request->filled('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('users.nama_lengkap', 'LIKE', "%{$search}%") ->orWhere('users.nik', 'LIKE', "%{$search}%") ->orWhere('users.nama_fasyankes', 'LIKE', "%{$search}%"); }); } if ($request->filled('status')) { $query->where( 'pasien_medis.status_kesehatan', $request->status ); } if ($request->filled('desa')) { $desa = strtoupper(trim($request->desa)); $query->whereRaw( 'UPPER(users.alamat) LIKE ?', ["%DESA {$desa}%"] ); } if ($request->filled('fasyankes')) { $query->where( 'users.nama_fasyankes', $request->fasyankes ); } if ( $request->filled('start_date') && $request->filled('end_date') ) { $query->whereBetween( 'pasien_medis.tgl_mulai_pengobatan', [$request->start_date, $request->end_date] ); } elseif ($request->filled('start_date')) { $query->where( 'pasien_medis.tgl_mulai_pengobatan', '>=', $request->start_date ); } $data = $query ->select( 'users.id_user', 'pasien_medis.id_medis', 'users.nama_lengkap', 'users.nik', 'users.email', 'users.tgl_lahir', 'users.jenis_kelamin', 'users.alamat', 'users.no_telp', 'users.nama_fasyankes', 'pasien_medis.diagnosa', 'pasien_medis.jam_minum', 'pasien_medis.status_kesehatan', 'pasien_medis.tgl_mulai_pengobatan', 'pasien_medis.tgl_estimasi_selesai' ) ->orderBy('users.nama_lengkap', 'asc') ->get(); if ($data->isEmpty()) { return back()->with( 'error', 'Tidak ada data yang sesuai filter' ); } // HITUNG JUMLAH HARI TIDAK MINUM OBAT $data = $data->map(function ($row) { $totalHari = 168; $jumlahKonfirmasi = DB::table('monitoring_obat') ->where('id_medis', $row->id_medis) ->where('status', 1) ->count(); $row->jumlah_tidak_minum = $totalHari - $jumlahKonfirmasi; return $row; }); $fileName = 'data-pasien-' . date('YmdHis') . '.xlsx'; return Excel::download( new \App\Exports\PasienExport($data, $petugas->role), $fileName ); } catch (\Exception $e) { return back()->with( 'error', 'Gagal export: ' . $e->getMessage() ); } } // ENDPOINT UNTUK AMBIL DAFTAR FILE PASIEN (UNTUK POPUP SWEETALERT) public function getFilePasien($id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $files = DB::table('file_pasien') ->where('id_user', $id) ->orderBy('created_at', 'desc') ->get(); return response()->json([ 'success' => true, 'data' => $files ]); } public function hapusFileLab($id_file) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { $file = DB::table('file_pasien') ->where('id_file', $id_file) ->first(); if (!$file) { return response()->json([ 'success' => false, 'message' => 'File tidak ditemukan' ], 404); } if (!empty($file->path_file)) { $path = str_replace('storage/', '', $file->path_file); Storage::disk('public')->delete($path); } $idMedis = $file->id_medis; $deleted = DB::table('file_pasien') ->where('id_file', $id_file) ->delete(); if (!$deleted) { return response()->json([ 'success' => false, 'message' => 'Data file gagal dihapus' ], 404); } $jumlahFile = DB::table('file_pasien') ->where('id_medis', $idMedis) ->count(); return response()->json([ 'success' => true, 'message' => 'File berhasil dihapus', 'id_medis' => $idMedis, 'jumlah_file' => $jumlahFile ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Server Error: ' . $e->getMessage() ], 500); } } public function pindahFasyankes(Request $request, $id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { $request->validate([ 'nama_fasyankes' => 'required' ]); $pasien = User::where('id_user', $id)->first(); if (!$pasien) { return response()->json([ 'success' => false, 'message' => 'Pasien tidak ditemukan.' ], 404); } $pasien->nama_fasyankes = $request->nama_fasyankes; $pasien->save(); return response()->json([ 'success' => true, 'message' => 'Pasien berhasil dipindahkan.' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => $e->getMessage() ], 500); } } public function edit($id) { $data = DB::table('users') ->leftJoin('pasien_medis', function ($join) { $join->on('users.id_user', '=', 'pasien_medis.id_user') ->whereRaw('pasien_medis.id_medis = ( SELECT pm2.id_medis FROM pasien_medis pm2 WHERE pm2.id_user = users.id_user ORDER BY pm2.pengobatan_ke ASC LIMIT 1 )'); }) ->where('users.id_user', $id) ->select( 'users.id_user', 'users.nik', 'users.nama_lengkap', 'users.email', 'users.tgl_lahir', 'users.jenis_kelamin', 'users.no_telp', 'users.alamat', 'users.nama_fasyankes', 'pasien_medis.id_medis', 'pasien_medis.diagnosa', 'pasien_medis.tgl_mulai_pengobatan', 'pasien_medis.tgl_estimasi_selesai', 'pasien_medis.jam_minum' ) ->first(); return response()->json([ 'success' => true, 'data' => $data ]); } public function getRiwayatPengobatan($id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $data = DB::table('pasien_medis') ->where('id_user', $id) ->orderBy('pengobatan_ke', 'asc') ->get() ->map(function ($item) { $item->file_awal = DB::table('file_pasien') ->where('id_medis', $item->id_medis) ->where('tahap', 'awal') ->first(); $item->file_56_hari = DB::table('file_pasien') ->where('id_medis', $item->id_medis) ->where('tahap', '56_hari') ->first(); $item->file_168_hari = DB::table('file_pasien') ->where('id_medis', $item->id_medis) ->where('tahap', '168_hari') ->first(); $item->boleh_awal = $this->cekIzinUploadTahap( $item->id_medis, 'awal' ); $item->boleh_56_hari = $this->cekIzinUploadTahap( $item->id_medis, '56_hari' ); $item->boleh_168_hari = $this->cekIzinUploadTahap( $item->id_medis, '168_hari' ); return $item; }); return response()->json([ 'success' => true, 'data' => $data ]); } public function tambahRiwayatPengobatan(Request $request, $id_user) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } try { $validated = $request->validate([ 'diagnosa' => 'required|string', 'tgl_mulai_pengobatan' => 'required|date|before_or_equal:today', 'tgl_estimasi_selesai' => 'required|date', 'jam_minum' => 'required' ]); // ========================= // CEK USER // ========================= $user = DB::table('users') ->where('id_user', $id_user) ->first(); if (!$user) { return response()->json([ 'success' => false, 'message' => 'User tidak ditemukan' ], 404); } DB::beginTransaction(); // ========================= // AMBIL PENGOBATAN TERAKHIR // ========================= $jumlahPengobatan = DB::table('pasien_medis') ->where('id_user', $id_user) ->count(); $nextPengobatan = $jumlahPengobatan + 1; // ========================= // INSERT RIWAYAT BARU // ========================= DB::table('pasien_medis')->insert([ 'id_user' => $id_user, 'pengobatan_ke' => $nextPengobatan, 'diagnosa' => $validated['diagnosa'], 'tgl_mulai_pengobatan' => $validated['tgl_mulai_pengobatan'], 'tgl_estimasi_selesai' => $validated['tgl_estimasi_selesai'], 'jam_minum' => $validated['jam_minum'], 'status_kesehatan' => 'Masih Proses', ]); // ========================= // LOG AKTIVITAS // ========================= DB::table('log_aktivitas')->insert([ 'id_petugas' => session('petugas_id'), 'aktivitas' => 'Menambah riwayat pengobatan pasien ID: ' . $id_user, 'created_at' => now(), 'updated_at' => now() ]); DB::commit(); DashboardController::updateNotifikasiHariIni($id_user); return response()->json([ 'success' => true, 'message' => 'Riwayat pengobatan berhasil ditambahkan' ]); } catch (\Exception $e) { DB::rollBack(); return response()->json([ 'success' => false, 'message' => 'Gagal simpan riwayat: ' . $e->getMessage() ], 500); } } public function getFileByMedis($id) { if (session('role') === 'super_admin') { return redirect('/dashboard'); } $files = DB::table('file_pasien') ->where('id_medis', $id) ->orderByDesc('id_file') ->get(); return response()->json([ 'success' => true, 'data' => $files ]); } }