src/EventSubscriber/CalendarSubscriber.php line 75

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use CalendarBundle\CalendarEvents;
  4. use CalendarBundle\Entity\Event;
  5. use CalendarBundle\Event\CalendarEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
  10. use Symfony\Component\Security\Core\Security;
  11. // Repositories
  12. use App\Repository\Authorization\AssignmentRepository;
  13. use App\Repository\Planning\BookingRepository;
  14. use App\Repository\Planning\UnavailabilityRepository;
  15. class CalendarSubscriber implements EventSubscriberInterface {
  16.     private AssignmentRepository $assignmentRepository;
  17.     private BookingRepository $bookingRepository;
  18.     private RequestStack $_requestStack;
  19.     private RoleHierarchyInterface $roleHierarchy;
  20.     private UnavailabilityRepository $unavailabilityRepository;
  21.     private UrlGeneratorInterface $router;
  22.     private Security $security;
  23.     /**
  24.      * Attribution des valeurs par défaut lors de la construction.
  25.      * 
  26.      * @param AssignmentRepository $assignmentRepository Repository des associations.
  27.      * @param BookingRepository $bookingRepository Repository des planning.
  28.      * @param RequestStack $requestStack Stack de la requête.
  29.      * @param RoleHierarchyInterface $roleHierarchy Interface des hiérarchies des rôles.
  30.      * @param UnavailabilityRepository $unavailabilityRepository Repository des indisponibilité.
  31.      * @param UrlGeneratorInterface $router Interface de générateur URL.
  32.      * @param Security $security Sécurité de Symfony.
  33.      */
  34.     public function __construct(
  35.         AssignmentRepository $assignmentRepository,
  36.         BookingRepository $bookingRepository,
  37.         RequestStack $requestStack,
  38.         RoleHierarchyInterface $roleHierarchy,
  39.         UnavailabilityRepository $unavailabilityRepository,
  40.         UrlGeneratorInterface $router,
  41.         Security $security
  42.     ) {
  43.         $this->assignmentRepository = $assignmentRepository;
  44.         $this->bookingRepository = $bookingRepository;
  45.         $this->_requestStack = $requestStack;
  46.         $this->roleHierarchy = $roleHierarchy;
  47.         $this->unavailabilityRepository = $unavailabilityRepository;
  48.         $this->router = $router;
  49.         $this->security = $security;
  50.     }
  51.     /**
  52.      * Récupère les événements enregistrés et les affiches dans le calendrier
  53.      * 
  54.      * @return array 
  55.      */
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             CalendarEvents::SET_DATA => 'onCalendarSetData',
  60.         ];
  61.     }
  62.     /**
  63.      * Crée les événements sur l'intervalle de temps en cours sur le calendrier
  64.      * 
  65.      * @var CalendarEvent $setDataEvent Evenement de calendrier contenant les périodes de temps affichés
  66.      * @return void 
  67.      */
  68.     public function onCalendarSetData(
  69.         CalendarEvent $setDataEvent
  70.     )
  71.     {
  72.         $bookings = [];
  73.         $start = $setDataEvent->getStart();
  74.         $end = $setDataEvent->getEnd();
  75.         // Nous vérifions les rôles de l'utilisateur actuellement connecté
  76.         $user = $this->security->getUser();
  77.         $userRoles = $this->roleHierarchy->getReachableRoleNames($user->getRoles());
  78.         //Etablissement de la requête de récupération de Booking
  79.         $query = $this->bookingRepository
  80.             ->createQueryBuilder('booking')
  81.             ->join('booking.establishment', 'establishment')
  82.             ->where('booking.bookingStart BETWEEN :start AND :end OR booking.bookingEnd BETWEEN :start AND :end')
  83.             ->setParameter('start', $start->format('Y-m-d H:i:s'))
  84.             ->setParameter('end', $end->format('Y-m-d H:i:s'));
  85.         // Nous récupérons tous les Bookings si nous avons le rôle "ROLE_GESTION" ou plus
  86.         if (in_array("ROLE_GESTION", $userRoles)) {
  87.             $bookings = $query->getQuery()->getResult();
  88.         } else if (in_array("ROLE_PF_CFT", $userRoles)) {
  89.             // Sinon, si nous avons au moins le rôle "ROLE_PF_CFT", nous affichons tous les bookings liés à nos établissements 
  90.             $userAssignments = $this->assignmentRepository->findActiveEstablishment($user);
  91.             $userEstablishments = [];
  92.             $i = 1;
  93.             foreach ($userAssignments as $userAssignment) {
  94.                 $userEstablishments[$i] = $userAssignment->getEstablishment();
  95.                 $i += 1;
  96.             }
  97.             $bookings = $query
  98.                     ->andWhere(('establishment IN (:userEstablishments)'))
  99.                     ->setParameter('userEstablishments', $userEstablishments)
  100.                     ->getQuery()->getResult();
  101.         }
  102.         $listGestion = [];
  103.         foreach ($bookings as $booking) {
  104.             $bookingEvent = new Event(
  105.                 $booking->getLastname() . " " . $booking->getFirstname(),
  106.                 $booking->getBookingStart(),
  107.                 $booking->getBookingEnd() // If the end date is null or not defined, an all-day event is created.
  108.             );
  109.             if ($booking->getUser()) {
  110.                 $user = $booking->getUser();
  111.                 // Envoyer les couleurs via extendedProps
  112.                 $bookingEvent->addOption('extendedProps', [
  113.                     'userBackgroundColor' => $user->getBackgroundColor(),
  114.                     'userBorderColor' => $user->getBorderColor(),
  115.                     'userTextColor' => $user->getTextColor(),
  116.                     'status' => $booking->getStatus() // Assurez-vous que $booking->getStatus() renvoie un statut valide (ex: 'validé', 'annulé', etc.)
  117.                 ]);
  118.                 $userId = $user->getId();
  119.                 // Vérifier si l'utilisateur est déjà dans le tableau
  120.                 if (!array_key_exists($userId, $listGestion)) {
  121.                     // Ajouter l'utilisateur dans le tableau avec son id comme clé
  122.                     $listGestion[$userId] = [
  123.                         'firstname' => $user->getFirstname(),
  124.                         'lastname' => $user->getLastname(),
  125.                         'background' => $user->getBackgroundColor(),
  126.                         'border' => $user->getBorderColor(),
  127.                         'color' => $user->getTextColor(),
  128.                     ];
  129.                 }
  130.             } else {
  131.                 // Envoyer les couleurs par défaut via extendedProps
  132.                 $bookingEvent->addOption('extendedProps', [
  133.                     'userBackgroundColor' => 'white',
  134.                     'userBorderColor' => 'black',
  135.                     'userTextColor' => 'black',
  136.                     'status' => $booking->getStatus() // Assurez-vous que $booking->getStatus() renvoie un statut valide (ex: 'validé', 'annulé', etc.)
  137.                 ]);
  138.             }
  139.             // Ajout du statut dans extendedProps
  140.             // $bookingEvent->addOption('extendedProps', [
  141.             //     'status' => $booking->getStatus() // Assurez-vous que $booking->getStatus() renvoie un statut valide (ex: 'validé', 'annulé', etc.)
  142.             // ]);
  143.             $bookingEvent->addOption(
  144.                 'url',
  145.                 $this->router->generate('booking_view', [
  146.                     'id' => $booking->getId(),
  147.                 ])
  148.             );
  149.             // Add the event to the CalendarEvent to fill the calendar
  150.             $setDataEvent->addEvent($bookingEvent);
  151.         }
  152.         // Stocke le tableau $listGestion dans la session
  153.         $this->_requestStack->getSession()->set('listGestion', $listGestion);
  154.         if (in_array("ROLE_GESTION", $userRoles)) {
  155.             // Ajout des événements d'indisponibilités
  156.             $unavailabilities = $this->unavailabilityRepository
  157.                     ->createQueryBuilder('unavailability')
  158.                     ->where('(unavailability.unavailabilityStart BETWEEN :start AND :end) 
  159.                   OR (unavailability.unavailabilityEnd BETWEEN :start AND :end) 
  160.                   OR (:start BETWEEN unavailability.unavailabilityStart AND unavailability.unavailabilityEnd)')
  161.                     ->setParameter('start', $start->format('Y-m-d H:i:s'))
  162.                     ->setParameter('end', $end->format('Y-m-d H:i:s'))
  163.                     ->getQuery()->getResult();
  164.             foreach ($unavailabilities as $unavailability) {
  165.                 $startDate = $unavailability->getUnavailabilityStart();
  166.                 $endDate = $unavailability->getUnavailabilityEnd();
  167.                 $unavailabilityEvent = new Event(
  168.                     $unavailability->getUnavailabilityTitle(),
  169.                     $startDate,
  170.                     $endDate
  171.                 );
  172.                 // Add custom options to events
  173.                 $unavailabilityEvent->setOptions([
  174. //                    'backgroundColor' => 'gray',
  175. //                    'borderColor'     => 'gray',
  176. //                    'display'         => 'flex',
  177.                     'classNames' => ['custom-unavailability']
  178.                 ]);
  179.                 $unavailabilityEvent->addOption(
  180.                     'url',
  181.                     $this->router->generate('unavailability_view', [
  182.                         'id' => $unavailability->getId(),
  183.                     ])
  184.                 );
  185.                 // Add the event to the CalendarEvent to fill the calendar
  186.                 $setDataEvent->addEvent($unavailabilityEvent);
  187.             }
  188.         }
  189.     }
  190. }