Files

44 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.