src/Controller/Front/LibraryController.php line 422

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