# ✅ CHECKLIST UAT — MODUL OPNAME

**Tanggal UAT**: _______________  
**Tester**: _______________  
**Cabang**: _______________  
**Environment**: _______________  
**Versi Codebase**: everest_26sep  

---

## LEGENDA

- 🔴 = Prioritas High (wajib test)
- 🟡 = Prioritas Medium
- 🟢 = Prioritas Low
- ✅ = Pass
- ❌ = Fail
- ⏭️ = Skip (sertakan alasan)

---

## 1. HALAMAN INDEX & VALIDASI PRA-OPNAME

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 1.1 | 🔴 | Cek transaksi gantung | Buat transaksi distribusi pending → buka halaman opname | Muncul modal "Transaksi yang harus diselesaikan" | ☐ | |
| 1.2 | 🟡 | Index tanpa gantungan | Pastikan tidak ada transaksi pending → buka halaman opname | Halaman tampil normal, pilihan jenis produk muncul | ☐ | |
| 1.3 | 🔴 | Validasi kode transaksi per cabang | Login pusat → cek kode = 1119. Login cabang → cek kode = 2229 | Kode transaksi sesuai cabang yang login | ☐ | |

**Hasil Area 1**: _____ Pass / _____ Fail / _____ Skip

---

## 2. DOWNLOAD EXCEL

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 2.1 | 🔴 | Download Excel berhasil | Pilih cabang, gudang, kategori → klik download | File .xlsx terdownload dengan kolom: cID, gID, jenis, pID, sku, produk, kategori, supplier, stok buku, stok riil (kosong), serial number | ☐ | |
| 2.2 | 🔴 | Stok buku akurat | Bandingkan kolom stok buku di Excel dengan query `_rek_pembantu_*_cache` | Semua angka cocok | ☐ | |
| 2.3 | 🟡 | Serial number terisi | Cek produk dengan `jml_serial > 0` di Excel | Kolom serial number terisi (pemisah titik koma) | ☐ | |
| 2.4 | 🟡 | Proteksi download ganda | Download gudang X → buka ulang halaman view | Radio button gudang X disabled, muncul info petugas dan waktu | ☐ | |
| 2.5 | 🟢 | Semua gudang sudah didownload | Download semua gudang yang tersedia | Tombol download utama disabled + pesan info | ☐ | |
| 2.6 | 🔴 | Log dashboard_opname ter-insert | Setelah download → cek database | Record `dashboard_opname` + `dashboard_opname_data` (batch) tersimpan | ☐ | |

**Hasil Area 2**: _____ Pass / _____ Fail / _____ Skip

---

## 3. UPLOAD EXCEL

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 3.1 | 🔴 | Upload file XLSX valid | Isi kolom stok riil → upload | Muncul swal "Membaca & Memproses Data...", proses berlanjut ke executeOpname | ☐ | |
| 3.2 | 🟡 | Tolak format file salah | Upload file .pdf / .jpg / .doc | Muncul pesan error format file | ☐ | |
| 3.3 | 🟢 | Tolak file lebih dari 1 MB | Upload file xlsx lebih dari 1 MB | Muncul pesan error ukuran file | ☐ | |
| 3.4 | 🔴 | Log opname_xls tersimpan | Setelah upload → cek database tabel `opname_xls` | Record tersimpan (file_name, full_path, oleh_id, jenis_tr, jenis_produk) | ☐ | |

**Hasil Area 3**: _____ Pass / _____ Fail / _____ Skip

---

