# Ringkasan Proyek — Sistem Informasi Rumah Sakit (SIM-RS)

Dokumen ini adalah ringkasan teknis dari seluruh pembahasan pengembangan aplikasi, dibuat untuk melanjutkan pekerjaan di Claude Code. Semua kode sebelumnya ditulis manual lewat chat; mulai sekarang pekerjaan dilanjutkan sebagai agentic coding langsung di repository.

## 1. Stack & Konvensi Teknis

- **Framework**: CodeIgniter 4 (PHP 8.2, MySQL 8)
- **Autentikasi**: sederhana — 1 user admin (session-based), tabel `users` sudah menyiapkan kolom `role` (default `admin`) untuk nanti dipisah role/permission.
- **Frontend**: Bootstrap 5 (CDN), layout dasar `app/Views/layouts/main.php` dengan sidebar menu flat (akan dipecah per role belakangan).
- **Struktur**: saat ini flat (semua Controller di `app/Controllers/`, semua Model di `app/Models/`, View dikelompokkan per modul di `app/Views/<modul>/`). Belum dipisah ke struktur Modules/ terpisah.
- **Soft delete**: dipakai di tabel master data (`patients`, referensi tindakan/obat/konsultasi) via `deleted_at` + `useSoftDeletes` di Model.
- **Snapshot harga**: setiap transaksi yang mencatat harga (order IGD, obat IGD) menyalin `kode_snapshot`, `uraian_snapshot`, `harga_snapshot` ke tabel transaksi — tidak mengacu live ke tabel referensi, supaya histori harga tidak berubah jika master data diedit kemudian.
- **Multi-select/checkbox data**: disimpan sebagai kolom `TEXT` berisi JSON array (`json_encode`/`json_decode`), bukan tabel pivot — demi kesederhanaan di tahap prototyping ini.
- **Pola checklist cetak**: ada helper function `printChecklist()` (lokal di view cetak) untuk mengubah array pilihan + label menjadi teks dibaca.
- **Helper global**: `app/Helpers/odontogram_helper.php` — render grid odontogram (gigi permanen + gigi susu), dipakai di Poli Gigi (interaktif) dan cetaknya (read-only).

## 2. Alur Bisnis Inti (Status Kunjungan)

Tabel pusat: **`visits`** (1 baris = 1 kunjungan pasien ke 1 poli pada 1 tanggal), field `status` ENUM:
`registered → screening → consultation → done` (+ `cancelled`)

Alur umum (poli rawat jalan biasa — Gigi, Obgyn, dll):
```
Antrian (ambil nomor, umum/BPJS, per poli)
  → Registrasi (pilih/daftar pasien + dokter, bikin row `visits` status=registered)
  → Skrining Awal umum (perawat, status jadi 'consultation')
  → Poli (dokter periksa, status jadi 'done')
```

Alur khusus **IGD** (poli dengan kode `IGD`), menyimpang dari alur umum di atas sejak tahap skrining:
```
Antrian + Registrasi (sama seperti umum, status=registered)
  → Triase (perawat, status registered → screening)
  → Skrining Keperawatan IGD (perawat, status screening → consultation)
  → Dokter IGD (status consultation → done, lewat tombol "Selesaikan Pemeriksaan")
```

## 3. Modul yang Sudah Jadi

### 3.1 Fondasi
- `users` (login sederhana), `AuthFilter` (wajib login untuk semua route kecuali `/login`)
- Layout + sidebar (`app/Views/layouts/main.php`)

### 3.2 Master Data
- `patients` (No. RM 6 digit dari ID pasien, NIK, nama, gender, tgl lahir, alamat, telp, agama, alergi, dll)
- `doctors`, `polis` (kode unik, mis. `GIGI`, `OBGYN`, `IGD`), `doctor_schedules` (jadwal dokter per poli per hari)

### 3.3 Antrian Online (`Queue` controller, route `antrian/*`)
- Ambil nomor antrian **Umum** dan **BPJS** terpisah per poli per hari (format `A-001` / `B-001`)
- Saat ambil nomor: belum perlu pilih pasien/dokter (itu nanti di Registrasi)
- Cetak tiket antrian

