# Checklist uji parity API mobile (CI3 `Json.php` ↔ CI4)

Gunakan DB & data yang sama. Bandingkan **string body JSON** (atau parse lalu diff struktur) antara:

- CI3: `POST .../index.php/json/{endpoint}`
- CI4: `POST .../json/{endpoint}` atau `POST .../api/mobile/{endpoint}`

Aktifkan logging sementara: set **`API_PARITY_LOG=true`** di `.env`, lalu cek `writable/logs/api_parity-YYYY-MM-DD.log` (hanya diisi oleh request **HTTP** ke `MobileJsonController`, bukan oleh CLI).

**Otomatisasi staging:** jalankan `php spark api:staging-validate` (dan opsional `--with-uploads`) — hasil mesin di `writable/staging/last-validation.json`; ringkasan manusia di `parity-report.md`.

---

## Aturan umum verifikasi

- [ ] Kunci JSON sama (tidak ada field tambahan di CI4 kecuali kesalahan tak terduga).
- [ ] Tipe: `status` integer 0/1; `pesan` string; array/objek nested sama.
- [ ] `utf8ize` / string Latin-1: bandingkan escape `\uXXXX` jika ada karakter non-ASCII.
- [ ] Tanpa `JSON_PRETTY_PRINT` di lingkungan development CI4 untuk string match (sudah dipaksa `json_encode(..., 0)` di controller).

---

## 1. login

- [ ] **Request:** `username`, `password` (POST).
- [ ] **Gagal:** `{ "status": 0, "pesan": "Username atau Password tidak sesuai" }` (tanpa `token`).
- [ ] **Sukses:** `status` 1, `pesan` "Selamat datang", `token` string panjang (md5(id)+15 char).
- [ ] **DB:** kolom `token` & `last_login` ter-update.

## 2. login_w_token

- [ ] **Request:** `token`.
- [ ] **Gagal token:** `status` 0, `pesan` "".
- [ ] **Sukses:** `status` 1, `pesan` "" (tanpa objek pegawai di root — sama CI3).

## 3. profil

- [ ] **Request:** `token`.
- [ ] **Gagal:** `status` 0, `pesan` "", tanpa `pegawai`.
- [ ] **Sukses:** `pegawai` dengan nested `kantor`, `jabatan`, `unit_kerja`, `lembur`, `dilapangan` (boolean), `jadwal` (objek dengan `hari`, `masuk`, `pulang`, `istirahat`, `toleransi_masuk`, `toleransi_pulang`, `libur`, `ket_libur` jika ada).
- [ ] **Perilaku libur perusahaan:** pada hari libur nasional/perusahaan, `ket_libur` terisi; `libur` tetap `true` seperti CI3 (tidak di-set `false` di cabang libur).

## 4. presensi_today

- [ ] **Request:** `token`.
- [ ] **Sukses:** `data` objek; jika baru insert, `id_presensi` string bentuk `"12."` (angka + titik).
- [ ] **Kolom null/string:** konsisten dengan baris DB yang sama di CI3.

## 5. presensi

- [ ] **Request:** `token`.
- [ ] **Ada data:** `status` 1, `data` array (maks 20).
- [ ] **Tanpa data:** `status` 0, tanpa kunci `data` (sama CI3).

## 6. save_masuk

- [ ] **Request:** `token`, `nama_photo`, `photo` (base64), `lat`, `lng`, `jarak`.
- [ ] **Tanpa pegawai / tanpa jadwal:** `status` 0, `pesan` "Tidak ada jadwal kerja".
- [ ] **Upload gagal:** `pesan` "Photo Kehadiran  GAGAL upload" (dua spasi).
- [ ] **Sukses:** file di `public/assets/uploads/absen/masuk/`, `status` 1.
- [ ] **Catatan:** CI3 tidak mengembalikan URL file di JSON — hanya `pesan`; CI4 sama.

## 7. save_pulang

- [ ] Sama pola upload + pesan gagal/sukses.
- [ ] **Belum waktunya pulang:** `pesan` persis: `Belum waktunya Pulang, waktu pulang anda adalah pukul {jam}. Jika anda memerlukan...` (titik setelah jam).

## 8. save_istirahat

- [ ] **Request:** `token`, `mulai`, `selesai`.
- [ ] **Sukses normal:** `status` 1, `pesan` "berhasil disimpan".
- [ ] **Catatan CI4:** jika `mulai` dan `selesai` keduanya kosong, CI4 **tidak** menjalankan `UPDATE` (menghindari error); CI3 PHP 7 bisa memicu perilaku tak terdefinisi — dokumentasi di `parity-report.md`.

## 9. save_aktifitas

- [ ] Folder `public/assets/uploads/aktifitas/`, pesan sukses/gagal sama.

## 10. save_cuti

- [ ] Folder `public/assets/uploads/dokcuti/`, insert `cuti` + `cuti_dokumen`.

## 11. batalkan_cuti

- [ ] **Request:** `token`, `id`.
- [ ] **Sukses:** `pesan` berisi `Ajuan di batalkan {id} - {id_pegawai}`.

## 12. berita

- [ ] **Request:** `token`, `dari`, `jumlah` (opsional kosong → default seperti CI3).
- [ ] **Token valid:** `status` 1 selalu, `data` array (boleh kosong).

## 13. cuti

- [ ] **Token valid:** `status` 1, `data` array; tiap item bisa punya `dokumen` array.
- [ ] **Tanpa baris cuti:** `data` = `[]`.

## 14. lembur

- [ ] Sama seperti berita/cuti untuk pagination & `status` 1 + `data`.

## 15. libur

- [ ] **Token valid:** `status` 1, `data` seluruh tabel libur (urutan `tanggal_libur` desc).

## 16. aktifitas

- [ ] `status` 1 + `data` untuk token valid.

## 17. daftar_today

- [ ] **Request:** `token`.
- [ ] **Ada rekan dengan presensi hari ini:** `status` 1, `data` array join pegawai/jabatan/presensi.
- [ ] **Kosong:** `status` 0 (sama CI3).

## 18. save_pp

- [ ] Folder `public/assets/uploads/pengguna/`, hapus foto lama jika ada.
- [ ] Pesan gagal upload: "Photo Kehadiran  GAGAL upload" (teks sama CI3 meskipun konteks profil).

## 19. save_password

- [ ] **Request:** `token`, `pass_lama`, `pass_baru`.
- [ ] **Default gagal (token salah):** `pesan` "-".
- [ ] **Password lama salah:** pesan sesuai CI3.
- [ ] **Sukses:** `status` 1, pesan "Password berhasil di ubah".

---

## Ringkasan

| Total endpoint | 19 |
|----------------|----|
| Verifikasi wajib | POST + JSON body + efek samping DB/file |

**Status readiness setelah uji manual:** centang kolom “lulus” per lingkungan sebelum cutover.
