﻿# Checklist Optimal Perbaikan Modul Biaya (`biaya`)

Target utama:
- [ ] Semua revisi kompatibel `PHP 5.6`.
- [ ] Semua revisi kompatibel `CodeIgniter 3`.
- [ ] Hindari sintaks PHP 7+ (`??`, type hint scalar/return type, anonymous class, dll).

Aturan eksekusi:
1. Kerjakan berurutan dari `P0` ke `P3` (jangan lompat).
2. Satu item checklist = satu patch kecil agar mudah rollback.
3. Setiap item selesai wajib smoke test minimal `create -> followup -> history -> print`.
4. Update progres: checklist `[x]` menandakan item yang sudah dieksekusi (update terakhir: `2026-04-08`).

## P0 - Risiko Tertinggi (Security + Integritas Data)

### P0.1 Hardening endpoint API bridge (`ModulConnect`)
- [x] Ubah endpoint mutasi dari `GET` menjadi `POST` (`api_update_bridge`, `api_update_masterBridge`, `api_masterBridgePL`).
- [x] Tambahkan autentikasi request (header secret/HMAC + timestamp + replay protection).
- [x] Hapus `Access-Control-Allow-Origin: *` dari endpoint internal.
- [x] Matikan debug paksa (`$forceDebug = 1`) dan `display_errors` pada controller API.
- [x] Tolak request tanpa signature valid dengan kode `401/403`.
- File terlibat:
- `application/modules/biaya/controllers/API/ModulConnect.php`
- `application/config/rest.php`
- `application/config/config.php`

### P0.2 Hilangkan insecure deserialization dari input request
- [x] Ganti pola `unserialize(base64_decode($_GET/...))` pada file prioritas yang sudah dipatch ke parser aman.
- [x] Buat helper parser terpusat untuk payload filter/list supaya tidak parsing ad-hoc.
- [x] Larang `blobDecode()` langsung untuk data request user (dialihkan ke helper request parser aman).
- [ ] Jika data tetap harus encoded, gunakan format JSON + signature.
- File terlibat prioritas:
- `application/helpers/he_misc_helper.php`
- `application/modules/biaya/controllers/ActivityReport.php`
- `application/modules/biaya/controllers/History.php`
- `application/modules/biaya/controllers/Transaksi.php`
- `application/modules/biaya/controllers/_processSelectBiaya.php`
- `application/modules/biaya/controllers/_processSelectPendapatan.php`
- `application/modules/biaya/controllers/_processSelectRekeningGaji.php`
- `application/modules/biaya/controllers/_processSelectSupplies.php`
- `application/modules/biaya/controllers/_shoppingCart.php`

