# Implementasi Sistem License Activation — SysOrder

Sistem proteksi source code dengan validasi lisensi berbasis domain. Setiap kali SysOrder diinstall di server client, sistem akan ping ke `didikhanafi.com` untuk memvalidasi apakah domain/lisensi client tersebut terdaftar. Jika tidak terdaftar → sistem menampilkan halaman error dan berhenti bekerja.

---

> [!IMPORTANT]
> **Dua bagian terpisah:**
> 1. **License Server** → file PHP yang Anda upload ke `didikhanafi.com`
> 2. **SysOrder Client** → perubahan di aplikasi SysOrder yang Anda jual ke client

---

## Proposed Changes

### Bagian 1 — License Server (upload ke `didikhanafi.com`)

#### [NEW] `license-server/index.php`
File PHP standalone (tidak butuh Laravel) yang diupload ke `didikhanafi.com/license/`.
Fungsi:
- `POST /license/validate` → validasi domain + license key (JSON response)
- `POST /license/ping` → terima telemetry harian dari instalasi client
- File `licenses.json` sebagai database lisensi sederhana (bisa diganti MySQL nanti)

#### [NEW] `license-server/licenses.json`
Database lisensi format JSON. Anda tambah entry manual tiap kali jual ke client baru:
```json
{
  "SYSORDER-2025-XXXXX": {
    "client": "Nama Client",
    "domain": "restauran-abc.com",
    "email": "owner@restauran-abc.com",
    "issued_at": "2025-02-26",
    "expires_at": null,
    "active": true
  }
}
```

---

### Bagian 2 — SysOrder Client (perubahan di codebase)

#### [NEW] `app/Services/LicenseService.php`
Service utama untuk validasi lisensi:
- `validate()` → ping server, cache result 24 jam di file storage
- `isValid()` → baca dari cache (tidak perlu ping tiap request)
- `fingerprint()` → generate fingerprint unik dari domain + server IP

#### [NEW] `app/Http/Middleware/CheckLicense.php`
Middleware yang dicek **sekali per request** — redirect ke halaman error jika lisensi tidak valid.

#### [NEW] `app/Console/Commands/LicenseActivate.php`
Artisan command yang dijalankan saat pertama install:
```bash
php artisan license:activate SYSORDER-2025-XXXXX
```

#### [MODIFY] [bootstrap/app.php](file:///c:/xampp/htdocs/esbORDER/bootstrap/app.php) atau `app/Http/Kernel.php`
Daftarkan middleware `CheckLicense` ke grup `web`.

#### [MODIFY] [.env.example](file:///c:/xampp/htdocs/esbORDER/.env.example)
Tambah:
```env
LICENSE_KEY=SYSORDER-2025-XXXXX
LICENSE_SERVER=https://didikhanafi.com/license
```

#### [NEW] `resources/views/errors/license.blade.php`
Halaman error saat lisensi tidak valid — tampilkan pesan "Hubungi me@didikhanafi.com".

---

## Alur Kerja

```mermaid
sequenceDiagram
    Client App->>Cache: Cek cache lisensi (< 24 jam)?
    Cache-->>Client App: HIT → lanjut
    Client App->>License Server: MISS → POST /license/validate
    License Server->>licenses.json: Cari license_key + domain
    License Server-->>Client App: { valid: true/false }
    Client App->>Cache: Simpan hasil 24 jam
```

---

## Cara Deteksi Jika Source Dicopy

- Setiap instalasi client kirim **telemetry harian** (domain + IP + BUILD_ID) ke server Anda
- BUILD_ID unik per client → jika domain asing tiba-tiba muncul, ketahuan dari client mana source bocor
- Lisensi bisa **dinonaktifkan remotely** dengan set `"active": false` di `licenses.json`

---

## Verification Plan

### Manual Testing

**Test 1 — Lisensi Valid:**
1. Set `LICENSE_KEY=SYSORDER-2025-XXXXX` di [.env](file:///c:/xampp/htdocs/esbORDER/.env)
2. Jalankan `php artisan license:activate SYSORDER-2025-XXXXX`
3. Akses `http://localhost:8001` → harus bisa masuk normal

**Test 2 — Lisensi Tidak Valid / Belum Aktif:**
1. Set `LICENSE_KEY=INVALID-KEY` di [.env](file:///c:/xampp/htdocs/esbORDER/.env)
2. Hapus cache: `php artisan cache:clear`
3. Akses `http://localhost:8001` → harus tampil halaman error lisensi

**Test 3 — Offline / Server Down:**
1. Ganti `LICENSE_SERVER` ke URL tidak valid di [.env](file:///c:/xampp/htdocs/esbORDER/.env)
2. Hapus cache: `php artisan cache:clear`
3. Akses `http://localhost:8001` → harus **tetap bisa jalan** (fallback ke cache lama / graceful fail)
