penjadwalan-ga/app/Services/Scheduling/Data/Kelas.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);
}
}