# Product Requirement Document (PRD)
## ERP Aneka Plastik - Multi-Branch Enterprise Resource Planning

---

### 1. OVERVIEW & SYSTEM OBJECTIVE

ERP Aneka Plastik adalah sistem Enterprise Resource Planning (ERP) multi-cabang berbasis Web (Desktop POS & Admin) dan Mobile (Owner & Terminal Harga) yang dirancang khusus untuk mengoptimalkan operasional toko plastik grosir dan eceran. 

**Fokus Utama Sistem:**
*   **Stabilitas Stok:** Sinkronisasi inventaris secara realtime antara gudang dan kasir.
*   **Kecepatan Transaksi Kasir:** POS PWA Desktop yang ringan, responsif, mendukung barcode scanner, dan memiliki kemampuan offline mode.
*   **Kemudahan Pencarian & Akurasi Produk:** Pencarian cepat (< 1 detik) dengan filter kategori, rak, dan detektor kemiripan produk untuk mencegah duplikasi.
*   **Kontrol Multi-Cabang:** Pengaturan terpusat untuk Cabang Palas (Utama) dan Cabang Pagebangan dengan aturan hari libur yang berbeda.
*   **Pricing Fleksibel:** Skema harga bertingkat otomatis (Retail, Semi Grosir, Grosir, Custom) berdasarkan kuantitas barang.
*   **Monitoring Owner Realtime:** Dashboard owner berbasis aplikasi mobile untuk memantau omset dan pergerakan bisnis.

---

### 2. KETENTUAN OPERASIONAL & CABANG

| Parameter | Cabang Palas (Utama) | Cabang Pagebangan |
| :--- | :--- | :--- |
| **Status** | Pusat / Gudang Utama | Cabang |
| **Hari Libur** | Minggu | Jumat |
| **Proses Transaksi** | POS, Pembelian, Transfer, Gudang | POS, Request Transfer, Gudang |

---

### 3. TEKNOLOGI & ARSITEKTUR SISTEM

Sistem ini dikembangkan menggunakan arsitektur **Modular Monolith** dengan pendekatan **Domain-Driven Design (DDD)** untuk memisahkan logika bisnis antar modul dengan bersih, mencegah penumpukan baris kode dalam satu file, dan memastikan kemudahan skalabilitas.

*   **Backend:** Laravel 13 (atau versi LTS stabil terbaru)
*   **Database:** MySQL (Single Database Architecture dengan prefix/ownership domain yang jelas)
*   **Frontend:** Vue.js 3 + Inertia.js (tanpa reload halaman, performa SPA)
*   **UI Framework:** Tailwind CSS (dengan custom design system yang elegan dan premium)
*   **State Management:** Pinia (untuk mengelola state POS & keranjang belanja)
*   **Build Tool:** Vite
*   **Mobile App:** Flutter (untuk Dashboard Owner, Absensi, dan Terminal Harga)
*   **Desktop POS:** Progressive Web App (PWA) dengan local storage untuk caching offline
*   **Autentikasi & Otorisasi:** Laravel Breeze/Jetstream + Spatie Laravel Permission
*   **Integrasi File:** Laravel Excel (Import/Export), DomPDF / Browsershot (Cetak Nota/Laporan)
*   **Keamanan & Audit:** Spatie Activitylog (Audit Log lengkap per modul)

---

### 4. PENGGUNA & HAK AKSES (USER ROLES)

| Role | Deskripsi Akses |
| :--- | :--- |
| **Owner** | Monitoring realtime omset, profit, stok kritis, perbandingan cabang via Flutter App. |
| **Super Admin** | Akses penuh (Full Access) ke seluruh konfigurasi sistem, database, dan override transaksi. |
| **Admin** | Mengelola modul Pembelian (PO), Master Produk, Supplier, Inventory, dan Laporan Keuangan. |
| **Kasir** | Mengoperasikan POS (PWA Desktop), Request Transfer Produk, dan Konfirmasi Penerimaan barang masuk di toko. |
| **Gudang** | Mengelola pergerakan barang fisik, Stock Opname, Repack Produk, Reject Barang, dan Pemakaian Internal. |
| **Staff Toko** | Memeriksa harga produk dan rak menggunakan Terminal Harga (Mobile). |

---

### 5. SPESIFIKASI MODUL UTAMA

#### 5.1. Modul Produk & Master Data
*   **Atribut Produk:** SKU, Barcode, Nama Produk, Kategori, Brand, Foto, Lokasi Rak, Minimal Stok, dan Status (Aktif/Nonaktif).
*   **Multi-Satuan & Konversi Otomatis:** Mendukung konversi bertingkat (misal: 1 Karung = 10 Lusin = 120 PCS). Stok terhitung dalam satuan terkecil di database secara otomatis.
*   **Multi-Supplier:** Satu produk dapat dipasok oleh beberapa supplier dengan mencatat histori harga beli, menandai Supplier Utama, Supplier Alternatif, dan mendeteksi harga termurah.
*   **Harga Bertingkat Otomatis:** Perubahan harga secara dinamis di kasir berdasarkan jumlah kuantitas yang dibeli (Retail -> Semi Grosir -> Grosir).
*   **Detector Produk Mirip:** Peringatan otomatis kepada Admin saat membuat produk baru jika nama produk memiliki kemiripan tinggi dengan produk yang sudah ada (mencegah duplikasi data).

