src/Controller/Front/LibraryController.php line 129

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Course;
  4. use App\Entity\CourseView;
  5. use App\Entity\Job;
  6. use App\Entity\Live;
  7. use App\Entity\LiveView;
  8. use App\Entity\Module;
  9. use App\Entity\ModuleNotice;
  10. use App\Entity\ModuleParticipation;
  11. use App\Entity\ModuleView;
  12. use App\Entity\Program;
  13. use App\Entity\ProgramParticipation;
  14. use App\Entity\Quiz;
  15. use App\Entity\QuizQuestion;
  16. use App\Entity\QuizView;
  17. use App\Entity\User;
  18. use App\Entity\UserModuleParticipation;
  19. use App\Entity\UserProgramParticipation;
  20. use App\Entity\UserQuizQuestion;
  21. use App\Entity\ModuleObjective;
  22. use App\Form\DataTransformer\ModuleToEntityTransformer;
  23. use App\Form\ModuleNoticeType;
  24. use App\Helper\ControllerHelper;
  25. use App\Repository\CourseRepository;
  26. use App\Repository\CourseViewRepository;
  27. use App\Repository\FeaturedModuleRepository;
  28. use App\Repository\JobRepository;
  29. use App\Repository\LiveRepository;
  30. use App\Repository\LiveViewRepository;
  31. use App\Repository\ModuleItemRepository;
  32. use App\Repository\ModuleLikeRepository;
  33. use App\Repository\ModuleNoticeRepository;
  34. use App\Repository\ModuleParticipationRepository;
  35. use App\Repository\ModuleRepository;
  36. use App\Repository\ModuleViewRepository;
  37. use App\Repository\ProgramParticipationRepository;
  38. use App\Repository\ProgramRepository;
  39. use App\Repository\QuizAnswerRepository;
  40. use App\Repository\QuizQuestionRepository;
  41. use App\Repository\QuizRepository;
  42. use App\Repository\QuizViewRepository;
  43. use App\Repository\UserModuleParticipationRepository;
  44. use App\Repository\UserProgramParticipationRepository;
  45. use App\Repository\UserQuizQuestionRepository;
  46. use App\Repository\UserRepository;
  47. use App\Repository\ModuleObjectiveRepository;
  48. use App\Utils\Constants;
  49. use App\Service\HelperService;
  50. use App\Service\PushNotification;
  51. use DateInterval;
  52. use DateTime;
  53. use Doctrine\Common\Collections\ArrayCollection;
  54. use Doctrine\Persistence\ManagerRegistry;
  55. use Psr\Container\ContainerInterface;
  56. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  57. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  58. use Symfony\Component\Form\Extension\Core\Type\DateType;
  59. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  60. use Symfony\Component\HttpFoundation\Request;
  61. use Symfony\Component\HttpFoundation\Response;
  62. use Symfony\Component\Routing\Annotation\Route;
  63. use Symfony\Component\Validator\Constraints\Choice;
  64. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  65. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  66. use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
  67. use Symfony\Component\String\Slugger\SluggerInterface;
  68. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  69. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  70. use Symfony\Component\Cache\Adapter\FilesystemAdapter;
  71. use Symfony\Component\Cache\Adapter\RedisAdapter;
  72. use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
  73. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  74. use Symfony\Component\Mailer\MailerInterface;
  75. use Symfony\Component\Mime\Address;
  76. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  77. use Symfony\Contracts\Cache\CacheInterface;
  78. use Symfony\Contracts\Cache\ItemInterface;
  79. use Symfony\Component\HttpFoundation\JsonResponse;
  80. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  81. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  82. use Symfony\Component\Messenger\MessageBusInterface;
  83. use App\Message\Certificate;
  84. use App\Message\Notification;
  85. use Doctrine\ORM\Mapping\Entity;
  86. use Exception;
  87. use Psr\Log\LoggerInterface;
  88. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  89. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  90. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  91. use Symfony\Component\Form\Extension\Core\Type\TextType;
  92. use Symfony\Component\HttpFoundation\RedirectResponse;
  93. /**
  94.  * @Route("/bibliotheque")
  95.  */
  96. class LibraryController extends AbstractController
  97. {
  98.     use ControllerHelper;
  99.     private $slugger;
  100.     private $doctrine;
  101.     private $mailer;
  102.     private $helper;
  103.     private $params;
  104.     private $pushNotification;
  105.     private $helperService;
  106.     private $bus;
  107.     private $logger;
  108.     public function __construct(SluggerInterface $sluggerManagerRegistry $doctrineMailerInterface $mailerHelperService $helperParameterBagInterface $paramsPushNotification $pushNotificationHelperService $helperServiceMessageBusInterface $busLoggerInterface $logger)
  109.     {
  110.         $this->slugger $slugger;
  111.         $this->doctrine $doctrine;
  112.         $this->mailer $mailer;
  113.         $this->helper $helper;
  114.         $this->params $params;
  115.         $this->pushNotification $pushNotification;
  116.         $this->helperService $helperService;
  117.         $this->bus $bus;
  118.         $this->logger $logger;
  119.     }
  120.     /**
  121.      * @Route("", name="app_front_library_page")
  122.      */
  123.     public function index(ProgramRepository $programRepositoryJobRepository $jobRepositoryModuleRepository $moduleRepositoryModuleLikeRepository $moduleLikeRepositoryModuleParticipationRepository $moduleParticipationRepositoryModuleViewRepository $moduleViewRepositoryModuleNoticeRepository $moduleNoticeRepositoryFeaturedModuleRepository $featuredModuleRepositoryLiveRepository $liveRepositoryQuizRepository $quizRepositoryProgramParticipationRepository $programParticipationRepositoryRequest $requestModuleToEntityTransformer $moduleToEntityTransformer): Response
  124.     {
  125.         // $jobs = $jobRepository->findAll();
  126.         // foreach ($jobs as $job) {
  127.         //     $slug = $this->slugger->slug($job->getLabel());
  128.         //     $job->setSlug($slug);
  129.         //     $jobRepository->add($job, true);
  130.         // }
  131.         // die("ok");
  132.         // $module = $moduleRepository->findOneById(69);
  133.         // $quiz = $quizRepository->findOneById(58);
  134.         // $program = $this->getActiveProgram($module, false, $this->getUser());
  135.         // $type = 'certificate';
  136.         // $userScore = $this->getModuleQuizScore($module, $this->getUser(), $program, true);
  137.         // $quizCertificates = $quiz->getCertificates()->filter(function($quizCertificate) use ($userScore, $type) {
  138.         //     return ($quizCertificate->getMinScore() <= $userScore && $userScore <= $quizCertificate->getMaxScore() && $quizCertificate->getType() === $type);
  139.         // });
  140.         // $moduleCertificate = $this->getModuleQuizCertificate($module, $this->getUser(), $type, $program, $quiz);
  141.         // $certificate = $this->getModuleQuizCertificateFilePath($this->getUser(), 'certificate', $program, $module, $quiz);
  142.         // $badge = $this->getModuleQuizCertificateFilePath($this->getUser(), 'badge', $program, $module, $quiz);
  143.         // $programParticipation = $programParticipationRepository->findOneBy(['program' => $program, 'createdBy' => $this->getUser()]);
  144.         // $certificate = $this->getProgramCertificateFilePath($this->getUser(), $program, $programParticipation);
  145.         // var_dump($certificate);
  146.         // die("ok");
  147.         // $this->denyAccessUnlessGranted('ROLE_EMPLOYEE', null, "Cette page n'existe pas !");
  148.         $session $request->getSession();
  149.         $session->clear();
  150.         if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
  151.         $user $this->getUser();
  152.         $programs $programRepository->findHomeActivePrograms($user);
  153.         // $programs = $programRepository->findActivePrograms($user);
  154.         // $jobs = $jobRepository->findActiveJobs();
  155.         // $formBuilder = $this->createFormBuilder(null, [
  156.         //     'validation_groups' => false 
  157.         // ]);
  158.         // $formBuilder->add('searchKey', HiddenType::class, [
  159.         //     // 'class' => Module::class,
  160.         //     'label' => false,
  161.         //     // 'choices' => [],
  162.         //     // 'choice_label' => 'name',
  163.         // ]);
  164.         // // $formBuilder->get('searchKey')->addModelTransformer($moduleToEntityTransformer);
  165.         // $form = $formBuilder->getForm();
  166.         // Search form
  167.         // $form = $this->createFormBuilder()
  168.             // ->add('program', EntityType::class, [
  169.             //     'class' => Program::class,
  170.             //     'label' => false,
  171.             //     'choice_label' => 'label',
  172.             //     'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50 opificio fw-bold text-dark'],
  173.             //     'placeholder' => 'Choisir un programme',
  174.             //     'required' => false,
  175.             //     'choices' => $programs,
  176.             //     'data' => ($session->has('_program')) ? $programRepository->findOneById($session->get('_program')) : null
  177.             // ])
  178.             // ->add('job', EntityType::class, [
  179.             //     'class' => Job::class,
  180.             //     'label' => false,
  181.             //     'choice_label' => 'label',
  182.             //     'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50 opificio fw-bold text-dark'],
  183.             //     'placeholder' => 'Choisir un métier',
  184.             //     'required' => false,
  185.             //     'choices' => $jobs,
  186.             //     'data' => ($session->has('_job')) ? $jobRepository->findOneById($session->get('_job')) : null
  187.             // ])
  188.             // ->add('startAt', DateType::class, [
  189.             //     'label' => false,
  190.             //     'widget' => 'single_text',
  191.             //     'format' => 'dd/MM/yyyy',
  192.             //     'html5' => false,
  193.             //     'required' => false,
  194.             //     'attr' => ['class' => 'form-control js-datepicker fw-bold text-dark border-0 shadow-sm height-50 opificio fw-bold text-dark', 'placeholder' => 'Date début'],
  195.             //     'data' => ($session->has('_startAt')) ? $session->get('_startAt') : null
  196.             // ])
  197.             // ->add('endAt', DateType::class, [
  198.             //     'label' => false,
  199.             //     'widget' => 'single_text',
  200.             //     'format' => 'dd/MM/yyyy',
  201.             //     'html5' => false,
  202.             //     'required' => false,
  203.             //     'attr' => ['class' => 'form-control js-datepicker fw-bold text-dark border-0 shadow-sm height-50 opificio fw-bold text-dark', 'placeholder' => 'Date fin'],
  204.             //     'data' => ($session->has('_endAt')) ? $session->get('_endAt') : null
  205.             // ])
  206.             // ->add('searchKey', EntityType::class, [
  207.             //     'class' => Module::class,
  208.             //     'label' => "Que voulez vous apprendre aujourd'hui ?",
  209.             //     // 'choices' => [],
  210.             //     'choice_label' => 'name',
  211.             //     "attr" => [
  212.             //         // 'placeholder' => "Rechercher un module",
  213.             //         "class" => "border-0 ms-3 fw-bold select2 form-control"
  214.             //     ]
  215.             // ])
  216.             // ->get('searchKey')
  217.             // ->addModelTransformer($moduleToEntityTransformer)
  218.             // ->addModelTransformer($moduleToEntityTransformer)
  219.             // ->add('search', SubmitType::class, [
  220.             //     'label' => 'Rechercher',
  221.             //     'attr' => ['class' => 'btn btn-danger text-uppercase mt-3 h1 fw-bold px-3 research-library-btn height-50 opificio fw-bold']
  222.             // ])
  223.             // ->getForm();
  224.         // Liste default modules
  225.         // $moreRecentProgram = $programRepository->findMoreRecentProgram();
  226.         // $modules = $moduleRepository->findByProgram($moreRecentProgram);
  227.         // $modules = $moduleRepository->findBy(['isPublished' => true]);
  228.     
  229.         // Most viewed module
  230.         // $mostViewedModule = $moduleRepository->findBy([], ['id'  => 'DESC'], 1, 0)[0];
  231.         // $mostViewedModule = $moduleViewRepository->findMostViewedModule();
  232.         // $mostViewedModule = $moduleParticipationRepository->findMostViewedModule();
  233.         // $mostViewedModule = (count($mostViewedModule) > 0) ? $mostViewedModule[0] : null;
  234.         // Most liked module
  235.         // $mostLikedModule = null;
  236.         // $mostLikedModule = $moduleRepository->findBy([], ['id'  => 'DESC'], 1, 1)[0];
  237.         // $mostLikedModule = $moduleLikeRepository->findMostLikedModule();
  238.         // $mostLikedModule = $moduleNoticeRepository->findMostLikedModule();
  239.         // $mostLikedModule = (count($mostLikedModule) > 0) ? $mostLikedModule[0] : null;
  240.         // Recent published module
  241.         // $mostRecentModule = $moduleRepository->findMostRecentModule();
  242.         $featuredModules $featuredModuleRepository->findBy([], ['id' => 'DESC'], 10);
  243.         if (!empty($featuredModules)) {
  244.             $mostViewedModule = ($featuredModules[0]->getStar() !== null) ? $moduleRepository->findMostViewedModule($featuredModules[0]->getStar()) : $moduleParticipationRepository->findMostViewedModule();
  245.             $mostLikedModule = ($featuredModules[0]->getFavorite() !== null) ? $moduleRepository->findMostLikedModule($featuredModules[0]->getFavorite()) : $moduleNoticeRepository->findMostLikedModule();
  246.             $mostRecentModule = ($featuredModules[0]->getNew() !== null) ? $moduleRepository->findMostRecentModule($featuredModules[0]->getNew()) : $moduleRepository->findMostRecentModule();
  247.         } else {
  248.             $mostViewedModule $moduleParticipationRepository->findMostViewedModule();
  249.             $mostLikedModule $moduleNoticeRepository->findMostLikedModule();
  250.             $mostRecentModule $moduleRepository->findMostRecentModule();
  251.         }
  252.         if ($session->has('_searchKey')) {
  253.             // $program = $programRepository->findOneById($session->get('_program'));
  254.             // $job =  $jobRepository->findOneById($session->get('_job'));
  255.             // $startAt = $session->get('_startAt');
  256.             // $endAt = $session->get('_endAt');
  257.             $searchKey $session->get('_searchKey');
  258.             $modules $moduleRepository->searchModule(nullnull$usernullnullfalsenullnull$searchKey);
  259.             $totalModule $moduleRepository->searchModule(nullnull$usernullnulltruenullnull$searchKey);
  260.         } else {
  261.             $modules $moduleRepository->searchModule(nullnull$user);
  262.             $totalModule $moduleRepository->searchModule(null,null$usernullnulltrue);
  263.         }
  264.         // $form->handleRequest($request);
  265.         // if ($form->isSubmitted() && $form->isValid()) {
  266.         //     // $programData = $form->get('program')->getData();
  267.         //     // $job = $form->get('job')->getData();
  268.         //     // $startAt = $form->get('startAt')->getData();
  269.         //     // $endAt = $form->get('endAt')->getData();
  270.         //     $searchKey = $form->get('searchKey')->getData();
  271.         //     dd($searchKey);
  272.         //     // $session->set('_program', ($programData !== null) ? $programData->getId() : null);
  273.         //     // $session->set('_job', ($job !== null) ? $job->getId() : null);
  274.         //     // $session->set('_startAt', $startAt);
  275.         //     // $session->set('_endAt', $endAt);
  276.         //     // $session->set('_route', $request->get('_route'));
  277.         //     // if ($programData !== null) {
  278.         //     // $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, null, null, $searchKey);
  279.         //     // $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
  280.         //     // }
  281.         //     $modules = $moduleRepository->findById($searchKey);
  282.         //     return (!empty($modules)) ? $this->redirectToRoute("app_front_library_module_details_page", ['slug' => $modules[0]->getSlug()]) : $this->redirectToRoute("app_front_library_page");
  283.         // }
  284.         $notices $moduleNoticeRepository->findBy(['module' => null'isPublished' => true]);
  285.         $cofilives $liveRepository->getCofilives();
  286.         $topCofiLive $liveRepository->getTopActiveLive("cofi live");
  287.         $topCofiLiveStartAt = ($topCofiLive != null) ? $topCofiLive->getStartAt()->format('F, d Y H:i:s') : null;
  288.         return $this->render('front/pages/library/index.html.twig', [
  289.             'programs' => $programs,
  290.             'modules' => $modules,
  291.             'mostViewedModule' => $mostViewedModule,
  292.             'mostLikedModule'  => $mostLikedModule,
  293.             'mostRecentModule' => $mostRecentModule,
  294.             'cofilives' => $cofilives,
  295.             'totalModule' => count($totalModule),
  296.             'limit' => Constants::PAGINATION_LIMIT,
  297.             'notices' => $notices,
  298.             // 'form' => $form->createView(),
  299.             'topCofiLive' => $topCofiLive,
  300.             'topCofiLiveModule' => ($topCofiLive != null) ? $this->getActiveModule($topCofiLive$user) : null,
  301.             'topCofiLiveStartAt' => $topCofiLiveStartAt
  302.         ]);
  303.     }
  304.     /**
  305.      * @Route("/module/{slug}", name="app_front_library_module_details_page")
  306.      */
  307.     public function libraryModuleDetails(Module $moduleModuleItemRepository $moduleItemRepositoryQuizRepository $quizRepositoryCourseRepository $courseRepositoryLiveRepository $liveRepositoryModuleParticipationRepository $moduleParticipationRepositoryModuleNoticeRepository $moduleNoticeRepository): Response{
  308.         $user $this->getUser();
  309.         if (!$this->hasAccessToThisModule($module$user)) throw $this->createNotFoundException("La page demandée n'existe pas");
  310.         $currentItem null;
  311.         $type null;
  312.         $items $moduleItemRepository->findItems($module);
  313.         // $moduleParticipations = $moduleParticipationRepository->findBy(['createdBy' => $user, 'module' => $module], ['id' => 'ASC']);
  314.         $moduleParticipations $moduleParticipationRepository->findParticipations($module,  $user);
  315.         $moduleLastParticipation = (count($moduleParticipations) > 0) ? $moduleParticipations[0] : null;
  316.         if ($moduleLastParticipation !== null) {
  317.             $currentItem = ($moduleLastParticipation->getCourse() !== null) ? $moduleLastParticipation->getCourse() : (($moduleLastParticipation->getQuiz() !== null) ? $moduleLastParticipation->getQuiz() : $moduleLastParticipation->getLive());
  318.         } else {
  319.             if (count($items) > 0) {
  320.                 $item $items[0];
  321.                 // $currentItem = ($item['type'] === 'course') ? $courseRepository->findOneById($item['course_id']) : $quizRepository->findOneById($item['quiz_id']);
  322.                 switch ($item['type']) {
  323.                     case 'course':
  324.                         $currentItem $courseRepository->findOneById($item['course_id']);
  325.                         break;
  326.                     case 'quiz':
  327.                         $currentItem $quizRepository->findOneById($item['quiz_id']);
  328.                         break;
  329.                     default:
  330.                         $currentItem $liveRepository->findOneById($item['live_id']);
  331.                         break;
  332.                 }
  333.             }
  334.         }
  335.         if ($currentItem instanceof Course$type "course";
  336.         elseif ($currentItem instanceof Quiz$type "quiz";
  337.         else $type "live";
  338.         $moduleNoteTotal 0;
  339.         //$moduleNotices = $moduleNoticeRepository->findBy(['module' => $module, 'isPublished' => true]);
  340.         $moduleNotices $moduleNoticeRepository->findBy(['module' => $module], ['id' => 'DESC'], 100);
  341.         $moduleNoticesExceptMyNote = [];
  342.         foreach ($moduleNotices as $moduleNotice) {
  343.             $moduleNoteTotal $moduleNoteTotal $moduleNotice->getNote();
  344.             if ($moduleNotice->getCreatedBy() !== $user$moduleNoticesExceptMyNote [] = $moduleNotice;
  345.         }
  346.         $moduleNote = (count($moduleNotices) > 0) ? ceil($moduleNoteTotal count($moduleNotices)) : 0;
  347.         // if ($currentItem != null) {
  348.         //     $keySort = ($currentItem instanceof Course) ? 'course' : 'quiz';
  349.         //     $type = $keySort;
  350.         //     $keys = array_keys(array_column($items, $keySort.'_id'), $currentItem->getId());
  351.         //     // $newArray = array_map(function($k) use ($items){return $items[$k];}, $keys);
  352.         //     dump($keys); die;
  353.         // }
  354.         //$myPrograms = $programRepository->findMyPrograms($user, $module);
  355.         $quizParticipation null;
  356.         if ($type === 'quiz')  {
  357.             $quizParticipation $moduleParticipationRepository->findOneBy(['createdBy' => $user'module' => $module'quiz' => $currentItem]);
  358.         }
  359.         $program $this->getActiveProgram($modulefalse$user);
  360.         //dd(count($module->getLives()));
  361.         $totalTime 0;
  362.         foreach($module->getLives() as $live) {  
  363.             if($live->isIsPublished()) {
  364.                 $duration $live->getTime()->format('H:i:s');
  365.                 sscanf($duration"%d:%d:%d"$hours$minutes$seconds);
  366.                 $totalTime += isset($seconds) ? $hours 3600 $minutes 60 $seconds $hours 60 $minutes;
  367.             }
  368.         } 
  369.         $noteCollection $module->getModuleNotices();
  370.         // $grouped = array_reduce($noteCollection->toArray(), function($result, ModuleNotice $moduleNotice) {
  371.         //     $result[$moduleNotice->getNote()][] = $moduleNotice->getNote();
  372.         //     return $result;
  373.         // }, []);
  374.         $noteAverages array_reduce($noteCollection->toArray(), function($resultModuleNotice $moduleNotice) {
  375.             $note $moduleNotice->getNote();
  376.             if (!isset($result[$note])) {
  377.                 $result[$note] = ['totalNote' => 0'count' => 0];
  378.             }
  379.             $result[$note]['totalNote'] += $moduleNotice->getNote();
  380.             $result[$note]['count'] += 1;
  381.             return $result;
  382.         }, []);
  383.         $totalCount $noteCollection->count();
  384.         
  385.         $noteAverages array_map(function($group) use ($totalCount) {
  386.             return ceil($group['count'] / $totalCount 100);
  387.         }, $noteAverages);
  388.         return $this->render('front/pages/library/module-details.html.twig', [
  389.             'module' => $module,
  390.             'items' => $items,
  391.             'currentItem' => $currentItem,
  392.             'type' => $type,
  393.             'isModuleTerminated' => (count($moduleParticipations) === count($items)),
  394.             'isQuizzAlreadyStarted' => ($quizParticipation !== null),
  395.             'moduleNote' => $moduleNote,
  396.             'moduleNotices' => $moduleNoticesExceptMyNote,
  397.             //'myPrograms' => $myPrograms,
  398.             'program' => $program,
  399.             'duration' => $this->secondsToTime($totalTime),
  400.             'noteAverages' => $noteAverages
  401.             // 'myNotice' => $moduleNoticeRepository->findOneBy(['module' => $module, 'createdBy' => $user]),
  402.         ]);
  403.     }
  404.     /**
  405.      * @Route("/courses/{module_slug}/{course_slug}", name="app_front_module_course_participation_page")
  406.      * @Route("/courses/{module_slug}/{course_slug}/terminate", name="app_front_module_course_terminate")
  407.      * @Route("/courses/{module_slug}/quiz/{quiz_slug}", name="app_front_module_quiz_participation_page")
  408.      * @Route("/courses/{module_slug}/quiz/{quiz_slug}/terminate", name="app_front_module_quiz_terminate")
  409.      * @Route("/courses/{module_slug}/live/{live_slug}", name="app_front_module_live_participation_page")
  410.      * @Route("/courses/{module_slug}/live/{live_slug}/terminate", name="app_front_module_live_terminate")
  411.      * @ParamConverter("module", options={"mapping": {"module_slug": "slug"}})
  412.      * @ParamConverter("course", isOptional="true", options={"mapping": {"course_slug": "slug"}})
  413.      * @ParamConverter("quiz", isOptional="true", options={"mapping": {"quiz_slug": "slug"}})
  414.      * @ParamConverter("live", isOptional="true", options={"mapping": {"live_slug": "slug"}})
  415.      */
  416.     public function takePartToModule(Request $requestModule $moduleProgramRepository $programRepositoryModuleItemRepository $moduleItemRepositoryModuleParticipationRepository $moduleParticipationRepositoryProgramParticipationRepository $programParticipationRepositoryCourseRepository $courseRepositoryQuizRepository $quizRepositoryLiveRepository $liveRepositoryQuizQuestionRepository $quizQuestionRepositoryQuizAnswerRepository $quizAnswerRepositoryUserQuizQuestionRepository $userQuizQuestionRepositoryUserModuleParticipationRepository $userModuleParticipationRepositoryUserProgramParticipationRepository $userProgramParticipationRepositoryModuleViewRepository $moduleViewRepositoryCourseViewRepository $courseViewRepositoryLiveViewRepository $liveViewRepositoryQuizViewRepository $quizViewRepositoryCacheInterface $cacheCourse $course nullQuiz $quiz nullLive $live null): Response{
  417.         /** @var User $currentUser */
  418.         $currentUser $this->getUser();
  419.         
  420.         if (!$this->hasAccessToThisModule($module$currentUser)) throw $this->createNotFoundException("La page demandée n'existe pas");
  421.         
  422.         if ($course === null && $quiz === null && $live === null) throw $this->createAccessDeniedException("Accès non autorisé");
  423.         
  424.         $program $this->getActiveProgram($modulefalse$currentUser);
  425.         $items $moduleItemRepository->findItems($module);
  426.         foreach($items as $key=>$item) {
  427.             if($item['type'] == 'quiz') {
  428.                 $hasCertificates count($quizRepository->find($item['quiz_id'])->getCertificates()) > 0;
  429.                 $items[$key]['hasCertificates'] = $hasCertificates;
  430.                 $_moduleParticipations $moduleParticipationRepository->findBy(array('createdBy' => $currentUser'program' => $program'quiz'=>$item['quiz_id']));
  431.                 foreach($_moduleParticipations as $participation) {
  432.                     if($participation->getQuizBadge() != null and !empty($participation->getQuizBadge())) {
  433.                         $items[$key]['award_badge'] = $participation->getQuizBadge();
  434.                     }
  435.                     if($participation->getQuizCertificate() != null and !empty($participation->getQuizCertificate())) {
  436.                         $items[$key]['award_certificate'] = $participation->getQuizCertificate();
  437.                     }
  438.                 }
  439.             }
  440.         }
  441.         //dd($items);
  442.         $keys = [];
  443.         if ($course !== null) {
  444.             $keys array_keys(array_column($items'course_id'), $course->getId());
  445.         } elseif ($quiz !== null)  {
  446.             $keys array_keys(array_column($items'quiz_id'), $quiz->getId());
  447.         } else {
  448.             $keys array_keys(array_column($items'live_id'), $live->getId());
  449.         }
  450.        
  451.     
  452.         $currentItemKey = isset($keys[0]) ? $keys[0] : 0;
  453.         // $currentItemAsArray = $items[$currentItemKey];
  454.         $prevItemAsArray = (isset($items[$currentItemKey 1])) ? $items[$currentItemKey 1] : null;
  455.         $nextItemAsArray = (isset($items[$currentItemKey 1])) ? $items[$currentItemKey 1] : null;
  456.         $prevItem null;
  457.         $nextItem null;
  458.         if ($prevItemAsArray !== null && isset($prevItemAsArray['type'])) {
  459.             // $prevItem = ($prevItemAsArray['type'] === 'course') ? $courseRepository->findOneById($prevItemAsArray['course_id']) : $quizRepository->findOneById($prevItemAsArray['quiz_id']);
  460.             switch ($prevItemAsArray['type']) {
  461.                 case 'course':
  462.                     $prevItem $courseRepository->findOneById($prevItemAsArray['course_id']);
  463.                     break;
  464.                 case 'quiz':
  465.                     $prevItem $quizRepository->findOneById($prevItemAsArray['quiz_id']);
  466.                     break;
  467.                 default:
  468.                     $prevItem $liveRepository->findOneById($prevItemAsArray['live_id']);
  469.                     break;
  470.             }
  471.             // $prevItem = $quizRepository->findOneById($prevItemAsArray[$prevItemAsArray['type'].'_id']);
  472.         }
  473.         if ($nextItemAsArray !== null && isset($nextItemAsArray['type'])) {
  474.             // $nextItem = ($nextItemAsArray['type'] === 'course') ? $courseRepository->findOneById($nextItemAsArray['course_id']) : $quizRepository->findOneById($nextItemAsArray['quiz_id']);
  475.             switch ($nextItemAsArray['type']) {
  476.                 case 'course':
  477.                     $nextItem $courseRepository->findOneById($nextItemAsArray['course_id']);
  478.                     break;
  479.                 case 'quiz':
  480.                     $nextItem $quizRepository->findOneById($nextItemAsArray['quiz_id']);
  481.                     break;
  482.                 default:
  483.                     $nextItem $liveRepository->findOneById($nextItemAsArray['live_id']);
  484.                     break;
  485.             }
  486.             // $nextItem = $courseRepository->findOneById($nextItemAsArray[$nextItemAsArray['type'].'_id']);
  487.         }
  488.         $prevItemType = ($prevItem !== null) ? (($prevItem instanceof Course) ? 'course' : (($prevItem instanceof Quiz) ? 'quiz' 'live')) : null;
  489.         $nextItemType = ($nextItem !== null) ? (($nextItem instanceof Course) ? 'course' : (($nextItem instanceof Quiz) ? 'quiz' 'live')) : null;
  490.         $key $module->getSlug().'_'.$currentUser->getId();
  491.         if($program != null) {
  492.             $key $program->getId().'_'.$key;
  493.         }
  494.         if($course) {
  495.             $key .= '_'.$course->getId();
  496.         } else if($live) {
  497.             $key .= '_'.$live->getId();
  498.         } else if($quiz) {
  499.             $key .= '_'.$quiz->getId();
  500.         }
  501.         // Sauvegarde dans le cache
  502.         $startDateTimeStamp null;
  503.         if($this->helper->getCacheItem($key) == null) {
  504.             $this->helper->setCacheItem($keyjson_encode(array('start_at' => (new DateTime())->getTimestamp())));
  505.         } else {
  506.             $startDateTimeStamp json_decode($this->helper->getCacheItem($key))->start_at;
  507.         }
  508.         $currentRoute $request->get('_route');
  509.         switch ($currentRoute) {
  510.             case 'app_front_module_course_terminate':
  511.                     $moduleParticipation $moduleParticipationRepository->findOneBy(['program' => $program'module' => $module'course' => $course'createdBy' => $currentUser]);
  512.                     if ($moduleParticipation !== null)  {
  513.                         return $this->redirectToRoute("app_front_module_course_participation_page", [
  514.                             "module_slug" => $module->getSlug(),
  515.                             "course_slug" => $course->getSlug()
  516.                         ]);
  517.                     }
  518.                     $moduleParticipation = new ModuleParticipation();
  519.                     $moduleParticipation->setModule($module);
  520.                     $moduleParticipation->setCourse($course);
  521.                     $moduleParticipation->setProgram($program);
  522.                     $moduleParticipation->setEndAt(new DateTime());
  523.                     $_startAt null;
  524.                     // if ($redis->exists($key)) {
  525.                     if ($startDateTimeStamp !== null) {
  526.                         $_startAt = new DateTime();
  527.                         // $_startAt->setTimestamp($redis->get($key));
  528.                         $_startAt->setTimestamp($startDateTimeStamp);
  529.                         $moduleParticipation->setStartAt($_startAt);
  530.                         // $redis->del($key);
  531.                     
  532.                     $moduleParticipationRepository->add($moduleParticipationtrue);
  533.                     $this->helper->deleteCacheItem($key);
  534.                     if ($_startAt !== null && $this->isModuleTerminated($module$currentUser$program)) {
  535.                         $userModuleParticipation $userModuleParticipationRepository->findOneBy(array('program' => $program'module' => $module'createdBy' => $currentUser), array('createdAt' => 'DESC'));
  536.                         if ($userModuleParticipation == null) {
  537.                             $userModuleParticipation = new UserModuleParticipation();
  538.                             $userModuleParticipation->setStartAt($_startAt);
  539.                         }
  540.                         $userModuleParticipation->setProgram($program);
  541.                         $userModuleParticipation->setModule($module);
  542.                         $userModuleParticipation->setEndAt(new DateTime());
  543.                         //$userModuleParticipation->setStartAt($_startAt);
  544.                         $userModuleParticipationRepository->add($userModuleParticipationtrue);
  545.                         if ($program !== null) {
  546.                             if ($this->isProgramTerminated($program$currentUser)) {
  547.                                 $userProgramParticipation $userProgramParticipationRepository->findOneBy(array('program' => $program'createdBy' => $currentUser), array('createdAt' => 'DESC'));
  548.                                 if($userProgramParticipation == null) {
  549.                                     $userProgramParticipation = new UserProgramParticipation();
  550.                                     $userProgramParticipation->setStartAt($_startAt);
  551.                                 }
  552.                                 //$userProgramParticipation = new UserProgramParticipation();
  553.                                 $userProgramParticipation->setProgram($program);
  554.                                 $userProgramParticipation->setEndAt(new DateTime());
  555.                                 //$userProgramParticipation->setStartAt($_startAt);
  556.         
  557.                                 $userProgramParticipationRepository->add($userProgramParticipationtrue);
  558.                                 $programParticipation $programParticipationRepository->findOneBy(['program' => $program'createdBy' => $currentUser]);
  559.                                 // Program certificate attachment
  560.                                 $certificate $this->getProgramCertificateFilePath($currentUser$program$programParticipation);
  561.                                 //dd($certificate);
  562.                                 if (!empty($certificate) && $certificate['program_certificate_file_path'] !== null) {
  563.                                     $programParticipation->setCertificate($certificate['program_certificate_file_path']);
  564.                                     $programParticipation->setCertificateLabel($certificate['program_certificate_label']);
  565.                                     $programParticipationRepository->add($programParticipationtrue);
  566.                                 }
  567.                             }
  568.                             //
  569.                             // generate certificate async
  570.                             //
  571.                             $this->bus->dispatch(new Certificate($program->getId(), $currentUser->getId()));
  572.                         }
  573.                     }
  574.                     if ($nextItem !== null) {
  575.                         return $this->redirectToRoute("app_front_module_".$nextItemType."_participation_page", [
  576.                             "module_slug" => $module->getSlug(),
  577.                             $nextItemType."_slug" => $nextItem->getSlug()
  578.                         ]);
  579.                     } else {
  580.                         return $this->redirectToRoute("app_front_module_notice_page", [
  581.                             "slug" => $module->getSlug()
  582.                         ]);
  583.                     }  
  584.                 break;
  585.             case 'app_front_module_quiz_terminate':
  586.                     $isQuizTerminated false;
  587.                     $score 0;
  588.                     $isNotePublished true;
  589.                     if ($request->isMethod('POST')) {
  590.                         $moduleParticipation $moduleParticipationRepository->findOneBy(['program' => $program'module' => $module'quiz' => $quiz'createdBy' => $currentUser]);
  591.                         if ($moduleParticipation !== null && $moduleParticipation->getQuizScore() !== null) {
  592.                             return $this->redirectToRoute("app_front_module_quiz_participation_page", [
  593.                                 "module_slug" => $module->getSlug(),
  594.                                 "quiz_slug" => $quiz->getSlug()
  595.                             ]);
  596.                         }
  597.                         //dd($request->request->all());
  598.                         foreach ($request->request->all() as $key => $answers) {
  599.                             $keyParts explode("_"$key);
  600.                             $quizQuestionId = (count($keyParts) > 0) ? (int)$keyParts[1]: null;
  601.                             if ($quizQuestionId !== null && $answers !== null && $answers !== "") {
  602.                                 $quizQuestion $quizQuestionRepository->findOneById($quizQuestionId);
  603.                                 if ($quizQuestion !== null) {
  604.                                     $userQuizQuestion = new UserQuizQuestion();
  605.                                     $userQuizQuestion->setQuizQuestion($quizQuestion);
  606.                                     $questionPoints $quizQuestion->getPoints();
  607.                                      /* Free entry Question */
  608.                                     if (strpos($key'custom') !== false) {
  609.                                         $userQuizQuestion->setCustomAnswer($answers);
  610.                                         $isNotePublished false;
  611.                                     } elseif (count($keyParts) === || count($keyParts) === 4) {                                       
  612.                                         /* Pairing and Ranking Question */
  613.                                         $answerId = (int)$keyParts[2];
  614.                                        
  615.                                         $quizAnswer $quizAnswerRepository->findOneById($answerId);
  616.                                         if ($quizAnswer !== null) {
  617.                                             $userQuizQuestion->addQuizAnswer($quizAnswer);
  618.                                             $userQuizQuestion->setCustomAnswer($answers);
  619.                                             /* Ranking Question */
  620.                                             if (isset($keyParts[3]) && $keyParts[3] === 'ranking') {
  621.                                                 $rankingQuestionPoints $questionPoints;
  622.                                                 $rankingCorrectOrders [] = $quizAnswer->getResponseOrder();
  623.                                                 $rankinkOrders [] = (int)$answers;
  624.                                             } else {
  625.                                                 /* Pairing Question */
  626.                                                 $pointsByAnswer $questionPoints $quizQuestion->getQuizAnswers()->count();
  627.                                                 if ($quizAnswer->getCorrectResponse() === $answers) {
  628.                                                     $score $score $pointsByAnswer;
  629.                                                 }
  630.                                             }
  631.                                         }
  632.                                     } else {
  633.                                         /* QCM Question (multiple choices) */
  634.                                         if (is_array($answers)) {
  635.                                             $answers array_map(function ($answer) {
  636.                                                 return (int)$answer;
  637.                                             }, $answers);
  638.                                             $incorrectAnswerIds =  [];
  639.                                             $correctAnswers =  [];
  640.                                             foreach ($quizQuestion->getQuizAnswers() as $answer) {
  641.                                                 if (!$answer->isIsCorrect()) $incorrectAnswerIds []  =  $answer->getId();
  642.                                                 else $correctAnswers []  =  $answer;
  643.                                             }
  644.                                             $incorrectAnswerChecked array_intersect($answers$incorrectAnswerIds);
  645.                                             $questionAnswers =  [];
  646.                                             foreach ($quizQuestion->getQuizAnswers() as $answer) {
  647.                                                 $questionAnswers [$answer->getId()]  =  (in_array($answer->getId(), $answers));
  648.                                             }
  649.                                             $pointsByAnswer $questionPoints count($correctAnswers);
  650.                                             $_questionNote 0;
  651.                                             foreach ($answers as $answerId) {
  652.                                                 $quizAnswer $quizAnswerRepository->findOneById($answerId);
  653.                                                 if ($quizAnswer !== null) {
  654.                                                     $userQuizQuestion->addQuizAnswer($quizAnswer);
  655.                                                     if (!$incorrectAnswerChecked$_questionNote $_questionNote $pointsByAnswer;
  656.                                                 }
  657.                                             }
  658.                                             $score $score $_questionNote;
  659.                                         /* TrurOrFalse Question */
  660.                                         } elseif ($keyParts[0] === 'trueOrFalseAnswer') {
  661.                                             $userQuizQuestion->setTrueOrFalseAnswer($answers);
  662.                                             if ($quizQuestion->isIsTrueOrFalse() == filter_var($answersFILTER_VALIDATE_BOOLEAN)) {
  663.                                                 $score $score $questionPoints;
  664.                                             }
  665.                                        /* Drop-down menu or Unique choice Question */
  666.                                         } else {
  667.                                             $quizAnswer $quizAnswerRepository->findOneById((int)$answers);
  668.                                             if ($quizAnswer !== null) {
  669.                                                 $userQuizQuestion->addQuizAnswer($quizAnswer);
  670.                                                 if ($quizAnswer->isIsCorrect()) {
  671.                                                     $score $score $questionPoints;
  672.                                                 }
  673.                                             }
  674.                                         }
  675.                                     }
  676.                                     $userQuizQuestion->setModule($module);
  677.                                     $userQuizQuestionRepository->add($userQuizQuestiontrue);
  678.                                     $isQuizTerminated true;
  679.                                 }
  680.                             }
  681.                         }
  682.                         if (isset($rankingQuestionPoints) && $rankingCorrectOrders === $rankinkOrders) {
  683.                             $score $score $rankingQuestionPoints;
  684.                         }
  685.                         foreach ($request->files->all() as $key => $file) {
  686.                             if ($file) {
  687.                                 $keyParts explode("_"$key);
  688.                                 $quizQuestionId = (count($keyParts) > 0) ? $keyParts[1] : null;
  689.                                 if ($quizQuestionId !== null && $answers !== null && !empty($answers)) {
  690.                                     $quizQuestion $quizQuestionRepository->findOneById($quizQuestionId);
  691.                                     if ($quizQuestion !== null) {
  692.                                         $originalFilename pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
  693.                                         // this is needed to safely include the file name as part of the URL
  694.                                         $safeFilename $this->slugger->slug($originalFilename);
  695.                                         $newFilename $safeFilename.'-'.uniqid().'.'.$file->guessExtension();
  696.                         
  697.                                         // Move the file to the directory where brochures are stored
  698.                                         try {
  699.                                             $file->move(
  700.                                                 $this->getParameter('quiz_file_directory'),
  701.                                                 $newFilename
  702.                                             );
  703.                                             $userQuizQuestion = new UserQuizQuestion();
  704.                                             $userQuizQuestion->setQuizQuestion($quizQuestion);
  705.                                             $userQuizQuestion->setFileAnswer($newFilename);
  706.                                             $userQuizQuestion->setModule($module);
  707.                                             $userQuizQuestionRepository->add($userQuizQuestiontrue);
  708.                                             $isQuizTerminated true;
  709.                                             $isNotePublished false;
  710.                                         } catch (FileException $e) {
  711.                                             // dump($e->getMessage());
  712.                                             // die;
  713.                                         }
  714.                                     }
  715.                                 }
  716.                             }
  717.                         }
  718.                         // $isQuizTerminated = true; // Quiz not parameterized
  719.                         
  720.                         if ($moduleParticipation === null) {
  721.                             $moduleParticipation = new ModuleParticipation();
  722.                             $moduleParticipation->setModule($module);
  723.                             $moduleParticipation->setQuiz($quiz);
  724.                             $moduleParticipation->setProgram($program);
  725.                             $moduleParticipation->setEndAt(new DateTime());
  726.                         }
  727.                         $quizTotalNote array_reduce($quiz->getQuizQuestions()->toArray(), function(int $accumulatorQuizQuestion $quizQuestion): int {
  728.                             return $accumulator $quizQuestion->getPoints();
  729.                         }, 0);
  730.                         $moduleParticipation->setQuizScore($score);
  731.                         $moduleParticipation->setQuizTotalNote($quizTotalNote);
  732.                         $moduleParticipation->setAutomaticEndAt(null);
  733.                         $moduleParticipation->setIsNotePublished($isNotePublished);
  734.                         $_startAt null;
  735.                         // if ($redis->exists($key)) {
  736.                         if ($startDateTimeStamp !== null) {
  737.                             $_startAt = new DateTime();
  738.                             // $_startAt->setTimestamp($redis->get($key));
  739.                             $_startAt->setTimestamp($startDateTimeStamp);
  740.                             $moduleParticipation->setStartAt($_startAt);
  741.                             // $redis->del($key);
  742.                         }    
  743.                         if ($isNotePublished) {
  744.                             // Module certificate attachment
  745.                             $certificate $this->getModuleQuizCertificateFilePath($currentUser'certificate'$program$module$quiz);
  746.                             if ($certificate !== null && !empty($certificate)) {
  747.                                 $moduleParticipation->setQuizCertificate($certificate['quiz_certificate_file_path']);
  748.                                 $moduleParticipation->setQuizCertificateLabel($certificate['quiz_certificate_label']);
  749.                             }
  750.                             // Module badge attachment
  751.                             $badge $this->getModuleQuizCertificateFilePath($currentUser'badge'$program$module$quiz);
  752.                             //$badge = null;
  753.                             if ($badge !== null && !empty($badge)) {
  754.                                 $moduleParticipation->setQuizBadge($badge['quiz_certificate_file_path']);
  755.                                 $moduleParticipation->setQuizBadgeLabel($badge['quiz_badge_label']);
  756.                             }
  757.                         }
  758.                         $moduleParticipationRepository->add($moduleParticipationtrue);
  759.                         $this->helper->deleteCacheItem($key);
  760.                         $programParticipation null;
  761.                         if ($isNotePublished) {
  762.                             $programQuizScore = ($program !== null) ? $this->getProgramQuizScore($program$currentUser) : null;
  763.                             if ($programQuizScore !== null) {
  764.                                 // Program score calculation
  765.                                 $programParticipation $programParticipationRepository->findOneBy(['program' => $program'createdBy' => $currentUser]);
  766.                                 if ($programParticipation !== null) {
  767.                                     $programParticipation->setQuizScore($programQuizScore['quizNote']);
  768.                                     $programParticipation->setQuizTotalNote($programQuizScore['quizTotalNote']);
  769.                                     $programParticipationRepository->add($programParticipationtrue);
  770.                                 } else {
  771.                                     $programParticipation = new ProgramParticipation();
  772.                                     $programParticipation->setProgram($program);
  773.                                     $programParticipation->setCreatedBy($currentUser);
  774.                                     $programParticipation->setQuizScore($programQuizScore['quizNote']);
  775.                                     $programParticipation->setQuizTotalNote($programQuizScore['quizTotalNote']);
  776.                                     $programParticipationRepository->add($programParticipationtrue);
  777.                                 }
  778.                             }
  779.                         }
  780.                         if ($_startAt !== null && $this->isModuleTerminated($module$currentUser$program)) {
  781.                             $userModuleParticipation $userModuleParticipationRepository->findOneBy(array('program' => $program'module' => $module'createdBy' => $currentUser), array('createdAt' => 'DESC'));
  782.                             if($userModuleParticipation == null) {
  783.                                 $userModuleParticipation = new UserModuleParticipation();
  784.                                 $userModuleParticipation->setStartAt($_startAt);
  785.                             }
  786.                             $userModuleParticipation->setProgram($program);
  787.                             $userModuleParticipation->setModule($module);
  788.                             $userModuleParticipation->setEndAt(new DateTime());
  789.                             //$userModuleParticipation->setStartAt($_startAt);
  790.     
  791.                             $userModuleParticipationRepository->add($userModuleParticipationtrue);
  792.                             if ($program !== null) {
  793.                                 if ($this->isProgramTerminated($program$currentUser)) {
  794.                                     $userProgramParticipation $userProgramParticipationRepository->findOneBy(array('program' => $program'createdBy' => $currentUser), array('createdAt' => 'DESC'));
  795.                                     if($userProgramParticipation == null) {
  796.                                         $userProgramParticipation = new UserProgramParticipation();
  797.                                         $userProgramParticipation->setStartAt($_startAt);
  798.                                     }
  799.                                     $userProgramParticipation->setProgram($program);
  800.                                     $userProgramParticipation->setEndAt(new DateTime());
  801.             
  802.                                     $userProgramParticipationRepository->add($userProgramParticipationtrue);
  803.                                     // Program certificate attachment
  804.                                     $certificate $this->getProgramCertificateFilePath($currentUser$program$programParticipation);
  805.                                     if (!empty($certificate) && $certificate['program_certificate_file_path'] !== null) {
  806.                                         $programParticipation->setCertificate($certificate['program_certificate_file_path']);
  807.                                         $programParticipation->setCertificateLabel($certificate['program_certificate_label']);
  808.                                         $programParticipationRepository->add($programParticipationtrue);
  809.                                     }
  810.                                 }
  811.                                 //
  812.                                 // generate certificate async
  813.                                 //
  814.                                 $this->bus->dispatch(new Certificate($program->getId(), $currentUser->getId()));
  815.                             }
  816.                         }
  817.                         
  818.                         // if ($quiz !== null)  {
  819.                             // $this->addFlash('successful_quiz', 'Félicitations vous venez de décrocher ce certificat !');
  820.                         // }s
  821.                         if ($nextItem !== null) {
  822.                             // if ($nextItemType === 'course') {
  823.                             //     return $this->redirectToRoute("app_front_module_course_participation_page", [
  824.                             //         "module_slug" => $module->getSlug(),
  825.                             //         "course_slug" => $nextItem->getSlug()
  826.                             //     ]);
  827.                             // } elseif ($nextItemType === 'quiz') {
  828.                             //     return $this->redirectToRoute("app_front_module_quiz_participation_page", [
  829.                             //         "module_slug" => $module->getSlug(),
  830.                             //         "quiz_slug" => $nextItem->getSlug()
  831.                             //     ]);
  832.                             // } else {
  833.                             //     return $this->redirectToRoute("app_front_module_live_participation_page", [
  834.                             //         "module_slug" => $module->getSlug(),
  835.                             //         "live_slug" => $nextItem->getSlug()
  836.                             //     ]);
  837.                             // }
  838.                             return $this->redirectToRoute("app_front_module_".$nextItemType."_participation_page", [
  839.                                 "module_slug" => $module->getSlug(),
  840.                                 $nextItemType."_slug" => $nextItem->getSlug()
  841.                             ]);
  842.                         } else {
  843.                             return $this->redirectToRoute("app_front_module_notice_page", [
  844.                                 "slug" => $module->getSlug()
  845.                             ]);
  846.                         } 
  847.                     }
  848.                     $this->addFlash("quiz_participation_error""Erreur survenue lors de la soumission du quiz: Veuillez contacter l'administrateur si cela persiste !");
  849.                     return $this->redirectToRoute("app_front_module_quiz_participation_page", [
  850.                         "module_slug" => $module->getSlug(),
  851.                         "quiz_slug" => $quiz->getSlug()
  852.                     ]);
  853.                 break;
  854.         }
  855.         //$activeProgram = $this->getActiveProgram($module, false);
  856.         $moduleItemTerminateCount $moduleParticipationRepository->getParticipationCount($module$currentUser$program);
  857.         $progression = (!empty($items)) ? floor(($moduleItemTerminateCount count($items)) * 100) : 0;
  858.         // $currentItemTerminate = ($course !== null) ? 
  859.         //     $moduleParticipationRepository->findBy(['module' => $module, 'course' => $course, 'createdBy' => $this->getUser()]) : 
  860.         //     $moduleParticipationRepository->findBy(['module' => $module, 'quiz' => $quiz, 'createdBy' => $this->getUser()]);
  861.         $isCurrentItemTerminated false;
  862.         if ($course !== null) {
  863.             $isCurrentItemTerminated $this->isItemTerminated($currentUser$moduleParticipationRepository$modulenull$course$program);
  864.         } elseif ($quiz !== null) {
  865.             $isCurrentItemTerminated $this->isItemTerminated($currentUser$moduleParticipationRepository$modulenull$quiz$program);
  866.         } else {
  867.             $isCurrentItemTerminated $this->isItemTerminated($currentUser$moduleParticipationRepository$modulenull$live$program);
  868.         }
  869.         $isPrevIQuizTerminated false;
  870.         if ($prevItem !== null && $prevItem instanceof Quiz) {
  871.             $isPrevIQuizTerminated $this->isItemTerminated($currentUser$moduleParticipationRepository$modulenull$prevItem$program);
  872.         }
  873.         $userQuizParticipations = [];
  874.         //$myPrograms = $programRepository->findMyPrograms($currentUser, $module);
  875.         $automaticEndAt null;
  876.         $automaticEndAtFormatted null;
  877.         $today = new DateTime();
  878.         $isQuizzAlreadyStarted false;
  879.         if ($quiz !== null && $quiz->getStartAt() <= $today) {
  880.             $userQuizParticipations $userQuizQuestionRepository->findUserQuiz($quiz$this->getUser(), $module);
  881.             $output = [];
  882.             foreach ($userQuizParticipations as $item) {
  883.                 if ($item['answer_id'] !== null) {
  884.                     $output[$item['question_id']][$item['answer_id']] = $item;
  885.                 } else {
  886.                     $output[$item['question_id']][] = $item;
  887.                 }
  888.             }
  889.             $userQuizParticipations $output;
  890.             $moduleParticipation $moduleParticipationRepository->findOneBy(['program' => $program'module' => $module'quiz' => $quiz'createdBy' => $this->getUser()]);
  891.             
  892.             if ($moduleParticipation !== null) {
  893.                 // $hour = (int)$quiz->getTime()->format('H');
  894.                 // $minute = (int)$quiz->getTime()->format('i');
  895.                 // $second = (int)$quiz->getTime()->format('s');
  896.                 // $currentDate = clone (new DateTime());
  897.                 // $endAt = $currentDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
  898.                 // $moduleParticipation = new ModuleParticipation();
  899.                 // $moduleParticipation->setModule($module);
  900.                 // $moduleParticipation->setQuiz($quiz);
  901.                 // $moduleParticipation->setAutomaticEndAt($endAt);
  902.                 // $moduleParticipationRepository->add($moduleParticipation, true);
  903.                 
  904.                 $automaticEndAt $moduleParticipation->getAutomaticEndAt();
  905.                 $automaticEndAtFormatted = ($automaticEndAt !== null) ? $automaticEndAt->format('F, d Y H:i:s') : null;
  906.                 $isQuizeStarted true;
  907.             } else {
  908.                 $moduleParticipation = new ModuleParticipation();
  909.                 $moduleParticipation->setModule($module);
  910.                 $moduleParticipation->setQuiz($quiz);
  911.                 $moduleParticipation->setProgram($program);
  912.                 if ($quiz->getTime() !== null) {
  913.                     $hour = (int)$quiz->getTime()->format('H');
  914.                     $minute = (int)$quiz->getTime()->format('i');
  915.                     $second = (int)$quiz->getTime()->format('s');
  916.                     $currentDate = clone (new DateTime());
  917.                     $endAt $currentDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
  918.                     //$moduleParticipation->setStartAt(new DateTime());
  919.                     $moduleParticipation->setAutomaticEndAt($endAt);
  920.                 }
  921.                 
  922.                 $moduleParticipationRepository->add($moduleParticipationtrue);
  923.                 $automaticEndAt $moduleParticipation->getAutomaticEndAt();
  924.                 $automaticEndAtFormatted = ($automaticEndAt !== null) ? $automaticEndAt->format('F, d Y H:i:s') : null;
  925.             }
  926.             $isQuizzAlreadyStarted true;
  927.         } else if ($prevItemType === 'quiz' || $nextItemType === 'quiz') {
  928.             $moduleParticipation = ($prevItemType === 'quiz') ? $moduleParticipationRepository->findOneBy(['program' => $program'module' => $module'quiz' => $prevItem'createdBy' => $currentUser]) : $moduleParticipationRepository->findOneBy(['module' => $module'quiz' => $nextItem'createdBy' => $this->getUser()]);
  929.             $isQuizzAlreadyStarted = ($moduleParticipation !== null);
  930.         }
  931.         // if ($cacheItem->get($key !== null)) {
  932.         //     $cacheItem->set(new DateTime());
  933.         //     $cache->save($cacheItem);
  934.         // } 
  935.         // else {
  936.         //     // $cache->deleteItem($key);
  937.         //     dump($cacheItem->get($key)); die;
  938.         // }
  939.         // if (!$redis->exists($key)) {
  940.         //     $redis->set($key, (new DateTime())->getTimestamp());
  941.         // }
  942.         $moduleView $moduleViewRepository->findOneBy(['module' => $module'createdBy' => $currentUser]);
  943.         if ($moduleView === null) {
  944.             $moduleView = new ModuleView();
  945.             $moduleView->setModule($module);
  946.     
  947.             $moduleViewRepository->add($moduleViewtrue);
  948.         }
  949.         if ($course !== null) {
  950.             $courseView $courseViewRepository->findOneBy(['course' => $course'createdBy' => $currentUser]);
  951.             if ($courseView === null) {
  952.                 $courseView = new CourseView();
  953.                 $courseView->setCourse($course);
  954.         
  955.                 $courseViewRepository->add($courseViewtrue);
  956.             }
  957.         }
  958.         if ($live !== null) {
  959.             $liveView $liveViewRepository->findOneBy(['live' => $live'createdBy' => $currentUser]);
  960.             if ($liveView === null) {
  961.                 $liveView = new LiveView();
  962.                 $liveView->setLive($live);
  963.         
  964.                 $liveViewRepository->add($liveViewtrue);
  965.             }
  966.         }
  967.         if ($quiz !== null) {
  968.             $quizView $quizViewRepository->findOneBy(['quiz' => $quiz'createdBy' => $currentUser]);
  969.             if ($quizView === null) {
  970.                 $quizView = new QuizView();
  971.                 $quizView->setQuiz($quiz);
  972.         
  973.                 $quizViewRepository->add($quizViewtrue);
  974.             }
  975.         }
  976.         //dd($isPrevIQuizTerminated);
  977.         $totalTime 0;
  978.         foreach($module->getLives() as $_live) {  
  979.             if($_live->isIsPublished()) {
  980.                 $duration $_live->getTime()->format('H:i:s');
  981.                 sscanf($duration"%d:%d:%d"$hours$minutes$seconds);
  982.                 $totalTime += isset($seconds) ? $hours 3600 $minutes 60 $seconds $hours 60 $minutes;
  983.             }
  984.         } 
  985.         
  986.         return $this->render('front/pages/library/module-participation.html.twig', [
  987.             'module' => $module,
  988.             'course' => $course,
  989.             'quiz' => $quiz,
  990.             'live' => $live,
  991.             'prevItem' => $prevItem,
  992.             'prevItemType' => $prevItemType,
  993.             'nextItem' => $nextItem,
  994.             'nextItemType' => $nextItemType,
  995.             'progression' => $progression 100 $progression 100,
  996.             'isCurrentItemTerminated' => $isCurrentItemTerminated,
  997.             'userQuizParticipations' => $userQuizParticipations,
  998.             //'myPrograms' => $myPrograms,
  999.             'automaticEndAt' => $automaticEndAt,
  1000.             'automaticEndAtFormatted' => $automaticEndAtFormatted,
  1001.             'isQuizzAlreadyStarted' => $isQuizzAlreadyStarted,
  1002.             'program' => $program,
  1003.             'isPrevIQuizTerminated' => $isPrevIQuizTerminated,
  1004.             'duration' => $this->secondsToTime($totalTime),
  1005.             'items' => $items,
  1006.             'course_document' => ($course != null && $course->getType() === 'document' && $course->getDocument() !== null) ? $this->getParameter('upload_file_base_directory').'/'.rawurlencode(basename($course->getDocument()->getFileName())) : null
  1007.             // 'isLiveLocked' => $isLiveLocked,
  1008.             // 'isQuizLocked' => $isQuizLocked,
  1009.         ]);
  1010.     }
  1011.     /**
  1012.      * @Route("/modules/avis/{slug}", name="app_front_module_notice_page")
  1013.      */
  1014.     public function giveAvisToModule(Request $requestModuleParticipationRepository $moduleParticipationRepositoryModuleItemRepository $moduleItemRepositoryModuleNoticeRepository $moduleNoticeRepositoryModule $module): Response {
  1015.         $user $this->getUser();
  1016.         if (!$this->hasAccessToThisModule($module$user)) throw $this->createNotFoundException("La page demandée n'existe pas");
  1017.         
  1018.         $items $moduleItemRepository->findItems($module);
  1019.         //$activeProgram = $this->getActiveProgram($module, false);
  1020.         $program $this->getActiveProgram($modulefalse$user);
  1021.         $moduleItemTerminateCount $moduleParticipationRepository->getParticipationCount($module$user$program);
  1022.         $progression = (!empty($items)) ? floor(($moduleItemTerminateCount count($items)) * 100) : 0;
  1023.         $myNotice $moduleNoticeRepository->findOneBy(['module' => $module'createdBy' => $user]);
  1024.         $moduleNotice = ($myNotice === null) ? new ModuleNotice() : $myNotice;
  1025.         $form $this->createForm(ModuleNoticeType::class, $moduleNotice, ['module' => $module]);
  1026.         $form->handleRequest($request);
  1027.         
  1028.         if ($form->isSubmitted() && $form->isValid()) {
  1029.             $moduleNoticeRepository->add($moduleNoticetrue);
  1030.             return $this->redirectToRoute("app_front_library_module_details_page", [
  1031.                 "slug" => $module->getSlug()
  1032.             ]);
  1033.         }
  1034.         return $this->render('front/pages/library/module-avis.html.twig', [
  1035.             'module' => $module,
  1036.             'progression' => $progression,
  1037.             'form' => $form->createView(),
  1038.             'myNotice' => $myNotice,
  1039.             'program' => $program
  1040.         ]);
  1041.     }
  1042.     /**
  1043.      * @Route("/modules", name="app_front_library_cours_available_page")
  1044.      * @Route("/modules/{id}", name="app_front_program_module")
  1045.      * @Route("/{program_slug}/modules", name="app_front_program_modules")
  1046.      * @Route("/metier/{job_slug}/modules", name="app_front_job_modules")
  1047.      * @ParamConverter("program", options={"mapping": {"program_slug": "slug"}})
  1048.      * @ParamConverter("job", options={"mapping": {"job_slug": "slug"}})
  1049.      */
  1050.     public function libraryCourAvailable(ProgramRepository $programRepositoryJobRepository $jobRepositoryModuleRepository $moduleRepositoryModuleViewRepository $moduleViewRepositoryModuleLikeRepository $moduleLikeRepositoryRequest $requestProgramParticipationRepository $programParticipationRepositoryProgram $program nullJob $job null): Response{
  1051.         $page = (int)$request->query->get('page'1);
  1052.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1053.         $session $request->getSession();
  1054.         if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
  1055.         $user $this->getUser();
  1056.         $programParticipation null;
  1057.         if($program) {
  1058.             $programParticipation $programParticipationRepository->findOneBy(array('program' => $program'createdBy' => $user));
  1059.             $program $programParticipation $program null;
  1060.         }
  1061.         $programs $program ? [$program] : $programRepository->findActivePrograms($user);
  1062.         // $jobs = $jobRepository->findActiveJobs();
  1063.         $formBuilder $this->createFormBuilder(null, [
  1064.             'validation_groups' => false 
  1065.         ]);
  1066.         $formBuilder->add('searchKey'HiddenType::class, [
  1067.             // 'class' => Module::class,
  1068.             'label' => false,
  1069.             // 'choices' => [],
  1070.             // 'choice_label' => 'name',
  1071.         ]);
  1072.         // $formBuilder->get('searchKey')->addModelTransformer($moduleToEntityTransformer);
  1073.         $form $formBuilder->getForm();
  1074.         $filterForm $this->createFormBuilder();
  1075.         $filterForm->add('filter'ChoiceType::class, [
  1076.             'label' => 'Trier par : ',
  1077.             'label_attr' => ['class' => 'text-grey'],
  1078.             'attr' => ['style' => 'border: 1px solid transparent !important;'],
  1079.             'choices'  => [
  1080.                 'Populaire' => 'most_seen',
  1081.                 'Mieux notés' => 'best_rated'
  1082.             ],
  1083.             'placeholder' => 'Choisir une option',
  1084.             'expanded' => false,
  1085.         ]);
  1086.         $filterForm $filterForm->getForm();
  1087.         // $modules = $moduleRepository->findPaginateModule($page, Constants::PAGINATION_LIMIT, $programs, $this->isGranted("ROLE_VISITOR"));
  1088.         // if (!$program && $session->has('_program') && $session->has('_job')) {
  1089.         //     // $program = $programRepository->findOneById($session->get('_program'));
  1090.         //     // $job =  $jobRepository->findOneById($session->get('_job'));
  1091.         //     // $startAt = $session->get('_startAt');
  1092.         //     // $endAt = $session->get('_endAt');
  1093.         //     $searchKey = $session->get('_searchKey');
  1094.         //     $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, $page, null, $searchKey);
  1095.         //     $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
  1096.         // } else {
  1097.         //     $modules = $moduleRepository->searchModule(null, null, $this->getUser(), null, null, false, $page);
  1098.         //     $totalModule = $moduleRepository->searchModule(null,null, $this->getUser(), null, null, true);
  1099.         // }
  1100.         // searchModule(?Program $program, ?Job $job, ?User $user, $startAt = null, $endAt = null, $count = false, $page = null, $limit = null, $searchKey = null)
  1101.         $searchKey $session->has('_searchKey') ? $session->get('_searchKey') : null;
  1102.         $modules $moduleRepository->searchModule($program$job$usernullnullfalse$pagenull$searchKey);
  1103.         $totalModule $moduleRepository->searchModule($program$job$usernullnulltruenullnull$searchKey);
  1104.         $form->handleRequest($request);
  1105.         if ($form->isSubmitted() && $form->isValid()) {
  1106.             // $programData = $form->get('program')->getData();
  1107.             // $job = $form->get('job')->getData();
  1108.             // $startAt = $form->get('startAt')->getData();
  1109.             // $endAt = $form->get('endAt')->getData();
  1110.             // $session->set('_program', ($programData !== null) ? $programData->getId() : null);
  1111.             // $session->set('_job', ($job !== null) ? $job->getId() : null);
  1112.             // $session->set('_startAt', $startAt);
  1113.             // $session->set('_endAt', $endAt);
  1114.             // $session->set('_route', $request->get('_route'));
  1115.             $searchKey $form->get('searchKey')->getData();
  1116.             // if ($programData !== null) {
  1117.             $modules $moduleRepository->searchModule(nullnull$usernullnullfalse$pagenull$searchKey);
  1118.             $totalModule $moduleRepository->searchModule(nullnull$usernullnulltruenullnull$searchKey);
  1119.             // }
  1120.         }
  1121.         $filterForm->handleRequest($request);
  1122.         if ($filterForm->isSubmitted() && $filterForm->isValid()) {
  1123.             $filter $filterForm->get('filter')->getData();
  1124.             // $session->set('_filter', ($filter !== null) ? $filter : null);
  1125.             if ($filter !== null$modules = ($filter === 'most_seen') ? $moduleRepository->_findMostViewedModule($program) : $moduleRepository->_findMostLikedModule($program);
  1126.         }
  1127.         return $this->render('front/pages/library/module-disponibles.html.twig', [
  1128.             'programs' => $programs,
  1129.             'modules' => $modules,
  1130.             'totalModule' => count($totalModule),
  1131.             'limit' => Constants::PAGINATION_LIMIT,
  1132.             'page' => $page,
  1133.             'form' => $form->createView(),
  1134.             'filterForm' => $filterForm->createView(),
  1135.             'program' => $program
  1136.         ]);
  1137.     }
  1138.     /**
  1139.      * @Route("/{slug}/inviter-un-ami/{id}", name="app_front_library_invite_friend", methods={"GET","POST"})
  1140.      * @ParamConverter("module", isOptional="false", options={"mapping": {"slug": "slug"}})
  1141.      * @ParamConverter("user", isOptional="true", options={"mapping": {"id": "id"}})
  1142.      */
  1143.     public function invite(Request $requestModule $moduleUser $user null)
  1144.     {
  1145.         if ($user === null) throw $this->createNotFoundException("Utilisateur non trouvé");
  1146.         $url $_ENV['SECURE_SCHEME'].':'.$this->generateUrl('app_front_library_module_details_page', ['slug' => $module->getSlug()], UrlGeneratorInterface::NETWORK_PATH);
  1147.         /** @var User $sender */
  1148.         $sender $this->getUser();
  1149.         $mail = (new TemplatedEmail())
  1150.             ->from(new Address($this->getParameter('cofina_sender_mail'), 'Cofina Academy'))
  1151.             ->to($user->getEmail())
  1152.             ->subject('Invitation Module')
  1153.             ->htmlTemplate('front/pages/dashboard/modules/invite-mail.html.twig')
  1154.             ->context([
  1155.                 'module_name' => $module->getName(),
  1156.                 'invited_by' => $sender->getFullname(),
  1157.                 'module_url' => $url
  1158.             ]);
  1159.         try {
  1160.             $this->mailer->send($mail);
  1161.             $this->addFlash('invitation_sent''Invitation envoyé');
  1162.         } catch (TransportExceptionInterface $e) {
  1163.             $this->addFlash('invitation_sending_mail_error'"Erreur lors de l'envoi de l'invitation par mail");
  1164.             // Log the exception details
  1165.             $this->logger->error('Email sending failed', [
  1166.                 'error' => $e->getMessage(),
  1167.                 'debug' => $e->getDebug() ?? 'No debug info available',
  1168.             ]);
  1169.         }
  1170.         try {
  1171.             $this->bus->dispatch(new Notification($module->getId(), 'Module''module_recommandation'$sender->getId(), $user->getId()));
  1172.         } catch (Exception $e) {
  1173.             $this->addFlash('invitation_sending_notification_error'"Erreur lors de l'envoi de la notification");
  1174.         }
  1175.         $referer $request->headers->get('referer');
  1176.         return new RedirectResponse($referer);
  1177.         // return $this->redirectToRoute('app_front_library_page');
  1178.     }
  1179.     /**
  1180.      * @Route("/should-define-objective/{id}", name="app_front_should_define_objective", methods={"GET"})
  1181.      */
  1182.     public function shouldDefineObjective(Request $requestModule $moduleModuleObjectiveRepository $moduleObjectiveRepository)
  1183.     {
  1184.         $user $this->getUser();
  1185.         $program $this->getActiveProgram($modulefalse$user);
  1186.         $objective $moduleObjectiveRepository->findBy(array('module' => $module'createdBy' => $user));
  1187.         $data = array(
  1188.             'shouldDefineObjective' => ($program == null && $objective == null)
  1189.         );
  1190.         return new JsonResponse($data);
  1191.     }
  1192.     /**
  1193.      * @Route("/define-objective/{id}", name="app_front_define_objective", methods={"POST"})
  1194.      */
  1195.     public function defineObjective(Request $requestModule $moduleModuleObjectiveRepository $moduleObjectiveRepository)
  1196.     {
  1197.         $user $this->getUser();
  1198.         $date $request->get('date');
  1199.         if (!$date) {
  1200.             return new JsonResponse("Merci de renseigner une date"400);
  1201.         }
  1202.         $date DateTime::createFromFormat('d/m/Y'$date);
  1203.         $today = (new DateTime())->format('d/m/Y');;
  1204.         if (!$date || $date $today) {
  1205.             return new JsonResponse("L'objectif de date doit être fixé au moins à aujourd'hui."400);
  1206.         }
  1207.         $objective $moduleObjectiveRepository->findOneBy(array('module' => $module'createdBy' => $user));
  1208.         if (!$objective) {
  1209.             $objective = new ModuleObjective();
  1210.             $objective->setModule($module);
  1211.         }
  1212.         
  1213.         $objective->setObjectiveDate($date);
  1214.     
  1215.         $moduleObjectiveRepository->add($objectivetrue);
  1216.         $data = array(
  1217.             'status' => 'OK'
  1218.         );
  1219.         return new JsonResponse($data);
  1220.     }
  1221.     /**
  1222.      * @Route("/update-elapsed-time", name="app_user_update_elapsed_time", methods={"POST"})
  1223.      * @param Request $request
  1224.      * @return JsonResponse
  1225.      */
  1226.     public function updateElapsedTime(Request $requestUserRepository $userRepository)
  1227.     {
  1228.         $time $request->get('time');
  1229.         $user $this->getUser();
  1230.         $user->setElapsedTime($user->getElapsedTime() + $time);
  1231.         $userRepository->add($usertrue);
  1232.         $data = [
  1233.             'id' => $user->getId(),
  1234.             'status' => "OK",
  1235.             'totalElpasedTime' => $user->getElapsedTime()
  1236.         ];
  1237.         return new JsonResponse($data);
  1238.     }
  1239.     /**
  1240.      * @Route("/recherche-module", name="app_front_library_module_search")
  1241.      * @param Request $request
  1242.      * @return JsonResponse
  1243.      */
  1244.     public function moduleSearch(Request $requestModuleRepository $moduleRepository)
  1245.     {
  1246.         $searchKey $request->get('q');
  1247.         $modules $moduleRepository->searchModule(nullnull$this->getUser(), nullnullfalsenullnull$searchKey);
  1248.         $output = [];
  1249.         foreach ($modules as $key => $module) {
  1250.             $_jobs = [];
  1251.             $jobs $module->getJobs();
  1252.             foreach ($jobs as $job) {
  1253.                 $_jobs[] = $job->getLabel();
  1254.             }
  1255.             $output[] = [
  1256.                 'id' => $module->getId(),
  1257.                 'text' => $module->getName(),
  1258.                 'total_count' => count($modules),
  1259.                 'jobs' =>  $_jobs
  1260.             ];
  1261.         }
  1262.         
  1263.         return $this->json($output);
  1264.     }
  1265.     /**
  1266.      * @Route("/programmes", name="app_front_library_program_page")
  1267.      */
  1268.     public function allActivePrograms(ProgramRepository $programRepositoryJobRepository $jobRepositoryModuleRepository $moduleRepositoryModuleViewRepository $moduleViewRepositoryModuleLikeRepository $moduleLikeRepositoryRequest $requestProgramParticipationRepository $programParticipationRepositoryProgram $program nullJob $job null): Response{
  1269.         $page = (int)$request->query->get('page'1);
  1270.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1271.         $session $request->getSession();
  1272.         if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
  1273.         $user $this->getUser();
  1274.         // $programParticipation = null;
  1275.         // if($program) {
  1276.         //     $programParticipation = $programParticipationRepository->findOneBy(array('program' => $program, 'createdBy' => $user));
  1277.         //     $program = $programParticipation ? $program : null;
  1278.         // }
  1279.         $searchKey $session->has('_searchKey') ? $session->get('_searchKey') : null;
  1280.         $programs $programRepository->findAllActivePrograms($user$pageConstants::PAGINATION_LIMIT$searchKey);
  1281.         $totalProgramCount $programRepository->findAllActiveProgramsCount($user$searchKey);
  1282.         // $formBuilder = $this->createFormBuilder(null, [
  1283.         //     'validation_groups' => false 
  1284.         // ]);
  1285.         // $formBuilder->add('searchKey', HiddenType::class, [
  1286.         //     // 'class' => Module::class,
  1287.         //     'label' => false,
  1288.         //     // 'choices' => [],
  1289.         //     // 'choice_label' => 'name',
  1290.         // ]);
  1291.         // $form = $formBuilder->getForm();
  1292.         // $searchKey = $session->has('_searchKey') ? $session->get('_searchKey') : null;
  1293.         // $modules = $moduleRepository->searchModule($program, $job, $user, null, null, false, $page, null, $searchKey);
  1294.         // $totalModule = $moduleRepository->searchModule($program, $job, $user, null, null, true, null, null, $searchKey);
  1295.         // $form->handleRequest($request);
  1296.         // if ($form->isSubmitted() && $form->isValid()) {
  1297.         //     $searchKey = $form->get('searchKey')->getData();
  1298.         //     $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, $page, null, $searchKey);
  1299.         //     $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
  1300.         // }
  1301.         // $filterForm->handleRequest($request);
  1302.         // if ($filterForm->isSubmitted() && $filterForm->isValid()) {
  1303.         //     $filter = $filterForm->get('filter')->getData();
  1304.         //     // $session->set('_filter', ($filter !== null) ? $filter : null);
  1305.         //     if ($filter !== null) $modules = ($filter === 'most_seen') ? $moduleRepository->_findMostViewedModule($program) : $moduleRepository->_findMostLikedModule($program);
  1306.         // }
  1307.         return $this->render('front/pages/library/programme-disponibles.html.twig', [
  1308.             'programs' => $programs,
  1309.             'totalProgram' => $totalProgramCount,
  1310.             'limit' => Constants::PAGINATION_LIMIT,
  1311.             'page' => $page,
  1312.             // 'form' => $form->createView()
  1313.         ]);
  1314.     }
  1315. }