From 9751007863e85b6715cb5def540958725c7def95 Mon Sep 17 00:00:00 2001 From: Dwi Swandhana Date: Wed, 8 Apr 2026 05:44:57 +0700 Subject: [PATCH] update --- .../app/Http/Controllers/DokterController.php | 125 +++++++++++++++--- .../views/dokter/pemeriksaan.blade.php | 13 +- .../notifications/critical-values.blade.php | 30 ++++- htdocs/resources/views/pengambilan.blade.php | 1 + 4 files changed, 151 insertions(+), 18 deletions(-) diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index f0c7be24..dbb28316 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -719,9 +719,13 @@ class DokterController extends Controller protected function shouldMarkAsCritical(Request $request): bool { $flag = strtolower((string) $request->input('nilai_kritis', '0')); - $master = (string) $request->input('master_mikro', ''); + $periksaId = $request->input('periksa_id'); + $periksa = !empty($periksaId) + ? Periksa::select('nm_spesimen')->find($periksaId) + : null; + $nmSpesimen = strtoupper(trim((string) ($periksa->nm_spesimen ?? ''))); - if ($master !== 'buku03') { + if (!str_contains($nmSpesimen, 'DARAH')) { return false; } @@ -759,34 +763,119 @@ class DokterController extends Controller } protected function getPendingCriticalValueItems() { - return CriticalValueSample::whereNull('followed_up_at') + return $this->appendCriticalValueTatMeta( + CriticalValueSample::whereNull('followed_up_at') ->orderBy('critical_set_at', 'asc') - ->get(); + ->get() + ); } - protected function getFollowedCriticalValueItems() + protected function resolveCriticalValueReportRange(Request $request): array { - return CriticalValueSample::whereNotNull('followed_up_at') + $defaultStart = Carbon::now()->startOfMonth()->toDateString(); + $defaultEnd = Carbon::now()->endOfMonth()->toDateString(); + $startDate = trim((string) $request->query('start_date', $defaultStart)); + $endDate = trim((string) $request->query('end_date', $defaultEnd)); + + try { + $start = Carbon::createFromFormat('Y-m-d', $startDate)->startOfDay(); + } catch (\Throwable $e) { + $start = Carbon::createFromFormat('Y-m-d', $defaultStart)->startOfDay(); + $startDate = $defaultStart; + } + + try { + $end = Carbon::createFromFormat('Y-m-d', $endDate)->endOfDay(); + } catch (\Throwable $e) { + $end = Carbon::createFromFormat('Y-m-d', $defaultEnd)->endOfDay(); + $endDate = $defaultEnd; + } + + if ($start->gt($end)) { + [$start, $end] = [$end->copy()->startOfDay(), $start->copy()->endOfDay()]; + $startDate = $start->toDateString(); + $endDate = $end->toDateString(); + } + + return [ + 'start_date' => $startDate, + 'end_date' => $endDate, + 'start_at' => $start, + 'end_at' => $end, + ]; + } + protected function getFollowedCriticalValueItems(?Carbon $startAt = null, ?Carbon $endAt = null) + { + $query = CriticalValueSample::whereNotNull('followed_up_at'); + + if ($startAt !== null) { + $query->where('followed_up_at', '>=', $startAt); + } + + if ($endAt !== null) { + $query->where('followed_up_at', '<=', $endAt); + } + + return $this->appendCriticalValueTatMeta( + $query ->orderBy('followed_up_at', 'desc') ->limit(100) - ->get(); + ->get() + ); + } + protected function appendCriticalValueTatMeta($items) + { + return $items->map(function ($item) { + $item->tat_minutes = null; + $item->tat_duration_label = '-'; + $item->tat_status_label = '-'; + + if (!empty($item->critical_set_at) && !empty($item->followed_up_at)) { + $criticalSetAt = Carbon::parse($item->critical_set_at); + $followedUpAt = Carbon::parse($item->followed_up_at); + $diffMinutes = $criticalSetAt->diffInMinutes($followedUpAt); + + $item->tat_minutes = $diffMinutes; + $item->tat_duration_label = $this->formatTatDuration($diffMinutes); + $item->tat_status_label = $diffMinutes <= 30 ? 'Memenuhi TAT' : 'Tidak Memenuhi TAT'; + } + + return $item; + }); + } + protected function formatTatDuration(int $totalMinutes): string + { + $hours = intdiv($totalMinutes, 60); + $minutes = $totalMinutes % 60; + + if ($hours > 0) { + return $hours.' jam '.$minutes.' menit'; + } + + return $minutes.' menit'; } public function criticalValueNotifications(Request $request) { $highlightId = $request->query('highlight'); + $reportRange = $this->resolveCriticalValueReportRange($request); $items = $this->getPendingCriticalValueItems(); - $followedItems = $this->getFollowedCriticalValueItems(); + $followedItems = $this->getFollowedCriticalValueItems($reportRange['start_at'], $reportRange['end_at']); return view('notifications.critical-values', [ 'items' => $items, 'followedItems' => $followedItems, 'highlightId' => $highlightId, + 'startDate' => $reportRange['start_date'], + 'endDate' => $reportRange['end_date'], ]); } public function criticalValueNotificationExport(Request $request) { $type = $request->query('type', 'pending'); $isFollowed = $type === 'followed'; - $rows = $isFollowed ? $this->getFollowedCriticalValueItems() : $this->getPendingCriticalValueItems(); + $reportRange = $this->resolveCriticalValueReportRange($request); + $rows = $isFollowed + ? $this->getFollowedCriticalValueItems($reportRange['start_at'], $reportRange['end_at']) + : $this->getPendingCriticalValueItems(); $filename = $isFollowed ? 'notifikasi-nilai-kritis-riwayat-'.Carbon::now()->format('Ymd_His').'.xlsx' : 'notifikasi-nilai-kritis-belum-dilaporkan-'.Carbon::now()->format('Ymd_His').'.xlsx'; @@ -807,6 +896,8 @@ class DokterController extends Controller 'Diset Oleh', 'Waktu Ditindaklanjuti', 'Ditindaklanjuti Oleh', + 'Selisih Waktu', + 'Status TAT', 'Status Tindak Lanjut', 'Metode', 'Penerima Laporan', @@ -836,6 +927,8 @@ class DokterController extends Controller $item->critical_set_by_name ?? '-', $item->followed_up_at ? Carbon::parse($item->followed_up_at)->format('d-m-Y H:i:s') : '-', $item->followed_up_by_name ?? '-', + $item->tat_duration_label ?? '-', + $item->tat_status_label ?? '-', $statusLabel, $item->follow_up_method ?? '-', $item->follow_up_recipient ?? '-', @@ -844,7 +937,7 @@ class DokterController extends Controller $rowNumber++; } - foreach (range('A', 'N') as $col) { + foreach (range('A', 'P') as $col) { $sheet->getColumnDimension($col)->setAutoSize(true); } @@ -943,7 +1036,7 @@ class DokterController extends Controller $updated = Periksa::where('id', $id)->update([ 'noloket' => null, - 'status' => 'Batal', + 'status' => 'Dibatalkan (Arsip)', ]); if (!$updated) { @@ -1004,7 +1097,7 @@ class DokterController extends Controller Periksa::where('id', $idperiksa)->orWhere('nofoto', $idperiksa)->update([ 'keterangan' => $val01, 'admin' => Session('nama'), - 'status' => 'Batal' + 'status' => 'Dibatalkan (Arsip)' ]); if ($pacsaddr == '' OR $pacsaddr === null){ $pesan = ''; @@ -3546,9 +3639,9 @@ class DokterController extends Controller if ($status == '' OR is_null($status)){ $status = 'new'; } else { - $cekbatal = explode('batalkan dengan alasan ', $status); + $cekbatal = explode('batal', $status); if (isset($cekbatal[1])){ - $keterangan = $cekbatal[1]; + $keterangan = $status; $status = 'Batal'; } else { if ($status == 'Arsip' OR $status == 'Selesai'){ @@ -3592,9 +3685,9 @@ class DokterController extends Controller if ($status == '' OR is_null($status)){ $status = 'new'; } else { - $cekbatal = explode('batalkan dengan alasan ', $status); + $cekbatal = explode('batal', $status); if (isset($cekbatal[1])){ - $keterangan = $cekbatal[1]; + $keterangan = $status; $status = 'Batal'; } else { if ($status == 'Arsip' OR $status == 'Selesai'){ diff --git a/htdocs/resources/views/dokter/pemeriksaan.blade.php b/htdocs/resources/views/dokter/pemeriksaan.blade.php index cbd54728..0f0adfa1 100644 --- a/htdocs/resources/views/dokter/pemeriksaan.blade.php +++ b/htdocs/resources/views/dokter/pemeriksaan.blade.php @@ -2376,7 +2376,7 @@ @if (Session('previlage') == 'supervisor' OR Session('previlage') == 'developer') -
+