# Blueprint GAP: `variant_cutover` Holding vs Subsidiary (`san_sarana_staging`)

## 1. Tujuan

Dokumen ini memetakan gap modul:

- Holding baseline: `W:\san_staging\application\modules\variant_cutover`
- Subsidiary saat ini: `W:\san_sarana_staging\application\modules\variant_cutover`

Target akhirnya adalah modul subsidiary memiliki flow cutover varian setara holding (khusus rule stok, accounting, approval, rollback), dengan referensi implementasi lokal dari modul `distribusi` jika diperlukan.

## 1.1 Aturan Implementasi Wajib (Kontrak Kerja)

1. Struktur file dan pola arsitektur dari `distribusi` **dipertahankan** sebagai fondasi modul subsidiary.
2. Class/model existing seperti `MdlDistribusiTransaksi.php` **tetap dipakai** sebagai adapter kompatibilitas sampai ada pengganti final yang disetujui.
3. Yang dibuang adalah **alur bisnis distribusi lama** (flow transaksi/code config), **bukan** kerangka file pendukung.
4. Penyesuaian nama (`variant_cutover`) dilakukan bertahap tanpa memutus call chain existing.
5. Acuan kualitas wajib: `application/modules/variant_cutover/STANDAR_MODUL_VARIANT_CUTOVER_ISO25010.md`.

## 1.2 Keputusan Final Struktur File (Tidak Ditawar di Tahap Blueprint)

1. Modul subsidiary `variant_cutover` **tetap mengikuti pola struktur modul `distribusi`** (controller/model/view/coms).
2. File adapter distribusi **dipertahankan** untuk kompatibilitas call chain lama:
   - `models/MdlDistribusiTransaksi.php`
   - `controllers/_processSelectProductStock.php`
   - `views/followUp.php`
   - `views/variant_picker.php`
   - `models/Coms/*Distribusi*.php`
3. Yang dinonaktifkan/dibuang adalah **flow bisnis distribusi lama di konfigurasi/alur transaksi aktif**, bukan file kerangka.
4. Jika ada rencana hapus file adapter, harus lewat persetujuan eksplisit setelah ada pengganti dan bukti tidak ada reference aktif.

## 2. Temuan Kunci (Evidence-Based)

### 2.1 Modul subsidiary `variant_cutover` masih 1:1 dengan `distribusi` (baseline awal)

Perbandingan hash file kunci menunjukkan identik:

1. `config/coTransaksiUi.php` -> IDENTICAL
2. `config/coTransaksiCore.php` -> IDENTICAL
3. `config/coTransaksiValues.php` -> IDENTICAL
4. `config/coTransaksiLayout.php` -> IDENTICAL
5. `controllers/Create.php` -> IDENTICAL
6. `controllers/Transaksi.php` -> IDENTICAL
7. `controllers/FollowUp.php` -> IDENTICAL
8. `controllers/_shoppingCart.php` -> IDENTICAL
9. `controllers/_processSelectProductStock.php` -> IDENTICAL
10. `controllers/Modul_Controller.php` -> IDENTICAL

Makna: modul `variant_cutover` subsidiary berangkat dari clone distribusi. Ini bukan masalah, karena memang dipakai sebagai fondasi; yang perlu diubah adalah flow bisnisnya.

### 2.2 Kode transaksi top-level belum `881/7881`

Di subsidiary `coTransaksiUi.php`:

- `583` di line 11
- `585` di line 879
- `983` di line 1236
- `985` di line 1644
- `1983` di line 1904
- `1985` di line 2395
- `773` di line 2719
- `5833` di line 3143
- `5855` di line 3524

Di holding `coTransaksiUi.php`:

- `881` di line 5
- `7881` di line 375

### 2.3 Core flow `881/7881` holding belum hadir di subsidiary

Di subsidiary `coTransaksiCore.php` top-level:

- `583`, `585`, `983`, `985`, `1983`, `1985`, `773`

Di holding `coTransaksiCore.php` top-level:

- `881` (line 5)
- `7881` (line 753)

