Update controller Pasien

This commit is contained in:
2026-08-03 15:55:00 +07:00
parent 4d677fbd8a
commit 245bef85e0
+648 -110
View File
@@ -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'
]);
}
}