# CHECKLIST PLAN UPGRADE MODUL `konversi` SUPPORT PRODUK VARIAN

## Acuan

Blueprint utama:

- `docs/blueprint-upgrade-modul-konversi-support-varian.md`

Standar adopted:

- `application/modules/variant_cutover/STANDAR_MODUL_VARIANT_CUTOVER_ISO25010.md`
- `STANDAR_MODUL_PENJUALAN_ISO25010.md`

## Cara Pakai

Status:

- `Belum` = belum dikerjakan
- `Sedang` = sedang dikerjakan
- `Selesai` = sudah dipatch dan diverifikasi
- `Blocked` = butuh keputusan/temuan teknis

Aturan kerja:

- Jangan masuk Fase 4 sebelum Fase 0-3 selesai.
- Semua patch wajib kompatibel PHP 5.6.
- Query baru wajib Query Builder/binding.
- Tidak boleh mengubah flow native non-varian tanpa UAT M4.

---

## Fase 0 - Baseline, Toggle, dan Trace Kompatibilitas

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F0-01 | Trace flow existing `1334` pusat dan `334` cabang dari UI sampai followup | `application/modules/konversi/config/coTransaksiUi.php`, `FollowUp.php` | Belum | |
| F0-02 | Verifikasi komponen varian tersedia dan kompatibel dipakai dari modul `konversi` | `coTransaksiCore.php`, component terkait | Blocked | Belum ada `FifoProdukJadiVarian`/`LockerStockVariant`/`LockerStockMutasiVariant` di modul `konversi` |
| F0-03 | Verifikasi `coTransaksiValues.php` bisa membawa `item_type`, `produk_id`, `variant_id` | `application/modules/konversi/config/coTransaksiValues.php` | Blocked | Mapping `item_type` belum ada; perlu penambahan gate baru |
| F0-04 | Tambah flag `variant_mode_enabled` default nonaktif | `coTransaksiUi.php` | Selesai | `application/modules/konversi/config/coTransaksiUi.php` |
| F0-05 | Tambah resolver `conversion_mode` tanpa mengubah posting existing | controller/helper yang paling sesuai | Selesai | `application/modules/konversi/controllers/Modul_Controller.php` |
| F0-06 | Pastikan M4 non-varian -> non-varian tetap memakai behavior native | flow `1334`, `334` | Belum | |

Definition of done Fase 0:

- Flag ada, tetapi belum mengubah mutasi stok.
- M4 masih berjalan seperti baseline.
- Komponen varian dan gate config sudah dipastikan bisa dipakai atau dicatat sebagai gap.

---

## Fase 1 - Data Readiness dan Session Contract

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F1-01 | Tambah loader produk varian via `MdlProdukVarian` | `_processSelectProductConvertion.php` | Sedang | Loader varian sudah ada sebagai helper `loadVarianProduk()`, belum diarahkan ke model `MdlProdukVarian` |
| F1-02 | Tambah query stok varian dari `stock_locker_variant` by `variant_id`, `state`, `cabang_id`, `gudang_id` | `_processSelectProductConvertion.php` | Selesai | Helper `getVariantCurrentStock()` sudah filter `variant_id`,`state`,`cabang_id`,`gudang_id` |
| F1-03 | Tambah validasi mapping `variant_id` ke `parent_produk_id` | `_processSelectProductConvertion.php` / helper | Selesai | Helper `isVariantBelongsToProduk()` dipakai saat bentuk gate source/target |
| F1-04 | Bentuk session `items_source` dan `items_target` | `_processSelectProductConvertion.php`, `_shoppingCart.php` | Selesai | Gate dibentuk di selector + `rebuildConversionGates()` di `_shoppingCart.php` |
| F1-05 | Pertahankan session legacy `items`, `items2`, `items2_sum` untuk compatibility | `_shoppingCart.php` | Belum | |
| F1-06 | Tambah field minimal `item_type`, `produk_id`, `variant_id`, `parent_produk_id`, `jml`, `hpp` | session/value gate | Selesai | Field sudah diisi pada gate source/target (`_processSelectProductConvertion.php`, `_shoppingCart.php`) |
| F1-07 | Tambah handling satuan dan `jml_per_satuan` | `_shoppingCart.php` | Belum | |

Definition of done Fase 1:

- Source/target bisa direpresentasikan sebagai `produk` atau `variant`.
- Stok source variant berasal dari `stock_locker_variant`, bukan dari cache/master varian.
- Tidak ada posting stok baru.

---

