# UAT Checklist 881 Branch Cutover

Dokumen ini dipakai untuk UAT jalur `881` pada modul `konversi_varian` untuk stok cabang.

## Tujuan

- Memastikan cutover parent stock ke variant stock di cabang benar-benar tercatat di layer operasional.
- Memastikan `881` tidak lagi menulis target ke stok parent.

## Prasyarat

- Environment yang dipakai adalah `staging/demo`, bukan production.
- Master produk sudah final sebagai produk varian.
- Open docs untuk parent product sudah dibersihkan atau transaksi produk tersebut sedang di-freeze.
- Tabel berikut sudah tersedia:
  - `stock_locker_varian`
  - `stock_locker_mutasi_varian`
  - `rek_cache_persediaan_produk_varian_fifo`
- SQL/migration yang dipakai:
  - [20260406_stock_locker_varian.sql](W:/san_varian/docs/sql/20260406_stock_locker_varian.sql)
  - [20260408_variant-stock-support.sql](W:/san_varian/docs/sql/20260408_variant-stock-support.sql)
- User UAT punya akses step `881r` dan `881`.

## Data Uji Minimum

- 1 parent product yang `has_variants = 1`
- 2 atau lebih varian aktif
- stok parent aktif di cabang/gudang uji
- contoh alokasi qty yang mudah diverifikasi, misalnya:
  - parent qty 10
  - variant A qty 4
  - variant B qty 6

## Langkah UAT

1. Buka transaksi `881r` di cabang uji.
2. Pilih gudang yang memang menyimpan parent stock.
3. Pilih parent product yang sudah bervarian.
4. Pastikan source row menampilkan:
   - `current_stok`
   - `distribute`
   - `sisa_distribute`
5. Pastikan grid target varian tampil:
   - `sku`
   - `header_varian`
   - input `jml`
6. Isi qty target per varian sesuai rencana cutover.
7. Simpan request `881r`.
8. Follow up dan approve ke `881`.
9. Pastikan approval selesai tanpa error.

## Verifikasi UI

- [ ] Grid varian muncul untuk produk yang `has_variants = 1`
- [ ] Qty target bisa diisi per varian
- [ ] Request tersimpan
- [ ] Approval `881` berhasil
- [ ] Setelah approval, dokumen masih bisa dibuka ulang

## Verifikasi Database

Ganti `:produk_id`, `:cabang_id`, `:gudang_id`, `:transaksi_id` sesuai data UAT.

Opsional (lebih cepat): pakai endpoint audit otomatis:
- `MigrateMaster/audit_variant_cutover/{transaksi_id}`
- `MigrateMaster/audit_variant_cutover?id={transaksi_id}`

Output JSON akan menampilkan:
- `issues` (gagal teknis yang wajib dibereskan)
- `warnings` (perlu review)
- ringkasan jumlah data pada:
  - `stock_locker_varian`
  - `stock_locker_mutasi_varian`
  - `rek_cache_persediaan_produk_varian_fifo`
  - `transaksi_data.variant_id`

```sql
SELECT state, SUM(jumlah) AS qty
FROM stock_locker
WHERE jenis_locker='stock'
  AND jenis='produk'
  AND produk_id = :produk_id
  AND cabang_id = :cabang_id
  AND gudang_id = :gudang_id
GROUP BY state;
```

```sql
SELECT produk_id, varian_id, varian_nama, state, SUM(jumlah) AS qty
FROM stock_locker_varian
WHERE jenis_locker='stock'
  AND jenis='produk'
  AND produk_id = :produk_id
  AND cabang_id = :cabang_id
  AND gudang_id = :gudang_id
GROUP BY produk_id, varian_id, varian_nama, state;
```

```sql
SELECT transaksi_id, extern_id AS produk_id, varian_id, varian_nama,
       qty_debet_awal, qty_debet, qty_debet_akhir, qty_kredit
FROM stock_locker_mutasi_varian
WHERE transaksi_id = :transaksi_id
ORDER BY id ASC;
```

```sql
SELECT transaksi_id, produk_id, varian_id, varian_nama, unit, hpp, jml_nilai
FROM rek_cache_persediaan_produk_varian_fifo
WHERE transaksi_id = :transaksi_id
ORDER BY id ASC;
```

## Kriteria Lulus

- [ ] Parent stock source berkurang sesuai qty cutover
- [ ] Total qty target di `stock_locker_varian` sama dengan alokasi yang disetujui
- [ ] Tidak ada target stock yang masuk kembali ke locker parent
- [ ] `stock_locker_mutasi_varian` terisi untuk transaksi cutover
- [ ] `rek_cache_persediaan_produk_varian_fifo` terisi untuk transaksi cutover
- [ ] Tidak ada gejala double hold atau double deduct pada source

## Kriteria Gagal

- Approval `881` error saat save/posting
- Qty target masuk ke `stock_locker` parent, bukan `stock_locker_varian`
- `stock_locker_mutasi_varian` kosong padahal approval sukses
- `rek_cache_persediaan_produk_varian_fifo` kosong padahal approval sukses
- Total qty varian tidak sama dengan qty cutover yang disetujui

## Catatan

- Jika UAT gagal, jangan lanjutkan cutover massal.
- Perbaikan berikutnya harus difokuskan pada komponen yang gagal:
  - `LockerStockVarian`
  - `LockerStockMutasiVarian`
  - `FifoProdukJadiVarian`
