﻿# Rencana Kerja Implementasi Varian di GRN (Permanen Master Produk)

## Tujuan
Menerapkan alur agar item pembelian yang awalnya non-varian dapat dipecah menjadi varian saat proses GRN, dan varian tersebut **permanen tersimpan di master produk** (setara dengan pembuatan varian dari data produk).

## Batasan & Ketentuan
- Environment: **PHP 5.6** dan **CodeIgniter 3**.
- Tidak mengubah model umum: **`MdlTransaksi`** dan **`MdlMother`**.
- Perubahan fokus di modul pembelian (controller/view/config/selector/processor) dan model varian yang sudah khusus.

## Definisi Selesai (Definition of Done)
- Item PO non-varian bisa di-split jadi beberapa varian saat GRN.
- Varian yang dipilih/ditambahkan saat GRN tersimpan permanen ke master varian produk.
- Data GRN menyimpan `variant_id`, `variant_sku`, `variant_label`, `variant_key` per baris item.
- Validasi qty aman: total qty split = qty item GRN.
- Tidak ada regressi di flow non-varian lama.

---

## Fase 0 - Persiapan

### Checklist
- [ ] Buat branch kerja khusus fitur GRN-varian.
- [ ] Backup DB (minimal tabel: `produk`, `var_product_variants`, `var_product_variant_values`, `transaksi_data`, `transaksi_data_values`).
- [ ] Pastikan struktur tabel varian sudah tersedia dan aktif.
- [ ] Catat sample transaksi PO->GRN untuk test baseline.

---

## Fase 1 - Analisis Titik Integrasi

### Checklist
- [ ] Petakan step `466` (PO) -> `467` (GRN) di config transaksi.
- [ ] Verifikasi alur selector existing (`_selectorItem`, `variantPicker`, `_processSelectProduct`).
- [ ] Verifikasi sesi item (`$_SESSION[$cCode]['items']`) sudah membawa metadata varian.
- [ ] Tentukan event UI GRN untuk trigger “split varian” per item.

### Output
- Dokumen mapping singkat “sebelum vs sesudah” untuk item key:
  - Sebelum: `produk_id`
  - Sesudah: `variant:{id}` atau format key varian yang berlaku di modul.

---

## Fase 2 - Desain Fungsional

### Checklist
- [ ] Tetapkan aturan bisnis split varian:
  - [ ] Total qty split harus sama dengan qty baris item.
  - [ ] Qty varian tidak boleh negatif.
  - [ ] Varian duplikat pada item yang sama digabung atau ditolak (pilih salah satu, konsisten).
- [ ] Tetapkan mode varian:
  - [ ] Pilih varian existing.
  - [ ] Buat varian baru (permanen master) saat GRN.
- [ ] Tetapkan fallback jika varian gagal dibuat (rollback seluruh aksi split item).

### Output
- Spesifikasi UI/UX singkat untuk modal split varian di GRN.

---

## Fase 3 - Implementasi Backend (Create/Resolve Varian Permanen)

### Checklist
- [ ] Tambah service/handler di modul pembelian untuk:
  - [ ] Resolve varian existing berdasarkan kombinasi atribut / key.
  - [ ] Create varian baru permanen ke master bila belum ada.
- [ ] Pastikan create varian menyimpan minimal:
  - [ ] `product_id`
  - [ ] `sku`
  - [ ] `combination_key`
  - [ ] relasi nilai atribut (`var_product_variant_values`)
  - [ ] status aktif
- [ ] Pastikan idempotent (request sama tidak membuat varian ganda).
- [ ] Bungkus proses create/resolve dalam transaksi DB.

### Catatan Teknis
- Gunakan model varian khusus yang sudah ada (`MdlProdukVarian`) bila memungkinkan.
- Jangan ubah `MdlTransaksi` dan `MdlMother`.

---

## Fase 4 - Implementasi Session Cart & Mapping GRN

