Dalam sistem beasiswa pemerintah atau universitas, setiap program memiliki aturan seleksi yang berbeda: beasiswa akademik memprioritaskan IPK dan akreditasi prodi, beasiswa afirmasi memprioritaskan tingkat kemiskinan dan kuota wilayah, sementara beasiswa prestasi memprioritaskan sertifikat kejuaraan.
Membangun tabel database kaku (hardcoded columns) untuk setiap parameter akan menyebabkan database rapuh dan membutuhkan code deployment setiap kali ada aturan baru.
1. Arsitektur Dynamic Qualification Builder (JSONB)
Untuk memberikan fleksibilitas penuh kepada admin tanpa mengubah skema SQL, kami menggunakan tipe data JSONB di PostgreSQL yang dikombinasikan dengan validasi Zod/Laravel Form Request:
graph TD
A[Admin Program] -->|Definisikan Parameter Bobot & Aturan| B[Dynamic Qualification Matrix]
B -->|Tersimpan sebagai Skema JSONB| DB[(PostgreSQL 16)]
C[Pendaftar Mahasiswa] -->|Isi Formulir Multi-Step| D[Applicant Answer Payload]
D -->|Evaluasi Jawaban vs Bobot| E[Scoring Rule Engine]
E -->|Kalkulasi Skor Numerik & Rincian| F[(Application Scores Table)]
Struktur Skema Kualifikasi (Contoh JSONB):
{
"criteria_key": "gpa_score",
"type": "numeric_range",
"weight_percentage": 40,
"rules": [
{ "min": 3.75, "max": 4.00, "score": 100 },
{ "min": 3.50, "max": 3.74, "score": 85 },
{ "min": 3.00, "max": 3.49, "score": 70 }
],
"tiebreaker_priority": 1
}
2. Two-Phase Batch Selection Pipeline
Ketika masa pendaftaran ditutup, ribuan berkas dievaluasi menggunakan Laravel Queue Jobs melalui dua fase seleksi:
- Fase 1 (Renewal Priority Validation): Mahasiswa penerima beasiswa tahun sebelumnya yang memenuhi syarat perpanjangan IPK otomatis diproses dan kuota penerimanya diamankan terlebih dahulu.
- Fase 2 (Ranking & Quota Allocation): Pendaftar baru diperingkatkan berdasarkan kalkulasi total bobot skor. Jika terdapat skor identik (tie score), sistem menjalankan algoritma tiebreaker multi-level (contoh: pembanding tingkat semester, lalu pendapatan orang tua terendah).
// Dispatching asynchronous batch selection
use App\Jobs\ProcessBatchScoring;
ProcessBatchScoring::dispatch($scholarshipProgramId)
->onQueue('scoring')
->afterCommit();
3. Hasil & Manfaat Arsitektural
- Zero Downtime Rule Updates: Admin dapat membuat program beasiswa baru dengan kriteria unik dalam hitungan menit tanpa bantuan developer.
- Audit Trail yang Transparan: Setiap poin skor disimpan dengan rincian JSON breakdown sehingga hasil kelulusan dapat dipertanggungjawabkan secara transparan.