## Fase 2 - UI, Cart, Hold, dan Alokasi

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F2-01 | Tambah UI/parameter untuk memilih source type dan target type | `coTransaksiUi.php`, template terkait | Belum | |
| F2-02 | Tambah kolom source: `item_type`, `current_stok`, `distribute`, `sisa_distribute` | `coTransaksiUi.php` | Belum | |
| F2-03 | Tambah kolom target: `item_type`, `sku`, `header_varian`, `current_stok`, `jml` | `coTransaksiUi.php` | Belum | |
| F2-04 | Tambah handler alokasi varian `recordItemColumnVarian` atau handler generic setara | `_shoppingCart.php` | Belum | |
| F2-05 | Rebuild `items_source`, `items_target`, dan `items2_sum` setiap edit qty/alokasi | `_shoppingCart.php` | Belum | |
| F2-06 | Implement source hold untuk `produk` di `stock_locker` | `_processSelectProductConvertion.php` | Belum | |
| F2-07 | Implement source hold untuk `variant` di `stock_locker_variant` | `_processSelectProductConvertion.php` / component | Belum | |
| F2-08 | Release hold saat remove item dari cart | `_processSelectProductConvertion.php`, `_shoppingCart.php` | Belum | |
| F2-09 | Release hold saat cancel, rollback, dan timeout | `FollowUp.php` / rollback handler | Belum | |

Definition of done Fase 2:

- Cart bisa menampilkan source/target varian dan non-varian.
- Hold hanya dibuat untuk source yang dikurangi.
- Target tidak memakai current stock sebagai batas penambahan.

---

## Fase 3 - Validator Approve dan Guard Integritas

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F3-01 | Validasi `total_qty_source == total_qty_target` | `Transaksi.php::validate()` | Belum | |
| F3-02 | Validasi total nilai source = total nilai target | `Transaksi.php::validate()` | Belum | |
| F3-03 | Validasi source stock real-time sesuai `item_type` | `Transaksi.php::validate()` | Belum | |
| F3-04 | Validasi qty setiap baris > 0 | `Transaksi.php::validate()` | Belum | |
| F3-05 | Tolak self-conversion source dan target identik | `Transaksi.php::validate()` | Belum | |
| F3-06 | Validasi `variant_id` sesuai parent | `Transaksi.php::validate()` | Belum | |
| F3-07 | Validasi satu transaksi hanya satu gudang | `Transaksi.php::validate()` | Belum | |
| F3-08 | Validasi SoD `requestor != approver` | `FollowUp.php` / approve gate | Belum | |
| F3-09 | Validasi `requestor != rollback_user` | `FollowUp.php` rollback | Belum | |
| F3-10 | Tambah status `DRAFT`, `IN_PROGRESS`, `COMPLETED`, `FAILED`, `ROLLED_BACK` jika belum ada | controller/helper status | Belum | |
| F3-11 | Tambah timeout proses default 30 menit | `FollowUp.php` / session state | Belum | |

Definition of done Fase 3:

- Tombol approve tidak bisa lolos jika qty, nilai, stok, parent map, SoD, atau gudang tidak valid.
- Error message menyebut item dan penyebab bisnisnya.

---

## Fase 4 - Posting Engine dan Core Mapping

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F4-01 | Pisahkan gate source/target berdasarkan `item_type` jika engine tidak bisa branch | `coTransaksiCore.php`, `coTransaksiValues.php` | Belum | |
| F4-02 | Source `produk` pakai `LockerStock` dan `LockerStockMutasi` | `coTransaksiCore.php` | Belum | |
| F4-03 | Source `variant` pakai `LockerStockVariant` dan `LockerStockMutasiVariant` | `coTransaksiCore.php` | Belum | |
| F4-04 | Target `produk` pakai `FifoProdukJadi`, `LockerStock`, `LockerStockMutasi` | `coTransaksiCore.php` | Belum | |
| F4-05 | Target `variant` pakai `FifoProdukJadiVarian`, `LockerStockVariant`, `LockerStockMutasiVariant` | `coTransaksiCore.php` | Belum | |
| F4-06 | Pastikan `tableIn detail/detail2/detail2_sum` membawa `item_type`, `produk_id`, `variant_id` | `coTransaksiCore.php` | Belum | |
| F4-07 | Pastikan followup dalam satu DB transaction | `FollowUp.php` | Belum | |
| F4-08 | Simulasi gagal di tengah posting dan pastikan rollback penuh | manual/UAT | Belum | |

Definition of done Fase 4:

- M1/M2/M3/M4 memakai komponen stok dan FIFO yang benar.
- Tidak ada commit per fase.
- Tidak ada state setengah posting jika gagal.

---

