src/Entity/Training/Schedule.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Training;
  3. use ApiPlatform\Metadata\ApiResource;
  4. use App\Entity\Schoolyear;
  5. use App\Repository\Training\ScheduleRepository;
  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(repositoryClassScheduleRepository::class)]
  12. #[ORM\Table(name'hs_tc_training_schedule')]
  13. #[ApiResource]
  14. class Schedule
  15. {
  16.     use Actions;
  17.     #[ORM\ManyToOne(inversedBy'schedules')]
  18.     #[ORM\JoinColumn(nullablefalse)]
  19.     private ?Groupe $groupe null;
  20.     #[ORM\Column]
  21.     private ?string $semester null;
  22.     #[ORM\Column(nullabletrue)]
  23.     private ?\DateTimeImmutable $startAt null;
  24.     #[ORM\Column(nullabletrue)]
  25.     private ?\DateTimeImmutable $endAt null;
  26.     #[ORM\OneToMany(mappedBy'schedule'targetEntityScheduleitem::class, orphanRemovaltrue)]
  27.     #[ORM\OrderBy(["day" => "ASC""startAt" => "ASC"])]
  28.     private Collection $scheduleitems;
  29.     #[ORM\OneToMany(mappedBy'schedule'targetEntityScheduleevent::class, orphanRemovaltrue)]
  30.     #[ORM\OrderBy(["takesplaceOn" => "ASC""startAt" => "ASC"])]
  31.     private Collection $scheduleevents;
  32.     #[ORM\Column(length255)]
  33.     private ?string $slug null;
  34.     public function __construct()
  35.     {
  36.         // date_default_timezone_set('Africa/Casablanca');
  37.         $this->createAt=new \DateTime('now');
  38.         $this->published=true;
  39.         $this->scheduleitems = new ArrayCollection();
  40.         $this->slug=uniqid("schedule-");
  41.     }
  42.     public function getGroupe(): ?Groupe
  43.     {
  44.         return $this->groupe;
  45.     }
  46.     public function setGroupe(?Groupe $groupe): self
  47.     {
  48.         $this->groupe $groupe;
  49.         return $this;
  50.     }
  51.     public function getSemester(): ?string
  52.     {
  53.         return $this->semester;
  54.     }
  55.     public function setSemester(?string $semester): void
  56.     {
  57.         $this->semester $semester;
  58.     }
  59.     public function getStartAt(): ?\DateTimeImmutable
  60.     {
  61.         return $this->startAt;
  62.     }
  63.     public function setStartAt(?\DateTimeImmutable $startAt): self
  64.     {
  65.         $this->startAt $startAt;
  66.         return $this;
  67.     }
  68.     public function getEndAt(): ?\DateTimeImmutable
  69.     {
  70.         return $this->endAt;
  71.     }
  72.     public function setEndAt(?\DateTimeImmutable $endAt): self
  73.     {
  74.         $this->endAt $endAt;
  75.         return $this;
  76.     }
  77.     /**
  78.      * @return Collection<int, Scheduleitem>
  79.      */
  80.     public function getScheduleitems(): Collection
  81.     {
  82.         return $this->scheduleitems;
  83.     }
  84.     public function addScheduleitem(Scheduleitem $scheduleitem): self
  85.     {
  86.         if (!$this->scheduleitems->contains($scheduleitem)) {
  87.             $this->scheduleitems->add($scheduleitem);
  88.             $scheduleitem->setSchedule($this);
  89.         }
  90.         return $this;
  91.     }
  92.     public function removeScheduleitem(Scheduleitem $scheduleitem): self
  93.     {
  94.         if ($this->scheduleitems->removeElement($scheduleitem)) {
  95.             // set the owning side to null (unless already changed)
  96.             if ($scheduleitem->getSchedule() === $this) {
  97.                 $scheduleitem->setSchedule(null);
  98.             }
  99.         }
  100.         return $this;
  101.     }
  102.     /**
  103.      * @return Collection<int, Scheduleevent>
  104.      */
  105.     public function getScheduleevents(): Collection
  106.     {
  107.         return $this->scheduleevents;
  108.     }
  109.     public function addScheduleevent(Scheduleevent $scheduleevent): self
  110.     {
  111.         if (!$this->scheduleevents->contains($scheduleevent)) {
  112.             $this->scheduleevents->add($scheduleevent);
  113.             $scheduleevent->setSchedule($this);
  114.         }
  115.         return $this;
  116.     }
  117.     public function removeScheduleevent(Scheduleevent $scheduleevent): self
  118.     {
  119.         if ($this->scheduleevents->removeElement($scheduleevent)) {
  120.             // set the owning side to null (unless already changed)
  121.             if ($scheduleevent->getSchedule() === $this) {
  122.                 $scheduleevent->setSchedule(null);
  123.             }
  124.         }
  125.         return $this;
  126.     }
  127.     public function getSlug()
  128.     {
  129.         return $this->slug;
  130.     }
  131.     public function setSlug($slug)
  132.     {
  133.         $this->slug $slug;
  134.     }
  135.     function getDayName($dayNumber) {
  136.         // Vérifie si le jour est entre 1 et 7
  137.         if ($dayNumber || $dayNumber 7) {
  138.             return "Jour invalide";
  139.         }
  140.         // Utilise strftime() pour obtenir le nom du jour en français
  141.         setlocale(LC_TIME'fr_FR.utf8'); // Configuration de la localisation en français
  142.         return strftime('%A'strtotime("Sunday +{$dayNumber} days"));
  143.     }
  144.     public function isCurrent(): bool
  145.     {
  146.         $today = new \DateTime(); // Crée un objet DateTime représentant aujourd'hui
  147.         // Vérifie si la date d'aujourd'hui est entre startAt et endAt
  148.         return $today >= $this->startAt && $today <= $this->endAt;
  149.     }
  150.     public function __toString(){
  151.         return $this->getStartAt()->format('d/m/Y').' - '.$this->getEndAt()->format('d/m/Y');
  152.     }
  153.     public function getScheduleItemsDay(int $day)
  154.     {
  155.         $items=new ArrayCollection();
  156.         foreach ($this->scheduleitems as $item){
  157.             if($item->getDay()== $day$items->add($item);
  158.         }
  159.         return $items;
  160.     }
  161.     public function getScheduleEventsDay(int $day)
  162.     {
  163.         $items=new ArrayCollection();
  164.         foreach ($this->scheduleevents as $item){
  165.             if($item->getDay()== $day$items->add($item);
  166.         }
  167.         return $items;
  168.     }
  169.     public function getLevel(){
  170.         return match ($this->semester) {
  171.             'Semester 2''Semester 1' => '1ère année',
  172.             'Semester 3''Semester 4' => '2ème année',
  173.             'Semester 5''Semester 6' => '3ème année',
  174.             default => '',
  175.         };
  176.     }
  177.     public function getWeeks()
  178.     {
  179.         $startAt=$this->getStartAt();
  180.         $endAt=$this->getEndAt();
  181.         $weeks = [];
  182.         $currentStart $startAt// Pas besoin de clone car DateTimeImmutable est immuable
  183.         while ($currentStart <= $endAt) {
  184.             // Calculer la fin de la semaine (jusqu'à samedi ou endAt)
  185.             $currentEnd $currentStart->modify('next saturday');
  186.             // Si la date de fin dépasse la vraie date de fin (endAt), on ajuste
  187.             if ($currentEnd $endAt) {
  188.                 $currentEnd $endAt;
  189.             }
  190.             // Ajouter la période dans le tableau des semaines
  191.             $weeks[] = [
  192.                 'startAt' => $currentStart,
  193.                 'endAt' => $currentEnd
  194.             ];
  195.             // Passer à la semaine suivante (lundi)
  196.             $currentStart $currentEnd->modify('+2 day');
  197.         }
  198.         return $weeks;
  199.     }
  200.     public function getMonths(): array
  201.     {
  202.         $startAt=$this->getStartAt();
  203.         $endAt=$this->getEndAt();
  204.         $months = [];
  205.         $currentStart $startAt;
  206.         while ($currentStart <= $endAt) {
  207.             // Déterminer le dernier jour du mois en cours
  208.             $currentEnd $currentStart->modify('last day of this month');
  209.             // Si le dernier jour calculé dépasse la date de fin (endAt), on ajuste
  210.             if ($currentEnd $endAt) {
  211.                 $currentEnd $endAt;
  212.             }
  213.             // Ajouter la période dans le tableau des mois
  214.             $months[] = [
  215.                 'startAt' => $currentStart,
  216.                 'endAt' => $currentEnd
  217.             ];
  218.             // Passer au premier jour du mois suivant
  219.             $currentStart $currentStart->modify('first day of next month');
  220.         }
  221.         return $months;
  222.     }
  223.     public function getSeances()
  224.     {
  225.         $allSeances = [];
  226.         // Parcourir chaque ScheduleItem
  227.         foreach ($this->getScheduleItems() as $scheduleItem) {
  228.             // Ajouter chaque séance de ScheduleItem à la collection $allSeances
  229.             foreach ($scheduleItem->getSeances() as $seance) {
  230.                 $allSeances[]=$seance;
  231.             }
  232.         }
  233.         usort($allSeances, function($a$b) {
  234.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a->getTakesplaceOn()->format('d-m-Y').' '.$a->getStartAt());
  235.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b->getTakesplaceOn()->format('d-m-Y').' '.$b->getStartAt());
  236.             return $dateA <=> $dateB;
  237.         });
  238.         return $allSeances;
  239.     }
  240.     public function getSeancesCancelled()
  241.     {
  242.         $allSeances = [];
  243.         foreach ($this->getScheduleItems() as $scheduleItem) {
  244.             foreach ($scheduleItem->getSeancesCancelled() as $seance ) {
  245.                 $allSeances[] = ['scheduleitem'=>$scheduleItem'seanceDate'=>$seance];
  246.             }
  247.         }
  248.         usort($allSeances, function($a$b) {
  249.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a['seanceDate'].' '.$a['scheduleitem']->getStartAt());
  250.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b['seanceDate'].' '.$b['scheduleitem']->getStartAt());
  251.             return $dateA <=> $dateB;
  252.         });
  253.         return $allSeances;
  254.     }
  255.     public function getSeancesNotCreate()
  256.     {
  257.         $allSeances = [];
  258.         foreach ($this->getScheduleItems() as $scheduleItem) {
  259.             foreach ($scheduleItem->getSeancesNotCreate() as $seance ) {
  260.                 $allSeances[] = ['scheduleitem'=>$scheduleItem'seanceDate'=>$seance];
  261.             }
  262.         }
  263.         usort($allSeances, function($a$b) {
  264.             $dateA DateTime::createFromFormat('d-m-Y H:i'$a['seanceDate'].' '.$a['scheduleitem']->getStartAt());
  265.             $dateB DateTime::createFromFormat('d-m-Y H:i'$b['seanceDate'].' '.$b['scheduleitem']->getStartAt());
  266.             return $dateA <=> $dateB;
  267.         });
  268.         return $allSeances;
  269.     }
  270.     public function isWeekly(): bool
  271.     {
  272.         if ($this->startAt === null || $this->endAt === null) {
  273.             return false// Si une des deux dates est absente, on considère que ce n'est pas une période valide.
  274.         }
  275.         // Calcul de la différence entre les deux dates
  276.         $interval $this->startAt->diff($this->endAt);
  277.         // Vérifier si la différence est inférieure ou égale à 7 jours
  278.         return $interval->days <= 7;
  279.     }
  280. }