# Kehadiran KTM — Peti Undi SPR 2026 Aplikasi untuk admin DUN merekodkan waktu KTM (Ketua Tempat Mengundi) hadir mengambil peti undi. Data KTM dibaca terus daripada pangkalan data Sistem Pengurusan Pusat Mengundi (`spr2026` / DB `sppm`) — hanya KTM yang telah di-assign sahaja dipaparkan. ## Aliran 1. Dashboard memaparkan semua KTM dalam DUN, disusun ikut pusat mengundi (asc) dan saluran (asc). Yang belum hadir bertanda **BELUM HADIR** (merah). 2. Admin mencari nama KTM dan/atau pusat mengundi. Paparan menunjukkan nama, no. KP, no. telefon, jawatan, pusat mengundi dan saluran. 3. Admin menandakan KTM sebagai hadir — tarikh dan masa direkodkan, status bertukar **HADIR** (hijau). Rekod boleh dibatalkan jika tersilap. 4. Senarai kehadiran boleh dimuat turun dalam bentuk Excel (worksheet "Hadir" dan "Belum Hadir"). ## Peranan | Peranan | Kebenaran | |--------------|--------------------------------------------------------------| | `superadmin` | Cipta pengguna; lihat/urus kehadiran semua DUN; eksport | | `admin` | Admin DUN: daftar kehadiran KTM & eksport untuk DUN sendiri | ## Pangkalan data - `sppm_ktm` (connection `mysql`) — `users`, `kehadiran_ktm`, sesi/cache/queue. - `sppm` (connection `sppm`, baca sahaja) — `petugas_assignments`, `petugas_permohonan`, `pusat_mengundi`, `saluran`, `jawatan_tetapan`, `dun`. KTM dikenal pasti melalui `petugas_assignments` yang jawatannya berkod `KTM`. ## Pembangunan tempatan ```bash composer install cp .env.example .env # isi DB_* dan SPPM_DB_* php artisan key:generate php artisan migrate --seed # superadmin@spr.gov.my / password php artisan serve ``` Zon waktu ialah `Asia/Kuala_Lumpur` (lalai `APP_TIMEZONE`). ## Docker Lihat [DOCKER.md](DOCKER.md). Ringkasnya: ```bash cp .env.docker.example .env.docker # isi APP_KEY, kata laluan DB, WEBHOOK_SECRET docker compose up -d --build ``` Web container terikat pada `127.0.0.1:8009`; nginx host membuat reverse proxy domain awam ke port tersebut. Semua container ditetapkan `TZ=Asia/Kuala_Lumpur`.