src/Entity/Formation/Timetable.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Formation;
  3. use ApiPlatform\Metadata\ApiResource;
  4. use App\Entity\Schoolyear;
  5. use App\Repository\Formation\TimetableRepository;
  6. use App\Traits\Actions;
  7. use DateTime;
  8. use Doctrine\Common\Collections\ArrayCollection;
  9. use Doctrine\Common\Collections\Collection;
  10. use Doctrine\ORM\Mapping as ORM;
  11. #[ORM\Entity(repositoryClassTimetableRepository::class)]
  12. #[ORM\Table(name'hs_tc_formation_timetable')]
  13. #[ApiResource]
  14. class Timetable
  15. {
  16.     use Actions;
  17.     #[ORM\ManyToOne(inversedBy'timetables')]
  18.     #[ORM\JoinColumn(nullablefalse)]
  19.     private ?Classe $classe null;
  20.     #[ORM\Column(nullabletrue)]
  21.     private ?\DateTimeImmutable $startAt null;
  22.     #[ORM\Column(nullabletrue)]
  23.     private ?\DateTimeImmutable $endAt null;
  24.     #[ORM\OneToMany(mappedBy'timetable'targetEntityTimetableitem::class, orphanRemovaltrue)]
  25.     private Collection $timetableitems;
  26.     #[ORM\Column(length255)]
  27.     private ?string $slug null;
  28.     public function __construct()
  29.     {
  30.         // date_default_timezone_set('Africa/Casablanca');
  31.         $this->createAt=new \DateTime('now');
  32.         $this->published=true;
  33.         $this->timetableitems = new ArrayCollection();
  34.         $this->slug=uniqid("timetable-");
  35.     }
  36.     public function getClasse(): ?Classe
  37.     {
  38.         return $this->classe;
  39.     }
  40.     public function setClasse(?Classe $classe): self
  41.     {
  42.         $this->classe $classe;
  43.         return $this;
  44.     }
  45.     public function getStartAt(): ?\DateTimeImmutable
  46.     {
  47.         return $this->startAt;
  48.     }
  49.     public function setStartAt(?\DateTimeImmutable $startAt): self
  50.     {
  51.         $this->startAt $startAt;
  52.         return $this;
  53.     }
  54.     public function getEndAt(): ?\DateTimeImmutable
  55.     {
  56.         return $this->endAt;
  57.     }
  58.     public function setEndAt(?\DateTimeImmutable $endAt): self
  59.     {
  60.         $this->endAt $endAt;
  61.         return $this;
  62.     }
  63.     /**
  64.      * @return Collection<int, Timetableitem>
  65.      */
  66.     public function getTimetableitems(): Collection
  67.     {
  68.         return $this->timetableitems;
  69.     }
  70.     public function addTimetableitem(Timetableitem $timetableitem): self
  71.     {
  72.         if (!$this->timetableitems->contains($timetableitem)) {
  73.             $this->timetableitems->add($timetableitem);
  74.             $timetableitem->setTimetable($this);
  75.         }
  76.         return $this;
  77.     }
  78.     public function removeTimetableitem(Timetableitem $timetableitem): self
  79.     {
  80.         if ($this->timetableitems->removeElement($timetableitem)) {
  81.             // set the owning side to null (unless already changed)
  82.             if ($timetableitem->getTimetable() === $this) {
  83.                 $timetableitem->setTimetable(null);
  84.             }
  85.         }
  86.         return $this;
  87.     }
  88.     public function getSlug()
  89.     {
  90.         return $this->slug;
  91.     }
  92.     public function setSlug($slug)
  93.     {
  94.         $this->slug $slug;
  95.     }
  96.     function getDayName($dayNumber) {
  97.         // Vérifie si le jour est entre 1 et 7
  98.         if ($dayNumber || $dayNumber 7) {
  99.             return "Jour invalide";
  100.         }
  101.         // Utilise strftime() pour obtenir le nom du jour en français
  102.         setlocale(LC_TIME'fr_FR.utf8'); // Configuration de la localisation en français
  103.         return strftime('%A'strtotime("Sunday +{$dayNumber} days"));
  104.     }
  105.     public function isCurrent(): bool
  106.     {
  107.         $today = new \DateTime(); // Crée un objet DateTime représentant aujourd'hui
  108.         // Vérifie si la date d'aujourd'hui est entre startAt et endAt
  109.         return $today >= $this->startAt && $today <= $this->endAt;
  110.     }
  111.     public function __toString(){
  112.         return $this->getStartAt()->format('d-m-Y').' - '.$this->getEndAt()->format('d-m-Y');
  113.     }
  114.     public function getTimetableItemsDay(int $day)
  115.     {
  116.         $items=new ArrayCollection();
  117.         foreach ($this->timetableitems as $item){
  118.             if($item->getDay()== $day$items->add($item);
  119.         }
  120.         return $items;
  121.     }
  122.     public function getWeeks()
  123.     {
  124.         $startAt=$this->getStartAt();
  125.         $endAt=$this->getEndAt();
  126.         $weeks = [];
  127.         $currentStart $startAt// Pas besoin de clone car DateTimeImmutable est immuable
  128.         while ($currentStart <= $endAt) {
  129.             // Calculer la fin de la semaine (jusqu'à samedi ou endAt)
  130.             $currentEnd $currentStart->modify('next saturday');
  131.             // Si la date de fin dépasse la vraie date de fin (endAt), on ajuste
  132.             if ($currentEnd $endAt) {
  133.                 $currentEnd $endAt;
  134.             }
  135.             // Ajouter la période dans le tableau des semaines
  136.             $weeks[] = [
  137.                 'startAt' => $currentStart,
  138.                 'endAt' => $currentEnd
  139.             ];
  140.             // Passer à la semaine suivante (lundi)
  141.             $currentStart $currentEnd->modify('+2 day');
  142.         }
  143.         return $weeks;
  144.     }
  145.     public function getMonths(): array
  146.     {
  147.         $startAt=$this->getStartAt();
  148.         $endAt=$this->getEndAt();
  149.         $months = [];
  150.         $currentStart $startAt;
  151.         while ($currentStart <= $endAt) {
  152.             // Déterminer le dernier jour du mois en cours
  153.             $currentEnd $currentStart->modify('last day of this month');
  154.             // Si le dernier jour calculé dépasse la date de fin (endAt), on ajuste
  155.             if ($currentEnd $endAt) {
  156.                 $currentEnd $endAt;
  157.             }
  158.             // Ajouter la période dans le tableau des mois
  159.             $months[] = [
  160.                 'startAt' => $currentStart,
  161.                 'endAt' => $currentEnd
  162.             ];
  163.             // Passer au premier jour du mois suivant
  164.             $currentStart $currentStart->modify('first day of next month');
  165.         }
  166.         return $months;
  167.     }
  168.     public function getSeances()
  169.     {
  170.         $allSeances = [];
  171.         // Parcourir chaque TimetableItem
  172.         foreach ($this->getTimetableitems() as $timetableItem) {
  173.             // Ajouter chaque séance de TimetableItem à la collection $allSeances
  174.             foreach ($timetableItem->getAseances() as $seance) {
  175.                 $allSeances[]=$seance;
  176.             }
  177.         }
  178.         usort($allSeances, function($a$b) {
  179.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a->getTakesplaceOn()->format('d-m-Y').' '.$a->getStartAt());
  180.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b->getTakesplaceOn()->format('d-m-Y').' '.$b->getStartAt());
  181.             return $dateA <=> $dateB;
  182.         });
  183.         return $allSeances;
  184.     }
  185.     public function getSeancesCancelled()
  186.     {
  187.         $allSeances = [];
  188.         foreach ($this->getTimetableitems() as $timetableItem) {
  189.             foreach ($timetableItem->getSeancesCancelled() as $seance ) {
  190.                 $allSeances[] = ['timetableitem'=>$timetableItem'seanceDate'=>$seance];
  191.             }
  192.         }
  193.         usort($allSeances, function($a$b) {
  194.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a['seanceDate'].' '.$a['timetableitem']->getStartAt());
  195.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b['seanceDate'].' '.$b['timetableitem']->getStartAt());
  196.             return $dateA <=> $dateB;
  197.         });
  198.         return $allSeances;
  199.     }
  200.     public function getSeancesNotCreate()
  201.     {
  202.         $allSeances = [];
  203.         foreach ($this->getTimetableitems() as $timetableItem) {
  204.             foreach ($timetableItem->getSeancesNotCreate() as $seance ) {
  205.                 $allSeances[] = ['timetableitem'=>$timetableItem'seanceDate'=>$seance];
  206.             }
  207.         }
  208.         usort($allSeances, function($a$b) {
  209.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a['seanceDate'].' '.$a['timetableitem']->getStartAt());
  210.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b['seanceDate'].' '.$b['timetableitem']->getStartAt());
  211.             return $dateA <=> $dateB;
  212.         });
  213.         return $allSeances;
  214.     }
  215. }