src/Controller/Front/DashboardController.php line 839

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Contract;
  4. use App\Entity\Course;
  5. use App\Entity\Director;
  6. use App\Entity\FeaturedModule;
  7. use App\Entity\Job;
  8. use App\Entity\Live;
  9. use App\Entity\Module;
  10. use App\Entity\ModuleItem;
  11. use App\Entity\NotificationReceiver;
  12. use App\Entity\Office;
  13. use App\Entity\Program;
  14. use App\Entity\Quiz;
  15. use App\Entity\Quote;
  16. use App\Entity\SubsidiaryCompany;
  17. use App\Entity\User;
  18. use App\Entity\Partenaire;
  19. use App\Form\ChangePasswordType;
  20. use App\Form\CourseType;
  21. use App\Form\DirectorType;
  22. use App\Form\FeaturedModuleType;
  23. use App\Form\JobType;
  24. use App\Form\LiveType;
  25. use App\Form\ModuleType;
  26. use App\Form\ProgramType;
  27. use App\Form\QuizType;
  28. use App\Form\QuoteType;
  29. use App\Form\PartenaireType;
  30. use App\Form\RegistrationFormType;
  31. use App\Helper\ControllerHelper;
  32. use App\Message\Notification;
  33. use App\Entity\Notification as NotificationEntity;
  34. use App\Event\PreExecutionEvent;
  35. use App\Repository\CourseRepository;
  36. use App\Repository\DirectorRepository;
  37. use App\Repository\FeaturedModuleRepository;
  38. use App\Repository\JobRepository;
  39. use App\Repository\LiveRepository;
  40. use App\Repository\ModuleItemRepository;
  41. use App\Repository\ModuleNoticeRepository;
  42. use App\Repository\ModuleParticipationRepository;
  43. use App\Repository\ModuleRepository;
  44. use App\Repository\ModuleViewRepository;
  45. use App\Repository\OfficeRepository;
  46. use App\Repository\ProgramParticipationRepository;
  47. use App\Repository\ProgramRepository;
  48. use App\Repository\QuizRepository;
  49. use App\Repository\QuoteRepository;
  50. use App\Repository\SubsidiaryCompanyRepository;
  51. use App\Repository\UserRepository;
  52. use App\Repository\ModuleObjectiveRepository;
  53. use App\Repository\NotificationReceiverRepository;
  54. use App\Repository\NotificationRepository;
  55. use App\Repository\PartenaireRepository;
  56. use App\Repository\SubjectRepository;
  57. use App\Repository\CommentRepository;
  58. use App\Repository\UserModuleParticipationRepository;
  59. use App\Schedule\AppScheduleBuilder;
  60. use App\Service\HelperService;
  61. use App\Service\PushNotification;
  62. use App\Utils\Constants;
  63. use DateInterval;
  64. use DateTime;
  65. use Doctrine\Persistence\ManagerRegistry;
  66. use Exception;
  67. use Kreait\Firebase\Contract\Messaging;
  68. use LogicException;
  69. use PhpOffice\PhpSpreadsheet\Calculation\DateTimeExcel\Date;
  70. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  71. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  72. use Symfony\Component\HttpFoundation\JsonResponse;
  73. use Symfony\Component\HttpFoundation\Request;
  74. use Symfony\Component\HttpFoundation\Response;
  75. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  76. use Symfony\Component\Mailer\MailerInterface;
  77. use Symfony\Component\Mime\Address;
  78. use Symfony\Component\Mime\Email;
  79. use Symfony\Component\Routing\Annotation\Route;
  80. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  81. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  82. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  83. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  84. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  85. use Symfony\Component\Form\Extension\Core\Type\TextType;
  86. use Symfony\Component\Mercure\HubInterface;
  87. use Symfony\Component\Mercure\Update;
  88. use Symfony\Component\Messenger\MessageBusInterface;
  89. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  90. use Symfony\Component\String\Slugger\SluggerInterface;
  91. use Symfony\Component\Workflow\WorkflowInterface;
  92. use JMS\Serializer\SerializationContext;
  93. use JMS\Serializer\SerializerInterface;
  94. use Knp\Component\Pager\Paginator;
  95. use Knp\Component\Pager\PaginatorInterface;
  96. use Symfony\Component\EventDispatcher\EventDispatcher;
  97. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  98. use Zenstruck\ScheduleBundle\Schedule;
  99. /**
  100.  * Require ROLE_EMPLOYEE for all the actions of this controller
  101.  *
  102.  * @IsGranted("ROLE_EMPLOYEE")
  103.  * 
  104.  * @Route("/dashboard")
  105.  */
  106. class DashboardController extends AbstractController
  107. {
  108.     use ControllerHelper;
  109.     private $helperService;
  110.     private $courseWorkflow;
  111.     private $liveWorkflow;
  112.     private $quizWorkflow;
  113.     private $doctrine;
  114.     private $mailer;
  115.     private $messaging;
  116.     private $pushNotification;
  117.     private $slugger;
  118.     private $hub;
  119.     private $bus;
  120.     private $paginator;
  121.     public function __construct(
  122.         HelperService $helperService
  123.         WorkflowInterface $coursePublishingStateMachine
  124.         WorkflowInterface $livePublishingStateMachine
  125.         WorkflowInterface $quizPublishingStateMachine
  126.         MailerInterface $mailer
  127.         ManagerRegistry $doctrine
  128.         Messaging $messaging
  129.         PushNotification $pushNotification
  130.         SluggerInterface $slugger
  131.         HubInterface $hub
  132.         MessageBusInterface $bus,
  133.         PaginatorInterface $paginator)
  134.     {
  135.         $this->helperService $helperService;
  136.         $this->courseWorkflow $coursePublishingStateMachine;
  137.         $this->liveWorkflow $livePublishingStateMachine;
  138.         $this->quizWorkflow $quizPublishingStateMachine;
  139.         $this->doctrine $doctrine;
  140.         $this->mailer $mailer;
  141.         $this->messaging $messaging;
  142.         $this->pushNotification $pushNotification;
  143.         $this->slugger $slugger;
  144.         $this->hub $hub;
  145.         $this->bus $bus;
  146.         $this->paginator $paginator;
  147.     }
  148.     
  149.     /**
  150.      * @Route("/{profil}/password", name="app_front_dashboard_update_password_page")
  151.      */
  152.     public function updatePassword(Request $requestUserRepository $userRepositoryUserPasswordHasherInterface $userPasswordHasherString $profil): Response
  153.     {
  154.         /** @var User */
  155.         $user $this->getUser();
  156.         $form $this->createForm(ChangePasswordType::class, $user);
  157.         $form->handleRequest($request);
  158.         if ($form->isSubmitted() && $form->isValid()) {
  159.             $oldPassword $form->get('oldPassword')->getData();
  160.             if (!$userPasswordHasher->isPasswordValid($user$oldPassword)) {
  161.                 $this->addFlash('user_password_update_error''Mot de passe incorrect');
  162.                 
  163.                 return $this->redirectToRoute('app_front_dashboard_update_password_page', ['profil' => $profil]);
  164.             }
  165.             $user->setPassword(
  166.                 $userPasswordHasher->hashPassword(
  167.                     $user,
  168.                     $form->get('newPassword')->getData()
  169.                 )
  170.             );
  171.             $userRepository->add($usertrue);
  172.             $mail = (new TemplatedEmail())
  173.                 ->from(new Address($this->getParameter('cofina_sender_mail'), 'Cofina Academy'))
  174.                 ->to($user->getEmail())
  175.                 ->subject('Changement de mot de passe au Programme')
  176.                 ->htmlTemplate('security/change-password-email.html.twig')
  177.                 ->context([]);
  178.     
  179.             try {
  180.                 $this->mailer->send($mail);
  181.             } catch (TransportExceptionInterface $e) {
  182.                 // dump($e->getMessage()); die;
  183.             }
  184.             $this->addFlash('user_password_updated''Mot de passe mis à jour');
  185.             return $this->redirectToRoute('app_front_dashboard_update_password_page', ['profil' => $profil]);
  186.         }
  187.         return $this->render('front/pages/dashboard/password.html.twig', [
  188.              'form' => $form->createView(),
  189.         ]);
  190.     }
  191.     /**
  192.      * @Route("/apprenant/profil/{id}", name="app_learner_dashboard_page")
  193.      * @Route("/apprenant", name="app_front_learner_dashboard_page")
  194.      */
  195.     public function learner(Request $requestProgramRepository $programRepositoryModuleRepository $moduleRepositoryNotificationRepository $notificationRepositoryUserModuleParticipationRepository $userModuleParticipationRepository, ?User $learner null): Response
  196.     {   
  197.         // $programs = $programRepository->findAll();
  198.         // foreach ($programs as $program) {
  199.         //     $slug = $this->slugger->slug($program->getLabel());
  200.         //     $program->setSlug($slug);
  201.         //     $programRepository->add($program, true);
  202.         // }
  203.         // die("ok");
  204.         $followedModulesPage = (int)$request->query->get('followedModulesPage'1);
  205.         $allModulesPage = (int)$request->query->get('allModulesPage'1);
  206.         $terminatedModulesPage = (int)$request->query->get('terminatedModulesPage'1);
  207.         $notificationPage = (int)$request->query->get('notificationPage'1);
  208.         $session $request->getSession();
  209.         /** @var User */
  210.         $user $this->getUser();
  211.         $refererProfile null;
  212.         if ($learner !== null) {
  213.             $user $learner;
  214.             $refererProfile $session->has('__profile') ? $session->get('__profile') : null;
  215.         }
  216.         $followedProgramCount $programRepository->getFollowedProgramCount($user);
  217.         $terminatedProgramCount $programRepository->getTerminatedProgramCount($user);
  218.         $limit Constants::PAGINATION_LIMIT;
  219.         // $allModulesQb = $moduleRepository->findAllModuleQueryBuilder($user, $allModulesPage, $limit);
  220.         // $allModules = $moduleRepository->findAllModule($allModulesQb);
  221.         
  222.         $allModulesCountQb $moduleRepository->findAllModuleQueryBuilder($user);
  223.         $allModuleCount $moduleRepository->findAllModule($allModulesCountQb)->count();
  224.         //$followedModules = $moduleRepository->findFollowedModules($user, $followedModulesPage, Constants::PAGINATION_LIMIT);
  225.         $followedModuleCount $moduleRepository->getFollowedModuleCount($usertrue);
  226.         //$followedModuleCountHist = $moduleRepository->getFollowedModuleCount($user, false);
  227.         $terminatedModules $moduleRepository->findTerminatedModules($user$terminatedModulesPage$limit);
  228.        
  229.         // foreach ($terminatedModules as $_modules) {
  230.         //     foreach ($_modules as $_module) {
  231.         //         if ($_module != null) {
  232.         //             print_r($_module->getId());
  233.         //         } else print_r($_module); 
  234.         //         echo '<br/>';
  235.         //     }
  236.         // }
  237.         
  238.         // die;
  239.         // $terminatedModuleCount = $moduleRepository->getTerminatedModuleCount($user);
  240.         $terminatedModuleCount $userModuleParticipationRepository->getTerminatedModulesCount($user);
  241.         //$modulesObjectives = $moduleObjectiveRepository->findBy(array('module' => $allModules->getIterator()->getArrayCopy()));
  242.         //dd($allModules->getIterator()->getArrayCopy());
  243.         // $programParticipationWithCertificate = $user->getProgramParticipations()->filter(function($programParticipation) {
  244.         //     return ($programParticipation->getCertificate() !== null);
  245.         // });
  246.         $programs $programRepository->findActivePrograms($user);
  247.         $modules $moduleRepository->searchModule(nullnull$user);
  248.         // Filter form
  249.         $form $this->createFormBuilder()
  250.         ->add('program'EntityType::class, [
  251.             'class' => Program::class,
  252.             'label' => false,
  253.             'choice_label' => 'label',
  254.             'placeholder' => 'Choisir un programme',
  255.             'required' => false,
  256.             'choices' => $programs,
  257.             'attr' => [
  258.                 // 'class' => 'form-select select-2-tags',
  259.                 'class' => 'select-2-tags custom-dash-select shadow-sm me-0 me-md-4 custom-dash-select-w bg-white',
  260.                 'data-placeholder' => 'Choisir un programme'
  261.             ], 
  262.         ])
  263.         ->add('module'EntityType::class, [
  264.             'class' => Module::class,
  265.             'label' => false,
  266.             'choice_label' => 'name',
  267.             'placeholder' => 'Choisir un module',
  268.             'required' => false,
  269.             'choices' => $modules,
  270.             'attr' => [
  271.                 // 'class' => 'form-select select-2-tags',
  272.                 'class' => 'select-2-tags custom-dash-select shadow-sm custom-dash-select-w bg-white',
  273.                 'data-placeholder' => 'Choisir un module'
  274.             ], 
  275.         ])
  276.         ->add('filter'SubmitType::class, [
  277.             'label' => 'Filtrer',
  278.             // 'attr' => ['class' => 'btn btn-danger opificio rounded-4 px-5 fw-bold fs-5']
  279.             'attr' => ['class' => 'custom-dash-select shadow-sm bg-white']
  280.         ])
  281.         ->getForm();
  282.         $form->handleRequest($request);
  283.         if ($form->isSubmitted() && $form->isValid()) {
  284.             $programData $form->get('program')->getData();
  285.             $moduleData $form->get('module')->getData();
  286.             if ($programData !== null$session->set('__program'$programData->getId());
  287.             if ($moduleData !== null$session->set('__module'$moduleData->getId());
  288.         }
  289.         $current_role $this->helperService->getUserCurrentRole();
  290.         $unreadNotifications $notificationRepository->findUnreadNotifications($user$notificationPageConstants::PAGINATION_LIMIT);
  291.         $unreadNotificationCount $notificationRepository->getUnreadNotificationCount($user);
  292.         $notificationCount $notificationRepository->findNotificationCount($user);
  293.         // $notifications = $notificationRepository->findBy(
  294.         //                                             array('receiver' => $user),
  295.         //                                             array('createdAt' => 'DESC'),
  296.         //                                             Constants::PAGINATION_LIMIT,
  297.         //                                             $notificationPage-1
  298.         //                                         );
  299.         $notifications $notificationRepository->findNotifications($user$notificationPageConstants::PAGINATION_LIMIT);
  300.         // return $this->render('front/pages/dashboard/learner.html.twig', [
  301.         return $this->render('front/pages/dashboard/index.html.twig', [
  302.             'followed_program_count' => $followedProgramCount,
  303.             'terminated_program_count' => $terminatedProgramCount,
  304.             'followed_module_count' => $followedModuleCount,
  305.             'terminated_module_count' => $terminatedModuleCount,
  306.             //'followed_module_count_hist' => $followedModuleCountHist,
  307.             //'terminatedModuleCount' => $terminatedModuleCount,
  308.             //'followedModules' => $followedModules,
  309.             //'allModules' => $allModules,
  310.             'terminated_modules' => $terminatedModules,
  311.             // 'program_participation_with_certificate' => $programParticipationWithCertificate,
  312.             'limit' => Constants::PAGINATION_LIMIT,
  313.             'allModulesPage' => $allModulesPage,
  314.             'allModuleCount' => $allModuleCount,
  315.             'followedModulesPage' => $followedModulesPage,
  316.             //'followedModuleCount' => $followedModuleCount,
  317.             'terminatedModulesPage' => $terminatedModulesPage,
  318.             //'terminatedModuleCount' => $terminatedModuleCount,
  319.             'program' => ($session->has('__program') ? $programRepository->findOneById($session->get('__program')) : null),
  320.             'module' => ($session->has('__module') ? $moduleRepository->findOneById($session->get('__module')) : null),
  321.             //'programs' => $programs,
  322.             //'modules' => $modules,
  323.             'form' => $form->createView(),
  324.             'user' => $user,
  325.             'learner' => $learner,
  326.             'referer_profile' => $refererProfile,
  327.             'current_role' => $current_role,
  328.             'unreadNotifications' => $unreadNotifications,
  329.             'unreadNotificationCount' => $unreadNotificationCount,
  330.             'notificationPage' => $notificationPage,
  331.             'notifications' => $notifications,
  332.             'notificationCount' => $notificationCount
  333.         ]);
  334.     }
  335.     /**
  336.      * @Route("/apprenant/training-history/user/{id}", name="app_front_learner_training_history_for_user")
  337.      * @Route("/apprenant/training-history", name="app_front_learner_training_history")
  338.      * @Route("/apprenant/training-history/{id}", name="app_front_learner_training__history")
  339.      */
  340.     public function training_history(Request $requestModuleRepository $moduleRepositoryUserModuleParticipationRepository $userModuleParticipationRepository,  ?User $learner null): Response
  341.     {   
  342.         $type $request->get('type''all');
  343.         $page = (int) $request->get('page'1);
  344.         $followedModulesPage 1;
  345.         $allModulesPage 1;
  346.         $terminatedModulesPage 1;
  347.         
  348.         if ($type == 'followed') {
  349.             $followedModulesPage $page;
  350.         } else if($type == 'terminated') {
  351.             $terminatedModulesPage $page;
  352.         } else {
  353.             $allModulesPage $page;
  354.         }
  355.         /** @var User */
  356.         $user = ($learner !== null) ? $learner $this->getUser();
  357.         // $refererProfile = null;
  358.         // if ($learner !== null) {
  359.         //     $user = $learner;
  360.         //     //$refererProfile = $session->has('__profile') ? $session->get('__profile') : null;
  361.         // }
  362.         // $followedProgramCount = $programRepository->getFollowedProgramCount($user);
  363.         // $terminatedProgramCount = $programRepository->getTerminatedProgramCount($user);
  364.         $allModulesQb $moduleRepository->findAllModuleQueryBuilder($user$allModulesPageConstants::PAGINATION_LIMIT);
  365.         $allModules $moduleRepository->findAllModule($allModulesQb);
  366.         
  367.         $allModulesCountQb $moduleRepository->findAllModuleQueryBuilder($user);
  368.         $allModuleCount $moduleRepository->findAllModule($allModulesCountQb)->count();
  369.         $followedModules $moduleRepository->findFollowedModules($user$followedModulesPageConstants::PAGINATION_LIMITfalse);
  370.         $followedModuleCount $moduleRepository->getFollowedModuleCount($usertrue);
  371.         // $followedModuleCountHist = $moduleRepository->getFollowedModuleCount($user, false);
  372.         // dump($followedModuleCount);
  373.         // dump($followedModuleCountHist);
  374.         // die;
  375.         $terminatedModules $moduleRepository->findTerminatedModules($user$terminatedModulesPageConstants::PAGINATION_LIMIT);
  376.         // $terminatedModules = $userModuleParticipationRepository->getTerminatedModules($user, $terminatedModulesPage, Constants::PAGINATION_LIMIT);
  377.         // $terminatedModuleCount = $moduleRepository->getTerminatedModuleCount($user);
  378.         $terminatedModuleCount $userModuleParticipationRepository->getTerminatedModulesCount($user);
  379.         $allModulesPagination $this->paginator->paginate(
  380.             $allModulesQb,
  381.             $allModulesPage,
  382.             Constants::PAGINATION_LIMIT
  383.         );
  384.         return $this->render('front/layouts/partials/training-history.html.twig', [
  385.             'followedModules' => $followedModules,
  386.             'allModules' => $allModules,
  387.             'terminatedModules' => $terminatedModules,
  388.             'limit' => Constants::PAGINATION_LIMIT,
  389.             'allModulesPage' => $allModulesPage,
  390.             'all_module_count' => $allModuleCount,
  391.             'followedModulesPage' => $followedModulesPage,
  392.             'followed_module_count' => $followedModuleCount,
  393.             'terminatedModulesPage' => $terminatedModulesPage,
  394.             //'terminatedModuleCount' => $terminatedModuleCount,
  395.             'terminated_module_count' => $terminatedModuleCount,
  396.             // 'followed_module_count_hist' => $followedModuleCountHist,
  397.             'user' => $user,
  398.             'learner' => $learner,
  399.             // 'allModulesPage' => $allModulesPage,
  400.             'followedModulesPage' => $followedModulesPage,
  401.             'terminatedModulesPage' => $terminatedModulesPage,
  402.             'type' => $type,
  403.             'allModulesPagination' => $allModulesPagination
  404.         ]);
  405.     }
  406.     /**
  407.      * @Route("/apprenant/all-certificates", name="app_front_learner_all_certificates")
  408.      */
  409.     public function allCertificates(Request $requestModuleRepository $moduleRepository, ?User $learner null): Response
  410.     {   
  411.         $followedModulesPage = (int)$request->query->get('followedModulesPage'1);
  412.         $allModulesPage = (int)$request->query->get('allModulesPage'1);
  413.         $session $request->getSession();
  414.         /** @var User */
  415.         $user $this->getUser();
  416.         $refererProfile null;
  417.         if ($learner !== null) {
  418.             $user $learner;
  419.             $refererProfile $session->has('__profile') ? $session->get('__profile') : null;
  420.         }
  421.         // $allModules = $moduleRepository->findAllModule($user, $allModulesPage, Constants::PAGINATION_LIMIT);
  422.         // $allModuleCount = $moduleRepository->findAllModule($user)->count();
  423.         $allModulesQb $moduleRepository->findAllModuleQueryBuilder($user$allModulesPageConstants::PAGINATION_LIMIT);
  424.         $programParticipationWithCertificate $user->getProgramParticipations()->filter(function($programParticipation) {
  425.             return ($programParticipation->getCertificate() !== null);
  426.         });
  427.         return $this->render('front/layouts/partials/all-certificates-dashboard.html.twig', [
  428.             'allModules' => $allModulesQb,
  429.             'program_participation_with_certificate' => $programParticipationWithCertificate,
  430.             'user' => $user
  431.         ]);
  432.     }
  433.     /**
  434.      * @Route("/{profil}/list-apprenants", name="app_front_learner_page")
  435.      */
  436.     public function learnerPage(Request $requestUserRepository $userRepositoryProgramRepository $programRepositoryModuleRepository $moduleRepositoryString $profil): Response
  437.     {
  438.         $page = (int)$request->query->get('page'1);
  439.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  440.         $programs $programRepository->findActivePrograms($this->getUser());
  441.         $modules $moduleRepository->searchModule(nullnull$this->getUser());
  442.         $session $request->getSession();
  443.         // Filter form
  444.         $form $this->createFormBuilder()
  445.         ->add('program'EntityType::class, [
  446.             'class' => Program::class,
  447.             'label' => false,
  448.             'choice_label' => 'label',
  449.             'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50'],
  450.             'placeholder' => 'Choisir un programme',
  451.             'required' => false,
  452.             'choices' => $programs,
  453.         ])
  454.         ->add('module'EntityType::class, [
  455.             'class' => Module::class,
  456.             'label' => false,
  457.             'choice_label' => 'name',
  458.             'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50'],
  459.             'placeholder' => 'Choisir un module',
  460.             'required' => false,
  461.             'choices' => $modules
  462.         ])
  463.         ->add('filter'SubmitType::class, [
  464.             'label' => 'Filtrer',
  465.             'attr' => ['class' => 'custom-dash-select shadow-sm bg-white']
  466.         ])
  467.         ->getForm();
  468.         
  469.         $form->handleRequest($request);
  470.         if ($form->isSubmitted() && $form->isValid()) {
  471.             $programData $form->get('program')->getData();
  472.             $module $form->get('module')->getData();
  473.             $session->set('__program'$programData->getId());
  474.             $session->set('__module'$module->getId());
  475.         }
  476.         $current_role $this->helperService->getUserCurrentRole();
  477.         $learners $userRepository->findLearners($pageConstants::PAGINATION_LIMIT$this->getUser(), $current_role);
  478.         // $learnerWithCertificateCount = $userRepository->getLearnerWithCertificateCount();
  479.         $learnerCount $this->getLearnerCount();
  480.         
  481.         
  482.         return $this->render('front/pages/dashboard/learners/learners.html.twig', [
  483.             'learners' => $learners,
  484.             'total_learner' => $learnerCount,
  485.             'limit' => Constants::PAGINATION_LIMIT,
  486.             'page' => $page,
  487.             'program' => ($session->has('__program') ? $programRepository->findOneById($session->get('__program')) : null),
  488.             'module' => ($session->has('__module') ? $moduleRepository->findOneById($session->get('__module')) : null),
  489.             'user' => ($profil === 'integrateur' || $profil === 'administrateur') ? null $this->getUser(),
  490.             'programs' => $programs,
  491.             'modules' => $modules,
  492.             'form' => $form->createView(),
  493.             'current_role' => $current_role
  494.             // 'success_rate' => ($learnerWithCertificateCount / $learnerCount) * 100,
  495.         ]);
  496.     }
  497.     /**
  498.      * @Route("/{profil}/utilisateurs", name="app_front_user_page")
  499.      */
  500.     public function utilisateurPage(): Response
  501.     {
  502.         return $this->render('front/pages/dashboard/users/users.html.twig', [
  503.             'controller_name' => 'users',
  504.         ]);
  505.     }
  506.     /**
  507.      * @Route("/{profil}/programmes", name="app_front_program_page")
  508.      * @Route("/{profil}/programmes-termines", name="app_front_terminated_program_page")
  509.      * @Route("/{profil}/{id}/programmes", name="app_front_learner_program_page")
  510.      * @Route("/{profil}/{id}/programmes-termines", name="app_front_learner_terminated_program_page")
  511.      */
  512.     public function programPage(Request $requestProgramRepository $programRepositoryPaginatorInterface $paginator, ?User $learner null): Response
  513.     {
  514.         $session $request->getSession();
  515.         if ($request->query->get('page') === null$session->remove('program_search_key');
  516.         $program = new Program();
  517.         $page = (int)$request->query->get('page'1);
  518.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  519.         // Search form
  520.         $searchKey $session->has('program_search_key') ? $session->get('program_search_key') : null;
  521.         $form $this->createFormBuilder()
  522.         ->add('searchKey'TextType::class, [
  523.             'label' => 'Rechercher: ',
  524.             'label_attr' => ['class' => 'text-grey'],
  525.             'attr' => [
  526.                 'style' => 'border: 1px solid transparent !important'
  527.             ],
  528.             'required' => false,
  529.             'data' => $session->has('program_search_key') ? $session->get('program_search_key') : ''
  530.         ])
  531.         ->getForm();
  532.          
  533.         $form->handleRequest($request);
  534.         if ($form->isSubmitted() && $form->isValid()) {
  535.             $searchKey $form->get('searchKey')->getData();
  536.             $session->remove('program_search_key');
  537.             if ($searchKey !== null$session->set('program_search_key'$searchKey);
  538.         }
  539.         $user = ($learner !== null) ? $learner $this->getUser();
  540.         // $programs = $programRepository->findPrograms($user, $page, Constants::PAGINATION_LIMIT, $searchKey);
  541.         $programs $programRepository->findProgramsQuery($usertrue$searchKey);
  542.         // $totalProgram = $programRepository->getTotalProgram($user, $searchKey);
  543.         $pagination $paginator->paginate(
  544.             $programs,
  545.             $page,
  546.             10
  547.         );
  548.         return $this->renderForm('front/pages/dashboard/program/program.html.twig', [
  549.             'program' => $program,
  550.             'programs' => $pagination,
  551.             //'totalProgram' => $totalProgram,
  552.             'limit' => Constants::PAGINATION_LIMIT,
  553.             'page' => $page,
  554.             'form' => $form
  555.         ]);
  556.     }
  557.     /**
  558.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR')")
  559.      * 
  560.      * @Route("/{profil}/programmes/creer-un-programme", name="app_front_create_program_page")
  561.      */
  562.     public function createProgram(Request $requestProgramRepository $programRepositoryString $profil): Response
  563.     {
  564.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  565.         // if (!in_array($this->helperService->getUserCurrentRole(), Constants::MANAGER_ROLES)) throw $this->createNotFoundException("La page demandée n'existe pas");
  566.         $program = new Program();
  567.         $form $this->createForm(ProgramType::class, $program);
  568.         $form->handleRequest($request);
  569.         if ($form->isSubmitted() && $form->isValid()) {
  570.             $programRepository->add($programtrue);
  571.         
  572.             $subsidiaryCompanies = ($program->isIsAllSubsidiaryCompanies()) ? "Toutes les filiales" $program->getSubsidiaryCompanies()->toArray();
  573.             $jobs = ($program->isIsAllJobs()) ? "Tous les métiers" $program->getJobs()->toArray();
  574.             $offices = ($program->isIsAllOffices()) ? "Toutes les fonctions" $program->getOffices()->toArray();
  575.             $contracts = ($program->isIsAllContracts()) ? "Tous les types de contrat" $program->getContracts()->toArray();
  576.             $toAddresses = [];
  577.             $topics = [];
  578.             if (is_array($subsidiaryCompanies)) {
  579.                 foreach ($subsidiaryCompanies as $subsidiaryCompany) {
  580.                     $toAddresses [] = $subsidiaryCompany->getMailingListAllStaff();
  581.                 }
  582.             } else {
  583.                 $toAddresses [] = $this->getParameter('cofina_all_subsidiary_companies_recipient_mail');
  584.                 $topics [] = Constants::DEFAULT_TOPIC;
  585.             }
  586.             $deviceTokens = [];
  587.             foreach ($program->getUsers() as $user) {
  588.                 $toAddresses [] = $user->getEmail();
  589.                 $deviceTokens array_diff($deviceTokens, ($user->getDeviceTokens() ?? []));
  590.             }
  591.             if ($toAddresses !== null && count($toAddresses) > 0) {
  592.                 $okUrl $_ENV['SECURE_SCHEME'].':'.$this->generateUrl('app_admin_program_participation_page', ['id' => $program->getId()], UrlGeneratorInterface::NETWORK_PATH);
  593.                 $nokUrl $_ENV['SECURE_SCHEME'].':'.$this->generateUrl('app_admin_program_participant_unavailable_page', ['id' => $program->getId()], UrlGeneratorInterface::NETWORK_PATH);
  594.                 $mail = (new TemplatedEmail())
  595.                     ->from(new Address($this->getParameter('cofina_sender_mail'), 'Cofina Academy'))
  596.                     ->to(...$toAddresses)
  597.                     ->subject('Invitation au Programme')
  598.                     ->htmlTemplate('front/pages/dashboard/program/mail.html.twig')
  599.                     ->context([
  600.                         'subsidiaryCompanies' => $subsidiaryCompanies,
  601.                         'jobs' => $jobs,
  602.                         'offices' => $offices,
  603.                         'contracts' => $contracts,
  604.                         'objective' => $program->getObjective(),
  605.                         'name' => $program->getLabel(),
  606.                         'startAt' => $program->getStartAt(),
  607.                         'endAt' => $program->getEndAt(),
  608.                         'program_participation_url' => $okUrl,
  609.                         'nok_url' => $nokUrl
  610.                     ]);
  611.                 try {
  612.                     $this->mailer->send($mail);
  613.                 } catch (TransportExceptionInterface $e) {
  614.                     // dump($e->getMessage()); die;
  615.                 }
  616.             }  
  617.             try {
  618.                 $this->bus->dispatch(new Notification($program->getId(), 'Program''new_program'$program->getCreatedBy()->getId()));
  619.             } catch (Exception $e) {
  620.                 // dump($e->getMessage()); die;
  621.             }
  622.             return $this->redirectToRoute('app_front_program_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  623.         }
  624.         return $this->renderForm('front/pages/dashboard/program/create_program.html.twig', [
  625.             'program' => $program,
  626.             'form' => $form,
  627.             'profil' => $profil
  628.         ]);
  629.     }
  630.     /**
  631.      * @Route("/{profil}/modules", name="app_front_module_page")
  632.      * @Route("/{profil}/modules-termines", name="app_front_terminated_module_page")
  633.      * @Route("/{profil}/{id}/modules", name="app_front_learner_module_page")
  634.      * @Route("/{profil}/{id}/modules-termines", name="app_front_learner_terminated_module_page")
  635.      */
  636.     public function modulePage(Request $requestModuleRepository $moduleRepositoryPaginatorInterface $paginator, ?User $learner null): Response
  637.     {
  638.         $session $request->getSession();
  639.         if ($request->query->get('page') === null$session->remove('module_search_key');
  640.         // $module = new Module();
  641.         $page = (int)$request->query->get('page'1);
  642.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  643.         // Search form
  644.         $searchKey $session->has('module_search_key') ? $session->get('module_search_key') : null;
  645.         $form $this->createFormBuilder()
  646.         ->add('searchKey'TextType::class, [
  647.             'label' => 'Rechercher: ',
  648.             'label_attr' => ['class' => 'text-grey'],
  649.             'attr' => [
  650.                 'style' => 'border: 1px solid transparent !important'
  651.             ],
  652.             'required' => false,
  653.             'data' => $session->has('module_search_key') ? $session->get('module_search_key') : ''
  654.         ])
  655.         ->getForm();
  656.         
  657.         $form->handleRequest($request);
  658.         if ($form->isSubmitted() && $form->isValid()) {
  659.             $searchKey $form->get('searchKey')->getData();
  660.             $session->remove('module_search_key');
  661.             if ($searchKey !== null$session->set('module_search_key'$searchKey);
  662.         }
  663.         //$modules = $moduleRepository->findPaginateModule($page, Constants::PAGINATION_LIMIT);
  664.         $user = ($learner !== null) ? $learner $this->getUser();
  665.         $modules $moduleRepository->findModulesQuery($usertrue$searchKey);
  666.         //$totalModule = $moduleRepository->findModules($this->getUser(), false, null, null, $searchKey);
  667.         //$totalModule = $moduleRepository->getTotalModule($this->getUser());
  668.         //dd($totalModule);
  669.         $pagination $paginator->paginate(
  670.             $modules,
  671.             $page,
  672.             10
  673.         );
  674.         return $this->renderForm('front/pages/dashboard/modules/modules.html.twig', [
  675.             //'module' => $module,
  676.             'modules' => $pagination,
  677.             // 'totalModule' => $totalModule,
  678.             'limit' => Constants::PAGINATION_LIMIT,
  679.             'page' => $page,
  680.             'form' => $form
  681.         ]);
  682.     }
  683.     /**
  684.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR')")
  685.      * 
  686.      * @Route("/{profil}/modules/creer-un-module", name="app_front_create_module_page")
  687.      */
  688.     public function createModule(Request $requestModuleRepository $moduleRepositoryModuleItemRepository $moduleItemRepositoryString $profil): Response
  689.     {
  690.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  691.         if (!in_array($this->helperService->getUserCurrentRole(), Constants::MANAGER_ROLES)) throw $this->createNotFoundException("La page demandée n'existe pas");
  692.         $module = new Module();
  693.         $form $this->createForm(ModuleType::class, $module);
  694.         $form->handleRequest($request);
  695.         if ($form->isSubmitted() && $form->isValid()) {
  696.             if ($module->isIsPublished()) $module->setPublishedAt(new DateTime());
  697.             $moduleRepository->add($moduletrue);
  698.             $courses $module->getCourses();
  699.             foreach ($courses as $course) {
  700.                 // $moduleItem = $moduleItemRepository->findOneBy(['module' => $module, 'course' => $course]);
  701.                 // if ($moduleItem === null) {
  702.                     $moduleItem = new ModuleItem();
  703.                     $moduleItem->setModule($module);
  704.                     $moduleItem->setCourse($course);
  705.                     $moduleItem->setType('course');
  706.                     $moduleItemRepository->add($moduleItemtrue);
  707.                 // }
  708.             }
  709.             $_quiz $module->getQuiz();
  710.             foreach ($_quiz as $quiz) {
  711.                 // $moduleItem = $moduleItemRepository->findOneBy(['module' => $module, 'quiz' => $quiz]);
  712.                 // if ($moduleItem === null) {
  713.                     $moduleItem = new ModuleItem();
  714.                     $moduleItem->setModule($module);
  715.                     $moduleItem->setQuiz($quiz);
  716.                     $moduleItem->setType('quiz');
  717.                     $moduleItemRepository->add($moduleItemtrue);
  718.                 // }
  719.             }
  720.             return $this->redirectToRoute('app_front_module_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  721.         }
  722.         return $this->renderForm('front/pages/dashboard/modules/create_module.html.twig', [
  723.             'module' => $module,
  724.             'form' => $form,
  725.             'profil' => $profil
  726.         ]);
  727.     }
  728.     /**
  729.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR')")
  730.      * 
  731.      * @Route("/{profil}/modules/organiser-le-module/{slug}", name="app_front_module_arrange_page")
  732.      */
  733.     public function arrangeModulePage(ModuleItemRepository $moduleItemRepositoryModule $module): Response
  734.     {
  735.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  736.         // if (!in_array($this->helperService->getUserCurrentRole(), Constants::MANAGER_ROLES)) throw $this->createNotFoundException("La page demandée n'existe pas");
  737.         $items $moduleItemRepository->findItems($module);
  738.         // dump($items); die;
  739.         return $this->renderForm('front/pages/dashboard/modules/arrange.html.twig', [
  740.             'items' => $items,
  741.             'module' => $module
  742.         ]);
  743.     }
  744.     /**
  745.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR') or is_granted('ROLE_COACH') or is_granted('ROLE_TUTOR') or is_granted('ROLE_ADVISE')")
  746.      * 
  747.      * @Route("/{profil}/quiz", name="app_front_quiz_page")
  748.      */
  749.     public function quizPage(Request $requestQuizRepository $quizRepositoryPaginatorInterface $paginator, ?String $profil null): Response
  750.     {
  751.         $session $request->getSession();
  752.         if ($request->query->get('page') === null$session->remove('quiz_search_key');
  753.         $userRole $this->getUserActivedRole($profil);
  754.         if ($userRole === null) throw $this->createNotFoundException("La page demandée n'existe pas");
  755.         $quiz = new Quiz();
  756.         $page = (int)$request->query->get('page'1);
  757.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  758.         // Search form
  759.         $searchKey $session->has('quiz_search_key') ? $session->get('quiz_search_key') : null;
  760.         $form $this->createFormBuilder()
  761.         ->add('searchKey'TextType::class, [
  762.             'label' => 'Rechercher: ',
  763.             'label_attr' => ['class' => 'text-grey'],
  764.             'attr' => [
  765.                 'style' => 'border: 1px solid transparent !important'
  766.             ],
  767.             'required' => false,
  768.             'data' => $session->has('quiz_search_key') ? $session->get('quiz_search_key') : ''
  769.         ])
  770.         ->getForm();
  771.         
  772.         $form->handleRequest($request);
  773.         if ($form->isSubmitted() && $form->isValid()) {
  774.             $searchKey $form->get('searchKey')->getData();
  775.             $session->remove('quiz_search_key');
  776.             if ($searchKey !== null$session->set('quiz_search_key'$searchKey);
  777.         }
  778.         $quizs $quizRepository->findQuiz($this->getUser(), $pageConstants::PAGINATION_LIMIT$searchKey"WEB");
  779.         // $totalQuiz = $quizRepository->findQuiz($this->getUser(), null, null, $searchKey);
  780.         // $totalQuiz = $quizRepository->getTotalQuiz($this->getUser());
  781.         $pagination $paginator->paginate(
  782.             $quizs,
  783.             $page,
  784.             10
  785.         );
  786.         return $this->renderForm('front/pages/dashboard/quiz/quiz.html.twig', [
  787.             'quizs' => $pagination,
  788.             'quiz' => $quiz,
  789.             // 'totalQuiz' => $totalQuiz,
  790.             'limit' => Constants::PAGINATION_LIMIT,
  791.             'page' => $page,
  792.             'form' => $form
  793.         ]);
  794.     }
  795.     /**
  796.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR') or is_granted('ROLE_COACH') or is_granted('ROLE_TUTOR') or is_granted('ROLE_ADVISE')")
  797.      * 
  798.      * @Route("/{profil}/quiz/creer-un-quiz", name="app_front_create_quiz_page")
  799.      */
  800.     public function createQuiz(Request $requestQuizRepository $quizRepositoryModuleItemRepository $moduleItemRepositoryString $profil): Response
  801.     {
  802.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR') && !$this->isGranted('ROLE_COACH')) throw $this->createNotFoundException("La page demandée n'existe pas");
  803.         $quiz = new Quiz();
  804.         $form $this->createForm(QuizType::class, $quiz);
  805.         $form->handleRequest($request);
  806.         if ($form->isSubmitted() && $form->isValid()) {
  807.             // $hour = (int)$quiz->getTime()->format('H');
  808.             // $minute = (int)$quiz->getTime()->format('i');
  809.             // $second = (int)$quiz->getTime()->format('s');
  810.             // $curentDate = clone (new DateTime());
  811.             // $endAt = $curentDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
  812.             // $quiz->setAutomaticEndAt($endAt);
  813.             try {
  814.                 if ($form->has('saveAndSentToReview') && $form->get('saveAndSentToReview')->isClicked()) {
  815.                     $this->quizWorkflow->apply($quiz'to_review');
  816.                     $this->addFlash('quiz_added_and_sent_to_review''Quiz créé et envoyé à validation');
  817.                 } elseif ($form->has('saveAndPublished') && $form->get('saveAndPublished')->isClicked()) {
  818.                     $this->quizWorkflow->apply($quiz'publish');
  819.                     $quiz->setIsPublished(true);
  820.                     $this->addFlash('quiz_added_and_published''Quiz créé et publié');
  821.                 } else {
  822.                     $message 'Quiz crée';
  823.                     if ($quiz->isIsPublished()) $message .= ' et publié';
  824.                     $this->addFlash('quiz_added'$message);
  825.                 }
  826.                 $quizRepository->add($quiztrue);
  827.                 $modules $quiz->getModules();
  828.                 foreach ($modules as $module) {
  829.                     $moduleItem = new ModuleItem();
  830.                     $moduleItem->setModule($module);
  831.                     $moduleItem->setQuiz($quiz);
  832.                     $moduleItem->setType('quiz');
  833.                     $moduleItemRepository->add($moduleItemtrue);
  834.                 }
  835.             } catch (LogicException $exception) {
  836.                 $this->addFlash('quiz_no_sent_to_review'"Erreur survenue lors de l'envoie du quiz à la validation. Veuillez contacter l'administrateur");
  837.             }
  838.             return $this->redirectToRoute('app_front_quiz_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  839.         }
  840.         return $this->renderForm('front/pages/dashboard/quiz/create_quiz.html.twig', [
  841.             'quiz' => $quiz,
  842.             'form' => $form,
  843.             'profil' => $profil,
  844.         ]);
  845.     }
  846.     /**
  847.      * @Route("/{profil}/cours", name="app_front_course_page")
  848.      */
  849.     public function coursePage(Request $requestCourseRepository $courseRepositoryPaginatorInterface $paginator, ?String $profil null): Response
  850.     {
  851.         // $userRole = $this->getUserActivedRole($profil);
  852.         // if ($userRole === null) throw $this->createNotFoundException("La page demandée n'existe pas");
  853.         $session $request->getSession();
  854.         if ($request->query->get('page') === null$session->remove('course_search_key');
  855.         $course = new Course();
  856.         $page = (int)$request->query->get('page'1);
  857.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  858.         // Search form
  859.         $searchKey $session->has('course_search_key') ? $session->get('course_search_key') : null;
  860.         $form $this->createFormBuilder()
  861.         ->add('searchKey'TextType::class, [
  862.             'label' => 'Rechercher: ',
  863.             'label_attr' => ['class' => 'text-grey'],
  864.             'attr' => [
  865.                 'style' => 'border: 1px solid transparent !important'
  866.             ],
  867.             'required' => false,
  868.             'data' => $session->has('course_search_key') ? $session->get('course_search_key') : ''
  869.         ])
  870.         ->getForm();
  871.         
  872.         $form->handleRequest($request);
  873.         if ($form->isSubmitted() && $form->isValid()) {
  874.             $searchKey $form->get('searchKey')->getData();
  875.             $session->remove('course_search_key');
  876.             if ($searchKey !== null$session->set('course_search_key'$searchKey);
  877.         }
  878.         $courses $courseRepository->findCourses($this->getUser(), $pageConstants::PAGINATION_LIMIT$searchKey"WEB");
  879.         // $totalCourse = $courseRepository->findCourses($this->getUser(), null, null, $searchKey);
  880.         // $totalCourse = $courseRepository->getTotalCourse($this->getUser());
  881.         $pagination $paginator->paginate(
  882.             $courses,
  883.             $page,
  884.             Constants::PAGINATION_LIMIT
  885.         );
  886.         return $this->renderForm('front/pages/dashboard/courses/courses.html.twig', [
  887.             'course' => $course,
  888.             'courses' => $pagination,
  889.             // 'totalCourse' => $totalCourse,
  890.             'limit' => Constants::PAGINATION_LIMIT,
  891.             'page' => $page,
  892.             'form' => $form
  893.         ]);
  894.     }
  895.     /**
  896.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR') or is_granted('ROLE_COACH')")
  897.      * 
  898.      * @Route("/{profil}/cours/creer-un-cours", name="app_front_create_course_page")
  899.      */
  900.     public function createCourse(Request $requestCourseRepository $courseRepositoryModuleItemRepository $moduleItemRepositoryString $profil): Response
  901.     {
  902.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR') && !$this->isGranted('ROLE_COACH')) throw $this->createNotFoundException("La page demandée n'existe pas");
  903.         $course = new Course();
  904.         $form $this->createForm(CourseType::class, $course);
  905.         $form->handleRequest($request);
  906.         if ($form->isSubmitted() && $form->isValid()) {
  907.             try {
  908.                 if ($form->has('saveAndSentToReview') && $form->get('saveAndSentToReview')->isClicked()) {
  909.                     $this->courseWorkflow->apply($course'to_review');
  910.                     $this->addFlash('course_added_and_sent_to_review''Cours créé et envoyé à validation');
  911.                 } elseif ($form->has('saveAndPublished') && $form->get('saveAndPublished')->isClicked()) {
  912.                     $this->courseWorkflow->apply($course'publish');
  913.                     $course->setIsPublished(true);
  914.                     $this->addFlash('course_added_and_published''Cours créé et publié');
  915.                 } else {
  916.                     $message 'Cours crée';
  917.                     if ($course->isIsPublished()) $message .= ' et publié';
  918.                     $this->addFlash('course_added'$message);
  919.                 }
  920.                 $courseRepository->add($coursetrue);
  921.                 $modules $course->getModules();
  922.                 foreach ($modules as $module) {
  923.                     $moduleItem = new ModuleItem();
  924.                     $moduleItem->setModule($module);
  925.                     $moduleItem->setCourse($course);
  926.                     $moduleItem->setType('course');
  927.                     $moduleItemRepository->add($moduleItemtrue);
  928.                 }
  929.             } catch (LogicException $exception) {
  930.                 $this->addFlash('course_no_sent_to_review'"Erreur survenue lors de l'envoie du cours à la validation. Veuillez contacter l'administrateur");
  931.             }
  932.             return $this->redirectToRoute('app_front_course_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  933.         }
  934.         return $this->renderForm('front/pages/dashboard/courses/create_course.html.twig', [
  935.             'course' => $course,
  936.             'form' => $form,
  937.             'profil' => $profil,
  938.         ]);
  939.     }
  940.     /**
  941.      * @Route("/{profil}/lives", name="app_dashboard_live_page")
  942.      */
  943.     public function livePage(Request $requestLiveRepository $liveRepositoryPaginatorInterface $paginator, ?String $profil null): Response
  944.     {
  945.         $session $request->getSession();
  946.         if ($request->query->get('page') === null$session->remove('live_search_key');
  947.         $userRole $this->getUserActivedRole($profil);
  948.         if ($userRole === null) throw $this->createNotFoundException("La page demandée n'existe pas");
  949.         $live = new Live();
  950.         $page = (int)$request->query->get('page'1);
  951.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  952.         // Search form
  953.         $searchKey $session->has('live_search_key') ? $session->get('live_search_key') : null;
  954.         $form $this->createFormBuilder()
  955.         ->add('searchKey'TextType::class, [
  956.             'label' => 'Rechercher: ',
  957.             'label_attr' => ['class' => 'text-grey'],
  958.             'attr' => [
  959.                 'style' => 'border: 1px solid transparent !important'
  960.             ],
  961.             'required' => false,
  962.             'data' => $session->has('live_search_key') ? $session->get('live_search_key') : ''
  963.         ])
  964.         ->getForm();
  965.         
  966.         $form->handleRequest($request);
  967.         if ($form->isSubmitted() && $form->isValid()) {
  968.             $searchKey $form->get('searchKey')->getData();
  969.             $session->remove('live_search_key');
  970.             if ($searchKey !== null$session->set('live_search_key'$searchKey);
  971.         }
  972.         $lives $liveRepository->findLives($this->getUser(), $pageConstants::PAGINATION_LIMIT$searchKey"WEB");
  973.         // $totalLive = $liveRepository->findLives($this->getUser(), null, null, $searchKey);
  974.         // $totalLive = $liveRepository->getTotalLive($this->getUser(), $userRole);
  975.         foreach($lives as $live) {
  976.             $records $live->getLiveRecords();
  977.             foreach($records as $record) {
  978.                 if(!$record->isIsAlreadyDownloaded()) {
  979.                     $live->removeLiveRecord($record);
  980.                 }
  981.             }
  982.         }
  983.         $pagination $paginator->paginate(
  984.             $lives,
  985.             $page,
  986.             Constants::PAGINATION_LIMIT
  987.         );
  988.         return $this->renderForm('front/pages/dashboard/lives/lives.html.twig', [
  989.             'live' => $live,
  990.             'lives' => $pagination,
  991.             // 'totalLive' => $totalLive,
  992.             'limit' => Constants::PAGINATION_LIMIT,
  993.             'page' => $page,
  994.             'form' => $form
  995.         ]);
  996.     }
  997.     /**
  998.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR') or is_granted('ROLE_COACH')")
  999.      * 
  1000.      * @Route("/{profil}/lives/creer-un-live", name="app_front_create_live_page")
  1001.      */
  1002.     public function createLive(Request $requestLiveRepository $liveRepositoryModuleItemRepository $moduleItemRepositoryString $profil): Response
  1003.     {
  1004.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR') && !$this->isGranted('ROLE_COACH')) throw $this->createNotFoundException("La page demandée n'existe pas");
  1005.         
  1006.         $live = new Live();
  1007.         $form $this->createForm(LiveType::class, $live);
  1008.         $form->handleRequest($request);
  1009.         if ($form->isSubmitted() && $form->isValid()) {
  1010.             try {
  1011.                 if ($form->has('saveAndSentToReview') && $form->get('saveAndSentToReview')->isClicked()) {
  1012.                     $this->liveWorkflow->apply($live'to_review');
  1013.                     $this->addFlash('live_added_and_sent_to_review''Live créé et envoyé à validation');
  1014.                 }  elseif ($form->has('saveAndPublished') && $form->get('saveAndPublished')->isClicked()) {
  1015.                     $this->liveWorkflow->apply($live'publish');
  1016.                     $live->setIsPublished(true);
  1017.                     $this->addFlash('live_added_and_published''Live créé et publié');
  1018.                 } else {
  1019.                     $message 'Live crée';
  1020.                     if ($live->isIsPublished()) $message .= ' et publié';
  1021.                     $this->addFlash('live_added'$message);
  1022.                 }
  1023.     
  1024.                 if ($live->getTime() !== null) {
  1025.                     $hour = (int)$live->getTime()->format('H');
  1026.                     $minute = (int)$live->getTime()->format('i');
  1027.                     $second = (int)$live->getTime()->format('s');
  1028.         
  1029.                     $startDate = clone $live->getStartAt();
  1030.         
  1031.                     $endAt $startDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
  1032.                     $live->setEndAt($endAt);
  1033.                 }
  1034.     
  1035.                 $liveRepository->add($livetrue);
  1036.     
  1037.                 $modules $live->getModules();
  1038.                 foreach ($modules as $module) {
  1039.                     $moduleItem = new ModuleItem();
  1040.                     $moduleItem->setModule($module);
  1041.                     $moduleItem->setLive($live);
  1042.                     $moduleItem->setType('live');
  1043.     
  1044.                     $moduleItemRepository->add($moduleItemtrue);
  1045.                 }
  1046.                 // /** @var DateTime $startAt */
  1047.                 // $startAt = $live->getStartAt();
  1048.                 // if ($startAt !== null && $live->isIsPublished()) {
  1049.                 //     $interval = new DateInterval('PT' . Constants::TIME_BEFORE_LIVE_SESSION_STARTING . 'M');
  1050.                 //     $notificationDateBeforeLiveStarting = clone $startAt;
  1051.                 //     $notificationDateBeforeLiveStarting->sub($interval);
  1052.                 //     $minutes = $notificationDateBeforeLiveStarting->format('i');
  1053.                 //     $hour = $notificationDateBeforeLiveStarting->format('H');
  1054.                 //     $atExpression = sprintf("%s:%s", $hour, $minutes);
  1055.                 //     // /** @var User $user The user object */
  1056.                 //     // $schedule = new \Zenstruck\ScheduleBundle\Schedule();
  1057.                 //     // $schedule->addCommand('app:live-session-starting:notification '.$live->getId())
  1058.                 //     //     ->description('Send notification to live ('.$live->getTitle().') participants')
  1059.                 //     //     ->at($atExpression)
  1060.                 //     // ;
  1061.                 //     // /** @var \Zenstruck\ScheduleBundle\Schedule $this->schedule */
  1062.                 //     // $this->schedule->addCommand('app:test-mail:sending')
  1063.                 //     //     ->description('Send mail test 2.')
  1064.                 //     //     ->everyMinute()
  1065.                 //     // ;
  1066.                 // }
  1067.             } catch (LogicException $exception) {
  1068.                 $this->addFlash('live_no_sent_to_review'"Erreur survenue lors de l'envoie du live à la validation. Veuillez contacter l'administrateur");
  1069.             }
  1070.             
  1071.             return $this->redirectToRoute('app_dashboard_live_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  1072.             // return $this->redirectToRoute('app_front_lives_page', [], Response::HTTP_SEE_OTHER);
  1073.         }
  1074.         return $this->renderForm('front/pages/dashboard/lives/create_live.html.twig', [
  1075.             'live' => $live,
  1076.             'form' => $form,
  1077.             'profil' => $profil
  1078.         ]);
  1079.     }
  1080.     /**
  1081.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR')")
  1082.      * 
  1083.      * @Route("/{profil}/parametre/citations", name="app_front_quote_page")
  1084.      */
  1085.     public function quotePage(Request $requestQuoteRepository $quoteRepositoryString $profil): Response
  1086.     {
  1087.         $quote = new Quote();
  1088.         $page = (int)$request->query->get('page'1);
  1089.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1090.         $quotes $quoteRepository->findPaginateQuote($pageConstants::PAGINATION_LIMIT);
  1091.         $totalQuote $quoteRepository->getTotalQuote();
  1092.         return $this->renderForm('front/pages/dashboard/quotes/quotes.html.twig', [
  1093.             'quote' => $quote,
  1094.             'quotes' => $quotes,
  1095.             'totalQuote' => $totalQuote,
  1096.             'limit' => Constants::PAGINATION_LIMIT,
  1097.             'page' => $page,
  1098.         ]);
  1099.     }
  1100.     /**
  1101.      * @Security("is_granted('ROLE_ADMIN')")
  1102.      * 
  1103.      * @Route("/{profil}/parametre/creer-une-citation", name="app_front_create_quote_page")
  1104.      */
  1105.     public function createQuote(Request $requestQuoteRepository $quoteRepositoryString $profil): Response
  1106.     {
  1107.         if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  1108.         $quote = new Quote();
  1109.         $form $this->createForm(QuoteType::class, $quote);
  1110.         $form->handleRequest($request);
  1111.         if ($form->isSubmitted() && $form->isValid()) {
  1112.             $quoteRepository->add($quotetrue);
  1113.             return $this->redirectToRoute('app_front_quote_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  1114.         }
  1115.         return $this->renderForm('front/pages/dashboard/quotes/create_quote.html.twig', [
  1116.             'quote' => $quote,
  1117.             'form' => $form,
  1118.         ]);
  1119.     }
  1120.     /**
  1121.      * @Security("is_granted('ROLE_ADMIN')")
  1122.      * 
  1123.      * @Route("/{profil}/parametre/ajouter-un-mot-du-directeur", name="app_front_create_director_page")
  1124.      */
  1125.     public function createDirectorWord(Request $requestDirectorRepository $directorRepositoryString $profil): Response
  1126.     {
  1127.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  1128.         $director = new Director();
  1129.         $form $this->createForm(DirectorType::class, $director);
  1130.         $form->handleRequest($request);
  1131.         if ($form->isSubmitted() && $form->isValid()) {
  1132.             $directorRepository->add($directortrue);
  1133.             return $this->redirectToRoute('app_front_director_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  1134.         }
  1135.         return $this->renderForm('front/pages/dashboard/directors/create_director.html.twig', [
  1136.             'director' => $director,
  1137.             'form' => $form,
  1138.             'profil' => $profil
  1139.         ]);
  1140.     }
  1141.     /**
  1142.      * @Security("is_granted('ROLE_ADMIN')")
  1143.      * 
  1144.      * @Route("/{profil}/parametre/mots-du-directeur", name="app_front_director_page")
  1145.      */
  1146.     public function directorPage(Request $requestDirectorRepository $directorRepositoryString $profil): Response
  1147.     {
  1148.         $director = new Director();
  1149.         $page = (int)$request->query->get('page'1);
  1150.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1151.         $directors $directorRepository->findPaginateDirector($pageConstants::PAGINATION_LIMIT);
  1152.         $totalDirector $directorRepository->getTotalDirector();
  1153.         return $this->renderForm('front/pages/dashboard/directors/directors.html.twig', [
  1154.             'director' => $director,
  1155.             'directors' => $directors,
  1156.             'totalDirector' => $totalDirector,
  1157.             'limit' => Constants::PAGINATION_LIMIT,
  1158.             'page' => $page,
  1159.             'profil' => $profil
  1160.         ]);
  1161.     }
  1162.     /**
  1163.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_INTEGRATOR')")
  1164.      * 
  1165.      * @Route("/{profil}/parametre/module-vedettes", name="app_front_featured_module_page")
  1166.      */
  1167.     public function featured(Request $requestFeaturedModuleRepository $featuredModuleRepositoryString $profil): Response
  1168.     {
  1169.         $featuredModules $featuredModuleRepository->findBy([], ['id' => 'DESC'], 10);
  1170.         $featuredModule = (empty($featuredModules)) ? new FeaturedModule() : $featuredModules[0];
  1171.         $form $this->createForm(FeaturedModuleType::class, $featuredModule);
  1172.         $form->handleRequest($request);
  1173.         if ($form->isSubmitted() && $form->isValid()) {
  1174.             $featuredModuleRepository->add($featuredModuletrue);
  1175.             return $this->redirectToRoute('app_front_featured_module_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  1176.         }
  1177.         return $this->renderForm('front/pages/dashboard/modules/featured_module.html.twig', [
  1178.             'featured_module' => $featuredModule,
  1179.             'form' => $form,
  1180.         ]);
  1181.     }
  1182.     /**
  1183.      * @Route("/job/offices/{id}", name="job_offices")
  1184.      * @param Request $request
  1185.      * @param Job $job
  1186.      * @return JsonResponse
  1187.      */
  1188.     public function jobOffice(Request $requestJob $job)
  1189.     {
  1190.         $output = [];
  1191.         if ($job !== null) {
  1192.             $offices $job->getOffices();
  1193.             foreach ($offices as $key => $office) {
  1194.                 $output[] = [
  1195.                     'id' => $office->getId(),
  1196.                     'name' => $office->getName()
  1197.                 ];
  1198.             }
  1199.         }
  1200.         
  1201.         return $this->json($output);
  1202.     }
  1203.     /**
  1204.      * @Route("/job/offices", name="jobs_offices")
  1205.      * @param Request $request
  1206.      * @return JsonResponse
  1207.      */
  1208.     public function jobsOffice(Request $requestOfficeRepository $officeRepository)
  1209.     {
  1210.         $output = [];
  1211.         $ids $request->get('ids');
  1212.         if ($ids !== null && !empty($ids)) {
  1213.             $offices $officeRepository->findOffices($ids);
  1214.             foreach ($offices as $key => $office) {
  1215.                 $output[] = [
  1216.                     'id' => $office->getId(),
  1217.                     'text' => $office->getName()
  1218.                 ];
  1219.             }
  1220.         }
  1221.         
  1222.         return $this->json($output);
  1223.     }
  1224.     public function getUserActivedRole(?String $profil null): String
  1225.     {
  1226.         $userRoles $this->skipDefaultRole($this->getUser()->getRoles());
  1227.         if ($profil === null)  {
  1228.             $userRole = (!empty($userRoles)) ? $userRoles[0] : null;
  1229.         } else $userRole $this->getRoleByProfil($profil);
  1230.         return $userRole;
  1231.     }
  1232.     /**
  1233.      * @Route("/{profil}", name="app_front_dashboard_kpi_page")
  1234.      */
  1235.     public function kpiPage(Request $requestUserRepository $userRepositoryProgramRepository $programRepositoryModuleRepository $moduleRepositoryPaginatorInterface $paginatorString $profil): Response
  1236.     {
  1237.         $page = (int)$request->query->get('page'1);
  1238.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1239.         if ($profil === 'apprenant') return $this->redirectToRoute('app_front_learner_dashboard_page');
  1240.         $user $this->getUser();
  1241.         $programs $programRepository->findPrograms($user);
  1242.         $modules $moduleRepository->findModules($usertrue);
  1243.         $program null;
  1244.         $module null;
  1245.         $session $request->getSession();
  1246.         // Filter form
  1247.         $form $this->createFormBuilder()
  1248.         ->add('program'EntityType::class, [
  1249.             'class' => Program::class,
  1250.             'label' => false,
  1251.             'choice_label' => 'label',
  1252.             'attr' => ['class' => 'form-select select-2-tags'],
  1253.             'placeholder' => 'Choisir un programme',
  1254.             'required' => false,
  1255.             'choices' => $programs,
  1256.         ])
  1257.         ->add('module'EntityType::class, [
  1258.             'class' => Module::class,
  1259.             'label' => false,
  1260.             'choice_label' => 'name',
  1261.             'attr' => ['class' => 'form-select select-2-tags'],
  1262.             'placeholder' => 'Choisir un module',
  1263.             'required' => false,
  1264.             'choices' => $modules
  1265.         ])
  1266.         ->add('filter'SubmitType::class, [
  1267.             'label' => 'Filtrer',
  1268.             'attr' => ['class' => 'custom-dash-select shadow-sm bg-white']
  1269.         ])
  1270.         ->getForm();
  1271.         
  1272.         $form->handleRequest($request);
  1273.         if ($form->isSubmitted() && $form->isValid()) {
  1274.             $program $form->get('program')->getData();
  1275.             $module $form->get('module')->getData();
  1276.             // if ($programData !== null) $session->set('__program', $programData->getId());
  1277.             // if ($moduleData !== null) $session->set('__module', $moduleData->getId());
  1278.         }
  1279.         // dump($this->getCompletionRate($program, $module, null)); die;
  1280.         $session->set('__profile'$profil);
  1281.         $currentRole $this->helperService->getUserCurrentRole();
  1282.         
  1283.         // $learners = $userRepository->findLearners($page, Constants::PAGINATION_LIMIT, $this->getUser(), $current_role);
  1284.         // $learnerWithCertificateCount = $userRepository->getLearnerWithCertificateCount();
  1285.         // $learnerCount = $this->getLearnerCount();
  1286.         // $learnerCount = count($userRepository->findLearners(null, null, $this->getUser(), $currentRole));
  1287.         //$em = $this->getDoctrine()->getRepository('App\Entity\UserModuleParticipation');
  1288.         //dd($em->getUserModuleItemCount());
  1289.         $learners $userRepository->findLearnersQuery($this->getUser(), $currentRole);
  1290.         // $learnerCount = $userRepository->getLearnersCount($this->getUser(), $currentRole);
  1291.         $pagination $paginator->paginate(
  1292.             $learners,
  1293.             $page,
  1294.             Constants::PAGINATION_LIMIT
  1295.         );
  1296.         return $this->render('front/pages/dashboard/kpi/index.html.twig', [
  1297.             // 'learners' => $learners,
  1298.             // 'total_learner' => $learnerCount,
  1299.             'limit' => Constants::PAGINATION_LIMIT,
  1300.             'page' => $page,
  1301.             'program' => $program,
  1302.             'module' => $module,
  1303.             //'user' => ($profil === 'integrateur' || $profil === 'administrateur') ? null : $this->getUser(),
  1304.             'user' => $this->getUser(),
  1305.             'programs' => $programs,
  1306.             'modules' => $modules,
  1307.             'form' => $form->createView(),
  1308.             'current_role' => $currentRole,
  1309.             'learners' => $pagination,
  1310.             // 'success_rate' => ($learnerWithCertificateCount / $learnerCount) * 100,
  1311.         ]);
  1312.     }
  1313.     /**
  1314.      * @Security("is_granted('ROLE_ADMIN')")
  1315.      * 
  1316.      * @Route("/{profil}/parametre/creer-un-partenaire", name="app_front_create_partenaire_page")
  1317.      */
  1318.     public function createPartenaire(Request $requestPartenaireRepository $partenaireRepositoryString $profil): Response
  1319.     {
  1320.         // if (!$this->isGranted('ROLE_ADMIN') && !$this->isGranted('ROLE_INTEGRATOR')) throw $this->createNotFoundException("La page demandée n'existe pas");
  1321.         $partenaire = new Partenaire();
  1322.         $form $this->createForm(PartenaireType::class, $partenaire);
  1323.         $form->handleRequest($request);
  1324.         if ($form->isSubmitted() && $form->isValid()) {
  1325.             $partenaireRepository->add($partenairetrue);
  1326.             return $this->redirectToRoute('app_dashboard_partner_page', ['profil' => $profil], Response::HTTP_SEE_OTHER);
  1327.         }
  1328.         return $this->renderForm('front/pages/dashboard/partenaires/create_partenaire.html.twig', [
  1329.             'partenaire' => $partenaire,
  1330.             'form' => $form,
  1331.             'profil' => $profil
  1332.         ]);
  1333.     }
  1334.     /**
  1335.      * @Security("is_granted('ROLE_ADMIN')")
  1336.      * 
  1337.      * @Route("/{profil}/parametre/partenaires", name="app_dashboard_partner_page")
  1338.      */
  1339.     public function partenairePage(Request $requestPartenaireRepository $partenaireRepositoryString $profil): Response
  1340.     {
  1341.         $partenaire = new Partenaire();
  1342.         $page = (int)$request->query->get('page'1);
  1343.         if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
  1344.         $partenaires $partenaireRepository->findPaginatePartenaire($pageConstants::PAGINATION_LIMIT);
  1345.         $totalPartenaire $partenaireRepository->getTotalPartenaire();
  1346.         return $this->renderForm('front/pages/dashboard/partenaires/partenaires.html.twig', [
  1347.             'partenaire' => $partenaire,
  1348.             'partenaires' => $partenaires,
  1349.             'totalPartenaire' => $totalPartenaire,
  1350.             'limit' => Constants::PAGINATION_LIMIT,
  1351.             'page' => $page,
  1352.             'profil' => $profil
  1353.         ]);
  1354.     }
  1355.     /**
  1356.      * @Route("/notification/as-read", name="notification_as_read")
  1357.      * @param Request $request
  1358.      * @return JsonResponse
  1359.      */
  1360.     public function notificationStatus(NotificationRepository $notificationRepositoryNotificationReceiverRepository $notificationReceiverRepository)
  1361.     {
  1362.         $notifications $notificationRepository->findUnreadNotifications($this->getUser());
  1363.         foreach ($notifications as $notification) {
  1364.             $notification->setIsRead(true);
  1365.             $notificationRepository->add($notificationtrue);
  1366.             $notificationReceivers $notification->getNotificationReceivers();
  1367.             foreach ($notificationReceivers as $notificationReceiver) {
  1368.                 $notificationReceiver->setIsRead(true);
  1369.                 $notificationReceiverRepository->add($notificationReceivertrue);
  1370.             }
  1371.         }
  1372.         
  1373.         return $this->json(['OK']);
  1374.     }
  1375.     /**
  1376.      * @Route("/apprenant/notifications", name="app_get_user_notifications")
  1377.      */
  1378.     public function getNotifications(Request $requestNotificationRepository $notificationRepositorySerializerInterface $serializer): Response
  1379.     {   
  1380.         $notificationPage = (int)$request->query->get('notificationPage'1);
  1381.         $user $this->getUser();
  1382.         // $unreadNotifications = $notificationRepository->findUnreadNotifications($user, $notificationPage, Constants::PAGINATION_LIMIT);
  1383.         $unreadNotificationCount $notificationRepository->getUnreadNotificationCount($user);
  1384.         // $notificationCount = $notificationRepository->findNotificationCount($user);
  1385.         $notifications $notificationRepository->findNotifications($user$notificationPageConstants::PAGINATION_LIMIT);
  1386.         $context = new SerializationContext();
  1387.         $context->setSerializeNull(true);
  1388.         // $output = $serializer->serialize($notifications, 'json', $context);
  1389.         //return $this->json(json_decode($output, true));
  1390.         return $this->json(['unreadNotificationCount' => $unreadNotificationCount'html' => $this->render('front/layouts/partials/notifications-response.html.twig', ['notifications' => $notifications])->getContent()]);
  1391.         // return $this->renderForm('front/layouts/partials/notifications-response.html.twig', ['notifications' => $notification]);
  1392.     }
  1393.     /**
  1394.      * @Route("/apprenant/notifications/redirect/{id}", name="app_redirect_user_notifications")
  1395.      */
  1396.     public function redirectNotification(NotificationEntity $notificationSubjectRepository $subjectRepositoryModuleRepository $moduleRepositoryCommentRepository $commentRepository): Response
  1397.     {   
  1398.         if($notification->getObjectType() == 'program') {
  1399.             return $this->redirectToRoute('app_front_program_module', ['id' => $notification->getObjectId()]);
  1400.         } else if($notification->getObjectType() == 'subject') {
  1401.             $subject $subjectRepository->find($notification->getObjectId());
  1402.             if($subject != null) {
  1403.                 return $this->redirectToRoute('app_front_forum_page', ['module_slug' => $subject->getModule()->getSlug(), 'subject_slug' => $subject->getSlug()]);
  1404.             }
  1405.             return $this->redirectToRoute('app_front_forum_charter_page');
  1406.         } else if($notification->getObjectType() == 'module') {
  1407.             $module $moduleRepository->find($notification->getObjectId());
  1408.             return $this->redirectToRoute('app_front_library_module_details_page', ['slug' => $module->getSlug()]);
  1409.         } else if($notification->getObjectType() == 'comment' || $notification->getObjectType() == 'commentlike') {
  1410.             $comment $commentRepository->find($notification->getObjectId());
  1411.             if($comment != null) {
  1412.                 $subject $comment->getSubject();
  1413.                 $url $this->generateUrl('app_front_forum_page', ['module_slug' => $subject->getModule()->getSlug(), 'subject_slug' => $subject->getSlug()]);
  1414.                 if($notification->getComment()) {
  1415.                     $url .= '#comment-ref_'.$notification->getComment()->getId();
  1416.                 }
  1417.                 return $this->redirect($url);
  1418.             }
  1419.         } else if($notification->getObjectType() == 'live') {
  1420.             $routeName 'app_front_live_meet_page';
  1421.             $parameters = ['id' => $notification->getObjectId()];
  1422.             if ($notification->getModule() !== null) {
  1423.                 $module $notification->getModule();
  1424.                 $routeName 'app_front_live_module_meet_page';
  1425.                 $parameters['module_slug'] = $module->getSlug();
  1426.             }
  1427.             return $this->redirectToRoute($routeName$parameters);
  1428.         } else if($notification->getObjectType() == 'quiz') {
  1429.             if ($notification->getModule() !== null) {
  1430.                 $module $notification->getModule();
  1431.                 return $this->redirectToRoute('app_front_library_module_details_page', ['slug' => $module->getSlug()]);
  1432.             }
  1433.         } else if($notification->getObjectType() == 'quote') {
  1434.             return $this->redirectToRoute('app_front_homepage');
  1435.         }
  1436.         return $this->redirectToRoute('app_front_learner_dashboard_page');
  1437.     }
  1438.     /**
  1439.      * @Route("/v2", name="app_front_dashboard_v2_page")
  1440.      */
  1441.     public function new_dash(): Response
  1442.     {
  1443.         return $this->render('front/pages/dashboard/new_dash.html.twig', [
  1444.             'user' => $this->getUser()
  1445.         ]);
  1446.     }
  1447.     /**
  1448.      * @Route("/apprenant/historique-notifications", name="app_front_dashboard_notification_page")
  1449.      */
  1450.     public function notification(NotificationRepository $notificationRepository): Response
  1451.     {
  1452.         $unreadNotificationCount $notificationRepository->getUnreadNotificationCount($this->getUser());
  1453.         return $this->render('front/pages/dashboard/notification.html.twig', [
  1454.             'unreadNotificationCount' => $unreadNotificationCount
  1455.         ]);
  1456.     }
  1457.     /**
  1458.      * @Route("/{profil}/{id}/badges", name="app_front_dashboard_badge_block")
  1459.      */
  1460.     public function badge(ModuleRepository $moduleRepositoryModuleParticipationRepository $moduleParticipationRepositoryString $profil, ?User $currectUser): Response
  1461.     {
  1462.         $currectUser $currectUser !== null $currectUser $this->getUser();
  1463.         // $terminatedModules = $moduleRepository->findTerminatedModules($currectUser);
  1464.         $participations $moduleParticipationRepository->getUserQuizBadges($currectUser);
  1465.         // $quizBadgesCount = $moduleParticipationRepository->getCountWithBadge(null, $currectUser);
  1466.         return $this->render('front/pages/dashboard/components/badge-block.html.twig', [
  1467.             'participations' => $participations,
  1468.             'profil' => $profil,
  1469.             'user' => $currectUser
  1470.         ]);
  1471.     }
  1472.      /**
  1473.      * @Route("/{profil}/{id}/certificats", name="app_front_dashboard_certificat_block")
  1474.      */
  1475.     public function certificat(ModuleRepository $moduleRepositoryProgramParticipationRepository $programParticipationRepositoryModuleParticipationRepository $moduleParticipationRepositoryString $profil, ?User $currectUser): Response
  1476.     {
  1477.         /** @var User */
  1478.         $currectUser $currectUser !== null $currectUser $this->getUser();
  1479.         // $terminatedModules = $moduleRepository->findTerminatedModules($currectUser);
  1480.         // $programParticipationWithCertificate = $currectUser->getProgramParticipations()->filter(function($programParticipation) {
  1481.         //     return ($programParticipation->getCertificate() !== null);
  1482.         // });
  1483.         $programCertificates $programParticipationRepository->getUserProgramCertificates(null$currectUser);
  1484.         $quizCertificates $moduleParticipationRepository->getUserQuizCertificates($currectUsernull);
  1485.         return $this->render('front/pages/dashboard/components/certificat-block.html.twig', [
  1486.             'participations' => array_merge($quizCertificates$programCertificates),
  1487.             // 'program_ertificates' => $programCertificates,
  1488.             'profil' => $profil,
  1489.             'user' => $currectUser
  1490.         ]);
  1491.     }
  1492. }