## 4. EXECUTE OPNAME (PROSES PENCOCOKAN)

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 4.1 | 🔴 | Selisih LEBIH (stok riil lebih besar dari buku) | Isi stok riil = 15, stok buku = 10 → upload | qty_debet = 5, qty_kredit = 0, debet = hpp x 5 | ☐ | |
| 4.2 | 🔴 | Selisih KURANG (buku lebih besar dari stok riil) | Isi stok riil = 7, stok buku = 10 → upload | qty_kredit = 3, qty_debet = 0, kredit = hpp_avg x 3 | ☐ | |
| 4.3 | 🟡 | Tidak ada selisih (riil = buku) | Isi stok riil sama dengan stok buku → upload | qty_debet = 0, qty_kredit = 0, tidak ada mutasi | ☐ | |
| 4.4 | 🔴 | Update dashboard_opname_data | Setelah execute → cek database | jml_stok_opname terupdate sesuai isian Excel. done_id + dtime_done terisi | ☐ | |
| 4.5 | 🟡 | Parsing serial number (koma) | Isi serial: SN001, SN002, SN003 → upload | 3 serial terparsing terpisah | ☐ | |
| 4.6 | 🟡 | Parsing serial number (titik koma) | Isi serial: SN001; SN002; SN003 → upload | 3 serial terparsing terpisah | ☐ | |
| 4.7 | 🟡 | Parsing serial number (enter/newline) | Isi serial multi-line di cell Excel → upload | Semua serial terparsing terpisah | ☐ | |
| 4.8 | 🟡 | Transaksi opname terbentuk | Setelah execute → cek daftar transaksi | Transaksi opname muncul di step 1 (status: pending approval 1) | ☐ | |

**Hasil Area 4**: _____ Pass / _____ Fail / _____ Skip

---

## 5. APPROVAL CHAIN (FOLLOWUP)

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 5.1 | 🔴 | Authorization Step 1 | Login c_holding → buka transaksi pending → approve | Status berubah 1119r ke 1119ro. Label: "pending approval 2" (oranye). PostProcessor Opname + OpnameData berjalan | ☐ | |
| 5.2 | 🔴 | Authorization Step 2 (FINAL) | Buka transaksi step 2 → approve | Status berubah 1119ro ke 1119. Label: "complete" (hijau). Jurnal + Rekening Pembantu terbentuk | ☐ | |
| 5.3 | 🟡 | Edit qty saat approval | Di preview step 2 atau 3 → edit qty item → approve | Qty terupdate, selisih dihitung ulang | ☐ | |
| 5.4 | 🟡 | Revert transaksi | Approve ke step 2 → lakukan revert | Transaksi kembali ke step 1, tidak ada mutasi stok/jurnal | ☐ | |

**Hasil Area 5**: _____ Pass / _____ Fail / _____ Skip

---

## 6. DASHBOARD MONITORING

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 6.1 | 🟡 | Dashboard status real-time | Buka viewOpnameAktive | Matriks cabang x jenis x gudang tampil. Status download/upload/acc1/acc2 akurat. Auto-refresh 60 detik | ☐ | |
| 6.2 | 🟡 | Konfirmasi opname selesai | Semua opname sudah complete → klik konfirmasi | Muncul swal "Berhasil". dashboard_opname.confirm_id + dtime_confirm terisi | ☐ | |

**Hasil Area 6**: _____ Pass / _____ Fail / _____ Skip

---

## 7. HISTORY & RE-DOWNLOAD

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 7.1 | 🟢 | History download tampil | Buka halaman history download | Daftar max 10 download terakhir tampil (urut terbaru) | ☐ | |
| 7.2 | 🟢 | Re-download Excel dari history | Klik re-download di salah satu record history | File XLSX terdownload dengan data sesuai sesi opname | ☐ | |

**Hasil Area 7**: _____ Pass / _____ Fail / _____ Skip

---

## 8. EDGE CASES & KEAMANAN

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 8.1 | 🟡 | Session expired | Biarkan idle sampai session habis → klik aksi | Redirect ke login. Data dashboard_opname tetap aman | ☐ | |
| 8.2 | 🟡 | Upload file bukan template opname | Upload Excel random (kolom berbeda) | Proses gagal dengan pesan error jelas, bukan error 500 | ☐ | |
| 8.3 | 🔴 | Gudang_id di Excel tidak match | Download gudang A → ubah kolom gID jadi B → upload | Validasi mendeteksi ketidakcocokan. PERHATIAN: di kode blok error kosong (line 2204-2212) — verifikasi perilaku aktual | ☐ | |
| 8.4 | 🟡 | Produk dengan HPP = 0 | Set stok riil berbeda untuk produk HPP=0 → upload → proses sampai final | Proses berhasil, jurnal terbentuk dengan nilai 0 | ☐ | |
| 8.5 | 🔴 | Upload concurrent (2 user bersamaan) | 2 user upload untuk sesi opname yang sama secara bersamaan | Hanya 1 yang diproses. Yang kedua ditolak (jml_upload lebih dari 1) | ☐ | |

