AJK HARMONY - PHP/MySQL WEBSITE

Based on AJKConnect data fields and Flora Bloom style of separate public pages + admin panel.

INSTALL (fresh database):
1. Create MySQL database/user in cPanel, grant privileges.
2. Import schema.sql via phpMyAdmin.
3. Edit config.php DB_NAME, DB_USER, DB_PASS.
4. Upload ajk_portal folder content to your desired public_html subfolder.
5. Open setup.php and create first admin (username >=4 chars, password >=12 chars).
6. DELETE setup.php from hosting immediately after setup.
7. Visit index.php, add appointments, view calendar and reports.

EXISTING AJKCONNECT DATABASE: Import migration_existing.sql INSTEAD OF schema.sql; preserves existing appointments and adds admin + request tables. BACK UP DATABASE FIRST.

SECURITY/PROCESS:
- Public visitors can view records, calendar, reports, and add records.
- PIN >=6 characters is hashed, and used ONLY to submit edit/delete requests.
- No immediate self-deletion; admin approves or rejects requests.
- Admin can delete appointments directly, after confirmation.
- View Website button logs out admin; returning to admin requires login again.
- Same-day overlap by staff ID is flagged; no program start/end time exists, so this is only a potential clash.
- Counts by appointment, not workload hours; same person should use same staff ID consistently.
- Public staff data is visible; for institutional production use, restrict access to authenticated staff and obtain data/privacy approval.
- Back up DB regularly. Password recovery requires DBA-level reset; no public reset endpoint.
- PHP 8.0+ and MySQL/MariaDB recommended. PDO_mysql and mbstring needed.
- Live hosting integration not tested here.

VERSI 2 - KEMAS KINI (WAJIB):
Jika sistem sudah mempunyai jadual lama, import upgrade_v2.sql SEKALI SAHAJA selepas membuat sandaran. Untuk pemasangan baharu import schema.sql sahaja. Jangan import kedua-duanya.
PIN adalah satu bagi setiap ID staf. Staf sedia ada mesti menggunakan PIN yang sama dan boleh semak profil selepas mengisi ID dan PIN. Rekod lama diimport ke profil staf menggunakan PIN daripada rekod terawal bagi setiap ID. Jika ada PIN berlainan bagi ID yang sama, PIN rekod terawal akan digunakan.
Pentadbir boleh menambah jabatan, menambah ruangan borang dinamik, menyembunyikan ruangan, menambah dan memadam rekod. Ruangan dinamik disimpan dalam extra_data JSON.
Tarikh program dan bilangan hari digunakan dalam kalendar dan semakan pertindihan. Tiada masa mula/tamat, maka pertindihan adalah potensi sahaja.
Sila uji fungsi pada salinan database sebelum pemasangan produksi.

VERSI 3 - ANALITIK & IMPORT
- Semua teks utama halaman utama kini Bahasa Melayu.
- analytics.php: Carta pai, carta bar dan histogram. Histogram menunjukkan taburan bilangan lantikan (bukan label nama). Dashboard memaparkan staf, jabatan dan jawatan AJK.
- import.php: Import hanya pentadbir, pratonton sebelum pengesahan, semak jabatan, rekod berganda dan profil staf.
- Format: CSV (UTF-8), XLSX (lembaran pertama), DOCX (jadual pertama). PDF: hanya teks berstruktur dengan pemisah | dan utiliti pdftotext tersedia; PDF imbasan tidak disokong. Utamakan Excel.
- Templat: template_ajk.xlsx, template_ajk.csv, template_ajk.docx. Format tarikh YYYY-MM-DD dan bilangan hari 1-365.
- Bagi staf baharu yang diimport, sistem menjana PIN sementara yang hanya dipaparkan sekali kepada pentadbir. Pentadbir perlu menyampaikan PIN secara peribadi. PIN tidak dihantar melalui e-mel.
- Bagi pemasangan yang sudah menggunakan V2, tiada perubahan database diperlukan untuk V3. JANGAN import schema.sql atau upgrade_v2.sql semula.
- Untuk pemasangan baharu, import schema.sql sahaja. Uji pada salinan database sebelum production.
- Carta dilukis secara tempatan menggunakan Canvas; tiada CDN atau perkhidmatan luar.