### 2.4 Guard cutover kritikal belum ada di subsidiary

Tidak ditemukan pada subsidiary:

1. `setConversionStatus/getConversionStatus` (DRAFT/IN_PROGRESS/COMPLETED/ROLLED_BACK).
2. Validasi khusus cutover:
   - open document blocking
   - parent stock zero validation
   - `override_stok_parent`
3. Processor cutover varian:
   - `_processSelectProductConvertion.php` (file tidak ada di subsidiary)
4. Validator row-level cutover setara `recordItemColumnVarian` holding.

## 3. Root Cause

1. Modul subsidiary `variant_cutover` dibentuk dari clone `distribusi` (sesuai strategi), namun flow config masih mewarisi distribusi FG dan belum dipetakan ke flow cutover varian.
2. Konfigurasi transaksi (UI/Core/Values/Layout) belum dipetakan ke kode transaksi cutover (`881`/`7881`).
3. Controller chain masih memakai processor distribusi (`_processSelectProductStock/select`, `_processSelectProduct/select`) bukan chain cutover holding.

## 4. Dampak Bisnis Jika Dipakai Apa Adanya

1. Rule cutover parent->varian tidak terjaga (potensi mismatch stok parent dan varian).
2. Approval dapat lolos tanpa gate cutover (open docs, parent stock zero).
3. Risiko jurnal/rekening mutasi tidak sesuai skema cutover varian.
4. Audit trail konversi (status lifecycle) tidak eksplisit.

## 5. Matriks GAP Teknis

| Area | Holding | Subsidiary Saat Ini | Status |
|---|---|---|---|
| Transaction code utama | `881`, `7881` | `583`, `585`, `983`, dst | GAP |
| UI label/process | "stock varian/variant cutover" | "fg distribution" | GAP |
| Selector processor | `_processSelectProductConvertion/select` | `_processSelectProduct/select` dan `_processSelectProductStock/select` | GAP |
| Session gate varian cutover | `items`, `items2`, `items2_sum` dengan flow cutover | dominan flow distribusi | GAP |
| Parent stock zero | ada (holding) | tidak ada gate khusus | GAP |
| Open docs validation | ada (holding) | tidak ada gate khusus | GAP |
| Conversion status | DRAFT/IN_PROGRESS/COMPLETED/ROLLED_BACK | tidak ada | GAP |
| Cutover postProcessor varian | flow `881/7881` | flow distribusi campuran | GAP |
| SoD cutover role | didefinisikan per flow cutover | role distribusi | GAP |

## 6. Strategi Implementasi yang Direkomendasikan

### Rekomendasi Utama

Gunakan **holding `variant_cutover` sebagai source of truth** untuk business rule cutover, lalu lakukan adaptasi terbatas agar cocok dengan lingkungan subsidiary.

Alasan:

1. Rule bisnis cutover sudah ada dan tervalidasi di holding.
2. Menghindari carry-over behavior distribusi yang tidak relevan untuk cutover.
3. Memperkecil risiko integritas stok/accounting.

### Peran Modul `distribusi` (sesuai arahan user)

Modul `distribusi` dipakai sebagai referensi untuk:

1. pola integrasi lokal model/com/helper yang sudah kompatibel di subsidiary,
2. style transaksi existing di environment subsidiary,
3. fallback jika ada dependency yang tidak ada di holding module.

Penegasan:

1. File model/controller/view berbasis distribusi boleh tetap ada selama masih dipakai adapter.
2. Pembersihan file hanya boleh dilakukan jika sudah ada pengganti jelas dan call reference sudah dipindahkan.

## 7. Blueprint Migrasi Bertahap

### Fase A - Snapshot & Safety

1. Backup modul current `variant_cutover` subsidiary (tanpa memakai folder `trash`).
2. Catat baseline hash file kunci.
3. Siapkan branch kerja khusus migrasi cutover.

### Fase B - Port Konfigurasi Flow Cutover

File target:

