# 🗄️ Skema Database Saku & Aturan Sentinel ERP Everest

Dokumen ini memuat skema referensi tabel-tabel utama yang sering diakses oleh modul inventaris dan keuangan, lengkap dengan penjelasan status (*state*) serta aturan sentinel stok.

---

## 1. Tabel Utama Transaksi

### A. `transaksi` (Header)
Menyimpan data ringkasan dokumen transaksi utama.
*   `id` (int, PK): ID transaksi.
*   `nomer` (varchar): Nomor nota unik transaksi (contoh: `INV/2026/...`).
*   `dtime` (datetime): Waktu pengajuan transaksi.
*   `cabang_id` (int): Cabang pembuat transaksi.
*   `oleh_id` (int): User ID pembuat transaksi.
*   `transaksi_nilai` (double): Total nilai transaksi (gross/net/HPP tergantung tipe).
*   `transaksi_jenis` (varchar): Menyimpan tipe `jenisTr`.

### B. `transaksi_data` (Detail Baris)
Menyimpan data baris keranjang belanja (*shopping cart*).
*   `id` (int, PK): ID baris.
*   `transaksi_id` (int, FK): Relasi ke `transaksi.id`.
*   `produk_id` (int): ID produk atau supplies yang ditransaksikan.
*   `variant_id` (int): ID variasi produk (jika modul varian).
*   `produk_ord_jml` (double): Jumlah kuantitas (qty).
*   `produk_ord_hrg` (double): Harga satuan.
*   `hpp` (double): Nilai HPP satuan.
*   `satuan` (varchar): Nama satuan unit (contoh: `pcs`, `box`).

---

## 2. Tabel Locker Stok (`stock_locker` & `stock_locker_variant`)

Kedua tabel ini wajib ditulis bersamaan jika mutasi melibatkan produk jadi (*Dual-Write*).

### A. Kolom Utama
*   `cabang_id` (int) & `gudang_id` (int): Lokasi fisik persediaan berada.
*   `jenis` (varchar): Selalu bernilai `'produk'` untuk stok barang dagangan, atau `'supplies'` untuk perlengkapan.
*   `state` (varchar): Menentukan siklus/status penahanan stok (lihat bagian 3).
*   `jumlah` (double): Kuantitas stok (positif menambah, negatif mengurangi).
*   `produk_id` (int): ID produk parent.
*   `variant_id` (int): ID varian (khusus di `stock_locker_variant`).

### B. Aturan Sentinel Varian (Sangat Penting)
*   **Produk Non-Variant (Standard):**
    *   `stock_locker` mencatat baris stok normal.
    *   `stock_locker_variant` wajib mencatat baris stok dengan `variant_id = 1` (sentinel non-variant).
*   **Produk Multi-Variant:**
    *   `stock_locker` mencatat total gabungan semua varian.
    *   `stock_locker_variant` mencatat baris stok individual berdasarkan `variant_id` masing-masing varian.
*   **Filter Abaikan (`skip`):**
    *   Baris transaksi dengan `variant_id < 0` wajib di-skip (tidak ditulis ke tabel locker varian).
    *   Baris transaksi dengan `variant_id == 0` wajib diubah secara otomatis menjadi `1` sebelum disimpan ke `stock_locker_variant`.

---

## 3. Siklus Status Stok (*Stock Locker States*)

| State | Kapan Digunakan | Dampak pada Sistem |
| :--- | :--- | :--- |
| **`active`** | Stok siap jual / bebas digunakan. | Stok terlihat di selector modal barang dagang dan bisa dipilih. |
| **`hold`** | Stok sedang dipesan / masuk keranjang belanja draft. | Mengurangi alokasi stok bebas (`active`) agar tidak dijual ganda. |
| **`moved`** | Stok sudah keluar dari gudang (transaksi approved). | Tanda fisik barang sudah meninggalkan lokasi pengirim. |
| **`trash`** | Stok dibatalkan / transaksi didelete. | Nilai dianggap 0 dan diabaikan dari saldo berjalan. |
