# 🛡️ PT. INDOSAN - ERP Web - Business Rules & Database Schema

Dokumen ini menjelaskan spesifikasi bisnis, arsitektur data persediaan, kebijakan pelacakan nomor seri, dan struktur database inti untuk aplikasi ERP Web **PT. INDOSAN**.

---

## 1. Aturan Bisnis & Integrasi Stok (Varian & Sentinel)

### 1.1 Dual-Write Stock Locker
*   Setiap kali menulis/mengubah persediaan produk dagangan (Finished Goods), sistem **wajib** melakukan penulisan ganda ke dua tabel secara paralel:
    *   `stock_locker` (Loker Stok Utama / Parent Level)
    *   `stock_locker_variant` (Loker Stok Detail Varian / Variant Level)
*   Penulisan ganda ini wajib dilewatkan melalui komponen/wrapper penulisan ganda stock locker yang terstandarisasi untuk mencegah ketidakcocokan kuantitas (*quantity mismatch*).

### 1.2 Sentinel Varian
*   Untuk produk standar (non-varian), sistem wajib menggunakan **`variant_id = 1`** sebagai nilai sentinel pada tabel `stock_locker_variant`.
*   Baris data dengan `variant_id < 0` (WIP/Intermediate Phase) wajib dilewati (*skipped*) dan tidak ditulis ke loker varian.

### 1.3 Kebijakan Pelacakan Serial Number (Brankas)
*   Setiap produk jadi berjenis lemari besi (brankas) wajib memiliki nomor seri unik (`serial_number`) yang tercatat di tabel `produk_serial_number`.
*   Selama pembuatan draf transaksi (Hold), serial number dialokasikan ke tabel `produk_serial_number_locker` dengan status `hold` untuk mencegah agar tidak terjual ganda.

### 1.4 Status Rilis & Feature Flag Varian (`new_san_variant`)
> [!IMPORTANT]
> **STATUS RUNTIME LIVE & FEATURE FLAG:**
> - Rilis fitur multi-variant (`new_san_variant`) saat ini **BELUM LAUNCHING** di versi produksi/live PT. INDOSAN.
> - Feature flag **`singleVariantStandard.enabled`** bernilai **`false`** pada konfigurasi sistem operasional live.
> - **Perilaku Stok:** Seluruh mutasi persediaan produk di versi live wajib beroperasi sebagai non-variant. Tabel `stock_locker_variant` hanya mencatat data dengan nilai sentinel **`variant_id = 1`**.
> - Modul-modul dengan fitur varian fisik riil (misalnya `konversi_varian`) telah naik sebagian kodenya ke codebase tetapi **tidak aktif / belum digunakan** di versi live.

---

## 2. Struktur Database Utama PT. INDOSAN

*   **`transaksi`**: Menyimpan header utama transaksi keuangan dan logistik.
*   **`transaksi_data`**: Menyimpan rincian item barang/jasa dalam transaksi.
*   **`transaksi_data_registry`**: Registrasi status workflow transaksi (Hold -> Request -> Approved -> Closed).
*   **`stock_locker`**: Penampung stok produk di gudang per cabang per status (active, hold, moved).
*   **`stock_locker_variant`**: Penampung stok produk di level varian.
*   **`produk_serial_number`**: Master data status kepemilikan dan lokasi serial number fisik brankas.
*   **`produk_serial_number_locker`**: Loker pengunci serial number selama transaksi berjalan.
