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