src/Controller/PageController.php line 72

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