<?php
namespace App\Entity;
use App\Repository\ClassLevelRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: ClassLevelRepository::class)]
class ClassLevel
{
// Systèmes d'évaluation possibles pour une classe (voir TheClassEvaluationSystem).
public const SYSTEM_SEQUENCE = 'sequence';
public const SYSTEM_COMPETENCE = 'competence';
public const SYSTEM_LIBRE = 'libre';
// Sous-matières (Oral/Écrit/Pratique/Attitude...) chacune avec son propre barème,
// notes mensuelles par trimestre — écoles primaires/maternelles (School::isPrimaryOrKindergarten()).
public const SYSTEM_PRIMARY = 'primary';
public const EVALUATION_SYSTEMS = [
self::SYSTEM_SEQUENCE,
self::SYSTEM_COMPETENCE,
self::SYSTEM_LIBRE,
self::SYSTEM_PRIMARY,
];
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $name = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $abreviation = null;
#[ORM\Column]
private ?int $level = null;
#[ORM\OneToMany(mappedBy: 'classLevel', targetEntity: TheClass::class)]
private Collection $classes;
#[ORM\ManyToOne(inversedBy: 'classLevels')]
#[ORM\JoinColumn(nullable: false)]
private ?CycleLevel $cycle = null;
#[ORM\OneToMany(mappedBy: 'level', targetEntity: ClassOption::class, orphanRemoval: true)]
private Collection $classOptions;
// Système d'évaluation par défaut proposé (et pré-coché) aux écoles qui créent
// une classe sur ce niveau — voir TheClassEvaluationSystem pour le choix réel,
// par classe et par année scolaire, qui peut différer de ce défaut.
#[ORM\Column(length: 20)]
private string $defaultEvaluationSystem = self::SYSTEM_SEQUENCE;
public function __construct()
{
$this->classes = new ArrayCollection();
$this->classOptions = new ArrayCollection();
}
public function __toString(): string
{
return $this->abreviation ? $this->name . ' (' . $this->abreviation . ')' : (string) $this->name;
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): static
{
$this->name = $name;
return $this;
}
public function getAbreviation(): ?string
{
return $this->abreviation;
}
public function setAbreviation(?string $abreviation): static
{
$this->abreviation = $abreviation;
return $this;
}
public function getLevel(): ?int
{
return $this->level;
}
public function setLevel(int $level): static
{
$this->level = $level;
return $this;
}
/**
* @return Collection<int, TheClass>
*/
public function getClasses(): Collection
{
return $this->classes;
}
public function addClass(TheClass $class): static
{
if (!$this->classes->contains($class)) {
$this->classes->add($class);
$class->setClassLevel($this);
}
return $this;
}
public function removeClass(TheClass $class): static
{
if ($this->classes->removeElement($class)) {
// set the owning side to null (unless already changed)
if ($class->getClassLevel() === $this) {
$class->setClassLevel(null);
}
}
return $this;
}
public function getDefaultEvaluationSystem(): string
{
return $this->defaultEvaluationSystem;
}
public function setDefaultEvaluationSystem(string $defaultEvaluationSystem): static
{
$this->defaultEvaluationSystem = $defaultEvaluationSystem;
return $this;
}
public function getCycle(): ?CycleLevel
{
return $this->cycle;
}
public function setCycle(?CycleLevel $cycle): static
{
$this->cycle = $cycle;
return $this;
}
/**
* @return Collection<int, ClassOption>
*/
public function getClassOptions(): Collection
{
return $this->classOptions;
}
public function addClassOption(ClassOption $classOption): static
{
if (!$this->classOptions->contains($classOption)) {
$this->classOptions->add($classOption);
$classOption->setLevel($this);
}
return $this;
}
public function removeClassOption(ClassOption $classOption): static
{
if ($this->classOptions->removeElement($classOption)) {
// set the owning side to null (unless already changed)
if ($classOption->getLevel() === $this) {
$classOption->setLevel(null);
}
}
return $this;
}
}