N
G
Complex Algorithm

Algoritma Penjadwalan.

PHP Native Conflict Detection SKS Load Balancing Minara College Case

The Challenge

Studi Kasus: Minara College. Manajemen jadwal perkuliahan secara manual sering kali mengakibatkan bentrok jadwal (seperti Dosen yang harus mengajar di dua tempat, atau Ruangan yang terpakai ganda) dan ketimpangan beban SKS antar dosen.

Dibutuhkan sebuah sistem yang dapat memvalidasi ribuan kemungkinan kombinasi antara Dosen, Mata Kuliah, Ruang, dan Waktu secara real-time sesaat sebelum data disimpan ke database.

Technical Solution

Saya membangun sistem ini berbasis PHP Native murni untuk mengejar performa maksimal dalam query logika yang berat tanpa terhambat beban dari *framework*.

  • Double-Constraint Check: Algoritma pengecekan ganda secara paralel untuk tabrakan Ruang & Waktu serta tabrakan Dosen & Waktu.
  • SKS Monitoring: Kalkulasi otomatis di tabel untuk mencegah overload beban mengajar SKS per dosen.
  • Print Friendly: Fitur cetak laporan PDF langsung untuk jadwal kelas.

Relational Logic Architecture

Kekuatan utama sistem ini ada pada relasi tabel ploting_mengajar yang bertindak sebagai pusat (Bridge Table) untuk merajut entitas lain di dalam database.

  • pengampu: Menghubungkan Dosen -> Mata Kuliah -> Kelas -> Tahun Akademik.
  • jadwal: Menyimpan ketersediaan slot Hari, Jam, & ID Ruang.
  • ploting_mengajar: Menyatukan ID Pengampu dan ID Jadwal secara definitif dan tervalidasi.

Logic Validasi Bentrok:

IF (Ruang = 'Lab Kom 1' AND Waktu = '08:00-10:00') EXISTS
OR
IF (Dosen = 'Nasril' AND Waktu = '08:00-10:00') EXISTS
=> REJECT INPUT (BENTROK)
ELSE
=> SAVE DATA to ploting_mengajar
ConflictCheck.php (The Anti-Conflict Algorithm)

Berikut adalah potongan kode PHP Native yang saya gunakan untuk memvalidasi irisan waktu (Time Overlap) agar tidak ada jadwal yang bertabrakan baik secara ruangan maupun jadwal dosen.

function cekBentrok($hari, $jam_mulai, $jam_selesai, $id_ruang, $id_dosen) {
    global $koneksi;

    // 1. Cek Bentrok Ruangan (Apakah ruangan sedang dipakai orang lain?)
    $queryRuang = "SELECT * FROM jadwal 
                   JOIN ploting_mengajar ON jadwal.id_jadwal = ploting_mengajar.id_jadwal
                   WHERE hari = '$hari' 
                   AND id_ruang = '$id_ruang'
                   AND (
                       ('$jam_mulai' >= jam_mulai AND '$jam_mulai' < jam_selesai) OR
                       ('$jam_selesai' > jam_mulai AND '$jam_selesai' <= jam_selesai)
                   )";

    $cek1 = mysqli_num_rows(mysqli_query($koneksi, $queryRuang));
    
    // Jika data ditemukan (cek1 > 0), berarti ada irisan waktu
    if ($cek1 > 0) return "Error: Ruangan Sedang Terpakai pada Jam Tersebut!";
    
    // 2. Cek Bentrok Dosen (Logic query serupa diterapkan untuk mengecek tabel pengampu)
    // ...
    
    return "OK"; // Lolos validasi, data aman untuk di-insert ke database
}