### P0.3 Tutup celah SQL injection (filter string/raw condition)
- [ ] Refactor filter berbasis string menjadi Query Builder CI3 + binding parameter.
- [ ] Whitelist field yang boleh dipakai untuk `addParams`.
- [x] Cast id numerik dari request pada endpoint prioritas (API/Webhook) sebelum query.
- [ ] Hentikan concatenation SQL di join/where yang memasukkan nilai request mentah.
- [x] Mitigasi awal ditambahkan di `MdlMother` untuk menolak ekspresi filter berbahaya.
- File terlibat prioritas:
- `application/models/Mdls/MdlMother.php`
- `application/modules/biaya/models/MdlBiayaTransaksi.php`
- `application/modules/biaya/controllers/ActivityReport.php`
- `application/modules/biaya/controllers/History.php`
- `application/modules/biaya/controllers/Transaksi.php`
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/controllers/_processSelectBiaya.php`
- `application/modules/biaya/controllers/_processSelectNota.php`
- `application/modules/biaya/controllers/_processSelectNotaItem.php`
- `application/modules/biaya/controllers/_processSelectPendapatan.php`
- `application/modules/biaya/controllers/_processSelectRekeningGaji.php`
- `application/modules/biaya/controllers/_processSelectSupplies.php`

### P0.4 Konsolidasi authorization (akses mutasi data)
- [x] Hapus bypass login khusus `AutoPostingBiaya` di `Modul_Controller`.
- [ ] Wajibkan validasi hak step (`stepCodeByEmployeeID`) di semua endpoint mutasi, dan **harus return stop** jika gagal.
- [ ] Terapkan validasi place/branch konsisten untuk semua endpoint `_process*`, `_shoppingCart`, `_followupLiveEdit`.
- [x] Batasi akses endpoint API eksternal hanya dari service account/whitelist.
- [x] Implementasi tahap 1: validasi hak step + place diterapkan pada `_processSelect*` dan `_shoppingCart`.
- File terlibat:
- `application/modules/biaya/controllers/Modul_Controller.php`
- `application/modules/biaya/controllers/AutoPostingBiaya.php`
- `application/modules/biaya/controllers/_processSelectBiaya.php`
- `application/modules/biaya/controllers/_processSelectNota.php`
- `application/modules/biaya/controllers/_processSelectNotaItem.php`
- `application/modules/biaya/controllers/_processSelectPendapatan.php`
- `application/modules/biaya/controllers/_processSelectRekeningGaji.php`
- `application/modules/biaya/controllers/_processSelectSupplies.php`
- `application/modules/biaya/controllers/_processPihak.php`
- `application/modules/biaya/controllers/_processPihakMain.php`
- `application/modules/biaya/controllers/_processPihakMainRules.php`
- `application/modules/biaya/controllers/_shoppingCart.php`
- `application/modules/biaya/controllers/_followupLiveEdit.php`

### P0.5 Aktifkan perlindungan CSRF + benahi HTTP method
- [x] Aktifkan `$config['csrf_protection'] = true`.
- [ ] Ubah endpoint mutasi yang sekarang `GET` menjadi `POST`.
- [x] Pastikan semua AJAX modul biaya mengirim token CSRF.
- [ ] Audit endpoint mutasi agar idempotent key dipakai saat simpan/followup.
- [x] Implementasi tahap 1: endpoint mutasi API/Webhook prioritas dipindah ke `POST` dan `GET` ditolak.
- File terlibat:
- `application/config/config.php`
- `application/modules/biaya/controllers/_processSelectBiaya.php`
- `application/modules/biaya/controllers/_processSelectNota.php`
- `application/modules/biaya/controllers/_processSelectNotaItem.php`
- `application/modules/biaya/controllers/_processSelectPendapatan.php`
- `application/modules/biaya/controllers/_processSelectRekeningGaji.php`
- `application/modules/biaya/controllers/_processSelectSupplies.php`
- `application/modules/biaya/controllers/_shoppingCart.php`
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/FollowUp.php`

### P0.6 Benahi locking & race-condition di proses followup/create
- [x] Pastikan `trans_start()/trans_begin()` dipanggil **sebelum** query `FOR UPDATE` (sudah dipatch di `FollowUp::doFollowup`).
- [x] Standardisasi lock-key/idempotency (`bookingNumber`) agar tidak collision (gunakan random bytes + timestamp).
- [x] Pastikan validasi `bookingNumber` dilakukan di awal dan akhir transaksi (Create + FollowUp core flow).
- [x] Tambahkan unique guard pada nomor transaksi/counter update (guard `writeMainEntries` + hardening atomic di `CustomCounter`).
- File terlibat:
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/__Create.php`
- `application/modules/biaya/controllers/Create_total.php`
- `application/modules/biaya/models/MdlBiayaTransaksi.php`
- `application/modules/biaya/models/Coms/ComRekeningPembantuTransaksiBiaya.php`
- `application/modules/biaya/models/Coms/ComRekeningTransaksiDataBiaya.php`
- `application/modules/biaya/models/Coms/ComRekeningTransaksiDataBiayaCache.php`
- `application/modules/biaya/models/Coms/ComTransaksiDataBiaya.php`
- `application/modules/biaya/models/Coms/ComTransaksiDataBiayaBridging.php`
- `application/modules/biaya/models/Coms/ComTransaksiDataBiayaTerimaBridging.php`

## P1 - Risiko Tinggi (Konsistensi Persistence + Stabilitas)

### P1.1 Rapikan boundary transaksi database
- [ ] Ganti pola `trans_begin` + `die/matiHere` menjadi `try/catch` + rollback eksplisit.
- [x] Gunakan `trans_status()` untuk keputusan commit/rollback (implementasi tahap 2: diperluas ke flow prioritas `Create.php` + `FollowUp.php` + `Create_total.php` + `AutoPostingBiaya.php` + `_shoppingCart.php`).
- [x] Hilangkan campuran `trans_begin` dan `trans_complete` yang ambigu pada flow sama (implementasi tahap 1 pada `_shoppingCart`).
- [ ] Pastikan semua update multi-tabel (main, detail, registry, payment source, locker) dalam satu boundary transaksi.
- File terlibat:
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/Create_total.php`
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__Create.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/controllers/_shoppingCart.php`
- `application/modules/biaya/controllers/AutoPostingBiaya.php`

### P1.2 Hapus debug sink / kill-switch di jalur produksi
- [x] Nonaktifkan `Debug.php` via route/env guard.
- [ ] Bersihkan `arrPrint`, `cek*`, `matiHere`, `die` dari endpoint kritikal.
- [ ] Ubah pesan error menjadi standar JSON/HTML alert yang aman tanpa leak query/detail server.
- File terlibat prioritas:
- `application/modules/biaya/controllers/Debug.php`
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/__Create.php`
- `application/modules/biaya/controllers/ActivityReport.php`
- `application/modules/biaya/controllers/API/Webhook.php`
- `application/modules/biaya/controllers/API/ModulConnect.php`
- `application/modules/biaya/controllers/_construct_file.php`

