55 lines
1.7 KiB
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));
|
|
}
|
|
} |