### Checklist
- [ ] Konversi item GRN dari key produk ke key varian setelah split.
- [ ] Simpan metadata varian ke gate session item:
  - [ ] `variant_id`
  - [ ] `variant_sku`
  - [ ] `variant_label`
  - [ ] `variant_key`
- [ ] Pastikan qty, harga, note tetap ikut setelah swap key.
- [ ] Pastikan perhitungan subtotal/total tetap benar setelah item terpecah.

---

## Fase 5 - Implementasi UI GRN (Modal Split Varian)

### Checklist
- [ ] Tambah tombol/aksi “Atur Varian” per baris item di GRN.
- [ ] Modal menampilkan:
  - [ ] daftar varian existing
  - [ ] form tambah varian baru
  - [ ] input qty per varian
  - [ ] indikator total qty input vs qty target
- [ ] Validasi frontend:
  - [ ] total qty harus match
  - [ ] field wajib (mis. sku/atribut minimal)
- [ ] Submit perubahan ke endpoint backend lalu refresh shopping cart.

---

## Fase 6 - Persistensi ke Transaksi GRN

### Checklist
- [ ] Pastikan baris `transaksi_data` GRN menyimpan field varian.
- [ ] Pastikan `transaksi_data_values` sinkron dengan item key varian.
- [ ] Pastikan preview followup menampilkan nama item varian dengan benar.
- [ ] Pastikan alur approval (jika ada) tetap bekerja untuk item varian.

---

## Fase 7 - Pengujian

### A. Unit/Logic Checklist
- [ ] Create varian baru sukses dan tidak duplikat.
- [ ] Resolve varian existing sukses.
- [ ] Split qty mismatch ditolak.
- [ ] Swap item key ke varian tidak menghilangkan data item.

### B. Integrasi Flow Checklist
- [ ] PO non-varian -> GRN split varian -> save berhasil.
- [ ] 1 produk jadi >1 varian dalam 1 GRN berhasil.
- [ ] Produk lain non-varian di transaksi yang sama tetap aman.
- [ ] Re-open/edit GRN tetap membaca varian dengan benar.

### C. Regression Checklist
- [ ] Flow lama non-varian tanpa split tetap berjalan normal.
- [ ] Modul terkait (preview, print, settlement) tidak error.
- [ ] Tidak ada perubahan perilaku pada transaksi selain 466/467.

---

## Fase 8 - UAT & Go-Live

### Checklist
- [ ] UAT dengan user gudang + purchasing pakai 3 skenario nyata.
- [ ] Validasi laporan/printout sudah menampilkan varian sesuai kebutuhan.
- [ ] Siapkan panduan 1 halaman “cara split varian saat GRN”.
- [ ] Tentukan tanggal rilis dan backup point sebelum deploy.
- [ ] Deploy dan monitoring 3 hari pertama.

---

## Risiko & Mitigasi

### Risiko
- Duplikasi varian master karena request berulang.
- Qty tidak sinkron antara item parent dan item varian.
- Perubahan item key menyebabkan data detail values tidak terbaca.

### Mitigasi
- [ ] Terapkan pengecekan idempotensi berdasarkan `product_id + combination_key`.
- [ ] Lock validasi qty di frontend + backend.
- [ ] Siapkan script audit post-save untuk cek konsistensi qty/item key.

---

## Checklist Eksekusi Harian (Praktis)

### Hari 1
- [ ] Selesaikan Fase 0-2.

### Hari 2
- [ ] Selesaikan Fase 3.

### Hari 3
- [ ] Selesaikan Fase 4-5.

### Hari 4
- [ ] Selesaikan Fase 6-7.

### Hari 5
- [ ] UAT, perbaikan minor, dan siap go-live.

---

## Catatan Implementasi
- Semua perubahan harus kompatibel PHP 5.6 (hindari syntax baru seperti null coalescing `??`, return type hint, dsb).
- Jaga konsistensi helper/flow lama CI3 yang sudah dipakai di modul pembelian.
- Jika perlu perubahan schema kecil, buat SQL migration terpisah dan terdokumentasi.