### 3.4 Registrasi (`Registration` controller, route `registrasi/*`)
- Cari pasien existing (by No RM/NIK/nama) atau daftar pasien baru cepat (quick-add, auto generate No RM)
- Pilih dokter dari jadwal poli terkait → membuat row `visits`

### 3.5 Skrining Awal Umum (`Screening` controller, route `skrining/*`)
- Form skrining perawat generik (berlaku utk semua poli kecuali Gigi punya pemeriksaan dokter sendiri, Obgyn beda total): tanda vital, skrining nutrisi (IMT otomatis), skala nyeri, risiko jatuh (Timed Up & Go), status psikologis, status sosial ekonomi, riwayat alergi, rencana asuhan keperawatan
- Create & Edit pakai 1 view yang sama (upsert di controller)

### 3.6 Poli Gigi (`PoliGigi` controller, route `poli-gigi/*`)
- Pemeriksaan dokter: anamnesis, **odontogram interaktif** (klik gigi untuk tandai, multi-select, keterangan per gigi, mendukung gigi permanen 11-48 DAN gigi susu 51-85 disusun sejajar — lihat `odontogram_helper.php`), oklusi/torus/palatum/dst, diagnosis & rencana terapi, rujukan
- Tabel: `dental_examinations` (1:1 dengan visit)
- Edit & **Cetak** (format RM, odontogram muncul read-only berwarna sesuai temuan)

### 3.7 Poli Obgyn (`PoliObgyn` controller, route `poli-obgyn/*`)
- **2 tabel terpisah** sesuai sifat data:
  - `obstetric_records` — data kehamilan, 1x rekam per kehamilan (riwayat menstruasi, HPHT/TP otomatis via rumus Naegele, riwayat penyakit, status pernikahan, status praesens awal, pemeriksaan panggul)
  - `obstetric_pregnancy_histories` — child table riwayat kehamilan/persalinan sebelumnya (dynamic rows)
  - `antenatal_visits` — hasil pemeriksaan tiap kunjungan (bisa berkali-kali per kehamilan: TFU, letak janin, DJJ, oedema, refleks, urine, TD, BB, usia kehamilan)
- Logic: saat dokter buka kunjungan baru, sistem cek apakah pasien sudah punya `obstetric_records` aktif → kalau belum, tampilkan form lengkap (sekaligus bikin entri antenatal pertama); kalau sudah, tampilkan form kunjungan cepat saja
- Edit per kunjungan individual (`editVisit`/`updateVisit`), Edit data kehamilan (`editMaster`), riwayat semua kunjungan (`history`), tombol "Data Kehamilan Baru" untuk kehamilan lain
- Edit & **Cetak** tersedia

### 3.8 Instalasi Gawat Darurat (IGD) — 3 tahap perawat + 1 tahap dokter

**a. Triase** (`IgdTriage`, route `igd-triase/*`)
- Tabel `igd_triage_assessments`: kategori triase (Emergency/Urgency/Non-Urgency/DOA — warna dropdown berubah sesuai pilihan), jalan nafas, pernafasan, sirkulasi, kesadaran (GCS), skala nyeri, kondisi mental, risiko penularan infeksi, "diteruskan kepada" (auto-fill/dropdown dinamis tergantung kategori), kedatangan, rujukan, info polisi, jenis kasus (trauma dll)
- Edit & Hapus (hapus mengembalikan status visit ke `registered`, **diblokir kalau skrining keperawatan sudah ada**)

**b. Skrining Keperawatan IGD** (`IgdScreening`, route `igd-skrining/*`)
- Tabel `igd_nursing_screenings`: sangat lengkap — tanda vital, tombol "sama dengan asesmen triase nyeri" (copy skor nyeri dari triase), tekanan intrakranial, pupil, neurosensorik/muskuloskeletal, integumen, turgor kulit, edema, mukosa mulut, perdarahan, intoksikasi, eliminasi (BAB/BAK), skrining nutrisi (parameter MST), risiko jatuh, psikososial, assessment keperawatan (masalah), rencana keperawatan, kolaborasi tindakan — semua multi-select disimpan JSON
- Tampilan ringkasan triase di atas form, warna header mengikuti kategori triase
- Edit & Hapus (hapus mengembalikan status ke `screening`)
- **Cetak** (format RM 2, menggabungkan data triase + skrining keperawatan dalam satu halaman)

