# Blueprint: Fix Variant Data Empty di Step 2 Followup (7881/881)

## Problem
Semua field di `transaksi_data` untuk baris varian target (step 2) kosong:
```
produk_id=0, produk_nama='', produk_kode='', produk_label='', satuan='',
produk_ord_jml='', valid_qty='', variant_id=0, variant_sku=''
```

Sementara baris non-varian (produk sumber) di step yang sama terisi lengkap:
```
produk_id=1460, produk_nama='SLEEVE WHITE 1.5', ..., valid_qty=24216
```

## Root Cause Analysis

### Data Flow
```
items (sumber) → PreProcessor (FifoProdukJadi) → rsltItems 
→ afterPreProcessorInjector → items2_sum 
→ fillValues_he_value_builder (ketergantungan: detail2_sum mapping) 
→ tableIn_detail2_sum 
→ writeDetailEntries → transaksi_data
```

### ⚠️ Critical: `id` field in preProcessor resultParams

**Problem**: `FifoProdukJadiVarian` resultParams mapped `"id" => "produk_id"`.  
In `MdlFifoProdukJadiVarian`, `$row->produk_id` = **source** product ID (1460), while `$row->variant_id` = **variant** product ID (68).

This caused ALL variant rows to be written with `produk_id=1460`, polluting the `valid_qty` sum in `followupPrePreview`.

**Fix** (`coTransaksiCore.php:953`):
```php
"id" => "variant_id",  // instead of "id" => "produk_id"
```

This also removes the need for `produk_id` fallback in `afterPreProcessorInjector` or enrichment.

### Mapping Status (coTransaksiCore.php `detail2_sum`)
✅ Mapping sudah lengkap dan benar:
```
"produk_id"      => "id",           // items2_sum[68]['id'] = 68 → produk_id=68
"produk_kode"    => "produk_kode",  // items2_sum['produk_kode'] → produk_kode
"produk_label"   => "label",        // items2_sum['label'] → produk_label
"produk_nama"    => "nama",         // items2_sum['nama'] → produk_nama
"produk_ord_jml" => "jml",          // items2_sum['jml'] → produk_ord_jml
"produk_ord_hrg" => "hpp",          // items2_sum['hpp'] → produk_ord_hrg
"satuan"         => "satuan",       // items2_sum['satuan'] → satuan
"valid_qty"      => "jml",
"variant_id"     => "variant_id",
"variant_sku"    => "sku",
```

### Root Cause #1: PreProcessor Output Tidak Lengkap
**File:** `coTransaksiValues.php:203-219` (resultParams FifoProdukJadi)

PreProcessor `FifoProdukJadi` hanya output:
```
id, nama, name, hpp, jml, qty, hpp_riil, ppv_riil, subtotal, ppn_in, ppn_in_nilai, suppliers_id, suppliers_nama
```

TIDAK output:
- `label` → `produk_label` jadi kosong
- `kode` → `produk_kode` jadi kosong
- `satuan` → `satuan` jadi kosong
- `variant_id` → `variant_id` jadi 0
- `sku` → `variant_sku` jadi kosong

### Root Cause #2: items2_sum Dihapus & Diisi Ulang (Jika `addDetailData` Aktif)
**File:** `FollowUp.php:5933-6032`

Jika config `addDetailData` diset untuk tipe variant_cutover:
```php
unset($_SESSION[$cCode]["items2_sum"]);  // HAPUS items2_sum
// ... loop items_child ...
$_SESSION[$cCode]["items2_sum"][$insertDataID] = $paramDetil; // isi ulang dgn data TERBATAS
```

Ini menyebabkan data asli dari PreProcessor hilang dan diganti dengan data dari `$paramDetil` yang hanya punya field dari `changeToItems` mapping (mungkin tidak lengkap).

### Root Cause #3: fillValues Dipanggil Ulang Setelah items2_sum Rusak
**(Disebabkan oleh perubahan saya sebelumnya)**

Saya menambahkan `fillValues_he_value_builder` di FollowUp.php:6038-6039 SETELAH items_child loop. Ini REBUILD `tableIn_detail2_sum` dari items2_sum yang SUDAH TERKORUPSI (data terbatas), OVERWRITING data yang benar dari panggilan fillValues sebelumnya (line 4880).

## Fix Yang Diimplementasikan

### Fix #1: Tambah Fields ke PreProcessor ResultParams
**File:** `coTransaksiValues.php` — FifoProdukJadi resultParams rsltItems untuk 881 & 7881

Menambahkan:
```php
"label" => "label",
"produk_kode" => "produk_kode",
"satuan" => "satuan",
"variant_id" => "variant_id",
"sku" => "sku",
```

### Fix #2: Hapus Panggilan fillValues Berlebih
**File:** `FollowUp.php` — **REVERT** penambahan fillValues di line 6038 (sekarang sudah dihapus).

### Fix #3: Enrich items2_sum dengan DB Lookup
**File:** `FollowUp.php` — **TAMBAHAN BARU** sebelum fillValues di POST handler (line 4879).

Untuk setiap entry di `items2_sum` yang punya `id` (produk_id) > 0 tapi missing `label`, `produk_kode`, `satuan`:
- Query `produk` table by `id` → isi `label`, `produk_kode`, `satuan`, `sku`
- Query `produk_variant` by `produk_id` → isi `variant_id`

### Ringkasan Perubahan
```
coTransaksiValues.php:  +5 keys di resultParams.rsltItems (881 & 7881)
FollowUp.php:            -hapus extra fillValues di ~6038
                        +enrich items2_sum sebelum fillValues di ~4878
```

## Verification Steps
1. **Test hasil:**
   Setelah fix, cek transaksi_data step 2 untuk memastikan:
   - produk_id terisi (tidak 0)
   - produk_nama, produk_kode, produk_label, satuan terisi
   - valid_qty = jml
   - variant_id, variant_sku terisi

2. **Jika produk_id masih 0:**
   Tambahkan debug dump items2_sum sebelum enrich (line ~4877):
   ```php
   file_put_contents("php://stderr", print_r($_SESSION[$cCode]["items2_sum"], true));
   ```

## Rollback
Jika terjadi error, revert perubahan di:
- `coTransaksiValues.php` (Fix #1)
- `FollowUp.php` — hapus enrichment block & kembalikan fillValues
- `FollowUp.php` line 6038 — kembalikan fillValues yang dihapus
