THE LABS GADGET CRM — FASA 2: DASHBOARD
Versi 2.1 (add-on ke atas pemasangan Fasa 1 yang sudah berfungsi)
Sasaran: crm.thelabsgadget.com — PHP 8.1+ / PHP 8.4 / MariaDB

PENTING — JANGAN PADAM DATABASE ATAU CONFIG.PHP!

PEMBAHARUAN VERSI 2.1
- Empat kad status paling atas: Jumlah Peranti Didaftarkan,
  Dalam Proses Pemeriksaan, Pembaikan Selesai, Peranti Telah Dituntut.
- Semua tajuk kad ditulis dalam Bahasa Melayu formal.
- Kiraan status berpandukan jadual repair_jobs jika wujud:
  registered = semua rekod, checking = pending + checking,
  completed = completed sahaja, collected = collected sahaja.
- Rekod repairing tidak termasuk dalam pemeriksaan atau selesai.
- Jika jadual repair_jobs belum wujud, angka dipaparkan sebagai — (bukan 0).
- Modul pendaftaran peranti belum disediakan dalam Fasa 2.1. Paparan ini
  akan menjadi aktif sebaik sahaja modul Repair yang menggunakan repair_jobs dibina.
- Kad jualan kekal di bahagian bawah, dengan kebenaran mengikut role.
- Tiada perubahan pada jadual database atau akaun user berbanding 2.0.

APA YANG BERUBAH
- Owner, Manager dan Accounts / HR boleh melihat JUALAN KESELURUHAN kedai.
- Technician, Frontdesk dan role Staff boleh melihat JUALAN SENDIRI SAHAJA.
- Had akses dilaksanakan dalam query SQL di server (bukan sekadar sembunyi UI).
- Dashboard responsif, sidebar, kad KPI, graf 7 hari, profil user dan navigasi.
- Halaman owner mengurus akaun staff masih tersedia di admin.php.
- Semua username/password/role sedia ada dan login kekal di database sama.
- Transaksi Repair/Payments belum ada; tiada nombor jualan yang direka.
- sales_ledger masih kosong selepas upgrade. Ia akan diisi oleh modul bayaran/repair
  dalam fasa akan datang. Sales lama Loyverse/POS tidak diimport automatik.
- Sidebar Repair Jobs, Customers, Payments ditanda SOON; bukan link palsu.

LANGKAH PASANG
1. Backup dulu fail laman CRM sedia ada dan eksport database dari phpMyAdmin.
2. Login cPanel > File Manager > public_html/crm.thelabsgadget.com
   (semak Document Root sebenar di cPanel > Domains).
3. Upload ZIP add-on Fasa 2 ke folder itu, kemudian pilih Extract.
4. Pilih Extract ke folder SAMA, bukan subfolder tambahan. Kalau ditanya,
   pilih Overwrite untuk HANYA fail dari ZIP ini.
   Fail yang ditimpa: app.php, admin.php, staff.php.
   Fail baru: dashboard.php, dashboard-data.php, upgrade-fasa2.php,
   assets/dashboard-v2.css, assets/dashboard-v2.js, README-FASA2.txt.
   ZIP INI TIDAK MENGANDUNGI config.php, login.php, setup.php ATAU DATABASE DUMP.
5. Buka https://crm.thelabsgadget.com/upgrade-fasa2.php
   (log masuk sebagai Owner jika diminta).
6. Klik 'Aktifkan Fasa 2'. Skrip menambah jadual sales_ledger secara idempotent.
   Pengguna dan password sedia ada tidak diubah.
7. Selepas berjaya, PADAM upgrade-fasa2.php dalam File Manager.
8. Buka https://crm.thelabsgadget.com/dashboard.php
   dan refresh kuat browser (Ctrl+Shift+R atau Cmd+Shift+R).
9. Semak akses: owner / manager / accounts boleh nampak 'Jualan Kedai'.
   Technician/frontdesk/staff mesti nampak 'Jualan Saya'.
   Staff bukan admin TIDAK boleh akses admin.php.
10. Test login, logout, change-password, tambah staff owner masih berfungsi.

NILAI JUALAN
- Tanda '—' bermaksud tiada transaksi berbayar direkodkan dalam CRM untuk tempoh itu,
  BUKAN jualan kedai sebenar RM0. Jika rekod ada, jumlah sebenar dipaparkan.
- Sumber kewangan ialah sales_ledger berstatus 'paid' dan jumlah amount.
- paid_at DATETIME disimpan sebagai UTC, paparan group tarikh Asia/Kuala_Lumpur.
- Unik (source_type, source_ref) untuk menghalang transaksi berulang kemudian.
- Rekod jualan dalam CRM masih kosong. Modul POS/Loyverse tidak disambung.

KESERASIAN
- Role sedia ada: admin, manager, accounts, technician, frontdesk, staff.
- Fasa 1 (database users, login_attempts, auth, CSRF, hash password) kekal.
- Tiada arahan DROP / DELETE / TRUNCATE dalam migration.
- Masih disarankan gunakan SSL/HTTPS dan buang setup.php jika belum.

KALAU RALAT
- Jangan padam database. Pulihkan fail lama daripada backup jika perlu.
- Semak file names tepat, susunan Extract dan permissions.
- Jika migration gagal, pastikan MySQL user mempunyai privilege CREATE.
- Jangan kongsikan config.php, password, install_key atau sesi cookies.
