MIF_E31230892/sim-pkpps/app/Http/Controllers/Santri/SantriKesehatanController.php

163 lines
5.7 KiB
PHP

<?php
// app/Http/Controllers/Santri/SantriKesehatanController.php
namespace App\Http\Controllers\Santri;
use App\Http\Controllers\Controller;
use App\Models\KesehatanSantri;
use App\Models\Santri;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class SantriKesehatanController extends Controller
{
private function getSantriId()
{
return auth('santri')->user()->id_santri;
}
/**
* Tampilkan riwayat kesehatan santri yang sedang login
*/
public function index(Request $request)
{
$idSantri = $this->getSantriId();
// ✅ Fix: hapus 'kelas' dari select, tambah eager load kelasPrimary
$santri = Santri::with('kelasPrimary.kelas')
->where('id_santri', $idSantri)
->select('id_santri', 'nama_lengkap', 'jenis_kelamin', 'status')
->firstOrFail();
// -- Tentukan range tanggal --
$tanggalDari = $request->filled('tanggal_dari')
? Carbon::parse($request->tanggal_dari)
: Carbon::now()->startOfMonth();
$tanggalSampai = $request->filled('tanggal_sampai')
? Carbon::parse($request->tanggal_sampai)
: Carbon::now()->endOfMonth();
// -- Validasi tanggal --
if ($tanggalSampai->lt($tanggalDari)) {
return back()->withErrors([
'tanggal_sampai' => 'Tanggal sampai harus lebih besar dari tanggal dari.'
])->withInput();
}
// -- Statistik berdasarkan filter tanggal --
$baseQuery = KesehatanSantri::where('id_santri', $idSantri)
->whereBetween('tanggal_masuk', [
$tanggalDari->format('Y-m-d'),
$tanggalSampai->format('Y-m-d'),
]);
$statistik = [
'total_kunjungan' => (clone $baseQuery)->count(),
'sedang_dirawat' => (clone $baseQuery)->where('status', 'dirawat')->count(),
'sembuh' => (clone $baseQuery)->where('status', 'sembuh')->count(),
'izin' => (clone $baseQuery)->where('status', 'izin')->count(),
];
// -- Cek apakah SAAT INI sedang dirawat (semua waktu, bukan filter) --
$sedangDirawatSekarang = KesehatanSantri::where('id_santri', $idSantri)
->where('status', 'dirawat')
->latest('tanggal_masuk')
->first();
// -- Data grafik: kunjungan per bulan (6 bulan terakhir) --
$dataGrafik = KesehatanSantri::where('id_santri', $idSantri)
->where('tanggal_masuk', '>=', Carbon::now()->subMonths(6)->startOfMonth())
->select(
DB::raw('YEAR(tanggal_masuk) as tahun'),
DB::raw('MONTH(tanggal_masuk) as bulan'),
DB::raw('COUNT(*) as total'),
DB::raw('SUM(CASE WHEN status = "sembuh" THEN 1 ELSE 0 END) as sembuh'),
DB::raw('SUM(CASE WHEN status = "dirawat" THEN 1 ELSE 0 END) as dirawat'),
DB::raw('SUM(CASE WHEN status = "izin" THEN 1 ELSE 0 END) as izin')
)
->groupBy('tahun', 'bulan')
->orderBy('tahun')
->orderBy('bulan')
->get()
->map(fn($item) => [
'label' => Carbon::createFromDate($item->tahun, $item->bulan, 1)
->locale('id')->isoFormat('MMM YY'),
'total' => $item->total,
'sembuh' => $item->sembuh,
'dirawat' => $item->dirawat,
'izin' => $item->izin,
]);
// -- Statistik total keseluruhan (all time) --
$totalAllTime = KesehatanSantri::where('id_santri', $idSantri)->count();
$totalHariDirawat = KesehatanSantri::where('id_santri', $idSantri)->get()
->sum('lama_dirawat');
// -- Query riwayat dengan filter --
$query = KesehatanSantri::where('id_santri', $idSantri)
->whereBetween('tanggal_masuk', [
$tanggalDari->format('Y-m-d'),
$tanggalSampai->format('Y-m-d'),
]);
if ($request->filled('status')) {
$query->where('status', $request->status);
}
$riwayatKesehatan = $query->orderBy('tanggal_masuk', 'desc')
->paginate(10)
->appends($request->all());
$statusOptions = [
'dirawat' => 'Sedang Dirawat',
'sembuh' => 'Sembuh',
'izin' => 'Izin Sakit',
];
return view('santri.kesehatan.index', compact(
'riwayatKesehatan',
'santri',
'statistik',
'statusOptions',
'tanggalDari',
'tanggalSampai',
'sedangDirawatSekarang',
'dataGrafik',
'totalAllTime',
'totalHariDirawat'
));
}
/**
* Tampilkan detail riwayat kesehatan
*/
public function show($id)
{
$idSantri = $this->getSantriId();
// ✅ Fix: hapus 'kelas' dari select
$santri = Santri::with('kelasPrimary.kelas')
->where('id_santri', $idSantri)
->select('id_santri', 'nama_lengkap', 'jenis_kelamin', 'status')
->firstOrFail();
$kesehatanSantri = KesehatanSantri::where('id', $id)
->where('id_santri', $idSantri)
->firstOrFail();
// -- Riwayat lain santri ini (untuk konteks) --
$riwayatLain = KesehatanSantri::where('id_santri', $idSantri)
->where('id', '!=', $id)
->orderBy('tanggal_masuk', 'desc')
->take(3)
->get();
return view('santri.kesehatan.show', compact(
'kesehatanSantri',
'santri',
'riwayatLain'
));
}
}