1. `application/modules/variant_cutover/config/coTransaksiUi.php`
2. `application/modules/variant_cutover/config/coTransaksiCore.php`
3. `application/modules/variant_cutover/config/coTransaksiValues.php`
4. `application/modules/variant_cutover/config/coTransaksiLayout.php`

Action:

1. Tambahkan flow `881` dan `7881` dari holding.
2. Pastikan mapping role disesuaikan dengan usergroup subsidiary.
3. Nonaktifkan flow distribusi lama di config aktif modul `variant_cutover` (bukan menghapus kerangka file distribusi).

### Fase C - Port Controller Chain Cutover

File target minimum:

1. `controllers/Create.php`
2. `controllers/Transaksi.php`
3. `controllers/FollowUp.php`
4. `controllers/_shoppingCart.php`
5. `controllers/Modul_Controller.php`
6. Tambah file baru: `controllers/_processSelectProductConvertion.php`

File adapter yang **tetap dipertahankan**:

1. `models/MdlDistribusiTransaksi.php`
2. `controllers/_processSelectProductStock.php` (sebagai fallback/compatibility path bila masih direferensikan)
3. `views/followUp.php`
4. `views/variant_picker.php`
5. Coms distribusi existing di `models/Coms/*Distribusi*.php`

Action:

1. Port guard validate cutover:
   - balance source vs varian
   - open docs blocking
   - parent stock zero
   - override stok parent (approval-based)
2. Port status lifecycle conversion.
3. Pastikan flow reserve/release locker source dan stok varian sinkron.

### Fase D - Dependency Shared Layer

Validasi keberadaan:

1. model varian locker/mutasi/fifo yang dipakai komponen cutover,
2. helper pair/check stock varian,
3. coms accounting terkait varian.

Jika belum ada, clone/adapt dari modul `distribusi`/shared layer existing subsidiary sesuai kontrak CI3 saat ini.

### Fase E - Hardening Integritas

1. Pastikan semua multi-step kritikal menggunakan transaksi DB.
2. Konfirmasi status dokumen (`Open/Posted/Cancel`) sebelum eksekusi followup/revert.
3. Review query kritikal ke query binding jika ada dynamic input.

### Fase F - Naming Refactor Bertahap (Opsional, setelah stabil)

1. Buat alias class/file baru bernama `VariantCutover*` jika diperlukan.
2. Pertahankan backward-compat wrapper ke class lama (`Distribusi*`) sampai semua call chain berpindah.
3. Refactor naming dilarang dilakukan bersamaan dengan perubahan logic kritikal agar risiko regressi rendah.

## 8. Checklist Verifikasi (UAT Logic)

1. Create request cutover `881` dan `7881` berhasil.
2. Parent stock non-zero -> blocked (kecuali override sah).
3. Open dokumen aktif -> blocked.
4. Total qty varian != qty parent -> blocked.
5. Followup sukses -> status `COMPLETED`.
6. Revert/reject -> status `ROLLED_BACK`.
7. Stok source turun sesuai qty cutover dan stok varian naik sesuai alokasi.
8. Jurnal/rekening mutasi tidak selisih.
9. Concurrency: 2 user followup transaksi sama tidak boleh double-exec.

## 9. Deliverable Tahap Berikutnya

Setelah approval blueprint ini:

1. `Patch Plan` per file (line-level) untuk migrasi ke `881/7881`.
2. `Execution Checklist` (urutan commit aman per fase).
3. `UAT Script` spesifik subsidiary (berdasarkan data gudang/cabang nyata).

## 10. Checklist Kepatuhan Instruksi User (Wajib)

1. `MdlDistribusiTransaksi.php` tetap ada.
2. Kerangka file pola distribusi tetap tersedia.
3. Flow config aktif diarahkan ke variant cutover (`881/7881`).
4. Tidak menghapus file adapter tanpa persetujuan eksplisit.
5. Semua perubahan tetap kompatibel PHP 5.6/CI3.
6. Validasi kualitas mengacu ke `application/modules/variant_cutover/STANDAR_MODUL_VARIANT_CUTOVER_ISO25010.md`.
