# Rancangan Tahap Awal eKoas (Versi PHP + MySQL)

Turunan dari [README.md](../README.md). Dokumen ini mencakup Fase 0 dan Sprint awal Fase 1 (MVP).

## 1. Keputusan Teknis Tahap Awal

Berbeda dari README (Laravel + Vue PWA), tahap awal memakai **PHP native (PHP 8.2, PDO)** agar ringan dan langsung jalan di Laragon. Struktur dibuat rapi agar dapat dimigrasikan ke Laravel bila diperlukan.

| Aspek | Keputusan |
|---|---|
| Bahasa | PHP 8.2, `strict_types` |
| Database | MySQL, `db_koas`, akses via PDO (prepared statements) |
| Konfigurasi | `.env` (tidak masuk Git), contoh di `.env.example` |
| Autentikasi | Session PHP, `password_hash` (Argon2id), CSRF token, pembatasan percobaan login |
| Otorisasi | Tabel `roles` + `user_roles`, fungsi `require_login(...$roles)` |
| Frontend | HTML server-rendered, mobile-first; PWA menyusul setelah MVP stabil |
| Document root | `public/` |

## 2. Struktur Proyek

```
Koas_MU/
├── app/bootstrap.php     # env, PDO, session, helper (e, csrf, audit, require_login)
├── database/
│   ├── schema.sql        # skema tabel
│   └── install.php       # buat DB, tabel, peran, akun admin (CLI)
├── public/               # halaman web (login, dashboard, logout)
├── docs/                 # rancangan & progres
├── storage/uploads/      # berkas unggahan (di luar akses publik)
└── .env
```

Struktur akan berkembang: `app/Models`, `app/Services`, `public/admin|mahasiswa|pembimbing`.

## 3. Rencana Sprint (Fase 1 – MVP, prioritas P1)

| Sprint | Fokus | Kode kebutuhan | Keluaran |
|---|---|---|---|
| **0** | Fondasi | KF-AUTH-01/02, KF-ADM-02 | Koneksi DB, skema dasar, login/logout, audit log |
| **1** | Data master | KF-MSTR-01..03, 06, KF-ADM-01 | CRUD RS, stase, mahasiswa, pembimbing, manajemen pengguna & peran |
| **2** | Kompetensi & rotasi | KF-MSTR-04/05, KF-ROT-01..06 | Data SKDI, target per stase, periode, kelompok, rotasi + validasi kapasitas |
| **3** | Logbook | KF-LOG-01..08 | Form entri, antrean & verifikasi massal pembimbing |
| **4** | Capaian & penilaian | KF-KOMP-01..03, KF-NILAI-01/02/04..06/08/09 | Progres SKDI, Mini-CEX, DOPS, profesionalisme, finalisasi nilai |
| **5** | Pengumuman & laporan | KF-NOTIF-01/02, KF-LAP-01, KF-ADM-03/04 | Pengumuman, notifikasi in-app, rekap nilai Excel/PDF, backup |
| **6** | Hardening & pilot | KNF, keamanan | Uji UAT, PWA dasar, perbaikan, pilot satu stase |

## 4. Rincian Sprint 0 & 1 (Tahap Awal)

**Sprint 0 (selesai)**
1. Struktur proyek, `.env`, `.gitignore`.
2. Skema: `users`, `roles`, `user_roles`, `hospitals`, `departments`, `students`, `supervisors`, `audit_logs`.
3. Installer CLI (`php database/install.php`) membuat DB, tabel, 6 peran, dan akun `admin`.
4. Halaman login (CSRF, rate limit sederhana), dashboard, logout.

**Sprint 1 (hampir selesai — lihat [PROGRESS.md](PROGRESS.md))**
1. Layout bersama (header/nav per peran) dan halaman 404/403.
2. CRUD Rumah Sakit dan Stase (Admin FK).
3. CRUD Mahasiswa + impor CSV/Excel; CRUD Pembimbing.
4. Manajemen pengguna: aktif/nonaktif, reset kata sandi, penetapan peran (KF-AUTH-05).
5. Ubah kata sandi & profil (KF-AUTH-03); lupa kata sandi (KF-AUTH-04).

**Sprint 2 (selesai)** — kompetensi SKDI, target stase, periode, kelompok, rotasi (validasi bentrok & kapasitas), penetapan pembimbing, halaman rotasi mahasiswa. Detail di [PROGRESS.md](PROGRESS.md).

**Sprint 3 (selesai)** — logbook mahasiswa, autocomplete SKDI, antrean verifikasi pembimbing (massal & tolak beralasan), penguncian entri terverifikasi.

**Sprint 4 (selesai)** — capaian kompetensi vs target stase, penilaian Mini-CEX/DOPS/profesionalisme, ujian akhir stase, bobot per stase, finalisasi & penguncian nilai.

**Sprint 5 (selesai)** — pengumuman bertarget, notifikasi dalam aplikasi, rekap nilai (CSV/cetak), pengaturan sistem, backup, dashboard per peran, data contoh permanen.

**Sprint 6 (kode selesai)** — header keamanan, paksa ganti sandi, pembatasan login, paginasi, ubah/hapus periode, PWA dasar, uji otomatis, user MySQL berhak minimal. Tersisa uji manual/UAT dan keputusan penerapan (lihat [PROGRESS.md](PROGRESS.md)).

## 5. Menjalankan

```
# Laragon: pastikan MySQL aktif, lalu
php database/install.php        # buat database, skema, peran, formulir penilaian, akun admin
php database/seed_demo.php      # (opsional) data contoh + docs/AKUN_CONTOH.md
php database/backup.php         # backup ke storage/backups (jadwalkan harian)
php tests/run.php               # uji otomatis logika inti (rollback, aman untuk data contoh)
php database/create_app_user.php   # (opsional) user MySQL berhak minimal untuk menjalankan aplikasi
php database/make_icons.php     # (opsional) buat ulang ikon PWA
# buka http://localhost/lab/Koas_MU/Koas_MU/public/login.php
```

Akun uji coba: lihat [AKUN_CONTOH.md](AKUN_CONTOH.md) (dibuat oleh `seed_demo.php`, tidak masuk Git).

Kredensial database disimpan di `.env` (`DB_HOST`, `DB_USER`, `DB_PASS`, `DB_NAME`).

## 6. Catatan Keamanan

- `.env` di-ignore Git; jangan commit kata sandi database.
- Akun `root` MySQL hanya untuk pengembangan; untuk staging/produksi gunakan user khusus dengan hak terbatas pada `db_koas`.
- Kata sandi admin awal dibuat acak oleh installer dan wajib diganti.
- Data pasien tetap diminimalkan sesuai README bagian 11 (dimulai Sprint 3).
