get('logged_in')) { header('Location: ' . base_url('login')); exit; } $timeout = 600; if ( $session->get('last_activity') && (time() - $session->get('last_activity')) > $timeout ) { $session->remove([ 'id', 'nama', 'username', 'role', 'logged_in', 'last_activity' ]); $session->setFlashdata( 'error', 'Sesi Anda telah berakhir karena tidak ada aktivitas selama 10 menit.' ); header('Location: ' . base_url('login')); exit; } $session->set('last_activity', time()); } public function login() { if (session()->get('logged_in')) { return redirect()->to('/'); } return view('auth/login'); } public function dashboard() { $db = \Config\Database::connect(); $builder = $db->table('register_ambulans'); $data = [ 'total' => (clone $builder) ->where('status !=', 'batal') ->countAllResults(), 'emergency' => (clone $builder) ->where('order_type', 'True Emergency') ->where('status !=', 'batal') ->countAllResults(), 'non' => (clone $builder) ->where('order_type', 'Non Emergency') ->where('status !=', 'batal') ->countAllResults(), 'pending' => (clone $builder) ->where('order_type', 'Pending Order') ->where('status !=', 'batal') ->countAllResults(), ]; return view('dashboard', $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 '); $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) { $db = \Config\Database::connect(); $builder = $db->table('register_ambulans'); $p = $builder->where('id', $id)->get()->getRowArray(); if (!$p) return redirect()->back(); $fase = $p['fase'] ?? 1; if ($fase < 6) { $fase++; } $status = ($fase == 6) ? 'Selesai' : 'Diproses'; $builder->where('id', $id)->update([ 'fase' => $fase, 'status' => $status ]); return redirect()->back(); } public function create() { return view('pasien/create'); } private function generateRegister() { $today = date('ymd'); $db = \Config\Database::connect(); $builder = $db->table('register_ambulans'); $builder->like('register', "AMB-$today", 'after'); $count = $builder->countAllResults(); $urutan = str_pad($count + 1, 3, '0', STR_PAD_LEFT); return "AMB-$today-$urutan"; } private function hitungUmur($tglLahir) { if (empty($tglLahir) || $tglLahir == '0000-00-00') return '-'; try { $birth = new \DateTime($tglLahir); $today = new \DateTime(); $diff = $today->diff($birth); 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(); // VALIDASI $rules = [ 'rm' => 'required|numeric', 'nama' => 'required', 'gender' => 'required|in_list[Laki-laki,Perempuan]', 'tanggal_lahir' => 'required|valid_date', 'alamat' => 'required', '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; } // ================= 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); } } // ================= REGISTER ================= $db->table('register_ambulans')->insert([ 'rm' => $rm, 'register' => $this->generateRegister(), 'order_type' => $this->request->getPost('order_type'), 'fase' => 1, 'status' => 'Predispatch', // 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') ?? '', 'kie_transfer' => $this->request->getPost('kie_transfer') ?? '', 'persetujuan' => $this->request->getPost('persetujuan') ?? 'menunggu', 'biaya' => $this->request->getPost('biaya') ?? 0, 'validasi' => $this->request->getPost('validasi') ?? '', 'petugas_id' => $petugasId, ]; // ================= 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); } return redirect()->to('/pasien/aktif'); } public function cekRM() { $model = new \App\Models\PasienModel(); $rm = $this->request->getPost('rm'); $data = $model->where('rm', $rm)->first(); if ($data) { return $this->response->setJSON([ 'status' => 'found', 'data' => $data ]); } return $this->response->setJSON([ 'status' => 'not_found' ]); } public function linkRM() { $db = \Config\Database::connect(); $registerId = $this->request->getPost('register_id'); $rm = $this->request->getPost('rm'); $db->table('register_ambulans') ->where('id', $registerId) ->update(['rm' => $rm]); return $this->response->setJSON([ 'status' => 'success' ]); } public function search() { $q = $this->request->getPost('q'); $db = \Config\Database::connect(); $data = $db->table('pasien') ->like('rm', $q) ->orLike('nama', $q) ->limit(10) ->get() ->getResultArray(); return $this->response->setJSON([ 'data' => $data ]); } public function predispatch($id) { $db = \Config\Database::connect(); // ================= ROLE + MODE EDIT ================= $role = session()->get('role'); $edit_mode = $this->request->getGet('edit') == '1'; // ================= REGISTER + PASIEN ================= $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 ================= $pasien['umur'] = $this->hitungUmur($pasien['tgl_lahir'] ?? null); // ================= ORDER ================= $order = $db->table('pasien_order o') ->select('o.*, pg.nama as petugas_nama') ->join('pegawai pg', 'pg.id = o.petugas_id', 'left') ->where('o.register_id', $id) ->get() ->getRowArray(); // fallback aman if (!$order) { $order = []; } // ================= 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.alasan_batal, r.created_at, p.nama, p.atribut, p.gender, p.alamat, p.tgl_lahir, o.tujuan, pg.nama AS petugas_predispatch '); $builder->join( 'pasien_order o', 'o.register_id = r.id', 'left' ); $builder->join( 'pegawai pg', 'pg.id = o.petugas_id', 'left' ); $builder->join( 'pasien p', 'p.rm = r.rm', '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') ?? '', 'kie_transfer' => $this->request->getPost('kie_transfer') ?? '', '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, p.tgl_lahir ') ->join('pasien p', 'p.rm = r.rm', 'left') ->where('r.id', $id) ->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' ]); } }