src/Controller/CalendarController.php line 99

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\CalendarRepository;
  4. use App\Repository\BookedActivityRepository;
  5. use App\Entity\Main\Calendar;
  6. use App\Entity\Main\Formule;
  7. use App\Entity\Main\Activity;
  8. use App\Entity\Main\BookedActivity;
  9. use App\Entity\Main\ActivityUnavailableSlot;
  10. use App\Entity\Main\OperatorBooking;
  11. use App\Entity\Main\Promos;
  12. use App\Entity\Main\Reservation;
  13. use App\Service\SessionService;
  14. use App\Service\Tools;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use ICal\ICal;
  21. class CalendarController extends AbstractController {
  22.     private $pk 'hTgvcDsdkl5492Pifd4z8eMMLjds44z8d24dfsqsqHGzrdf5f'//Private Key (56f491261413b1f05ddfb33623c96b99)
  23.     public function __constructSessionService $ss) {
  24.         $this->ss $ss;
  25.     }
  26.     /**
  27.      * @Route("/fermetures", methods={"POST"}, name="booking_fermetures")
  28.      * Cette fonction permet de récupérer les fermetures annuelles
  29.      */
  30.     public function getFermetures(Request $request) {
  31.         /* POST Method */
  32.         // if(md5($this->pk) != $request->request->get('key'))    exit();
  33.         
  34.         $em $this->getDoctrine()->getManager();
  35.         $error '';
  36.         $today = new \DateTime($request->request->get('date'));
  37.     
  38.         /* on récupère les infos Calendar */
  39.         $disabledDates $em->getRepository(Calendar::class)->findDisabledDates($today);
  40.         $arrayDates = array();
  41.         $arrayHours = array();
  42.         
  43.         if (!$disabledDates) {
  44.             return new JsonResponse($arrayDatesJsonResponse::HTTP_CREATED);
  45.         } else {
  46.             foreach($disabledDates as $disabledDate)
  47.             {
  48.                 if(!$disabledDate[0]->getActivityClosed()) {
  49.                     if($disabledDate['to'] >= $today && $disabledDate['from']->diff($disabledDate['to'], true)->format('%a') > ) {
  50.                         $date = new \stdClass();
  51.                         $date->from $disabledDate['from']->format('Y-m-d');
  52.                         $date->to $disabledDate['to']->format('Y-m-d');
  53.                         $date->msg $disabledDate['msg'];
  54.                         $arrayDates[] = $date;
  55.                     }
  56.                     if($disabledDate['to'] >= $today && $disabledDate['from']->diff($disabledDate['to'], true)->format('%a') == 1
  57.                         || $disabledDate['to'] == $disabledDate['from'] && $disabledDate['to'] >= $today) {
  58.                         $date = new \stdClass();
  59.                         $date->from $disabledDate['from']->format('Y-m-d');
  60.                         $date->to $disabledDate['from']->format('Y-m-d');
  61.                         $date->msg $disabledDate['msg'];
  62.                         $arrayDates[] = $date;
  63.                     }
  64.                     if($disabledDate['to'] >= $today && $disabledDate['from']->diff($disabledDate['to'], true)->format('%a') < 1
  65.                         || $disabledDate['to'] == $disabledDate['from'] && $disabledDate['to'] <= $today && $disabledDate['from'] >= $today) {
  66.                         $date = new \stdClass();
  67.                         $date->from $disabledDate['from']->format('Y-m-d H:i');
  68.                         $date->to $disabledDate['to']->format('Y-m-d H:i');
  69.                         $date->msg $disabledDate['msg'];
  70.                         $arrayHours[] = $date;
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.         if ($error != '') {
  76.             return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
  77.         } else {
  78.             return new JsonResponse(['dates' => $arrayDates'hours' => $arrayHours], JsonResponse::HTTP_CREATED);        
  79.         }
  80.     }
  81.     /**
  82.      * @Route("/creneaux", methods={"POST"}, name="booking_creneaux")
  83.      * Cette fonction permet de récupérer tous les créneaux d'une activité
  84.      */
  85.     public function getCreneaux(Request $request) {
  86.         /* POST Method */
  87.         $data json_decode($request->request->get('data'));
  88.         // if(md5($this->pk) != $request->request->get('key'))    exit();
  89.         
  90.         $em $this->getDoctrine()->getManager();
  91.         $error '';
  92.         $dateTimeZone = new \DateTimeZone('Europe/Paris'); 
  93.         // $dateTimeZone = new \DateTimeZone('UTC'); 
  94.         $today = new \DateTime('now'$dateTimeZone);
  95.         $cart $this->ss->get();
  96.         $date $cart['date'];
  97.         $bookingDate = new \DateTime($date$dateTimeZone);
  98.         $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  99.         $dayName $formatter->format($bookingDate);
  100.         $dayTrueName $formatter->format($bookingDate);
  101.         
  102.         /* on récupère les infos Calendar du créneau */
  103.         $dateType $em->getRepository(Calendar::class)->findTypeByDate($bookingDate);
  104.         $dateTrueType "";
  105.         if ($dateType) {
  106.             $dayName $dateType[0]['type'];
  107.             $dateTrueType $dateType[0]['type'];
  108.         }
  109.         
  110.         $activity_id $data->activity;
  111.         $forfait_id $data->forfait;
  112.         $nbreparticipants $data->nbreparticipants;
  113.         
  114.         /*** Récupération des forfaits déjà réservés ***/
  115.         // if(isset($cart['forfaits']) && !empty($cart['forfaits'])) $forfaits = $cart['forfaits'];
  116.         if(isset($data->reservation->forfaits) && !empty($data->reservation->forfaits)) $forfaits $data->reservation->forfaits;
  117.         else $forfaits null;
  118.         if($forfaits) {
  119.             $creneauxBooked = array();
  120.             $quantityBooked 0;
  121.             foreach($forfaits as $forfait) {
  122.                 if($forfait) {
  123.                     $activites $forfait->activites;
  124.                     foreach($activites as $activity) {
  125.                         /*** Pour chaque forfait, on compile les créneaux réservés pour d'autres activités ***/
  126.                         if($activity->id != $activity_id) {
  127.                             $activityDatas = new \stdClass();
  128.                             if($activity->creneau) {
  129.                                 $activityDatas->creneau $bookingDate->format('Y-m-d').' '.$activity->creneau;
  130.                             } else {
  131.                                 $activityDatas->creneau null;
  132.                             }
  133.                             $activityBooked $em->getRepository(Activity::class)->find($activity->id);
  134.                             if($activityBooked instanceof Activity) {
  135.                                 $activityDatas->temps_activite $activityBooked->getTempsActivite();
  136.                             }
  137.                             $creneauxBooked[$activity->id] = $activityDatas;
  138.                         }
  139.                         /*** Pour chaque forfait, on vérifie le nombre de participants déjà réservés pour cette activité ***/
  140.                         if($activity->id == $activity_id$quantityBooked += $activity->quantity;
  141.                     }
  142.                 }
  143.             }
  144.         } else {
  145.             $creneauxBooked = array();
  146.             $quantityBooked 0;
  147.         }
  148.         
  149.         // On récupère les infos de l'activité pour créer les créneaux
  150.         $activityToBook $em->getRepository(Activity::class)->find($activity_id);
  151.         $unavailableSlot $em->getRepository(ActivityUnavailableSlot::class)->findOneBy(['date' => $bookingDate,'code_activity' => $activityToBook->getCode()]);
  152.         
  153.         if (!$activityToBook) {
  154.             $error 'no activity found : '$code;
  155.             return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
  156.         }
  157.         if($activityToBook instanceof Activity) {
  158.             $code $activityToBook->getCode();    
  159.             $data->is_creneau_activity $activityToBook->getIsCreneauActivity();
  160.             $data->block_room $activityToBook->getBlockRoom();
  161.             $data->temps_limite_resa $activityToBook->getTempsLimiteResa();
  162.             $data->jauge_mini $activityToBook->getJaugeMini();
  163.             $data->jauge_max_by_room $activityToBook->getJaugeMaxi();
  164.             $data->presence_avant $activityToBook->getPresenceAvant();
  165.             $data->espaces_jeu $activityToBook->getEspacesJeu();
  166.             $data->nbreparticipants $nbreparticipants;
  167.             $data->is_tarification_multiple $activityToBook->getIsTarificationMultiple();
  168.             $openingDays false;
  169.             $dayExceptionInfo false;
  170.             if( !empty($activityToBook->getOpeningDays()->toArray()) ) {
  171.                 $openingDays $activityToBook->getOpeningDays()->toArray();
  172.                 $dayExceptionInfo $this->checkDayOpening($openingDays,$dayTrueName,$dateTrueType);
  173.             }
  174.             if($activityToBook->getIsCreneauActivity()) {
  175.                 $data->jauge_maxi $activityToBook->getJaugeMaxi() * $activityToBook->getEspacesJeu();
  176.                 $data->temps_creneau $activityToBook->getTempsCreneau();
  177.                 if($activityToBook->getTempsActiviteJoueur() && $activityToBook->getTempsActiviteJoueur() > 0) {
  178.                     // $data->temps_de_jeu = $activityToBook->getTempsActiviteJoueur() * $nbreparticipants;
  179.                     $data->temps_de_jeu $activityToBook->getTempsActiviteJoueur();
  180.                 } else {
  181.                     $data->temps_de_jeu $activityToBook->getTempsActivite();
  182.                 }
  183.                 
  184.                 if($dayExceptionInfo) {
  185.                     $debutCreneau = new \DateTime($date ' ' $dayExceptionInfo->getOpeningTime()->format('H:i:s'), $dateTimeZone);
  186.                 } else {
  187.                     $debutCreneau = new \DateTime($date ' ' $activityToBook->getHeureOuvertureCreneau()->format('H:i:s'), $dateTimeZone);
  188.                 } 
  189.                 if($dayExceptionInfo) {
  190.                     $heureFermetureCreneau $dayExceptionInfo->getClosingTime();
  191.                 } else {
  192.                     $heureFermetureCreneau $activityToBook->getHeureFermetureCreneau();
  193.                 }
  194.                 if(!empty($activityToBook->getOpeningDays()->toArray()) && !$dayExceptionInfo) {
  195.                     $heureFermetureCreneau $debutCreneau;
  196.                 }
  197.                 if($heureFermetureCreneau->format('H') >= && $heureFermetureCreneau->format('H') <= 2) {
  198.                     $dv = new \DateInterval('P1D');
  199.                     $finCreneau = new \DateTime($date ' ' $heureFermetureCreneau->format('H:i:s'), $dateTimeZone);
  200.                     $finCreneau->add($dv);                    
  201.                 } else {
  202.                     $finCreneau = new \DateTime($date ' ' $heureFermetureCreneau->format('H:i:s'), $dateTimeZone);
  203.                 }
  204.                 
  205.                 $dv2 = new \DateInterval('PT'.$activityToBook->getTempsCreneau().'M');
  206.                 $finCreneau->add($dv2); // On ajoute en min le temps du jeu
  207.                 $tempsTotalCreneaux $debutCreneau->diff($finCreneau);
  208.                 $nbreCreneaux $tempsTotalCreneaux->60 $activityToBook->getTempsCreneau();
  209.                 $data->heure_debut $debutCreneau;
  210.                 $data->heure_fin $finCreneau;
  211.                 $data->temps_dispo $tempsTotalCreneaux->60;
  212.                 $data->nbre_creneaux $nbreCreneaux;
  213.                 
  214.                 $i 0;
  215.                 $data->creneaux = array();
  216.                 $sumQty = array();
  217.                                 
  218.                 // for($i = 0; $i < $nbreCreneaux; $i++) {
  219.                 //     $data->creneaux[$i] = array();
  220.                 //     $data->creneaux[$i]['places_dispo'] = $data->jauge_maxi;
  221.                 // }
  222.                                 
  223.                 for($i 0$i $nbreCreneaux$i++) {
  224.                     $data->creneaux[$i] = array();
  225.                     $dv4 = new \DateInterval('PT'.$activityToBook->getTempsCreneau() * $i.'M');
  226.                     $data->creneaux[$i]['heure_debut_utc'] = new \DateTime($data->heure_debut->format('Y-m-d H:i:s'), $dateTimeZone);
  227.                     $data->creneaux[$i]['heure_debut_utc']->add($dv4);
  228.                     if($today $data->creneaux[$i]['heure_debut_utc']) {
  229.                         unset($data->creneaux[$i]);
  230.                         continue; // Si résa le jour même, on ne charge pas les créneaux si la date et l'heure ont dépassé les créneaux de la journée
  231.                     }
  232.                     $data->creneaux[$i]['heure_debut'] = $data->creneaux[$i]['heure_debut_utc']->format('H\hi');
  233.                     $data->creneaux[$i]['reservable'] = true;
  234.                     /* on vérifie si le délai est suffisant pour réserver le créneau  */
  235.                     if($activityToBook->getTempsLimiteResa()) {
  236.                         $dv3 = new \DateInterval('PT'.$activityToBook->getTempsLimiteResa().'M');
  237.                     } else {
  238.                         $dv3 = new \DateInterval('PT'.($activityToBook->getTempsCreneau()*2).'M');
  239.                     }
  240.                     $bookingDelay = new \DateTime('now'$dateTimeZone);
  241.                     $bookingDelay->add($dv3); // On ajoute en min la limite de résa
  242.                     
  243.                     if($bookingDelay $data->creneaux[$i]['heure_debut_utc']) {
  244.                         $data->creneaux[$i]['reservable'] = false;                        
  245.                     }
  246.                     
  247.                     /* on bloque le créneau s'il est déjà réservé par le client pour une autre activité */
  248.                     if(is_array($creneauxBooked)) {
  249.                         foreach($creneauxBooked as $creneauReserve) {
  250.                             $delai1 = new \DateInterval('PT15M'); // On enlève 15min pour permettre aux clients d'arriver
  251.                             $creneauNonReservable = new \DateTime($creneauReserve->creneau$dateTimeZone);
  252.                             $creneauNonReservable->sub($delai1); 
  253.                             // dump($creneauReserve->temps_activite);
  254.                             if($creneauReserve->temps_activite) {
  255.                                 $temps intval(intval($creneauReserve->temps_activite) * 1.5);
  256.                                 $delai2 = new \DateInterval('PT'.$temps.'M'); // On ajoute 50% de temps en plus du temps d'activité pour le temps minimum avant de pouvoir réserver un autre créneau    
  257.                             } else {
  258.                                 $delai2 = new \DateInterval('PT75M'); // On ajoute 75 min pour le temps minimum avant de pouvoir réserver un autre créneau
  259.                             }
  260.                             // dump($delai2);
  261.                             
  262.                             
  263.                             $finCreneauNonReservable = new \DateTime($creneauReserve->creneau$dateTimeZone);
  264.                             $finCreneauNonReservable->add($delai2); 
  265.                             
  266.                             if( $data->creneaux[$i]['heure_debut_utc'] >= $creneauNonReservable && $data->creneaux[$i]['heure_debut_utc'] <= $finCreneauNonReservable ) {
  267.                                 $data->creneaux[$i]['reservable'] = false;                        
  268.                             }            
  269.                         }
  270.                     }
  271.                     /* on vérifie les places déjà réservées pour ce créneau */
  272.                     if($i < ($nbreCreneaux-1)) {
  273.                         $next_creneau = new \DateTime($data->creneaux[$i]['heure_debut_utc']->format('H:i:s'));
  274.                         $next_creneau->add(new \DateInterval('PT'.$data->temps_creneau.'M')); 
  275.                     }
  276.                     else $next_creneau = new \DateTime('23:59:00'); 
  277.                     $bookedActivity $em->getRepository(BookedActivity::class)
  278.                                             ->findSumQuantityBooked$code
  279.                                                                     $data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'), 
  280.                                                                     $data->creneaux[$i]['heure_debut_utc']->format('H:i:s'));
  281.                     $operatorBooked $em->getRepository(OperatorBooking::class)
  282.                                             ->findSumQuantityBooked$code
  283.                                                                     $data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'), 
  284.                                                                     $next_creneau
  285.                                                                     $data->creneaux[$i]['heure_debut_utc']);
  286.                     $sumQty[$i] = !isset($sumQty[$i]) ? $sumQty[$i];
  287.                     $sumActivityBooked 0;
  288.                     $ignoredCreneau false;
  289.                     if($activityToBook->getTempsCreneau() != $activityToBook->getTempsCreneauReel()
  290.                         && $activityToBook->getIgnoredCreneau()
  291.                     ) {
  292.                         $ignoredCreneau = new \DateTime($activityToBook->getIgnoredCreneau()->format('H:i:s'));
  293.                     }
  294.                     $activitiesBooked array_merge($bookedActivity,$operatorBooked);
  295.                     foreach($activitiesBooked as $activityBooked) {
  296.                         if( $activityBooked instanceof OperatorBooking && !$activityBooked->isDeleted() && ( $ignoredCreneau && $activityBooked->getCreneau()->format('i') != $ignoredCreneau->format('i') || !$ignoredCreneau)
  297.                             || $activityBooked instanceof BookedActivity && $activityBooked->getReservation()->getActive()) 
  298.                         {
  299.                             if($activityBooked instanceof OperatorBooking
  300.                                 $qtyActivityBooked $activityBooked->getQuantity();
  301.                             else 
  302.                                 $qtyActivityBooked $activityBooked->getQuantity() / $activityBooked->getNbreParties();
  303.                             for ($j=0$j $activityBooked->getNbreParties(); $j++) { 
  304.                                 if( $data->block_room ) {
  305.                                     $qtyRoom intval(ceil($qtyActivityBooked intval($data->jauge_max_by_room)));
  306.                                     $sumActivityBooked += $qtyRoom;
  307.                                     // if($i + (1*$j) == 2) dd($data->temps_de_jeu, $data->temps_creneau);
  308.                                     if( ($data->temps_de_jeu $qtyActivityBooked) > $data->temps_creneau && $activityToBook->getTempsActiviteJoueur()) {
  309.                                         if( !isset($sumQty[$i + (2*$j)]) ) $sumQty[$i + (2*$j)] = 0;
  310.                                         $sumQty[$i + (2*$j)] += ( $qtyRoom intval($data->jauge_max_by_room) );
  311.                                         if( !isset($sumQty[$i + (2*$j) + 1]) ) $sumQty[$i + (2*$j) + 1] = 0;
  312.                                         $sumQty[$i + (2*$j) + 1] += ( $qtyRoom intval($data->jauge_max_by_room) );
  313.                                     } elseif( $data->temps_de_jeu $data->temps_creneau) {
  314.                                         if( !isset($sumQty[$i + (2*$j)]) ) $sumQty[$i + (2*$j)] = 0;
  315.                                         $sumQty[$i + (2*$j)] += ( $qtyRoom intval($data->jauge_max_by_room) );
  316.                                         if( !isset($sumQty[$i + (2*$j) + 1]) ) $sumQty[$i + (2*$j) + 1] = 0;
  317.                                         $sumQty[$i + (2*$j) + 1] += ( $qtyRoom intval($data->jauge_max_by_room) );
  318.                                     } else {
  319.                                         if( !isset($sumQty[$i + (1*$j)]) ) $sumQty[$i + (1*$j)] = 0;
  320.                                         $sumQty[$i + (1*$j)] += ( $qtyRoom intval($data->jauge_max_by_room) );
  321.                                     }
  322.                                     // $data->temps_de_jeu
  323.                                 } else {
  324.                                     $sumActivityBooked += 1;
  325.                                     if( !isset($sumQty[$i + (1*$j)]) ) $sumQty[$i + (1*$j)] = 0;
  326.                                     $sumQty[$i + (1*$j)] += $qtyActivityBooked;
  327.                                 }
  328.                             }
  329.                         }
  330.                     }
  331.                     // foreach($operatorBooked as $activityBooked) {
  332.                     //     if(!$activityBooked->isDeleted() && ( $ignoredCreneau && $activityBooked->getCreneau()->format('i') != $ignoredCreneau->format('i') || !$ignoredCreneau)) {
  333.                     //         $sumActivityBooked += 1;
  334.                     //         $sumQty[$i] += $activityBooked->getQuantity();
  335.                     //     } elseif(!$activityBooked->isDeleted()) {
  336.                     //         $sumActivityBooked += 1;
  337.                     //         $sumQty[$i] += $activityBooked->getQuantity();
  338.                     //     }
  339.                     // }
  340.                     // if($data->creneaux[$i]['heure_debut_utc']->format('H:i') == '13:00') dd($sumQty[$i],$operatorBooked);
  341.                     // ################################################################################################
  342.                     // ################################################################################################
  343.                     // TO-DO /!\ WARNING 
  344.                     // ################################################################################################
  345.                     // ################################################################################################
  346.                     
  347.                     if($unavailableSlot) {
  348.                         $unavailableSlotNb $unavailableSlot->getSlotUnavailable();
  349.                         $sumActivityBooked += 1;
  350.                         if ($activityToBook->getBlockRoom()) {
  351.                             if($activityToBook->getEspacesJeuReel() && $activityToBook->getEspacesJeuReel() != $activityToBook->getEspacesJeu()) {
  352.                                 $espacesJeu $activityToBook->getEspacesJeu();
  353.                                 $espacesJeuReel $activityToBook->getEspacesJeuReel();
  354.                                 $jaugeMaxi $activityToBook->getJaugeMaxi();
  355.                                 $jaugeMaxiReel $jaugeMaxi;
  356.                                 // $jaugeMaxiReel = $activityToBook->getJaugeMaxiReel() ? $activityToBook->getJaugeMaxiReel() : $jaugeMaxi;
  357.                                 if($activityToBook->getJaugeMaxiReel())
  358.                                 $sumQty[$i] += ($unavailableSlotNb $jaugeMaxi - (($jaugeMaxiReel $espacesJeuReel) - ($jaugeMaxi $espacesJeu)));
  359.                             } else {
  360.                                 $sumQty[$i] += $unavailableSlotNb $activityToBook->getJaugeMaxi();
  361.                             }
  362.                         } else {
  363.                             if($activityToBook->getJaugeMaxiReel() && $activityToBook->getJaugeMaxiReel() != $activityToBook->getJaugeMaxi()) {
  364.                                 $jaugeMaxi $activityToBook->getJaugeMaxi();
  365.                                 $jaugeMaxiReel $activityToBook->getJaugeMaxiReel();
  366.                                 $sumQty[$i] += $unavailableSlotNb - ($jaugeMaxiReel $jaugeMaxi);
  367.                             } else {
  368.                                 $sumQty[$i] += $unavailableSlotNb;
  369.                             }
  370.                         }
  371.                     }
  372.                     // ################################################################################################
  373.                     // ################################################################################################
  374.                     // ################################################################################################
  375.                     if($data->block_room && intval($sumQty[$i]) > 0) {
  376.                         if($data->espaces_jeu $sumActivityBooked) {
  377.                             $data->creneaux[$i]['places_dispo'] = (intval($data->jauge_maxi) - intval($sumQty[$i])) - ((intval($data->jauge_maxi) - intval($sumQty[$i])) % intval($data->jauge_max_by_room));
  378.                             // if($i == 3 ) dd($sumQty[$i], $data->espaces_jeu, $sumActivityBooked );
  379.                         } else {
  380.                             $data->creneaux[$i]['places_dispo'] = 0;
  381.                         }
  382.                         // $data->creneaux[$i]['places_dispo'] = intval($data->jauge_maxi);
  383.                     } else {
  384.                         $data->creneaux[$i]['places_dispo'] = intval($data->jauge_maxi) - intval($sumQty[$i]);
  385.                     }
  386.                     
  387.                     //TO-DO : à vérifier sur les pass Journée
  388.                     if($data->creneaux[$i]['places_dispo'] < $data->nbreparticipants $quantityBooked) {
  389.                         $data->creneaux[$i]['reservable'] = false;                        
  390.                     }
  391.                     /* on récupère les infos Calendar pour les dates et créneaux de fermetures */
  392.                     $disabledDates $em->getRepository(Calendar::class)->findDisabledDates($today);
  393.                     
  394.                     if($disabledDates) {
  395.                         foreach($disabledDates as $disabledDate) {
  396.                             if($disabledDate[0]->getActivityClosed()) $activityClosed $disabledDate[0]->getActivityClosed();
  397.                             else $activityClosed '';
  398.                             
  399.                             if($data->creneaux[$i]['heure_debut_utc'] >= $disabledDate['from'] && $data->creneaux[$i]['heure_debut_utc'] < $disabledDate['to'] && $activityClosed == '') {
  400.                                 $data->creneaux[$i]['reservable'] = false;
  401.                             } else if($data->creneaux[$i]['heure_debut_utc'] >= $disabledDate['from'] && $data->creneaux[$i]['heure_debut_utc'] < $disabledDate['to'] && $activityClosed == $code) {
  402.                                 $data->creneaux[$i]['reservable'] = false;
  403.                             }
  404.                         }
  405.                     }                
  406.                     /* on récupère les infos Calendar du créneau */
  407.                     $dateType $em->getRepository(Calendar::class)->findTypeByDate($data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'));
  408.                     
  409.                     if($dateType) {
  410.                         $data->creneaux[$i]['type'] = $dateType[0]['type'];
  411.                     } else {
  412.                         $data->creneaux[$i]['type'] = null;
  413.                     }
  414.                     
  415.                     /* on récupère le tarif pour ce créneau */
  416.                     $day = new \DateTime($data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'), $dateTimeZone);
  417.                     $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  418.                     $dayName $formatter->format($day);
  419.                     
  420.                     if($data->creneaux[$i]['type'] != null) {
  421.                         $dayName $dateType[0]['type'];
  422.                     } else {
  423.                         $data->creneaux[$i]['type'] = $dayName;
  424.                     }
  425.                     /******** PROMOS *********/
  426.                     /* On récupère les conditions de la promotion si elle existe */
  427.                     $promo $em->getRepository(Promos::class)
  428.                                 ->findPromosByCreneau(    $data->creneaux[$i]['heure_debut_utc']->format('H:i:s'),
  429.                                                         $bookingDate,
  430.                                                         $dayName
  431.                                                         $forfait_id
  432.                                                     );
  433.                     if($promo) {
  434.                         $data->creneaux[$i]['promo'] = true;
  435.                     } else {
  436.                         $data->creneaux[$i]['promo'] = false;                        
  437.                     }
  438.                     
  439.                 }
  440.             } else {
  441.                 /* on récupère les infos Calendar du créneau */
  442.                 $dateType $em->getRepository(Calendar::class)->findTypeByDate($bookingDate->format('Y-m-d'));
  443.                             
  444.                 /* on récupère le tarif pour ce créneau */
  445.                 $day = new \DateTime($bookingDate->format('Y-m-d'), $dateTimeZone);
  446.                 $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  447.                 $dayName $formatter->format($day);
  448.                 
  449.                 if($dateType) {
  450.                     $dayName $dateType[0]['type'];
  451.                 } 
  452.                 
  453.                 $data->type $dayName;    
  454.             }
  455.         }
  456.         if ($error != '') {
  457.             return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
  458.         } else {
  459.             return new JsonResponse($dataJsonResponse::HTTP_CREATED);            
  460.         }
  461.     }
  462.     /**
  463.      * @Route("/creneaux_formules", methods={"POST"}, name="booking_creneauxformules")
  464.      * Cette fonction permet de récupérer tous les créneaux d'une activité
  465.      */
  466.     public function getCreneauxFormules(Request $request)
  467.     {
  468.         /* POST Method */
  469.         $data json_decode($request->request->get('data'));
  470.         // if(md5($this->pk) != $request->request->get('key'))    exit();
  471.         
  472.         $em $this->getDoctrine()->getManager();
  473.         $error '';
  474.         $dateTimeZone = new \DateTimeZone('Europe/Paris'); 
  475.         $today = new \DateTime('now'$dateTimeZone);
  476.         $date $data->date;
  477.         if(strpos($date'/') !== false) {
  478.             $date_temp explode('/',$date);
  479.             $date $date_temp[2].'-'.$date_temp[1].'-'.$date_temp[0];
  480.         }
  481.         $bookingDate = new \DateTime($date$dateTimeZone);
  482.         $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  483.         $dayName $formatter->format($bookingDate);
  484.         
  485.         /* on récupère les infos Calendar du créneau */
  486.         $dateType $em->getRepository(Calendar::class)->findTypeByDate($bookingDate);
  487.         
  488.         if ($dateType) {
  489.             $dayName $dateType[0]['type'];
  490.         }
  491.         $formule_id $data->formule_id;
  492.         $formule_code $data->formule_code;    
  493.         /*** On récupère les infos de la formule pour créer les créneaux ***/
  494.         $formuleToBook $em->getRepository(Formule::class)->find($formule_id);
  495.         
  496.         if (!$formuleToBook) {
  497.             $error 'no formule found : '$formule_id;
  498.             return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
  499.         }
  500.         if($formuleToBook instanceof Formule)
  501.         {        
  502.             $code $formuleToBook->getCode();    
  503.             $data->is_creneau_activity $formuleToBook->getIsCreneauActivity();
  504.             if($data->is_creneau_activity)
  505.             {
  506.                 $data->nbre_maxi $formuleToBook->getNbreMaxi();
  507.                 $data->temps_creneau $formuleToBook->getTempsCreneau();
  508.                 
  509.                 $debutCreneau = new \DateTime($date ' ' $formuleToBook->getHeureOuvertureCreneau()->format('H:i:s'), $dateTimeZone);
  510.                 if($formuleToBook->getHeureFermetureCreneau()->format('H') >= && $formuleToBook->getHeureFermetureCreneau()->format('H') <= 2
  511.                 {
  512.                     $dv = new \DateInterval('P1D');
  513.                     $finCreneau = new \DateTime($date ' ' $formuleToBook->getHeureFermetureCreneau()->format('H:i:s'), $dateTimeZone);
  514.                     $finCreneau->add($dv);
  515.                 } else {
  516.                     $finCreneau = new \DateTime($date ' ' $formuleToBook->getHeureFermetureCreneau()->format('H:i:s'), $dateTimeZone);
  517.                 }
  518.                 
  519.                 $dv2 = new \DateInterval('PT'.$data->temps_creneau.'M');
  520.                 $finCreneau->add($dv2); // On ajoute en min le temps du jeu
  521.                 $tempsTotalCreneaux $debutCreneau->diff($finCreneau);
  522.                 $nbreCreneaux $tempsTotalCreneaux->60 $data->temps_creneau;
  523.                 $data->heure_debut $debutCreneau;
  524.                 $data->heure_fin $finCreneau;
  525.                 $data->temps_dispo $tempsTotalCreneaux->60;
  526.                 $data->nbre_creneaux $nbreCreneaux;
  527.                 
  528.                 $i 0;
  529.                 $data->creneaux = array();
  530.                                 
  531.                 for($i 0$i <= $nbreCreneaux$i++) {
  532.                     $data->creneaux[$i] = array();
  533.                     $dv4 = new \DateInterval('PT'.$data->temps_creneau $i.'M');
  534.                     $data->creneaux[$i]['heure_debut_utc'] = new \DateTime($data->heure_debut->format('Y-m-d H:i:s'), $dateTimeZone);
  535.                     $data->creneaux[$i]['heure_debut_utc']->add($dv4);
  536.                     if($today $data->creneaux[$i]['heure_debut_utc']) {
  537.                         unset($data->creneaux[$i]);
  538.                         continue; // Si résa le jour même, on ne charge pas les créneaux si la date et l'heure ont dépassé les créneaux de la journée
  539.                     }
  540.                     $data->creneaux[$i]['heure_debut'] = $data->creneaux[$i]['heure_debut_utc']->format('H\hi');
  541.                     $data->creneaux[$i]['reservable'] = true;
  542.                     /* on vérifie si le délai est suffisant pour réserver le créneau  */
  543.                     $dv3 = new \DateInterval('PT'.$formuleToBook->getTempsLimiteResa().'M');
  544.                     $bookingDelay = new \DateTime('now'$dateTimeZone);
  545.                     $bookingDelay->add($dv3); // On ajoute en min la limite de résa
  546.                     
  547.                     if($bookingDelay $data->creneaux[$i]['heure_debut_utc']) {
  548.                         $data->creneaux[$i]['reservable'] = false;
  549.                     }
  550.                     
  551.                     /* on vérifie les places déjà réservées pour ce créneau */
  552.                     $nbre_resa count($em->getRepository(Reservation::class)->findByCodeAndDate($formule_code$data->creneaux[$i]['heure_debut_utc']));
  553.                 
  554.                     $data->creneaux[$i]['places_dispo'] = intval($data->nbre_maxi) - intval($nbre_resa);
  555.                     if($data->creneaux[$i]['places_dispo'] <= 0) {
  556.                         $data->creneaux[$i]['reservable'] = false;
  557.                     }                    
  558.                     /* on récupère les infos Calendar du créneau */
  559.                     $dateType $em->getRepository(Calendar::class)->findTypeByDate($data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'));
  560.                     
  561.                     if($dateType) {
  562.                         $data->creneaux[$i]['type'] = $dateType[0]['type'];
  563.                     } else $data->creneaux[$i]['type'] = null;
  564.                     
  565.                     /* on récupère le tarif pour ce créneau */
  566.                     $day = new \DateTime($data->creneaux[$i]['heure_debut_utc']->format('Y-m-d'), $dateTimeZone);
  567.                     $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  568.                     $dayName $formatter->format($day);
  569.                     
  570.                     if($data->creneaux[$i]['type'] != null) {
  571.                         $dayName $dateType[0]['type'];
  572.                     } else {
  573.                         $data->creneaux[$i]['type'] = $dayName;
  574.                     }
  575.                     // /******** PROMOS *********/
  576.                     //TO-DO : vérifier si un forfait anniversaire est en promo sur le créneau
  577.                     // /* On récupère les conditions de la promotion si elle existe */
  578.                     // $promo = $em->getRepository(Promos::class)->findPromosByCreneau(    $data->creneaux[$i]['heure_debut_utc']->format('H:i:s'),
  579.                                                                                     // $bookingDate,
  580.                                                                                     // $dayName, 
  581.                                                                                     // $forfait_id
  582.                                                                                     // );
  583.                     // if($promo) {
  584.                         // $data->creneaux[$i]['promo'] = true;
  585.                     // } else {
  586.                         // $data->creneaux[$i]['promo'] = false;                        
  587.                     // }
  588.                 }
  589.             } else {
  590.                 /* on récupère les infos Calendar du créneau */
  591.                 $dateType $em->getRepository(Calendar::class)->findTypeByDate($bookingDate->format('Y-m-d'));
  592.                             
  593.                 /* on récupère le tarif pour ce créneau */
  594.                 $day = new \DateTime($bookingDate->format('Y-m-d'), $dateTimeZone);
  595.                 $formatter = new \IntlDateFormatter('fr_FR'NULLNULL$dateTimeZoneNULL'EEEE');
  596.                 $dayName $formatter->format($day);
  597.                 
  598.                 if($dateType) {
  599.                     $dayName $dateType[0]['type'];
  600.                 } 
  601.                 $data->type $dayName;                
  602.             }
  603.         }
  604.         if ($error != '') {
  605.             return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
  606.         } else {
  607.             return new JsonResponse($dataJsonResponse::HTTP_CREATED);            
  608.         }
  609.     }
  610.     /**
  611.      * @Route("/cron_calendar", name="calendar_cron", methods={"GET"})
  612.      */
  613.     public function cron(Request $requestCalendarRepository $calendarRepository): Response
  614.     {
  615.         $url = array();
  616.         $url['vacances'] = 'https://fr.ftp.opendatasoft.com/openscol/fr-en-calendrier-scolaire/Zone-A.ics'//Abonnement aux périodes de vacances N+1
  617.         // $url['feries'] = 'https://www.thunderbird.net/media/caldata/FrenchHolidays.ics'; //Fichier ICS jours fériés jusqu'en 2030
  618.         $url['feries'] = 'https://ical-holidays.com/fr/jour-ferie/france/2024/calendar'//Fichier ICS jours fériés jusqu'en 2030
  619.         
  620.         $dateTimeZone = new \DateTimeZone('Europe/Paris'); 
  621.         $today = new \DateTime('now'$dateTimeZone);
  622.         $year intval($today->format("Y"));
  623.         $em $this->getDoctrine()->getManager();
  624.         // var_dump('plop');
  625.         /* POST Method */
  626.         // if(md5($this->pk) == $request->query->get('key')) {
  627.             
  628.             /* Suppression de tous les enregistrements */
  629.             $results $calendarRepository->findBy(['type' => 'vacances']);
  630.             foreach($results as $calendar) {
  631.                 $em->remove($calendar);
  632.             }
  633.             $results $calendarRepository->findBy(['type' => 'veille']);
  634.             foreach($results as $calendar) {
  635.                 $em->remove($calendar);
  636.             }            
  637.             $results $calendarRepository->findBy(['type' => 'feries']);
  638.             foreach($results as $calendar) {
  639.                 $em->remove($calendar);
  640.             }            
  641.             
  642.             /**************************************/            
  643.             /* récupération des dates de vacances */
  644.             /**************************************/
  645.             $ical = new ICal();
  646.             $ical->initUrl($url['vacances']);
  647.             $fromDateSummer = array(); //Vacances d'été
  648.             $toDateSummer = array(); //Vacances d'été
  649.             
  650.             foreach($ical->events() as $event) {
  651.                 
  652.                 $fromDate = new \DateTime($event->dtstart$dateTimeZone);
  653.                 $annee $fromDate->format("Y");
  654.                 
  655.                 if(isset($event->dtend) && $event->dtend != "")
  656.                     $toDate = new \DateTime($event->dtend$dateTimeZone);
  657.                 else
  658.                     $toDate $fromDate;
  659.                 
  660.                 if ($fromDate >= $today && Tools::str2url($event->description) != "prerentree-des-enseignants")
  661.                 {
  662.                     if(Tools::str2url($event->description) != "vacances-d-ete" && Tools::str2url($event->description) != "rentree-scolaire-des-eleves")
  663.                     {
  664.                         $calendar = new Calendar;
  665.                         $calendar->setDesignation(Tools::str2url($event->description));
  666.                         $calendar->setType('vacances');
  667.                         $calendar->setFromDate($fromDate);
  668.                         $calendar->setToDate($toDate);
  669.                         $calendar->setPriority(1); // Vacances en priorité 1 pour l'application des tarifs
  670.                         
  671.                         if(!$calendarRepository->findOneBy(['from_date' => $fromDate'to_date' => $toDate'type' => 'vacances'])) { 
  672.                             $em->persist($calendar);
  673.                             $em->flush();
  674.                         }
  675.                         
  676.                         /* ajout de la veille */
  677.                         $dv = new \DateInterval('P1D');
  678.                         $veilleDate = new \DateTime($event->dtstart$dateTimeZone);
  679.                         $veilleDate->sub($dv); // On enlève un jour
  680.                         $toDateVeille = new \DateTime($event->dtstart$dateTimeZone);
  681.                         
  682.                         $veille = new Calendar;
  683.                         $veille->setDesignation("Veille : ".$event->description);
  684.                         $veille->setType('veille');
  685.                         $veille->setFromDate($veilleDate);
  686.                         $veille->setToDate($toDateVeille);
  687.                         $veille->setPriority(3); // Veilles de vacances en priorité 3 pour l'application des tarifs
  688.                         
  689.                         $em->persist($veille);
  690.                         $em->flush();
  691.                         
  692.                     }
  693.                 }
  694.                 
  695.                 if(Tools::str2url($event->description) == "vacances-d-ete"$fromDateSummer[$annee] = $event->dtstart;
  696.                 if(Tools::str2url($event->description) == "rentree-scolaire-des-eleves"$toDateSummer[$annee] = $event->dtstart;
  697.             }
  698.             
  699.             /* Vacances d'été */
  700.             for($i $year$i <= $year 1$i++) {
  701.                 if(isset($fromDateSummer[$i]) && $fromDateSummer[$i] != "")
  702.                 {
  703.                     $fromDate = new \DateTime($fromDateSummer[$i], $dateTimeZone);
  704.                     
  705.                     $calendar = new Calendar;
  706.                     $calendar->setDesignation("Vacances d'été");
  707.                     $calendar->setType('vacances');
  708.                     $calendar->setFromDate($fromDate);
  709.                     $calendar->setPriority(1); // Vacances en priorité 1 pour l'application des tarifs
  710.                     if(isset($toDateSummer[$i]) && $toDateSummer[$i] != "") {
  711.                         $toDate = new \DateTime($toDateSummer[$i], $dateTimeZone);
  712.                         $calendar->setToDate($toDate);
  713.                     } else {
  714.                         $calendar->setToDate(new \DateTime($i.'-08-31'$dateTimeZone));
  715.                     }
  716.                     
  717.                     $em->persist($calendar);
  718.                     $em->flush();
  719.                     
  720.                     /* ajout de la veille */                
  721.                     $dv = new \DateInterval('P1D');
  722.                     $veilleDate = new \DateTime($fromDateSummer[$i], $dateTimeZone);
  723.                     $veilleDate->sub($dv); // On enlève un jour
  724.                     $toDateVeille = new \DateTime($fromDateSummer[$i], $dateTimeZone);
  725.                     
  726.                     $veille = new Calendar;
  727.                     $veille->setDesignation("Veille : Vacances d'été");
  728.                     $veille->setType('veille');
  729.                     $veille->setFromDate($veilleDate);
  730.                     $veille->setToDate($toDateVeille);
  731.                     $veille->setPriority(3); // Veilles de vacances en priorité 3 pour l'application des tarifs
  732.                     
  733.                     $em->persist($veille);
  734.                     $em->flush();            
  735.                 } else {
  736.                     $calendar = new Calendar;
  737.                     $calendar->setDesignation("Vacances d'été");
  738.                     $calendar->setType('vacances');
  739.                     $calendar->setFromDate(new \DateTime($i.'-07-01'$dateTimeZone));
  740.                     $calendar->setToDate(new \DateTime($i.'-08-31'$dateTimeZone));
  741.                     $calendar->setPriority(1); // Vacances en priorité 1 pour l'application des tarifs
  742.                     
  743.                     $em->persist($calendar);
  744.                     $em->flush();
  745.                     
  746.                     /* ajout de la veille */
  747.                     $dv = new \DateInterval('P1D');
  748.                     $veilleDate = new \DateTime($i.'-07-01'$dateTimeZone);
  749.                     $veilleDate->sub($dv); // On enlève un jour
  750.                     
  751.                     $veille = new Calendar;
  752.                     $veille->setDesignation("Veille : Vacances d'été");
  753.                     $veille->setType('veille');
  754.                     $veille->setFromDate($veilleDate);
  755.                     $veille->setToDate(new \DateTime($i.'-07-01'$dateTimeZone));
  756.                     $veille->setPriority(3); // Veilles de vacances en priorité 3 pour l'application des tarifs
  757.                     
  758.                     $em->persist($veille);
  759.                     $em->flush();                    
  760.                 }            
  761.             }
  762.             
  763.             /******************************************/
  764.             /* récupération des dates de jours fériés */
  765.             /******************************************/
  766.             $ical = new ICal();
  767.             $ical->initUrl($url['feries']);
  768.             // dd($ical->events()[0]->dtstart, $ical->events()[0]->dtend);
  769.             foreach($ical->events() as $event) {
  770.                 
  771.                 $fromDate = new \DateTime($event->dtstart$dateTimeZone);
  772.                 
  773.                 if(isset($event->dtend) && $event->dtend != "") {
  774.                     $toDate = new \DateTime($event->dtend$dateTimeZone);
  775.                     if($event->dtstart == $event->dtend) {
  776.                         $dv = new \DateInterval('P1D');
  777.                         $toDate->add($dv);
  778.                     }
  779.                 } else {
  780.                     $toDate $fromDate;
  781.                 }
  782.                 
  783.                 if ($fromDate >= $today)
  784.                 {
  785.                     $calendar = new Calendar;
  786.                     $calendar->setDesignation($event->summary);
  787.                     $calendar->setType('feries');
  788.                     $calendar->setFromDate($fromDate);
  789.                     $calendar->setToDate($toDate);
  790.                     $calendar->setPriority(2); // Fériés en priorité 2 pour l'application des tarifs
  791.                     
  792.                     $em->persist($calendar);
  793.                     $em->flush();
  794.                     
  795.                     /* ajout de la veille */
  796.                     $dv = new \DateInterval('P1D');
  797.                     $veilleDate = new \DateTime($event->dtstart$dateTimeZone);
  798.                     $veilleDate->sub($dv); // On enlève un jour
  799.                     
  800.                     $veille = new Calendar;
  801.                     $veille->setDesignation("Veille : ".$event->summary);
  802.                     $veille->setType('veille');
  803.                     $veille->setFromDate($veilleDate);
  804.                     $veille->setToDate($fromDate);
  805.                     $veille->setPriority(3); // Veilles de vacances en priorité 3 pour l'application des tarifs
  806.                     
  807.                     $em->persist($veille);
  808.                     $em->flush();
  809.                 }
  810.             }
  811.         // }
  812.         
  813.         return $this->redirectToRoute('admin');
  814.     }
  815.     public function checkDayOpening($openingDays$dayName$specialDayName
  816.     {
  817.            $return_data false;
  818.         foreach ($openingDays as $key => $day) {
  819.             if($day->getDay() == $dayName) {
  820.                 if($specialDayName == "vacances" && $day->isIsHolidays()) $return_data $day;
  821.                 if($specialDayName == "feries" && $day->isIsPublicHoliday()) $return_data $day;
  822.                 if(!$day->isIsPublicHoliday() && !$day->isIsHolidays()) $return_data $day;
  823.             }
  824.         }
  825.         return $return_data;
  826.     }
  827.     
  828. }