2025-12-30
admin

Analisis Teknis JiwaPOS: Arsitektur SaaS POS Multi-Tenant dengan Laravel & React

Temukan analisis mendalam JiwaPOS, aplikasi POS SaaS multi-tenant. Pelajari arsitektur, tech stack Laravel & React, serta strategi isolasi data.
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:

  1. Membaca file dokumentasi utama (SYSTEM_DESIGN.md, docs/01-ARCHITECTURE.md, docs/02-DATABASE.md) untuk mendapatkan gambaran "high-level".
  2. Membaca composer.json dan package.json untuk memastikan Tech Stack yang digunakan.
  3. Membaca file middleware vital (app/Http/Middleware/SetTenantContext.php) untuk memahami implementasi Multi-tenancy.
  4. 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:

  1. Modules/Admin: Khusus untuk Super Admin (pemilik aplikasi) mengelola tenant dan paket langganan.
  2. Modules/User: Area untuk Pemilik Bisnis (Tenant Owner) mengelola toko, produk, dan laporan.
  3. Modules/Staff: Area khusus untuk kasir/karyawan yang hanya fokus pada fungsi POS (transaksi).
  4. 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_id di hampir setiap tabel bisnis.
  • Global Scope: Menggunakan TenantScope dan Trait BelongsToTenant. Ini memastikan bahwa setiap query database (SELECT, UPDATE, DELETE) secara otomatis menambahkan WHERE 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)

  1. admin_users: Super Admin aplikasi (bisa login ke dashboard admin pusat).
  2. users: Pemilik Bisnis (Tenant Owner). Memiliki relasi ke tabel tenants.
  3. staff_users: Kasir/Karyawan. Memiliki relasi ke tenants dan outlets (cabang). Menggunakan guard staff.

B. Tabel SaaS & Billing (Langganan)

  1. tenants: Menyimpan profil bisnis, status langganan (trial, active, suspended), dan tanggal kadaluarsa.
  2. subscription_plans: Paket harga (Basic, Pro, Enterprise) beserta fitur-fiturnya (disimpan dalam format JSON).
  3. subscriptions: Riwayat langganan tenant.
  4. invoices: Tagihan pembayaran (terintegrasi dengan Payment Gateway Duitku).

C. Tabel Operasional Bisnis (Tenant-Scoped)

Semua tabel ini memiliki kolom tenant_id:

  1. outlets: Cabang toko.
  2. categories & products: Data master barang.
  3. product_variants: Varian barang (misal: Ukuran, Warna).
  4. stock: Jumlah stok per produk per outlet.
  5. stock_movements: Mencatat riwayat keluar masuk barang (Audit trail stok).
  6. 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)

  1. Register: User mendaftar di halaman web utama.
  2. System Action:
  • Sistem membuat akun di tabel users.
  • Sistem membuat data bisnis di tabel tenants.
  • Status default set ke trial (misal 14 hari).
  1. Login: User login dan diarahkan ke Dashboard User.
  2. Setup: User membuat Outlet (Cabang) dan Produk pertama.

Flow 2: Transaksi POS (Oleh Staff/Kasir)

  1. Login Staff: Kasir login melalui halaman khusus (/staff/login) menggunakan guard staff.
  2. Middleware Check (SetTenantContext.php):
  • Sistem mendeteksi user adalah staff.
  • Sistem memuat data tenant terkait.
  • Sistem mengecek subscription_status. Jika expired atau suspended, akses ditolak.
  1. Halaman POS:
  • Kasir melihat daftar produk (hanya produk milik tenant tersebut).
  • Kasir scan barcode atau klik produk -> Masuk keranjang.
  1. Checkout:
  • Kasir memilih metode bayar (Tunai/QRIS).
  • Request dikirim ke TransactionService.
  • Atomic Transaction: Database mengurangi stok di tabel stock DAN mencatat penjualan di transactions secara bersamaan. Jika satu gagal, semua dibatalkan.
  1. Output: Struk belanja dicetak / dikirim via email.

Flow 3: Pembayaran Langganan (SaaS Billing)

  1. User (Owner) masuk menu Subscription.
  2. Pilih paket -> Klik "Upgrade".
  3. Sistem membuat invoice dan memanggil API Duitku untuk generate link pembayaran.
  4. User membayar via Virtual Account/QRIS.
  5. 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.

  1. Keamanan: Pemisahan logic antara Admin, Owner, dan Staff sangat jelas menggunakan Laravel Guards.
  2. Skalabilitas: Database sharing memudahkan maintenance, namun isolasi datanya kuat berkat Global Scope.
  3. Modern: Penggunaan Inertia + React + Laravel 12 menjamin performa UI yang cepat (SPA feel) namun SEO friendly dan development experience yang nyaman khas Laravel.
  4. Bisnis Logic: Fitur inventory (stock_movements) dan varian produk menunjukkan sistem ini siap menangani kasus ritel yang kompleks.


blog web-development programming artificial-intelligence admin

Artikel Terkait