# Map Titik Perbaikan Cart Key Varian (CRM - Subsidiary - Holding)

## Tujuan
1. Menyatukan format identitas item varian agar tidak mismatch antar modul/workspace.
2. Mencegah salah baca `variant_id` saat format key berbeda.
3. Menjaga konsistensi UI -> session -> transaksi -> bridge -> callback.

## Konteks Masalah
Saat ini ditemukan format `cart_key` campuran:
1. `variant:{variant_id}`
2. `variant:{produk_id}:{variant_id}`
3. `sku:{produk_id}:{sku}`
4. fallback lain (`produk_id`, `produk_id|variant_id`, `produk_id:variant_id`)

Parser di beberapa titik masih mengasumsikan format 1 (contoh `str_replace('variant:', ...)`) sehingga jika menerima format 2 berpotensi salah baca.

## Canonical Contract (disarankan)
1. Format final lintas aplikasi:
- `variant:{produk_id}:{variant_id}`
2. Transitional compatibility (sementara):
- tetap menerima `variant:{variant_id}` dan format legacy lain,
- tetapi semua write baru dinormalisasi ke format final.

## Titik Perbaikan Prioritas - Subsidiary (`san_sarana_8apr`)

### A. Modul Pembelian (Critical)
1. Parser `variant:*` yang masih 1-segmen:
- `application/modules/pembelian/controllers/_processSelectProduct.php:30`
- `application/modules/pembelian/controllers/_processSelectProduct.php:33`
- `application/modules/pembelian/controllers/_processSelectProduct.php:162`
- `application/modules/pembelian/controllers/_shoppingCart.php:185`
2. Writer 1-segmen:
- `application/modules/pembelian/controllers/_selectorItem.php:88`
- `application/modules/pembelian/controllers/_selectorItem.php:111`
- `application/modules/pembelian/controllers/_selectorItem.php:577`
- `application/modules/pembelian/controllers/_processSelectProduct.php:199`
3. Writer 2-segmen (sudah sesuai target):
- `application/modules/pembelian/models/MdlPembelianTransaksi.php:6645`
- `application/modules/pembelian/controllers/CliTransaksi.php:250`

### B. Modul Penjualan (Critical)
1. Writer 1-segmen:
- `application/modules/penjualan/controllers/_selectorItem.php:559`
- `application/modules/penjualan/controllers/_processSelectProduct.php:25`
- `application/modules/penjualan/controllers/_processSelectProduct.php:5498`
2. Writer/validator 2-segmen:
- `application/modules/penjualan/controllers/FollowUp.php:352`
- `application/modules/penjualan/controllers/FollowUp.php:4800`
- `application/modules/penjualan/models/MdlPenjualanTransaksi.php:6446`
3. Dampak:
- potensi split/merge qty varian tidak konsisten jika key dari jalur selector beda dengan key followup/model.

### C. Modul Distribusi (High)
1. Parser 1-segmen:
- `application/modules/distribusi/controllers/_processSelectProduct.php:29`
- `application/modules/distribusi/controllers/_processSelectProduct.php:155`
2. Writer 1-segmen:
- `application/modules/distribusi/controllers/_selectorItem.php:88`
- `application/modules/distribusi/controllers/_selectorItem.php:111`
- `application/modules/distribusi/controllers/_selectorItem.php:591`
- `application/modules/distribusi/controllers/_processSelectProduct.php:192`
3. Writer 2-segmen:
- `application/modules/distribusi/models/MdlDistribusiTransaksi.php:6112`

### D. Bridge/Model Layer (Critical)
1. Field propagation `cart_key` sudah luas, tetapi belum ada normalizer tunggal.
2. Titik prioritas:
- `application/modules/pembelian/models/MdlPembelianTransaksi.php`
- `application/modules/penjualan/models/MdlPenjualanTransaksi.php`
- `application/modules/distribusi/models/MdlDistribusiTransaksi.php`

## Titik Perbaikan Prioritas - Holding (`san_varian`)

### A. Modul Penjualan/Pembelian (Critical untuk kompatibilitas inbound)
1. Parser 1-segmen:
- `application/modules/pembelian/controllers/_processSelectProduct.php:143`
- `application/modules/penjualan/controllers/_processSelectProduct.php:443`
- `application/modules/pembelian/controllers/FollowUp.php:603`
- `application/modules/penjualan/controllers/FollowUp.php:493`
2. Writer 1-segmen yang dominan:
- `application/modules/pembelian/controllers/_selectorItem.php:88`
- `application/modules/penjualan/controllers/_selectorItem.php:556`
- `application/modules/penjualan/controllers/Transaksi.php:5801`
3. Catatan:
- Workspace ini saat ini dominan format `variant:{variant_id}`.
- Jika menerima payload dari subsidiary yang sudah `variant:{produk_id}:{variant_id}`, wajib ada adapter parser.

### B. Modul Distribusi
1. Folder `application/modules/distribusi` tidak tersedia di workspace ini.
2. Titik distribusi varian di holding mengikuti modul lain (mis. `distribusifg`), perlu audit terpisah saat implementasi fase berikutnya.

## Titik Perbaikan Prioritas - CRM (`san_ibb_master`)

### A. Kondisi Saat Ini
1. Tidak ditemukan penggunaan `cart_key` di source CI4 `app/*.php`.
2. CRM menulis dan mengirim `variant_id` di estimate items:
- `app/Controllers/Estimates.php:4527`
3. Jalur kirim order:
- `app/Controllers/Estimates.php:5923` (`sendOrderSubsidiary`)
- `app/Controllers/Estimates.php:5937` (`sendOrderDirectHolding`)
- `app/Services/WebhookService.php:200`

### B. Titik Perbaikan
1. Tidak perlu memaksakan `cart_key` di CRM.
2. Wajib pastikan payload outbound memuat `produk_id + variant_id` stabil agar downstream bisa membentuk canonical `cart_key`.

## Urutan Eksekusi Disarankan
1. Buat helper normalizer/parser tunggal per workspace:
- `parseCartKey()`
- `buildCartKeyCanonical(produk_id, variant_id, variant_sku)`
2. Ganti parser raw `str_replace('variant:', ...)` ke helper parser.
3. Ganti writer 1-segmen di selector/process ke builder canonical.
4. Pasang compatibility adapter di holding terlebih dulu (agar inbound dari subsidiary aman).
5. Aktifkan logging sementara untuk mendeteksi key non-canonical.
6. Jalankan UAT point-to-point P00..P10 dengan 3 skenario:
- varian normal,
- non-varian,
- legacy payload (variant kosong / format key lama).

## Risiko Jika Tidak Diperbaiki
1. Salah resolve `variant_id` saat parsing key 3-segmen.
2. Qty varian bisa collapse/merge lintas baris yang tidak semestinya.
3. Data bridge/printing/history dapat menampilkan item tidak konsisten.
4. Callback/cancel orchestration berpotensi gagal map item ketika identity key beda.

## Kriteria Selesai
1. Semua write baru menghasilkan `variant:{produk_id}:{variant_id}`.
2. Semua parser menerima format lama tetapi menyimpan ulang ke canonical.
3. Tidak ada regresi transaksi non-varian.
4. UAT P00..P10 lulus untuk semua skenario varian lintas CRM-subsidiary-holding.
