# 🚚 PT. Everest - ERP Web - Modul Pindah Gudang

Aturan spesifik untuk pengembangan, alur mutasi persediaan, dan penguncian stok modul `pindahgudang` (transfer antar-gudang / antar-cabang) PT. Everest.

---

## 1. Kode Transaksi (`jenisTr`) & Tipe Mutasi

### 1.1 Mutasi Finished Goods (Produk Jadi)
*   **`587`**: Pindah produk jadi ke gudang rusak / NG (No-Good).
*   **`687`**: Pindah produk jadi ke gudang DC (Distribution Center).
*   **`1587`**: Pindah produk jadi antar-gudang reguler di cabang.
*   **`5587`**: Pindah produk rakitan (pusat).
*   **`6687`**: Pindah produk rakitan (cabang).
*   **`1588`**: Pindah produk untuk kebutuhan proyek.
*   **`2587`**: Konfirmasi Penerimaan (GRN Pindah Gudang) produk jadi di cabang tujuan.

### 1.2 Mutasi Supplies (Perlengkapan)
*   **`1687`**: Pindah persediaan perlengkapan (supplies) antar-gudang di cabang.
*   **`2687`**: Konfirmasi Penerimaan supplies di cabang tujuan.

---

## 2. Alur Mutasi Persediaan & Penguncian (Locker)

Alur pindah gudang dirancang aman menggunakan sistem penguncian stok bertahap untuk menghindari selisih stok (stock mismatch):

### Langkah 1: Request Pindah Gudang (Draft/Pending)
*   **Validasi Awal (Early Check):** Sistem memvalidasi ketersediaan stok fisik asal melalui `pairMakers` (`stokAktive` dan `stokBefore`).
*   **Hold / Transit:** Stok di gudang asal dipindahkan dari status `active` ke `hold` (transit) menggunakan:
    *   `ComLockerStockDualWrite::pair()` (untuk Finished Goods).
    *   `ComLockerStockSupplies` (untuk Supplies).

### Langkah 2: Pemindaian QR & Otorisasi
*   Admin gudang memindai serial number fisik produk.
*   Sistem memotong/menahan serial number yang sesuai melalui tabel `produk_serial_number_locker` dengan status `hold` menggunakan `serialNumberValidator`.

### Langkah 3: Penerimaan di Gudang Tujuan (GRN Pindah Gudang)
*   Setelah admin gudang tujuan menekan tombol "Terima", sistem akan:
    1.  Merilis stok status `hold` (transit) dari gudang asal menjadi `moved`.
    2.  Menambahkan stok baru dengan status `active` di gudang tujuan.
    3.  Memindahkan serial number produk di database ke gudang tujuan.

---

## 3. Pembatasan & Validasi Lintas Modul
*   **Dilarang Campur Locker:** Modul pemindahan supplies (`1687`/`2687`) wajib menggunakan locker supplies (`ComLockerStockSupplies` / `ComLockerStockMutasiSupplies`) dan **DILARANG** menyentuh locker Finished Goods (`ComLockerStockDualWrite`).
*   Gudang asal dan gudang tujuan **TIDAK BOLEH SAMA** (`id <> gudang_id`).
