# Implementasi Varian Produk - Checklist Progres

Dokumen ini menjadi sumber status implementasi varian produk.
Setiap agent wajib membaca dokumen ini sebelum mulai kerja, lalu mengupdate status setelah selesai mengerjakan task.

## Aturan Update (Wajib)
- Ubah checklist task dari `[ ]` ke `[x]` jika sudah selesai.
- Isi bagian `Sedang Dikerjakan` saat mulai task.
- Pindahkan item ke `Riwayat Update` saat task selesai/ditunda.
- Perbarui `Tanggal Update Terakhir` dan `PIC/Agent`.
- Jangan hapus riwayat lama, cukup tambahkan entri baru.

## Metadata
- Tanggal Mulai: 2026-04-23
- Tanggal Update Terakhir: 2026-04-23
- PIC/Agent Terakhir: Codex
- Status Umum: In Progress

## Sedang Dikerjakan
- [ ] Tahap 3 - Modal Kelola Varian: Kombinasi

## Backlog Utama

### Tahap 1 - List Produk
- [x] Tambah kolom `VARIAN` di tabel produk.
- [x] Tampilkan status ringkas varian: `Tanpa Varian`.
- [x] Tampilkan status ringkas varian: `X atribut / Y varian`.
- [x] Tampilkan status ringkas varian: `Belum lengkap`.
- [x] Tambah tombol `Kelola Varian` di kolom `ACTIONS`.
- [x] Klik `Kelola Varian` membuka modal/panel varian berdasarkan `product_id`.

### Tahap 2 - Modal Kelola Varian: Atribut
- [x] Ambil daftar atribut dari `var_attributes`.
- [x] Ambil daftar nilai atribut dari `var_attribute_values`.
- [x] User bisa pilih atribut yang dipakai produk.
- [x] User bisa pilih nilai per atribut.
- [x] Simpan relasi atribut produk ke `var_product_attributes`.
- [x] Validasi minimal 1 atribut dan minimal 1 nilai per atribut.

### Tahap 3 - Modal Kelola Varian: Kombinasi
- [ ] Generate kombinasi otomatis dari atribut + nilai terpilih.
- [ ] Tampilkan grid kombinasi editable.
- [ ] Field editable per kombinasi: `SKU`.
- [ ] Field editable per kombinasi: `Barcode`.
- [ ] Field editable per kombinasi: `Harga Jual`.
- [ ] Field editable per kombinasi: `Harga Beli`.
- [ ] Field editable per kombinasi: `Berat`.
- [ ] Field editable per kombinasi: `Aktif`.

### Tahap 4 - Simpan dan Validasi
- [ ] Tampilkan preview total atribut, total nilai, total kombinasi.
- [ ] Validasi duplikat `combination_key`.
- [ ] Validasi duplikat `SKU` (sesuai aturan bisnis final).
- [ ] Simpan master varian ke `var_product_variants`.
- [ ] Simpan pasangan atribut-nilai ke `var_product_variant_values`.
- [ ] Tampilkan notifikasi sukses/gagal + detail error validasi.

### Tahap 5 - Mapping dan Integrasi Data
- [ ] Pastikan `var_product_attributes` menyimpan atribut yang dipakai produk.
- [ ] Pastikan `var_product_variants` menyimpan 1 baris per kombinasi.
- [ ] Pastikan `var_product_variant_values` menyimpan mapping atribut-nilai per varian.
- [ ] Integrasi `var_size_scales` dan `var_size_scale_values` (opsional size system).
- [ ] Tambahkan fallback bila produk tidak pakai size scale.

### Tahap 6 - Integrasi Transaksi
- [ ] Saat pilih produk di transaksi, cek apakah produk punya varian aktif.
- [ ] Jika punya varian, wajib tampilkan picker varian sebelum add to cart.
- [ ] Harga item transaksi ambil dari varian (`harga_jual` varian).
- [ ] SKU item transaksi ambil dari varian (`sku` varian).
- [ ] Simpan `variant_id` di detail transaksi untuk traceability.
- [ ] Jika tidak punya varian, proses tetap pakai produk induk.

### Tahap 7 - QA dan Rollout
- [ ] Uji produk tanpa varian (flow lama tetap aman).
- [ ] Uji produk dengan 1 atribut dan banyak nilai.
- [ ] Uji produk dengan 2+ atribut (kombinasi besar).
- [ ] Uji validasi duplikat SKU dan duplikat kombinasi.
- [ ] Uji dampak ke laporan/transaksi existing.
- [ ] Siapkan migrasi data awal untuk produk existing (jika diperlukan).

## Riwayat Update
- 2026-04-23 | Codex | Membuat dokumen checklist implementasi bertahap varian produk.
- 2026-04-23 | Codex | Tahap 1 selesai: kolom VARIAN + status ringkas + tombol Kelola Varian + panel modal awal pada list produk.
- 2026-04-23 | Codex | Tahap 2 selesai: modal Kelola Varian sekarang memuat daftar atribut+nilai, pilihan user, validasi minimal 1 atribut & 1 nilai per atribut, dan simpan relasi ke `var_product_attributes`.
- 2026-04-23 | Codex | Tahap 6 parsial: `MdlTransaksi` disiapkan untuk sanitasi payload varian dan simpan `variant_*` secara adaptif jika kolom transaksi sudah tersedia.
