$ketersediaan Map slot key → bool. * Contoh: ["1-1" => true, "1-2" => true, "2-3" => true, ...] * Slot yang tidak ada di map dianggap tidak tersedia. */ public function __construct( public readonly int $id, public readonly string $nama, public readonly int $levelMaksimal, public readonly array $ketersediaan ) { } /** * Cek apakah guru tersedia di slot tertentu. * Ini yang dipakai H3 (constraint ketersediaan guru). */ public function tersediaAt(SchedulingSlot $slot): bool { return $this->ketersediaan[$slot->toKey()] ?? false; } /** * Cek apakah guru mampu mengajar level tertentu (berjenjang). * Guru level 3 → mampu mengajar level 1, 2, 3, tapi tidak 4. * Ini yang dipakai H4 (constraint kualifikasi). */ public function mampuMengajarLevel(int $level): bool { return $this->levelMaksimal >= $level; } /** * Menghitung total slot yang tersedia untuk guru ini. * Berguna untuk diagnostik dan penghitungan bobot fitness. */ public function totalSlotTersedia(): int { return count(array_filter($this->ketersediaan)); } }