### P1.3 Hardening upload image/dokumen
- [x] Validasi MIME whitelist + ekstensi + ukuran sebelum kirim ke CDN.
- [x] Tangani error/timeout `curl_exec` dengan fallback yang aman.
- [x] Simpan hanya URL yang tervalidasi dari response CDN.
- File terlibat:
- `application/modules/biaya/controllers/_shoppingCart.php`
- `application/helpers/he_url_helper.php`

### P1.4 Perbaiki bug laten yang berdampak produksi
- [x] Perbaiki variabel tidak terdefinisi (`$id` di `recordImage`).
- [x] Perbaiki endpoint API yang return variabel tidak terdefinisi (`api_return_biaya_get`).
- [x] Perbaiki `index_get` yang memanggil `echo(index)`.
- [x] Perbaiki mismatch class/file (`Create_total.php`, `Taxes.php`) agar autoload/routing tidak rancu.
- [x] Perbaiki serialisasi salah urutan (`serialize(base64_encode(...))`).
- File terlibat:
- `application/modules/biaya/controllers/_shoppingCart.php`
- `application/modules/biaya/controllers/API/ModulConnect.php`
- `application/modules/biaya/controllers/Create_total.php`
- `application/modules/biaya/controllers/Taxes.php`
- `application/modules/biaya/controllers/_processSelectNota.php`
- `application/modules/biaya/controllers/_followupLiveEdit.php`

### P1.5 Perbaiki keamanan webhook
- [x] Hapus `arrPrint($_GET)` di endpoint webhook.
- [x] Pastikan hanya method `POST` diterima untuk aksi mutasi.
- [x] Tambahkan signature verification jika webhook dipanggil antar sistem.
- [x] Tambahkan rate-limit dan request-id log.
- File terlibat:
- `application/modules/biaya/controllers/API/Webhook.php`

## P2 - Risiko Menengah (Maintainability + Regression Risk)

