# Porting halaman admin ke CI4

Pembaruan: 17 Oktober 2026.

Ketiga file di `pos/admin` sekarang tersedia sebagai route GET/POST dengan alias `.php`:

| Path | Controller | Akses |
| --- | --- | --- |
| admin/impersonate | AdminImpersonate | Admin sistem |
| admin/whatsapp_autoreply | AdminAutoreply | Super Admin toko atau admin sistem |
| admin/whatsapp_chat | AdminWhatsappChat | Pengguna login, percakapan toko sesi |

Semua route memerlukan login. Route impersonasi dan pengaturan rule juga menggunakan filter CSRF. Chat memakai API percakapan CI4 yang memverifikasi CSRF sendiri pada pengiriman. Tidak ada include runtime PHP dari folder sumber `pos`.

## Impersonasi

Akses hanya diberikan melalui `users.is_super_admin`, bukan sekadar role bernama Super Admin toko. Toko tujuan diperiksa keberadaannya dan harus aktif sebelum helper startImpersonation dijalankan. Aksi start/stop mencatat audit dengan ID pengguna asli dan toko tujuan.

Identitas user tidak diganti. Konteks toko efektif memakai impersonate_store_id melalui helper getStoreId yang sudah tersedia. Start/stop membersihkan outlet_id dan cash_session_id agar pilihan sesi toko sebelumnya tidak terbawa, lalu meregenerasi ID sesi. Stop menghapus konteks impersonasi sehingga toko sesi asli kembali dipakai. Toko tidak tersedia, ID invalid, dan aksi tidak dikenal ditolak tanpa memulai impersonasi.

## Auto-reply

Sumber hanya memerlukan login, menampilkan semua rule, dan mengubah/menghapus berdasarkan ID saja. CI4 memperketat akses:

- Pengguna biasa ditolak 403 untuk pengelolaan rule.
- Super Admin toko hanya dapat melihat, memuat untuk edit, mengubah, dan menghapus rule dengan store_id tokonya. Store ID lain dari form ditolak; rule global tidak dapat diubah melalui jalur admin toko.
- Admin sistem dapat mengelola rule seluruh toko dan rule global. Rule global berperangkat harus cocok dengan tepat satu perangkat toko aktif; rule tanpa toko/perangkat tetap berlaku global sesuai receiver Wablas.
- Device rule milik toko harus sesuai Device ID yang dikonfigurasi pada toko aktif tersebut. Admin toko dapat memilih semua perangkat toko (device_id null) atau perangkat spesifik yang terkonfigurasi.
- Mode contains/exact/starts/ends/regex dipertahankan. Keyword dan response wajib terisi, panjang field diperiksa, dan regex tidak valid ditolak sebelum penyimpanan.

`AutoreplyRules` menangani penyimpanan dengan transaksi, lock toko/rule, serta pemeriksaan kepemilikan ulang. Update/delete tetap membawa batas store_id untuk admin toko. Kegagalan update/insert menggulung balik transaksi. Perubahan rule menghasilkan audit ringkasan.

Form sekarang menyediakan tombol Edit, mempertahankan ID dan nilai existing, termasuk rule store-wide, serta memakai output escaping dan token CSRF. Placeholder [salam] dan [nama] mengikuti receiver Wablas yang sudah diporting. Auto-reply tetap memiliki batas pengiriman best effort/maksimal satu percobaan yang dijelaskan pada `PORTING_WEBHOOK_WABLAS.md`; halaman admin ini tidak menambahkan retry delivery.

## Chat admin

Terminal chat sumber dipertahankan dengan URL API yang berasal dari base URL CI4, sehingga bekerja ketika aplikasi dipasang pada subfolder. Pengiriman memakai header CSRF dan memperbarui token dari respons API. Kegagalan pengiriman ditampilkan dan draft dikembalikan bila input masih kosong.

Avatar, nama, dan isi pesan di-escape untuk konteks HTML/atribut. Kontak, histori, polling, serta batas akses toko menggunakan `ChatApi` dan `ChatConversations` yang sudah tersedia. Membuka halaman ini tidak memberikan akses percakapan seluruh toko; bahkan admin sistem mengikuti toko efektif sesi/impersonasi.

## Verifikasi

- PHPUnit seluruh aplikasi: **298 tes, 2.252 assertion**, lulus.
- Termasuk **17 tes admin**: route/login/CSRF, penolakan role, render tiga halaman, start/stop impersonasi, target tidak tersedia, pembersihan outlet, rule per toko/global, perangkat asing, edit lintas toko, validasi regex, rollback, dan escaping form edit.
- Lint **341 file PHP**: tanpa kesalahan sintaks. JavaScript kedua view WhatsApp admin lolos node --check.
- Pengujian memakai koneksi database tiruan; perubahan sesi hanya pada sesi pengujian. Tidak mengganti konteks pengguna nyata, mengirim WhatsApp, atau mengubah database produksi. Uji browser dan database MySQL staging masih diperlukan.

## Sisa porting

Dari 23 file yang sebelumnya belum mempunyai route CI4, ketiga file admin ini sudah dipindahkan. Tersisa **20 file di folder utama pos**: halaman publik/katalog, cart/checkout/OTP, booking/rental, registrasi/lupa password, pricing/upgrade, order meja, dan tracking.php.

Langkah berikutnya adalah inventarisasi alur halaman publik dan checkout beserta dependensinya. Cakupan route tidak menghapus batasan integrasi nyata pada dokumen tiap tahap.
