Analisis Teknis JiwaPOS: Arsitektur SaaS POS Multi-Tenant dengan Laravel & React
Untuk memberikan analisis yang mendalam dan akurat mengenai aplikasi "JiwaPOS" ini, saya perlu melihat konfigurasi utama, struktur database, dan dokumentasi arsitektur yang telah disediakan dalam kode.
Saya akan memulai dengan mengambil konten dari file dokumentasi sistem, konfigurasi dependensi (untuk mengetahui stack teknologi), dan struktur database utama.
Langkah-langkah pengambilan data:
- Membaca file dokumentasi utama (
SYSTEM_DESIGN.md,docs/01-ARCHITECTURE.md,docs/02-DATABASE.md) untuk mendapatkan gambaran "high-level". - Membaca
composer.jsondanpackage.jsonuntuk memastikan Tech Stack yang digunakan. - Membaca file middleware vital (
app/Http/Middleware/SetTenantContext.php) untuk memahami implementasi Multi-tenancy. - Membaca salah satu file migrasi inti (
database/migrations/2025_12_12_000002_create_tenants_table.php) untuk melihat struktur data tenant.
Saya akan mengeksekusi pengambilan data ini sekarang.
Berikut adalah analisis mendalam mengenai aplikasi JiwaPOS, berdasarkan kode sumber dan dokumentasi desain sistem yang Anda unggah.
🏗️ Analisis Sistem JiwaPOS (SaaS Multi-Tenant)
1. Ringkasan Proyek
JiwaPOS adalah sistem Point of Sale (POS) berbasis Cloud (SaaS) yang dirancang dengan arsitektur Multi-Tenant. Artinya, satu instalasi aplikasi dapat melayani banyak toko/bisnis (tenant) secara bersamaan, di mana data setiap bisnis terisolasi satu sama lain meskipun berada dalam satu database yang sama.
2. Tech Stack (Teknologi yang Digunakan)
Berdasarkan file composer.json dan package.json:
Backend (Server-side):
- Framework: Laravel 12 (Versi bleeding edge/terbaru).
- Bahasa: PHP 8.2+.
- Database: MySQL (dengan Shared Database Strategy).
- Testing: Pest / PHPUnit.
- API & Auth: Laravel Sanctum (untuk API Token) & Session based auth.
Frontend (Client-side):
- Framework: React 19 (Versi terbaru).
- Integrasi: Inertia.js (Menghubungkan Laravel & React tanpa membuat API terpisah secara manual, membuat aplikasi terasa seperti SPA).
- Bahasa: TypeScript (
.tsx,.ts). - Styling: Tailwind CSS v4 + Shadcn/UI (komponen UI modern).
- Build Tool: Vite.
Tools & Library Pendukung:
- Ziggy: Menggunakan route Laravel di dalam JavaScript.
- SweetAlert2: Untuk notifikasi popup.
- JSBarcode & QRCode: Untuk fitur barcode barang dan QR pembayaran.
3. Arsitektur Aplikasi & Desain Pattern
Aplikasi ini menggunakan pendekatan Modular Monolith dengan struktur folder yang memisahkan logika berdasarkan domain bisnis (lihat folder Modules/).
Struktur Modul Utama:
- Modules/Admin: Khusus untuk Super Admin (pemilik aplikasi) mengelola tenant dan paket langganan.
- Modules/User: Area untuk Pemilik Bisnis (Tenant Owner) mengelola toko, produk, dan laporan.
- Modules/Staff: Area khusus untuk kasir/karyawan yang hanya fokus pada fungsi POS (transaksi).
- Modules/Tenant: Logika bisnis inti (Produk, Stok, Outlet) yang terikat pada
tenant_id.
Strategi Multi-Tenant (Isolasi Data):
- Shared Database: Semua tenant menggunakan database yang sama.
- Tenant Scoping: Isolasi data dilakukan menggunakan kolom
tenant_iddi hampir setiap tabel bisnis. - Global Scope: Menggunakan
TenantScopedan TraitBelongsToTenant. Ini memastikan bahwa setiap query database (SELECT, UPDATE, DELETE) secara otomatis menambahkanWHERE tenant_id = X, sehingga tenant A tidak akan pernah bisa melihat data tenant B.
4. Analisis Database Schema
Berdasarkan 02-DATABASE.md, database dirancang sangat komprehensif:
A. Tabel Autentikasi & User (3 Role Berbeda)
admin_users: Super Admin aplikasi (bisa login ke dashboard admin pusat).users: Pemilik Bisnis (Tenant Owner). Memiliki relasi ke tabeltenants.staff_users: Kasir/Karyawan. Memiliki relasi ketenantsdanoutlets(cabang). Menggunakan guardstaff.
B. Tabel SaaS & Billing (Langganan)
tenants: Menyimpan profil bisnis, status langganan (trial,active,suspended), dan tanggal kadaluarsa.subscription_plans: Paket harga (Basic, Pro, Enterprise) beserta fitur-fiturnya (disimpan dalam format JSON).subscriptions: Riwayat langganan tenant.invoices: Tagihan pembayaran (terintegrasi dengan Payment Gateway Duitku).
C. Tabel Operasional Bisnis (Tenant-Scoped)
Semua tabel ini memiliki kolom tenant_id:
outlets: Cabang toko.categories&products: Data master barang.product_variants: Varian barang (misal: Ukuran, Warna).stock: Jumlah stok per produk per outlet.stock_movements: Mencatat riwayat keluar masuk barang (Audit trail stok).transactions&transaction_items: Data penjualan (POS).
5. Alur Kerja Aplikasi (Application Flow)
Berikut adalah flow utama bagaimana sistem ini bekerja dari berbagai sisi pengguna:
Flow 1: Pendaftaran & Onboarding (Tenant Baru)
- Register: User mendaftar di halaman web utama.
- System Action:
- Sistem membuat akun di tabel
users. - Sistem membuat data bisnis di tabel
tenants. - Status default set ke
trial(misal 14 hari).
- Login: User login dan diarahkan ke Dashboard User.
- Setup: User membuat Outlet (Cabang) dan Produk pertama.
Flow 2: Transaksi POS (Oleh Staff/Kasir)
- Login Staff: Kasir login melalui halaman khusus (
/staff/login) menggunakan guardstaff. - Middleware Check (
SetTenantContext.php):
- Sistem mendeteksi user adalah staff.
- Sistem memuat data
tenantterkait. - Sistem mengecek
subscription_status. Jikaexpiredataususpended, akses ditolak.
- Halaman POS:
- Kasir melihat daftar produk (hanya produk milik tenant tersebut).
- Kasir scan barcode atau klik produk -> Masuk keranjang.
- Checkout:
- Kasir memilih metode bayar (Tunai/QRIS).
- Request dikirim ke
TransactionService. - Atomic Transaction: Database mengurangi stok di tabel
stockDAN mencatat penjualan ditransactionssecara bersamaan. Jika satu gagal, semua dibatalkan.
- Output: Struk belanja dicetak / dikirim via email.
Flow 3: Pembayaran Langganan (SaaS Billing)
- User (Owner) masuk menu Subscription.
- Pilih paket -> Klik "Upgrade".
- Sistem membuat
invoicedan memanggil API Duitku untuk generate link pembayaran. - User membayar via Virtual Account/QRIS.
- Webhook: Duitku mengirim notifikasi ke server -> Server memverifikasi signature -> Status Invoice jadi
PAID-> Status Tenant diperpanjang otomatis.
6. Analisis Kode Penting: SetTenantContext.php
File ini adalah "Jantung" dari sistem multi-tenant ini.
PHP
// Analisis Logic Middleware
if ($tenant) {
// 1. Global Binding
// Menyimpan objek tenant ke dalam container aplikasi.
// Sehingga di mana saja di kode bisa panggil app('tenant')
app()->instance('tenant', $tenant);
// 2. Subscription Guard
// Jika status bukan trial atau active, user dipaksa redirect ke halaman "Suspended".
// Ini mencegah user yang belum bayar menggunakan aplikasi.
if (!in_array($tenant->subscription_status, ['trial', 'active'])) {
// Redirect logic...
}
}
Kesimpulan
Aplikasi JiwaPOS ini dirancang dengan sangat matang untuk skala produksi SaaS.
- Keamanan: Pemisahan logic antara Admin, Owner, dan Staff sangat jelas menggunakan Laravel Guards.
- Skalabilitas: Database sharing memudahkan maintenance, namun isolasi datanya kuat berkat Global Scope.
- Modern: Penggunaan Inertia + React + Laravel 12 menjamin performa UI yang cepat (SPA feel) namun SEO friendly dan development experience yang nyaman khas Laravel.
- Bisnis Logic: Fitur inventory (
stock_movements) dan varian produk menunjukkan sistem ini siap menangani kasus ritel yang kompleks.