# Panduan Deploy Backend & Hubungkan ke App Kasir

Dokumen ini jelasin cara deploy backend (web) POS Resto ke server, dan cara nyambungin
app kasir (Flutter) supaya menu dari pusat masuk ke outlet.

---

## 1. Arsitektur Singkat

- **Backend**: PHP + MySQL (semua ada di folder `backend/`).
- **Pusat nambah menu**: lewat `dashboard.php` (panel admin web).
- **Kasir (app Flutter)**: tarik menu terbaru lewat tombol **Setting → Sync Data → Sync Produk**
  yang manggil `api-sync.php`.

```
[Pusat]  dashboard.php  -->  MySQL (pos_resto_db)
                                    ^
[Outlet] app kasir  --Sync Produk--> api-sync.php
```

---

## 2. Kebutuhan Server

- Hosting/VPS yang support **PHP 7.4+** dan **MySQL** (cPanel, Laragon, XAMPP, atau VPS).
- Akses **phpMyAdmin** (atau MySQL CLI).
- Domain/subdomain publik (mis. `mediawana.com`) + **HTTPS** (app Flutter lebih aman pakai https).

---

## 3. Langkah Deploy Backend

1. **Upload** seluruh isi folder `backend/` ke server, contoh ke `public_html/apps/backend/`.
2. **Buat database** MySQL, mis. nama `pos_resto_db`.
3. **Import** `database.sql` lewat phpMyAdmin. Ini bikin tabel + seed:
   - user admin & kasir,
   - 3 kategori,
   - 12 produk contoh.
4. **Edit `config.php`** — isi kredensial server beneran:

   ```php
   define('DB_HOST', 'localhost');        // host MySQL server
   define('DB_NAME', 'pos_resto_db');     // nama database
   define('DB_USER', 'root');             // user MySQL
   define('DB_PASS', '');                 // password MySQL
   define('BASE_URL', 'https://mediawana.com/apps/backend'); // URL publik folder backend
   ```

5. **Buat folder upload** `uploads/products/` (sejajar dengan file php) dan kasih **izin tulis**
   (untuk foto produk). Di cPanel/Linux: `chmod 755` pada folder `uploads/`, `chmod 755` pada `uploads/products/`.
6. Buka `https://mediawana.com/apps/backend/dashboard.php`.

---

## 4. Login Admin Dashboard

- **Email**: `admin@posresto.com`
- **Password default (dari seed)**: `admin123`

> Catatan: hash di `database.sql` sudah diset ke password `admin123`.
> Kalau mau ganti password lain, jalankan `php setup-password.php <password>` di server,
> lalu copy hasil hash-nya ke kolom `password` di tabel `users`.

---

## 5. Hubungkan App Flutter ke Server

Edit `lib/core/constants/variables.dart`:

```dart
class Variables {
  // URL backend — HARUS sama dengan BASE_URL di config.php
  static const String baseUrl = 'https://mediawana.com/apps/backend';
  // Email admin — HARUS ada di tabel users (dipakai sbg token auth sync)
  static const String syncAuthEmail = 'admin@posresto.com';
}
```

Setelah itu **build ulang** app (flutter run atau build APK) supaya URL baru kepakai.

---

## 6. Cara Pusat Nambah / Edit Menu

1. Login ke `dashboard.php` (email admin).
2. Tab **Produk** → tombol **+ Tambah Produk**.
3. Isi: nama, kategori, harga, stok, foto (opsional), status (Aktif/Nonaktif), favorit.
4. **Simpan**. Data langsung masuk MySQL lewat `api-products.php`.

Catatan: produk dengan status **Nonaktif** tidak akan muncul di app kasir
(api-sync.php & api-products.php cuma kirim `status = 1`... sesuaikan kalau mau beda).

---

## 7. Cara Outlet (Kasir) Ambil Menu Terbaru

1. Di app kasir: **Setting → Sync Data**.
2. Tekan **Sync Produk**.
3. Data produk dari server akan **mengganti** menu lokal.
   - Aman: kalau server balikin kosong, menu lokal **dipertahankan** (tidak dihapus).

---

## 8. Troubleshooting

| Gejala | Penyebab umum | Solusi |
|---|---|---|
| Sync gagal "Gagal koneksi server" | `baseUrl` salah / server down / tidak https | cek `variables.dart` & coba buka URL di browser |
| Sync "401 Unauthorized" | `syncAuthEmail` tidak ada di tabel users | pastikan email sama persis dgn yang di `database.sql` |
| Menu tidak muncul setelah sync | produk di dashboard status Nonaktif / kosong | cek dashboard, set status Aktif, lalu sync ulang |
| Foto produk tidak muncul | folder uploads/products/ tidak writable / BASE_URL salah | cek izin folder & BASE_URL |
| Login dashboard gagal | password salah (seed = `password`) | ikuti langkah 4 untuk ganti password |

---

## 9. Ringkasan Perubahan App (yang sudah dibetulin)

- `sync_product_bloc.dart`: dari stub (selalu balikin kosong) → sekarang beneran manggil `api-sync.php`.
- `product_remote_datasource.dart`: header `Authorization` dibenerin jadi `Bearer <syncAuthEmail>`,
  dan `authData` yang bikin crash dihapus.
- `product_response_model.dart`: tangkap `category_name` dari response sync (biar nama kategori ikut).
- `sync_data_page.dart`: menu lokal **tidak** dihapus kalau server balikin data kosong.