<?php
namespace App\Entity\Formation;
use ApiPlatform\Metadata\ApiResource;
use App\Entity\Schoolyear;
use App\Repository\Formation\TimetableRepository;
use App\Traits\Actions;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: TimetableRepository::class)]
#[ORM\Table(name: 'hs_tc_formation_timetable')]
#[ApiResource]
class Timetable
{
use Actions;
#[ORM\ManyToOne(inversedBy: 'timetables')]
#[ORM\JoinColumn(nullable: false)]
private ?Classe $classe = null;
#[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $startAt = null;
#[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $endAt = null;
#[ORM\OneToMany(mappedBy: 'timetable', targetEntity: Timetableitem::class, orphanRemoval: true)]
private Collection $timetableitems;
#[ORM\Column(length: 255)]
private ?string $slug = null;
public function __construct()
{
// date_default_timezone_set('Africa/Casablanca');
$this->createAt=new \DateTime('now');
$this->published=true;
$this->timetableitems = new ArrayCollection();
$this->slug=uniqid("timetable-");
}
public function getClasse(): ?Classe
{
return $this->classe;
}
public function setClasse(?Classe $classe): self
{
$this->classe = $classe;
return $this;
}
public function getStartAt(): ?\DateTimeImmutable
{
return $this->startAt;
}
public function setStartAt(?\DateTimeImmutable $startAt): self
{
$this->startAt = $startAt;
return $this;
}
public function getEndAt(): ?\DateTimeImmutable
{
return $this->endAt;
}
public function setEndAt(?\DateTimeImmutable $endAt): self
{
$this->endAt = $endAt;
return $this;
}
/**
* @return Collection<int, Timetableitem>
*/
public function getTimetableitems(): Collection
{
return $this->timetableitems;
}
public function addTimetableitem(Timetableitem $timetableitem): self
{
if (!$this->timetableitems->contains($timetableitem)) {
$this->timetableitems->add($timetableitem);
$timetableitem->setTimetable($this);
}
return $this;
}
public function removeTimetableitem(Timetableitem $timetableitem): self
{
if ($this->timetableitems->removeElement($timetableitem)) {
// set the owning side to null (unless already changed)
if ($timetableitem->getTimetable() === $this) {
$timetableitem->setTimetable(null);
}
}
return $this;
}
public function getSlug()
{
return $this->slug;
}
public function setSlug($slug)
{
$this->slug = $slug;
}
function getDayName($dayNumber) {
// Vérifie si le jour est entre 1 et 7
if ($dayNumber < 1 || $dayNumber > 7) {
return "Jour invalide";
}
// Utilise strftime() pour obtenir le nom du jour en français
setlocale(LC_TIME, 'fr_FR.utf8'); // Configuration de la localisation en français
return strftime('%A', strtotime("Sunday +{$dayNumber} days"));
}
public function isCurrent(): bool
{
$today = new \DateTime(); // Crée un objet DateTime représentant aujourd'hui
// Vérifie si la date d'aujourd'hui est entre startAt et endAt
return $today >= $this->startAt && $today <= $this->endAt;
}
public function __toString(){
return $this->getStartAt()->format('d-m-Y').' - '.$this->getEndAt()->format('d-m-Y');
}
public function getTimetableItemsDay(int $day)
{
$items=new ArrayCollection();
foreach ($this->timetableitems as $item){
if($item->getDay()== $day) $items->add($item);
}
return $items;
}
public function getWeeks()
{
$startAt=$this->getStartAt();
$endAt=$this->getEndAt();
$weeks = [];
$currentStart = $startAt; // Pas besoin de clone car DateTimeImmutable est immuable
while ($currentStart <= $endAt) {
// Calculer la fin de la semaine (jusqu'à samedi ou endAt)
$currentEnd = $currentStart->modify('next saturday');
// Si la date de fin dépasse la vraie date de fin (endAt), on ajuste
if ($currentEnd > $endAt) {
$currentEnd = $endAt;
}
// Ajouter la période dans le tableau des semaines
$weeks[] = [
'startAt' => $currentStart,
'endAt' => $currentEnd
];
// Passer à la semaine suivante (lundi)
$currentStart = $currentEnd->modify('+2 day');
}
return $weeks;
}
public function getMonths(): array
{
$startAt=$this->getStartAt();
$endAt=$this->getEndAt();
$months = [];
$currentStart = $startAt;
while ($currentStart <= $endAt) {
// Déterminer le dernier jour du mois en cours
$currentEnd = $currentStart->modify('last day of this month');
// Si le dernier jour calculé dépasse la date de fin (endAt), on ajuste
if ($currentEnd > $endAt) {
$currentEnd = $endAt;
}
// Ajouter la période dans le tableau des mois
$months[] = [
'startAt' => $currentStart,
'endAt' => $currentEnd
];
// Passer au premier jour du mois suivant
$currentStart = $currentStart->modify('first day of next month');
}
return $months;
}
public function getSeances()
{
$allSeances = [];
// Parcourir chaque TimetableItem
foreach ($this->getTimetableitems() as $timetableItem) {
// Ajouter chaque séance de TimetableItem à la collection $allSeances
foreach ($timetableItem->getAseances() as $seance) {
$allSeances[]=$seance;
}
}
usort($allSeances, function($a, $b) {
$dateA = DateTime::createFromFormat('d-m-Y H:i', $a->getTakesplaceOn()->format('d-m-Y').' '.$a->getStartAt());
$dateB = DateTime::createFromFormat('d-m-Y H:i', $b->getTakesplaceOn()->format('d-m-Y').' '.$b->getStartAt());
return $dateA <=> $dateB;
});
return $allSeances;
}
public function getSeancesCancelled()
{
$allSeances = [];
foreach ($this->getTimetableitems() as $timetableItem) {
foreach ($timetableItem->getSeancesCancelled() as $seance ) {
$allSeances[] = ['timetableitem'=>$timetableItem, 'seanceDate'=>$seance];
}
}
usort($allSeances, function($a, $b) {
$dateA = DateTime::createFromFormat('d-m-Y H:i', $a['seanceDate'].' '.$a['timetableitem']->getStartAt());
$dateB = DateTime::createFromFormat('d-m-Y H:i', $b['seanceDate'].' '.$b['timetableitem']->getStartAt());
return $dateA <=> $dateB;
});
return $allSeances;
}
public function getSeancesNotCreate()
{
$allSeances = [];
foreach ($this->getTimetableitems() as $timetableItem) {
foreach ($timetableItem->getSeancesNotCreate() as $seance ) {
$allSeances[] = ['timetableitem'=>$timetableItem, 'seanceDate'=>$seance];
}
}
usort($allSeances, function($a, $b) {
$dateA = DateTime::createFromFormat('d-m-Y H:i', $a['seanceDate'].' '.$a['timetableitem']->getStartAt());
$dateB = DateTime::createFromFormat('d-m-Y H:i', $b['seanceDate'].' '.$b['timetableitem']->getStartAt());
return $dateA <=> $dateB;
});
return $allSeances;
}
}