# Panduan Instalasi SKParking

Struktur proyek:
```
SKParking/
├── database/           -> schema MySQL (pusat) & SQLite (lokal)
├── api/                -> REST API PHP, deploy ke cPanel shared hosting
├── dashboard/           -> Web Admin (monitoring, gate & komponen, pengaturan, laporan, anomali)
└── winforms/            -> Aplikasi client gate (.NET Framework 4.8, WinForms)
```

## 1. Server Pusat (cPanel Shared Hosting)

### 1.1 Database MySQL
1. Buat database MySQL baru + user lewat cPanel > MySQL Databases.
2. Import `database/01_schema_mysql_central.sql` lewat phpMyAdmin (Import tab).
3. Ini otomatis mengisi pengaturan default (nama perusahaan "SKParking", tarif contoh, dll) — tinggal diubah nanti lewat Web Admin.

### 1.2 Upload API & Dashboard
1. Upload folder `api/` dan `dashboard/` ke `public_html/` (atau subfolder/subdomain sesuai keinginan lu).
2. Salin `api/config.php` → `api/config.local.php`, lalu isi:
   ```php
   define('DB_HOST', 'localhost');
   define('DB_NAME', 'namauser_skparking');
   define('DB_USER', 'namauser_dbuser');
   define('DB_PASS', 'password_asli');
   define('APP_TIMEZONE', 'Asia/Jakarta');
   define('ADMIN_SESSION_SECRET', 'string_acak_panjang');
   ```
3. Pastikan PHP versi 8.0+ aktif (cPanel > MultiPHP Manager).
4. Pastikan mod_rewrite aktif supaya `.htaccess` di folder `api/` berfungsi (biasanya sudah aktif default di cPanel).

### 1.3 Buat Akun Admin Pertama
Lewat SSH/Terminal cPanel:
```bash
cd public/api/cron
php buat_admin.php admin PasswordKuat123 "Nama Lu"
```
Ini bikin akun superadmin pertama buat login ke `/dashboard/index.php`.

### 1.4 Cron Job Rekap Harian
Di cPanel > Cron Jobs, tambahkan job jalan tiap hari jam 00:05:
```
5 0 * * * php /home/namauser/public_html/api/cron/rekap.php
```

### 1.5 Setup Payment Gateway QRIS (opsional, kalau sudah siap)
1. Login ke dashboard `/dashboard/pengaturan.php` > tab **Payment Gateway**.
2. Isi `provider_aktif` (tripay/midtrans/xendit), `merchant_code`, `api_key`, `callback_secret`.
3. Set webhook URL di dashboard provider ke: `https://domain-lu.com/api/index.php?r=payment&aksi=webhook`
4. Buka `api/endpoints/payment.php`, lengkapi fungsi `panggilProviderQris()` dan `validasiSignatureWebhook()`
   sesuai dokumentasi resmi provider yang dipilih (kerangka & contoh pola Tripay sudah disiapkan di komentar).

## 2. Web Admin Dashboard

Akses: `https://domain-lu.com/dashboard/`

Halaman yang tersedia:
- **Monitoring** — status online/offline tiap gate, pendapatan hari ini, kendaraan yang masih di dalam.
- **Gate & Komponen** — tambah/ubah gate (nama, kode, tipe masuk/keluar, lokasi), termasuk setting komponen
  hardware (COM port barrier, COM port/nama printer, kamera RTSP, ALPR aktif/tidak). **Kode Gate & Token API**
  yang dibuat di sini adalah yang nanti dimasukkan ke halaman Setup di WinForms tiap PC gate.
- **Pengaturan Umum** — nama perusahaan, tarif motor/mobil, konfigurasi payment gateway, notifikasi Telegram.
- **Laporan** — rekap harian & bulanan.
- **Anomali** — daftar kejadian tak normal (ALPR gagal, barrier macet, dll) yang dilaporkan tiap gate.

## 3. WinForms Client (per PC Gate)

### 3.1 Build
1. Install .NET 8 SDK (dipakai buat build proyek net48 juga) atau Visual Studio 2022 dengan workload
   ".NET Desktop Development".
2. Buka `winforms/SKParking.sln`.
3. Restore NuGet package (`Microsoft.Data.Sqlite`, `System.Text.Json`) — otomatis saat build pertama.
4. Build solution (Release), atau publish `GateClient` sebagai single-folder deploy.

### 3.2 Instalasi di PC Gate
1. Copy hasil build (`bin/Release/net48/`) ke PC gate, misalnya ke `C:\SKParking\`.
2. Jalankan `SKParking.GateClient.exe`. Karena PC ini belum pernah disetup, halaman **Setup** akan otomatis terbuka.
3. Isi tab **Identitas Gate**:
   - Kode Gate: **harus sama persis** dengan Kode Gate yang dibuat di Web Admin (mis. `GATE-IN-1`).
   - Nama Gate: bebas, buat tampilan lokal (mis. "Gate Masuk Utara").
   - Tipe Gate: `in` atau `out`.
   - URL API Pusat: `https://domain-lu.com/api`
   - Token API Gate: disalin dari Web Admin > Gate & Komponen (dibuat otomatis saat gate ditambahkan, tersimpan di database — kalau lupa, buat gate baru atau tambahkan endpoint reset token).
   - Klik **Tes Koneksi** untuk memastikan token valid sebelum lanjut.
4. Isi tab **Komponen Hardware**: pilih COM port barrier, COM port/nama Bluetooth printer, kamera RTSP, aktifkan ALPR kalau dipakai.
5. Isi tab **Sinkronisasi**: interval default 5 detik sudah cukup untuk kebanyakan kasus.
6. Klik **Simpan Pengaturan**. Aplikasi otomatis memulai koneksi & sinkronisasi latar belakang.

### 3.3 Alur Kerja Offline-Safe
- Semua transaksi selalu ditulis dulu ke SQLite lokal (`%ProgramData%\SKParking\skparking_local.db`).
- `SyncService` jalan di background tiap N detik, mengirim baris `synced=0` ke server pusat.
- Kalau internet putus, transaksi tetap tercatat lokal dan otomatis terkirim begitu koneksi kembali — tidak ada data yang hilang.
- Foto ALPR asli tetap tersimpan di folder lokal (`folder_simpan_foto`); yang dikirim ke server hanya thumbnail terkompresi.

## 4. Tahap Berikutnya (belum termasuk di build ini)

Kerangka kode sudah menyediakan tempat untuk melanjutkan (lihat komentar `TODO` di `FormMain.cs`):
- Integrasi kamera & ALPR (`ALPRService`, mengikuti pola dari versi JavaFX lama).
- Kontrol barrier via serial (`HardwareService`).
- Cetak tiket via Bluetooth SPP ke printer RPP02N (pola sama dengan firmware ESP32 `BluetoothSerial`).
- Implementasi lengkap `panggilProviderQris()` sesuai provider QRIS pilihan.
