# Sysorder Owner Hub

Portal agregat untuk pemilik usaha: membaca metrik **secara server-side** dari **SysOrder** (FnB/POS) dan **sysReflex** (kasir refleksologi), tanpa menggabungkan database operasional.

## Persyaratan

- PHP 8.2+, Composer, Node.js 20+ (untuk Vite), ekstensi yang disyaratkan Laravel 12
- SQLite (default) atau MySQL untuk **hanya** tabel user portal owner

## Instalasi cepat (lokal)

```bash
cd sysorder
composer install
npm install
npm run build
copy .env.example .env   # Windows: copy
php artisan key:generate
php artisan migrate --seed
```

Aset front-end (Tailwind/Vite) membutuhkan `public/build/manifest.json` — jalankan **`npm run build`** (atau `npm run dev` saat pengembangan). Tanpa itu, halaman ber-layout portal bisa error **Vite manifest not found** di lingkungan produksi.

### Akun owner Sysorder (setelah `migrate --seed`)

| | |
|--|--|
| **Email** | `owner@sysorder.local` |
| **Password default** | `ChangeMe!Owner1` — kecuali Anda mengatur `SEED_OWNER_PASSWORD` di `.env` **sebelum** menjalankan seed. |

**Ya — Sysorder (Sysorder Owner Hub) memang khusus untuk owner / pemilik:** satu login terpisah dari kasir SysOrder (POS) dan dari user sysReflex. Hanya untuk melihat **laporan gabungan** mulai dari `/laporan` (ringkasan), lalu pindah tab ke **Laba rugi**, **Harian**, **Item FnB**, **Layanan**, **Detail sumber** — tiap tab URL terpisah (bukan input transaksi harian).

Di produksi: ganti password lewat `php artisan tinker` / fitur ubah password (bila nanti ditambahkan) — **jangan** memakai password seed bawaan.

Isi integrasi di `.env` **atau** lewat halaman **`/pengaturan`** (setelah login). Nilai yang disimpan di portal disimpan di database (kunci/token terenkripsi) dan **menggantikan** field yang sama dari `.env` bila diisi.

- `ESBORDER_BASE_URL` — URL publik backend **SysOrder** / POS (contoh `https://pos.sysorder.my.id`; nama variabel tetap `ESBORDER_*` untuk kompatibilitas)
- `ESBORDER_API_KEY` — API key user yang punya permission `report.view` dan paket dengan fitur **API**
- `SYSREFLEX_BASE_URL` — URL publik sysReflex
- `SYSREFLEX_OWNER_HUB_TOKEN` — sama dengan `OWNER_HUB_API_TOKEN` di `.env` sysReflex

Jalankan:

```bash
php artisan serve
```

## Di mana owner membuka laporan gabungan (2 program)?

**Satu portal khusus:** aplikasi Sysorder ini. Setelah login, buka **`/laporan`** untuk ringkasan; bagian detail (harian, item, layanan, dll.) lewat **tab** di atas layar (masing-masing halaman/URL sendiri).

| Lingkungan | Langkah |
|------------|---------|
| **Lokal (dev)** | `php artisan serve` di folder `sysorder` → `http://127.0.0.1:8000/login` → setelah sukses, arahkan ke **`http://127.0.0.1:8000/laporan`** |
| **Produksi** | Set `APP_URL` ke domain portal owner (mis. `https://owner.sysorder.my.id`) → **`https://owner.sysorder.my.id/login`** → **`/laporan`** |

Halaman **`/panduan-akses`** (setelah login) menjelaskan ulang perbedaan URL portal vs POS SysOrder vs sysReflex.

Path `/dashboard` masih dialihkan ke `/laporan` untuk kompatibilitas bookmark lama.

Login memakai akun **hanya di database Sysorder** (bukan login kasir SysOrder POS).

## Apakah API sudah “jalan”?

Sysorder **tidak** menyediakan API publik untuk transaksi; yang ada adalah **konsumsi API** dari SysOrder (POS) dan sysReflex.

1. **SysOrder (POS)** — `GET /api/reports/consolidated` harus mengembalikan `200` dengan Bearer **API key** yang valid, user punya `report.view`, dan paket tenant mengaktifkan fitur **API** (`plan.feature:api`). Uji manual dari browser atau curl ke domain SysOrder Anda; spesifikasi OpenAPI ada di repositori backend POS (`docs/openapi.yaml`, halaman `/api-docs` jika diaktifkan).
2. **sysReflex** — `GET /api/owner/summary` harus mengembalikan `200` dengan header `Authorization: Bearer` sama dengan `OWNER_HUB_API_TOKEN` di `.env` sysReflex (dan `SYSREFLEX_OWNER_HUB_TOKEN` di Sysorder).

Setelah login di Sysorder, dari halaman **Laporan** gunakan tautan **Status API (JSON)** (`/laporan/integration-status`) — endpoint itu memanggil kedua sumber untuk **hari ini** dan menampilkan `ok`, `http_status`, `latency_ms`, dan pesan singkat.

Mulai akses dari **`/login`**.

## Dokumentasi enterprise

| # | Dokumen |
|---|---------|
| 01 | [Executive overview](docs/01-EXECUTIVE-OVERVIEW.md) |
| 02 | [Solution architecture](docs/02-SOLUTION-ARCHITECTURE.md) |
| 03 | [Security & threat model](docs/03-SECURITY-THREAT-MODEL.md) |
| 04 | [Data dictionary & KPI](docs/04-DATA-DICTIONARY-AND-KPI.md) |
| 05 | [Integration contract](docs/05-INTEGRATION-CONTRACT.md) |
| 06 | [Deployment runbook](docs/06-DEPLOYMENT-RUNBOOK.md) |
| 07 | [Operations & monitoring](docs/07-OPERATIONS-AND-MONITORING.md) |
| 08 | [Governance & RACI](docs/08-GOVERNANCE-AND-RACI.md) |

## Lisensi

Framework Laravel mengikuti lisensi MIT skeleton; konten bisnis Anda milik Anda.
