# Audit detail: `Json.php` (CI3) **Path sumber:** `bij.mwp.co.id/application/controllers/Json.php` **Base class:** `MY_Controller` → `MX_Controller` (HMVC; **Json tidak memakai Ion Auth untuk request API**). ## Ringkasan eksekutif - **22 method publik** (termasuk `index`). - Hampir semua endpoint: **POST** `token` (+ field lain), balasan **JSON**, header **`Access-Control-Allow-Origin: *`**. - **Tidak ada layer Model**; semua interaksi DB di controller. ## Tabel per method | Method | Login/token | Pegawai | Mobile | DB langsung | Catatan refactor | |--------|-------------|---------|--------|-------------|------------------| | `index` | — | — | — | Tidak | Hanya pesan tolak | | `login_w_token` | Ya | Ya | Ya | Ya | Update `last_login`; unset field sensitif | | `login` | Ya | Ya | Ya | Ya | MD5 password; token random di DB | | `profil` | token | Ya | Ya | Ya | Banyak join logika jadwal/libur/cuti; kompleks | | `save_cuti` | token | Ya | Ya | Ya | Base64 file + insert `cuti` + `cuti_dokumen` | | `batalkan_cuti` | token | Ya | Ya | Ya | Update status | | `save_aktifitas` | token | Ya | Ya | Ya | Upload + `aktifitas_harian` | | `save_masuk` | token | Ya | Ya | Ya | Jadwal dinamis kolom `{N}_in`; update `presensi` | | `save_pulang` | token | Ya | Ya | Ya | Verifikasi waktu pulang; cek field toleransi | | `save_istirahat` | token | Ya | Ya | Ya | Update partial `presensi`; variabel `$ist` bisa tak terdefinisi jika kedua POST kosong | | `presensi_today` | token | Ya | Ya | Ya | Insert default `presensi` jika belum ada; `serialize($jadwal)` | | `presensi` | token | Ya | Ya | Ya | Riwayat 20 hari | | `daftar_today` | token | Ya | Ya | Ya | Join `pegawai`/`jabatan`/`presensi`; tanggal di string SQL | | `berita` | token | — | Ya | Ya | Pagination `dari`/`jumlah` | | `cuti` | token | Ya | Ya | Ya | N+1 query dokumen per baris cuti | | `lembur` | token | Ya | Ya | Ya | — | | `libur` | token | — | Ya | Ya | Semua libur (tidak difilter pegawai) | | `aktifitas` | token | Ya | Ya | Ya | — | | `save_pp` | token | Ya | Ya | Ya | Hapus foto lama `unlink`; update `pegawai.photo` | | `save_password` | token | Ya | Ya | Ya | Bandingkan MD5 password lama | ## Query / DB — pola yang dipakai - `pegawai`: hampir selalu filter `token` atau kredensial login. - Lookup terkait: `kantor`, `jabatan`, `unit_kerja`, `lembur`, `dilapangan`, `libur`, `cuti`, `jadwal`, `presensi`, `berita`, `cuti_dokumen`, `aktifitas_harian`. ## Private helpers - `generateRandomString` — untuk suffix token setelah login. - `utf8ize` — rekursif array/string; memakai **`utf8_encode`** pada string (perlu pengganti di PHP 8+). ## Prioritas implementasi di CI4 (usulan) 1. `login`, `login_w_token`, `profil` 2. `presensi_today`, `save_masuk`, `save_pulang`, `save_istirahat` 3. `save_cuti`, `cuti`, `batalkan_cuti` 4. Sisanya menurut frekuensi pemakaian aplikasi mobile. Implementasi CI4: `app/Controllers/Api/MobileJsonController.php` + `app/Services/Mobile/MobileJsonService.php` (lihat juga [json_api_map.md](json_api_map.md)).