# Blueprint: Fix Data Flow Step 1 Create->Save() untuk Variant Cutover (881/7881)

## Problem
Data varian target di `items2_sum` tidak memiliki field `label`, `produk_kode`, `satuan`, `variant_id`, `sku` setelah proses create->save() pada step 1. Akibatnya, ketika step 2 (follow-up approval) membaca session `items2_sum`, field-field tersebut kosong dan menghasilkan `transaksi_data` dengan `produk_id=0`, `produk_nama=''`, `produk_kode=''`, `produk_label=''`, `satuan=''`, `variant_id=0`, `variant_sku=''`.

## Root Cause

### 1. Config Tidak Lengkap di `coTransaksiCore.php`
**File:** `application/modules/variant_cutover/config/coTransaksiCore.php`

PreProcessor config `resultParams.rsltItems` untuk BOTH 881 (line 203-219) dan 7881 (line 946-962) hanya memiliki field **terbatas**:
```php
"id" => "produk_id",
"nama" => "nama",
"name" => "nama",
"hpp" => "hpp",
"jml" => "qty",
"qty" => "qty",
```

**Tidak ada** `label`, `produk_kode`, `satuan`, `variant_id`, `sku`.

### 2. Create.php Baca dari `coTransaksiCore.php`, BUKAN `coTransaksiValues.php`
Create.php line 1446:
```php
$iterator = isset($this->configCore[$this->jenisTr]['preProcessor'][$jenisTrTarget]['detail'])
```

Ini membaca dari `$this->configCore` ⇒ **coTransaksiCore.php**.

Sementara perubahan sebelumnya saya tambahkan di **coTransaksiValues.php** (yang dibaca oleh fillValues helper, BUKAN oleh pre-processor runner). Jadi perubahan di coTransaksiValues.php **tidak efektif** untuk create->save().

### 3. Data Flow Pre-Processor di Create->Save()
```
items (session, dari form POST)
  → PreProcessor FifoProdukJadi / FifoProdukJadiVarian 
    (membaca resultParams dari coTransaksiCore.php)
  → rsltItems (output, hanya punya field dari resultParams)
  → inject ke items2_sum (line 1544-1557)
  → fillValues_he_value_builder (mapping ke tableIn)
  → session disimpan ke DB
```

Karena resultParams hanya punya `id`, `nama`, `hpp`, `jml`, `qty`:
- `rsltItems` hanya punya field tersebut
- `items2_sum` hanya punya field tersebut
- Session hanya simpan field tersebut

Saat FollowUp (step 2) membaca session:
- `items2_sum` tanpa `label`, `produk_kode`, `satuan`, `variant_id`, `sku`
- Mapping `detail2_sum` gagal → semua field kosong

### 4. Perbedaan Antara 881 dan 7881
| Aspek | 881 | 7881 |
|-------|-----|------|
| Component | `FifoProdukJadi` | `FifoProdukJadiVarian` |
| Letak config | coTransaksiCore:188 | coTransaksiCore:931 |
| resultParams | Sama terbatas | Sama terbatas |

**7881** menggunakan `FifoProdukJadiVarian` (bukan `FifoProdukJadi`). Component ini mungkin sudah punya logic internal untuk menangani varian. Perlu dicek apakah outputnya sudah include field tambahan.

## Fix Plan

### Fix #1: Tambah Fields ke `coTransaksiCore.php` resultParams
**File:** `application/modules/variant_cutover/config/coTransaksiCore.php`

**Untuk 881** (line ~203-219):
```php
"resultParams" => array(
    "rsltItems" => array(
        "id" => "produk_id",
        "nama" => "nama",
        "name" => "nama",
        "hpp" => "hpp",
        "jml" => "qty",
        "qty" => "qty",
        "label" => "label",          // BARU
        "produk_kode" => "produk_kode", // BARU
        "satuan" => "satuan",        // BARU
        "variant_id" => "variant_id", // BARU
        "sku" => "sku",              // BARU
        ...
    ),
),
```

