src/Controller/PageController.php line 2204

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Data\SearchFlashWorkshop;
  4. use App\Data\SearchFlashWorkshopAgenda;
  5. use App\Entity\Client;
  6. use App\Entity\ClientProduct;
  7. use App\Entity\DefiAnswerUser;
  8. use App\Entity\DefiSlide;
  9. use App\Entity\DiagAnswer;
  10. use App\Entity\DiagAnswerUser;
  11. use App\Entity\DiagQuestion;
  12. use App\Entity\FlashUserWorkshop;
  13. use App\Entity\Product;
  14. use App\Entity\User;
  15. use App\Entity\UserProduct;
  16. use App\Entity\FlashWorkshop;
  17. use App\Form\DisabledQuizzFormType;
  18. use App\Form\ForcedDisabledFormType;
  19. use App\Form\SearchFlashWorkshopAgendaType;
  20. use App\Form\SearchFlashWorkshopType;
  21. use App\Repository\ClientProductRepository;
  22. use App\Repository\ClientRepository;
  23. use App\Repository\DefiAnswerRepository;
  24. use App\Repository\DefiAnswerUserRepository;
  25. use App\Repository\DefiQuestionRepository;
  26. use App\Repository\DefiSlideRepository;
  27. use App\Repository\DiagAnswerRepository;
  28. use App\Repository\DiagAnswerUserRepository;
  29. use App\Repository\DiagQuestionRepository;
  30. use App\Repository\FlashTimeslotRepository;
  31. use App\Repository\FlashUserWorkshopRepository;
  32. use App\Repository\FlashWorkshopRepository;
  33. use App\Repository\FlashWorkshopTypeRepository;
  34. use App\Repository\UserProductRepository;
  35. use App\Repository\UserRepository;
  36. use App\Service\ZoomService;
  37. use DateTime;
  38. use Doctrine\ORM\EntityManagerInterface;
  39. use Doctrine\Persistence\ManagerRegistry;
  40. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  41. use Symfony\Component\HttpFoundation\Request;
  42. use Symfony\Component\HttpFoundation\Response;
  43. use Symfony\Component\Routing\Annotation\Route;
  44. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  45. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  46. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  47. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  48. use Symfony\Component\Mailer\MailerInterface;
  49. use Symfony\Component\Mime\Address;
  50. use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
  51. use Symfony\Component\HttpFoundation\Cookie;
  52. use Symfony\Component\HttpFoundation\JsonResponse;
  53. class PageController extends AbstractController
  54. {
  55.     /**
  56.      * @Route("/{clientSlug}", name="app_main")
  57.      */
  58.     public function index(
  59.         Request $request,
  60.         $clientSlug null,
  61.         ClientRepository $clientRepository,
  62.         ClientProductRepository $clientProductRepository,
  63.         FlashWorkshopRepository $flashWorkshopRepository,
  64.         FlashUserWorkshopRepository $flashUserWorkshopRepository,
  65.         UserProductRepository $userProductRepository,
  66.         UserRepository $userRepository
  67.     ) {
  68.         
  69.         $session $request->getSession();
  70.         $session->set('clientSlug'$clientSlug);
  71.         if ($this->getUser()) {
  72.             if ($this->isAuthorized($session->get('clientSlug')) == true || in_array('ROLE_ADMIN'$this->getUser()->getRoles()) == true) {
  73.                 $client $this->getUser()->getClient();
  74.                 $firstUserProduct $userProductRepository->findOneBy(['user' => $this->getUser(), 'hasDone' => true]);
  75.                 $referer $request->headers->get('referer');
  76.                 if ($referer != null) {
  77.                     $refererPathInfo Request::create($referer)->getPathInfo();
  78.                     $routeInfos $this->get('router')->match($refererPathInfo);
  79.                     if ($routeInfos['_route'] == 'app_login') {
  80.                         $secureClientProducts $clientProductRepository->hasClientSecureProduct($client);
  81.                         if ($secureClientProducts === true) {
  82.                             $password $this->getParameter('app.generic_password');
  83.                             if (password_verify($password$this->getUser()->getPassword()) == true) {
  84.                                 // dd('ici');
  85.                                 return $this->redirectToRoute('app_set_password', [], Response::HTTP_SEE_OTHER);
  86.                             }
  87.                         }
  88.                     }
  89.                 }
  90.                 $session->set('clientSalt'$client->getSalt());
  91.                 $session->set('clientBackground'$client->getBackground());
  92.                 $session->set('clientId'$client->getId());
  93.                 $session->set('clientMainColor'$client->getMainColor());
  94.                 $userFlashUserWorkshopsList = [];
  95.                 // Récupération des Flash User Workshop de l'utilisateur
  96.                 $userFlashUserWorkshops $this->getUser()->getFlashUserWorkshops();
  97.                 // Tableau des Flash Workshop où l'utilisateur à un créneau
  98.                 $flashWorkshopsReservedForUser = [];
  99.                 // Pour chaque Flash User Workshop de l'utilisateur, push dans le tableau des Flash User Workshop de l'utilisateur
  100.                 foreach ($userFlashUserWorkshops as $userFlashUserWorkshop) {
  101.                     array_push($userFlashUserWorkshopsList$userFlashUserWorkshop);
  102.                 }
  103.                 // Pour chaque Flash User Workshop de l'utilisateur, récupération de son Flash Workshop, push le Flash Workshop dans le tableau des Flash Workshop où l'utilisateur à un créneau
  104.                 foreach ($userFlashUserWorkshopsList as $userFlashUserWorkshop) {
  105.                     $fwReserved $userFlashUserWorkshop->getFlashWorkshop();
  106.                     if (!in_array($fwReserved$flashWorkshopsReservedForUser)) {
  107.                         array_push($flashWorkshopsReservedForUser$fwReserved);
  108.                     }
  109.                 }
  110.                 $clientProducts $clientProductRepository->getIncomingByClient($client);
  111.                 $flashWorkshopsArray = [];
  112.                 $locationsArray = [];
  113.                 foreach ($clientProducts as $clientProduct) {
  114.                     $flashWorkshops $flashWorkshopRepository->getByClientProductIndex($clientProduct);
  115.                     $deniedWorkshopArray = [];
  116.                     foreach ($flashWorkshops as $flashWorkshop) {
  117.                         $deniedLocations $flashWorkshop->getDeniedLocation();
  118.                         foreach ($deniedLocations as $location) {
  119.                             $deniedWorkshopArray[$flashWorkshop->getId()][] = $location->getId();                                    
  120.                         }
  121.                         $deniedWorkshopIds = [];
  122.                         foreach ($deniedWorkshopArray as $k => $deniedWorkshop) {
  123.                             $userLocation $this->getUser()->getLocation();
  124.                             if ($userLocation !== null && in_array($userLocation->getId(), array_values($deniedWorkshop))) {
  125.                                 $deniedWorkshopIds[] = $k;
  126.                             }
  127.                         }  
  128.                     }
  129.                     $flashWorkshops $this->filterFlashWorkshops($flashWorkshops$deniedWorkshopIds);
  130.                     // Rassemblement des timeslots par date pour affichage dans la vue
  131.                     foreach ($flashWorkshops as $flashWorkshop) {
  132.                         $timeslotsCountForVerification 0;
  133.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  134.                             $timeslotsCountForVerification++;
  135.                         }
  136.                         if ($timeslotsCountForVerification 0) {
  137.                             $flashTimeslotExtractedDates = [];
  138.                             $flashTimeslotByDateArray = [];
  139.                             foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  140.                                 if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
  141.                                     array_push($flashTimeslotExtractedDates$timeslot->getDate());
  142.                                 }
  143.                             }
  144.                             foreach ($flashTimeslotExtractedDates as $date) {
  145.                                 $indexDate $date->format('D d M Y');
  146.                                 $timeslotArray = [];
  147.                                 foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  148.                                     if ($date == $timeslot->getDate()) {
  149.                                         array_push($timeslotArray$timeslot);
  150.                                         $flashTimeslotByDateArray[$indexDate] = $timeslotArray;
  151.                                     }
  152.                                 }
  153.                             }
  154.                             $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop'timeslots' => $flashTimeslotByDateArray];
  155.                             array_push($flashWorkshopsArray$flashWorkshopFiltered);
  156.                         } else {
  157.                             $flashWorkshop->setIsOutdated(false);
  158.                             $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop'timeslots' => []];
  159.                             array_push($flashWorkshopsArray$flashWorkshopFiltered);
  160.                         }
  161.                     }
  162.                     $fullFlashWorkshops $flashWorkshopRepository->getFullFlashWorkshop($flashUserWorkshopRepository$flashWorkshops);
  163.                     foreach ($fullFlashWorkshops as $flashWorkshop) {
  164.                         $timeslotsCountForVerification 0;
  165.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  166.                             $timeslotsCountForVerification++;
  167.                         }
  168.                         if ($timeslotsCountForVerification 0) {
  169.                             $flashWorkshop->setIsFull(true);
  170.                         } else {
  171.                             $flashWorkshop->setIsEmpty(true);
  172.                         }
  173.                     }
  174.                     // Vérification si les timeslots ne sont pas tous à une date dépassée
  175.                     foreach ($flashWorkshops as $flashWorkshop) {
  176.                         $flashTimeslots $flashWorkshop->getFlashTimeslots();
  177.                         $timeslotsCountForVerification 0;
  178.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  179.                             $timeslotsCountForVerification++;
  180.                         }
  181.                         if ($timeslotsCountForVerification 0) {
  182.                             $timeslotsCount count($flashTimeslots);
  183.                             $timeslotsOutdatedCount 0;
  184.                             foreach ($flashTimeslots as $timeslot) {
  185.                                 if ($timeslot->getDate()->format('Y-m-d') < date('Y-m-d')) {
  186.                                     $timeslot->setIsOutdated(true);
  187.                                     $timeslotsOutdatedCount++;
  188.                                 }
  189.                             }
  190.                             if ($timeslotsOutdatedCount == $timeslotsCount) {
  191.                                 $flashWorkshop->setIsOutdated(true);
  192.                             }
  193.                         }
  194.                     }
  195.                     foreach ($flashWorkshopsArray as $k => $flashWorkshopAndTimeslots) {
  196.                         if ($flashWorkshopAndTimeslots['flashWorkshopEntity']->getIsOutdated() == true) {
  197.                             $outdatedFlashWorkshop $flashWorkshopsArray[$k];
  198.                             unset($flashWorkshopsArray[$k]);
  199.                             array_push($flashWorkshopsArray$outdatedFlashWorkshop);
  200.                         }
  201.                         $outdatedFlashTimeslotCount 0;
  202.                         $fullFlashTimeslotCount 0;
  203.                         $timeslotsTotalCount count($flashWorkshopAndTimeslots['timeslots']);
  204.                         foreach ($flashWorkshopAndTimeslots['timeslots'] as $timeslot) {
  205.                             if ($timeslot[0]->getIsFull() == true) {
  206.                                 $fullFlashTimeslotCount++;
  207.                             }
  208.                             if ($timeslot[0]->getIsOutdated() == true) {
  209.                                 $outdatedFlashTimeslotCount++;
  210.                             }
  211.                         }
  212.                         if ($timeslotsTotalCount 0) {
  213.                             if ($outdatedFlashTimeslotCount $fullFlashTimeslotCount == $timeslotsTotalCount) {
  214.                                 $flashWorkshopAndTimeslots['flashWorkshopEntity']->setHasOutdatedAndFull(true);
  215.                             }
  216.                         }
  217.                     }
  218.                     if ($clientProduct->getProduct()->getName() == 'Defi-inclusion') {
  219.                         $userProducts $userProductRepository->findBy(['clientProduct' => $clientProduct'hasDone' => true], [], ['modifiedAt' => 'DESC']);
  220.                         if ($userProducts != null) {
  221.                             $userProductsByLocation = [];
  222.                             // $locationsArray = [];
  223.                             foreach ($userProducts as $userProduct) {
  224.                                 $locations $userProduct->getClientProduct()->getClient()->getLocations();
  225.                                 $user $userProduct->getUser();
  226.                                 foreach ($locations as $location) {
  227.                                     $locationsArray[$location->getName()] = 0;
  228.                                     $score 0;
  229.                                     $users $userRepository->findByLocation($location);
  230.                                     foreach ($users as $user) {
  231.                                         $userProductsByLocation $userProductRepository->findByUser($user);
  232.                                         foreach ($userProductsByLocation as $userProductByLocation) {
  233.                                             $score $score $userProductByLocation->getScore();
  234.                                             $locationsArray[$location->getName()] = $score;
  235.                                         }
  236.                                     }
  237.                                 }
  238.                             }
  239.                             arsort($locationsArray);
  240.                         }
  241.                     }
  242.                 }
  243.             } else {
  244.                 return $this->redirectToRoute('app_main', ['clientSlug' => $this->getUser()->getClient()->getSlug()], Response::HTTP_SEE_OTHER);
  245.             }
  246.         } else {
  247.             $firstUserProduct null;
  248.             $flashWorkshopsReservedForUser null;
  249.             $locationsArray = [];
  250.             if ($session->get('clientSlug') != null) {
  251.                 $clientEntity $clientRepository->findOneBySlug($session->get('clientSlug'));
  252.                 if ($clientEntity != null) {
  253.                     $client $clientEntity;
  254.                 } else {
  255.                     $client $clientRepository->findOneById(1);
  256.                 }
  257.             } else {
  258.                 //dd('salut');
  259.                 $client $clientRepository->findOneById(1);
  260.             }
  261.             $session->set('clientSalt'$client->getSalt());
  262.             $session->set('clientBackground'$client->getBackground());
  263.             $session->set('clientId'$client->getId());
  264.             $session->set('clientMainColor'$client->getMainColor());
  265.             if ($clientSlug != $client->getSlug()) {
  266.                 return $this->redirectToRoute('app_main', ['clientSlug' => $client->getSlug()], Response::HTTP_SEE_OTHER);
  267.             } else {
  268.                 $flashWorkshopsArray = [];
  269.                 $clientProducts $clientProductRepository->getClientProductsForUnloggedUser($client);
  270.                 
  271.                 //if(count($clientProducts)>=2 && $clientProducts[0]->getProduct()->getId() );
  272.                 foreach ($clientProducts as $clientProduct) {
  273.                     // Récupération des FW "Flashlearning"
  274.                     if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
  275.                         $flashWorkshops $flashWorkshopRepository->getByClientProductUnloggedUser($clientProduct);
  276.                         foreach ($flashWorkshops as $flashWorkshop) {
  277.                             $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop];
  278.                             array_push($flashWorkshopsArray$flashWorkshopFiltered);
  279.                         }
  280.                     }
  281.                 }
  282.                 
  283.             }
  284.         }
  285.         $clientProducts $clientProductRepository->getIncomingByClient($client);
  286.         $now = new \DateTime();
  287.         // Met à jour isActive pour chaque ClientProduct selon startAt / endAt
  288.         foreach ($clientProducts as $clientProduct) {
  289.             $startAt $clientProduct->getStartAt();
  290.             $endAt   $clientProduct->getEndAt();
  291.     
  292.             // Vérifie d’abord que les dates existent et que startAt < endAt
  293.             if ($startAt !== null && $endAt !== null && $startAt $endAt) {
  294.                 // Actif si $now est compris entre startAt (inclus) et endAt (exclus)
  295.                 if ($now >= $startAt && $now $endAt) {
  296.                     $clientProduct->setIsActive(true);
  297.                 } else {
  298.                     $clientProduct->setIsActive(false);
  299.                 }
  300.             } else {
  301.                 // Si la plage de dates est invalide ou absente,
  302.                 // vous pouvez choisir de laisser la valeur en base ou la forcer à false
  303.                 // $clientProduct->setIsActive(false);
  304.             }
  305.         }
  306.     
  307.         // Ne garder que les ClientProduct actifs
  308.         $activeClientProducts array_filter($clientProducts, function ($cp) {
  309.             return $cp->isIsActive() === true;
  310.         });
  311.     
  312.         // Si aucun produit actif, on affiche index.html.twig
  313.         if (empty($activeClientProducts)) {
  314.             $content $this->renderView('page/index.html.twig', [
  315.                 'flashWorkshops'                => $flashWorkshopsArray,
  316.                 'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
  317.                 'client'                        => $client,
  318.                 'locationsArray'                => $locationsArray,
  319.                 'clientProducts'                => $clientProducts,
  320.                 'userProduct'                   => $firstUserProduct
  321.             ]);
  322.         } else {
  323.             // Vérifier si tous les produits actifs ont un ID dans [3, 4, 5]
  324.             $allInDiagTools true;
  325.             foreach ($activeClientProducts as $cp) {
  326.                 $productId $cp->getProduct()->getId();
  327.                 if (!in_array($productId, [345])) {
  328.                     $allInDiagTools false;
  329.                     break;
  330.                 }
  331.             }
  332.     
  333.             // Si tous les IDs actifs sont dans [3, 4, 5], diag_tools.html.twig, sinon index.html.twig
  334.             if ($allInDiagTools) {
  335.                 $content $this->renderView('page/diag_tools.html.twig', [
  336.                     'flashWorkshops'                => $flashWorkshopsArray,
  337.                     'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
  338.                     'client'                        => $client,
  339.                     'locationsArray'                => $locationsArray,
  340.                     'clientProducts'                => $clientProducts,
  341.                     'userProduct'                   => $firstUserProduct
  342.                 ]);
  343.             } else {
  344.                 $content $this->renderView('page/index.html.twig', [
  345.                     'flashWorkshops'                => $flashWorkshopsArray,
  346.                     'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
  347.                     'client'                        => $client,
  348.                     'locationsArray'                => $locationsArray,
  349.                     'clientProducts'                => $clientProducts,
  350.                     'userProduct'                   => $firstUserProduct
  351.                 ]);
  352.             }
  353.         }
  354.     
  355.         // Si vous utilisez renderView(), vous devez retourner une Response :
  356.         return new Response($content);
  357.         if (empty($clientProducts)) {
  358.         $content $this->renderView('page/index.html.twig', [
  359.                     'flashWorkshops' => $flashWorkshopsArray,
  360.                     'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
  361.                     'client' => $client,
  362.                     'locationsArray' => $locationsArray,
  363.                     'clientProducts' => $clientProducts,
  364.                     'userProduct' => $firstUserProduct
  365.                 ]);
  366.         }
  367.                 
  368.         $viewWithCookie $this->setCookie($client->getSlug(), $content);
  369.         return $viewWithCookie;
  370.     }
  371.     public function removeSeParamFromUrl(Request $requestUrlGeneratorInterface $urlGenerator)
  372. {
  373.     // On récupère l'URL actuelle
  374.     
  375.     $currentUrl $request->getUri();
  376.     
  377.     // Parse l'URL pour obtenir les composants (chemin, query params, etc.)
  378.     $parsedUrl parse_url($currentUrl);
  379.     // Si l'URL contient des query params
  380.     if (isset($parsedUrl['query'])) {
  381.         // Convertir les query params en tableau
  382.         parse_str($parsedUrl['query'], $queryParams);
  383.         // Retirer tous les paramètres commençant par _se
  384.         foreach ($queryParams as $key => $value) {
  385.             if (strpos($key'_se') === 0) {
  386.                 unset($queryParams[$key]);
  387.             }
  388.         }
  389.         // Reconstruire la query string
  390.         $newQueryString http_build_query($queryParams);
  391.         // Reconstruire l'URL sans les paramètres _se
  392.         $newUrl $parsedUrl['scheme'] . '://' $parsedUrl['host'] . $parsedUrl['path'];
  393.         if (!empty($newQueryString)) {
  394.             $newUrl .= '?' $newQueryString;
  395.         }
  396.         return $newUrl;
  397.     }
  398.     // Si pas de query params, retourner l'URL telle qu'elle est
  399.     return $currentUrl;
  400. }
  401.     /**
  402.      * @Route("/{slug}/produits/flashlearning", name="app_flashlearning")
  403.      */
  404.     public function flashlearning(Client $clientRequest $requestClientProductRepository $clientProductRepositoryFlashWorkshopRepository $flashWorkshopRepositoryFlashTimeslotRepository $flashTimeslotRepositoryFlashUserWorkshopRepository $flashUserWorkshopRepositoryFlashWorkshopTypeRepository $flashWorkshopTypeRepository)
  405.     {
  406.         
  407.         $hasFilters null;
  408.         $hasDisplayFilter null;
  409.         $hasEventTypeFilter null;
  410.         $hasCategoryFilter null;
  411.         $hasDateFilter null;
  412.         $hasHourFilter null;
  413.         $filtersCount 0;
  414.         if (isset($_GET["search_flash_workshop"])) {
  415.             $hasFilters true;
  416.             if (array_key_exists("pastEvent"$_GET["search_flash_workshop"]) || array_key_exists("limitParticipant"$_GET["search_flash_workshop"])) {
  417.                 $hasDisplayFilter true;
  418.                 $filtersCount++;
  419.             }
  420.             if (array_key_exists("onLine"$_GET["search_flash_workshop"]) || array_key_exists("onSite"$_GET["search_flash_workshop"])) {
  421.                 $hasEventTypeFilter true;
  422.                 $filtersCount++;
  423.             }
  424.             if (array_key_exists("category"$_GET["search_flash_workshop"])) {
  425.                 $hasCategoryFilter true;
  426.                 $filtersCount++;
  427.             }
  428.             if (array_key_exists("date"$_GET["search_flash_workshop"])) {
  429.                 $hasDateFilter true;
  430.                 $filtersCount++;
  431.             }
  432.             if (array_key_exists("hour"$_GET["search_flash_workshop"])) {
  433.                 $hasHourFilter true;
  434.                 $filtersCount++;
  435.             }
  436.         }
  437.         if ($this->getUser()) {
  438.             $alreadyTakenTimeslot $request->query->get('error');
  439.             $emptyDataError $request->query->get('error-empty');
  440.             if ($alreadyTakenTimeslot != null) {
  441.                 $alreadyTakenTimeslot true;
  442.             } else {
  443.                 $alreadyTakenTimeslot false;
  444.             }
  445.             if ($emptyDataError != null) {
  446.                 $emptyDataError true;
  447.             } else {
  448.                 $emptyDataError false;
  449.             }
  450.             $data = new SearchFlashWorkshop();
  451.             if(isset($request->query->get('search_flash_workshop')['category']) && $request->query->get('search_flash_workshop')['category'] != null){
  452.                 $data->category $request->query->get('search_flash_workshop')['category'];
  453.             }
  454.             $form $this->createForm(SearchFlashWorkshopType::class, $data);
  455.             $form->handleRequest($request);
  456.             $user $this->getUser();
  457.             if(in_array('ROLE_ADMIN'$this->getUser()->getRoles()) == true){
  458.                 $clientProducts $clientProductRepository->getClientProductForThisUser(null$client);
  459.                 
  460.             }else{
  461.                 $clientProducts $clientProductRepository->getClientProductForThisUser($usernull);
  462.             }
  463.             // Tableau des produits à afficher dans la navbar de l'accueil
  464.             $productsFromClientProducts = [];
  465.             // Collection des Flash Workshop à afficher
  466.             $flashWorkshopsList = [];
  467.             // Tableau des Flash User Workshop de l'utilisateur
  468.             $userFlashUserWorkshopsList = [];
  469.             // Récupération des Flash User Workshop de l'utilisateur
  470.             $userFlashUserWorkshops $user->getFlashUserWorkshops();
  471.             // Tableau des Flash Workshop où l'utilisateur à un créneau
  472.             $flashWorkshopsReservedForUser = [];
  473.             // Récupération des deux prochaines sessions de l'utilisateur connecté
  474.             $userNextFlashTimeslots $flashTimeslotRepository->getUserNextFlashTimeslots($user);
  475.             foreach ($userNextFlashTimeslots as $timeslot) {
  476.                 $date $timeslot->getDate();
  477.                 $stringifiedDate $date->format('D d M Y');
  478.                 $timeslot->setStringifiedDate($stringifiedDate);
  479.             }
  480.             
  481.             // Pour chaque Flash User Workshop de l'utilisateur, push dans le tableau des Flash User Workshop de l'utilisateur
  482.             foreach ($userFlashUserWorkshops as $userFlashUserWorkshop) {
  483.                 array_push($userFlashUserWorkshopsList$userFlashUserWorkshop);
  484.             }
  485.             
  486.             // Pour chaque Flash User Workshop de l'utilisateur, récupération de son Flash Workshop, push le Flash Workshop dans le tableau des Flash Workshop où l'utilisateur à un créneau
  487.             foreach ($userFlashUserWorkshopsList as $userFlashUserWorkshop) {
  488.                 $fwReserved $userFlashUserWorkshop->getFlashWorkshop();
  489.                 if (!in_array($fwReserved$flashWorkshopsReservedForUser)) {
  490.                     array_push($flashWorkshopsReservedForUser$fwReserved);
  491.                 }
  492.             }
  493.             foreach ($clientProducts as $clientProduct) {
  494.                 if (!in_array($clientProduct->getProduct(), $productsFromClientProducts)) {
  495.                     array_push($productsFromClientProducts$clientProduct->getProduct());
  496.                 }
  497.                 
  498.                 // Récupération des Flash Workshop "Flashlearning"
  499.                 if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
  500.                     $flashWorkshops $flashWorkshopRepository->getByClientProduct($clientProduct$user$data$flashTimeslotRepository$flashUserWorkshopRepository);
  501.                     
  502.                     // --- TRI par le prochain créneau >= aujourd'hui ---
  503.                     $tz = new \DateTimeZone('Europe/Paris');
  504.                     $today = new \DateTimeImmutable('today'$tz);
  505.                     $nextFuture = function ($fw) use ($today) {
  506.                         $next null;
  507.                         foreach ($fw->getFlashTimeslots() as $ts) {
  508.                             $d $ts->getDate();
  509.                             if ($d >= $today && ($next === null || $d $next)) {
  510.                                 $next $d;
  511.                             }
  512.                         }
  513.                         return $next;
  514.                     };
  515.                     usort($flashWorkshops, function ($a$b) use ($nextFuture) {
  516.                         $aNext $nextFuture($a);
  517.                         $bNext $nextFuture($b);
  518.                         if ($aNext === null && $bNext === null) {
  519.                             return 0;
  520.                         }
  521.                         if ($aNext === null) {
  522.                             return 1;
  523.                         }
  524.                         if ($bNext === null) {
  525.                             return -1;
  526.                         }
  527.                         return ($aNext $bNext) ? -1;
  528.                     });
  529.                     // --- FIN TRI ---
  530.                     
  531.                     $deniedWorkshopArray = [];
  532.                     foreach ($flashWorkshops as $flashWorkshop) {
  533.                         $deniedLocations $flashWorkshop->getDeniedLocation();
  534.                         foreach ($deniedLocations as $location) {
  535.                             $deniedWorkshopArray[$flashWorkshop->getId()][] = $location->getId();                                    
  536.                         }
  537.                         $deniedWorkshopIds = [];
  538.                     
  539.                         foreach ($deniedWorkshopArray as $k => $deniedWorkshop) {
  540.                             $userLocation $this->getUser()->getLocation();
  541.                             if ($userLocation !== null && in_array($userLocation->getId(), array_values($deniedWorkshop))) {
  542.                                 $deniedWorkshopIds[] = $k;
  543.                             }
  544.                         }  
  545.                     }
  546.                     $flashWorkshops $this->filterFlashWorkshops($flashWorkshops$deniedWorkshopIds);
  547.                     foreach ($flashWorkshops as $flashWorkshop) {
  548.                         $timeslotsCountForVerification 0;
  549.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  550.                             $timeslotsCountForVerification++;
  551.                         }
  552.                         if ($timeslotsCountForVerification 0) {
  553.                             $flashTimeslotExtractedDates = [];
  554.                             $flashTimeslotByDateArray = [];
  555.                             // Récupération de la date des Timeslots pour affichage
  556.                             foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  557.                                 if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
  558.                                     array_push($flashTimeslotExtractedDates$timeslot->getDate());
  559.                                 }
  560.                             }
  561.                             sort($flashTimeslotExtractedDates);
  562.                             // Formattage des dates récupérées pour affichage
  563.                             foreach ($flashTimeslotExtractedDates as $date) {
  564.                                 $indexDate $date->format('D d M Y');
  565.                                 $timeslotArray = [];
  566.                                 $timeslotsOrdered $flashTimeslotRepository->getByFlashWorkshopAndHourAsc($flashWorkshop);
  567.                                 foreach ($timeslotsOrdered as $timeslot) {
  568.                                     if ($date == $timeslot->getDate()) {
  569.                                         array_push($timeslotArray$timeslot);
  570.                                         $flashTimeslotByDateArray[$indexDate] = $timeslotArray;
  571.                                     }
  572.                                 }
  573.                             }
  574.                             $numwords 25;
  575.                             preg_match("/(\S+\s*){0,$numwords}/"$flashWorkshop->getDescription(), $regs);
  576.                             $shortdesc trim($regs[0]);
  577.                             $restoredDesc $this->restoreTags($shortdesc);
  578.                             $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop'timeslots' => $flashTimeslotByDateArray'shortDescription' => $restoredDesc];
  579.                             array_push($flashWorkshopsList$flashWorkshopFiltered);
  580.                         } else {
  581.                             $flashWorkshop->setIsOutdated(false);
  582.                             $numwords 25;
  583.                             preg_match("/(\S+\s*){0,$numwords}/"$flashWorkshop->getDescription(), $regs);
  584.                             $shortdesc trim($regs[0]);
  585.                             $restoredDesc $this->restoreTags($shortdesc);
  586.                             $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop'timeslots' => [], 'shortDescription' => $restoredDesc];
  587.                             array_push($flashWorkshopsList$flashWorkshopFiltered);
  588.                         }
  589.                     }
  590.           
  591.                     $flashWorkshopRepository->getFullFlashWorkshop($flashUserWorkshopRepository$flashWorkshops);
  592.                     foreach ($flashWorkshops as $flashWorkshop) {
  593.                         $timeslotsCountForVerification 0;
  594.                         if (count($flashWorkshop->getFlashTimeslots()) == 0) {
  595.                             $flashWorkshop->setIsEmpty(true);
  596.                         }
  597.                     }
  598.                     // Vérification si les timeslots ne sont pas tous à une date dépassée
  599.                     foreach ($flashWorkshops as $flashWorkshop) {
  600.                         $flashTimeslots $flashWorkshop->getFlashTimeslots();
  601.                         $timeslotsCountForVerification 0;
  602.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  603.                             $timeslotsCountForVerification++;
  604.                         }
  605.                         if ($timeslotsCountForVerification 0) {
  606.                             $timeslotsCount count($flashTimeslots);
  607.                             $timeslotsOutdatedCount 0;
  608.                             foreach ($flashTimeslots as $timeslot) {
  609.                                 if ($timeslot->getDate()->format('Y-m-d') < date('Y-m-d')) {
  610.                                     $timeslot->setIsOutdated(true);
  611.                                     $timeslotsOutdatedCount++;
  612.                                 }
  613.                             }
  614.                             if ($timeslotsOutdatedCount == $timeslotsCount) {
  615.                                 $flashWorkshop->setIsOutdated(true);
  616.                             }
  617.                         }
  618.                     }
  619.                     foreach ($flashWorkshopsList as $k => $flashWorkshopAndTimeslots) {
  620.                         if ($flashWorkshopAndTimeslots['flashWorkshopEntity']->getIsOutdated() == true) {
  621.                             $outdatedFlashWorkshop $flashWorkshopsList[$k];
  622.                             unset($flashWorkshopsList[$k]);
  623.                             array_push($flashWorkshopsList$outdatedFlashWorkshop);
  624.                         }
  625.                         $outdatedFlashTimeslotCount 0;
  626.                         $fullFlashTimeslotCount 0;
  627.                         $timeslotsTotalCount 0;
  628.                         foreach ($flashWorkshopAndTimeslots['timeslots'] as $timeslots) {
  629.                             foreach ($timeslots as $timeslot) {
  630.                                 $timeslotsTotalCount++;
  631.                                 if ($timeslot->getIsFull() == true) {
  632.                                     $fullFlashTimeslotCount++;
  633.                                 }
  634.                                 if ($timeslot->getIsOutdated() == true) {
  635.                                     $outdatedFlashTimeslotCount++;
  636.                                 }
  637.                             }
  638.                         }
  639.                     }
  640.                 }
  641.             }
  642.             $categories = [];
  643.             $categoryEntities $flashWorkshopTypeRepository->findAll();
  644.             foreach ($flashWorkshopsList as $flashWorkshopWithTimeslots) {
  645.                 $fw $flashWorkshopWithTimeslots['flashWorkshopEntity'];
  646.                 if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
  647.                     array_push($categories$fw->getFlashWorkshopType()->getName());
  648.                 }
  649.             }
  650.             //  dd($flashWorkshopsList);
  651.             $content $this->renderView('page/flashlearning.html.twig', [
  652.                 'products' => $productsFromClientProducts,
  653.                 'flashWorkshops' => $flashWorkshopsList,
  654.                 'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
  655.                 'client' => $client,
  656.                 'form' => $form->createView(),
  657.                 'userNextFlashTimeslots' => $userNextFlashTimeslots,
  658.                 'alreadyTakenTimeslot' => $alreadyTakenTimeslot,
  659.                 'emptyDataError' => $emptyDataError,
  660.                 'categories' => $categories,
  661.                 'categoryEntities' => $categoryEntities,
  662.                 'hasFilters' => $hasFilters,
  663.                 'hasDisplayFilter' => $hasDisplayFilter,
  664.                 'hasEventTypeFilter' => $hasEventTypeFilter,
  665.                 'hasCategoryFilter' => $hasCategoryFilter,
  666.                 'hasDateFilter' => $hasDateFilter,
  667.                 'hasHourFilter' => $hasHourFilter,
  668.                 'deniedWorkshopIds' => $deniedWorkshopIds,
  669.                 'filtersCount' => $filtersCount,
  670.             ]);
  671.             $viewWithCookie $this->setCookie($client->getSlug(), $content);
  672.             return $viewWithCookie;
  673.         } else {
  674.             $alreadyTakenTimeslot false;
  675.             $emptyDataError false;
  676.             $productsFromClientProducts = [];
  677.             $flashWorkshopsList = [];
  678.             $clientProducts $clientProductRepository->getClientProductsForUnloggedUser($client);
  679.             foreach ($clientProducts as $clientProduct) {
  680.                 if (!in_array($clientProduct->getProduct(), $productsFromClientProducts)) {
  681.                     array_push($productsFromClientProducts$clientProduct->getProduct());
  682.                 }
  683.                 // Récupération des FW "Flashlearning"
  684.                 if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
  685.                     $flashWorkshops $flashWorkshopRepository->getByClientProductUnloggedUser($clientProduct);
  686.                     // --- TRI par le prochain créneau >= aujourd'hui ---
  687.                     $tz = new \DateTimeZone('Europe/Paris');
  688.                     $today = new \DateTimeImmutable('today'$tz);
  689.                     $nextFuture = function ($fw) use ($today) {
  690.                         $next null;
  691.                         foreach ($fw->getFlashTimeslots() as $ts) {
  692.                             $d $ts->getDate();
  693.                             if ($d >= $today && ($next === null || $d $next)) {
  694.                                 $next $d;
  695.                             }
  696.                         }
  697.                         return $next;
  698.                     };
  699.                     usort($flashWorkshops, function ($a$b) use ($nextFuture) {
  700.                         $aNext $nextFuture($a);
  701.                         $bNext $nextFuture($b);
  702.                         if ($aNext === null && $bNext === null) {
  703.                             return 0;
  704.                         }
  705.                         if ($aNext === null) {
  706.                             return 1;
  707.                         }
  708.                         if ($bNext === null) {
  709.                             return -1;
  710.                         }
  711.                         return ($aNext $bNext) ? -1;
  712.                     });
  713.                     // --- FIN TRI ---
  714.                     foreach ($flashWorkshops as $flashWorkshop) {
  715.                         $flashTimeslotExtractedDates = [];
  716.                         $flashTimeslotByDateArray = [];
  717.                         // Récupération des dates des timeslots pour affichage
  718.                         foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  719.                             if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
  720.                                 array_push($flashTimeslotExtractedDates$timeslot->getDate());
  721.                             }
  722.                         }
  723.                         // Formattage des dates des Timeslots pour affichage
  724.                         foreach ($flashTimeslotExtractedDates as $date) {
  725.                             $indexDate $date->format('D d M Y');
  726.                             $timeslotArray = [];
  727.                             foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
  728.                                 if ($date == $timeslot->getDate()) {
  729.                                     array_push($timeslotArray$timeslot);
  730.                                     $flashTimeslotByDateArray[$indexDate] = $timeslotArray;
  731.                                 }
  732.                             }
  733.                         }
  734.                         $numwords 10;
  735.                         preg_match("/(\S+\s*){0,$numwords}/"$flashWorkshop->getDescription(), $regs);
  736.                         $shortdesc trim($regs[0]);
  737.                         $restoredDesc $this->restoreTags($shortdesc);
  738.                         $flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop'timeslots' => $flashTimeslotByDateArray'shortDescription' => $restoredDesc];
  739.                         array_push($flashWorkshopsList$flashWorkshopFiltered);
  740.                     }
  741.                 }
  742.             }
  743.             $categories = [];
  744.             foreach ($flashWorkshopsList as $flashWorkshopWithTimeslots) {
  745.                 $fw $flashWorkshopWithTimeslots['flashWorkshopEntity'];
  746.                 if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
  747.                     array_push($categories$fw->getFlashWorkshopType()->getName());
  748.                 }
  749.             }
  750.             $content $this->renderView('page/flashlearning.html.twig', [
  751.                 'products' => $productsFromClientProducts,
  752.                 'flashWorkshops' => $flashWorkshopsList,
  753.                 'flashWorkshopsReservedForUser' => [],
  754.                 'client' => $client,
  755.                 'alreadyTakenTimeslot' => $alreadyTakenTimeslot,
  756.                 'emptyDataError' => $emptyDataError,
  757.                 'categories' => $categories,
  758.                 'hasFilters' => $hasFilters,
  759.                 'hasDisplayFilter' => $hasDisplayFilter,
  760.                 'hasEventTypeFilter' => $hasEventTypeFilter,
  761.                 'hasCategoryFilter' => $hasCategoryFilter,
  762.                 'hasDateFilter' => $hasDateFilter,
  763.                 'hasHourFilter' => $hasHourFilter,
  764.             ]);
  765.             $viewWithCookie $this->setCookie($client->getSlug(), $content);
  766.             return $viewWithCookie;
  767.         }
  768.     }
  769.     /**
  770.      * @Route("/{slug}/produits/defi-inclusion", name="app_defi-inclusion")
  771.      * @Security("is_granted('ROLE_USER')")
  772.      */
  773.     public function inclusionDefi(Client $clientRequest $requestClientProductRepository $clientProductRepositoryDefiSlideRepository $defiSlideRepositoryUserProductRepository $userProductRepositoryDefiQuestionRepository $defiQuestionRepositoryDefiAnswerUserRepository $defiAnswerUserRepositoryManagerRegistry $doctrine)
  774.     {
  775.         $form $this->createForm(DisabledQuizzFormType::class);
  776.         $form->handleRequest($request);
  777.         $forcedForm $this->createForm(ForcedDisabledFormType::class);
  778.         $forcedForm->handleRequest($request);
  779.         $clientProducts $clientProductRepository->getIncomingDefiByClient($this->getUser()->getClient());
  780.         $now = new DateTime();
  781.         foreach ($clientProducts as $clientProduct) {
  782.             $firstSlide $defiSlideRepository->getFirstSlideForClientProduct($clientProduct);
  783.             $interval $now->diff($clientProduct->getEndAt());
  784.             $clientProduct->setInterval($interval->format('%a'));
  785.             $clientProduct->setFirstSlide($firstSlide);
  786.             $userProduct $userProductRepository->findOneBy(['clientProduct' => $clientProduct'user' => $this->getUser()]);
  787.             if ($userProduct != null) {
  788.                 $clientProduct->setUserHasUserProduct(true);
  789.             }
  790.             if ($userProduct != null && $userProduct->isHasDone() == true ){
  791.                 return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
  792.             }
  793.     
  794.             $content $this->renderView('page/defi_inclusion.html.twig', [
  795.                 'clientProducts' => $clientProducts,
  796.                 'form' => $form->createView(),
  797.                 'client' => $client,
  798.                 'userProduct' => $userProduct,
  799.                 'forcedForm' => $forcedForm->createView()
  800.             ]);
  801.         }
  802.         if ($form->isSubmitted() && $form->isValid()) {
  803.             // dd('ici');
  804.             $clientProduct $clientProductRepository->findOneById($form->get('clientProduct')->getData());
  805.             $alreadyExistingUserProduct $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $clientProduct);
  806.             if ($alreadyExistingUserProduct == null) {
  807.                 $userProduct = new UserProduct();
  808.                 $userProduct->setUser($this->getUser());
  809.                 $userProduct->setClientProduct($clientProduct);
  810.                 if ($clientProduct->isForcedDisabled() == true) {
  811.                     $userProduct->setDisabledSituation(true);
  812.                 } else if ($form->get('yesOrNo')->getData() == "1") {
  813.                     $userProduct->setDisabledSituation(true);
  814.                 } else {
  815.                     $userProduct->setDisabledSituation(false);
  816.                 }
  817.                 $userProduct->setHasDone(false);
  818.                 $userProduct->setCreatedAt(new DateTime());
  819.                 $userProduct->setModifiedAt(new DateTime());
  820.                 $doctrine->getManager()->persist($userProduct);
  821.                 $doctrine->getManager()->flush();
  822.             } else {
  823.                 $firstUnansweredQuestion = [];
  824.                 // Retrieve the good quizz
  825.                 $clientProductSlides $defiSlideRepository->findBy(['clientProduct' => $clientProduct]);
  826.                 foreach ($clientProductSlides as $slide) {
  827.                     // If slide contains questions
  828.                     if ($slide->getDefiSlideType()->getName() != 'contenu' && $slide->getDefiSlideType()->getName() != 'fin') {
  829.                         foreach ($slide->getDefiQuestions() as $question) {
  830.                             // Rertrieve user answer for this question
  831.                             $userAnswer $defiAnswerUserRepository->findOneBy(['defiQuestion' => $question'user' => $this->getUser()]);
  832.                             // If no answer put question in a array and use the first question in the array for the redirection
  833.                             if ($userAnswer == null) {
  834.                                 array_push($firstUnansweredQuestion$question);
  835.                             }
  836.                         }
  837.                     }
  838.                 }
  839.                 if (!empty($firstUnansweredQuestion)) {
  840.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $firstUnansweredQuestion[0]->getDefiSlide()->getId(), 'questionId' => $firstUnansweredQuestion[0]->getId()], Response::HTTP_SEE_OTHER);
  841.                 } else {
  842.                     return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
  843.                 }
  844.             }
  845.             if ($clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'cascade' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'question' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'vote') {
  846.                 $firstQuestion $defiQuestionRepository->findOneBy(['defiSlide' => $clientProduct->getFirstSlide(), 'position' => 1'isActive' => 1]);
  847.                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId(), 'questionId' => $firstQuestion->getId()], Response::HTTP_SEE_OTHER);
  848.             } else {
  849.                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId()], Response::HTTP_SEE_OTHER);
  850.             }
  851.         }
  852.         if ($forcedForm->isSubmitted() && $forcedForm->isValid()) {
  853.             $clientProduct $clientProductRepository->findOneById($forcedForm->get('clientProduct')->getData());
  854.             $alreadyExistingUserProduct $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $clientProduct);
  855.             if ($alreadyExistingUserProduct == null) {
  856.                 $userProduct = new UserProduct();
  857.                 $userProduct->setUser($this->getUser());
  858.                 $userProduct->setClientProduct($clientProduct);
  859.                 $userProduct->setDisabledSituation(true);
  860.                 $userProduct->setHasDone(false);
  861.                 $userProduct->setCreatedAt(new DateTime());
  862.                 $userProduct->setModifiedAt(new DateTime());
  863.                 $doctrine->getManager()->persist($userProduct);
  864.                 $doctrine->getManager()->flush();
  865.             } else {
  866.                 $firstUnansweredQuestion = [];
  867.                 // Retrieve the good quizz
  868.                 $clientProductSlides $defiSlideRepository->findBy(['clientProduct' => $clientProduct]);
  869.                 foreach ($clientProductSlides as $slide) {
  870.                     // If slide contains questions
  871.                     if ($slide->getDefiSlideType()->getName() != 'contenu' && $slide->getDefiSlideType()->getName() != 'fin') {
  872.                         foreach ($slide->getDefiQuestions() as $question) {
  873.                             // Rertrieve user answer for this question
  874.                             $userAnswer $defiAnswerUserRepository->findOneBy(['defiQuestion' => $question'user' => $this->getUser()]);
  875.                             // If no answer put question in a array and use the first question in the array for the redirection
  876.                             if ($userAnswer == null) {
  877.                                 array_push($firstUnansweredQuestion$question);
  878.                             }
  879.                         }
  880.                     }
  881.                 }
  882.                 if (!empty($firstUnansweredQuestion)) {
  883.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $firstUnansweredQuestion[0]->getDefiSlide()->getId(), 'questionId' => $firstUnansweredQuestion[0]->getId()], Response::HTTP_SEE_OTHER);
  884.                 } else {
  885.                     return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
  886.                 }
  887.             }
  888.             if ($clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'cascade' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'question' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'vote') {
  889.                 $firstQuestion $defiQuestionRepository->findOneBy(['defiSlide' => $clientProduct->getFirstSlide(), 'position' => 1'isActive' => 1]);
  890.                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId(), 'questionId' => $firstQuestion->getId()], Response::HTTP_SEE_OTHER);
  891.             } else {
  892.                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId()], Response::HTTP_SEE_OTHER);
  893.             }
  894.         }
  895.         
  896.         if ($userProduct != null && $userProduct->isHasDone() == true ){
  897.             return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
  898.         }
  899.         $content $this->renderView('page/defi_inclusion.html.twig', [
  900.             'clientProducts' => $clientProducts,
  901.             'form' => $form->createView(),
  902.             'client' => $client,
  903.             'forcedForm' => $forcedForm->createView()
  904.         ]);
  905.         $viewWithCookie $this->setCookie($client->getSlug(), $content);
  906.         return $viewWithCookie;
  907.     }
  908.     /**
  909.      * @Route("/produits/defi-inclusion/quizz/resultats", name="app_inclusion_defi_quizz_result")
  910.      * @Security("is_granted('ROLE_USER')")
  911.      */
  912.     public function inclusionDefiQuizzResult(
  913.         UserProductRepository $userProductRepository,
  914.         DefiQuestionRepository $defiQuestionRepository,
  915.         DefiSlideRepository $defiSlideRepository,
  916.         DefiAnswerRepository $defiAnswerRepository,
  917.         DefiAnswerUserRepository $defiAnswerUserRepository,
  918.         ManagerRegistry $doctrine,
  919.         Request $request,
  920.         MailerInterface $mailer
  921.     ) {
  922.         $userProduct $userProductRepository->findOneBy(['user' => $this->getUser()], ['id' => 'DESC']);
  923.         if ($request->isMethod('post')) {
  924.             $rootUrl = (!empty($_SERVER['HTTPS']) ? 'https' 'http') . '://' $_SERVER['HTTP_HOST'] . '/';
  925.             $getEmails explode("\r\n"$request->request->get('email'));
  926.             foreach ($getEmails as $email) {
  927.                 $invitationMail = (new TemplatedEmail())
  928.                     ->from(new Address('no-reply@avisea.net''Ween'))
  929.                     ->context(['userProduct' => $userProduct'platformUrl' => $rootUrl])
  930.                     ->to($email)
  931.                     ->subject('Invitation au Défi de l\'inclusion')
  932.                     ->htmlTemplate('email/invitation.html.twig');
  933.                 $mailer->send($invitationMail);
  934.             }
  935.         }
  936.         $doctrine->getManager()->persist($userProduct);
  937.         $doctrine->getManager()->flush();
  938.         $slides $defiSlideRepository->findByClientProduct($userProduct->getClientProduct());
  939.         $totalQuestionCount 0;
  940.         $goodAnswerCount 0;
  941.         foreach ($slides as $slide) {
  942.             $totalQuestionCount $totalQuestionCount count($slide->getDefiQuestions());
  943.             $questions $defiQuestionRepository->findByDefiSlide($slide);
  944.             if ($slide->getDefiSlideType()->getName() == 'cascade') {
  945.                 $deniedLocationsArray = [];
  946.                 $questionsCascade $slide->getDefiQuestions();
  947.                 foreach ($questionsCascade as $question) {
  948.                     $deniedLocations $question->getDeniedLocation();
  949.                     foreach ($deniedLocations as $location) {
  950.                         if (!in_array($location->getName(), $deniedLocationsArray)) {
  951.                             array_push($deniedLocationsArray$location->getName());
  952.                         }
  953.                     }
  954.                 }
  955.                 if($this->getUser()->getLocation() != null){
  956.                     if (in_array($this->getUser()->getLocation()->getName(), $deniedLocationsArray)) {
  957.                         $totalQuestionCount $totalQuestionCount count($slide->getDefiQuestions());
  958.                     }
  959.                 }
  960.             }
  961.             foreach ($questions as $question) {
  962.                 if ($question->getDefiSlide()->getDefiSlideType()->getName() != 'cascade') {
  963.                     foreach ($question->getDeniedLocation() as $location) {
  964.                         if ($location == $this->getUser()->getLocation()) {
  965.                             $totalQuestionCount--;
  966.                         }
  967.                     }
  968.                 }
  969.                 switch ($question->getDefiQuestionType()->getName()) {
  970.                     case 'mcq':
  971.                         $givenUserAnswers $defiAnswerUserRepository->findBy(['user' => $this->getUser(), 'defiQuestion' => $question]);
  972.                         if ($givenUserAnswers != null) {
  973.                             $answersArray = [];
  974.                             foreach ($givenUserAnswers as $givenAnswer) {
  975.                                 array_push($answersArray$givenAnswer->getDefiAnswer()->getId());
  976.                             }
  977.                             $goodAnswersArray = [];
  978.                             $goodAnswers $defiAnswerRepository->findBy(['defiQuestion' => $question'isCorrect' => true]);
  979.                             foreach ($goodAnswers as $goodAnswer) {
  980.                                 array_push($goodAnswersArray$goodAnswer->getId());
  981.                             }
  982.                             if (array_diff($answersArray$goodAnswersArray) == null) {
  983.                                 $goodAnswerCount++;
  984.                                 if ($userProduct->isHasDone() == false) {
  985.                                     if ($userProduct->getScore() != null) {
  986.                                         $score $userProduct->getScore() + $question->getPoint();
  987.                                         $userProduct->setScore($score);
  988.                                     } else {
  989.                                         $userProduct->setScore($question->getPoint());
  990.                                     }
  991.                                 }
  992.                                 $doctrine->getManager()->persist($userProduct);
  993.                                 $doctrine->getManager()->flush();
  994.                             } else {
  995.                                 if ($userProduct->isHasDone() == false) {
  996.                                     if ($userProduct->getScore() == null) {
  997.                                         $userProduct->setScore(0);
  998.                                     }
  999.                                 }
  1000.                             }
  1001.                         }
  1002.                         break;
  1003.                     case 'sqc':
  1004.                     case 'tf':
  1005.                         $givenUserAnswer $defiAnswerUserRepository->findOneBy(['user' => $this->getUser(), 'defiQuestion' => $question]);
  1006.                         if ($givenUserAnswer != null) {
  1007.                             $givenAnswer $givenUserAnswer->getDefiAnswer();
  1008.                             $goodAnswer $defiAnswerRepository->findOneBy(['defiQuestion' => $question'isCorrect' => true]);
  1009.                             if ($givenAnswer === $goodAnswer) {
  1010.                                 $goodAnswerCount++;
  1011.                                 if ($userProduct->isHasDone() == false) {
  1012.                                     if ($userProduct->getScore() != null) {
  1013.                                         $score $userProduct->getScore() + $question->getPoint();
  1014.                                         $userProduct->setScore($score);
  1015.                                     } else {
  1016.                                         $userProduct->setScore($question->getPoint());
  1017.                                     }
  1018.                                 }
  1019.                             } else {
  1020.                                 if ($userProduct->isHasDone() == false) {
  1021.                                     if ($userProduct->getScore() == null) {
  1022.                                         $userProduct->setScore(0);
  1023.                                     }
  1024.                                 }
  1025.                             }
  1026.                             $doctrine->getManager()->persist($userProduct);
  1027.                             $doctrine->getManager()->flush();
  1028.                         }
  1029.                         break;
  1030.                 }
  1031.             }
  1032.         }
  1033.         $userProduct->setHasDone(true);
  1034.         $doctrine->getManager()->persist($userProduct);
  1035.         $doctrine->getManager()->flush();
  1036.         $allUserProducts $userProductRepository->findBy(['clientProduct' => $userProduct->getClientProduct(), 'hasDone' => true]);
  1037.         $averagePoints 0;
  1038.         foreach ($allUserProducts as $uProduct) {
  1039.             $averagePoints $averagePoints $uProduct->getScore();
  1040.         }
  1041.         $averageScore $averagePoints count($allUserProducts);
  1042.         $roundedAverageScore round($averageScore);
  1043.         return $this->render('page/quizz_result.html.twig', [
  1044.             'questionCount' => $totalQuestionCount,
  1045.             'goodAnswerCount' => $goodAnswerCount,
  1046.             'userProduct' => $userProduct,
  1047.             'averageScore' => $roundedAverageScore,
  1048.             'client' => $userProduct->getClientProduct()->getClient(),
  1049.         ]);
  1050.     }
  1051.     /**
  1052.      * @Route("/produits/defi-inclusion/quizz/{id}/{questionId}", name="app_inclusion_defi_quizz")
  1053.      * @Security("is_granted('ROLE_USER')")
  1054.      */
  1055.     public function inclusionDefiQuizz(Request $request$questionId nullDefiSlide $defiSlideDefiSlideRepository $defiSlideRepositoryDefiAnswerRepository $defiAnswerRepositoryDefiQuestionRepository $defiQuestionRepositoryUserProductRepository $userProductRepositoryDefiAnswerUserRepository $defiAnswerUserRepositoryManagerRegistry $doctrine)
  1056.     {
  1057.         $client $defiSlide->getClientProduct()->getClient();
  1058.         $nextSlide $defiSlideRepository->nextDefiSlideForClientProduct($defiSlide->getClientProduct(), $defiSlide->getPosition());
  1059.         $previousSlide $defiSlideRepository->previousDefiSlideForClientProduct($defiSlide->getClientProduct(), $defiSlide->getPosition());
  1060.         if(in_array('ROLE_ADMIN'$this->getUser()->getRoles()) == true){
  1061.             $existingUserProduct $userProductRepository->findOneBy(['user' => $this->getUser(), 'clientProduct' => $defiSlide->getClientProduct()]);
  1062.             if($existingUserProduct != null){
  1063.                 $userProduct $existingUserProduct;
  1064.             }else{
  1065.                 $newUserProduct = new UserProduct();
  1066.                 $userProduct $userProductRepository->add($newUserProduct$this->getUser(), $defiSlide->getClientProduct(), true);
  1067.             }
  1068.         }else{
  1069.             $userProduct $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $defiSlide->getClientProduct());
  1070.         }
  1071.         $allSlides $defiSlideRepository->findByClientProduct($userProduct->getClientProduct());
  1072.         if($defiSlide->getDefiSlideType()->getName() == 'contenu'){
  1073.             $getImageExtension explode("."$defiSlide->getMedia());
  1074.             if (isset($getImageExtension[1])) {
  1075.                 $extensionsImages = array(".jpg"".jpeg"".png"".gif"".bmp"".svg"".webp");
  1076.                 $imageExtension '.' $getImageExtension[1];
  1077.                 if (in_array($imageExtension$extensionsImages)) {
  1078.                     $defiSlide->setIsMediaAVideo(false);
  1079.                 } else {
  1080.                     $defiSlide->setIsMediaAVideo(true);
  1081.                 }
  1082.             }
  1083.         }
  1084.         if ($userProduct->isDisabledSituation() == true && $defiSlide->getDefiSlideType()->getName() == 'contenu' && $defiSlide->getPosition() == 1) {
  1085.             $diseases = [];
  1086.             $clientProduct $defiSlide->getClientProduct();
  1087.             $slides $clientProduct->getDefiSlides();
  1088.             foreach ($slides as $slide) {
  1089.                 $questions $slide->getDefiQuestions();
  1090.                 foreach ($questions as $question) {
  1091.                     if ($question->getDisease() != null && !in_array($question->getDisease()->getTitle(), $diseases)) {
  1092.                         array_push($diseases$question->getDisease()->getTitle());
  1093.                     }
  1094.                 }
  1095.             }
  1096.         } else {
  1097.             $diseases null;
  1098.         }
  1099.         // Si nous sommes actuellement sur une question
  1100.         if ($questionId != null) {
  1101.             $actualQuestion $defiQuestionRepository->findOneById($questionId);
  1102.             if ($defiSlide->getDefiSlideType()->getName() != 'cascade') {
  1103.                 // Récupération de la prochaine question DE LA SLIDE EN COURS
  1104.                 $nextQuestion $defiQuestionRepository->getNextQuestion($defiSlide$actualQuestion->getPosition());
  1105.             } else {
  1106.                 $nextQuestion null;
  1107.             }
  1108.             // Récupération de la première question DE LA PROCHAINE SLIDE si il y en a une et si il n'y a plus de question pour la slide en cours
  1109.             if ($nextQuestion == null) {
  1110.                 $actualPosition 0;
  1111.                 if ($nextSlide != null) {
  1112.                     $nextSlideNextQuestion $defiQuestionRepository->getNextQuestion($nextSlide$actualPosition);
  1113.                 } else {
  1114.                     $nextSlideNextQuestion null;
  1115.                 }
  1116.             }
  1117.             if ($actualQuestion->getDefiSlide()->getDefiSlideType()->getId() == 'cascade') {
  1118.                 $slideQuestions $actualQuestion->getDefiSlide()->getDefiQuestions();
  1119.                 $deniedLocations = [];
  1120.                 foreach ($slideQuestions as $question) {
  1121.                     foreach ($question->getDeniedLocation() as $location) {
  1122.                         if (!in_array($location->getName(), $deniedLocations)) {
  1123.                             array_push($deniedLocations$location->getName());
  1124.                         }
  1125.                     }
  1126.                 }
  1127.                 if (in_array($this->getUser()->getLocation()->getName(), $deniedLocations)) {
  1128.                     // Plus de slide, plus de question = fin du quizz
  1129.                     if ($nextSlide == null && $nextQuestion == null) {
  1130.                         return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1131.                         // Prochaine slide de type 'contenu'
  1132.                     } elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
  1133.                         return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1134.                         // Première question de la slide suivante
  1135.                     } elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
  1136.                         return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1137.                     }
  1138.                 }
  1139.             } else {
  1140.                 $deniedLocations $actualQuestion->getDeniedLocation();
  1141.                 foreach ($deniedLocations as $location) {
  1142.                     if ($this->getUser()->getLocation() == $location) {
  1143.                         // Prochaine question, même slide
  1144.                         if ($nextQuestion != null) {
  1145.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1146.                             // Plus de slide, plus de question = fin du quizz
  1147.                         } elseif ($nextSlide == null && $nextQuestion == null) {
  1148.                             return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1149.                             // Prochaine slide de type 'contenu'
  1150.                         } elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
  1151.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1152.                             // Première question de la slide suivante
  1153.                         } elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
  1154.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1155.                         }
  1156.                     }
  1157.                 }
  1158.             }
  1159.         } else {
  1160.             if ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'question' || $nextSlide->getDefiSlideType()->getName() == 'cascade' || $nextSlide->getDefiSlideType()->getName() == 'vote')) {
  1161.                 $nextQuestion $defiQuestionRepository->getFirstQuestion($nextSlide);
  1162.             }
  1163.             $actualQuestion null;
  1164.         }
  1165.         $totalSlideCount count($allSlides);
  1166.         $hiddenQuestions = [];
  1167.         $hiddenSlides = [];
  1168.         foreach ($allSlides as $slide) {
  1169.             $questionsCount count($slide->getDefiQuestions());
  1170.             $hiddenQuestionCount 0;
  1171.             if($this->getUser()->getLocation() != null){
  1172.                 foreach ($slide->getDefiQuestions() as $question) {
  1173.                     foreach ($question->getDeniedLocation() as $location) {
  1174.                         if ($location->getName() == $this->getUser()->getLocation()->getName()) {
  1175.                             $hiddenQuestionCount++;
  1176.                             if (!in_array($question$hiddenQuestions)) {
  1177.                                 array_push($hiddenQuestions$question);
  1178.                             }
  1179.                         }
  1180.                     }
  1181.                 }
  1182.             }
  1183.             if ($questionsCount && $hiddenQuestionCount && $questionsCount == $hiddenQuestionCount && $slide->getDefiSlideType()->getName() != 'cascade') {
  1184.                 $totalSlideCount--;
  1185.                 if (!in_array($slide$hiddenSlides)) {
  1186.                     array_push($hiddenSlides$slide);
  1187.                 }
  1188.             } elseif ($questionsCount && $hiddenQuestionCount && $slide->getDefiSlideType()->getName() == 'cascade') {
  1189.                 $totalSlideCount--;
  1190.                 if (!in_array($slide$hiddenSlides)) {
  1191.                     array_push($hiddenSlides$slide);
  1192.                 }
  1193.             }
  1194.         }
  1195.         foreach ($previousSlide as $k => $slide) {
  1196.             if (!in_array($slide$hiddenSlides)) {
  1197.                 unset($previousSlide[$k]);
  1198.             }
  1199.         }
  1200.         $previousHiddenSlides array_values($previousSlide);
  1201.         $previousHiddenSlidesToCompare = [];
  1202.         $hiddenSlidesToCompare = [];
  1203.         foreach ($previousHiddenSlides as $slide) {
  1204.             array_push($previousHiddenSlidesToCompare$slide->getTitle());
  1205.         }
  1206.         foreach ($hiddenSlides as $slide) {
  1207.             array_push($hiddenSlidesToCompare$slide->getTitle());
  1208.         }
  1209.         if ((!empty($previousHiddenSlides) && !empty($hiddenSlides)) && ($previousHiddenSlides == $hiddenSlides || in_array($previousHiddenSlidesToCompare[0], $hiddenSlidesToCompare))) {
  1210.             $actualQuestionSlidePosition $defiSlide->getPosition() - 1;
  1211.         } else {
  1212.             $actualQuestionSlidePosition null;
  1213.         }
  1214.         if ($request->isMethod('post')) {
  1215.             if ($defiSlide->getDefiSlideType()->getName() == 'contenu' && $nextSlide != null) {
  1216.                 if ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin') {
  1217.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1218.                 } else {
  1219.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1220.                 }
  1221.             }
  1222.             if (($defiSlide->getDefiSlideType()->getName() == 'contenu' || $defiSlide->getDefiSlideType()->getName() == 'fin') && $nextSlide == null) {
  1223.                 return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1224.             }
  1225.             if ($defiSlide->getDefiSlideType()->getName() == 'question' || $defiSlide->getDefiSlideType()->getName() == 'cascade' || $defiSlide->getDefiSlideType()->getName() == 'vote') {
  1226.                 if ($request->request->all() == null) {
  1227.                     $alreadyExistingUserAnswer $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
  1228.                     if ($alreadyExistingUserAnswer == null) {
  1229.                         $emptyFormError 'Veuillez répondre à la question pour continuer.';
  1230.                         return $this->render('page/defi_slide.html.twig', [
  1231.                             'defiSlide' => $defiSlide,
  1232.                             'actualQuestion' => $actualQuestion,
  1233.                             'diseases' => $diseases,
  1234.                             'emptyFormError' => $emptyFormError,
  1235.                             'slideCount' => $totalSlideCount,
  1236.                             'userProduct' => $userProduct,
  1237.                             'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
  1238.                             'client' => $client
  1239.                         ]);
  1240.                     } else {
  1241.                         // Prochaine question, même slide
  1242.                         if ($nextQuestion != null) {
  1243.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1244.                             // Plus de slide, plus de question = fin du quizz
  1245.                         } elseif ($nextSlide == null && $nextQuestion == null) {
  1246.                             return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1247.                             // Prochaine slide de type 'contenu'
  1248.                         } elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
  1249.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1250.                             // Première question de la slide suivante
  1251.                         } elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
  1252.                             return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1253.                         }
  1254.                     }
  1255.                 }
  1256.                 $dateTimeObject = new DateTime();
  1257.                 $userProduct->setModifiedAt($dateTimeObject);
  1258.                 $doctrine->getManager()->persist($userProduct);
  1259.                 $doctrine->getManager()->flush();
  1260.                 if (is_array($request->request->get('answer'))) {
  1261.                     $alreadyExistingUserAnswer $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
  1262.                     if ($alreadyExistingUserAnswer == null) {
  1263.                         $defiAnswerUserArray = [];
  1264.                         foreach ($request->request->get('answer') as $answer) {
  1265.                             $submittedAnswerIsCorrect explode("|"$answer)[0];
  1266.                             $submittedAnswerId explode("|"$answer)[1];
  1267.                             $submittedAnswerQuestionId explode("|"$answer)[2];
  1268.                             $submittedAnswer $defiAnswerRepository->findOneById($submittedAnswerId);
  1269.                             $submittedAnswerQuestion $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
  1270.                             $defiAnswerUser = new DefiAnswerUser();
  1271.                             $defiAnswerUser->setDefiAnswer($submittedAnswer);
  1272.                             $defiAnswerUser->setUser($this->getUser());
  1273.                             $defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
  1274.                             if ($submittedAnswerIsCorrect == "1") {
  1275.                                 $defiAnswerUser->setIsCorrect(true);
  1276.                             } else {
  1277.                                 $defiAnswerUser->setIsCorrect(false);
  1278.                             }
  1279.                             $defiAnswerUser->setCreatedAt($dateTimeObject);
  1280.                             $defiAnswerUser->setModifiedAt($dateTimeObject);
  1281.                             $doctrine->getManager()->persist($defiAnswerUser);
  1282.                             $doctrine->getManager()->flush();
  1283.                             array_push($defiAnswerUserArray$defiAnswerUser);
  1284.                             if ($submittedAnswer->isIsCorrect() == true) {
  1285.                                 $submittedAnswer->setIsValidated(true);
  1286.                             } else {
  1287.                                 $submittedAnswer->setIsValidated(false);
  1288.                             }
  1289.                         }
  1290.                         $submittedGoodAnswerCount 0;
  1291.                         $submittedBadAnswerCount =  0;
  1292.                         foreach ($defiAnswerUserArray as $defiAnswerUser) {
  1293.                             if ($defiAnswerUser->isIsCorrect() == true) {
  1294.                                 $submittedGoodAnswerCount++;
  1295.                             } else {
  1296.                                 $submittedBadAnswerCount++;
  1297.                             }
  1298.                         }
  1299.                         $goodAnswerCount =  0;
  1300.                         foreach ($actualQuestion->getDefiAnswers() as $answer) {
  1301.                             if ($answer->isIsCorrect() == true) {
  1302.                                 $goodAnswerCount++;
  1303.                             }
  1304.                         }
  1305.                         if ($submittedGoodAnswerCount == $goodAnswerCount && $submittedBadAnswerCount == 0) {
  1306.                             $validatedMcq true;
  1307.                         } else {
  1308.                             $validatedMcq false;
  1309.                         }
  1310.                         return $this->render('page/defi_slide.html.twig', [
  1311.                             'defiSlide' => $defiSlide,
  1312.                             'actualQuestion' => $actualQuestion,
  1313.                             'diseases' => $diseases,
  1314.                             'validationMultipleChoice' => true,
  1315.                             'slideCount' => $totalSlideCount,
  1316.                             'validatedMcq' => $validatedMcq,
  1317.                             'userProduct' => $userProduct,
  1318.                             'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
  1319.                             'client' => $client
  1320.                         ]);
  1321.                     }
  1322.                 } elseif (array_key_exists('answer1'$request->request->all())) {
  1323.                     $alreadyExistingUserAnswer $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
  1324.                     if ($alreadyExistingUserAnswer == null) {
  1325.                         $defiAnswerUserArray = [];
  1326.                         $validatedQuestionsCount 0;
  1327.                         foreach ($request->request->all() as $answer) {
  1328.                             $submittedAnswerIsCorrect explode("|"$answer)[0];
  1329.                             $submittedAnswerId explode("|"$answer)[1];
  1330.                             $submittedAnswerQuestionId explode("|"$answer)[2];
  1331.                             $submittedAnswer $defiAnswerRepository->findOneById($submittedAnswerId);
  1332.                             $submittedAnswerQuestion $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
  1333.                             $defiAnswerUser = new DefiAnswerUser();
  1334.                             $defiAnswerUser->setDefiAnswer($submittedAnswer);
  1335.                             $defiAnswerUser->setUser($this->getUser());
  1336.                             $defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
  1337.                             if ($submittedAnswerIsCorrect == "1") {
  1338.                                 $defiAnswerUser->setIsCorrect(true);
  1339.                             } else {
  1340.                                 $defiAnswerUser->setIsCorrect(false);
  1341.                             }
  1342.                             $defiAnswerUser->setCreatedAt($dateTimeObject);
  1343.                             $defiAnswerUser->setModifiedAt($dateTimeObject);
  1344.                             $doctrine->getManager()->persist($defiAnswerUser);
  1345.                             $doctrine->getManager()->flush();
  1346.                             array_push($defiAnswerUserArray$defiAnswerUser);
  1347.                             if ($submittedAnswer->isIsCorrect() == true) {
  1348.                                 $submittedAnswer->setIsValidated(true);
  1349.                                 $submittedAnswer->getDefiQuestion()->setIsValidated(true);
  1350.                                 $validatedQuestionsCount++;
  1351.                             } else {
  1352.                                 $submittedAnswer->setIsValidated(false);
  1353.                                 $submittedAnswer->getDefiQuestion()->setIsValidated(false);
  1354.                             }
  1355.                             if ($validatedQuestionsCount == 0) {
  1356.                                 $validatedCascade 'KO';
  1357.                             } elseif ($validatedQuestionsCount == count($defiSlide->getDefiQuestions())) {
  1358.                                 $validatedCascade 'OK';
  1359.                             } elseif ($validatedQuestionsCount >= 1) {
  1360.                                 $validatedCascade 'NOK';
  1361.                             }
  1362.                         }
  1363.                         return $this->render('page/defi_slide.html.twig', [
  1364.                             'defiSlide' => $defiSlide,
  1365.                             'actualQuestion' => $actualQuestion,
  1366.                             'diseases' => $diseases,
  1367.                             'slideCount' => $totalSlideCount,
  1368.                             'validationCascade' => true,
  1369.                             'userProduct' => $userProduct,
  1370.                             'validatedCascade' => $validatedCascade,
  1371.                             'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
  1372.                             'client' => $client
  1373.                         ]);
  1374.                     }
  1375.                 } else {
  1376.                     $submittedAnswerIsCorrect explode("|"$request->request->get('answer'))[0];
  1377.                     $submittedAnswerId explode("|"$request->request->get('answer'))[1];
  1378.                     $submittedAnswerQuestionId explode("|"$request->request->get('answer'))[2];
  1379.                     $submittedAnswer $defiAnswerRepository->findOneById($submittedAnswerId);
  1380.                     $submittedAnswerQuestion $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
  1381.                     $extensionsImages = array(".jpg"".jpeg"".png"".gif"".bmp"".svg"".webp");
  1382.                     $getImageExtension explode("."$submittedAnswerQuestion->getExplanationMedia());
  1383.                     if (isset($getImageExtension[1])) {
  1384.                         $imageExtension '.' $getImageExtension[1];
  1385.                         if (in_array($imageExtension$extensionsImages)) {
  1386.                             $submittedAnswerQuestion->setIsMediaAVideo(false);
  1387.                         } else {
  1388.                             $submittedAnswerQuestion->setIsMediaAVideo(true);
  1389.                         }
  1390.                     }
  1391.                     $alreadyExistingUserAnswer $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $submittedAnswerQuestion);
  1392.                     if ($alreadyExistingUserAnswer == null) {
  1393.                         $defiAnswerUser = new DefiAnswerUser();
  1394.                         $defiAnswerUser->setDefiAnswer($submittedAnswer);
  1395.                         $defiAnswerUser->setUser($this->getUser());
  1396.                         $defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
  1397.                         if ($submittedAnswerIsCorrect == "1" || $defiSlide->getDefiSlideType()->getId() == 5) {
  1398.                             $defiAnswerUser->setIsCorrect(true);
  1399.                         } else {
  1400.                             $defiAnswerUser->setIsCorrect(false);
  1401.                         }
  1402.                         $defiAnswerUser->setCreatedAt(new DateTime());
  1403.                         $defiAnswerUser->setModifiedAt(new DateTime());
  1404.                         $doctrine->getManager()->persist($defiAnswerUser);
  1405.                         $doctrine->getManager()->flush();
  1406.                         if ($submittedAnswer->isIsCorrect() == true && $defiSlide->getDefiSlideType()->getId() != 5) {
  1407.                             $submittedAnswer->setIsValidated(true);
  1408.                         } else {
  1409.                             $submittedAnswer->setIsValidated(false);
  1410.                         }
  1411.                         if ($defiSlide->getDefiSlideType()->getId() == 5) {
  1412.                             // Prochaine question, même slide
  1413.                             if ($nextQuestion != null) {
  1414.                                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1415.                                 // Plus de slide, plus de question = fin du quizz
  1416.                             } elseif ($nextSlide == null && $nextQuestion == null) {
  1417.                                 return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1418.                                 // Prochaine slide de type 'contenu'
  1419.                             } elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
  1420.                                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1421.                                 // Première question de la slide suivante
  1422.                             } elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
  1423.                                 return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1424.                             }
  1425.                         }
  1426.                         return $this->render('page/defi_slide.html.twig', [
  1427.                             'defiSlide' => $defiSlide,
  1428.                             'actualQuestion' => $actualQuestion,
  1429.                             'diseases' => $diseases,
  1430.                             'validationSingleChoice' => true,
  1431.                             'slideCount' => $totalSlideCount,
  1432.                             'defiAnswerUser' => $defiAnswerUser,
  1433.                             'userProduct' => $userProduct,
  1434.                             'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
  1435.                             'client' => $client
  1436.                         ]);
  1437.                     }
  1438.                 }
  1439.                 // Prochaine question, même slide
  1440.                 if ($nextQuestion != null) {
  1441.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1442.                     // Plus de slide, plus de question = fin du quizz
  1443.                 } elseif ($nextSlide == null && $nextQuestion == null) {
  1444.                     return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
  1445.                     // Prochaine slide de type 'contenu'
  1446.                 } elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'contenu')) {
  1447.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
  1448.                     // Première question de la slide suivante
  1449.                 } elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
  1450.                     return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
  1451.                 }
  1452.             }
  1453.         }
  1454.         return $this->render('page/defi_slide.html.twig', [
  1455.             'defiSlide' => $defiSlide,
  1456.             'actualQuestion' => $actualQuestion,
  1457.             'diseases' => $diseases,
  1458.             'slideCount' => $totalSlideCount,
  1459.             'userProduct' => $userProduct,
  1460.             'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
  1461.             'client' => $client
  1462.         ]);
  1463.     }
  1464.     /**
  1465.      * @Route("/produits/defi-inclusion/{id}/classement", name="app_inclusion_defi_quizz_ranking")
  1466.      * @Security("is_granted('ROLE_USER')")
  1467.      */
  1468.     public function inclusionDefiQuizzRanking(ClientProduct $clientProductUserProductRepository $userProductRepositoryUserRepository $userRepository)
  1469.     {
  1470.         $userProduct $userProductRepository->findOneBy(['user' => $this->getUser(), 'clientProduct' => $clientProduct'hasDone' => true]);
  1471.         $client $userProduct->getClientProduct()->getClient();
  1472.         $locations $userProduct->getClientProduct()->getClient()->getLocations();
  1473.         $subLocations $userProduct->getClientProduct()->getClient()->getSubLocations();
  1474.         $userProductsByLocation = [];
  1475.         $userProductsBySubLocation = [];
  1476.         $locationsArray = [];
  1477.         $subLocationsArray = [];
  1478.         foreach ($locations as $location) {
  1479.             $locationsArray[$location->getName()] = 0;
  1480.             $score 0;
  1481.             $users $userRepository->findByLocation($location);
  1482.             foreach ($users as $user) {
  1483.                 $userProductsByLocation $userProductRepository->findBy(['user' => $user'hasDone' => true]);
  1484.                 foreach ($userProductsByLocation as $userProductByLocation) {
  1485.                     $score $score $userProductByLocation->getScore();
  1486.                     $locationsArray[$location->getName()] = $score;
  1487.                 }
  1488.             }
  1489.         }
  1490.         arsort($locationsArray);
  1491.         foreach ($subLocations as $subLocation) {
  1492.             $subLocationsArray[$subLocation->getName()] = 0;
  1493.             $score 0;
  1494.             $users $userRepository->findBySubLocation($subLocation);
  1495.             foreach ($users as $user) {
  1496.                 $userProductsBySubLocation $userProductRepository->findBy(['user' => $user'hasDone' => true]);
  1497.                 foreach ($userProductsBySubLocation as $userProductBySubLocation) {
  1498.                     $score $score $userProductBySubLocation->getScore();
  1499.                     $subLocationsArray[$subLocation->getName()] = $score;
  1500.                 }
  1501.             }
  1502.         }
  1503.         arsort($subLocationsArray);
  1504.         
  1505.         $allUserProducts $userProductRepository->findBy(['clientProduct' => $userProduct->getClientProduct(), 'hasDone' => true], ['score' => 'DESC''modifiedAt' => 'ASC']);
  1506.         $averagePoints 0;
  1507.         foreach ($allUserProducts as $uProduct) {
  1508.             $averagePoints $averagePoints $uProduct->getScore();
  1509.         }
  1510.         $averageScore $averagePoints count($allUserProducts);
  1511.         $roundedAverageScore round($averageScore);
  1512.         
  1513.         $active '';
  1514.         if($clientProduct->isHasSubLocationLadder() == true){
  1515.             $active 'sublocation';
  1516.         }
  1517.         if($clientProduct->isHasUserLadder() == true){
  1518.             $active 'individual';
  1519.         }
  1520.         if($clientProduct->isHasLocationLadder() == true){
  1521.             $active 'location';
  1522.         }
  1523.         return $this->render('page/defi_inclusion_ranking.html.twig', [
  1524.             'userProduct' => $userProduct,
  1525.             'allUserProducts' => $allUserProducts,
  1526.             'averageScore' => $roundedAverageScore,
  1527.             'locationsArray' => $locationsArray,
  1528.             'subLocationsArray' => $subLocationsArray,
  1529.             'clientProduct' => $clientProduct,
  1530.             'client' => $client,
  1531.             'active' => $active
  1532.         ]);
  1533.     }
  1534.     /**
  1535.      * @Route("/{slug}/produits/outils-diagnostic", name="app_diag_tools")
  1536.      */
  1537.     public function diagTools(Client $client)
  1538.     {
  1539.         
  1540.         $clientProducts = [];
  1541.         foreach ($client->getClientProducts() as $clientProduct) {
  1542.             if ($clientProduct->getProduct()->isIsAutoDiag() == true && $clientProduct->getStartAt() <= new DateTime() && $clientProduct->getEndAt() >= new DateTime() && $clientProduct->isIsActive() == true) {
  1543.                 array_push($clientProducts$clientProduct);
  1544.             }
  1545.         }
  1546.         $content $this->renderView('page/diag_tools.html.twig', [
  1547.             'client' => $client,
  1548.             'clientProducts' => $clientProducts
  1549.         ]);
  1550.         $viewWithCookie $this->setCookie($client->getSlug(), $content);
  1551.         return $viewWithCookie;
  1552.     }
  1553.     /**
  1554.      * @Route("/supprimer-flash-user-workshop/{userSalt}/{id}", name="app_flash_user_workshop_delete")
  1555.      */
  1556.     public function flashUserWorkshopDelete(Request $request$userSaltFlashUserWorkshop $flashUserWorkshopFlashUserWorkshopRepository $flashUserWorkshopRepositoryEntityManagerInterface $entityManagerMailerInterface $mailerLoginLinkHandlerInterface $loginLinkHandlerUserRepository $userRepositoryClientRepository $clientRepository): Response
  1557.     {
  1558.         if ($flashUserWorkshop->getUser()->getSalt() == $userSalt) {
  1559.             if ($flashUserWorkshop->isInQueue() == false) {
  1560.                 $flashTimeslot $flashUserWorkshop->getFlashTimeslot();
  1561.                 $flashWorkshop $flashUserWorkshop->getFlashWorkshop();
  1562.                 $clientColor $flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getMainColor();
  1563.                 $flashUserWorkshopRepository->remove($flashUserWorkshoptrue);
  1564.                 $deleteFuwEmail = (new TemplatedEmail())
  1565.                     ->context([
  1566.                         'flashUserWorkshop' => $flashUserWorkshop,
  1567.                         'timeslot' => $flashTimeslot,
  1568.                         'clientColor' => $clientColor
  1569.                     ])
  1570.                     ->from(new Address('no-reply@avisea.net'$flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getName() . ' - ' $flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getBaseline()))
  1571.                     ->to($flashUserWorkshop->getUser()->getEmail())
  1572.                     ->subject('Votre inscription a été supprimée')
  1573.                     ->htmlTemplate('email/delete_flash_user_workshop.html.twig');
  1574.                 $mailer->send($deleteFuwEmail);
  1575.                 // Récupération du dernier flash user workshop en attente pr ce flashWorkshop
  1576.                 $flashUserWorkshopToUpdate $flashUserWorkshopRepository->getLastInQueueForOneFlashTimeslot($flashTimeslot);
  1577.                 // Si FUW existe, on le met à jour en le sortant de la liste d'attente
  1578.                 if (!empty($flashUserWorkshopToUpdate)) {
  1579.                     $flashUserWorkshopToUpdate->setInQueue(false);
  1580.                     $entityManager->persist($flashUserWorkshopToUpdate);
  1581.                     $entityManager->flush();
  1582.                     $email $flashUserWorkshopToUpdate->getUser()->getEmail();
  1583.                     $user $flashUserWorkshopToUpdate->getUser();
  1584.                     $loginLinkDetails $loginLinkHandler->createLoginLink($user);
  1585.                     $loginLink $loginLinkDetails->getUrl();
  1586.                     $client $user->getClient();
  1587.                     // Mail
  1588.                     $email = (new TemplatedEmail())
  1589.                         ->context([
  1590.                             'loginLink' => $loginLink,
  1591.                             'flashUserWorkshopId' => $flashUserWorkshopToUpdate->getId(),
  1592.                             'client' => $client,
  1593.                             'flashUserWorkshop' => $flashUserWorkshop,
  1594.                             'clientSalt' => $flashUserWorkshopToUpdate->getUser()->getSalt()
  1595.                         ])
  1596.                         ->from(new Address('no-reply@avisea.net'$client->getName() . ' - ' $client->getBaseline()))
  1597.                         ->to($flashUserWorkshopToUpdate->getUser()->getEmail())
  1598.                         ->subject('Votre inscription est confirmée suite à un désistement')
  1599.                         ->htmlTemplate('email/out_waiting_list.html.twig');
  1600.                     $mailer->send($email);
  1601.                 }
  1602.             } else {
  1603.                 $flashUserWorkshopRepository->remove($flashUserWorkshoptrue);
  1604.             }
  1605.             $route $request->headers->get('referer');
  1606.             if ($route != null) {
  1607.                 return $this->redirect($route);
  1608.             } else {
  1609.                 $user $userRepository->findOneBySalt($userSalt);
  1610.                 $client $user->getClient();
  1611.                 return $this->redirectToRoute('app_main', ['clientSlug' => $client->getSlug()]);
  1612.             }
  1613.         } else {
  1614.             throw new AccessDeniedHttpException();
  1615.         }
  1616.     }
  1617.     /**
  1618.      * @Route("/mon-compte/mon-agenda", name="app_my_agenda")
  1619.      * @Security("is_granted('ROLE_USER')")
  1620.      */
  1621.     public function myAgenda(Request $requestClientRepository $clientRepositoryFlashUserWorkshopRepository $flashUserWorkshopRepositoryFlashTimeslotRepository $flashTimeslotRepositoryFlashWorkshopTypeRepository $flashWorkshopTypeRepository)
  1622.     {
  1623.         $client $clientRepository->findOneBySlug($this->getUser()->getClient()->getSlug());
  1624.         // Formulaire de recherche
  1625.         $data = new SearchFlashWorkshopAgenda();
  1626.         if(isset($request->query->get('search_flash_workshop_agenda')['category']) && $request->query->get('search_flash_workshop_agenda')['category'] != null){
  1627.             $data->category $request->query->get('search_flash_workshop_agenda')['category'];
  1628.         }
  1629.         $form $this->createForm(SearchFlashWorkshopAgendaType::class, $data);
  1630.         $form->handleRequest($request);
  1631.         $timeslotsArray $flashUserWorkshopRepository->getNextForOneUser($this->getUser(), $data$flashTimeslotRepository);
  1632.         // Test pour erreur custom si résultat vide par recherche formulaire, ou lorsque l'utilisateur arrive sur la page et n'a pas de session prévue
  1633.         if (isset($_GET["search_flash_workshop_agenda"]) && empty($timeslotsArray)) {
  1634.             $isEmptyFromSearch true;
  1635.         } elseif (!isset($_GET["search_flash_workshop_agenda"]) && empty($timeslotsArray)) {
  1636.             $isEmptyFromSearch false;
  1637.         } else {
  1638.             $isEmptyFromSearch null;
  1639.         }
  1640.         $hasFilters null;
  1641.         $hasEventTypeFilter null;
  1642.         $hasCategoryFilter null;
  1643.         $hasDateFilter null;
  1644.         $hasHourFilter null;
  1645.         $filtersCount 0;
  1646.         if (isset($_GET["search_flash_workshop_agenda"])) {
  1647.             $hasFilters true;
  1648.             if (array_key_exists("onLine"$_GET["search_flash_workshop_agenda"]) || array_key_exists("onSite"$_GET["search_flash_workshop_agenda"])) {
  1649.                 $hasEventTypeFilter true;
  1650.                 $filtersCount++;
  1651.             }
  1652.             if (array_key_exists("category"$_GET["search_flash_workshop_agenda"])) {
  1653.                 $hasCategoryFilter true;
  1654.                 $filtersCount++;
  1655.             }
  1656.             if (array_key_exists("date"$_GET["search_flash_workshop_agenda"])) {
  1657.                 $hasDateFilter true;
  1658.                 $filtersCount++;
  1659.             }
  1660.             if (array_key_exists("hour"$_GET["search_flash_workshop_agenda"])) {
  1661.                 $hasHourFilter true;
  1662.                 $filtersCount++;
  1663.             }
  1664.         }
  1665.         $categories = [];
  1666.         $categoryEntities $flashWorkshopTypeRepository->findAll();
  1667.         foreach ($timeslotsArray as $timeslot) {
  1668.             $fw $timeslot->getFlashWorkshop();
  1669.             if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
  1670.                 array_push($categories$fw->getFlashWorkshopType()->getName());
  1671.             }
  1672.         }
  1673.         return $this->render('page/my_agenda.html.twig', [
  1674.             'client' => $client,
  1675.             'userNextTimeslots' => $timeslotsArray,
  1676.             'form' => $form->createView(),
  1677.             'isEmptyFromSearch' => $isEmptyFromSearch,
  1678.             'hasFilters' => $hasFilters,
  1679.             'categories' => $categories,
  1680.             'categoryEntities' => $categoryEntities,
  1681.             'hasCategoryFilter' => $hasCategoryFilter,
  1682.             'hasEventTypeFilter' => $hasEventTypeFilter,
  1683.             'hasDateFilter' => $hasDateFilter,
  1684.             'hasHourFilter' => $hasHourFilter,
  1685.             'filtersCount' => $filtersCount,
  1686.         ]);
  1687.     }
  1688.     /**
  1689.      * @Route("/{clientSlug}/page/mentions-legales", name="app_legal")
  1690.      */
  1691.     public function legal(ClientRepository $clientRepository$clientSlug)
  1692.     {
  1693.         $client $clientRepository->findOneBySlug($clientSlug);
  1694.         return $this->render('page/legal.html.twig', [
  1695.             'client' => $client
  1696.         ]);
  1697.     }
  1698.     /**
  1699.      * @Route("/{clientSlug}/page/accessibilite", name="app_accessibilite")
  1700.      * 
  1701.      */
  1702.     public function accessibilite(ClientRepository $clientRepository$clientSlug)
  1703.     {
  1704.         $client $clientRepository->findOneBySlug($clientSlug);
  1705.         return $this->render('page/accessibilite.html.twig', [
  1706.             'client' => $client
  1707.         ]);
  1708.     }
  1709.     /**
  1710.      * @Route("/{clientSlug}/page/cgu", name="app_cgu")
  1711.      * 
  1712.      */
  1713.     public function cgu(ClientRepository $clientRepository$clientSlug)
  1714.     {
  1715.         $client $clientRepository->findOneBySlug($clientSlug);
  1716.         return $this->render('page/cgu.html.twig', [
  1717.             'client' => $client
  1718.         ]);
  1719.     }
  1720.     /**
  1721.      * @Route("/{clientSlug}/auto-diagnostic/{id}/{answerId}", name="app_auto_diagnostic_quizz")
  1722.      */
  1723.     public function autoDiagnosticQuizz(Request $requestClientRepository $clientRepository$clientSlugDiagQuestion $diagQuestion$answerId nullDiagQuestionRepository $diagQuestionRepositoryDiagAnswerRepository $diagAnswerRepositoryManagerRegistry $doctrineDiagAnswerUserRepository $diagAnswerUserRepositoryUserRepository $userRepository)
  1724.     {
  1725.         $client $clientRepository->findOneBySlug($clientSlug);
  1726.         $countQuestions count($diagQuestion->getProduct()->getDiagQuestions());
  1727.         $diagQuestion $this->getMediaExtension($diagQuestion);
  1728.         if ($answerId != null) {
  1729.             $answer $diagAnswerRepository->findOneById($answerId);
  1730.             $user $userRepository->findOneByEmail($request->getSession()->get('anonymousUser'));
  1731.             $this->addDiagAnswer($user$answer$diagAnswerUserRepository$doctrine);
  1732.             $nextQuestion $diagQuestionRepository->getNextQuestion($diagQuestion);
  1733.             if ($nextQuestion != null) {
  1734.                 return $this->redirectToRoute('app_auto_diagnostic_quizz', ['clientSlug' => $client->getSlug(), 'id' => $nextQuestion->getId()]);
  1735.             } else {
  1736.                 return $this->redirectToRoute('app_auto_diagnostic_result', ['clientSlug' => $client->getSlug(), 'id' => $diagQuestion->getProduct()->getId(), 'userSalt' => $user->getSalt()]);
  1737.             }
  1738.         } else {
  1739.             if ($diagQuestion->getPosition() == 1) {
  1740.                 $anonymousUser $this->createAnonymousUser($doctrine$client);
  1741.                 $request->getSession()->set('anonymousUser'$anonymousUser->getEmail());
  1742.             }
  1743.         }
  1744.         return $this->render('page/auto_diagnostic.html.twig', [
  1745.             'client' => $client,
  1746.             'question' => $diagQuestion,
  1747.             'countQuestions' => $countQuestions
  1748.         ]);
  1749.     }
  1750.     /**
  1751.      * @Route("/{clientSlug}/auto-diagnostic/{id}/quizz/resultat/{userSalt}", name="app_auto_diagnostic_result")
  1752.      */
  1753.     public function autoDiagnosticResult($clientSlugProduct $product$userSaltUserRepository $userRepositoryClientRepository $clientRepositoryClientProductRepository $clientProductRepository)
  1754.     {
  1755.         $user $userRepository->findOneBySalt($userSalt);
  1756.         $client $clientRepository->findOneBySlug($clientSlug);
  1757.         $clientProduct $clientProductRepository->findOneBy(['client' => $client'product' => $product]);
  1758.         $score 0;
  1759.         $answerUsers $user->getDiagAnswerUsers();
  1760.         foreach ($answerUsers as $answerUser) {
  1761.             if ($answerUser->getDiagAnswer()->getScore() > 0) {
  1762.                 $score $score $answerUser->getDiagAnswer()->getScore();
  1763.             }
  1764.         }
  1765.         if ($score >= $product->getHighScore()) {
  1766.             $result 'High';
  1767.         } elseif ($score >= $product->getMidScore() && $score $product->getHighScore()) {
  1768.             $result 'Mid';
  1769.         } else {
  1770.             $result 'Low';
  1771.         }
  1772.         return $this->render('page/auto_diagnostic_result.html.twig', [
  1773.             'client' => $client,
  1774.             'result' => $result,
  1775.             'product' => $product,
  1776.             'clientProduct' => $clientProduct
  1777.         ]);
  1778.     }
  1779.     /**
  1780.      * @Route("/{clientSlug}/test-auditif/{id}/age", name="app_audition_test_age")
  1781.      */
  1782.     public function auditionTestAge(Request $request$clientSlugClientProduct $clientProductClientRepository $clientRepositoryManagerRegistry $doctrine)
  1783.     {
  1784.         $client $clientRepository->findOneBySlug($clientSlug);
  1785.         if ($request->isMethod('post')) {
  1786.             $this->createAnonymousUser($doctrine$client$request->request->get('age'));
  1787.             return $this->redirectToRoute('app_audition_test_beginning', ['clientSlug' => $client->getSlug(), 'id' => $clientProduct->getId()]);
  1788.         }
  1789.         return $this->render('page/audition_test_age.html.twig', [
  1790.             'client' => $client,
  1791.             'clientProduct' => $clientProduct
  1792.         ]);
  1793.     }
  1794.     /**
  1795.      * @Route("/{clientSlug}/test-auditif/{id}/avant-de-commencer", name="app_audition_test_beginning")
  1796.      */
  1797.     public function auditionTestBeginning($clientSlugClientProduct $clientProductClientRepository $clientRepositoryManagerRegistry $doctrine)
  1798.     {
  1799.         $client $clientRepository->findOneBySlug($clientSlug);
  1800.         return $this->render('page/audition_test_beginning.html.twig', [
  1801.             'client' => $client,
  1802.             'clientProduct' => $clientProduct
  1803.         ]);
  1804.     }
  1805.     /**
  1806.      * @Route("/{clientSlug}/test-auditif/description/{id}", name="app_audition_test_question_description")
  1807.      */
  1808.     public function auditionTestQuestionDescription($clientSlugDiagQuestion $diagQuestionClientRepository $clientRepository)
  1809.     {
  1810.         $client $clientRepository->findOneBySlug($clientSlug);
  1811.         return $this->render('page/audition_test_description.html.twig', [
  1812.             'client' => $client,
  1813.             'question' => $diagQuestion
  1814.         ]);
  1815.     }
  1816.     /**
  1817.      * @Route("/{clientSlug}/test-auditif/question/{id}", name="app_audition_test_question")
  1818.      */
  1819.     public function auditionTestQuestion(Request $request$clientSlugDiagQuestion $diagQuestionClientRepository $clientRepositoryDiagAnswerRepository $diagAnswerRepositoryUserRepository $userRepositoryDiagAnswerUserRepository $diagAnswerUserRepositoryDiagQuestionRepository $diagQuestionRepositoryManagerRegistry $doctrine)
  1820.     {
  1821.         $client $clientRepository->findOneBySlug($clientSlug);
  1822.         if ($request->isMethod('post')) {
  1823.             $answer $diagAnswerRepository->findOneById($request->request->get('answer'));
  1824.             $user $userRepository->findOneByEmail($request->getSession()->get('anonymousUser'));
  1825.             $this->addDiagAnswer($user$answer$diagAnswerUserRepository$doctrine);
  1826.             $nextQuestion $diagQuestionRepository->getNextQuestion($diagQuestion);
  1827.             if ($nextQuestion != null) {
  1828.                 return $this->redirectToRoute('app_audition_test_question_description', ['clientSlug' => $client->getSlug(), 'id' => $nextQuestion->getId()]);
  1829.             } else {
  1830.                 return $this->redirectToRoute('app_audition_test_result', ['clientSlug' => $client->getSlug(), 'id' => $diagQuestion->getProduct()->getId(), 'userSalt' => $user->getSalt()]);
  1831.             }
  1832.         } else {
  1833.             if ($diagQuestion->getPosition() == 1) {
  1834.                 $anonymousUser $this->createAnonymousUser($doctrine$client);
  1835.                 $request->getSession()->set('anonymousUser'$anonymousUser->getEmail());
  1836.             }
  1837.         }
  1838.         return $this->render('page/audition_test_question.html.twig', [
  1839.             'client' => $client,
  1840.             'question' => $diagQuestion
  1841.         ]);
  1842.     }
  1843.     /**
  1844.      * @Route("/{clientSlug}/test-auditif/{id}/quizz/resultat/{userSalt}", name="app_audition_test_result")
  1845.      */
  1846.     public function auditionTestResult(
  1847.         $clientSlugProduct $product$userSaltUserRepository $userRepositoryClientRepository $clientRepository
  1848.         ClientProductRepository $clientProductRepository)
  1849.     {
  1850.         $client $clientRepository->findOneBySlug($clientSlug);
  1851.         $clientProduct $clientProductRepository->getClientProductByClientAndProduct($client3);
  1852.         $user $userRepository->findOneBySalt($userSalt);
  1853.         $score 0;
  1854.         $answerUsers $user->getDiagAnswerUsers();
  1855.         foreach ($answerUsers as $answerUser) {
  1856.             if ($answerUser->getDiagAnswer()->getScore() > 0) {
  1857.                 $score $score $answerUser->getDiagAnswer()->getScore();
  1858.             }
  1859.         }
  1860.         if ($user->getAge() == 'Plus de 60 ans') {
  1861.             if ($score >= $product->getSeniorHighScore()) {
  1862.                 $result 'High';
  1863.             } elseif ($score >= $product->getSeniorMidScore() && $score $product->getSeniorHighScore()) {
  1864.                 $result 'Mid';
  1865.             } else {
  1866.                 $result 'Low';
  1867.             }
  1868.         } else {
  1869.             if ($score >= $product->getHighScore()) {
  1870.                 $result 'High';
  1871.             } elseif ($score >= $product->getMidScore() && $score $product->getHighScore()) {
  1872.                 $result 'Mid';
  1873.             } else {
  1874.                 $result 'Low';
  1875.             }
  1876.         }
  1877.         return $this->render('page/audition_test_result.html.twig', [
  1878.             'result' => $result,
  1879.             'client' => $client,
  1880.             'user' => $user,
  1881.             'score' => $score,
  1882.             'product' => $product,
  1883.             'clientProduct' => $clientProduct
  1884.         ]);
  1885.     }
  1886.     /**
  1887.      * @Route("/{clientSlug}/page/politique-de-confidentialite", name="app_privacy")
  1888.      */
  1889.     public function privacy(ClientRepository $clientRepository$clientSlug)
  1890.     {
  1891.         $client $clientRepository->findOneBySlug($clientSlug);
  1892.         return $this->render('page/privacy.html.twig', [
  1893.             'client' => $client
  1894.         ]);
  1895.     }
  1896.     /**
  1897.      * @Route("/verification-ajax/email", name="app_ajax")
  1898.      */
  1899.     public function emailVerification(Request $requestUserRepository $userRepository)
  1900.     {
  1901.         $fields $request->request->all();
  1902.         $user $userRepository->findOneByEmail($fields['email']);
  1903.         $response = new JsonResponse();
  1904.         if ($user != null) {
  1905.             $password $this->getParameter('app.generic_password');
  1906.             if (password_verify($password$user->getPassword()) == true) {
  1907.                 $response->setContent(json_encode([
  1908.                     'exist' => true,
  1909.                     'generic' => true
  1910.                 ]));
  1911.             } else {
  1912.                 $response->setContent(json_encode([
  1913.                     'exist' => true,
  1914.                     'generic' => false
  1915.                 ]));
  1916.             }
  1917.         } else {
  1918.             $response->setContent(json_encode([
  1919.                 'exist' => false
  1920.             ]));
  1921.         }
  1922.         $response->headers->set('Content-Type''application/json');
  1923.         return $response;
  1924.     }
  1925.     // Navbar des produits fichier base
  1926.     public function renderProductForNavbar(Request $requestClientRepository $clientRepositoryClientProductRepository $clientProductRepository)
  1927. {
  1928.     $explodedUrl explode('/'$_SERVER['REQUEST_URI']);
  1929.     $clientSlugInUrl explode('?_s'$explodedUrl[1])[0];
  1930.     $tabToHide false;
  1931.     if ($this->getUser()) {
  1932.         if ($this->isAuthorized($this->getUser()->getClient()->getSlug()) == true) {
  1933.             $client $this->getUser()->getClient();
  1934.         } else {
  1935.             $client $clientRepository->findOneBySlug($clientSlugInUrl);
  1936.         }
  1937.     } else {
  1938.         $client $clientRepository->findOneBySlug($clientSlugInUrl);
  1939.         if ($client == null) {
  1940.             $client $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
  1941.         }
  1942.     }
  1943.     $clientProducts $clientProductRepository->getIncomingByClient($client);
  1944.     $clientProductsCount count($clientProducts);
  1945.     $diagTools false;
  1946.     $tabToHide false;
  1947.     if (!empty($clientProducts)) {
  1948.         $hasProduct1or2 false;
  1949.         $allIn345 true;
  1950.         foreach ($clientProducts as $clientProduct) {
  1951.             $productId $clientProduct->getProduct()->getId();
  1952.             // Vérifie s'il existe au moins un produit d'ID 1 ou 2
  1953.             if (in_array($productId, [12])) {
  1954.                 $hasProduct1or2 true;
  1955.             }
  1956.             // Vérifie que chaque produit est dans le groupe [3,4,5]
  1957.             if (!in_array($productId, [345])) {
  1958.                 $allIn345 false;
  1959.             }
  1960.         }
  1961.         // Si le client possède au moins un produit 1 ou 2
  1962.         // OU si tous les produits sont dans [3,4,5]
  1963.         if ($hasProduct1or2 || ($clientProductsCount && $allIn345)) {
  1964.             $diagTools true;
  1965.             $tabToHide true;
  1966.         } else {
  1967.             $diagTools false;
  1968.             $tabToHide false;
  1969.         }
  1970.     } else {
  1971.         $diagTools false;
  1972.         $tabToHide false;
  1973.     }
  1974.     
  1975.     return $this->render('page/_navbar_product.html.twig', [
  1976.         'clientProducts'       => $clientProducts,
  1977.         'client'               => $client,
  1978.         'tabToHide'            => $tabToHide,
  1979.         'diagTools'            => $diagTools,
  1980.         'clientProductsCount'  => $clientProductsCount,
  1981.     ]);
  1982. }
  1983. public function renderClientFromUrl(Request $requestClientRepository $clientRepositoryClientProductRepository $clientProductRepository)
  1984. {
  1985.     $explodedUrl explode('/'$_SERVER['REQUEST_URI']);
  1986.     $clientSlugInUrl explode('?_s'$explodedUrl[1])[0];
  1987.     $tabToHide false;
  1988.     if ($this->getUser()) {
  1989.         if ($this->isAuthorized($this->getUser()->getClient()->getSlug())) {
  1990.             $client $this->getUser()->getClient();
  1991.         } else {
  1992.             $client $clientRepository->findOneBySlug($clientSlugInUrl);
  1993.         }
  1994.     } else {
  1995.         $client $clientRepository->findOneBySlug($clientSlugInUrl);
  1996.         if ($client === null) {
  1997.             $client $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
  1998.         }
  1999.     }
  2000.     
  2001.     $clientProducts $clientProductRepository->getIncomingByClient($client);
  2002.     $clientProductsCount count($clientProducts);
  2003.     // Initialisation des indicateurs
  2004.     $hasProduct1or2 false;
  2005.     $allIn345 true;
  2006.     if (!empty($clientProducts)) {
  2007.         foreach ($clientProducts as $clientProduct) {
  2008.             $productId $clientProduct->getProduct()->getId();
  2009.             if (in_array($productId, [12])) {
  2010.                 $hasProduct1or2 true;
  2011.             }
  2012.             if (!in_array($productId, [345])) {
  2013.                 $allIn345 false;
  2014.             }
  2015.         }
  2016.     }
  2017.     // Si le client possède au moins un produit 1 ou 2,
  2018.     // OU s'il possède des produits et que tous sont dans [3,4,5]
  2019.     if ($hasProduct1or2 || ($clientProductsCount && $allIn345)) {
  2020.         $tabToHide true;
  2021.     } else {
  2022.         $tabToHide false;
  2023.     }
  2024.     
  2025.     return $this->render('page/_client_base.html.twig', [
  2026.         'client' => $client,
  2027.         'tabToHide' => $tabToHide
  2028.     ]);
  2029. }
  2030.     public function renderLoginRegisterBtn(Request $requestClientRepository $clientRepository)
  2031.     {
  2032.         $explodedUrl explode('/'$_SERVER['REQUEST_URI']);
  2033.         $clientSlugInUrl explode('?_s'$explodedUrl[1])[0];
  2034.         if ($this->getUser()) {
  2035.             if ($this->isAuthorized($this->getUser()->getClient()->getSlug()) == true) {
  2036.                 $client $this->getUser()->getClient();
  2037.             } else {
  2038.                 $client $clientRepository->findOneBySlug($clientSlugInUrl);
  2039.             }
  2040.         } else {
  2041.             $client $clientRepository->findOneBySlug($clientSlugInUrl);
  2042.             if ($client == null) {
  2043.                 $client $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
  2044.             }
  2045.         }
  2046.         // dd($client);
  2047.         return $this->render('page/_login_register_btn.html.twig', [
  2048.             'client' => $client
  2049.         ]);
  2050.     }
  2051.     public function isAuthorized($clientSlug)
  2052.     {
  2053.         if ($clientSlug != $this->getUser()->getClient()->getSlug()) {
  2054.             return false;
  2055.         } else {
  2056.             return true;
  2057.         }
  2058.     }
  2059.     public function generateRandomString($length 20)
  2060.     {
  2061.         $characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2062.         $charactersLength strlen($characters);
  2063.         $randomString '';
  2064.         for ($i 0$i $length$i++) {
  2065.             $randomString .= $characters[random_int(0$charactersLength 1)];
  2066.         }
  2067.         return $randomString;
  2068.     }
  2069.     public function getMediaExtension(DiagQuestion $diagQuestion)
  2070.     {
  2071.         $imageExtensions = array(".jpg"".jpeg"".png"".gif"".bmp"".svg"".webp");
  2072.         $getMediaExtension explode("."$diagQuestion->getMedia());
  2073.         if (isset($getMediaExtension[1])) {
  2074.             $mediaExtension '.' $getMediaExtension[1];
  2075.             if (!in_array($mediaExtension$imageExtensions)) {
  2076.                 $diagQuestion->setIsMediaAVideo(true);
  2077.             }
  2078.         }
  2079.         return $diagQuestion;
  2080.     }
  2081.     public function createAnonymousUser(ManagerRegistry $doctrineClient $client$age null)
  2082.     {
  2083.         $anonymousUser = new User();
  2084.         $anonymousUser->setClient($client);
  2085.         $anonymousUser->setEmail('Anonymous' $this->generateRandomString());
  2086.         $anonymousUser->setPassword('anonymous');
  2087.         $anonymousUser->setIsVerified(0);
  2088.         $anonymousUser->setSalt($this->generateRandomString(5));
  2089.         $anonymousUser->setIsActive(1);
  2090.         $anonymousUser->setCreatedAt(new DateTime());
  2091.         $anonymousUser->setModifiedAt(new DateTime());
  2092.         if ($age != null) {
  2093.             $anonymousUser->setAge($age);
  2094.         }
  2095.         $manager $doctrine->getManager();
  2096.         $manager->persist($anonymousUser);
  2097.         $manager->flush();
  2098.         return $anonymousUser;
  2099.     }
  2100.     public function addDiagAnswer(User $userDiagAnswer $diagAnswerDiagAnswerUserRepository $diagAnswerUserRepositoryManagerRegistry $doctrine)
  2101.     {
  2102.         $existingDiagAnswerUser $diagAnswerUserRepository->findOneBy(['user' => $user'diagQuestion' => $diagAnswer->getDiagQuestion()]);
  2103.         if ($existingDiagAnswerUser == null) {
  2104.             $diagAnswerUser = new DiagAnswerUser();
  2105.             $diagAnswerUser->setUser($user);
  2106.             $diagAnswerUser->setDiagQuestion($diagAnswer->getDiagQuestion());
  2107.             $diagAnswerUser->setDiagAnswer($diagAnswer);
  2108.             $diagAnswerUser->setCreatedAt(new DateTime());
  2109.             $diagAnswerUser->setModifiedAt(new DateTime());
  2110.             $manager $doctrine->getManager();
  2111.             $manager->persist($diagAnswerUser);
  2112.             $manager->flush();
  2113.             return $diagAnswerUser;
  2114.         } else {
  2115.             return false;
  2116.         }
  2117.     }
  2118.     public function setCookie($clientSlug$content)
  2119.     {
  2120.         
  2121.         switch ($_ENV['ACTUAL_ENV']) {
  2122.             case 'local':
  2123.                 $clientSlugCookie = new Cookie(
  2124.                     'clientSlug',
  2125.                     $clientSlug,
  2126.                     strtotime('+1 year'),
  2127.                     '/',
  2128.                     'plateform.localhost',
  2129.                     true,
  2130.                     true
  2131.                 );
  2132.                 break;
  2133.             case 'demo':
  2134.                 $clientSlugCookie = new Cookie(
  2135.                     'clientSlug',
  2136.                     $clientSlug,
  2137.                     strtotime('+1 year'),
  2138.                     '/',
  2139.                     'demo.plateform.jobinlive.fr',
  2140.                     true,
  2141.                     true
  2142.                 );
  2143.                 break;
  2144.             case 'preprod':
  2145.                 $clientSlugCookie = new Cookie(
  2146.                     'clientSlug',
  2147.                     $clientSlug,
  2148.                     strtotime('+1 year'),
  2149.                     '/',
  2150.                     'preprod.plateform.jobinlive.fr',
  2151.                     true,
  2152.                     true
  2153.                 );
  2154.                 break;
  2155.             case 'prod':
  2156.                 $clientSlugCookie = new Cookie(
  2157.                     'clientSlug',
  2158.                     $clientSlug,
  2159.                     strtotime('+1 year'),
  2160.                     '/',
  2161.                     'app-ween.fr',
  2162.                     true,
  2163.                     true
  2164.                 );
  2165.                 break;
  2166.         }
  2167.         $response = new Response();
  2168.         $response->setContent($content);
  2169.         $response->headers->setCookie($clientSlugCookie);
  2170.         return $response;
  2171.     }
  2172.     public function restoreTags($input)
  2173.     {
  2174.         $opened = array();
  2175.         // loop through opened and closed tags in order
  2176.         if (preg_match_all("/<(\/?[a-z]+)>?/i"$input$matches)) {
  2177.             foreach ($matches[1] as $tag) {
  2178.                 if (preg_match("/^[a-z]+$/i"$tag$regs)) {
  2179.                     // a tag has been opened
  2180.                     if (strtolower($regs[0]) != 'br'$opened[] = $regs[0];
  2181.                 } elseif (preg_match("/^\/([a-z]+)$/i"$tag$regs)) {
  2182.                     // a tag has been closed
  2183.                     // unset($opened[array_pop(array_keys($opened, $regs[1]))]);
  2184.                 }
  2185.             }
  2186.         }
  2187.         // close tags that are still open
  2188.         if ($opened) {
  2189.             $tagstoclose array_reverse($opened);
  2190.             foreach ($tagstoclose as $tag$input .= "</$tag>";
  2191.         }
  2192.         return $input;
  2193.     }
  2194.     function truncateWords($input$numwords$padding "")
  2195.     {
  2196.         $output strtok($input" \n");
  2197.         while (--$numwords 0$output .= " " strtok(" \n");
  2198.         if ($output != $input$output .= $padding;
  2199.         return $output;
  2200.     }
  2201.     /**
  2202.      * @param FlashWorkshop[] $events
  2203.      * @param array $ids
  2204.      * @return FlashWorkshop[]
  2205.      */
  2206.     function filterFlashWorkshops(array $events, array $ids): array
  2207.     {
  2208.         $filteredEvents array_filter($events, function (FlashWorkshop $event) use ($ids) {
  2209.             return !in_array($event->getId(), $ids);
  2210.         });
  2211.     
  2212.         // Réindexer le tableau
  2213.         return array_values($filteredEvents);
  2214.     }
  2215. }