# Porting pengaturan ke CI4

Pembaruan: 16 Oktober 2026.

Seluruh 20 URL `pos/pengaturan/*.php` sekarang mempunyai route GET/POST dengan filter `auth`, termasuk varian `.php`. Cakupannya 17 halaman, dua redirect lama, dan satu endpoint JSON.

| Kelompok | Path di bawah `pengaturan/` |
| --- | --- |
| Identitas | `profil-toko`, `users`, `roles` |
| Operasional | `pembayaran`, `restaurant-tables`, `store-statuses`, `ajax_store_statuses`, `invoice-template` |
| Integrasi | `konfigurasi-pasar`, `jaknot`, `webhook-marketplace`, `coa-akuntansi` |
| WhatsApp | `whatsapp`, `whatsapp-bot`, `whatsapp-templates`, `whatsapp-scheduler` |
| Saldo/log | `saldo-toko`, `api-logs` |
| Redirect | `menus` menuju dashboard dengan informasi panel admin; `shopee` menuju `master/marketplaces` |

Controller `Settings*` menggunakan koneksi dan respons CI4; view berada di `app/Views/pengaturan`. Tidak ada dependensi runtime pada PHP di folder `pos`. Upload menggunakan `public/uploads/`. Query pilihan customer, izin role, dan API key dipindahkan keluar dari view.

## Penyesuaian yang perlu diketahui

- Akses pengaturan **user dan role memerlukan Super Admin**, termasuk tampilan yang berisi data pengguna. Ini memperketat perilaku aplikasi lama yang hanya memeriksa login.
- Role pada penyimpanan user harus milik toko dalam sesi. Password user baru tetap disimpan sebagai hash.
- Penggantian izin role memeriksa kepemilikan role serta validitas menu, menghapus menu duplikat, dan memakai transaksi agar kegagalan insert tidak menghilangkan izin lama.
- Penggantian status default diserialkan dengan penguncian toko. Endpoint status JSON mengambil ID toko dari sesi melalui helper CI4.
- Nominal topup menggunakan format input angka, sehingga `1000.00` disimpan sebagai 1000, bukan 100000. Permintaan topup tetap berstatus pending; halaman ini tidak menyetujui atau mengkredit saldo.
- Pergantian paket mengunci serta memeriksa ulang saldo/paket. Kegagalan sinkronisasi subscription menggulung balik perubahan paket dan saldo, jika tabel subscription tersedia.
- Edit jadwal harus menggunakan ID milik toko tersebut; jam pengiriman divalidasi. Tipe gambar upload diperiksa dari isi file.
- Data JSON yang disisipkan ke JavaScript memakai encoding yang tidak dapat menutup tag script. Pengujian webhook memakai verifikasi sertifikat TLS.
- Informasi worker WhatsApp menandai bahwa cron pengirim/antrean masih menunggu porting, sehingga tidak menampilkan perintah filesystem yang belum tersedia di CI4.

## Verifikasi

- PHP lint: **242 file**, lulus.
- Seluruh PHPUnit suite: **94 tes, 1.304 assertion**, lulus.
- `tests/unit/SettingsPortTest.php`: **20 tes, 207 assertion**, meliputi route, render halaman, redirect, akses Super Admin, kepemilikan data, password hash, transaksi izin role, nominal topup, rollback paket, validasi jadwal, dan encoding JSON.
- Tes memakai koneksi database tiruan. Tidak ada data MySQL aplikasi yang diubah dan tidak ada panggilan nyata ke WhatsApp, Shopee, webhook, atau akuntansi selama pengujian.

Jalankan dari folder `pos_kiosq_id_ci`:

```sh
/Applications/MAMP/bin/php/php8.3.14/bin/php vendor/bin/phpunit --no-coverage
```

## Masih perlu diverifikasi

Uji MySQL dan browser untuk penyimpanan semua formulir, role/login baru, upload logo/QRIS/bukti transfer/media, template invoice, QR meja, saldo dan pergantian paket. Cocokkan dengan schema serta data toko yang sebenarnya.

Uji panggilan integrasi hanya dengan konfigurasi dan tujuan yang tepat. Keberadaan halaman konfigurasi tidak berarti endpoint penerima, API penjualan, webhook, atau worker sudah selesai diporting. Pengiriman WhatsApp terjadwal belum berjalan tanpa worker.

Tahap berikutnya adalah tools/import-export dan integrasi pendukung. Deposit, API/webhook, cron, CRM/admin, serta halaman publik masih merupakan pekerjaan terpisah.
