src/Controller/Front/DashboardController.php line 208

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