**Untuk 7881** (line ~946-962): Sama persis.

### Fix #2: Enrichment Step di Create->Save()
**File:** `application/modules/variant_cutover/controllers/Create.php`

Setelah pre-processor inject items2_sum (line ~1560), dan SEBELUM fillValues (line ~1594), tambahkan enrichment lookup produk:

```php
// Enrich items2_sum dengan product info (sama seperti di FollowUp)
if (in_array($this->jenisTr, array("881", "7881"))) {
    if (isset($_SESSION[$cCode]['items2_sum']) && sizeof($_SESSION[$cCode]['items2_sum']) > 0) {
        foreach ($_SESSION[$cCode]['items2_sum'] as $iID => $dSpec) {
            $prodID = isset($dSpec['id']) ? $dSpec['id'] : 0;
            if ($prodID > 0 && (empty($dSpec['label']) || empty($dSpec['produk_kode']) || empty($dSpec['satuan']))) {
                $q = $this->db->select("id, nama, kode, label, satuan, sku")
                    ->from("produk")
                    ->where("id", $prodID)
                    ->get();
                $prod = $q->row_array();
                if ($prod) {
                    if (empty($dSpec['label']))
                        $_SESSION[$cCode]['items2_sum'][$iID]['label'] = $prod['label'];
                    if (empty($dSpec['produk_kode']))
                        $_SESSION[$cCode]['items2_sum'][$iID]['produk_kode'] = $prod['kode'];
                    if (empty($dSpec['satuan']))
                        $_SESSION[$cCode]['items2_sum'][$iID]['satuan'] = $prod['satuan'];
                    if (empty($dSpec['sku']))
                        $_SESSION[$cCode]['items2_sum'][$iID]['sku'] = $prod['sku'];
                    if (empty($dSpec['variant_id'])) {
                        $qv = $this->db->select("id")
                            ->from("produk_variant")
                            ->where("produk_id", $prodID)
                            ->get();
                        $varRow = $qv->row_array();
                        if ($varRow)
                            $_SESSION[$cCode]['items2_sum'][$iID]['variant_id'] = $varRow['id'];
                    }
                }
            }
        }
    }
}
```

### Fix #3: (Opsional) Pindahkan Config ke Lokasi yang Tepat
Jika pre-processor config seharusnya di `coTransaksiCore.php`, pindahkan/sinkronkan isi dari `coTransaksiValues.php` ke `coTransaksiCore.php` untuk menghindari kebingungan di masa depan.

## Status Implementasi
| Fix | Status | File |
|-----|--------|------|
| #1 - resultParams 881 | ✅ Selesai | coTransaksiCore.php:212-216 |
| #1 - resultParams 7881 | ✅ Selesai | coTransaksiCore.php:960-964 |
| #2 - Enrichment Create.php | ✅ Selesai | Create.php:1594-1626 |
| #3 - Sinkronisasi config | ⏳ Belum | Sinkronisasikan coTransaksiValues & coTransaksiCore |

## Verification
1. Create step 1 transaksi varian baru dengan split
2. Cek session `items2_sum` setelah save:
   - Apakah entry varian punya `id` = produk_id varian?
   - Apakah entry varian punya `label`, `produk_kode`, `satuan`, `variant_id`, `sku`?
3. Buka step 2 (follow-up) dan cek `transaksi_data`:
   - `produk_id ≠ 0`, `produk_nama`, `produk_kode`, `produk_label`, `satuan` terisi
   - `valid_qty = jml`
   - `variant_id`, `variant_sku` terisi

## Debug Jika Gagal
Jika `id` (produk_id) di items2_sum = 0, artinya pre-processor/FifoProdukJadiVarian tidak menghasilkan produk_id untuk varian target. Cek:
1. Apakah form POST mengirim `produk_id` untuk setiap varian target?
2. Apakah component `FifoProdukJadi`/`FifoProdukJadiVarian` membaca POST data dengan benar?
3. Di Create.php, dump `$_SESSION[$cCode][$srcGateName]` (items) sebelum pre-processor dijalankan