**Hasil Area 8**: _____ Pass / _____ Fail / _____ Skip

---

## 9. VALIDASI JURNAL AKUNTANSI (POST-APPROVAL)

| No | Prioritas | Test Case | Langkah | Hasil yang Diharapkan | Status | Catatan |
|----|-----------|-----------|---------|----------------------|--------|---------|
| 9.1 | 🔴 | Jurnal balance (debet = kredit) | Selesaikan opname sampai final → query jurnal transaksi tersebut | SUM(debet) = SUM(kredit) | ☐ | |
| 9.2 | 🔴 | Rekening pembantu termutasi | Catat saldo stok sebelum opname → selesaikan opname → query ulang saldo | Saldo baru = saldo lama + qty_debet - qty_kredit (per produk) | ☐ | |
| 9.3 | 🔴 | HPP Average digunakan untuk kredit | Produk punya beberapa riwayat beli harga beda → opname selisih kurang → proses final | Nilai kredit = hpp_avg x qty_kredit (bukan hpp terakhir) | ☐ | |
| 9.4 | 🔴 | COA yang terbentuk benar | Selesaikan opname → query jurnal | Selisih lebih: 1010030030 (D) + 7010150 (D). Selisih kurang: 1010030030 (-K) + 7020020 (K) | ☐ | |
| 9.5 | 🔴 | Rek Pembantu LR Lain-lain (selisih lebih) | Selesaikan opname dengan produk selisih lebih → cek detail | Detail laba lain-lain opname tercatat di COA 7010150 | ☐ | |
| 9.6 | 🔴 | Rek Pembantu Kerugian (selisih kurang) | Selesaikan opname dengan produk selisih kurang → cek detail | Detail kerugian opname tercatat di COA 7020020 | ☐ | |

**Hasil Area 9**: _____ Pass / _____ Fail / _____ Skip

---

## RINGKASAN HASIL UAT

| Area | Total TC | 🔴 High | 🟡 Med | 🟢 Low | ✅ Pass | ❌ Fail | ⏭️ Skip |
|------|----------|---------|--------|--------|--------|--------|---------|
| 1. Index dan Pra-Opname | 3 | 2 | 1 | 0 | | | |
| 2. Download Excel | 6 | 3 | 2 | 1 | | | |
| 3. Upload Excel | 4 | 2 | 1 | 1 | | | |
| 4. Execute Opname | 8 | 3 | 5 | 0 | | | |
| 5. Approval Chain | 4 | 2 | 2 | 0 | | | |
| 6. Dashboard | 2 | 0 | 2 | 0 | | | |
| 7. History | 2 | 0 | 0 | 2 | | | |
| 8. Edge Cases | 5 | 2 | 3 | 0 | | | |
| 9. Jurnal Akuntansi | 6 | 6 | 0 | 0 | | | |
| **TOTAL** | **40** | **20** | **16** | **4** | | | |

---

## KEPUTUSAN UAT

- [ ] ✅ **LULUS** — Semua test case High priority PASS, tidak ada Fail di area kritikal
- [ ] ⚠️ **LULUS BERSYARAT** — Ada Fail di medium/low, dengan catatan perbaikan
- [ ] ❌ **TIDAK LULUS** — Ada Fail di High priority, perlu perbaikan sebelum go-live

**Catatan Keputusan**:  
_______________________________________________________________  
_______________________________________________________________  
_______________________________________________________________  

**Tanda Tangan Tester**: _______________  
**Tanda Tangan Reviewer**: _______________  
**Tanggal**: _______________