**c. Dokter IGD** (`IgdDoctor`, route `igd-dokter/*`) — 3 sub-form dalam 1 halaman (`show.php`), semua mendukung banyak entri per kunjungan:
- **RM 2.1 — Order List**: tindakan/konsultasi (referensi dari master, dengan tanggal, jam, hasil, keterangan)
- **RM 2.2 — Pemantauan Tanda Vital**: tanggal/jam, kategori, dokter jaga/perawat/konsulen (dropdown dari tabel `users`), tanda vital + GCS + pupil + urine + nyeri, **plus input obat per sesi pemantauan** (tanggal/jam pemberian, referensi obat, dosis, qty)
- **RM 2.3 — SOAP Notes**: Subjective/Objective/Assessment/Planning, jenis petugas (dokter/perawat/lain), dicatat atas nama user login (pengganti tanda tangan)
- Tombol "Selesaikan Pemeriksaan" → visit status jadi `done`

### 3.9 Referensi Master (dasar harga untuk IGD, soft delete, CRUD penuh)
- `TindakanReference` (`referensi-tindakan/*`) — kode, uraian_tindakan, harga
- `ObatReference` (`referensi-obat/*`) — kode, uraian_obat, harga, expired_date
- `KonsultasiReference` (`referensi-konsultasi/*`) — kode, uraian_konsultasi, harga

## 4. Keputusan Desain Penting (supaya tidak diulang salah)

1. **Jangan pakai field harga/kode live-join ke referensi** di tabel transaksi manapun — selalu snapshot.
2. **Skrining vs Pemeriksaan Dokter**: hasil pemeriksaan fisik lanjutan (odontogram, dst.) adalah bagian **dokter**, bukan skrining perawat — skrining perawat tetap satu form umum untuk semua poli (kecuali IGD yang punya tahapnya sendiri).
3. **IGD berbeda total dari poli biasa** — Triase dan Skrining Keperawatan IGD TIDAK memakai form `skrining/create.php` biasa, tapi form sendiri sesuai form RM 2.
4. **Hapus data berjenjang**: menghapus data di tahap belakangan selalu mengembalikan status `visits` ke tahap sebelumnya, dan dicegah (guard) jika tahap berikutnya sudah terisi (misal: tidak bisa hapus Triase kalau Skrining Keperawatan sudah ada).
5. **Edit = Create (upsert)**: hampir semua form pakai 1 view untuk create & edit, dibedakan lewat variabel `$isEdit` dan data existing yang di-pass dari controller.
6. Semua modul berbasis **1 user admin** — role/permission belum dipisah, ditunda sesuai permintaan awal user, tapi struktur sudah siap untuk dipisah nanti (kolom `role` di `users`, serta controller per modul sudah terpisah rapi).

## 5. File-file Referensi Asli (RM/Rekam Medis)

User mengunggah dokumen Word form rekam medis fisik rumah sakit sebagai acuan digitalisasi:
- `RM 1.1` — Skrining Umum (Pengkajian Awal Rawat Jalan)
- `RM 1a` — Rajal Gigi (dasar odontogram)
- `RM 1.5` — Rajal Obsgyn
- `RM 2` — IGD (Triase + Pengkajian Keperawatan)
- `RM 2.1` — Pengkajian Dokter IGD + Order List (**bagian "Pengkajian Dokter"-nya — keluhan utama, pemeriksaan fisik kepala/leher/thoraks/dll — BELUM dibuat**, baru Order List-nya)
- `RM 2.2` — Pemantauan Tanda Vital IGD (sudah dibuat)
- `RM 2.3` — CPPT/SOAP IGD (sudah dibuat)
- `RM 2.4` — Ringkasan Pulang Pasien Gawat Darurat (**BELUM dibuat sama sekali**)

