# 19. Multi-Tenant & SaaS Strategy

Panduan teknis bagaimana Smart Order OS menangani multi-tenant, isolasi data, dan model berlangganan (SaaS).

---

## Model Multi-Tenancy

Smart Order OS menggunakan pendekatan **single-database, shared-schema** dengan isolasi pada level `outlet_id` (dan potensi `tenant_id` di masa depan).

```
Tenant (Bisnis/Brand)
  └─ Outlet 1 (Cabang Pusat)
  └─ Outlet 2 (Cabang Mall)
  └─ Outlet 3 (Cabang Bandara)
```

### Isolasi Data

| Level | Mekanisme |
|-------|-----------|
| **Outlet** | Kolom `outlet_id` di semua tabel operasional (orders, products, pos_sessions, dll) |
| **User** | Pivot `user_outlets` — user hanya akses data outlet yang di-assign |
| **API/Controller** | Filter otomatis berdasarkan `outlet_id` dari user yang login |
| **Policy** | Laravel Policy memastikan user hanya bisa akses resource milik outlet-nya |

### Evolusi ke Tenant Penuh

Jika diperlukan (banyak bisnis berbeda dalam satu instance):

1. Tambah model `Tenant` dan kolom `tenant_id` di tabel `outlets`.
2. Tambah middleware `SetCurrentTenant` yang otomatis filter semua query.
3. Global scope pada model: `->where('tenant_id', currentTenant()->id)`.

---

## Subscription & Billing

### Plan Hirarki

| Plan | Fitur | Limit |
|------|-------|-------|
| **Starter** | POS, Order, Menu, Pelanggan dasar | 1 outlet, tanpa floor plan, tanpa delivery |
| **Pro** | + KDS, Floor Plan, Delivery, Loyalty, Promo, Inventory | 3 outlet |
| **Enterprise** | + Multi-tenant, API full, WhatsApp blast, AI forecasting | Unlimited |

### Implementasi

- **Feature flags:** `config/features.php` → `plan_limits` per plan.
- **Plan check:** `Feature::enabled('kds', $outlet)` memeriksa apakah outlet/plan punya akses.
- **Billing model:** Tabel `subscriptions` → `outlet_id`, `plan`, `starts_at`, `ends_at`, `status`.

### Upgrade/Downgrade

- Prorate billing saat upgrade mid-cycle.
- Grace period (7 hari) saat subscription expired sebelum disable fitur.
- Downgrade: fitur yang di-disable tetap ada datanya, hanya akses yang dimatikan.

---

## Domain & White-Label (Roadmap)

Untuk SaaS publik, sistem bisa dikonfigurasi:

| Fitur | Status |
|-------|--------|
| Custom subdomain (brand.smartorder.id) | Roadmap Phase 3 |
| Custom logo & warna brand per tenant | Roadmap Phase 3 |
| Custom domain (order.restoran-anda.com) | Roadmap Phase 4 |

---

## Data Privacy (Indonesia)

- Data pelanggan (nama, telepon, email) hanya diakses oleh outlet pemilik.
- Audit log mencatat siapa mengakses data sensitif.
- Compliance: mengikuti UU Perlindungan Data Pribadi (UU PDP) Indonesia.
- Hak hapus data: pelanggan bisa request penghapusan data → soft delete + anonymize.
