MIF_E31231302_WEBSITE/app/Http/Controllers/PasienController.php

1670 lines
50 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Exports\PasienExport;
use Maatwebsite\Excel\Facades\Excel;
use Carbon\Carbon;
use Illuminate\Support\Facades\Storage;
use App\Models\User;
class PasienController extends Controller
{
public function __construct()
{
if (session('role') === 'super_admin') {
abort(403);
}
}
public function index(Request $request)
{
if (session('role') === 'super_admin') {
return redirect('/dashboard');
}
$id_petugas = session('petugas_id');
if ($id_petugas === null) {
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();
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
]);
}
}