<?php
namespace App\Controller\Front;
use App\Entity\Course;
use App\Entity\CourseView;
use App\Entity\Job;
use App\Entity\Live;
use App\Entity\LiveView;
use App\Entity\Module;
use App\Entity\ModuleNotice;
use App\Entity\ModuleParticipation;
use App\Entity\ModuleView;
use App\Entity\Program;
use App\Entity\ProgramParticipation;
use App\Entity\Quiz;
use App\Entity\QuizQuestion;
use App\Entity\QuizView;
use App\Entity\User;
use App\Entity\UserModuleParticipation;
use App\Entity\UserProgramParticipation;
use App\Entity\UserQuizQuestion;
use App\Entity\ModuleObjective;
use App\Form\DataTransformer\ModuleToEntityTransformer;
use App\Form\ModuleNoticeType;
use App\Helper\ControllerHelper;
use App\Repository\CourseRepository;
use App\Repository\CourseViewRepository;
use App\Repository\FeaturedModuleRepository;
use App\Repository\JobRepository;
use App\Repository\LiveRepository;
use App\Repository\LiveViewRepository;
use App\Repository\ModuleItemRepository;
use App\Repository\ModuleLikeRepository;
use App\Repository\ModuleNoticeRepository;
use App\Repository\ModuleParticipationRepository;
use App\Repository\ModuleRepository;
use App\Repository\ModuleViewRepository;
use App\Repository\ProgramParticipationRepository;
use App\Repository\ProgramRepository;
use App\Repository\QuizAnswerRepository;
use App\Repository\QuizQuestionRepository;
use App\Repository\QuizRepository;
use App\Repository\QuizViewRepository;
use App\Repository\UserModuleParticipationRepository;
use App\Repository\UserProgramParticipationRepository;
use App\Repository\UserQuizQuestionRepository;
use App\Repository\UserRepository;
use App\Repository\ModuleObjectiveRepository;
use App\Utils\Constants;
use App\Service\HelperService;
use App\Service\PushNotification;
use DateInterval;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Container\ContainerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\Choice;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
use Symfony\Component\String\Slugger\SluggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Adapter\RedisTagAwareAdapter;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use App\Message\Certificate;
use App\Message\Notification;
use Doctrine\ORM\Mapping\Entity;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* @Route("/bibliotheque")
*/
class LibraryController extends AbstractController
{
use ControllerHelper;
private $slugger;
private $doctrine;
private $mailer;
private $helper;
private $params;
private $pushNotification;
private $helperService;
private $bus;
private $logger;
public function __construct(SluggerInterface $slugger, ManagerRegistry $doctrine, MailerInterface $mailer, HelperService $helper, ParameterBagInterface $params, PushNotification $pushNotification, HelperService $helperService, MessageBusInterface $bus, LoggerInterface $logger)
{
$this->slugger = $slugger;
$this->doctrine = $doctrine;
$this->mailer = $mailer;
$this->helper = $helper;
$this->params = $params;
$this->pushNotification = $pushNotification;
$this->helperService = $helperService;
$this->bus = $bus;
$this->logger = $logger;
}
/**
* @Route("", name="app_front_library_page")
*/
public function index(ProgramRepository $programRepository, JobRepository $jobRepository, ModuleRepository $moduleRepository, ModuleLikeRepository $moduleLikeRepository, ModuleParticipationRepository $moduleParticipationRepository, ModuleViewRepository $moduleViewRepository, ModuleNoticeRepository $moduleNoticeRepository, FeaturedModuleRepository $featuredModuleRepository, LiveRepository $liveRepository, QuizRepository $quizRepository, ProgramParticipationRepository $programParticipationRepository, Request $request, ModuleToEntityTransformer $moduleToEntityTransformer): Response
{
// $jobs = $jobRepository->findAll();
// foreach ($jobs as $job) {
// $slug = $this->slugger->slug($job->getLabel());
// $job->setSlug($slug);
// $jobRepository->add($job, true);
// }
// die("ok");
// $module = $moduleRepository->findOneById(69);
// $quiz = $quizRepository->findOneById(58);
// $program = $this->getActiveProgram($module, false, $this->getUser());
// $type = 'certificate';
// $userScore = $this->getModuleQuizScore($module, $this->getUser(), $program, true);
// $quizCertificates = $quiz->getCertificates()->filter(function($quizCertificate) use ($userScore, $type) {
// return ($quizCertificate->getMinScore() <= $userScore && $userScore <= $quizCertificate->getMaxScore() && $quizCertificate->getType() === $type);
// });
// $moduleCertificate = $this->getModuleQuizCertificate($module, $this->getUser(), $type, $program, $quiz);
// $certificate = $this->getModuleQuizCertificateFilePath($this->getUser(), 'certificate', $program, $module, $quiz);
// $badge = $this->getModuleQuizCertificateFilePath($this->getUser(), 'badge', $program, $module, $quiz);
// $programParticipation = $programParticipationRepository->findOneBy(['program' => $program, 'createdBy' => $this->getUser()]);
// $certificate = $this->getProgramCertificateFilePath($this->getUser(), $program, $programParticipation);
// var_dump($certificate);
// die("ok");
// $this->denyAccessUnlessGranted('ROLE_EMPLOYEE', null, "Cette page n'existe pas !");
$session = $request->getSession();
$session->clear();
if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
$user = $this->getUser();
$programs = $programRepository->findHomeActivePrograms($user);
// $programs = $programRepository->findActivePrograms($user);
// $jobs = $jobRepository->findActiveJobs();
// $formBuilder = $this->createFormBuilder(null, [
// 'validation_groups' => false
// ]);
// $formBuilder->add('searchKey', HiddenType::class, [
// // 'class' => Module::class,
// 'label' => false,
// // 'choices' => [],
// // 'choice_label' => 'name',
// ]);
// // $formBuilder->get('searchKey')->addModelTransformer($moduleToEntityTransformer);
// $form = $formBuilder->getForm();
// Search form
// $form = $this->createFormBuilder()
// ->add('program', EntityType::class, [
// 'class' => Program::class,
// 'label' => false,
// 'choice_label' => 'label',
// 'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50 opificio fw-bold text-dark'],
// 'placeholder' => 'Choisir un programme',
// 'required' => false,
// 'choices' => $programs,
// 'data' => ($session->has('_program')) ? $programRepository->findOneById($session->get('_program')) : null
// ])
// ->add('job', EntityType::class, [
// 'class' => Job::class,
// 'label' => false,
// 'choice_label' => 'label',
// 'attr' => ['class' => 'form-select fw-bold border-0 shadow-sm height-50 opificio fw-bold text-dark'],
// 'placeholder' => 'Choisir un métier',
// 'required' => false,
// 'choices' => $jobs,
// 'data' => ($session->has('_job')) ? $jobRepository->findOneById($session->get('_job')) : null
// ])
// ->add('startAt', DateType::class, [
// 'label' => false,
// 'widget' => 'single_text',
// 'format' => 'dd/MM/yyyy',
// 'html5' => false,
// 'required' => false,
// 'attr' => ['class' => 'form-control js-datepicker fw-bold text-dark border-0 shadow-sm height-50 opificio fw-bold text-dark', 'placeholder' => 'Date début'],
// 'data' => ($session->has('_startAt')) ? $session->get('_startAt') : null
// ])
// ->add('endAt', DateType::class, [
// 'label' => false,
// 'widget' => 'single_text',
// 'format' => 'dd/MM/yyyy',
// 'html5' => false,
// 'required' => false,
// 'attr' => ['class' => 'form-control js-datepicker fw-bold text-dark border-0 shadow-sm height-50 opificio fw-bold text-dark', 'placeholder' => 'Date fin'],
// 'data' => ($session->has('_endAt')) ? $session->get('_endAt') : null
// ])
// ->add('searchKey', EntityType::class, [
// 'class' => Module::class,
// 'label' => "Que voulez vous apprendre aujourd'hui ?",
// // 'choices' => [],
// 'choice_label' => 'name',
// "attr" => [
// // 'placeholder' => "Rechercher un module",
// "class" => "border-0 ms-3 fw-bold select2 form-control"
// ]
// ])
// ->get('searchKey')
// ->addModelTransformer($moduleToEntityTransformer)
// ->addModelTransformer($moduleToEntityTransformer)
// ->add('search', SubmitType::class, [
// 'label' => 'Rechercher',
// 'attr' => ['class' => 'btn btn-danger text-uppercase mt-3 h1 fw-bold px-3 research-library-btn height-50 opificio fw-bold']
// ])
// ->getForm();
// Liste default modules
// $moreRecentProgram = $programRepository->findMoreRecentProgram();
// $modules = $moduleRepository->findByProgram($moreRecentProgram);
// $modules = $moduleRepository->findBy(['isPublished' => true]);
// Most viewed module
// $mostViewedModule = $moduleRepository->findBy([], ['id' => 'DESC'], 1, 0)[0];
// $mostViewedModule = $moduleViewRepository->findMostViewedModule();
// $mostViewedModule = $moduleParticipationRepository->findMostViewedModule();
// $mostViewedModule = (count($mostViewedModule) > 0) ? $mostViewedModule[0] : null;
// Most liked module
// $mostLikedModule = null;
// $mostLikedModule = $moduleRepository->findBy([], ['id' => 'DESC'], 1, 1)[0];
// $mostLikedModule = $moduleLikeRepository->findMostLikedModule();
// $mostLikedModule = $moduleNoticeRepository->findMostLikedModule();
// $mostLikedModule = (count($mostLikedModule) > 0) ? $mostLikedModule[0] : null;
// Recent published module
// $mostRecentModule = $moduleRepository->findMostRecentModule();
$featuredModules = $featuredModuleRepository->findBy([], ['id' => 'DESC'], 1, 0);
if (!empty($featuredModules)) {
$mostViewedModule = ($featuredModules[0]->getStar() !== null) ? $moduleRepository->findMostViewedModule($featuredModules[0]->getStar()) : $moduleParticipationRepository->findMostViewedModule();
$mostLikedModule = ($featuredModules[0]->getFavorite() !== null) ? $moduleRepository->findMostLikedModule($featuredModules[0]->getFavorite()) : $moduleNoticeRepository->findMostLikedModule();
$mostRecentModule = ($featuredModules[0]->getNew() !== null) ? $moduleRepository->findMostRecentModule($featuredModules[0]->getNew()) : $moduleRepository->findMostRecentModule();
} else {
$mostViewedModule = $moduleParticipationRepository->findMostViewedModule();
$mostLikedModule = $moduleNoticeRepository->findMostLikedModule();
$mostRecentModule = $moduleRepository->findMostRecentModule();
}
if ($session->has('_searchKey')) {
// $program = $programRepository->findOneById($session->get('_program'));
// $job = $jobRepository->findOneById($session->get('_job'));
// $startAt = $session->get('_startAt');
// $endAt = $session->get('_endAt');
$searchKey = $session->get('_searchKey');
$modules = $moduleRepository->searchModule(null, null, $user, null, null, false, null, null, $searchKey);
$totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
} else {
$modules = $moduleRepository->searchModule(null, null, $user);
$totalModule = $moduleRepository->searchModule(null,null, $user, null, null, true);
}
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// // $programData = $form->get('program')->getData();
// // $job = $form->get('job')->getData();
// // $startAt = $form->get('startAt')->getData();
// // $endAt = $form->get('endAt')->getData();
// $searchKey = $form->get('searchKey')->getData();
// dd($searchKey);
// // $session->set('_program', ($programData !== null) ? $programData->getId() : null);
// // $session->set('_job', ($job !== null) ? $job->getId() : null);
// // $session->set('_startAt', $startAt);
// // $session->set('_endAt', $endAt);
// // $session->set('_route', $request->get('_route'));
// // if ($programData !== null) {
// // $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, null, null, $searchKey);
// // $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
// // }
// $modules = $moduleRepository->findById($searchKey);
// return (!empty($modules)) ? $this->redirectToRoute("app_front_library_module_details_page", ['slug' => $modules[0]->getSlug()]) : $this->redirectToRoute("app_front_library_page");
// }
$notices = $moduleNoticeRepository->findBy(['module' => null, 'isPublished' => true]);
$cofilives = $liveRepository->getCofilives();
$topCofiLive = $liveRepository->getTopActiveLive("cofi live");
$topCofiLiveStartAt = ($topCofiLive != null) ? $topCofiLive->getStartAt()->format('F, d Y H:i:s') : null;
return $this->render('front/pages/library/index.html.twig', [
'programs' => $programs,
'modules' => $modules,
'mostViewedModule' => $mostViewedModule,
'mostLikedModule' => $mostLikedModule,
'mostRecentModule' => $mostRecentModule,
'cofilives' => $cofilives,
'totalModule' => count($totalModule),
'limit' => Constants::PAGINATION_LIMIT,
'notices' => $notices,
// 'form' => $form->createView(),
'topCofiLive' => $topCofiLive,
'topCofiLiveModule' => ($topCofiLive != null) ? $this->getActiveModule($topCofiLive, $user) : null,
'topCofiLiveStartAt' => $topCofiLiveStartAt
]);
}
/**
* @Route("/module/{slug}", name="app_front_library_module_details_page")
*/
public function libraryModuleDetails(Module $module, ModuleItemRepository $moduleItemRepository, QuizRepository $quizRepository, CourseRepository $courseRepository, LiveRepository $liveRepository, ModuleParticipationRepository $moduleParticipationRepository, ModuleNoticeRepository $moduleNoticeRepository): Response{
$user = $this->getUser();
if (!$this->hasAccessToThisModule($module, $user)) throw $this->createNotFoundException("La page demandée n'existe pas");
$currentItem = null;
$type = null;
$items = $moduleItemRepository->findItems($module);
// $moduleParticipations = $moduleParticipationRepository->findBy(['createdBy' => $user, 'module' => $module], ['id' => 'ASC']);
$moduleParticipations = $moduleParticipationRepository->findParticipations($module, $user);
$moduleLastParticipation = (count($moduleParticipations) > 0) ? $moduleParticipations[0] : null;
if ($moduleLastParticipation !== null) {
$currentItem = ($moduleLastParticipation->getCourse() !== null) ? $moduleLastParticipation->getCourse() : (($moduleLastParticipation->getQuiz() !== null) ? $moduleLastParticipation->getQuiz() : $moduleLastParticipation->getLive());
} else {
if (count($items) > 0) {
$item = $items[0];
// $currentItem = ($item['type'] === 'course') ? $courseRepository->findOneById($item['course_id']) : $quizRepository->findOneById($item['quiz_id']);
switch ($item['type']) {
case 'course':
$currentItem = $courseRepository->findOneById($item['course_id']);
break;
case 'quiz':
$currentItem = $quizRepository->findOneById($item['quiz_id']);
break;
default:
$currentItem = $liveRepository->findOneById($item['live_id']);
break;
}
}
}
if ($currentItem instanceof Course) $type = "course";
elseif ($currentItem instanceof Quiz) $type = "quiz";
else $type = "live";
$moduleNoteTotal = 0;
//$moduleNotices = $moduleNoticeRepository->findBy(['module' => $module, 'isPublished' => true]);
$moduleNotices = $moduleNoticeRepository->findBy(['module' => $module], ['id' => 'DESC'], 10, 0);
$moduleNoticesExceptMyNote = [];
foreach ($moduleNotices as $moduleNotice) {
$moduleNoteTotal = $moduleNoteTotal + $moduleNotice->getNote();
if ($moduleNotice->getCreatedBy() !== $user) $moduleNoticesExceptMyNote [] = $moduleNotice;
}
$moduleNote = (count($moduleNotices) > 0) ? ceil($moduleNoteTotal / count($moduleNotices)) : 0;
// if ($currentItem != null) {
// $keySort = ($currentItem instanceof Course) ? 'course' : 'quiz';
// $type = $keySort;
// $keys = array_keys(array_column($items, $keySort.'_id'), $currentItem->getId());
// // $newArray = array_map(function($k) use ($items){return $items[$k];}, $keys);
// dump($keys); die;
// }
//$myPrograms = $programRepository->findMyPrograms($user, $module);
$quizParticipation = null;
if ($type === 'quiz') {
$quizParticipation = $moduleParticipationRepository->findOneBy(['createdBy' => $user, 'module' => $module, 'quiz' => $currentItem]);
}
$program = $this->getActiveProgram($module, false, $user);
//dd(count($module->getLives()));
$totalTime = 0;
foreach($module->getLives() as $live) {
if($live->isIsPublished()) {
$duration = $live->getTime()->format('H:i:s');
sscanf($duration, "%d:%d:%d", $hours, $minutes, $seconds);
$totalTime += isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;
}
}
$noteCollection = $module->getModuleNotices();
// $grouped = array_reduce($noteCollection->toArray(), function($result, ModuleNotice $moduleNotice) {
// $result[$moduleNotice->getNote()][] = $moduleNotice->getNote();
// return $result;
// }, []);
$noteAverages = array_reduce($noteCollection->toArray(), function($result, ModuleNotice $moduleNotice) {
$note = $moduleNotice->getNote();
if (!isset($result[$note])) {
$result[$note] = ['totalNote' => 0, 'count' => 0];
}
$result[$note]['totalNote'] += $moduleNotice->getNote();
$result[$note]['count'] += 1;
return $result;
}, []);
$totalCount = $noteCollection->count();
$noteAverages = array_map(function($group) use ($totalCount) {
return ceil($group['count'] / $totalCount * 100);
}, $noteAverages);
return $this->render('front/pages/library/module-details.html.twig', [
'module' => $module,
'items' => $items,
'currentItem' => $currentItem,
'type' => $type,
'isModuleTerminated' => (count($moduleParticipations) === count($items)),
'isQuizzAlreadyStarted' => ($quizParticipation !== null),
'moduleNote' => $moduleNote,
'moduleNotices' => $moduleNoticesExceptMyNote,
//'myPrograms' => $myPrograms,
'program' => $program,
'duration' => $this->secondsToTime($totalTime),
'noteAverages' => $noteAverages
// 'myNotice' => $moduleNoticeRepository->findOneBy(['module' => $module, 'createdBy' => $user]),
]);
}
/**
* @Route("/courses/{module_slug}/{course_slug}", name="app_front_module_course_participation_page")
* @Route("/courses/{module_slug}/{course_slug}/terminate", name="app_front_module_course_terminate")
* @Route("/courses/{module_slug}/quiz/{quiz_slug}", name="app_front_module_quiz_participation_page")
* @Route("/courses/{module_slug}/quiz/{quiz_slug}/terminate", name="app_front_module_quiz_terminate")
* @Route("/courses/{module_slug}/live/{live_slug}", name="app_front_module_live_participation_page")
* @Route("/courses/{module_slug}/live/{live_slug}/terminate", name="app_front_module_live_terminate")
* @ParamConverter("module", options={"mapping": {"module_slug": "slug"}})
* @ParamConverter("course", isOptional="true", options={"mapping": {"course_slug": "slug"}})
* @ParamConverter("quiz", isOptional="true", options={"mapping": {"quiz_slug": "slug"}})
* @ParamConverter("live", isOptional="true", options={"mapping": {"live_slug": "slug"}})
*/
public function takePartToModule(Request $request, Module $module, ProgramRepository $programRepository, ModuleItemRepository $moduleItemRepository, ModuleParticipationRepository $moduleParticipationRepository, ProgramParticipationRepository $programParticipationRepository, CourseRepository $courseRepository, QuizRepository $quizRepository, LiveRepository $liveRepository, QuizQuestionRepository $quizQuestionRepository, QuizAnswerRepository $quizAnswerRepository, UserQuizQuestionRepository $userQuizQuestionRepository, UserModuleParticipationRepository $userModuleParticipationRepository, UserProgramParticipationRepository $userProgramParticipationRepository, ModuleViewRepository $moduleViewRepository, CourseViewRepository $courseViewRepository, LiveViewRepository $liveViewRepository, QuizViewRepository $quizViewRepository, CacheInterface $cache, Course $course = null, Quiz $quiz = null, Live $live = null): Response{
/** @var User $currentUser */
$currentUser = $this->getUser();
if (!$this->hasAccessToThisModule($module, $currentUser)) throw $this->createNotFoundException("La page demandée n'existe pas");
if ($course === null && $quiz === null && $live === null) throw $this->createAccessDeniedException("Accès non autorisé");
$program = $this->getActiveProgram($module, false, $currentUser);
$items = $moduleItemRepository->findItems($module);
foreach($items as $key=>$item) {
if($item['type'] == 'quiz') {
$hasCertificates = count($quizRepository->find($item['quiz_id'])->getCertificates()) > 0;
$items[$key]['hasCertificates'] = $hasCertificates;
$_moduleParticipations = $moduleParticipationRepository->findBy(array('createdBy' => $currentUser, 'program' => $program, 'quiz'=>$item['quiz_id']));
foreach($_moduleParticipations as $participation) {
if($participation->getQuizBadge() != null and !empty($participation->getQuizBadge())) {
$items[$key]['award_badge'] = $participation->getQuizBadge();
}
if($participation->getQuizCertificate() != null and !empty($participation->getQuizCertificate())) {
$items[$key]['award_certificate'] = $participation->getQuizCertificate();
}
}
}
}
//dd($items);
$keys = [];
if ($course !== null) {
$keys = array_keys(array_column($items, 'course_id'), $course->getId());
} elseif ($quiz !== null) {
$keys = array_keys(array_column($items, 'quiz_id'), $quiz->getId());
} else {
$keys = array_keys(array_column($items, 'live_id'), $live->getId());
}
$currentItemKey = isset($keys[0]) ? $keys[0] : 0;
// $currentItemAsArray = $items[$currentItemKey];
$prevItemAsArray = (isset($items[$currentItemKey - 1])) ? $items[$currentItemKey - 1] : null;
$nextItemAsArray = (isset($items[$currentItemKey + 1])) ? $items[$currentItemKey + 1] : null;
$prevItem = null;
$nextItem = null;
if ($prevItemAsArray !== null && isset($prevItemAsArray['type'])) {
// $prevItem = ($prevItemAsArray['type'] === 'course') ? $courseRepository->findOneById($prevItemAsArray['course_id']) : $quizRepository->findOneById($prevItemAsArray['quiz_id']);
switch ($prevItemAsArray['type']) {
case 'course':
$prevItem = $courseRepository->findOneById($prevItemAsArray['course_id']);
break;
case 'quiz':
$prevItem = $quizRepository->findOneById($prevItemAsArray['quiz_id']);
break;
default:
$prevItem = $liveRepository->findOneById($prevItemAsArray['live_id']);
break;
}
// $prevItem = $quizRepository->findOneById($prevItemAsArray[$prevItemAsArray['type'].'_id']);
}
if ($nextItemAsArray !== null && isset($nextItemAsArray['type'])) {
// $nextItem = ($nextItemAsArray['type'] === 'course') ? $courseRepository->findOneById($nextItemAsArray['course_id']) : $quizRepository->findOneById($nextItemAsArray['quiz_id']);
switch ($nextItemAsArray['type']) {
case 'course':
$nextItem = $courseRepository->findOneById($nextItemAsArray['course_id']);
break;
case 'quiz':
$nextItem = $quizRepository->findOneById($nextItemAsArray['quiz_id']);
break;
default:
$nextItem = $liveRepository->findOneById($nextItemAsArray['live_id']);
break;
}
// $nextItem = $courseRepository->findOneById($nextItemAsArray[$nextItemAsArray['type'].'_id']);
}
$prevItemType = ($prevItem !== null) ? (($prevItem instanceof Course) ? 'course' : (($prevItem instanceof Quiz) ? 'quiz' : 'live')) : null;
$nextItemType = ($nextItem !== null) ? (($nextItem instanceof Course) ? 'course' : (($nextItem instanceof Quiz) ? 'quiz' : 'live')) : null;
$key = $module->getSlug().'_'.$currentUser->getId();
if($program != null) {
$key = $program->getId().'_'.$key;
}
if($course) {
$key .= '_'.$course->getId();
} else if($live) {
$key .= '_'.$live->getId();
} else if($quiz) {
$key .= '_'.$quiz->getId();
}
// Sauvegarde dans le cache
$startDateTimeStamp = null;
if($this->helper->getCacheItem($key) == null) {
$this->helper->setCacheItem($key, json_encode(array('start_at' => (new DateTime())->getTimestamp())));
} else {
$startDateTimeStamp = json_decode($this->helper->getCacheItem($key))->start_at;
}
$currentRoute = $request->get('_route');
switch ($currentRoute) {
case 'app_front_module_course_terminate':
$moduleParticipation = $moduleParticipationRepository->findOneBy(['program' => $program, 'module' => $module, 'course' => $course, 'createdBy' => $currentUser]);
if ($moduleParticipation !== null) {
return $this->redirectToRoute("app_front_module_course_participation_page", [
"module_slug" => $module->getSlug(),
"course_slug" => $course->getSlug()
]);
}
$moduleParticipation = new ModuleParticipation();
$moduleParticipation->setModule($module);
$moduleParticipation->setCourse($course);
$moduleParticipation->setProgram($program);
$moduleParticipation->setEndAt(new DateTime());
$_startAt = null;
// if ($redis->exists($key)) {
if ($startDateTimeStamp !== null) {
$_startAt = new DateTime();
// $_startAt->setTimestamp($redis->get($key));
$_startAt->setTimestamp($startDateTimeStamp);
$moduleParticipation->setStartAt($_startAt);
// $redis->del($key);
}
$moduleParticipationRepository->add($moduleParticipation, true);
$this->helper->deleteCacheItem($key);
if ($_startAt !== null && $this->isModuleTerminated($module, $currentUser, $program)) {
$userModuleParticipation = $userModuleParticipationRepository->findOneBy(array('program' => $program, 'module' => $module, 'createdBy' => $currentUser), array('createdAt' => 'DESC'));
if ($userModuleParticipation == null) {
$userModuleParticipation = new UserModuleParticipation();
$userModuleParticipation->setStartAt($_startAt);
}
$userModuleParticipation->setProgram($program);
$userModuleParticipation->setModule($module);
$userModuleParticipation->setEndAt(new DateTime());
//$userModuleParticipation->setStartAt($_startAt);
$userModuleParticipationRepository->add($userModuleParticipation, true);
if ($program !== null) {
if ($this->isProgramTerminated($program, $currentUser)) {
$userProgramParticipation = $userProgramParticipationRepository->findOneBy(array('program' => $program, 'createdBy' => $currentUser), array('createdAt' => 'DESC'));
if($userProgramParticipation == null) {
$userProgramParticipation = new UserProgramParticipation();
$userProgramParticipation->setStartAt($_startAt);
}
//$userProgramParticipation = new UserProgramParticipation();
$userProgramParticipation->setProgram($program);
$userProgramParticipation->setEndAt(new DateTime());
//$userProgramParticipation->setStartAt($_startAt);
$userProgramParticipationRepository->add($userProgramParticipation, true);
$programParticipation = $programParticipationRepository->findOneBy(['program' => $program, 'createdBy' => $currentUser]);
// Program certificate attachment
$certificate = $this->getProgramCertificateFilePath($currentUser, $program, $programParticipation);
//dd($certificate);
if (!empty($certificate) && $certificate['program_certificate_file_path'] !== null) {
$programParticipation->setCertificate($certificate['program_certificate_file_path']);
$programParticipation->setCertificateLabel($certificate['program_certificate_label']);
$programParticipationRepository->add($programParticipation, true);
}
}
//
// generate certificate async
//
$this->bus->dispatch(new Certificate($program->getId(), $currentUser->getId()));
}
}
if ($nextItem !== null) {
return $this->redirectToRoute("app_front_module_".$nextItemType."_participation_page", [
"module_slug" => $module->getSlug(),
$nextItemType."_slug" => $nextItem->getSlug()
]);
} else {
return $this->redirectToRoute("app_front_module_notice_page", [
"slug" => $module->getSlug()
]);
}
break;
case 'app_front_module_quiz_terminate':
$isQuizTerminated = false;
$score = 0;
$isNotePublished = true;
if ($request->isMethod('POST')) {
$moduleParticipation = $moduleParticipationRepository->findOneBy(['program' => $program, 'module' => $module, 'quiz' => $quiz, 'createdBy' => $currentUser]);
if ($moduleParticipation !== null && $moduleParticipation->getQuizScore() !== null) {
return $this->redirectToRoute("app_front_module_quiz_participation_page", [
"module_slug" => $module->getSlug(),
"quiz_slug" => $quiz->getSlug()
]);
}
//dd($request->request->all());
foreach ($request->request->all() as $key => $answers) {
$keyParts = explode("_", $key);
$quizQuestionId = (count($keyParts) > 0) ? (int)$keyParts[1]: null;
if ($quizQuestionId !== null && $answers !== null && $answers !== "") {
$quizQuestion = $quizQuestionRepository->findOneById($quizQuestionId);
if ($quizQuestion !== null) {
$userQuizQuestion = new UserQuizQuestion();
$userQuizQuestion->setQuizQuestion($quizQuestion);
$questionPoints = $quizQuestion->getPoints();
/* Free entry Question */
if (strpos($key, 'custom') !== false) {
$userQuizQuestion->setCustomAnswer($answers);
$isNotePublished = false;
} elseif (count($keyParts) === 3 || count($keyParts) === 4) {
/* Pairing and Ranking Question */
$answerId = (int)$keyParts[2];
$quizAnswer = $quizAnswerRepository->findOneById($answerId);
if ($quizAnswer !== null) {
$userQuizQuestion->addQuizAnswer($quizAnswer);
$userQuizQuestion->setCustomAnswer($answers);
/* Ranking Question */
if (isset($keyParts[3]) && $keyParts[3] === 'ranking') {
$rankingQuestionPoints = $questionPoints;
$rankingCorrectOrders [] = $quizAnswer->getResponseOrder();
$rankinkOrders [] = (int)$answers;
} else {
/* Pairing Question */
$pointsByAnswer = $questionPoints / $quizQuestion->getQuizAnswers()->count();
if ($quizAnswer->getCorrectResponse() === $answers) {
$score = $score + $pointsByAnswer;
}
}
}
} else {
/* QCM Question (multiple choices) */
if (is_array($answers)) {
$answers = array_map(function ($answer) {
return (int)$answer;
}, $answers);
$incorrectAnswerIds = [];
$correctAnswers = [];
foreach ($quizQuestion->getQuizAnswers() as $answer) {
if (!$answer->isIsCorrect()) $incorrectAnswerIds [] = $answer->getId();
else $correctAnswers [] = $answer;
}
$incorrectAnswerChecked = array_intersect($answers, $incorrectAnswerIds);
$questionAnswers = [];
foreach ($quizQuestion->getQuizAnswers() as $answer) {
$questionAnswers [$answer->getId()] = (in_array($answer->getId(), $answers));
}
$pointsByAnswer = $questionPoints / count($correctAnswers);
$_questionNote = 0;
foreach ($answers as $answerId) {
$quizAnswer = $quizAnswerRepository->findOneById($answerId);
if ($quizAnswer !== null) {
$userQuizQuestion->addQuizAnswer($quizAnswer);
if (!$incorrectAnswerChecked) $_questionNote = $_questionNote + $pointsByAnswer;
}
}
$score = $score + $_questionNote;
/* TrurOrFalse Question */
} elseif ($keyParts[0] === 'trueOrFalseAnswer') {
$userQuizQuestion->setTrueOrFalseAnswer($answers);
if ($quizQuestion->isIsTrueOrFalse() == filter_var($answers, FILTER_VALIDATE_BOOLEAN)) {
$score = $score + $questionPoints;
}
/* Drop-down menu or Unique choice Question */
} else {
$quizAnswer = $quizAnswerRepository->findOneById((int)$answers);
if ($quizAnswer !== null) {
$userQuizQuestion->addQuizAnswer($quizAnswer);
if ($quizAnswer->isIsCorrect()) {
$score = $score + $questionPoints;
}
}
}
}
$userQuizQuestion->setModule($module);
$userQuizQuestionRepository->add($userQuizQuestion, true);
$isQuizTerminated = true;
}
}
}
if (isset($rankingQuestionPoints) && $rankingCorrectOrders === $rankinkOrders) {
$score = $score + $rankingQuestionPoints;
}
foreach ($request->files->all() as $key => $file) {
if ($file) {
$keyParts = explode("_", $key);
$quizQuestionId = (count($keyParts) > 0) ? $keyParts[1] : null;
if ($quizQuestionId !== null && $answers !== null && !empty($answers)) {
$quizQuestion = $quizQuestionRepository->findOneById($quizQuestionId);
if ($quizQuestion !== null) {
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
// this is needed to safely include the file name as part of the URL
$safeFilename = $this->slugger->slug($originalFilename);
$newFilename = $safeFilename.'-'.uniqid().'.'.$file->guessExtension();
// Move the file to the directory where brochures are stored
try {
$file->move(
$this->getParameter('quiz_file_directory'),
$newFilename
);
$userQuizQuestion = new UserQuizQuestion();
$userQuizQuestion->setQuizQuestion($quizQuestion);
$userQuizQuestion->setFileAnswer($newFilename);
$userQuizQuestion->setModule($module);
$userQuizQuestionRepository->add($userQuizQuestion, true);
$isQuizTerminated = true;
$isNotePublished = false;
} catch (FileException $e) {
// dump($e->getMessage());
// die;
}
}
}
}
}
// $isQuizTerminated = true; // Quiz not parameterized
if ($moduleParticipation === null) {
$moduleParticipation = new ModuleParticipation();
$moduleParticipation->setModule($module);
$moduleParticipation->setQuiz($quiz);
$moduleParticipation->setProgram($program);
$moduleParticipation->setEndAt(new DateTime());
}
$quizTotalNote = array_reduce($quiz->getQuizQuestions()->toArray(), function(int $accumulator, QuizQuestion $quizQuestion): int {
return $accumulator + $quizQuestion->getPoints();
}, 0);
$moduleParticipation->setQuizScore($score);
$moduleParticipation->setQuizTotalNote($quizTotalNote);
$moduleParticipation->setAutomaticEndAt(null);
$moduleParticipation->setIsNotePublished($isNotePublished);
$_startAt = null;
// if ($redis->exists($key)) {
if ($startDateTimeStamp !== null) {
$_startAt = new DateTime();
// $_startAt->setTimestamp($redis->get($key));
$_startAt->setTimestamp($startDateTimeStamp);
$moduleParticipation->setStartAt($_startAt);
// $redis->del($key);
}
if ($isNotePublished) {
// Module certificate attachment
$certificate = $this->getModuleQuizCertificateFilePath($currentUser, 'certificate', $program, $module, $quiz);
if ($certificate !== null && !empty($certificate)) {
$moduleParticipation->setQuizCertificate($certificate['quiz_certificate_file_path']);
$moduleParticipation->setQuizCertificateLabel($certificate['quiz_certificate_label']);
}
// Module badge attachment
$badge = $this->getModuleQuizCertificateFilePath($currentUser, 'badge', $program, $module, $quiz);
//$badge = null;
if ($badge !== null && !empty($badge)) {
$moduleParticipation->setQuizBadge($badge['quiz_certificate_file_path']);
$moduleParticipation->setQuizBadgeLabel($badge['quiz_badge_label']);
}
}
$moduleParticipationRepository->add($moduleParticipation, true);
$this->helper->deleteCacheItem($key);
$programParticipation = null;
if ($isNotePublished) {
$programQuizScore = ($program !== null) ? $this->getProgramQuizScore($program, $currentUser) : null;
if ($programQuizScore !== null) {
// Program score calculation
$programParticipation = $programParticipationRepository->findOneBy(['program' => $program, 'createdBy' => $currentUser]);
if ($programParticipation !== null) {
$programParticipation->setQuizScore($programQuizScore['quizNote']);
$programParticipation->setQuizTotalNote($programQuizScore['quizTotalNote']);
$programParticipationRepository->add($programParticipation, true);
} else {
$programParticipation = new ProgramParticipation();
$programParticipation->setProgram($program);
$programParticipation->setCreatedBy($currentUser);
$programParticipation->setQuizScore($programQuizScore['quizNote']);
$programParticipation->setQuizTotalNote($programQuizScore['quizTotalNote']);
$programParticipationRepository->add($programParticipation, true);
}
}
}
if ($_startAt !== null && $this->isModuleTerminated($module, $currentUser, $program)) {
$userModuleParticipation = $userModuleParticipationRepository->findOneBy(array('program' => $program, 'module' => $module, 'createdBy' => $currentUser), array('createdAt' => 'DESC'));
if($userModuleParticipation == null) {
$userModuleParticipation = new UserModuleParticipation();
$userModuleParticipation->setStartAt($_startAt);
}
$userModuleParticipation->setProgram($program);
$userModuleParticipation->setModule($module);
$userModuleParticipation->setEndAt(new DateTime());
//$userModuleParticipation->setStartAt($_startAt);
$userModuleParticipationRepository->add($userModuleParticipation, true);
if ($program !== null) {
if ($this->isProgramTerminated($program, $currentUser)) {
$userProgramParticipation = $userProgramParticipationRepository->findOneBy(array('program' => $program, 'createdBy' => $currentUser), array('createdAt' => 'DESC'));
if($userProgramParticipation == null) {
$userProgramParticipation = new UserProgramParticipation();
$userProgramParticipation->setStartAt($_startAt);
}
$userProgramParticipation->setProgram($program);
$userProgramParticipation->setEndAt(new DateTime());
$userProgramParticipationRepository->add($userProgramParticipation, true);
// Program certificate attachment
$certificate = $this->getProgramCertificateFilePath($currentUser, $program, $programParticipation);
if (!empty($certificate) && $certificate['program_certificate_file_path'] !== null) {
$programParticipation->setCertificate($certificate['program_certificate_file_path']);
$programParticipation->setCertificateLabel($certificate['program_certificate_label']);
$programParticipationRepository->add($programParticipation, true);
}
}
//
// generate certificate async
//
$this->bus->dispatch(new Certificate($program->getId(), $currentUser->getId()));
}
}
// if ($quiz !== null) {
// $this->addFlash('successful_quiz', 'Félicitations vous venez de décrocher ce certificat !');
// }s
if ($nextItem !== null) {
// if ($nextItemType === 'course') {
// return $this->redirectToRoute("app_front_module_course_participation_page", [
// "module_slug" => $module->getSlug(),
// "course_slug" => $nextItem->getSlug()
// ]);
// } elseif ($nextItemType === 'quiz') {
// return $this->redirectToRoute("app_front_module_quiz_participation_page", [
// "module_slug" => $module->getSlug(),
// "quiz_slug" => $nextItem->getSlug()
// ]);
// } else {
// return $this->redirectToRoute("app_front_module_live_participation_page", [
// "module_slug" => $module->getSlug(),
// "live_slug" => $nextItem->getSlug()
// ]);
// }
return $this->redirectToRoute("app_front_module_".$nextItemType."_participation_page", [
"module_slug" => $module->getSlug(),
$nextItemType."_slug" => $nextItem->getSlug()
]);
} else {
return $this->redirectToRoute("app_front_module_notice_page", [
"slug" => $module->getSlug()
]);
}
}
$this->addFlash("quiz_participation_error", "Erreur survenue lors de la soumission du quiz: Veuillez contacter l'administrateur si cela persiste !");
return $this->redirectToRoute("app_front_module_quiz_participation_page", [
"module_slug" => $module->getSlug(),
"quiz_slug" => $quiz->getSlug()
]);
break;
}
//$activeProgram = $this->getActiveProgram($module, false);
$moduleItemTerminateCount = $moduleParticipationRepository->getParticipationCount($module, $currentUser, $program);
$progression = (!empty($items)) ? floor(($moduleItemTerminateCount / count($items)) * 100) : 0;
// $currentItemTerminate = ($course !== null) ?
// $moduleParticipationRepository->findBy(['module' => $module, 'course' => $course, 'createdBy' => $this->getUser()]) :
// $moduleParticipationRepository->findBy(['module' => $module, 'quiz' => $quiz, 'createdBy' => $this->getUser()]);
$isCurrentItemTerminated = false;
if ($course !== null) {
$isCurrentItemTerminated = $this->isItemTerminated($currentUser, $moduleParticipationRepository, $module, null, $course, $program);
} elseif ($quiz !== null) {
$isCurrentItemTerminated = $this->isItemTerminated($currentUser, $moduleParticipationRepository, $module, null, $quiz, $program);
} else {
$isCurrentItemTerminated = $this->isItemTerminated($currentUser, $moduleParticipationRepository, $module, null, $live, $program);
}
$isPrevIQuizTerminated = false;
if ($prevItem !== null && $prevItem instanceof Quiz) {
$isPrevIQuizTerminated = $this->isItemTerminated($currentUser, $moduleParticipationRepository, $module, null, $prevItem, $program);
}
$userQuizParticipations = [];
//$myPrograms = $programRepository->findMyPrograms($currentUser, $module);
$automaticEndAt = null;
$automaticEndAtFormatted = null;
$today = new DateTime();
$isQuizzAlreadyStarted = false;
if ($quiz !== null && $quiz->getStartAt() <= $today) {
$userQuizParticipations = $userQuizQuestionRepository->findUserQuiz($quiz, $this->getUser(), $module);
$output = [];
foreach ($userQuizParticipations as $item) {
if ($item['answer_id'] !== null) {
$output[$item['question_id']][$item['answer_id']] = $item;
} else {
$output[$item['question_id']][] = $item;
}
}
$userQuizParticipations = $output;
$moduleParticipation = $moduleParticipationRepository->findOneBy(['program' => $program, 'module' => $module, 'quiz' => $quiz, 'createdBy' => $this->getUser()]);
if ($moduleParticipation !== null) {
// $hour = (int)$quiz->getTime()->format('H');
// $minute = (int)$quiz->getTime()->format('i');
// $second = (int)$quiz->getTime()->format('s');
// $currentDate = clone (new DateTime());
// $endAt = $currentDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
// $moduleParticipation = new ModuleParticipation();
// $moduleParticipation->setModule($module);
// $moduleParticipation->setQuiz($quiz);
// $moduleParticipation->setAutomaticEndAt($endAt);
// $moduleParticipationRepository->add($moduleParticipation, true);
$automaticEndAt = $moduleParticipation->getAutomaticEndAt();
$automaticEndAtFormatted = ($automaticEndAt !== null) ? $automaticEndAt->format('F, d Y H:i:s') : null;
$isQuizeStarted = true;
} else {
$moduleParticipation = new ModuleParticipation();
$moduleParticipation->setModule($module);
$moduleParticipation->setQuiz($quiz);
$moduleParticipation->setProgram($program);
if ($quiz->getTime() !== null) {
$hour = (int)$quiz->getTime()->format('H');
$minute = (int)$quiz->getTime()->format('i');
$second = (int)$quiz->getTime()->format('s');
$currentDate = clone (new DateTime());
$endAt = $currentDate->add(new DateInterval('PT'.$hour.'H'.$minute.'M'.$second.'S'));
//$moduleParticipation->setStartAt(new DateTime());
$moduleParticipation->setAutomaticEndAt($endAt);
}
$moduleParticipationRepository->add($moduleParticipation, true);
$automaticEndAt = $moduleParticipation->getAutomaticEndAt();
$automaticEndAtFormatted = ($automaticEndAt !== null) ? $automaticEndAt->format('F, d Y H:i:s') : null;
}
$isQuizzAlreadyStarted = true;
} else if ($prevItemType === 'quiz' || $nextItemType === 'quiz') {
$moduleParticipation = ($prevItemType === 'quiz') ? $moduleParticipationRepository->findOneBy(['program' => $program, 'module' => $module, 'quiz' => $prevItem, 'createdBy' => $currentUser]) : $moduleParticipationRepository->findOneBy(['module' => $module, 'quiz' => $nextItem, 'createdBy' => $this->getUser()]);
$isQuizzAlreadyStarted = ($moduleParticipation !== null);
}
// if ($cacheItem->get($key !== null)) {
// $cacheItem->set(new DateTime());
// $cache->save($cacheItem);
// }
// else {
// // $cache->deleteItem($key);
// dump($cacheItem->get($key)); die;
// }
// if (!$redis->exists($key)) {
// $redis->set($key, (new DateTime())->getTimestamp());
// }
$moduleView = $moduleViewRepository->findOneBy(['module' => $module, 'createdBy' => $currentUser]);
if ($moduleView === null) {
$moduleView = new ModuleView();
$moduleView->setModule($module);
$moduleViewRepository->add($moduleView, true);
}
if ($course !== null) {
$courseView = $courseViewRepository->findOneBy(['course' => $course, 'createdBy' => $currentUser]);
if ($courseView === null) {
$courseView = new CourseView();
$courseView->setCourse($course);
$courseViewRepository->add($courseView, true);
}
}
if ($live !== null) {
$liveView = $liveViewRepository->findOneBy(['live' => $live, 'createdBy' => $currentUser]);
if ($liveView === null) {
$liveView = new LiveView();
$liveView->setLive($live);
$liveViewRepository->add($liveView, true);
}
}
if ($quiz !== null) {
$quizView = $quizViewRepository->findOneBy(['quiz' => $quiz, 'createdBy' => $currentUser]);
if ($quizView === null) {
$quizView = new QuizView();
$quizView->setQuiz($quiz);
$quizViewRepository->add($quizView, true);
}
}
//dd($isPrevIQuizTerminated);
$totalTime = 0;
foreach($module->getLives() as $_live) {
if($_live->isIsPublished()) {
$duration = $_live->getTime()->format('H:i:s');
sscanf($duration, "%d:%d:%d", $hours, $minutes, $seconds);
$totalTime += isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes;
}
}
return $this->render('front/pages/library/module-participation.html.twig', [
'module' => $module,
'course' => $course,
'quiz' => $quiz,
'live' => $live,
'prevItem' => $prevItem,
'prevItemType' => $prevItemType,
'nextItem' => $nextItem,
'nextItemType' => $nextItemType,
'progression' => $progression < 100 ? $progression : 100,
'isCurrentItemTerminated' => $isCurrentItemTerminated,
'userQuizParticipations' => $userQuizParticipations,
//'myPrograms' => $myPrograms,
'automaticEndAt' => $automaticEndAt,
'automaticEndAtFormatted' => $automaticEndAtFormatted,
'isQuizzAlreadyStarted' => $isQuizzAlreadyStarted,
'program' => $program,
'isPrevIQuizTerminated' => $isPrevIQuizTerminated,
'duration' => $this->secondsToTime($totalTime),
'items' => $items,
'course_document' => ($course != null && $course->getType() === 'document' && $course->getDocument() !== null) ? $this->getParameter('upload_file_base_directory').'/'.rawurlencode(basename($course->getDocument()->getFileName())) : null
// 'isLiveLocked' => $isLiveLocked,
// 'isQuizLocked' => $isQuizLocked,
]);
}
/**
* @Route("/modules/avis/{slug}", name="app_front_module_notice_page")
*/
public function giveAvisToModule(Request $request, ModuleParticipationRepository $moduleParticipationRepository, ModuleItemRepository $moduleItemRepository, ModuleNoticeRepository $moduleNoticeRepository, Module $module): Response {
$user = $this->getUser();
if (!$this->hasAccessToThisModule($module, $user)) throw $this->createNotFoundException("La page demandée n'existe pas");
$items = $moduleItemRepository->findItems($module);
//$activeProgram = $this->getActiveProgram($module, false);
$program = $this->getActiveProgram($module, false, $user);
$moduleItemTerminateCount = $moduleParticipationRepository->getParticipationCount($module, $user, $program);
$progression = (!empty($items)) ? floor(($moduleItemTerminateCount / count($items)) * 100) : 0;
$myNotice = $moduleNoticeRepository->findOneBy(['module' => $module, 'createdBy' => $user]);
$moduleNotice = ($myNotice === null) ? new ModuleNotice() : $myNotice;
$form = $this->createForm(ModuleNoticeType::class, $moduleNotice, ['module' => $module]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$moduleNoticeRepository->add($moduleNotice, true);
return $this->redirectToRoute("app_front_library_module_details_page", [
"slug" => $module->getSlug()
]);
}
return $this->render('front/pages/library/module-avis.html.twig', [
'module' => $module,
'progression' => $progression,
'form' => $form->createView(),
'myNotice' => $myNotice,
'program' => $program
]);
}
/**
* @Route("/modules", name="app_front_library_cours_available_page")
* @Route("/modules/{id}", name="app_front_program_module")
* @Route("/{program_slug}/modules", name="app_front_program_modules")
* @Route("/metier/{job_slug}/modules", name="app_front_job_modules")
* @ParamConverter("program", options={"mapping": {"program_slug": "slug"}})
* @ParamConverter("job", options={"mapping": {"job_slug": "slug"}})
*/
public function libraryCourAvailable(ProgramRepository $programRepository, JobRepository $jobRepository, ModuleRepository $moduleRepository, ModuleViewRepository $moduleViewRepository, ModuleLikeRepository $moduleLikeRepository, Request $request, ProgramParticipationRepository $programParticipationRepository, Program $program = null, Job $job = null): Response{
$page = (int)$request->query->get('page', 1);
if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
$session = $request->getSession();
if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
$user = $this->getUser();
$programParticipation = null;
if($program) {
$programParticipation = $programParticipationRepository->findOneBy(array('program' => $program, 'createdBy' => $user));
$program = $programParticipation ? $program : null;
}
$programs = $program ? [$program] : $programRepository->findActivePrograms($user);
// $jobs = $jobRepository->findActiveJobs();
$formBuilder = $this->createFormBuilder(null, [
'validation_groups' => false
]);
$formBuilder->add('searchKey', HiddenType::class, [
// 'class' => Module::class,
'label' => false,
// 'choices' => [],
// 'choice_label' => 'name',
]);
// $formBuilder->get('searchKey')->addModelTransformer($moduleToEntityTransformer);
$form = $formBuilder->getForm();
$filterForm = $this->createFormBuilder();
$filterForm->add('filter', ChoiceType::class, [
'label' => 'Trier par : ',
'label_attr' => ['class' => 'text-grey'],
'attr' => ['style' => 'border: 1px solid transparent !important;'],
'choices' => [
'Populaire' => 'most_seen',
'Mieux notés' => 'best_rated'
],
'placeholder' => 'Choisir une option',
'expanded' => false,
]);
$filterForm = $filterForm->getForm();
// $modules = $moduleRepository->findPaginateModule($page, Constants::PAGINATION_LIMIT, $programs, $this->isGranted("ROLE_VISITOR"));
// if (!$program && $session->has('_program') && $session->has('_job')) {
// // $program = $programRepository->findOneById($session->get('_program'));
// // $job = $jobRepository->findOneById($session->get('_job'));
// // $startAt = $session->get('_startAt');
// // $endAt = $session->get('_endAt');
// $searchKey = $session->get('_searchKey');
// $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, $page, null, $searchKey);
// $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
// } else {
// $modules = $moduleRepository->searchModule(null, null, $this->getUser(), null, null, false, $page);
// $totalModule = $moduleRepository->searchModule(null,null, $this->getUser(), null, null, true);
// }
// searchModule(?Program $program, ?Job $job, ?User $user, $startAt = null, $endAt = null, $count = false, $page = null, $limit = null, $searchKey = null)
$searchKey = $session->has('_searchKey') ? $session->get('_searchKey') : null;
$modules = $moduleRepository->searchModule($program, $job, $user, null, null, false, $page, null, $searchKey);
$totalModule = $moduleRepository->searchModule($program, $job, $user, null, null, true, null, null, $searchKey);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $programData = $form->get('program')->getData();
// $job = $form->get('job')->getData();
// $startAt = $form->get('startAt')->getData();
// $endAt = $form->get('endAt')->getData();
// $session->set('_program', ($programData !== null) ? $programData->getId() : null);
// $session->set('_job', ($job !== null) ? $job->getId() : null);
// $session->set('_startAt', $startAt);
// $session->set('_endAt', $endAt);
// $session->set('_route', $request->get('_route'));
$searchKey = $form->get('searchKey')->getData();
// if ($programData !== null) {
$modules = $moduleRepository->searchModule(null, null, $user, null, null, false, $page, null, $searchKey);
$totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
// }
}
$filterForm->handleRequest($request);
if ($filterForm->isSubmitted() && $filterForm->isValid()) {
$filter = $filterForm->get('filter')->getData();
// $session->set('_filter', ($filter !== null) ? $filter : null);
if ($filter !== null) $modules = ($filter === 'most_seen') ? $moduleRepository->_findMostViewedModule($program) : $moduleRepository->_findMostLikedModule($program);
}
return $this->render('front/pages/library/module-disponibles.html.twig', [
'programs' => $programs,
'modules' => $modules,
'totalModule' => count($totalModule),
'limit' => Constants::PAGINATION_LIMIT,
'page' => $page,
'form' => $form->createView(),
'filterForm' => $filterForm->createView(),
'program' => $program
]);
}
/**
* @Route("/{slug}/inviter-un-ami/{id}", name="app_front_library_invite_friend", methods={"GET","POST"})
* @ParamConverter("module", isOptional="false", options={"mapping": {"slug": "slug"}})
* @ParamConverter("user", isOptional="true", options={"mapping": {"id": "id"}})
*/
public function invite(Request $request, Module $module, User $user = null)
{
if ($user === null) throw $this->createNotFoundException("Utilisateur non trouvé");
$url = $_ENV['SECURE_SCHEME'].':'.$this->generateUrl('app_front_library_module_details_page', ['slug' => $module->getSlug()], UrlGeneratorInterface::NETWORK_PATH);
/** @var User $sender */
$sender = $this->getUser();
$mail = (new TemplatedEmail())
->from(new Address($this->getParameter('cofina_sender_mail'), 'Cofina Academy'))
->to($user->getEmail())
->subject('Invitation Module')
->htmlTemplate('front/pages/dashboard/modules/invite-mail.html.twig')
->context([
'module_name' => $module->getName(),
'invited_by' => $sender->getFullname(),
'module_url' => $url
]);
try {
$this->mailer->send($mail);
$this->addFlash('invitation_sent', 'Invitation envoyé');
} catch (TransportExceptionInterface $e) {
$this->addFlash('invitation_sending_mail_error', "Erreur lors de l'envoi de l'invitation par mail");
// Log the exception details
$this->logger->error('Email sending failed', [
'error' => $e->getMessage(),
'debug' => $e->getDebug() ?? 'No debug info available',
]);
}
try {
$this->bus->dispatch(new Notification($module->getId(), 'Module', 'module_recommandation', $sender->getId(), $user->getId()));
} catch (Exception $e) {
$this->addFlash('invitation_sending_notification_error', "Erreur lors de l'envoi de la notification");
}
$referer = $request->headers->get('referer');
return new RedirectResponse($referer);
// return $this->redirectToRoute('app_front_library_page');
}
/**
* @Route("/should-define-objective/{id}", name="app_front_should_define_objective", methods={"GET"})
*/
public function shouldDefineObjective(Request $request, Module $module, ModuleObjectiveRepository $moduleObjectiveRepository)
{
$user = $this->getUser();
$program = $this->getActiveProgram($module, false, $user);
$objective = $moduleObjectiveRepository->findBy(array('module' => $module, 'createdBy' => $user));
$data = array(
'shouldDefineObjective' => ($program == null && $objective == null)
);
return new JsonResponse($data);
}
/**
* @Route("/define-objective/{id}", name="app_front_define_objective", methods={"POST"})
*/
public function defineObjective(Request $request, Module $module, ModuleObjectiveRepository $moduleObjectiveRepository)
{
$user = $this->getUser();
$date = $request->get('date');
if (!$date) {
return new JsonResponse("Merci de renseigner une date", 400);
}
$date = DateTime::createFromFormat('d/m/Y', $date);
$today = (new DateTime())->format('d/m/Y');;
if (!$date || $date < $today) {
return new JsonResponse("L'objectif de date doit être fixé au moins à aujourd'hui.", 400);
}
$objective = $moduleObjectiveRepository->findOneBy(array('module' => $module, 'createdBy' => $user));
if (!$objective) {
$objective = new ModuleObjective();
$objective->setModule($module);
}
$objective->setObjectiveDate($date);
$moduleObjectiveRepository->add($objective, true);
$data = array(
'status' => 'OK'
);
return new JsonResponse($data);
}
/**
* @Route("/update-elapsed-time", name="app_user_update_elapsed_time", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function updateElapsedTime(Request $request, UserRepository $userRepository)
{
$time = $request->get('time');
$user = $this->getUser();
$user->setElapsedTime($user->getElapsedTime() + $time);
$userRepository->add($user, true);
$data = [
'id' => $user->getId(),
'status' => "OK",
'totalElpasedTime' => $user->getElapsedTime()
];
return new JsonResponse($data);
}
/**
* @Route("/recherche-module", name="app_front_library_module_search")
* @param Request $request
* @return JsonResponse
*/
public function moduleSearch(Request $request, ModuleRepository $moduleRepository)
{
$searchKey = $request->get('q');
$modules = $moduleRepository->searchModule(null, null, $this->getUser(), null, null, false, null, null, $searchKey);
$output = [];
foreach ($modules as $key => $module) {
$_jobs = [];
$jobs = $module->getJobs();
foreach ($jobs as $job) {
$_jobs[] = $job->getLabel();
}
$output[] = [
'id' => $module->getId(),
'text' => $module->getName(),
'total_count' => count($modules),
'jobs' => $_jobs
];
}
return $this->json($output);
}
/**
* @Route("/programmes", name="app_front_library_program_page")
*/
public function allActivePrograms(ProgramRepository $programRepository, JobRepository $jobRepository, ModuleRepository $moduleRepository, ModuleViewRepository $moduleViewRepository, ModuleLikeRepository $moduleLikeRepository, Request $request, ProgramParticipationRepository $programParticipationRepository, Program $program = null, Job $job = null): Response{
$page = (int)$request->query->get('page', 1);
if ($page <= 0) throw $this->createNotFoundException("La page demandée n'existe pas");
$session = $request->getSession();
if ($session->has('_route') && $session->get('_route') !== $request->get('_route')) $session->clear();
$user = $this->getUser();
// $programParticipation = null;
// if($program) {
// $programParticipation = $programParticipationRepository->findOneBy(array('program' => $program, 'createdBy' => $user));
// $program = $programParticipation ? $program : null;
// }
$searchKey = $session->has('_searchKey') ? $session->get('_searchKey') : null;
$programs = $programRepository->findAllActivePrograms($user, $page, Constants::PAGINATION_LIMIT, $searchKey);
$totalProgramCount = $programRepository->findAllActiveProgramsCount($user, $searchKey);
// $formBuilder = $this->createFormBuilder(null, [
// 'validation_groups' => false
// ]);
// $formBuilder->add('searchKey', HiddenType::class, [
// // 'class' => Module::class,
// 'label' => false,
// // 'choices' => [],
// // 'choice_label' => 'name',
// ]);
// $form = $formBuilder->getForm();
// $searchKey = $session->has('_searchKey') ? $session->get('_searchKey') : null;
// $modules = $moduleRepository->searchModule($program, $job, $user, null, null, false, $page, null, $searchKey);
// $totalModule = $moduleRepository->searchModule($program, $job, $user, null, null, true, null, null, $searchKey);
// $form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
// $searchKey = $form->get('searchKey')->getData();
// $modules = $moduleRepository->searchModule(null, null, $user, null, null, false, $page, null, $searchKey);
// $totalModule = $moduleRepository->searchModule(null, null, $user, null, null, true, null, null, $searchKey);
// }
// $filterForm->handleRequest($request);
// if ($filterForm->isSubmitted() && $filterForm->isValid()) {
// $filter = $filterForm->get('filter')->getData();
// // $session->set('_filter', ($filter !== null) ? $filter : null);
// if ($filter !== null) $modules = ($filter === 'most_seen') ? $moduleRepository->_findMostViewedModule($program) : $moduleRepository->_findMostLikedModule($program);
// }
return $this->render('front/pages/library/programme-disponibles.html.twig', [
'programs' => $programs,
'totalProgram' => $totalProgramCount,
'limit' => Constants::PAGINATION_LIMIT,
'page' => $page,
// 'form' => $form->createView()
]);
}
}