# Dashboard admin recruitment Akses `/dashboard/login.php`. Dashboard memakai PHP + mysqli dan CSS responsif tanpa ketergantungan AdminLTE, CDN, Node, atau proses build. Tampilan terinspirasi dashboard modern; aplikasi ini tidak dimigrasikan ke framework Svelte. ## Instalasi 1. Siapkan database MySQL khusus recruitment, lalu impor ekspor tiga tabel `in_daper`, `in_soal`, dan `in_jawab` yang sudah tersedia. Impor hanya pada database baru/kosong; dump dapat berisi perintah DROP TABLE. 2. Isi `includes/conn.php` sesuai database tersebut. Admin menggunakan file koneksi yang sama dengan peserta. Dashboard dan peserta selalu memakai file koneksi ini; environment `REC_DB_*` tidak digunakan. 3. Dari terminal server, di folder root project, jalankan: ```sh php dashboard/tools/create-admin.php ``` Isi nama, email, dan password admin (minimal 12 karakter). Password disembunyikan saat diketik dan disimpan sebagai hash. Perintah otomatis membuat tabel `rec_admin` menggunakan migrasi `dashboard/migrations/001_admin.sql`. Akun yang sudah ada tidak ditimpa. Tidak ada akun/password admin bawaan. 4. Buka `/dashboard/login.php`, lalu masuk dengan akun yang baru dibuat. Jika pengelola database hanya dapat membuat tabel melalui phpMyAdmin, jalankan migrasi `001_admin.sql` lebih dahulu, kemudian jalankan perintah CLI pembuat akun. PHP memerlukan ekstensi `mysqli`, dukungan mysqlnd (`get_result`), dan terminal interaktif untuk pembuatan akun. PHP minimum 7.3; pengujian dilakukan pada PHP 8.3/MySQL 8.0. ## Perilaku - Daftar peserta: pencarian nama/email/posisi, filter seleksi, pagination 25 data, penambahan peserta, progres empat fase, dan tautan hasil. - Tahap seleksi mempertahankan kode lama: `0` calon kandidat, `1` tidak dilanjutkan, `2` tes offline/interview, `3` diterima, `99` demo/arsip. Status ini dipilih admin secara manual. - Hasil menampilkan seluruh jawaban dan kunci kategori 1–4. Admin menilai benar (`10`) atau salah (`0`). Seluruh jawaban kategori tersebut harus dinilai sebelum finalisasi. Nilai dapat dikoreksi dengan menyimpan ulang. - Finalisasi tersedia setelah peserta menyelesaikan empat fase (`level >= 4`). Data yang kehilangan referensi soal perlu diperbaiki sebelum finalisasi. - Kategori 5 (kepribadian): menampilkan pilihan L/R dan jawaban, tanpa skor atau interpretasi otomatis. - Ambang skor awal `300`, mengikuti halaman daftar lama. Halaman detail lama menggunakan `320`; sekarang seluruh halaman admin memakai satu nilai. Ubah environment `REC_PASS_SCORE` menjadi `320` jika itu kebijakan yang digunakan. Label lulus skor tidak otomatis mengubah keputusan seleksi. - Bank soal: pencarian, filter lima kategori, pagination, tambah, edit, duplikat, dan hapus. Soal yang sudah digunakan terkunci dari edit/hapus untuk menjaga hasil historis. Duplikasi membuat soal tambahan yang ikut pengacakan tes; ini bukan penggantian/penonaktifan soal lama. - Session admin terpisah dari peserta, kedaluwarsa setelah satu jam tanpa aktivitas. Form mutasi memakai token CSRF; query input memakai prepared statements dan keluaran di-escape. - Lima login gagal dalam satu sesi browser menyebabkan jeda lima menit. Untuk produksi, terapkan pembatasan percobaan login tambahan pada web server/reverse proxy. ## Penempatan server Gunakan HTTPS. Jangan menyimpan dump SQL dalam document root produksi; `.gitignore` mengecualikan dump, dan `.htaccess` root memblokir akses HTTP ke SQL pada Apache/LiteSpeed yang mengizinkan override. Jika memakai Nginx, terapkan aturan penolakan untuk dump dan folder `dashboard/tools/` serta `dashboard/migrations/` pada konfigurasi server. PHP development server tidak memproses `.htaccess`; pakai hanya untuk pengujian lokal. ## Validasi yang dilakukan SQL diimpor ke database MySQL sementara lokal. Login/logout, pembatasan akses, penolakan CSRF, pencarian/filter, detail hasil, tambah peserta sintetis, tambah/edit soal, penguncian soal bersejarah, penolakan nilai tidak valid, finalisasi/koreksi nilai, serta pembaruan tahap diuji melalui HTTP. Seluruh file PHP melewati pemeriksaan sintaks. Tampilan diperiksa di browser pada ukuran desktop dan mobile. Pengujian tidak mengubah database produksi. ## Preview lokal yang sudah disiapkan Jalankan `./dev/start-local.sh` dari root project. Dashboard berada di port 8086 dan phpMyAdmin di port 8087; detail, kredensial, backup, dan cara menghentikan layanan ada di [dev/README.md](../dev/README.md). Tabel admin baru menggunakan `email`, `nama_de`, `nama_be`, `idkar`, dan `password_hash` selain ID; script pembuat admin menerima identitas tersebut. Migrasi `002_admin_identity.sql` menangani tabel admin versi lama tanpa mengganti hash password.