diff --git a/app/Controllers/Pasien.php b/app/Controllers/Pasien.php index ebe103d..8a0c68c 100644 --- a/app/Controllers/Pasien.php +++ b/app/Controllers/Pasien.php @@ -57,60 +57,139 @@ class Pasien extends BaseController $builder = $db->table('register_ambulans'); $data = [ - 'total' => (clone $builder)->countAllResults(), + 'total' => (clone $builder) + ->where('status !=', 'batal') + ->countAllResults(), - 'emergency' => (clone $builder) - ->where('order_type', 'True Emergency') - ->countAllResults(), + 'emergency' => (clone $builder) + ->where('order_type', 'True Emergency') + ->where('status !=', 'batal') + ->countAllResults(), - 'non' => (clone $builder) - ->where('order_type', 'Non Emergency') - ->countAllResults(), + 'non' => (clone $builder) + ->where('order_type', 'Non Emergency') + ->where('status !=', 'batal') + ->countAllResults(), - 'pending' => (clone $builder) - ->where('order_type', 'Pending Order') - ->countAllResults(), + 'pending' => (clone $builder) + ->where('order_type', 'Pending Order') + ->where('status !=', 'batal') + ->countAllResults(), ]; return view('dashboard', $data); } - public function input() - { - $data['register'] = $this->generateRegister(); - return view('input', $data); + public function input($id = null) +{ + $db = \Config\Database::connect(); + + $edit_mode = false; + $pasien = []; + $order = []; + $register = null; + + // ================= EDIT MODE ================= + if (!empty($id)) { + + $edit_mode = true; + + $pasien = $db->table('register_ambulans r') + ->select(' + r.id, + r.rm, + r.register, + r.order_type, + r.status, + r.fase, + r.nama_penelpon, + r.no_penelpon, + + p.atribut, + p.nama, + p.alamat, + p.gender, + p.tgl_lahir + ') + ->join('pasien p', 'p.rm = r.rm', 'left') + ->where('r.id', $id) + ->get() + ->getRowArray(); + + // ❌ kalau data tidak ada → redirect + if (!$pasien) { + return redirect()->to('/pasien/aktif') + ->with('error', 'Data tidak ditemukan'); + } + + // ================= ORDER ================= + $order = $db->table('pasien_order o') + ->select('o.*, pg.nama as petugas_nama, ra.order_type') + ->join('pegawai pg', 'pg.id = o.petugas_id', 'left') + ->join('register_ambulans ra', 'ra.id = o.register_id', 'left') + ->where('o.register_id', $id) + ->get() + ->getRowArray(); + + // fallback biar view aman + if (!$order) { + $order = []; + } + + // register ambil dari DB + $register = $pasien['register'] ?? null; + + } else { + + // ================= INPUT BARU ================= + $register = $this->generateRegister(); + + // kosongkan biar view tidak error + $pasien = []; + $order = []; } + return view('input', [ + 'pasien' => $pasien, + 'order' => $order, + 'edit_mode' => $edit_mode, + 'id' => $id, + 'register' => $register + ]); +} + public function aktif() - { +{ $db = \Config\Database::connect(); $builder = $db->table('register_ambulans r'); $builder->select(' - r.id, - r.register, - r.rm, - r.order_type, - r.status, - r.fase, - r.prioritas, - r.created_at, - r.nama_penelpon, - r.no_penelpon, - p.nama, - p.gender, - p.alamat + r.id, + r.register, + r.rm, + r.order_type, + r.status, + r.fase, + r.prioritas, + r.created_at, + r.nama_penelpon, + r.no_penelpon, + p.nama, + p.gender, + p.alamat '); $builder->join('pasien p', 'p.rm = r.rm', 'left'); + $builder->where('r.status !=', 'batal'); + $builder->orderBy('r.id', 'DESC'); $data['pasien'] = $builder->get()->getResultArray(); return view('pasien_aktif', $data); - } +} public function next($id) { @@ -159,104 +238,196 @@ class Pasien extends BaseController private function hitungUmur($tglLahir) { - if (!$tglLahir) return '-'; + if (empty($tglLahir) || $tglLahir == '0000-00-00') return '-'; - $birth = new \DateTime($tglLahir); - $today = new \DateTime(); + try { + $birth = new \DateTime($tglLahir); + $today = new \DateTime(); - $umur = $today->diff($birth)->y; + $diff = $today->diff($birth); - return $umur . ' tahun'; + return sprintf( + '%d tahun %d bulan %d hari', + $diff->y, + $diff->m, + $diff->d + ); + } catch (\Exception $e) { + return '-'; + } } public function simpan() { $db = \Config\Database::connect(); - $rm = $this->request->getPost('no_rm'); + // VALIDASI + $rules = [ + 'rm' => 'required|numeric', + 'nama' => 'required', + 'gender' => 'required|in_list[Laki-laki,Perempuan]', + 'tanggal_lahir' => 'required|valid_date', + 'alamat' => 'required', - if (empty($rm)) { + 'nama_penelpon' => 'required', + 'no_penelpon' => 'required|numeric', + + 'order_type' => 'required', + 'kategori' => 'required', + + 'kesadaran' => 'required', + 'suhu' => 'required', + + 'persetujuan' => 'required|in_list[setuju,tidak,menunggu]', + 'tujuan' => 'required', + + 'petugas_id' => 'required' + ]; + + // VALIDASI CONDITIONAL + if ($this->request->getPost('status_nyeri') === 'ya') { + $rules['lokasi_nyeri'] = 'required'; + } + + if ($this->request->getPost('bahaya') === 'ada') { + $rules['bahaya_detail'] = 'required'; + } + + if ($this->request->getPost('posisi_pasien') === 'lainnya') { + $rules['posisi_lainnya'] = 'required'; + } + + // EKSEKUSI VALIDASI + if (!$this->validate($rules)) { + return redirect()->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + // ================= AMBIL INPUT ================= + $rm = $this->request->getPost('rm'); + + // normalisasi RM → hanya angka + if (!empty($rm)) { + $rm = preg_replace('/[^0-9]/', '', $rm); + } else { $rm = null; } - // ================= CEK PASIEN ================= - $pasien = null; + // ================= DATA PASIEN ================= + $dataPasien = [ + 'atribut' => $this->request->getPost('panggilan_depan') ?? '', + 'nama' => $this->request->getPost('nama') ?? '', + 'gender' => $this->request->getPost('gender') ?? '', + 'alamat' => $this->request->getPost('alamat') ?? '', + 'tgl_lahir' => $this->request->getPost('tanggal_lahir') ?? '', + ]; + // ================= CEK PASIEN ================= if ($rm) { + $pasien = $db->table('pasien') ->where('rm', $rm) ->get() ->getRowArray(); + + if ($pasien) { + // ✅ UPDATE pasien lama + $db->table('pasien') + ->where('rm', $rm) + ->update($dataPasien); + } else { + // ✅ INSERT pasien baru + $dataPasien['rm'] = $rm; + $db->table('pasien')->insert($dataPasien); + } } - // ================= JIKA PASIEN BARU ================= - if ($rm && !$pasien) { + // ================= REGISTER ================= + $db->table('register_ambulans')->insert([ + 'rm' => $rm, + 'register' => $this->generateRegister(), + 'order_type' => $this->request->getPost('order_type'), + 'fase' => 1, + 'status' => 'Predispatch', - $dataPasien = [ - 'rm' => $rm, - 'atribut' => $this->request->getPost('panggilan_depan'), - 'nama' => $this->request->getPost('nama'), - 'gender' => $this->request->getPost('gender'), - 'alamat' => $this->request->getPost('alamat'), - 'tgl_lahir' => $this->request->getPost('tanggal_lahir'), + // penelpon + 'nama_penelpon' => $this->request->getPost('nama_penelpon') ?? '', + 'no_penelpon' => $this->request->getPost('no_penelpon') ?? '', + ]); + + // ambil id (register_id saat edit) + $id = $this->request->getPost('id'); + + $petugasId = $this->request->getPost('petugas_id'); + + if (empty($petugasId)) { + $petugasId = $this->request->getPost('petugas_id_old'); + } + // ================= DATA ORDER ================= + $dataOrder = [ + 'keluhan_utama' => $this->request->getPost('keluhan_utama') ?? '', + 'kesadaran' => $this->request->getPost('kesadaran') ?? '', + 'kategori' => $this->request->getPost('kategori') ?? '', + + 'pernafasan' => json_encode([ + 'sesak' => $this->request->getPost('sesak') ?? '', + 'batuk' => $this->request->getPost('batuk') ?? '', + ]), + + 'posisi' => json_encode([ + 'lokasi' => $this->request->getPost('posisi_pasien') ?? '', + 'lantai' => $this->request->getPost('posisi_lantai') ?? '', + 'lainnya' => $this->request->getPost('posisi_lainnya') ?? '' + ]), + + 'keterbatasan' => $this->request->getPost('gerak') ?? '', + + 'nyeri' => json_encode([ + 'status' => $this->request->getPost('status_nyeri') ?? '', + 'lokasi' => $this->request->getPost('lokasi_nyeri') ?? [], + 'lain' => $this->request->getPost('nyeri_lain') ?? '', + ]), + + 'suhu' => $this->request->getPost('suhu') ?? '', + + 'bahaya' => json_encode([ + 'status' => $this->request->getPost('bahaya') ?? '', + 'detail' => $this->request->getPost('bahaya_detail') ?? '' + ]), + + 'berat_badan' => $this->request->getPost('berat_badan') ?? '', + 'tujuan' => $this->request->getPost('tujuan') ?? '', + 'tujuan_detail' => $this->request->getPost('tujuan_detail') ?? '', + 'informasi_lain'=> $this->request->getPost('informasi_lain') ?? '', + + 'persetujuan' => $this->request->getPost('persetujuan') ?? 'menunggu', + 'biaya' => $this->request->getPost('biaya') ?? 0, + 'validasi' => $this->request->getPost('validasi') ?? '', + 'petugas_id' => $petugasId, ]; - $db->table('pasien')->insert($dataPasien); + + // ================= INSERT / UPDATE ================= + if ($id) { + + // ✅ EDIT MODE → UPDATE + $db->table('pasien_order') + ->where('register_id', $id) + ->update($dataOrder); + + } else { + + // ✅ INPUT BARU → INSERT + $registerId = $db->insertID(); // dari register_ambulans + + $dataOrder['register_id'] = $registerId; + + $db->table('pasien_order')->insert($dataOrder); } - // ================= SIMPAN REGISTER ================= - $dataRegister = [ - 'rm' => $rm, - 'register' => $this->generateRegister(), - 'order_type' => $this->request->getPost('order_type'), - 'fase' => 1, - 'status' => 'Predispatch', - ]; - - $db->table('register_ambulans')->insert($dataRegister); - - $registerId = $db->insertID(); - - $dataOrder = [ - 'register_id' => $registerId, - 'nama_penelpon' => $this->request->getPost('nama_penelpon'), - 'no_penelpon' => $this->request->getPost('no_penelpon'), - 'kesadaran' => $this->request->getPost('kesadaran'), - 'kategori' => $this->request->getPost('kategori'), - 'pernafasan' => json_encode([ - 'sesak' => $this->request->getPost('sesak'), - 'batuk' => $this->request->getPost('batuk'), - ]), - 'posisi' => json_encode([ - 'lokasi' => $this->request->getPost('posisi_pasien'), - 'lainnya' => $this->request->getPost('posisi_lainnya') - ]), - 'keterbatasan' => $this->request->getPost('gerak'), - 'nyeri' => json_encode([ - 'status' => $this->request->getPost('status_nyeri'), - 'lokasi' => $this->request->getPost('lokasi_nyeri'), - 'lain' => $this->request->getPost('nyeri_lain'), - ]), - 'suhu' => $this->request->getPost('suhu'), - 'bahaya' => json_encode([ - 'status' => $this->request->getPost('bahaya'), - 'detail' => $this->request->getPost('bahaya_detail') - ]), - 'berat_badan' => $this->request->getPost('berat_badan'), - - 'keluhan_utama' => $this->request->getPost('keluhan_utama'), - 'tujuan' => $this->request->getPost('tujuan'), - 'tujuan_detail' => $this->request->getPost('tujuan_detail'), - 'persetujuan' => $this->request->getPost('persetujuan'), - 'biaya' => $this->request->getPost('biaya'), - 'validasi' => $this->request->getPost('validasi'), - 'petugas_id' => $this->request->getPost('petugas_id'), - ]; - $db->table('pasien_order')->insert($dataOrder); - return redirect()->to('/pasien/aktif'); } - + public function cekRM() { $model = new \App\Models\PasienModel(); @@ -311,22 +482,37 @@ class Pasien extends BaseController ]); } - public function predispatch($id) + public function predispatch($id) { $db = \Config\Database::connect(); + // ================= ROLE + MODE EDIT ================= + $role = session()->get('role'); + $edit_mode = $this->request->getGet('edit') == '1'; + // ================= REGISTER + PASIEN ================= - $data['pasien'] = $db->table('register_ambulans r') - ->select('r.*, p.nama, p.alamat, p.gender, p.tgl_lahir') - ->join('pasien p', 'p.rm = r.rm', 'left') - ->where('r.id', $id) - ->get() - ->getRowArray(); + $pasien = $db->table('register_ambulans r') + ->select(' + r.*, + COALESCE(NULLIF(p.atribut, ""), r.atribut) as atribut, + COALESCE(NULLIF(p.nama, ""), r.nama_pasien) as nama, + COALESCE(NULLIF(p.alamat, ""), r.alamat) as alamat, + COALESCE(NULLIF(p.gender, ""), r.gender) as gender, + COALESCE(NULLIF(p.tgl_lahir, ""), r.tgl_lahir) as tgl_lahir + ') + ->join('pasien p', 'p.rm = r.rm', 'left') + ->where('r.id', $id) + ->get() + ->getRowArray(); + + if (!$pasien) { + return redirect()->to('/pasien/aktif'); + } // ================= UMUR ================= - $data['pasien']['umur'] = $this->hitungUmur($data['pasien']['tgl_lahir'] ?? null); + $pasien['umur'] = $this->hitungUmur($pasien['tgl_lahir'] ?? null); - // ================= ORDER + PETUGAS ================= + // ================= ORDER ================= $order = $db->table('pasien_order o') ->select('o.*, pg.nama as petugas_nama') ->join('pegawai pg', 'pg.id = o.petugas_id', 'left') @@ -334,8 +520,360 @@ class Pasien extends BaseController ->get() ->getRowArray(); - $data['order'] = $order ?? []; + // fallback aman + if (!$order) { + $order = []; + } - return view('predispatch', $data); + // ================= VIEW SWITCH ================= + if ($edit_mode) { + return view('input', [ + 'pasien' => $pasien, + 'order' => $order, + 'role' => $role, + 'edit_mode' => true, + 'register' => $pasien['register'] + ]); + } + + return view('predispatch', [ + 'pasien' => $pasien, + 'order' => $order, + 'role' => $role, + 'edit_mode' => false + ]); + } + + public function list() + { + $db = \Config\Database::connect(); + + // 🔽 DEFAULT BULAN SEKARANG + $periode = $this->request->getGet('periode') ?? date('Y-m'); + $bulan = date('m', strtotime($periode)); + $tahun = date('Y', strtotime($periode)); + + // ================= LIST DATA ================= + $builder = $db->table('register_ambulans r'); + + $builder->select(' + r.id, + r.register, + r.rm, + r.order_type, + r.fase, + r.status, + r.created_at, + p.nama, + p.atribut, + p.gender, + p.alamat, + p.tgl_lahir, + o.tujuan + '); + + $builder->join('pasien p', 'p.rm = r.rm', 'left'); + $builder->join('pasien_order o', 'o.register_id = r.id', 'left'); + + // filter bulan + $builder->where('MONTH(r.created_at)', $bulan); + $builder->where('YEAR(r.created_at)', $tahun); + + $builder->orderBy('r.created_at', 'DESC'); + + $data['pasien'] = $builder->get()->getResultArray(); + + // ================= REKAP ================= + + // TOTAL + $data['total'] = $db->table('register_ambulans r') + ->where('MONTH(r.created_at)', $bulan) + ->where('YEAR(r.created_at)', $tahun) + ->countAllResults(); + + // ✅ TERLAYANI (fase = 6) + $data['terlayani'] = $db->table('register_ambulans r') + ->where('MONTH(r.created_at)', $bulan) + ->where('YEAR(r.created_at)', $tahun) + ->where('r.fase', 6) + ->countAllResults(); + + // ⏳ DALAM PELAYANAN + $data['dalam_pelayanan'] = $db->table('register_ambulans r') + ->where('MONTH(r.created_at)', $bulan) + ->where('YEAR(r.created_at)', $tahun) + ->where('r.fase <', 6) + ->where('r.status !=', 'batal') + ->countAllResults(); + + // ❌ BATAL + $data['batal'] = $db->table('register_ambulans r') + ->where('MONTH(r.created_at)', $bulan) + ->where('YEAR(r.created_at)', $tahun) + ->where('r.status', 'batal') + ->countAllResults(); + + $data['periode'] = $periode; + + return view('pasien/list', $data); + } + + public function edit($id) + { + $db = \Config\Database::connect(); + + // ambil data register + pasien + $data['pasien'] = $db->table('register_ambulans r') + ->select('r.*, p.nama, p.atribut, p.gender, p.alamat, p.tgl_lahir') + ->join('pasien p', 'p.rm = r.rm', 'left') + ->where('r.id', $id) + ->get() + ->getRowArray(); + + // ambil order + $data['order'] = $db->table('pasien_order') + ->where('register_id', $id) + ->get() + ->getRowArray(); + + return view('pasien/edit', $data); + } + + public function update($id) +{ + $db = \Config\Database::connect(); + $role = session()->get('role'); + + // ================= REGISTER (TIDAK BOLEH DIUBAH) ================= + $register = $db->table('register_ambulans') + ->where('id', $id) + ->get() + ->getRowArray(); + + $rm = $this->request->getPost('rm'); + + // ================= PASIEN ================= + $dataPasien = [ + 'atribut' => $this->request->getPost('panggilan_depan'), + 'nama' => $this->request->getPost('nama'), + 'gender' => $this->request->getPost('gender'), + 'alamat' => $this->request->getPost('alamat'), + 'tgl_lahir' => $this->request->getPost('tanggal_lahir'), + ]; + + // RM HANYA ADMIN + if ($role === 'admin') { + $db->table('register_ambulans') + ->where('id', $id) + ->update(['rm' => $rm]); + } + + // update pasien by RM lama + $db->table('pasien') + ->where('rm', $register['rm']) + ->update($dataPasien); + + // ================= UPDATE ORDER TYPE ================= + $db->table('register_ambulans') + ->where('id', $id) + ->update([ + 'order_type' => $this->request->getPost('order_type') + ]); + // ================= ORDER (SEMUA BOLEH DIEDIT) ================= + $statusNyeri = $this->request->getPost('status_nyeri') ?? ''; + $lokasiNyeri = $this->request->getPost('lokasi_nyeri') ?? []; + $nyeriLain = $this->request->getPost('nyeri_lain') ?? ''; + $petugasId = $this->request->getPost('petugas_id'); + if (empty($petugasId)) { + $petugasId = $this->request->getPost('petugas_id_old'); + } + $dataOrder = [ + 'keluhan_utama' => $this->request->getPost('keluhan_utama'), + 'kesadaran' => $this->request->getPost('kesadaran'), + + 'pernafasan' => json_encode([ + 'sesak' => $this->request->getPost('sesak') ?? '', + 'batuk' => $this->request->getPost('batuk') ?? '', + ], JSON_UNESCAPED_UNICODE), + + 'posisi' => json_encode([ + 'lokasi' => $this->request->getPost('posisi_pasien') ?? '', + 'lantai' => $this->request->getPost('posisi_lantai') ?? '', + 'lainnya' => $this->request->getPost('posisi_lainnya') ?? '', + ]), + + 'keterbatasan' => $this->request->getPost('gerak') ?? '', + + 'nyeri' => json_encode([ + 'status' => $statusNyeri, + 'lokasi' => is_array($lokasiNyeri) ? $lokasiNyeri : [$lokasiNyeri], + 'lain' => $nyeriLain ?? '' + ], JSON_UNESCAPED_UNICODE), + + 'suhu' => $this->request->getPost('suhu'), + + 'bahaya' => json_encode([ + 'status' => $this->request->getPost('bahaya') ?? '', + 'detail' => $this->request->getPost('bahaya_detail') ?? '', + ], JSON_UNESCAPED_UNICODE), + + 'berat_badan' => $this->request->getPost('berat_badan'), + + 'tujuan' => $this->request->getPost('tujuan'), + 'tujuan_detail' => $this->request->getPost('tujuan_detail'), + 'persetujuan' => $this->request->getPost('persetujuan'), + 'biaya' => $this->request->getPost('biaya'), + 'informasi_lain' => $this->request->getPost('informasi_lain') ?? '', + 'validasi' => $this->request->getPost('validasi'), + 'petugas_id' => $petugasId, + ]; + $db->table('pasien_order') + ->where('register_id', $id) + ->update($dataOrder); + + return redirect()->to('/pasien/predispatch/' . $id); + } + + public function index() + { + $db = \Config\Database::connect(); + $builder = $db->table('pasien'); + + $periode = $this->request->getGet('periode'); + + if ($periode) { + $bulan = date('m', strtotime($periode)); + $tahun = date('Y', strtotime($periode)); + + $builder->where('MONTH(tgl_masuk)', $bulan); + $builder->where('YEAR(tgl_masuk)', $tahun); + } + + // ambil data + $data['pasien'] = $builder->get()->getResultArray(); + + // kirim ke view + return view('list', $data); + } + + public function detail($id) + { + $db = \Config\Database::connect(); + + $pasien = $db->table('register_ambulans r') + ->select('r.*, p.nama, p.alamat, p.gender') + ->join('pasien p', 'p.rm = r.rm', 'left') + ->where('r.id', $id) // 🔥 INI KUNCI + ->get() + ->getRowArray(); + + if (!$pasien) { + return redirect()->to('/pasien/list'); + } + + return view('pasien/detail_riwayat', [ + 'p' => $pasien + ]); + } + + public function hapus($id) + { + $db = \Config\Database::connect(); + + // ========================= + // VALIDASI PASSWORD + // ========================= + $password = $this->request->getPost('admin_password'); + + if ($password !== 'admin119') { + return redirect()->back() + ->with('error', 'Password admin salah'); + } + + // ========================= + // CEK DATA + // ========================= + $cek = $db->table('register_ambulans') + ->where('id', $id) + ->get() + ->getRowArray(); + + if (!$cek) { + return redirect()->back() + ->with('error', 'Data tidak ditemukan'); + } + + // ========================= + // HAPUS RELASI + // ========================= + $db->table('pasien_order') + ->where('register_id', $id) + ->delete(); + + // ========================= + // HAPUS DATA + // ========================= + $db->table('register_ambulans') + ->where('id', $id) + ->delete(); + + return redirect()->to('/pasien/list') + ->with('success', 'Data berhasil dihapus'); + } + + public function batal() +{ + $data = $this->request->getJSON(true); + + $id = $data['id'] ?? null; + $alasan = $data['alasan'] ?? ''; + + if (!$id) { + return $this->response->setJSON([ + 'status' => 'error', + 'message' => 'ID tidak ditemukan' + ]); + } + + $db = \Config\Database::connect(); + + $db->table('register_ambulans') + ->where('id', $id) + ->update([ + 'status' => 'batal', + 'fase' => 0, // 🔥 WAJIB biar stop total + 'alasan_batal' => $alasan + ]); + + return $this->response->setJSON([ + 'status' => 'ok' + ]); +} + + public function aktifkan() + { + $data = $this->request->getJSON(true); + + $id = $data['id'] ?? null; + + if (!$id) { + return $this->response->setJSON([ + 'status' => 'error' + ]); + } + + $db = \Config\Database::connect(); + + $db->table('register_ambulans') + ->where('id', $id) + ->update([ + 'status' => 'Predispatch', + 'fase' => 1, + 'alasan_batal' => null + ]); + + return $this->response->setJSON([ + 'status' => 'ok' + ]); } } \ No newline at end of file