File asli (.docx) tersedia untuk dibaca ulang jika dibutuhkan detail field:
- `/mnt/user-data/uploads/RM_1_1.docx`
- `/mnt/user-data/uploads/RM_1a__Rajal_Gigi_.docx`
- `/mnt/user-data/uploads/RM_1_5__Rajal_Obsgyn_.docx`
- `/mnt/user-data/uploads/RM_2.docx`
- `/mnt/user-data/uploads/RM_2_1.docx`
- `/mnt/user-data/uploads/RM_2_2.docx`
- `/mnt/user-data/uploads/RM_2_3.docx`
- `/mnt/user-data/uploads/RM_2_4.docx`

## 6. Yang Belum Dikerjakan (Next Steps / Backlog)

- **RM 2.1 bagian Pengkajian Dokter IGD** (keluhan utama, allo/auto anamnesis, riwayat penyakit, pemeriksaan fisik 5 regio, status lokasi, laboratorium/radiologi/diagnosis/tata laksana) — order list-nya sudah ada, teks pengkajiannya belum.
- **RM 2.4** — Ringkasan Pulang Pasien IGD (discharge summary).
- **Cetak RM 2.1** (order list) — belum ada halaman cetak terpisah untuk itu (baru RM 2.2+2.3 yang punya cetak gabungan).
- **Poli Umum / poli-poli lain** (Anak, Penyakit Dalam, Bedah, dll) — belum dibuat sama sekali, kemungkinan bisa reuse pola dari Poli Gigi tapi tanpa odontogram.
- **Laboratorium, Radiologi, Rawat Inap** — baru placeholder link di sidebar, belum ada controller/model/table/view sama sekali (modul-modul ini ada di rencana awal project tapi belum disentuh).
- **Billing/kasir** — snapshot harga sudah disiapkan di IGD, tapi belum ada modul kasir/kuitansi yang menjumlahkan semua tindakan+obat+konsultasi per kunjungan jadi satu tagihan.
- **Pemisahan role & permission** — sesuai rencana awal, setelah workflow stabil (sekarang), baru dipisah per role: Manajemen, Registrasi, Perawat, Dokter, dll, dengan pembatasan menu sidebar dan filter route per role.
- **Farmasi** (jika obat IGD perlu terhubung ke stok/apotek).
- Semua kode di atas ditulis manual via chat, **belum pernah di-review ulang end-to-end** oleh tool otomatis — ada baiknya Claude Code melakukan audit konsistensi (migration vs model vs controller vs view) begitu masuk ke repo.

## 7. Cara Kerja yang Disukai User Sejauh Ini

- Selalu diberi instruksi lengkap step-by-step (`php spark make:...` lalu isi file) karena user menjalankan sendiri di komputernya (bukan di environment ini — project CodeIgniter ada di komputer lokal user, bukan di sandbox ini).
- Senang diberi penjelasan singkat alasan desain sebelum kode (misal kenapa split tabel kehamilan jadi 2).
- Suka pendekatan "selesaikan 1 modul sampai teruji, baru lanjut modul berikut" — bukan sekaligus semua modul.
- Cukup teliti menguji manual tiap fitur sebelum lanjut, dan sering menemukan detail kecil yang masih kurang (tombol edit/hapus, kolom tanggal yang ketinggalan, dll) — jadi iterasi kecil per modul itu normal dalam proyek ini.

## 8. Catatan untuk Claude Code

- Project CodeIgniter ini berada di **komputer lokal user** (Windows, path contoh sebelumnya `D:\project\rsbhc`), bukan di repo yang terhubung ke sesi ini secara default — pastikan dulu working directory/repo yang benar sebelum membuat perubahan.
- User memakai XAMPP (PHP 8.2, MySQL lewat phpMyAdmin) untuk development lokal.
- Tidak ada automated test sama sekali sejauh ini — semua verifikasi dilakukan manual oleh user lewat browser.
