penjadwalan-ga/app/Services/Scheduling/Data/Guru.php

55 lines
1.7 KiB
PHP

<?php
namespace App\Services\Scheduling\Data;
/**
* DTO merepresentasikan seorang guru untuk keperluan GA.
* Hanya berisi atribut yang dipakai algoritma — tidak termasuk data personal
* seperti alamat, foto, atau tanggal lahir.
*/
class Guru
{
/**
* @param int $id ID guru di database
* @param string $nama Nama guru (untuk display saja)
* @param int $levelMaksimal Level tertinggi yang mampu diajar (1-4)
* @param array<string, bool> $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));
}
}