# 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)).
