# Porting transaksi ke CI4

Pembaruan: 16 Oktober 2026.

Tahap ini melanjutkan porting master. Seluruh 27 file PHP di `pos/transaksi/` dan `pos/transactions/` sekarang memiliki route GET/POST dengan filter `auth`, termasuk varian URL `.php`. Cakupan route tidak berarti seluruh perilaku telah diuji dengan data produksi.

## Modul tambahan

| URL | Controller |
| --- | --- |
| `transactions/cash_categories` | `CashCategories` |
| `transactions/cash_in` | `CashIn` |
| `transactions/cash_out` | `CashOut` |
| `transactions/rental_transactions` | `RentalTransactions` |
| `transaksi/kasir_resto` | `KasirResto` |
| `transaksi/pemesanan_restoran` | `PemesananRestoran` |
| `transaksi/penjualan2` | `PenjualanCepat` |
| `transaksi/pembelian2` | `PembelianCepat` |

Controller dan view menggunakan CI4 tanpa menjalankan PHP dari folder `pos`. Kasir resto dan pemesanan restoran mempertahankan tampilan terminal terpisah dari sidebar. Halaman kas, sewa, dan input cepat memakai layout utama CI4.

Route pembelian lama dilengkapi untuk POST dan `.php`. Kasir biasa juga menerima aksi POST lama (`create_customer`, `send_transfer_wa`, `process_sale`, `open_session`, `close_session`) pada `kasir`/`kasir.php`, selain endpoint khusus yang sudah ada.

## Perbaikan saat porting

- Nominal kas dari input angka mempertahankan desimal. Kategori harus sesuai toko dan jenis kas.
- Produk sewa, customer, supplier, serta produk input cepat diperiksa berdasarkan toko dalam sesi.
- Pembuatan otomatis produk pada input cepat berada dalam transaksi yang sama dengan header/detail; kegagalan penyimpanan melakukan rollback. Input cepat menolak produk paket; gunakan form reguler untuk paket.
- Harga dan diskon nominal pemesanan restoran dihitung dari produk di server. Item berulang digabung, stok dikunci/diperiksa, dan batch bertanggal dialokasikan melalui helper FEFO.
- Pembayaran resto mengunci order yang belum dibayar, memeriksa kepemilikan serta kesamaan meja, menolak nominal kurang, dan melakukan rollback jika shift belum dibuka.
- Pembatalan/restore pembelian memeriksa toko dan status dengan penguncian baris. Perubahan stok memperhitungkan `conv_factor` pada edit, batal, restore, dan hapus.
- Pembatalan pembelian mempertahankan batch dengan sisa nol untuk restore. Pembatalan ditolak jika batch pembelian sudah digunakan.
- Pembatalan retur memeriksa toko/status agar tidak membalik stok berulang. Pembalikan retur customer hanya berlaku untuk barang kondisi baik.
- Inisialisasi schema pendukung dilakukan sebelum transaksi baru agar DDL MySQL tidak menyebabkan commit di tengah penyimpanan.

## Hasil verifikasi

- PHP lint: **131 file**, lulus.
- Seluruh PHPUnit suite: **37 tes, 669 assertion**, lulus.
- `tests/unit/TransactionPortTest.php`: **23 tes, 303 assertion**, mencakup render daftar/form, route semua file transaksi, nominal kas, kepemilikan data, rollback, konversi stok, pembatalan berulang, harga server, dan pembayaran resto.
- Tes memakai koneksi database tiruan dan tidak memanggil gateway pembayaran, WhatsApp, atau marketplace.

Jalankan dari folder `pos_kiosq_id_ci`:

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

## Pemeriksaan berikutnya

Uji alur dengan MySQL asli serta browser: buat/edit/batal/restore pembelian, penjualan reguler dan cepat, retur, kas, sewa, pemesanan meja dan pembayaran resto. Periksa hasil pada stok, batch, kas, status order, serta struk. Uji dengan dua toko dan role pengguna yang berbeda.

Perilaku interaksi JavaScript, konkurensi pada MySQL, cetak fisik, pengiriman WhatsApp, worker sinkronisasi marketplace, serta rekonsiliasi data historis belum diverifikasi oleh tes tiruan ini. Modul stok/opname, laporan, pengaturan, API eksternal dan cron di luar halaman transaksi ini tetap merupakan tahap terpisah.
