# Checklist: Implementasi Dual-Locker Co-Update Varian

## Referensi
- Blueprint: `docs/blueprint-dual-locker-co-update-variant.md`

---

## [ ] 1. Persiapan & Pemahaman Kode

- [ ] 1.1 Baca ulang `reserveVariantLockerForSelect()` di `_processSelectProductConvertion.php:363-481`
- [ ] 1.2 Baca ulang `releaseVariantLockerOnRemove()` di `_processSelectProductConvertion.php:483-539`  
- [ ] 1.3 Baca ulang `reset()` variant branch di `_shoppingCart.php:2303-2370`
- [ ] 1.4 Verifikasi signature `MdlLockerStock::cekLoker()` dan `MdlLockerStock::addData()` / `updateData()`
- [ ] 1.5 Verifikasi field yang dibutuhkan untuk insert parent hold row

---

## [ ] 2. Implementasi — `_processSelectProductConvertion.php`

### 2.1 Modifikasi `reserveVariantLockerForSelect()`

- [ ] 2.1.1 Load `MdlLockerStock` setelah line 367 (bersama load `MdlLockerStockVariant`)
- [ ] 2.1.2 Query parent active: `cekLoker(cab, produkId, "active", 0, 0, gudang)` — sebelum trans_start
- [ ] 2.1.3 Query parent hold: `cekLoker(cab, produkId, "hold", userId, 0, gudang)` — sebelum trans_start
- [ ] 2.1.4 Di dalam trans (setelah variant hold update, sebelum trans_complete):
  - [ ] Update parent active: kurangi `$jmlNambah` (update existing atau insert baru)
  - [ ] Update parent hold: tambah `$jmlNambah` (update existing atau insert baru)
- [ ] 2.1.5 Error handling: jika trans_status FALSE, pesan error parent ikut disebut

### 2.2 Modifikasi `releaseVariantLockerOnRemove()`

- [ ] 2.2.1 Load `MdlLockerStock` setelah line 487 (bersama load `MdlLockerStockVariant`)
- [ ] 2.2.2 Query parent active + parent hold — sebelum trans_start
- [ ] 2.2.3 Di dalam trans (setelah variant active update, sebelum trans_complete):
  - [ ] Update parent hold: kurangi `$holdQty` (clamp ke 0)
  - [ ] Update parent active: tambah `$holdQty`
- [ ] 2.2.4 Error handling: jika trans_status FALSE, pesan error parent ikut disebut

---

## [ ] 3. Implementasi — `_shoppingCart.php`

### 3.1 Modifikasi `reset()` — Variant Branch (Opsi A)

- [ ] 3.1.1 Load `MdlLockerStock` sebelum loop atau di dalam loop variant
- [ ] 3.1.2 Di dalam trans variant (line 2334-2367), setelah variant release:
  - [ ] Query parent active + parent hold (di dalam trans)
  - [ ] Update parent hold: kurangi `$holdQty`
  - [ ] Update parent active: tambah `$holdQty`
- [ ] 3.1.3 Pastikan error handling mencakup parent locker

---

## [ ] 4. Verifikasi

- [ ] 4.1 **Skenario 1 — Varian→Varian:** Select A-XL qty=5. Cek parent active -5, hold +5. Cek variant active -5, hold +5.
- [ ] 4.2 **Skenario 2 — Non-varian→Non-varian:** Select B qty=3. Cek tidak ada perubahan di varian code path.
- [ ] 4.3 **Skenario 3 — Varian→Non-varian:** A-XL=5 lalu B=3. Cek parent A benar, B normal.
- [ ] 4.4 **Skenario 4 — Non-varian→Varian:** B=3 lalu A-XL=5. Cek parent A benar, B normal.
- [ ] 4.5 **Skenario 5 — Qty naik:** A-XL 5→8. Cek parent active -3, hold +3.
- [ ] 4.6 **Skenario 6 — Qty turun:** A-XL 8→3. Cek parent active +5, hold -5.
- [ ] 4.7 **Skenario 7 — Remove item:** Hapus A-XL (hold=5). Cek parent hold -5, active +5.
- [ ] 4.8 **Skenario 8 — Reset all:** 3 varian (XL=5, L=10, M=8). Cek parent hold=0, active kembali.
- [ ] 4.9 **Edge case — Multiple variants 1 parent:** Select XL=5 + L=10. Cek parent hold=15.
- [ ] 4.10 **Edge case — Negative delta clamp:** Release lebih dari hold. Cek hold tidak negatif.
- [ ] 4.11 **Lint/Syntax check:** `php -l` pada 2 file yang dimodifikasi

---

## [ ] 5. Dokumentasi

- [ ] 5.1 Catat perubahan di `docs/dev-journal/2026-06.md`
