src/Controller/Front/LibraryController.php line 346

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