55 lines
2.0 KiB
PHP
55 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Scheduling\Data;
|
|
|
|
/**
|
|
* DTO merepresentasikan sebuah kelas untuk keperluan GA.
|
|
*
|
|
* Ada dua jenis kelas:
|
|
* 1. Kelas Reguler: 4 komponen (hari, sesi, ruangan, guru) dioptimasi GA
|
|
* 2. Kelas Ekstrakurikuler: hari/sesi/ruangan sudah tetap, hanya guru yang dioptimasi
|
|
*/
|
|
class Kelas
|
|
{
|
|
/**
|
|
* @param int $id ID kelas di database
|
|
* @param string $nama Nama kelas (untuk display)
|
|
* @param int $level Level kelas (1-4)
|
|
* @param int $frekuensiPerMinggu Berapa kali kelas ini bertemu per minggu
|
|
* @param bool $isEkstrakurikuler Apakah kelas ini ekstrakurikuler
|
|
* @param ?int $hariFix Hari yang sudah tetap (hanya untuk ekstrakurikuler)
|
|
* @param ?int $sesiFix Sesi yang sudah tetap (hanya untuk ekstrakurikuler)
|
|
* @param ?int $ruanganFixId ID ruangan yang sudah tetap (hanya untuk ekstrakurikuler)
|
|
*/
|
|
public function __construct(
|
|
public readonly int $id,
|
|
public readonly string $nama,
|
|
public readonly int $level,
|
|
public readonly int $frekuensiPerMinggu,
|
|
public readonly bool $isEkstrakurikuler,
|
|
public readonly ?int $hariFix = null,
|
|
public readonly ?int $sesiFix = null,
|
|
public readonly ?int $ruanganFixId = null,
|
|
) {
|
|
// Guard: untuk kelas ekstrakurikuler, hari/sesi/ruangan_fix wajib terisi
|
|
if ($isEkstrakurikuler) {
|
|
if ($hariFix === null || $sesiFix === null || $ruanganFixId === null) {
|
|
throw new \InvalidArgumentException(
|
|
"Kelas ekstrakurikuler '{$nama}' (id={$id}) harus punya hari_fix, sesi_fix, dan ruangan_fix_id."
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Mengembalikan slot fix untuk kelas ekstrakurikuler.
|
|
* Return null untuk kelas reguler.
|
|
*/
|
|
public function slotFix(): ?SchedulingSlot
|
|
{
|
|
if (!$this->isEkstrakurikuler) {
|
|
return null;
|
|
}
|
|
return new SchedulingSlot($this->hariFix, $this->sesiFix);
|
|
}
|
|
} |