# UAT Checklist Produk Varian - Fase 1

## Tujuan
1. Memastikan perubahan varian tidak merusak alur non-varian.
2. Memastikan data UI, proses followup, dan data database konsisten.
3. Memastikan sinkron holding-subsidiary aman untuk audit.

## Dokumen Pelengkap Wajib
1. Trace point-to-point (lintas CRM -> subsidiary -> holding):
   - `application/UAT_POINT_TO_POINT_TRACE.md`

## Scope
1. Modul `pembelian`
2. Modul `distribusi`
3. Modul `penjualan`
4. API bridge holding-subsidiary
5. Printing dan view resume/history

## Prasyarat UAT
1. SQL fase-2 bridge sudah dijalankan dan postcheck `missing_total=0`.
2. Patch kode fase-1 sudah terpasang di holding dan subsidiary.
3. Data uji tersedia:
   - produk non-varian
   - produk varian (minimal 2 varian untuk produk sama)
   - data CRM lama (produk yang sekarang sudah varian)
4. User role uji tersedia:
   - input transaksi
   - approval/followup
   - akses printing/history

## Paket Data Dummy UAT
1. Lokasi: `application/sql/variant_migration_phase3_uat_dummy/`.
2. Jalankan urutan:
   - `00_precheck_uat_dummy.sql`
   - `10_seed_crm_uat.sql`
   - `20_seed_holding_uat.sql`
   - `30_seed_subsidiary_uat.sql`
   - `90_verify_uat_dummy.sql`
3. Setelah UAT selesai, wajib cleanup:
   - `99_cleanup_uat_dummy.sql`
4. Marker data dummy:
   - `description` diawali `[UATV3_...]`
   - nomor transaksi dummy diawali `UATV3.<tag>.`

## Matrix Uji Pembelian
1. Selector produk non-varian, save, followup, print, berhasil.
2. Selector produk varian via picker, multi line produk sama beda varian, qty tersimpan per varian.
3. Cart: ubah qty dan harga, reload cart, nilai tetap benar.
4. Radio PPN default sesuai session, toggle PPN/non-PPN mempengaruhi summary dengan benar.
5. Produk varian dengan harga lock:
   - input harga terkunci
   - pesan alasan lock tampil jelas
6. Produk non-varian tetap bisa input harga sesuai policy existing.
7. Jalur CLI Auto PO:
   - payload CRM varian normal, PO sukses
   - payload CRM legacy non-varian untuk produk yang kini varian, transaksi ditahan/staging (tidak salah tulis data)
8. Bridge pembelian:
   - `pembelian_transaksi_bridge` menyimpan `variant_*` dan `cart_key`
   - `pembelian_transaksi_bridge_terima` menyimpan `variant_*` dan `cart_key`

## Matrix Uji Distribusi
1. Create distribusi non-varian, save/followup/approve/print sukses.
2. Create distribusi varian multi-line untuk produk sama beda varian.
3. Preview sebelum approve:
   - qty tidak nol palsu
   - uom sesuai data
   - subtotal sesuai data detail
4. Endpoint pending/ongoing/history:
   - `Transaksi/viewUndoneItemsIndex`
   - `History/showData`
   - `Transaksi/viewKepoinItems`
   harus menampilkan line varian lengkap, bukan 1 baris saja.

## Matrix Uji Penjualan
1. Create penjualan non-varian, save/followup/approve/print sukses.
2. Create penjualan varian multi-line, preview/followup tidak collapse.
3. Preview popup:
   - qty benar
   - subtotal benar
   - UoM benar atau fallback tampil sesuai rule
4. `doFollowup` tidak false-positive "sudah diotorisasi" saat data valid.
5. Printing receipt/resume:
   - tidak SQL error 1064
   - tidak notice undefined property
   - data nota tidak kosong

## Matrix Uji API Holding-Subsidiary
1. Holding API `api_getPackingList_get` mengembalikan:
   - `variant_id`
   - `variant_sku`
   - `variant_label`
   - `variant_key`
   - `cart_key`
2. Subsidiary menerima payload varian dan menulis detail bridge tanpa merge salah.
3. Dedupe line item berdasarkan kombinasi aman (`produk_id + variant_id + cart_key` bila tersedia).

## Validasi Database dan Audit
1. Tabel detail transaksi menyimpan `variant_*` dan `cart_key` sesuai line item.
2. Stok locker/mutasi varian konsisten dengan qty transaksi.
3. Rekening pembantu varian dan FIFO varian konsisten dengan nilai transaksi.
4. Tidak ada record half-written pada proses yang gagal.

## Kriteria Lulus UAT
1. Semua skenario non-varian lulus tanpa regresi.
2. Semua skenario varian lulus tanpa SQL error/notice/warning.
3. Selisih data antara UI preview, DB detail, dan hasil print = 0.
4. Tidak ada mismatch stok/accounting setelah rekonsiliasi.
