Files
bij/docs/migration/LAPORAN-MIGRASI-CI3-KE-CI4.md
2026-04-21 05:59:39 +07:00

202 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Laporan persiapan migrasi CI3 → CI4
**Sumber (tidak diubah):** `C:\laragon\www\bij-migration\bij.mwp.co.id`
**Target:** `C:\laragon\www\bij-migration\bij.mwp.co.id-ci4` (CodeIgniter 4.7.x via `appstarter`)
**Indeks dokumen terbaru:** mulai dari [README.md](README.md) (controllers, models, routes, auth, risks, json_api_map, ROADMAP).
API mobile **sudah di-port** ke `App\Services\Mobile\MobileJsonService` + `MobileJsonController`; admin memakai layout dasar + aset TailAdmin di `public/assets/tailadmin/`.
Dokumen ini tetap memuat ringkasan awal + checklist; detail teknis dipindah ke file tema di folder yang sama.
---
## 1. Peta komponen CI3
### 1.1 Controller (`application/controllers/`)
| File | Peran singkat |
|------|----------------|
| `Json.php` | API JSON untuk aplikasi mobile (presensi, cuti, profil, dll.); query DB langsung di controller |
| `Site.php` | Frontend ringkas: redirect, halaman login, `login_auth` (Ion Auth) |
| `Cli.php` | Perintah CLI |
| `Errors.php` | Penanganan error |
Routing default: `application/config/routes.php` mengarah ke `site`; endpoint `Json` mengikuti konvensi CI3 `controller/method` (mis. `json/login`).
### 1.2 Model (`application/models/`)
| Model | Konteks tipikal |
|-------|-------------------|
| `User_model.php`, `Group_model.php`, `Admin_user_model.php`, `Api_key_model.php` | Pola CI Bootstrap / admin & API (bukan dipakai langsung oleh `Json.php` mobile) |
Catatan: logika mobile di `Json.php` **tidak** memakai model ini; data diambil lewat `$this->db` di controller.
### 1.3 Routes (`application/config/routes.php`)
- `default_controller` = `site`
- Pola **CI Bootstrap 3**: prefix bahasa `^(\w{2})/(.*)$`, routing REST `api/(:any)/(:num)` → modul `api`
- Tidak ada definisi eksplisit per method untuk `Json`; mengandalkan routing default CI3.
### 1.4 Modul HMVC (`application/modules/`)
| Modul | Isi penting |
|-------|-------------|
| **admin** | `Home`, `Pegawai`, `Presensi`, `Perusahaan`, `Laporan`, `Panel`, `Util`, `Errors`; views + Grocery CRUD / laporan |
| **api** | `Home`, `Swagger`, `Errors`; library `Jwt_client.php` (Firebase JWT)—**alur mobile `Json.php` memakai token string di tabel `pegawai`, bukan JWT ini** |
| **adminlte** | `Widget.php`—komponen UI |
HMVC memakai **MX_Controller** (lihat `application/core/MY_Controller.php`).
### 1.5 Auth
- **Web admin / site:** **Ion Auth** (`ion_auth` di autoload), login di `Site::login_auth`, pembatasan halaman lewat `mPageAuth` + `ion_auth->in_group()` di `MY_Controller`.
- **Mobile (`Json.php`):** autentikasi **stateless token** disimpan kolom `pegawai.token`, password **MD5** di tabel; tidak memakai Ion Auth di controller ini.
### 1.6 Helper & library custom (ringkas)
**Helpers** (`application/helpers/`): `MY_string_helper.php`, `MY_url_helper.php`, `MY_directory_helper.php`.
**Libraries** (akar `application/libraries/`, selain vendor besar):
- `Data_importer.php`, `Form_builder.php`, `System_message.php`
- `MY_Email.php`, `MY_Form_validation.php`, `MY_Pagination.php`
- `PHPExcel.php` + pohon **PHPExcel** (usang; di CI4 ganti **PhpSpreadsheet**)
**Autoload** (`application/config/autoload.php`): paket `ion_auth`, `grocery_crud`, `image_crud`, `rest_server`; library `database`, `ion_auth`, `form_validation`.
**Third party** (indikasi): Ion Auth, Grocery CRUD, Image CRUD, REST server (lihat folder `application/third_party/` bila perlu detail).
---
## 2. Audit `application/controllers/Json.php`
### 2.1 Daftar method publik
| Method | Kategori |
|--------|----------|
| `index` | Penolakan akses |
| `login_w_token` | Login / token |
| `login` | Login / token |
| `profil` | Pegawai / mobile |
| `save_cuti` | Cuti + upload / mobile |
| `batalkan_cuti` | Cuti / mobile |
| `save_aktifitas` | Aktivitas + upload / mobile |
| `save_masuk` | Presensi + geo + foto / mobile |
| `save_pulang` | Presensi + geo + foto / mobile |
| `save_istirahat` | Presensi / mobile |
| `presensi_today` | Presensi / mobile |
| `presensi` | Presensi / mobile |
| `daftar_today` | Presensi / daftar rekan / mobile |
| `berita` | Konten / mobile |
| `cuti` | Cuti / mobile |
| `lembur` | Lembur / mobile |
| `libur` | Master libur / mobile |
| `aktifitas` | Aktivitas / mobile |
| `save_pp` | Profil foto / mobile |
| `save_password` | Auth password / mobile |
Private: `generateRandomString`, `utf8ize`.
### 2.2 Login, token, pegawai, endpoint mobile
- **Login / token:** `login`, `login_w_token` (semua method lain memakai `token` POST untuk identitas pegawai).
- **Pegawai:** `profil`, `save_pp`, `save_password`; seluruh alur memuat baris `pegawai` lewat token.
- **Endpoint mobile (khas app):** semua di atas kecuali `index`; pola respons JSON + header `Access-Control-Allow-Origin: *` (CORS permisif).
### 2.3 Query langsung ke database
Seluruh file memakai **Active Record / query builder CI3** (`$this->db->...`) **di dalam controller**—tidak lewat model. Setiap method melakukan satu atau lebih: `from`, `where`, `get`, `insert`, `update`, `join`, dll. Tabel yang muncul: antara lain `pegawai`, `kantor`, `jabatan`, `unit_kerja`, `lembur`, `dilapangan`, `libur`, `cuti`, `jadwal`, `presensi`, `berita`, `cuti_dokumen`, `aktifitas_harian`.
### 2.4 Refactor besar yang disarankan
1. **Keamanan:** password **MD5**; token prediktabil (bagian `md5(id_pegawai)` + random); token disimpan plain di DB; **tanpa rate limiting** di controller.
2. **Arsitektur:** pindahkan query ke **Model** / **Repository** / **Service**; controller hanya HTTP + validasi.
3. **Upload:** base64 → file via helper `file`; path relatif `./assets/uploads/...`—di CI4 gunakan `Writable`/filesystem config, validasi MIME/size, nama file aman.
4. **`utf8ize` memakai `utf8_encode()`** — perilaku usang/deprecated di PHP modern; sebaiknya konsisten **UTF-8** dari DB dan `json_encode` dengan flag yang tepat.
5. **`daftar_today`:** tanggal di-inline ke string join (`date("Y-m-d")`)—risiko konsistensi; sebaiknya **binding parameter** / query builder terpisah.
6. **`save_pulang`:** variabel toleransi memakai field `toleransi_terlambat` untuk batas pulang—perlu verifikasi apakah itu maksud bisnis atau bug (copy-paste dari masuk).
7. **CORS `*`** + POST form-style: tinjau ulang untuk produksi (origin spesifik, HTTPS, CSRF untuk web—mobile biasanya token header).
Detail baris-per-baris ada di file pendamping `audit-json-controller.md` (folder yang sama).
---
## 3. Komponen: pindah langsung vs tulis ulang vs ditinggalkan
### 3.1 Bisa dipindahkan / diadaptasi dengan effort kecilsedang
- Pola respons JSON `{ status, pesan, ... }` — pertahankan sementara untuk kompatibilitas klien mobile.
- Struktur query bisnis (jadwal harian, insert `presensi` harian) — logika bisa dipindah ke service dengan sedikit penyesuaian API CI4 DB.
- Helper custom yang murni string/url — port bertahap ke helper CI4 atau class util.
### 3.2 Harus ditulis ulang (disarankan)
- **Autentikasi mobile:** ganti MD5 → `password_hash` / verifikasi modern; token → **JWT** atau session server + refresh; invalidasi token.
- **Seluruh lapisan akses data** untuk API mobile — model CI4, validasi input, transaction di operasi multi-tabel.
- **Ion Auth + HMVC admin** — di CI4 umumnya modul terpisah atau admin berdiri sendiri; tidak ada port 1:1 HMVC MX.
- **PHPExcel** — ganti **PhpSpreadsheet**.
- **Grocery CRud / Image Crud** — evaluasi CI4 admin scaffold atau CRUD custom / paket modern.
### 3.3 Sebaiknya ditinggalkan atau diganti
- **PHPExcel** sebagai dependensi jangka panjang.
- **CORS `*`** di API sensitif data kepegawaian.
- Duplikasi besar potongan “decode base64 + write_file + insert DB” di banyak method — ganti satu **UploadService** + policy keamanan.
---
## 4. Struktur di target CI4 (aman, tanpa ubah vendor framework)
- `app/Controllers/Api/MobileJsonController.php` — endpoint API mobile.
- `app/Services/Mobile/MobileJsonService.php` — port logika dari `Json.php`.
- `app/Libraries/LegacyUtf8Encoder.php` — setara `utf8ize` untuk string ISO-8859-1.
- `app/Config/Routes.php` — grup `api/mobile/*` dan alias **`json/*`**.
- `app/Controllers/Admin/Dashboard.php` + `app/Views/layouts/*`, `app/Views/pages/dashboard.php` — foundation admin + TailAdmin assets di `public/assets/tailadmin/`.
- `public/assets/uploads/*` — folder upload (dengan `.gitkeep`).
---
## 5. Checklist migrasi bertahap
Gunakan urutan ini; centang setelah tiap fase stabil di staging.
### Fase A — Lingkungan & data
1. [ ] Samakan versi PHP target dengan CI4; backup DB produksi.
2. [ ] Dokumentasikan skema tabel yang dipakai `Json.php` (ER ringkas atau export struktur saja).
3. [ ] `.env` CI4: koneksi DB terpisah / read-only untuk eksperimen awal (opsional).
### Fase B — API mobile (prioritas kompatibilitas klien)
4. [x] Implementasi `login` + `login_w_token` (+ endpoint lain) di CI4 — **kode siap**; verifikasi di staging wajib.
5. [ ] Pindahkan validasi pegawai-by-token ke **filter** / **service** tunggal (`MobileAuthService`).
6. [ ] `profil` — ekstrak query ke model; tes parity JSON dengan CI3.
### Fase C — Presensi & file
7. [ ] `presensi_today` + insert baris harian — transaction + tes race condition.
8. [ ] `save_masuk` / `save_pulang` / `save_istirahat` — satu domain **PresensiService**; perbaiki logika toleransi jika sudah diverifikasi user bisnis.
9. [ ] Unified handler upload (cuti / aktivitas / absen / profil) + storage path CI4 (folder `public/assets/uploads` sudah disiapkan).
### Fase D — Fitur sekunder mobile
10. [ ] Cuti: `cuti`, `save_cuti`, `batalkan_cuti` + relasi dokumen.
11. [ ] `berita`, `lembur`, `libur`, `aktifitas`, `daftar_today`.
12. [ ] `save_password` — bcrypt + policy password.
### Fase E — Admin & HMVC
13. [ ] Inventarisasi modul `admin` per controller; rencanakan modul CI4 (Shield, custom admin, atau SPA terpisah).
14. [ ] Ganti PHPExcel di laporan; uji cetak/ekspor.
15. [ ] Matikan rute CI3 untuk endpoint yang sudah dialihkan; proxy bertahap atau cutover DNS.
### Fase F — hardening
16. [ ] CORS ketat, HTTPS, rate limit login, audit log presensi.
17. [ ] Hapus dependensi yang tidak terpakai; tes beban ringan pada endpoint paling sering dipanggil.
---
*Dibuat sebagai artefak persiapan migrasi; sumber CI3 tidak dimodifikasi.*