## Fase 5 - Audit, Error Logging, dan Compliance Evidence

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F5-01 | Audit mencatat `conversion_mode`, source/target item, qty, HPP, user request, user approve, timestamp server | audit log / transaksi values | Belum | |
| F5-02 | Audit dibuat immutable dari aplikasi | audit mechanism | Belum | |
| F5-03 | Retensi audit minimal 5 tahun dicatat di dokumentasi | docs/evidence | Belum | |
| F5-04 | Error log mencatat `transaksi_id`, mode, fase, file, line, timestamp, stack trace | `FollowUp.php` / logger | Belum | |
| F5-05 | Change management evidence dibuat | `docs/evidence/konversi/` | Belum | |
| F5-06 | Risk register konversi dibuat | `docs/evidence/konversi/` | Belum | |
| F5-07 | Rekonsiliasi inventory adjustment account dibuat | `docs/evidence/konversi/` | Belum | |
| F5-08 | CAPA log dan incident response evidence dibuat | `docs/evidence/konversi/` | Belum | |

Definition of done Fase 5:

- Audit bisa menjawab siapa, kapan, mode apa, source apa, target apa, qty/nilai berapa, dan hasil akhirnya.
- Evidence release tersimpan di path standar.

---

## Fase 6 - UAT Mode dan Release Gate

| ID | Checklist | File Target | Status | Evidence |
|---|---|---|---|---|
| F6-01 | UAT M1 Varian -> Varian happy path | manual/UAT | Belum | |
| F6-02 | UAT M2 Non-Varian -> Varian happy path | manual/UAT | Belum | |
| F6-03 | UAT M3 Varian -> Non-Varian happy path | manual/UAT | Belum | |
| F6-04 | UAT M4 Non-Varian -> Non-Varian native tidak regress | manual/UAT | Belum | |
| F6-05 | UAT insufficient stock diblokir | manual/UAT | Belum | |
| F6-06 | UAT over-allocation diblokir | manual/UAT | Belum | |
| F6-07 | UAT under-allocation diblokir | manual/UAT | Belum | |
| F6-08 | UAT financial mismatch diblokir | manual/UAT | Belum | |
| F6-09 | UAT wrong variant-parent mapping diblokir | manual/UAT | Belum | |
| F6-10 | UAT self-conversion diblokir | manual/UAT | Belum | |
| F6-11 | UAT rollback saat gagal di tengah | manual/UAT | Belum | |
| F6-12 | UAT concurrency 2 user tidak double movement | manual/UAT | Belum | |
| F6-13 | UAT performa approve 50 detail < 10 detik | manual/UAT | Belum | |
| F6-14 | UAT responsif PC 1024x768 dan tablet 800x1280 | manual/UAT | Belum | |

Definition of done Fase 6:

- Semua release checklist blueprint section 16.2 lulus.
- Evidence UAT tersimpan di `docs/evidence/konversi/`.
- Tidak ada gap `Blocked` tersisa.

---

## Larangan Teknis Saat Implementasi

| ID | Larangan | Status |
|---|---|---|
| L-01 | Dilarang hard delete transaksi/audit konversi | Belum diverifikasi |
| L-02 | Dilarang update/insert stok manual tanpa transaksi operasional | Belum diverifikasi |
| L-03 | Dilarang commit per fase | Belum diverifikasi |
| L-04 | Dilarang pakai FLOAT untuk qty, harga, HPP, dan total nilai | Belum diverifikasi |
| L-05 | Dilarang approve source dan target identik | Belum diverifikasi |
| L-06 | Dilarang bypass mapping `variant_id` ke `parent_produk_id` | Belum diverifikasi |
| L-07 | Dilarang konversi tanpa audit trail | Belum diverifikasi |
| L-08 | Dilarang membiarkan hold source menggantung | Belum diverifikasi |
| L-09 | Dilarang request dan approve oleh user yang sama pada transaksi yang sama | Belum diverifikasi |
| L-10 | Dilarang menebak alokasi varian otomatis tanpa rule config tertulis | Belum diverifikasi |

---

## Evidence Minimum

Evidence release disimpan di `docs/evidence/konversi/`.

| Evidence | Status |
|---|---|
| `fs-02_m1_m2_m3_m4_qty_balance_<tanggal>.md` | Belum |
| `fvc-01_hpp_balance_<tanggal>.md` | Belum |
| `rl-03_atomic_rollback_<tanggal>.md` | Belum |
| `pst-06_hold_release_<tanggal>.md` | Belum |
| `sod-01_request_approve_separation_<tanggal>.md` | Belum |
| `cmp-01_audit_immutable_<tanggal>.md` | Belum |
| `pe-01_performance_50_detail_<tanggal>.md` | Belum |
| `mt-02_error_logging_recovery_<tanggal>.md` | Belum |
| `lc-01_risk_register_<tanggal>.md` | Belum |
| `lc-03_inventory_adjustment_reconciliation_<tanggal>.md` | Belum |