### P2.1 Konsolidasi file duplikat/legacy
- [ ] Tentukan status file `__Create.php` dan `__FollowUp.php` (aktif/deprecate).
- [ ] Jika aktif, sinkronkan patch keamanan dengan `Create.php` dan `FollowUp.php`.
- [ ] Jika deprecate, nonaktifkan route dan dokumentasikan migrasi.
- File terlibat:
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__Create.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/views/transaksi_OLD.php`
- `application/modules/biaya/views/shoppingCart_OLD.php`

### P2.2 Pecah controller besar jadi service/helper terstruktur
- [ ] Ekstrak logic build registry/persistensi ke service khusus.
- [ ] Ekstrak logic validasi request/filter ke helper tunggal.
- [ ] Kurangi ukuran method > 300 baris agar mudah test dan aman refactor.
- File terlibat prioritas:
- `application/modules/biaya/controllers/FollowUp.php`
- `application/modules/biaya/controllers/__FollowUp.php`
- `application/modules/biaya/controllers/Create.php`
- `application/modules/biaya/controllers/ActivityReport.php`
- `application/modules/biaya/controllers/Printing.php`

### P2.3 Standardisasi response endpoint
- [ ] Endpoint API: response JSON konsisten (`status`, `message`, `data`).
- [ ] Endpoint internal AJAX: response script/JSON dipisah jelas.
- [ ] Hindari campuran `echo <script>` + `die` di endpoint yang sama.
- File terlibat:
- `application/modules/biaya/controllers/API/ModulConnect.php`
- `application/modules/biaya/controllers/API/Webhook.php`
- `application/modules/biaya/controllers/_processSelectBiaya.php`
- `application/modules/biaya/controllers/_processSelectNota.php`
- `application/modules/biaya/controllers/_processSelectNotaItem.php`
- `application/modules/biaya/controllers/_shoppingCart.php`

## P3 - Risiko Rendah (Quality Gate + Operasional)

### P3.1 Regression checklist manual (wajib sebelum deploy)
- [ ] Skenario `Create` normal berhasil.
- [ ] Skenario `FollowUp` normal berhasil.
- [ ] Skenario `Cancel/Revert` tidak meninggalkan data yatim.
- [ ] Skenario `History`, `ActivityReport`, `Printing` tetap benar.
- [ ] Skenario upload image gagal/timeout ditangani aman.
- [ ] Skenario webhook valid/invalid tervalidasi.
- [ ] Skenario multi user bersamaan tidak membuat duplikasi nomor.
- File terlibat:
- Semua controller/model/view/template modul `biaya`.

### P3.2 Dokumentasi release dan rollback
- [ ] Catat perubahan schema/config yang mempengaruhi modul biaya.
- [ ] Buat SOP rollback untuk patch security.
- [ ] Buat daftar endpoint yang berubah method (`GET` -> `POST`).
- [ ] Dokumentasikan kontrak payload baru (JSON + signature).
- File terlibat:
- `application/modules/biaya/config/coTransaksiCore.php`
- `application/modules/biaya/config/coTransaksiLayout.php`
- `application/modules/biaya/config/coTransaksiUi.php`
- `application/modules/biaya/config/coTransaksiValues.php`
- `application/modules/biaya/controllers/API/ModulConnect.php`
- `application/modules/biaya/controllers/API/Webhook.php`

---

## Cakupan File Modul Biaya (Checklist Lengkap)

### Config
- [ ] `application/modules/biaya/config/_coTransaksiCore.php`
- [ ] `application/modules/biaya/config/coTransaksiCore.php`
- [ ] `application/modules/biaya/config/coTransaksiCore_before_ppv.php`
- [ ] `application/modules/biaya/config/coTransaksiLayout.php`
- [ ] `application/modules/biaya/config/coTransaksiUi.php`
- [ ] `application/modules/biaya/config/coTransaksiValues.php`

### Controllers (Core)
- [ ] `application/modules/biaya/controllers/__Create.php`
- [ ] `application/modules/biaya/controllers/__FollowUp.php`
- [ ] `application/modules/biaya/controllers/_construct_file.php`
- [ ] `application/modules/biaya/controllers/_followupLiveEdit.php`
- [ ] `application/modules/biaya/controllers/_processPihak.php`
- [ ] `application/modules/biaya/controllers/_processPihakMain.php`
- [ ] `application/modules/biaya/controllers/_processPihakMainRules.php`
- [ ] `application/modules/biaya/controllers/_processSelectBiaya.php`
- [ ] `application/modules/biaya/controllers/_processSelectNota.php`
- [ ] `application/modules/biaya/controllers/_processSelectNotaItem.php`
- [ ] `application/modules/biaya/controllers/_processSelectPendapatan.php`
- [ ] `application/modules/biaya/controllers/_processSelectRekeningGaji.php`
- [ ] `application/modules/biaya/controllers/_processSelectSupplies.php`
- [ ] `application/modules/biaya/controllers/_selectorItem.php`
- [ ] `application/modules/biaya/controllers/_selectorPihak.php`
- [ ] `application/modules/biaya/controllers/_selectorPihakMain.php`
- [ ] `application/modules/biaya/controllers/_selectorPihakMainRules.php`
- [ ] `application/modules/biaya/controllers/_shoppingCart.php`
- [ ] `application/modules/biaya/controllers/ActivityReport.php`
- [ ] `application/modules/biaya/controllers/AutoPostingBiaya.php`
- [ ] `application/modules/biaya/controllers/Create.php`
- [ ] `application/modules/biaya/controllers/Create_total.php`
- [ ] `application/modules/biaya/controllers/Debug.php`
- [ ] `application/modules/biaya/controllers/FollowUp.php`
- [ ] `application/modules/biaya/controllers/History.php`
- [ ] `application/modules/biaya/controllers/Modul_Controller.php`
- [ ] `application/modules/biaya/controllers/Printing.php`
- [ ] `application/modules/biaya/controllers/Taxes.php`
- [ ] `application/modules/biaya/controllers/Transaksi.php`
- [ ] `application/modules/biaya/controllers/ViewDetails.php`

### Controllers (API)
- [ ] `application/modules/biaya/controllers/API/ModulConnect.php`
- [ ] `application/modules/biaya/controllers/API/Webhook.php`

### Models
- [ ] `application/modules/biaya/models/MdlBiayaTransaksi.php`
- [ ] `application/modules/biaya/models/MdlBiayaTransaksi_trash.php`
- [ ] `application/modules/biaya/models/Coms/ComRekeningPembantuTransaksiBiaya.php`
- [ ] `application/modules/biaya/models/Coms/ComRekeningTransaksiDataBiaya.php`
- [ ] `application/modules/biaya/models/Coms/ComRekeningTransaksiDataBiayaCache.php`
- [ ] `application/modules/biaya/models/Coms/ComTransaksiDataBiaya.php`
- [ ] `application/modules/biaya/models/Coms/ComTransaksiDataBiayaBridging.php`
- [ ] `application/modules/biaya/models/Coms/ComTransaksiDataBiayaTerimaBridging.php`
- [ ] `application/modules/biaya/models/Coms/readme.txt`
- [ ] `application/modules/biaya/models/Coms/trash/ComJurnalPembelian.php`
- [ ] `application/modules/biaya/models/Coms/trash/ComRekeningPembelian.php`
- [ ] `application/modules/biaya/models/Coms/trash/ComRekeningTransaksiPembelian.php`

### Views
- [ ] `application/modules/biaya/views/_selector.php`
- [ ] `application/modules/biaya/views/_selectorPihak.php`
- [ ] `application/modules/biaya/views/activityReports.php`
- [ ] `application/modules/biaya/views/history.php`
- [ ] `application/modules/biaya/views/printing.php`
- [ ] `application/modules/biaya/views/shoppingCart.php`
- [ ] `application/modules/biaya/views/shoppingCart_OLD.php`
- [ ] `application/modules/biaya/views/transaksi.php`
- [ ] `application/modules/biaya/views/transaksi_modul.php`
- [ ] `application/modules/biaya/views/transaksi_OLD.php`
- [ ] `application/modules/biaya/views/viewdetails.php`

### Template
- [ ] `application/modules/biaya/template/1674.html`
- [ ] `application/modules/biaya/template/1674r.html`
- [ ] `application/modules/biaya/template/4449.html`
- [ ] `application/modules/biaya/template/4449r.html`
- [ ] `application/modules/biaya/template/651.html`
- [ ] `application/modules/biaya/template/651r.html`
- [ ] `application/modules/biaya/template/675.html`
- [ ] `application/modules/biaya/template/675r.html`
- [ ] `application/modules/biaya/template/676.html`
- [ ] `application/modules/biaya/template/676r.html`
- [ ] `application/modules/biaya/template/677.html`
- [ ] `application/modules/biaya/template/677r.html`
- [ ] `application/modules/biaya/template/762.html`
- [ ] `application/modules/biaya/template/7620.html`
- [ ] `application/modules/biaya/template/7620r.html`
- [ ] `application/modules/biaya/template/762r.html`
- [ ] `application/modules/biaya/template/9982.html`
- [ ] `application/modules/biaya/template/9982r.html`
- [ ] `application/modules/biaya/template/abReport.html`
- [ ] `application/modules/biaya/template/history.html`
- [ ] `application/modules/biaya/template/history_status.html`
- [ ] `application/modules/biaya/template/outstanding.html`
- [ ] `application/modules/biaya/template/outstandingConsolidate.html`
- [ ] `application/modules/biaya/template/transaksi.html`
- [ ] `application/modules/biaya/template/transaksi_extern.html`
- [ ] `application/modules/biaya/template/transaksi_fullfill.html`
- [ ] `application/modules/biaya/template/transaksi_index.html`
- [ ] `application/modules/biaya/template/transaksi_nopihak.html`
- [ ] `application/modules/biaya/template/transaksi_pettycash.html`
- [ ] `application/modules/biaya/template/transaksi_pihak4.html`
- [ ] `application/modules/biaya/template/transaksi_supplies_biaya.html`
- [ ] `application/modules/biaya/template/transaksi2.html`
- [ ] `application/modules/biaya/template/transaksi-modul.html`
- [ ] `application/modules/biaya/template/viewdetails.html`

---

## File Lintas Modul yang Wajib Ikut Direvisi
- [ ] `application/config/config.php` (CSRF + hardening)
- [ ] `application/config/rest.php` (REST auth policy)
- [ ] `application/helpers/he_misc_helper.php` (`blobDecode/blobEncode`)
- [ ] `application/helpers/he_url_helper.php` (`upload_image/upload_document`)
- [ ] `application/models/Mdls/MdlMother.php` (parser filter raw SQL)

## Catatan Akhir
- [ ] Setiap perubahan keamanan wajib disertai uji backward-compatibility terhadap alur lama.
- [ ] Jika ada perubahan kontrak request, siapkan transisi bertahap agar integrasi existing tidak langsung putus.
- [ ] Prioritaskan patch `P0` sebelum optimasi performa/refactor.
