# KeluargaMart — Point of Sales Aplikasi Point of Sales (POS) untuk toko KeluargaMart (Indodes) yang dibangun dengan **Vue 3 + Vite + Tailwind CSS v4 (CSS-first) + Pinia**, berjalan penuh di sisi klien. Light mode, tombol besar, label + ikon (dirancang untuk layar sentuh kasir). Berbasis JavaScript (bukan TypeScript). ## Fitur - **POS (Market)** — keranjang belanja dengan multi-unit & satuan alternatif (mis. Telur per *butir*/per *tray*), batas pembelian minimum per unit, validasi stok, diskon manual, voucher, potongan member, dan titik poin. - **Galon** — transaksi layanan air galon terpisah (isi ulang / galon baru + deposit / antar) dengan rincian harga dan konfigurasi di Pengaturan. - **Retur** — buat retur dari transaksi selesai (qty per item, alasan, metode refund) + riwayat. - **Shift / Kas** — buka-tutup shift, kas masuk/keluar, rekonsiliasi (kas diharapkan vs selisih), dan riwayat shift. - **Transaksi** — riwayat penjualan beserta detail struk. - **Pelanggan & Keanggotaan** — data pelanggan tetap; kasir dapat mendaftarkan pelanggan sebagai member pada tier masuk (Bronze). Kenaikan tier dan besaran diskon per tier diatur dari ERP. > **POS = kasir murni.** Katalog produk, stok, manajemen pengguna, pengaturan > toko, dan seluruh pelaporan adalah wewenang ERP (owner/GM dan kepala toko). > Pembagian peran lengkapnya ada di [`docs/WORKFLOW.md`](docs/WORKFLOW.md). ## Persyaratan - [Bun](https://bun.com) (disarankan) atau Node.js 20+ - [Git](https://git-scm.com) ## Menjalankan ```bash bun install # instal dependensi bun run dev # dev server (Vite), biasanya http://localhost:5173 bun run build # build produksi ke dist/ bun run preview # pratinjau hasil build ``` > Saat menjalankan `bun run dev`, gunakan URL yang dicetak Vite di terminal (mis. `http://localhost:5175/`). ## Akun Demo ``` Email: cashier@keluargamart.local Password: Admin@1234 ``` POS hanya untuk kasir. Kepala toko dan manajemen masuk lewat ERP. ## Arsitektur Data Semua data dikelola lewat `src/services/api/*` yang memanggil **`localApi.js`** — sebuah *fake backend* berbasis `localStorage` yang meniru envelope respons `{ data }` layaknya API sungguhan. Saat API Go sungguhan tersedia, cukup ganti implementasi `http.js` / `localApi.js` tanpa mengubah store/page. Berdasarkan konvensi repositori: - **Market** dan **Galon** adalah dua jenis transaksi terpisah (tidak digabung saat checkout). - **Shift** wajib dibuka sebelum melakukan penjualan. - Konfigurasi **galon** (harga isi/galon/deposit/biaya antar) diatur di ERP; halaman **Pengaturan** POS hanya menampilkannya secara read-only. ## Struktur Utama ``` src/ components/ layout/ # AppSidebar, PageHeader, ... ui/ # UiButton, UiDialog, UiBadge, AppIcon, ... pos/ # CartItem, ProductCard, CheckoutDialog, GalonPanel, ShiftDialog, ... pages/ # pos, transactions, returns, shifts, customers, settings services/api/ # wrapper per domain di atas API Go stores/ # Pinia: cart, shift, galon, auth, ... mocks/ # konstanta demo yang tersisa: categories, customers, galon utils/ # format, labels router/ # definisi route ``` ## Perintah Berguna ```bash bun run build # wajib bersih sebelum commit ``` ## Lisensi Proyek privat — semua hak dilindungi.