#### 5.2. Modul Pembelian (Purchasing)
*   **Alur dengan PO (Purchase Order):**
    `Buat Permintaan PO` $\rightarrow$ `Persetujuan PO` $\rightarrow$ `Input Surat Jalan saat Barang Datang` $\rightarrow$ `Verifikasi Fisik & Update Stok` $\rightarrow$ `Invoice Supplier` $\rightarrow$ `Pembayaran`.
*   **Alur tanpa PO:**
    `Barang Datang` $\rightarrow$ `Input Surat Jalan` $\rightarrow$ `Cek Barang` $\rightarrow$ `Masuk Stok` $\rightarrow$ `Invoice Supplier` $\rightarrow$ `Pembayaran`.
*   **Jadwal Supplier & Reminder:** Setiap supplier memiliki jadwal pengiriman mingguan. Sistem otomatis mengirimkan pengingat order (Reminder H-1) berdasarkan stok yang menipis dan jadwal kirim tersebut.

#### 5.3. Modul Point of Sales (POS)
*   **Interface POS:** Tampilan kasir minimalis clean atau modern retail, dioptimalkan untuk performa cepat (<1 detik pencarian produk).
*   **Hardware Support:** Integrasi dengan barcode scanner dan printer thermal (kertas 58mm atau 80mm).
*   **Mode Offline:** Menggunakan browser local storage untuk menyimpan transaksi saat internet terputus, dan otomatis melakukan sinkronisasi (Auto-Sync) saat terhubung kembali.
*   **Prosedur Pembatalan (Void):** Kasir harus mengajukan request pembatalan transaksi yang kemudian harus disetujui (Approved) oleh Admin/Super Admin dari Dashboard utama sebelum transaksi tersebut dianggap batal.

#### 5.4. Modul Inventory & Stock Movement
*   **Kartu Stok:** Rekam jejak detail pergerakan stok per cabang mencakup transaksi penjualan, pembelian, transfer, adjustment, opname, repack, reject, dan pemakaian internal.
*   **Transfer Antar Cabang:** Proses transfer barang terkontrol: `Request Transfer oleh Cabang` $\rightarrow$ `Approval oleh Admin` $\rightarrow$ `Barang Dikirim` $\rightarrow$ `Barang Diterima & Diverifikasi oleh Cabang Penerima` $\rightarrow$ `Stok Berpindah`.
*   **Stock Opname:** Dapat dilakukan per rak atau per kategori menggunakan aplikasi Android dengan scan barcode, dilanjutkan dengan approval selisih stok oleh Admin.

#### 5.5. Modul Repack Produk
*   **Konsep:** Memecah produk induk menjadi produk turunan (misal: 1 Dus Gelas pecah menjadi 24 Pack Gelas).
*   **Efek Stok:** Mengurangi kuantitas produk induk dan menambah kuantitas produk turunan berdasarkan rasio formula repack yang telah ditentukan.

#### 5.6. Modul Pemakaian Internal
*   **Deskripsi:** Pencatatan barang dagangan yang digunakan untuk keperluan operasional (misal: plastik packing, lakban, bubble wrap, tisu).
*   **Efek Keuangan:** Mengurangi nilai inventory dan otomatis mencatatnya sebagai beban biaya operasional di modul keuangan.

#### 5.7. Modul Reject Barang
*   **Kategori Reject:**
    1.  *Reject Retur Supplier:* Barang rusak dialokasikan ke stok khusus reject untuk dikembalikan ke supplier.
    2.  *Reject Musnah:* Barang rusak yang dibuang/dimusnahkan (inventory write-off).
    3.  *Reject Internal:* Kerusakan barang di dalam toko/gudang yang dicatat sebagai kerugian langsung.

#### 5.8. Modul Flutter (Mobile)
*   **Absensi Karyawan:** Menggunakan Face Recognition dan validasi GPS radius koordinat cabang.
*   **Terminal Harga:** Aplikasi mobile bagi staff untuk memindai barcode produk guna memeriksa harga retail/grosir, sisa stok, lokasi rak, dan foto produk di tempat.
*   **Dashboard Owner:** Visualisasi data grafik penjualan realtime, omset, perbandingan performa penjualan antar cabang, dan notifikasi stok kritis.

---

### 6. ATURAN INTEGRASI DATA & ARSITEKTUR KODE

1.  **Strict Data Ownership:** Setiap modul hanya boleh memanipulasi datanya sendiri. Modul lain yang membutuhkan data dari modul tersebut harus menggunakan API Service resmi atau mendengarkan (Listen) ke **Domain Events** yang dipancarkan.
2.  **Domain Events Flow:**
    *   `pos.transaction.completed` $\rightarrow$ Mengurangi stok di modul Inventory, mencatat kas masuk di modul Finance.
    *   `inventory.transfer.approved` $\rightarrow$ Menandai pengiriman barang siap jalan.
    *   `internal.usage.created` $\rightarrow$ Mencatat pemotongan stok dan menambah beban pengeluaran.
3.  **Realtime Synchronization:** Penerapan Laravel Reverb/Pusher hanya dibatasi untuk monitoring dashboard owner, notifikasi approval penting, dan sinkronisasi status transaksi POS.

---

### 7. VERIFIKASI & PARAMETER KEBERHASILAN

*   Pencarian produk di halaman POS dan admin wajib selesai di bawah **1 detik**.
*   Proses sinkronisasi data offline ke online berjalan tanpa merusak urutan nomor invoice transaksi.
*   Log audit mencatat detail `user_id`, `action`, `payload_before`, dan `payload_after` secara akurat pada setiap perubahan data krusial.
