<?php
namespace App\Controller;
use App\Data\SearchFlashWorkshop;
use App\Data\SearchFlashWorkshopAgenda;
use App\Entity\Client;
use App\Entity\ClientProduct;
use App\Entity\DefiAnswerUser;
use App\Entity\DefiSlide;
use App\Entity\DiagAnswer;
use App\Entity\DiagAnswerUser;
use App\Entity\DiagQuestion;
use App\Entity\FlashUserWorkshop;
use App\Entity\Product;
use App\Entity\User;
use App\Entity\UserProduct;
use App\Form\DisabledQuizzFormType;
use App\Form\ForcedDisabledFormType;
use App\Form\SearchFlashWorkshopAgendaType;
use App\Form\SearchFlashWorkshopType;
use App\Repository\ClientProductRepository;
use App\Repository\ClientRepository;
use App\Repository\DefiAnswerRepository;
use App\Repository\DefiAnswerUserRepository;
use App\Repository\DefiQuestionRepository;
use App\Repository\DefiSlideRepository;
use App\Repository\DiagAnswerRepository;
use App\Repository\DiagAnswerUserRepository;
use App\Repository\DiagQuestionRepository;
use App\Repository\FlashTimeslotRepository;
use App\Repository\FlashUserWorkshopRepository;
use App\Repository\FlashWorkshopRepository;
use App\Repository\FlashWorkshopTypeRepository;
use App\Repository\UserProductRepository;
use App\Repository\UserRepository;
use App\Service\ZoomService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\JsonResponse;
class PageController extends AbstractController
{
/**
* @Route("/{clientSlug}", name="app_main")
*/
public function index(
Request $request,
$clientSlug = null,
ClientRepository $clientRepository,
ClientProductRepository $clientProductRepository,
FlashWorkshopRepository $flashWorkshopRepository,
FlashUserWorkshopRepository $flashUserWorkshopRepository,
UserProductRepository $userProductRepository,
UserRepository $userRepository
) {
$session = $request->getSession();
$session->set('clientSlug', $clientSlug);
if ($this->getUser()) {
if ($this->isAuthorized($session->get('clientSlug')) == true || in_array('ROLE_ADMIN', $this->getUser()->getRoles()) == true) {
$client = $this->getUser()->getClient();
$firstUserProduct = $userProductRepository->findOneBy(['user' => $this->getUser(), 'hasDone' => true]);
$referer = $request->headers->get('referer');
if ($referer != null) {
$refererPathInfo = Request::create($referer)->getPathInfo();
$routeInfos = $this->get('router')->match($refererPathInfo);
if ($routeInfos['_route'] == 'app_login') {
$secureClientProducts = $clientProductRepository->hasClientSecureProduct($client);
if ($secureClientProducts === true) {
$password = $this->getParameter('app.generic_password');
if (password_verify($password, $this->getUser()->getPassword()) == true) {
// dd('ici');
return $this->redirectToRoute('app_set_password', [], Response::HTTP_SEE_OTHER);
}
}
}
}
$session->set('clientSalt', $client->getSalt());
$session->set('clientBackground', $client->getBackground());
$session->set('clientId', $client->getId());
$session->set('clientMainColor', $client->getMainColor());
$userFlashUserWorkshopsList = [];
// Récupération des Flash User Workshop de l'utilisateur
$userFlashUserWorkshops = $this->getUser()->getFlashUserWorkshops();
// Tableau des Flash Workshop où l'utilisateur à un créneau
$flashWorkshopsReservedForUser = [];
// Pour chaque Flash User Workshop de l'utilisateur, push dans le tableau des Flash User Workshop de l'utilisateur
foreach ($userFlashUserWorkshops as $userFlashUserWorkshop) {
array_push($userFlashUserWorkshopsList, $userFlashUserWorkshop);
}
// Pour chaque Flash User Workshop de l'utilisateur, récupération de son Flash Workshop, push le Flash Workshop dans le tableau des Flash Workshop où l'utilisateur à un créneau
foreach ($userFlashUserWorkshopsList as $userFlashUserWorkshop) {
$fwReserved = $userFlashUserWorkshop->getFlashWorkshop();
if (!in_array($fwReserved, $flashWorkshopsReservedForUser)) {
array_push($flashWorkshopsReservedForUser, $fwReserved);
}
}
$clientProducts = $clientProductRepository->getIncomingByClient($client);
$flashWorkshopsArray = [];
$locationsArray = [];
foreach ($clientProducts as $clientProduct) {
$flashWorkshops = $flashWorkshopRepository->getByClientProductIndex($clientProduct);
// Rassemblement des timeslots par date pour affichage dans la vue
foreach ($flashWorkshops as $flashWorkshop) {
$timeslotsCountForVerification = 0;
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
$timeslotsCountForVerification++;
}
if ($timeslotsCountForVerification > 0) {
$flashTimeslotExtractedDates = [];
$flashTimeslotByDateArray = [];
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
array_push($flashTimeslotExtractedDates, $timeslot->getDate());
}
}
foreach ($flashTimeslotExtractedDates as $date) {
$indexDate = $date->format('D d M Y');
$timeslotArray = [];
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
if ($date == $timeslot->getDate()) {
array_push($timeslotArray, $timeslot);
$flashTimeslotByDateArray[$indexDate] = $timeslotArray;
}
}
}
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop, 'timeslots' => $flashTimeslotByDateArray];
array_push($flashWorkshopsArray, $flashWorkshopFiltered);
} else {
$flashWorkshop->setIsOutdated(false);
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop, 'timeslots' => []];
array_push($flashWorkshopsArray, $flashWorkshopFiltered);
}
}
$fullFlashWorkshops = $flashWorkshopRepository->getFullFlashWorkshop($flashUserWorkshopRepository, $flashWorkshops);
foreach ($fullFlashWorkshops as $flashWorkshop) {
$timeslotsCountForVerification = 0;
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
$timeslotsCountForVerification++;
}
if ($timeslotsCountForVerification > 0) {
$flashWorkshop->setIsFull(true);
} else {
$flashWorkshop->setIsEmpty(true);
}
}
// Vérification si les timeslots ne sont pas tous à une date dépassée
foreach ($flashWorkshops as $flashWorkshop) {
$flashTimeslots = $flashWorkshop->getFlashTimeslots();
$timeslotsCountForVerification = 0;
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
$timeslotsCountForVerification++;
}
if ($timeslotsCountForVerification > 0) {
$timeslotsCount = count($flashTimeslots);
$timeslotsOutdatedCount = 0;
foreach ($flashTimeslots as $timeslot) {
if ($timeslot->getDate()->format('Y-m-d') < date('Y-m-d')) {
$timeslot->setIsOutdated(true);
$timeslotsOutdatedCount++;
}
}
if ($timeslotsOutdatedCount == $timeslotsCount) {
$flashWorkshop->setIsOutdated(true);
}
}
}
foreach ($flashWorkshopsArray as $k => $flashWorkshopAndTimeslots) {
if ($flashWorkshopAndTimeslots['flashWorkshopEntity']->getIsOutdated() == true) {
$outdatedFlashWorkshop = $flashWorkshopsArray[$k];
unset($flashWorkshopsArray[$k]);
array_push($flashWorkshopsArray, $outdatedFlashWorkshop);
}
$outdatedFlashTimeslotCount = 0;
$fullFlashTimeslotCount = 0;
$timeslotsTotalCount = count($flashWorkshopAndTimeslots['timeslots']);
foreach ($flashWorkshopAndTimeslots['timeslots'] as $timeslot) {
if ($timeslot[0]->getIsFull() == true) {
$fullFlashTimeslotCount++;
}
if ($timeslot[0]->getIsOutdated() == true) {
$outdatedFlashTimeslotCount++;
}
}
if ($timeslotsTotalCount > 0) {
if ($outdatedFlashTimeslotCount + $fullFlashTimeslotCount == $timeslotsTotalCount) {
$flashWorkshopAndTimeslots['flashWorkshopEntity']->setHasOutdatedAndFull(true);
}
}
}
if ($clientProduct->getProduct()->getName() == 'Defi-inclusion') {
$userProducts = $userProductRepository->findBy(['clientProduct' => $clientProduct, 'hasDone' => true], [], ['modifiedAt' => 'DESC']);
if ($userProducts != null) {
$userProductsByLocation = [];
// $locationsArray = [];
foreach ($userProducts as $userProduct) {
$locations = $userProduct->getClientProduct()->getClient()->getLocations();
$user = $userProduct->getUser();
foreach ($locations as $location) {
$locationsArray[$location->getName()] = 0;
$score = 0;
$users = $userRepository->findByLocation($location);
foreach ($users as $user) {
$userProductsByLocation = $userProductRepository->findByUser($user);
foreach ($userProductsByLocation as $userProductByLocation) {
$score = $score + $userProductByLocation->getScore();
$locationsArray[$location->getName()] = $score;
}
}
}
}
arsort($locationsArray);
}
}
}
} else {
return $this->redirectToRoute('app_main', ['clientSlug' => $this->getUser()->getClient()->getSlug()], Response::HTTP_SEE_OTHER);
}
} else {
$firstUserProduct = null;
$flashWorkshopsReservedForUser = null;
$locationsArray = [];
if ($session->get('clientSlug') != null) {
$clientEntity = $clientRepository->findOneBySlug($session->get('clientSlug'));
if ($clientEntity != null) {
$client = $clientEntity;
} else {
$client = $clientRepository->findOneById(1);
}
} else {
//dd('salut');
$client = $clientRepository->findOneById(1);
}
$session->set('clientSalt', $client->getSalt());
$session->set('clientBackground', $client->getBackground());
$session->set('clientId', $client->getId());
$session->set('clientMainColor', $client->getMainColor());
if ($clientSlug != $client->getSlug()) {
return $this->redirectToRoute('app_main', ['clientSlug' => $client->getSlug()], Response::HTTP_SEE_OTHER);
} else {
$flashWorkshopsArray = [];
$clientProducts = $clientProductRepository->getClientProductsForUnloggedUser($client);
//if(count($clientProducts)>=2 && $clientProducts[0]->getProduct()->getId() );
foreach ($clientProducts as $clientProduct) {
// Récupération des FW "Flashlearning"
if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
$flashWorkshops = $flashWorkshopRepository->getByClientProductUnloggedUser($clientProduct);
foreach ($flashWorkshops as $flashWorkshop) {
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop];
array_push($flashWorkshopsArray, $flashWorkshopFiltered);
}
}
}
}
}
$clientProducts = $clientProductRepository->getIncomingByClient($client);
foreach ($clientProducts as $clientProduct) {
if(count($clientProducts) >=1 && ($clientProduct->getProduct()->getId() != 1 || 2 ) != true){
$content = $this->renderView('page/diag_tools.html.twig', [
'flashWorkshops' => $flashWorkshopsArray,
'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
'client' => $client,
'locationsArray' => $locationsArray,
'clientProducts' => $clientProducts,
'userProduct' => $firstUserProduct
]);
}elseif($clientProduct->getProduct()->getName() == 'Defi-inclusion' || $clientProduct->getProduct()->getName() == 'Flashlearning'){
$content = $this->renderView('page/index.html.twig', [
'flashWorkshops' => $flashWorkshopsArray,
'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
'client' => $client,
'locationsArray' => $locationsArray,
'clientProducts' => $clientProducts,
'userProduct' => $firstUserProduct
]);
}else{
$content = $this->renderView('page/diag_tools.html.twig', [
'flashWorkshops' => $flashWorkshopsArray,
'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
'client' => $client,
'locationsArray' => $locationsArray,
'clientProducts' => $clientProducts,
'userProduct' => $firstUserProduct
]);
}
}
if (empty($clientProducts)) {
$content = $this->renderView('page/index.html.twig', [
'flashWorkshops' => $flashWorkshopsArray,
'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
'client' => $client,
'locationsArray' => $locationsArray,
'clientProducts' => $clientProducts,
'userProduct' => $firstUserProduct
]);
}
$viewWithCookie = $this->setCookie($client->getSlug(), $content);
return $viewWithCookie;
}
public function removeSeParamFromUrl(Request $request, UrlGeneratorInterface $urlGenerator)
{
// On récupère l'URL actuelle
$currentUrl = $request->getUri();
// Parse l'URL pour obtenir les composants (chemin, query params, etc.)
$parsedUrl = parse_url($currentUrl);
// Si l'URL contient des query params
if (isset($parsedUrl['query'])) {
// Convertir les query params en tableau
parse_str($parsedUrl['query'], $queryParams);
// Retirer tous les paramètres commençant par _se
foreach ($queryParams as $key => $value) {
if (strpos($key, '_se') === 0) {
unset($queryParams[$key]);
}
}
// Reconstruire la query string
$newQueryString = http_build_query($queryParams);
// Reconstruire l'URL sans les paramètres _se
$newUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . $parsedUrl['path'];
if (!empty($newQueryString)) {
$newUrl .= '?' . $newQueryString;
}
return $newUrl;
}
// Si pas de query params, retourner l'URL telle qu'elle est
return $currentUrl;
}
/**
* @Route("/{slug}/produits/flashlearning", name="app_flashlearning")
*/
public function flashlearning(Client $client, Request $request, ClientProductRepository $clientProductRepository, FlashWorkshopRepository $flashWorkshopRepository, FlashTimeslotRepository $flashTimeslotRepository, FlashUserWorkshopRepository $flashUserWorkshopRepository, FlashWorkshopTypeRepository $flashWorkshopTypeRepository)
{
$hasFilters = null;
$hasDisplayFilter = null;
$hasEventTypeFilter = null;
$hasCategoryFilter = null;
$hasDateFilter = null;
$hasHourFilter = null;
$filtersCount = 0;
if (isset($_GET["search_flash_workshop"])) {
$hasFilters = true;
if (array_key_exists("pastEvent", $_GET["search_flash_workshop"]) || array_key_exists("limitParticipant", $_GET["search_flash_workshop"])) {
$hasDisplayFilter = true;
$filtersCount++;
}
if (array_key_exists("onLine", $_GET["search_flash_workshop"]) || array_key_exists("onSite", $_GET["search_flash_workshop"])) {
$hasEventTypeFilter = true;
$filtersCount++;
}
if (array_key_exists("category", $_GET["search_flash_workshop"])) {
$hasCategoryFilter = true;
$filtersCount++;
}
if (array_key_exists("date", $_GET["search_flash_workshop"])) {
$hasDateFilter = true;
$filtersCount++;
}
if (array_key_exists("hour", $_GET["search_flash_workshop"])) {
$hasHourFilter = true;
$filtersCount++;
}
}
if ($this->getUser()) {
$alreadyTakenTimeslot = $request->query->get('error');
$emptyDataError = $request->query->get('error-empty');
if ($alreadyTakenTimeslot != null) {
$alreadyTakenTimeslot = true;
} else {
$alreadyTakenTimeslot = false;
}
if ($emptyDataError != null) {
$emptyDataError = true;
} else {
$emptyDataError = false;
}
$data = new SearchFlashWorkshop();
if(isset($request->query->get('search_flash_workshop')['category']) && $request->query->get('search_flash_workshop')['category'] != null){
$data->category = $request->query->get('search_flash_workshop')['category'];
}
$form = $this->createForm(SearchFlashWorkshopType::class, $data);
$form->handleRequest($request);
$user = $this->getUser();
if(in_array('ROLE_ADMIN', $this->getUser()->getRoles()) == true){
$clientProducts = $clientProductRepository->getClientProductForThisUser(null, $client);
}else{
$clientProducts = $clientProductRepository->getClientProductForThisUser($user, null);
}
// Tableau des produits à afficher dans la navbar de l'accueil
$productsFromClientProducts = [];
// Collection des Flash Workshop à afficher
$flashWorkshopsList = [];
// Tableau des Flash User Workshop de l'utilisateur
$userFlashUserWorkshopsList = [];
// Récupération des Flash User Workshop de l'utilisateur
$userFlashUserWorkshops = $user->getFlashUserWorkshops();
// Tableau des Flash Workshop où l'utilisateur à un créneau
$flashWorkshopsReservedForUser = [];
// Récupération des deux prochaines sessions de l'utilisateur connecté
$userNextFlashTimeslots = $flashTimeslotRepository->getUserNextFlashTimeslots($user);
foreach ($userNextFlashTimeslots as $timeslot) {
$date = $timeslot->getDate();
$stringifiedDate = $date->format('D d M Y');
$timeslot->setStringifiedDate($stringifiedDate);
}
// Pour chaque Flash User Workshop de l'utilisateur, push dans le tableau des Flash User Workshop de l'utilisateur
foreach ($userFlashUserWorkshops as $userFlashUserWorkshop) {
array_push($userFlashUserWorkshopsList, $userFlashUserWorkshop);
}
// Pour chaque Flash User Workshop de l'utilisateur, récupération de son Flash Workshop, push le Flash Workshop dans le tableau des Flash Workshop où l'utilisateur à un créneau
foreach ($userFlashUserWorkshopsList as $userFlashUserWorkshop) {
$fwReserved = $userFlashUserWorkshop->getFlashWorkshop();
if (!in_array($fwReserved, $flashWorkshopsReservedForUser)) {
array_push($flashWorkshopsReservedForUser, $fwReserved);
}
}
foreach ($clientProducts as $clientProduct) {
if (!in_array($clientProduct->getProduct(), $productsFromClientProducts)) {
array_push($productsFromClientProducts, $clientProduct->getProduct());
}
// Récupération des Flash Workshop "Flashlearning"
if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
$flashWorkshops = $flashWorkshopRepository->getByClientProduct($clientProduct, $user, $data, $flashTimeslotRepository, $flashUserWorkshopRepository);
// dump($flashWorkshops);
foreach ($flashWorkshops as $flashWorkshop) {
$timeslotsCountForVerification = 0;
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
$timeslotsCountForVerification++;
}
if ($timeslotsCountForVerification > 0) {
$flashTimeslotExtractedDates = [];
$flashTimeslotByDateArray = [];
// Récupération de la date des Timeslots pour affichage
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
array_push($flashTimeslotExtractedDates, $timeslot->getDate());
}
}
sort($flashTimeslotExtractedDates);
// Formattage des dates récupérées pour affichage
foreach ($flashTimeslotExtractedDates as $date) {
$indexDate = $date->format('D d M Y');
$timeslotArray = [];
$timeslotsOrdered = $flashTimeslotRepository->getByFlashWorkshopAndHourAsc($flashWorkshop);
foreach ($timeslotsOrdered as $timeslot) {
if ($date == $timeslot->getDate()) {
array_push($timeslotArray, $timeslot);
$flashTimeslotByDateArray[$indexDate] = $timeslotArray;
}
}
}
$numwords = 25;
preg_match("/(\S+\s*){0,$numwords}/", $flashWorkshop->getDescription(), $regs);
$shortdesc = trim($regs[0]);
$restoredDesc = $this->restoreTags($shortdesc);
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop, 'timeslots' => $flashTimeslotByDateArray, 'shortDescription' => $restoredDesc];
array_push($flashWorkshopsList, $flashWorkshopFiltered);
} else {
$flashWorkshop->setIsOutdated(false);
$numwords = 25;
preg_match("/(\S+\s*){0,$numwords}/", $flashWorkshop->getDescription(), $regs);
$shortdesc = trim($regs[0]);
$restoredDesc = $this->restoreTags($shortdesc);
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop, 'timeslots' => [], 'shortDescription' => $restoredDesc];
array_push($flashWorkshopsList, $flashWorkshopFiltered);
}
}
$flashWorkshopRepository->getFullFlashWorkshop($flashUserWorkshopRepository, $flashWorkshops);
foreach ($flashWorkshops as $flashWorkshop) {
$timeslotsCountForVerification = 0;
if (count($flashWorkshop->getFlashTimeslots()) == 0) {
$flashWorkshop->setIsEmpty(true);
}
}
// Vérification si les timeslots ne sont pas tous à une date dépassée
foreach ($flashWorkshops as $flashWorkshop) {
$flashTimeslots = $flashWorkshop->getFlashTimeslots();
$timeslotsCountForVerification = 0;
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
$timeslotsCountForVerification++;
}
if ($timeslotsCountForVerification > 0) {
$timeslotsCount = count($flashTimeslots);
$timeslotsOutdatedCount = 0;
foreach ($flashTimeslots as $timeslot) {
if ($timeslot->getDate()->format('Y-m-d') < date('Y-m-d')) {
$timeslot->setIsOutdated(true);
$timeslotsOutdatedCount++;
}
}
if ($timeslotsOutdatedCount == $timeslotsCount) {
$flashWorkshop->setIsOutdated(true);
}
}
}
foreach ($flashWorkshopsList as $k => $flashWorkshopAndTimeslots) {
if ($flashWorkshopAndTimeslots['flashWorkshopEntity']->getIsOutdated() == true) {
$outdatedFlashWorkshop = $flashWorkshopsList[$k];
unset($flashWorkshopsList[$k]);
array_push($flashWorkshopsList, $outdatedFlashWorkshop);
}
$outdatedFlashTimeslotCount = 0;
$fullFlashTimeslotCount = 0;
$timeslotsTotalCount = 0;
foreach ($flashWorkshopAndTimeslots['timeslots'] as $timeslots) {
foreach ($timeslots as $timeslot) {
$timeslotsTotalCount++;
if ($timeslot->getIsFull() == true) {
$fullFlashTimeslotCount++;
}
if ($timeslot->getIsOutdated() == true) {
$outdatedFlashTimeslotCount++;
}
}
}
}
}
}
$categories = [];
$categoryEntities = $flashWorkshopTypeRepository->findAll();
foreach ($flashWorkshopsList as $flashWorkshopWithTimeslots) {
$fw = $flashWorkshopWithTimeslots['flashWorkshopEntity'];
if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
array_push($categories, $fw->getFlashWorkshopType()->getName());
}
}
// dd($flashWorkshopsList);
$content = $this->renderView('page/flashlearning.html.twig', [
'products' => $productsFromClientProducts,
'flashWorkshops' => $flashWorkshopsList,
'flashWorkshopsReservedForUser' => $flashWorkshopsReservedForUser,
'client' => $client,
'form' => $form->createView(),
'userNextFlashTimeslots' => $userNextFlashTimeslots,
'alreadyTakenTimeslot' => $alreadyTakenTimeslot,
'emptyDataError' => $emptyDataError,
'categories' => $categories,
'categoryEntities' => $categoryEntities,
'hasFilters' => $hasFilters,
'hasDisplayFilter' => $hasDisplayFilter,
'hasEventTypeFilter' => $hasEventTypeFilter,
'hasCategoryFilter' => $hasCategoryFilter,
'hasDateFilter' => $hasDateFilter,
'hasHourFilter' => $hasHourFilter,
'filtersCount' => $filtersCount,
]);
$viewWithCookie = $this->setCookie($client->getSlug(), $content);
return $viewWithCookie;
} else {
$alreadyTakenTimeslot = false;
$emptyDataError = false;
$productsFromClientProducts = [];
$flashWorkshopsList = [];
$clientProducts = $clientProductRepository->getClientProductsForUnloggedUser($client);
foreach ($clientProducts as $clientProduct) {
if (!in_array($clientProduct->getProduct(), $productsFromClientProducts)) {
array_push($productsFromClientProducts, $clientProduct->getProduct());
}
// Récupération des FW "Flashlearning"
if ($clientProduct->getProduct()->getSlug() == 'flashlearning') {
$flashWorkshops = $flashWorkshopRepository->getByClientProductUnloggedUser($clientProduct);
foreach ($flashWorkshops as $flashWorkshop) {
$flashTimeslotExtractedDates = [];
$flashTimeslotByDateArray = [];
// Récupération des dates des timeslots pour affichage
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
if (!in_array($timeslot->getDate(), $flashTimeslotExtractedDates)) {
array_push($flashTimeslotExtractedDates, $timeslot->getDate());
}
}
// Formattage des dates des Timeslots pour affichage
foreach ($flashTimeslotExtractedDates as $date) {
$indexDate = $date->format('D d M Y');
$timeslotArray = [];
foreach ($flashWorkshop->getFlashTimeslots() as $timeslot) {
if ($date == $timeslot->getDate()) {
array_push($timeslotArray, $timeslot);
$flashTimeslotByDateArray[$indexDate] = $timeslotArray;
}
}
}
$numwords = 10;
preg_match("/(\S+\s*){0,$numwords}/", $flashWorkshop->getDescription(), $regs);
$shortdesc = trim($regs[0]);
$restoredDesc = $this->restoreTags($shortdesc);
$flashWorkshopFiltered = ['flashWorkshopEntity' => $flashWorkshop, 'timeslots' => $flashTimeslotByDateArray, 'shortDescription' => $restoredDesc];
array_push($flashWorkshopsList, $flashWorkshopFiltered);
}
}
}
$categories = [];
foreach ($flashWorkshopsList as $flashWorkshopWithTimeslots) {
$fw = $flashWorkshopWithTimeslots['flashWorkshopEntity'];
if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
array_push($categories, $fw->getFlashWorkshopType()->getName());
}
}
$content = $this->renderView('page/flashlearning.html.twig', [
'products' => $productsFromClientProducts,
'flashWorkshops' => $flashWorkshopsList,
'flashWorkshopsReservedForUser' => [],
'client' => $client,
'alreadyTakenTimeslot' => $alreadyTakenTimeslot,
'emptyDataError' => $emptyDataError,
'categories' => $categories,
'hasFilters' => $hasFilters,
'hasDisplayFilter' => $hasDisplayFilter,
'hasEventTypeFilter' => $hasEventTypeFilter,
'hasCategoryFilter' => $hasCategoryFilter,
'hasDateFilter' => $hasDateFilter,
'hasHourFilter' => $hasHourFilter,
]);
$viewWithCookie = $this->setCookie($client->getSlug(), $content);
return $viewWithCookie;
}
}
/**
* @Route("/{slug}/produits/defi-inclusion", name="app_defi-inclusion")
* @Security("is_granted('ROLE_USER')")
*/
public function inclusionDefi(Client $client, Request $request, ClientProductRepository $clientProductRepository, DefiSlideRepository $defiSlideRepository, UserProductRepository $userProductRepository, DefiQuestionRepository $defiQuestionRepository, DefiAnswerUserRepository $defiAnswerUserRepository, ManagerRegistry $doctrine)
{
$form = $this->createForm(DisabledQuizzFormType::class);
$form->handleRequest($request);
$forcedForm = $this->createForm(ForcedDisabledFormType::class);
$forcedForm->handleRequest($request);
$clientProducts = $clientProductRepository->getIncomingDefiByClient($this->getUser()->getClient());
$now = new DateTime();
foreach ($clientProducts as $clientProduct) {
$firstSlide = $defiSlideRepository->getFirstSlideForClientProduct($clientProduct);
$interval = $now->diff($clientProduct->getEndAt());
$clientProduct->setInterval($interval->format('%a'));
$clientProduct->setFirstSlide($firstSlide);
$userProduct = $userProductRepository->findOneBy(['clientProduct' => $clientProduct, 'user' => $this->getUser()]);
if ($userProduct != null) {
$clientProduct->setUserHasUserProduct(true);
}
}
if ($form->isSubmitted() && $form->isValid()) {
// dd('ici');
$clientProduct = $clientProductRepository->findOneById($form->get('clientProduct')->getData());
$alreadyExistingUserProduct = $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $clientProduct);
if ($alreadyExistingUserProduct == null) {
$userProduct = new UserProduct();
$userProduct->setUser($this->getUser());
$userProduct->setClientProduct($clientProduct);
if ($clientProduct->isForcedDisabled() == true) {
$userProduct->setDisabledSituation(true);
} else if ($form->get('yesOrNo')->getData() == "1") {
$userProduct->setDisabledSituation(true);
} else {
$userProduct->setDisabledSituation(false);
}
$userProduct->setHasDone(false);
$userProduct->setCreatedAt(new DateTime());
$userProduct->setModifiedAt(new DateTime());
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
} else {
$firstUnansweredQuestion = [];
// Retrieve the good quizz
$clientProductSlides = $defiSlideRepository->findBy(['clientProduct' => $clientProduct]);
foreach ($clientProductSlides as $slide) {
// If slide contains questions
if ($slide->getDefiSlideType()->getName() != 'contenu' && $slide->getDefiSlideType()->getName() != 'fin') {
foreach ($slide->getDefiQuestions() as $question) {
// Rertrieve user answer for this question
$userAnswer = $defiAnswerUserRepository->findOneBy(['defiQuestion' => $question, 'user' => $this->getUser()]);
// If no answer put question in a array and use the first question in the array for the redirection
if ($userAnswer == null) {
array_push($firstUnansweredQuestion, $question);
}
}
}
}
if (!empty($firstUnansweredQuestion)) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $firstUnansweredQuestion[0]->getDefiSlide()->getId(), 'questionId' => $firstUnansweredQuestion[0]->getId()], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'cascade' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'question' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'vote') {
$firstQuestion = $defiQuestionRepository->findOneBy(['defiSlide' => $clientProduct->getFirstSlide(), 'position' => 1, 'isActive' => 1]);
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId(), 'questionId' => $firstQuestion->getId()], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($forcedForm->isSubmitted() && $forcedForm->isValid()) {
$clientProduct = $clientProductRepository->findOneById($forcedForm->get('clientProduct')->getData());
$alreadyExistingUserProduct = $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $clientProduct);
if ($alreadyExistingUserProduct == null) {
$userProduct = new UserProduct();
$userProduct->setUser($this->getUser());
$userProduct->setClientProduct($clientProduct);
$userProduct->setDisabledSituation(true);
$userProduct->setHasDone(false);
$userProduct->setCreatedAt(new DateTime());
$userProduct->setModifiedAt(new DateTime());
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
} else {
$firstUnansweredQuestion = [];
// Retrieve the good quizz
$clientProductSlides = $defiSlideRepository->findBy(['clientProduct' => $clientProduct]);
foreach ($clientProductSlides as $slide) {
// If slide contains questions
if ($slide->getDefiSlideType()->getName() != 'contenu' && $slide->getDefiSlideType()->getName() != 'fin') {
foreach ($slide->getDefiQuestions() as $question) {
// Rertrieve user answer for this question
$userAnswer = $defiAnswerUserRepository->findOneBy(['defiQuestion' => $question, 'user' => $this->getUser()]);
// If no answer put question in a array and use the first question in the array for the redirection
if ($userAnswer == null) {
array_push($firstUnansweredQuestion, $question);
}
}
}
}
if (!empty($firstUnansweredQuestion)) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $firstUnansweredQuestion[0]->getDefiSlide()->getId(), 'questionId' => $firstUnansweredQuestion[0]->getId()], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'cascade' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'question' || $clientProduct->getFirstSlide()->getDefiSlideType()->getName() == 'vote') {
$firstQuestion = $defiQuestionRepository->findOneBy(['defiSlide' => $clientProduct->getFirstSlide(), 'position' => 1, 'isActive' => 1]);
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId(), 'questionId' => $firstQuestion->getId()], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $clientProduct->getFirstSlide()->getId()], Response::HTTP_SEE_OTHER);
}
}
if ($userProduct != null && $userProduct->isHasDone() == true ){
return $this->redirectToRoute('app_inclusion_defi_quizz_ranking', ['id' => $clientProduct->getId()], Response::HTTP_SEE_OTHER);
}
$content = $this->renderView('page/defi_inclusion.html.twig', [
'clientProducts' => $clientProducts,
'form' => $form->createView(),
'client' => $client,
'userProduct' => $userProduct,
'forcedForm' => $forcedForm->createView()
]);
$viewWithCookie = $this->setCookie($client->getSlug(), $content);
return $viewWithCookie;
}
/**
* @Route("/produits/defi-inclusion/quizz/resultats", name="app_inclusion_defi_quizz_result")
* @Security("is_granted('ROLE_USER')")
*/
public function inclusionDefiQuizzResult(
UserProductRepository $userProductRepository,
DefiQuestionRepository $defiQuestionRepository,
DefiSlideRepository $defiSlideRepository,
DefiAnswerRepository $defiAnswerRepository,
DefiAnswerUserRepository $defiAnswerUserRepository,
ManagerRegistry $doctrine,
Request $request,
MailerInterface $mailer
) {
$userProduct = $userProductRepository->findOneBy(['user' => $this->getUser()], ['id' => 'DESC']);
if ($request->isMethod('post')) {
$rootUrl = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . '/';
$getEmails = explode("\r\n", $request->request->get('email'));
foreach ($getEmails as $email) {
$invitationMail = (new TemplatedEmail())
->from(new Address('no-reply@avisea.net', 'Ween'))
->context(['userProduct' => $userProduct, 'platformUrl' => $rootUrl])
->to($email)
->subject('Invitation au Défi de l\'inclusion')
->htmlTemplate('email/invitation.html.twig');
$mailer->send($invitationMail);
}
}
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
$slides = $defiSlideRepository->findByClientProduct($userProduct->getClientProduct());
$totalQuestionCount = 0;
$goodAnswerCount = 0;
foreach ($slides as $slide) {
$totalQuestionCount = $totalQuestionCount + count($slide->getDefiQuestions());
$questions = $defiQuestionRepository->findByDefiSlide($slide);
if ($slide->getDefiSlideType()->getName() == 'cascade') {
$deniedLocationsArray = [];
$questionsCascade = $slide->getDefiQuestions();
foreach ($questionsCascade as $question) {
$deniedLocations = $question->getDeniedLocation();
foreach ($deniedLocations as $location) {
if (!in_array($location->getName(), $deniedLocationsArray)) {
array_push($deniedLocationsArray, $location->getName());
}
}
}
if($this->getUser()->getLocation() != null){
if (in_array($this->getUser()->getLocation()->getName(), $deniedLocationsArray)) {
$totalQuestionCount = $totalQuestionCount - count($slide->getDefiQuestions());
}
}
}
foreach ($questions as $question) {
if ($question->getDefiSlide()->getDefiSlideType()->getName() != 'cascade') {
foreach ($question->getDeniedLocation() as $location) {
if ($location == $this->getUser()->getLocation()) {
$totalQuestionCount--;
}
}
}
switch ($question->getDefiQuestionType()->getName()) {
case 'mcq':
$givenUserAnswers = $defiAnswerUserRepository->findBy(['user' => $this->getUser(), 'defiQuestion' => $question]);
if ($givenUserAnswers != null) {
$answersArray = [];
foreach ($givenUserAnswers as $givenAnswer) {
array_push($answersArray, $givenAnswer->getDefiAnswer()->getId());
}
$goodAnswersArray = [];
$goodAnswers = $defiAnswerRepository->findBy(['defiQuestion' => $question, 'isCorrect' => true]);
foreach ($goodAnswers as $goodAnswer) {
array_push($goodAnswersArray, $goodAnswer->getId());
}
if (array_diff($answersArray, $goodAnswersArray) == null) {
$goodAnswerCount++;
if ($userProduct->isHasDone() == false) {
if ($userProduct->getScore() != null) {
$score = $userProduct->getScore() + $question->getPoint();
$userProduct->setScore($score);
} else {
$userProduct->setScore($question->getPoint());
}
}
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
} else {
if ($userProduct->isHasDone() == false) {
if ($userProduct->getScore() == null) {
$userProduct->setScore(0);
}
}
}
}
break;
case 'sqc':
case 'tf':
$givenUserAnswer = $defiAnswerUserRepository->findOneBy(['user' => $this->getUser(), 'defiQuestion' => $question]);
if ($givenUserAnswer != null) {
$givenAnswer = $givenUserAnswer->getDefiAnswer();
$goodAnswer = $defiAnswerRepository->findOneBy(['defiQuestion' => $question, 'isCorrect' => true]);
if ($givenAnswer === $goodAnswer) {
$goodAnswerCount++;
if ($userProduct->isHasDone() == false) {
if ($userProduct->getScore() != null) {
$score = $userProduct->getScore() + $question->getPoint();
$userProduct->setScore($score);
} else {
$userProduct->setScore($question->getPoint());
}
}
} else {
if ($userProduct->isHasDone() == false) {
if ($userProduct->getScore() == null) {
$userProduct->setScore(0);
}
}
}
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
}
break;
}
}
}
$userProduct->setHasDone(true);
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
$allUserProducts = $userProductRepository->findBy(['clientProduct' => $userProduct->getClientProduct(), 'hasDone' => true]);
$averagePoints = 0;
foreach ($allUserProducts as $uProduct) {
$averagePoints = $averagePoints + $uProduct->getScore();
}
$averageScore = $averagePoints / count($allUserProducts);
$roundedAverageScore = round($averageScore);
return $this->render('page/quizz_result.html.twig', [
'questionCount' => $totalQuestionCount,
'goodAnswerCount' => $goodAnswerCount,
'userProduct' => $userProduct,
'averageScore' => $roundedAverageScore,
'client' => $userProduct->getClientProduct()->getClient(),
]);
}
/**
* @Route("/produits/defi-inclusion/quizz/{id}/{questionId}", name="app_inclusion_defi_quizz")
* @Security("is_granted('ROLE_USER')")
*/
public function inclusionDefiQuizz(Request $request, $questionId = null, DefiSlide $defiSlide, DefiSlideRepository $defiSlideRepository, DefiAnswerRepository $defiAnswerRepository, DefiQuestionRepository $defiQuestionRepository, UserProductRepository $userProductRepository, DefiAnswerUserRepository $defiAnswerUserRepository, ManagerRegistry $doctrine)
{
$client = $defiSlide->getClientProduct()->getClient();
$nextSlide = $defiSlideRepository->nextDefiSlideForClientProduct($defiSlide->getClientProduct(), $defiSlide->getPosition());
$previousSlide = $defiSlideRepository->previousDefiSlideForClientProduct($defiSlide->getClientProduct(), $defiSlide->getPosition());
if(in_array('ROLE_ADMIN', $this->getUser()->getRoles()) == true){
$existingUserProduct = $userProductRepository->findOneBy(['user' => $this->getUser(), 'clientProduct' => $defiSlide->getClientProduct()]);
if($existingUserProduct != null){
$userProduct = $existingUserProduct;
}else{
$newUserProduct = new UserProduct();
$userProduct = $userProductRepository->add($newUserProduct, $this->getUser(), $defiSlide->getClientProduct(), true);
}
}else{
$userProduct = $userProductRepository->getOneByUserAndClientProduct($this->getUser(), $defiSlide->getClientProduct());
}
$allSlides = $defiSlideRepository->findByClientProduct($userProduct->getClientProduct());
if($defiSlide->getDefiSlideType()->getName() == 'contenu'){
$getImageExtension = explode(".", $defiSlide->getMedia());
if (isset($getImageExtension[1])) {
$extensionsImages = array(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp");
$imageExtension = '.' . $getImageExtension[1];
if (in_array($imageExtension, $extensionsImages)) {
$defiSlide->setIsMediaAVideo(false);
} else {
$defiSlide->setIsMediaAVideo(true);
}
}
}
if ($userProduct->isDisabledSituation() == true && $defiSlide->getDefiSlideType()->getName() == 'contenu' && $defiSlide->getPosition() == 1) {
$diseases = [];
$clientProduct = $defiSlide->getClientProduct();
$slides = $clientProduct->getDefiSlides();
foreach ($slides as $slide) {
$questions = $slide->getDefiQuestions();
foreach ($questions as $question) {
if ($question->getDisease() != null && !in_array($question->getDisease()->getTitle(), $diseases)) {
array_push($diseases, $question->getDisease()->getTitle());
}
}
}
} else {
$diseases = null;
}
// Si nous sommes actuellement sur une question
if ($questionId != null) {
$actualQuestion = $defiQuestionRepository->findOneById($questionId);
if ($defiSlide->getDefiSlideType()->getName() != 'cascade') {
// Récupération de la prochaine question DE LA SLIDE EN COURS
$nextQuestion = $defiQuestionRepository->getNextQuestion($defiSlide, $actualQuestion->getPosition());
} else {
$nextQuestion = null;
}
// Récupération de la première question DE LA PROCHAINE SLIDE si il y en a une et si il n'y a plus de question pour la slide en cours
if ($nextQuestion == null) {
$actualPosition = 0;
if ($nextSlide != null) {
$nextSlideNextQuestion = $defiQuestionRepository->getNextQuestion($nextSlide, $actualPosition);
} else {
$nextSlideNextQuestion = null;
}
}
if ($actualQuestion->getDefiSlide()->getDefiSlideType()->getId() == 'cascade') {
$slideQuestions = $actualQuestion->getDefiSlide()->getDefiQuestions();
$deniedLocations = [];
foreach ($slideQuestions as $question) {
foreach ($question->getDeniedLocation() as $location) {
if (!in_array($location->getName(), $deniedLocations)) {
array_push($deniedLocations, $location->getName());
}
}
}
if (in_array($this->getUser()->getLocation()->getName(), $deniedLocations)) {
// Plus de slide, plus de question = fin du quizz
if ($nextSlide == null && $nextQuestion == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
// Prochaine slide de type 'contenu'
} elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
// Première question de la slide suivante
} elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
} else {
$deniedLocations = $actualQuestion->getDeniedLocation();
foreach ($deniedLocations as $location) {
if ($this->getUser()->getLocation() == $location) {
// Prochaine question, même slide
if ($nextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
// Plus de slide, plus de question = fin du quizz
} elseif ($nextSlide == null && $nextQuestion == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
// Prochaine slide de type 'contenu'
} elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
// Première question de la slide suivante
} elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
}
}
} else {
if ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'question' || $nextSlide->getDefiSlideType()->getName() == 'cascade' || $nextSlide->getDefiSlideType()->getName() == 'vote')) {
$nextQuestion = $defiQuestionRepository->getFirstQuestion($nextSlide);
}
$actualQuestion = null;
}
$totalSlideCount = count($allSlides);
$hiddenQuestions = [];
$hiddenSlides = [];
foreach ($allSlides as $slide) {
$questionsCount = count($slide->getDefiQuestions());
$hiddenQuestionCount = 0;
if($this->getUser()->getLocation() != null){
foreach ($slide->getDefiQuestions() as $question) {
foreach ($question->getDeniedLocation() as $location) {
if ($location->getName() == $this->getUser()->getLocation()->getName()) {
$hiddenQuestionCount++;
if (!in_array($question, $hiddenQuestions)) {
array_push($hiddenQuestions, $question);
}
}
}
}
}
if ($questionsCount > 0 && $hiddenQuestionCount > 0 && $questionsCount == $hiddenQuestionCount && $slide->getDefiSlideType()->getName() != 'cascade') {
$totalSlideCount--;
if (!in_array($slide, $hiddenSlides)) {
array_push($hiddenSlides, $slide);
}
} elseif ($questionsCount > 0 && $hiddenQuestionCount > 0 && $slide->getDefiSlideType()->getName() == 'cascade') {
$totalSlideCount--;
if (!in_array($slide, $hiddenSlides)) {
array_push($hiddenSlides, $slide);
}
}
}
foreach ($previousSlide as $k => $slide) {
if (!in_array($slide, $hiddenSlides)) {
unset($previousSlide[$k]);
}
}
$previousHiddenSlides = array_values($previousSlide);
$previousHiddenSlidesToCompare = [];
$hiddenSlidesToCompare = [];
foreach ($previousHiddenSlides as $slide) {
array_push($previousHiddenSlidesToCompare, $slide->getTitle());
}
foreach ($hiddenSlides as $slide) {
array_push($hiddenSlidesToCompare, $slide->getTitle());
}
if ((!empty($previousHiddenSlides) && !empty($hiddenSlides)) && ($previousHiddenSlides == $hiddenSlides || in_array($previousHiddenSlidesToCompare[0], $hiddenSlidesToCompare))) {
$actualQuestionSlidePosition = $defiSlide->getPosition() - 1;
} else {
$actualQuestionSlidePosition = null;
}
if ($request->isMethod('post')) {
if ($defiSlide->getDefiSlideType()->getName() == 'contenu' && $nextSlide != null) {
if ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin') {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
if (($defiSlide->getDefiSlideType()->getName() == 'contenu' || $defiSlide->getDefiSlideType()->getName() == 'fin') && $nextSlide == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
}
if ($defiSlide->getDefiSlideType()->getName() == 'question' || $defiSlide->getDefiSlideType()->getName() == 'cascade' || $defiSlide->getDefiSlideType()->getName() == 'vote') {
if ($request->request->all() == null) {
$alreadyExistingUserAnswer = $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
if ($alreadyExistingUserAnswer == null) {
$emptyFormError = 'Veuillez répondre à la question pour continuer.';
return $this->render('page/defi_slide.html.twig', [
'defiSlide' => $defiSlide,
'actualQuestion' => $actualQuestion,
'diseases' => $diseases,
'emptyFormError' => $emptyFormError,
'slideCount' => $totalSlideCount,
'userProduct' => $userProduct,
'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
'client' => $client
]);
} else {
// Prochaine question, même slide
if ($nextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
// Plus de slide, plus de question = fin du quizz
} elseif ($nextSlide == null && $nextQuestion == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
// Prochaine slide de type 'contenu'
} elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
// Première question de la slide suivante
} elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
}
$dateTimeObject = new DateTime();
$userProduct->setModifiedAt($dateTimeObject);
$doctrine->getManager()->persist($userProduct);
$doctrine->getManager()->flush();
if (is_array($request->request->get('answer'))) {
$alreadyExistingUserAnswer = $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
if ($alreadyExistingUserAnswer == null) {
$defiAnswerUserArray = [];
foreach ($request->request->get('answer') as $answer) {
$submittedAnswerIsCorrect = explode("|", $answer)[0];
$submittedAnswerId = explode("|", $answer)[1];
$submittedAnswerQuestionId = explode("|", $answer)[2];
$submittedAnswer = $defiAnswerRepository->findOneById($submittedAnswerId);
$submittedAnswerQuestion = $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
$defiAnswerUser = new DefiAnswerUser();
$defiAnswerUser->setDefiAnswer($submittedAnswer);
$defiAnswerUser->setUser($this->getUser());
$defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
if ($submittedAnswerIsCorrect == "1") {
$defiAnswerUser->setIsCorrect(true);
} else {
$defiAnswerUser->setIsCorrect(false);
}
$defiAnswerUser->setCreatedAt($dateTimeObject);
$defiAnswerUser->setModifiedAt($dateTimeObject);
$doctrine->getManager()->persist($defiAnswerUser);
$doctrine->getManager()->flush();
array_push($defiAnswerUserArray, $defiAnswerUser);
if ($submittedAnswer->isIsCorrect() == true) {
$submittedAnswer->setIsValidated(true);
} else {
$submittedAnswer->setIsValidated(false);
}
}
$submittedGoodAnswerCount = 0;
$submittedBadAnswerCount = 0;
foreach ($defiAnswerUserArray as $defiAnswerUser) {
if ($defiAnswerUser->isIsCorrect() == true) {
$submittedGoodAnswerCount++;
} else {
$submittedBadAnswerCount++;
}
}
$goodAnswerCount = 0;
foreach ($actualQuestion->getDefiAnswers() as $answer) {
if ($answer->isIsCorrect() == true) {
$goodAnswerCount++;
}
}
if ($submittedGoodAnswerCount == $goodAnswerCount && $submittedBadAnswerCount == 0) {
$validatedMcq = true;
} else {
$validatedMcq = false;
}
return $this->render('page/defi_slide.html.twig', [
'defiSlide' => $defiSlide,
'actualQuestion' => $actualQuestion,
'diseases' => $diseases,
'validationMultipleChoice' => true,
'slideCount' => $totalSlideCount,
'validatedMcq' => $validatedMcq,
'userProduct' => $userProduct,
'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
'client' => $client
]);
}
} elseif (array_key_exists('answer1', $request->request->all())) {
$alreadyExistingUserAnswer = $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $actualQuestion);
if ($alreadyExistingUserAnswer == null) {
$defiAnswerUserArray = [];
$validatedQuestionsCount = 0;
foreach ($request->request->all() as $answer) {
$submittedAnswerIsCorrect = explode("|", $answer)[0];
$submittedAnswerId = explode("|", $answer)[1];
$submittedAnswerQuestionId = explode("|", $answer)[2];
$submittedAnswer = $defiAnswerRepository->findOneById($submittedAnswerId);
$submittedAnswerQuestion = $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
$defiAnswerUser = new DefiAnswerUser();
$defiAnswerUser->setDefiAnswer($submittedAnswer);
$defiAnswerUser->setUser($this->getUser());
$defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
if ($submittedAnswerIsCorrect == "1") {
$defiAnswerUser->setIsCorrect(true);
} else {
$defiAnswerUser->setIsCorrect(false);
}
$defiAnswerUser->setCreatedAt($dateTimeObject);
$defiAnswerUser->setModifiedAt($dateTimeObject);
$doctrine->getManager()->persist($defiAnswerUser);
$doctrine->getManager()->flush();
array_push($defiAnswerUserArray, $defiAnswerUser);
if ($submittedAnswer->isIsCorrect() == true) {
$submittedAnswer->setIsValidated(true);
$submittedAnswer->getDefiQuestion()->setIsValidated(true);
$validatedQuestionsCount++;
} else {
$submittedAnswer->setIsValidated(false);
$submittedAnswer->getDefiQuestion()->setIsValidated(false);
}
if ($validatedQuestionsCount == 0) {
$validatedCascade = 'KO';
} elseif ($validatedQuestionsCount == count($defiSlide->getDefiQuestions())) {
$validatedCascade = 'OK';
} elseif ($validatedQuestionsCount >= 1) {
$validatedCascade = 'NOK';
}
}
return $this->render('page/defi_slide.html.twig', [
'defiSlide' => $defiSlide,
'actualQuestion' => $actualQuestion,
'diseases' => $diseases,
'slideCount' => $totalSlideCount,
'validationCascade' => true,
'userProduct' => $userProduct,
'validatedCascade' => $validatedCascade,
'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
'client' => $client
]);
}
} else {
$submittedAnswerIsCorrect = explode("|", $request->request->get('answer'))[0];
$submittedAnswerId = explode("|", $request->request->get('answer'))[1];
$submittedAnswerQuestionId = explode("|", $request->request->get('answer'))[2];
$submittedAnswer = $defiAnswerRepository->findOneById($submittedAnswerId);
$submittedAnswerQuestion = $defiQuestionRepository->findOneById($submittedAnswerQuestionId);
$extensionsImages = array(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp");
$getImageExtension = explode(".", $submittedAnswerQuestion->getExplanationMedia());
if (isset($getImageExtension[1])) {
$imageExtension = '.' . $getImageExtension[1];
if (in_array($imageExtension, $extensionsImages)) {
$submittedAnswerQuestion->setIsMediaAVideo(false);
} else {
$submittedAnswerQuestion->setIsMediaAVideo(true);
}
}
$alreadyExistingUserAnswer = $defiAnswerUserRepository->getOneByUserAndQuestion($this->getUser(), $submittedAnswerQuestion);
if ($alreadyExistingUserAnswer == null) {
$defiAnswerUser = new DefiAnswerUser();
$defiAnswerUser->setDefiAnswer($submittedAnswer);
$defiAnswerUser->setUser($this->getUser());
$defiAnswerUser->setDefiQuestion($submittedAnswerQuestion);
if ($submittedAnswerIsCorrect == "1" || $defiSlide->getDefiSlideType()->getId() == 5) {
$defiAnswerUser->setIsCorrect(true);
} else {
$defiAnswerUser->setIsCorrect(false);
}
$defiAnswerUser->setCreatedAt(new DateTime());
$defiAnswerUser->setModifiedAt(new DateTime());
$doctrine->getManager()->persist($defiAnswerUser);
$doctrine->getManager()->flush();
if ($submittedAnswer->isIsCorrect() == true && $defiSlide->getDefiSlideType()->getId() != 5) {
$submittedAnswer->setIsValidated(true);
} else {
$submittedAnswer->setIsValidated(false);
}
if ($defiSlide->getDefiSlideType()->getId() == 5) {
// Prochaine question, même slide
if ($nextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
// Plus de slide, plus de question = fin du quizz
} elseif ($nextSlide == null && $nextQuestion == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
// Prochaine slide de type 'contenu'
} elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'fin')) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
// Première question de la slide suivante
} elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
return $this->render('page/defi_slide.html.twig', [
'defiSlide' => $defiSlide,
'actualQuestion' => $actualQuestion,
'diseases' => $diseases,
'validationSingleChoice' => true,
'slideCount' => $totalSlideCount,
'defiAnswerUser' => $defiAnswerUser,
'userProduct' => $userProduct,
'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
'client' => $client
]);
}
}
// Prochaine question, même slide
if ($nextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $defiSlide->getId(), 'questionId' => $nextQuestion->getId()], Response::HTTP_SEE_OTHER);
// Plus de slide, plus de question = fin du quizz
} elseif ($nextSlide == null && $nextQuestion == null) {
return $this->redirectToRoute('app_inclusion_defi_quizz_result', [], Response::HTTP_SEE_OTHER);
// Prochaine slide de type 'contenu'
} elseif ($nextSlide != null && ($nextSlide->getDefiSlideType()->getName() == 'contenu' || $nextSlide->getDefiSlideType()->getName() == 'contenu')) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlide->getId()], Response::HTTP_SEE_OTHER);
// Première question de la slide suivante
} elseif (isset($nextSlideNextQuestion) && $nextSlideNextQuestion != null) {
return $this->redirectToRoute('app_inclusion_defi_quizz', ['id' => $nextSlideNextQuestion->getDefiSlide()->getId(), 'questionId' => $nextSlideNextQuestion->getId()], Response::HTTP_SEE_OTHER);
}
}
}
return $this->render('page/defi_slide.html.twig', [
'defiSlide' => $defiSlide,
'actualQuestion' => $actualQuestion,
'diseases' => $diseases,
'slideCount' => $totalSlideCount,
'userProduct' => $userProduct,
'actualQuestionSlidePosition' => $actualQuestionSlidePosition,
'client' => $client
]);
}
/**
* @Route("/produits/defi-inclusion/{id}/classement", name="app_inclusion_defi_quizz_ranking")
* @Security("is_granted('ROLE_USER')")
*/
public function inclusionDefiQuizzRanking(ClientProduct $clientProduct, UserProductRepository $userProductRepository, UserRepository $userRepository)
{
$userProduct = $userProductRepository->findOneBy(['user' => $this->getUser(), 'clientProduct' => $clientProduct, 'hasDone' => true]);
$client = $userProduct->getClientProduct()->getClient();
$locations = $userProduct->getClientProduct()->getClient()->getLocations();
$subLocations = $userProduct->getClientProduct()->getClient()->getSubLocations();
$userProductsByLocation = [];
$userProductsBySubLocation = [];
$locationsArray = [];
$subLocationsArray = [];
foreach ($locations as $location) {
$locationsArray[$location->getName()] = 0;
$score = 0;
$users = $userRepository->findByLocation($location);
foreach ($users as $user) {
$userProductsByLocation = $userProductRepository->findBy(['user' => $user, 'hasDone' => true]);
foreach ($userProductsByLocation as $userProductByLocation) {
$score = $score + $userProductByLocation->getScore();
$locationsArray[$location->getName()] = $score;
}
}
}
arsort($locationsArray);
foreach ($subLocations as $subLocation) {
$subLocationsArray[$subLocation->getName()] = 0;
$score = 0;
$users = $userRepository->findBySubLocation($subLocation);
foreach ($users as $user) {
$userProductsBySubLocation = $userProductRepository->findBy(['user' => $user, 'hasDone' => true]);
foreach ($userProductsBySubLocation as $userProductBySubLocation) {
$score = $score + $userProductBySubLocation->getScore();
$subLocationsArray[$subLocation->getName()] = $score;
}
}
}
arsort($subLocationsArray);
$allUserProducts = $userProductRepository->findBy(['clientProduct' => $userProduct->getClientProduct(), 'hasDone' => true], ['score' => 'DESC', 'modifiedAt' => 'ASC']);
$averagePoints = 0;
foreach ($allUserProducts as $uProduct) {
$averagePoints = $averagePoints + $uProduct->getScore();
}
$averageScore = $averagePoints / count($allUserProducts);
$roundedAverageScore = round($averageScore);
$active = '';
if($clientProduct->isHasSubLocationLadder() == true){
$active = 'sublocation';
}
if($clientProduct->isHasUserLadder() == true){
$active = 'individual';
}
if($clientProduct->isHasLocationLadder() == true){
$active = 'location';
}
return $this->render('page/defi_inclusion_ranking.html.twig', [
'userProduct' => $userProduct,
'allUserProducts' => $allUserProducts,
'averageScore' => $roundedAverageScore,
'locationsArray' => $locationsArray,
'subLocationsArray' => $subLocationsArray,
'clientProduct' => $clientProduct,
'client' => $client,
'active' => $active
]);
}
/**
* @Route("/{slug}/produits/outils-diagnostic", name="app_diag_tools")
*/
public function diagTools(Client $client)
{
$clientProducts = [];
foreach ($client->getClientProducts() as $clientProduct) {
if ($clientProduct->getProduct()->isIsAutoDiag() == true && $clientProduct->getStartAt() <= new DateTime() && $clientProduct->getEndAt() >= new DateTime() && $clientProduct->isIsActive() == true) {
array_push($clientProducts, $clientProduct);
}
}
$content = $this->renderView('page/diag_tools.html.twig', [
'client' => $client,
'clientProducts' => $clientProducts
]);
$viewWithCookie = $this->setCookie($client->getSlug(), $content);
return $viewWithCookie;
}
/**
* @Route("/supprimer-flash-user-workshop/{userSalt}/{id}", name="app_flash_user_workshop_delete")
*/
public function flashUserWorkshopDelete(Request $request, $userSalt, FlashUserWorkshop $flashUserWorkshop, FlashUserWorkshopRepository $flashUserWorkshopRepository, EntityManagerInterface $entityManager, MailerInterface $mailer, LoginLinkHandlerInterface $loginLinkHandler, UserRepository $userRepository, ClientRepository $clientRepository): Response
{
if ($flashUserWorkshop->getUser()->getSalt() == $userSalt) {
if ($flashUserWorkshop->isInQueue() == false) {
$flashTimeslot = $flashUserWorkshop->getFlashTimeslot();
$flashWorkshop = $flashUserWorkshop->getFlashWorkshop();
$clientColor = $flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getMainColor();
$flashUserWorkshopRepository->remove($flashUserWorkshop, true);
$deleteFuwEmail = (new TemplatedEmail())
->context([
'flashUserWorkshop' => $flashUserWorkshop,
'timeslot' => $flashTimeslot,
'clientColor' => $clientColor
])
->from(new Address('no-reply@avisea.net', $flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getName() . ' - ' . $flashTimeslot->getFlashWorkshop()->getClientProduct()->getClient()->getBaseline()))
->to($flashUserWorkshop->getUser()->getEmail())
->subject('Votre inscription a été supprimée')
->htmlTemplate('email/delete_flash_user_workshop.html.twig');
$mailer->send($deleteFuwEmail);
// Récupération du dernier flash user workshop en attente pr ce flashWorkshop
$flashUserWorkshopToUpdate = $flashUserWorkshopRepository->getLastInQueueForOneFlashTimeslot($flashTimeslot);
// Si FUW existe, on le met à jour en le sortant de la liste d'attente
if (!empty($flashUserWorkshopToUpdate)) {
$flashUserWorkshopToUpdate->setInQueue(false);
$entityManager->persist($flashUserWorkshopToUpdate);
$entityManager->flush();
$email = $flashUserWorkshopToUpdate->getUser()->getEmail();
$user = $flashUserWorkshopToUpdate->getUser();
$loginLinkDetails = $loginLinkHandler->createLoginLink($user);
$loginLink = $loginLinkDetails->getUrl();
$client = $user->getClient();
// Mail
$email = (new TemplatedEmail())
->context([
'loginLink' => $loginLink,
'flashUserWorkshopId' => $flashUserWorkshopToUpdate->getId(),
'client' => $client,
'flashUserWorkshop' => $flashUserWorkshop,
'clientSalt' => $flashUserWorkshopToUpdate->getUser()->getSalt()
])
->from(new Address('no-reply@avisea.net', $client->getName() . ' - ' . $client->getBaseline()))
->to($flashUserWorkshopToUpdate->getUser()->getEmail())
->subject('Votre inscription est confirmée suite à un désistement')
->htmlTemplate('email/out_waiting_list.html.twig');
$mailer->send($email);
}
} else {
$flashUserWorkshopRepository->remove($flashUserWorkshop, true);
}
$route = $request->headers->get('referer');
if ($route != null) {
return $this->redirect($route);
} else {
$user = $userRepository->findOneBySalt($userSalt);
$client = $user->getClient();
return $this->redirectToRoute('app_main', ['clientSlug' => $client->getSlug()]);
}
} else {
throw new AccessDeniedHttpException();
}
}
/**
* @Route("/mon-compte/mon-agenda", name="app_my_agenda")
* @Security("is_granted('ROLE_USER')")
*/
public function myAgenda(Request $request, ClientRepository $clientRepository, FlashUserWorkshopRepository $flashUserWorkshopRepository, FlashTimeslotRepository $flashTimeslotRepository, FlashWorkshopTypeRepository $flashWorkshopTypeRepository)
{
$client = $clientRepository->findOneBySlug($this->getUser()->getClient()->getSlug());
// Formulaire de recherche
$data = new SearchFlashWorkshopAgenda();
if(isset($request->query->get('search_flash_workshop_agenda')['category']) && $request->query->get('search_flash_workshop_agenda')['category'] != null){
$data->category = $request->query->get('search_flash_workshop_agenda')['category'];
}
$form = $this->createForm(SearchFlashWorkshopAgendaType::class, $data);
$form->handleRequest($request);
$timeslotsArray = $flashUserWorkshopRepository->getNextForOneUser($this->getUser(), $data, $flashTimeslotRepository);
// Test pour erreur custom si résultat vide par recherche formulaire, ou lorsque l'utilisateur arrive sur la page et n'a pas de session prévue
if (isset($_GET["search_flash_workshop_agenda"]) && empty($timeslotsArray)) {
$isEmptyFromSearch = true;
} elseif (!isset($_GET["search_flash_workshop_agenda"]) && empty($timeslotsArray)) {
$isEmptyFromSearch = false;
} else {
$isEmptyFromSearch = null;
}
$hasFilters = null;
$hasEventTypeFilter = null;
$hasCategoryFilter = null;
$hasDateFilter = null;
$hasHourFilter = null;
$filtersCount = 0;
if (isset($_GET["search_flash_workshop_agenda"])) {
$hasFilters = true;
if (array_key_exists("onLine", $_GET["search_flash_workshop_agenda"]) || array_key_exists("onSite", $_GET["search_flash_workshop_agenda"])) {
$hasEventTypeFilter = true;
$filtersCount++;
}
if (array_key_exists("category", $_GET["search_flash_workshop_agenda"])) {
$hasCategoryFilter = true;
$filtersCount++;
}
if (array_key_exists("date", $_GET["search_flash_workshop_agenda"])) {
$hasDateFilter = true;
$filtersCount++;
}
if (array_key_exists("hour", $_GET["search_flash_workshop_agenda"])) {
$hasHourFilter = true;
$filtersCount++;
}
}
$categories = [];
$categoryEntities = $flashWorkshopTypeRepository->findAll();
foreach ($timeslotsArray as $timeslot) {
$fw = $timeslot->getFlashWorkshop();
if (!in_array($fw->getFlashWorkshopType()->getName(), $categories)) {
array_push($categories, $fw->getFlashWorkshopType()->getName());
}
}
return $this->render('page/my_agenda.html.twig', [
'client' => $client,
'userNextTimeslots' => $timeslotsArray,
'form' => $form->createView(),
'isEmptyFromSearch' => $isEmptyFromSearch,
'hasFilters' => $hasFilters,
'categories' => $categories,
'categoryEntities' => $categoryEntities,
'hasCategoryFilter' => $hasCategoryFilter,
'hasEventTypeFilter' => $hasEventTypeFilter,
'hasDateFilter' => $hasDateFilter,
'hasHourFilter' => $hasHourFilter,
'filtersCount' => $filtersCount,
]);
}
/**
* @Route("/{clientSlug}/page/mentions-legales", name="app_legal")
*/
public function legal(ClientRepository $clientRepository, $clientSlug)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/legal.html.twig', [
'client' => $client
]);
}
/**
* @Route("/{clientSlug}/page/accessibilite", name="app_accessibilite")
*
*/
public function accessibilite(ClientRepository $clientRepository, $clientSlug)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/accessibilite.html.twig', [
'client' => $client
]);
}
/**
* @Route("/{clientSlug}/page/cgu", name="app_cgu")
*
*/
public function cgu(ClientRepository $clientRepository, $clientSlug)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/cgu.html.twig', [
'client' => $client
]);
}
/**
* @Route("/{clientSlug}/auto-diagnostic/{id}/{answerId}", name="app_auto_diagnostic_quizz")
*/
public function autoDiagnosticQuizz(Request $request, ClientRepository $clientRepository, $clientSlug, DiagQuestion $diagQuestion, $answerId = null, DiagQuestionRepository $diagQuestionRepository, DiagAnswerRepository $diagAnswerRepository, ManagerRegistry $doctrine, DiagAnswerUserRepository $diagAnswerUserRepository, UserRepository $userRepository)
{
$client = $clientRepository->findOneBySlug($clientSlug);
$countQuestions = count($diagQuestion->getProduct()->getDiagQuestions());
$diagQuestion = $this->getMediaExtension($diagQuestion);
if ($answerId != null) {
$answer = $diagAnswerRepository->findOneById($answerId);
$user = $userRepository->findOneByEmail($request->getSession()->get('anonymousUser'));
$this->addDiagAnswer($user, $answer, $diagAnswerUserRepository, $doctrine);
$nextQuestion = $diagQuestionRepository->getNextQuestion($diagQuestion);
if ($nextQuestion != null) {
return $this->redirectToRoute('app_auto_diagnostic_quizz', ['clientSlug' => $client->getSlug(), 'id' => $nextQuestion->getId()]);
} else {
return $this->redirectToRoute('app_auto_diagnostic_result', ['clientSlug' => $client->getSlug(), 'id' => $diagQuestion->getProduct()->getId(), 'userSalt' => $user->getSalt()]);
}
} else {
if ($diagQuestion->getPosition() == 1) {
$anonymousUser = $this->createAnonymousUser($doctrine, $client);
$request->getSession()->set('anonymousUser', $anonymousUser->getEmail());
}
}
return $this->render('page/auto_diagnostic.html.twig', [
'client' => $client,
'question' => $diagQuestion,
'countQuestions' => $countQuestions
]);
}
/**
* @Route("/{clientSlug}/auto-diagnostic/{id}/quizz/resultat/{userSalt}", name="app_auto_diagnostic_result")
*/
public function autoDiagnosticResult($clientSlug, Product $product, $userSalt, UserRepository $userRepository, ClientRepository $clientRepository, ClientProductRepository $clientProductRepository)
{
$user = $userRepository->findOneBySalt($userSalt);
$client = $clientRepository->findOneBySlug($clientSlug);
$clientProduct = $clientProductRepository->findOneBy(['client' => $client, 'product' => $product]);
$score = 0;
$answerUsers = $user->getDiagAnswerUsers();
foreach ($answerUsers as $answerUser) {
if ($answerUser->getDiagAnswer()->getScore() > 0) {
$score = $score + $answerUser->getDiagAnswer()->getScore();
}
}
if ($score >= $product->getHighScore()) {
$result = 'High';
} elseif ($score >= $product->getMidScore() && $score < $product->getHighScore()) {
$result = 'Mid';
} else {
$result = 'Low';
}
return $this->render('page/auto_diagnostic_result.html.twig', [
'client' => $client,
'result' => $result,
'product' => $product,
'clientProduct' => $clientProduct
]);
}
/**
* @Route("/{clientSlug}/test-auditif/{id}/age", name="app_audition_test_age")
*/
public function auditionTestAge(Request $request, $clientSlug, ClientProduct $clientProduct, ClientRepository $clientRepository, ManagerRegistry $doctrine)
{
$client = $clientRepository->findOneBySlug($clientSlug);
if ($request->isMethod('post')) {
$this->createAnonymousUser($doctrine, $client, $request->request->get('age'));
return $this->redirectToRoute('app_audition_test_beginning', ['clientSlug' => $client->getSlug(), 'id' => $clientProduct->getId()]);
}
return $this->render('page/audition_test_age.html.twig', [
'client' => $client,
'clientProduct' => $clientProduct
]);
}
/**
* @Route("/{clientSlug}/test-auditif/{id}/avant-de-commencer", name="app_audition_test_beginning")
*/
public function auditionTestBeginning($clientSlug, ClientProduct $clientProduct, ClientRepository $clientRepository, ManagerRegistry $doctrine)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/audition_test_beginning.html.twig', [
'client' => $client,
'clientProduct' => $clientProduct
]);
}
/**
* @Route("/{clientSlug}/test-auditif/description/{id}", name="app_audition_test_question_description")
*/
public function auditionTestQuestionDescription($clientSlug, DiagQuestion $diagQuestion, ClientRepository $clientRepository)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/audition_test_description.html.twig', [
'client' => $client,
'question' => $diagQuestion
]);
}
/**
* @Route("/{clientSlug}/test-auditif/question/{id}", name="app_audition_test_question")
*/
public function auditionTestQuestion(Request $request, $clientSlug, DiagQuestion $diagQuestion, ClientRepository $clientRepository, DiagAnswerRepository $diagAnswerRepository, UserRepository $userRepository, DiagAnswerUserRepository $diagAnswerUserRepository, DiagQuestionRepository $diagQuestionRepository, ManagerRegistry $doctrine)
{
$client = $clientRepository->findOneBySlug($clientSlug);
if ($request->isMethod('post')) {
$answer = $diagAnswerRepository->findOneById($request->request->get('answer'));
$user = $userRepository->findOneByEmail($request->getSession()->get('anonymousUser'));
$this->addDiagAnswer($user, $answer, $diagAnswerUserRepository, $doctrine);
$nextQuestion = $diagQuestionRepository->getNextQuestion($diagQuestion);
if ($nextQuestion != null) {
return $this->redirectToRoute('app_audition_test_question_description', ['clientSlug' => $client->getSlug(), 'id' => $nextQuestion->getId()]);
} else {
return $this->redirectToRoute('app_audition_test_result', ['clientSlug' => $client->getSlug(), 'id' => $diagQuestion->getProduct()->getId(), 'userSalt' => $user->getSalt()]);
}
} else {
if ($diagQuestion->getPosition() == 1) {
$anonymousUser = $this->createAnonymousUser($doctrine, $client);
$request->getSession()->set('anonymousUser', $anonymousUser->getEmail());
}
}
return $this->render('page/audition_test_question.html.twig', [
'client' => $client,
'question' => $diagQuestion
]);
}
/**
* @Route("/{clientSlug}/test-auditif/{id}/quizz/resultat/{userSalt}", name="app_audition_test_result")
*/
public function auditionTestResult(
$clientSlug, Product $product, $userSalt, UserRepository $userRepository, ClientRepository $clientRepository,
ClientProductRepository $clientProductRepository)
{
$client = $clientRepository->findOneBySlug($clientSlug);
$clientProduct = $clientProductRepository->getClientProductByClientAndProduct($client, 3);
$user = $userRepository->findOneBySalt($userSalt);
$score = 0;
$answerUsers = $user->getDiagAnswerUsers();
foreach ($answerUsers as $answerUser) {
if ($answerUser->getDiagAnswer()->getScore() > 0) {
$score = $score + $answerUser->getDiagAnswer()->getScore();
}
}
if ($user->getAge() == 'Plus de 60 ans') {
if ($score >= $product->getSeniorHighScore()) {
$result = 'High';
} elseif ($score >= $product->getSeniorMidScore() && $score < $product->getSeniorHighScore()) {
$result = 'Mid';
} else {
$result = 'Low';
}
} else {
if ($score >= $product->getHighScore()) {
$result = 'High';
} elseif ($score >= $product->getMidScore() && $score < $product->getHighScore()) {
$result = 'Mid';
} else {
$result = 'Low';
}
}
return $this->render('page/audition_test_result.html.twig', [
'result' => $result,
'client' => $client,
'user' => $user,
'score' => $score,
'product' => $product,
'clientProduct' => $clientProduct
]);
}
/**
* @Route("/{clientSlug}/page/politique-de-confidentialite", name="app_privacy")
*/
public function privacy(ClientRepository $clientRepository, $clientSlug)
{
$client = $clientRepository->findOneBySlug($clientSlug);
return $this->render('page/privacy.html.twig', [
'client' => $client
]);
}
/**
* @Route("/verification-ajax/email", name="app_ajax")
*/
public function emailVerification(Request $request, UserRepository $userRepository)
{
$fields = $request->request->all();
$user = $userRepository->findOneByEmail($fields['email']);
$response = new JsonResponse();
if ($user != null) {
$password = $this->getParameter('app.generic_password');
if (password_verify($password, $user->getPassword()) == true) {
$response->setContent(json_encode([
'exist' => true,
'generic' => true
]));
} else {
$response->setContent(json_encode([
'exist' => true,
'generic' => false
]));
}
} else {
$response->setContent(json_encode([
'exist' => false
]));
}
$response->headers->set('Content-Type', 'application/json');
return $response;
}
// Navbar des produits fichier base
public function renderProductForNavbar(Request $request, ClientRepository $clientRepository, ClientProductRepository $clientProductRepository)
{
$explodedUrl = explode('/', $_SERVER['REQUEST_URI']);
$clientSlugInUrl = explode('?_s', $explodedUrl[1])[0];
$tabToHide = false;
if ($this->getUser()) {
if ($this->isAuthorized($this->getUser()->getClient()->getSlug()) == true) {
$client = $this->getUser()->getClient();
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
}
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
if ($client == null) {
$client = $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
}
}
$clientProducts = $clientProductRepository->getIncomingByClient($client);
$clientProductsCount = count($clientProductRepository->getIncomingByClient($client));
if (!empty($clientProducts)) {
foreach ($clientProducts as $clientProduct) {
if(count($clientProducts) >=1 && ($clientProduct->getProduct()->getId() != 1 || 2 ) != true ){
$tabToHide = true;
break;
}elseif(count($clientProducts) < 1 && $clientProduct->getProduct()->getName() == 'Defi-inclusion' || $clientProduct->getProduct()->getName() == 'Flashlearning'){
$tabToHide = false;
$diagTools = false;
break;
}elseif ($clientProduct->getProduct()->getSlug() == 'test-auditif' || $clientProduct->getProduct()->getSlug() == 'autodiagnostic-handicap' || $clientProduct->getProduct()->getSlug() == 'autodiagnostic-handicap-2') {
$diagTools = true;
$tabToHide = true;
break;
}else{
$tabToHide = false;
$diagTools = true;
break;
}
}
}else {
$tabToHide = false;
$diagTools = false;
}
return $this->render('page/_navbar_product.html.twig', [
'clientProducts' => $clientProducts,
'client' => $client,
'tabToHide' => $tabToHide,
'diagTools' => $diagTools,
'clientProductsCount' => $clientProductsCount
]);
}
public function renderClientFromUrl(Request $request, ClientRepository $clientRepository, ClientProductRepository $clientProductRepository)
{
$explodedUrl = explode('/', $_SERVER['REQUEST_URI']);
$clientSlugInUrl = explode('?_s', $explodedUrl[1])[0];
$tabToHide = false;
if ($this->getUser()) {
if ($this->isAuthorized($this->getUser()->getClient()->getSlug()) == true) {
$client = $this->getUser()->getClient();
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
}
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
if ($client == null) {
$client = $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
}
}
$clientProducts = $clientProductRepository->getIncomingByClient($client);
if(count($clientProducts) == 2){
$tabToHide = true;
}else{
foreach ($clientProducts as $clientProduct) {
if($clientProduct->getProduct()->getName() == 'Defi-inclusion' || $clientProduct->getProduct()->getName() == 'Flashlearning'){
$tabToHide = false;
break;
}
}
}
return $this->render('page/_client_base.html.twig', [
'client' => $client,
'tabToHide' => $tabToHide
]);
}
public function renderLoginRegisterBtn(Request $request, ClientRepository $clientRepository)
{
$explodedUrl = explode('/', $_SERVER['REQUEST_URI']);
$clientSlugInUrl = explode('?_s', $explodedUrl[1])[0];
if ($this->getUser()) {
if ($this->isAuthorized($this->getUser()->getClient()->getSlug()) == true) {
$client = $this->getUser()->getClient();
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
}
} else {
$client = $clientRepository->findOneBySlug($clientSlugInUrl);
if ($client == null) {
$client = $clientRepository->findOneBySlug($request->cookies->get('clientSlug'));
}
}
// dd($client);
return $this->render('page/_login_register_btn.html.twig', [
'client' => $client
]);
}
public function isAuthorized($clientSlug)
{
if ($clientSlug != $this->getUser()->getClient()->getSlug()) {
return false;
} else {
return true;
}
}
public function generateRandomString($length = 20)
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[random_int(0, $charactersLength - 1)];
}
return $randomString;
}
public function getMediaExtension(DiagQuestion $diagQuestion)
{
$imageExtensions = array(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".webp");
$getMediaExtension = explode(".", $diagQuestion->getMedia());
if (isset($getMediaExtension[1])) {
$mediaExtension = '.' . $getMediaExtension[1];
if (!in_array($mediaExtension, $imageExtensions)) {
$diagQuestion->setIsMediaAVideo(true);
}
}
return $diagQuestion;
}
public function createAnonymousUser(ManagerRegistry $doctrine, Client $client, $age = null)
{
$anonymousUser = new User();
$anonymousUser->setClient($client);
$anonymousUser->setEmail('Anonymous' . $this->generateRandomString());
$anonymousUser->setPassword('anonymous');
$anonymousUser->setIsVerified(0);
$anonymousUser->setSalt($this->generateRandomString(5));
$anonymousUser->setIsActive(1);
$anonymousUser->setCreatedAt(new DateTime());
$anonymousUser->setModifiedAt(new DateTime());
if ($age != null) {
$anonymousUser->setAge($age);
}
$manager = $doctrine->getManager();
$manager->persist($anonymousUser);
$manager->flush();
return $anonymousUser;
}
public function addDiagAnswer(User $user, DiagAnswer $diagAnswer, DiagAnswerUserRepository $diagAnswerUserRepository, ManagerRegistry $doctrine)
{
$existingDiagAnswerUser = $diagAnswerUserRepository->findOneBy(['user' => $user, 'diagQuestion' => $diagAnswer->getDiagQuestion()]);
if ($existingDiagAnswerUser == null) {
$diagAnswerUser = new DiagAnswerUser();
$diagAnswerUser->setUser($user);
$diagAnswerUser->setDiagQuestion($diagAnswer->getDiagQuestion());
$diagAnswerUser->setDiagAnswer($diagAnswer);
$diagAnswerUser->setCreatedAt(new DateTime());
$diagAnswerUser->setModifiedAt(new DateTime());
$manager = $doctrine->getManager();
$manager->persist($diagAnswerUser);
$manager->flush();
return $diagAnswerUser;
} else {
return false;
}
}
public function setCookie($clientSlug, $content)
{
switch ($_ENV['ACTUAL_ENV']) {
case 'local':
$clientSlugCookie = new Cookie(
'clientSlug',
$clientSlug,
strtotime('+1 year'),
'/',
'plateform.localhost',
true,
true
);
break;
case 'demo':
$clientSlugCookie = new Cookie(
'clientSlug',
$clientSlug,
strtotime('+1 year'),
'/',
'demo.plateform.jobinlive.fr',
true,
true
);
break;
case 'preprod':
$clientSlugCookie = new Cookie(
'clientSlug',
$clientSlug,
strtotime('+1 year'),
'/',
'preprod.plateform.jobinlive.fr',
true,
true
);
break;
case 'prod':
$clientSlugCookie = new Cookie(
'clientSlug',
$clientSlug,
strtotime('+1 year'),
'/',
'app-ween.fr',
true,
true
);
break;
}
$response = new Response();
$response->setContent($content);
$response->headers->setCookie($clientSlugCookie);
return $response;
}
public function restoreTags($input)
{
$opened = array();
// loop through opened and closed tags in order
if (preg_match_all("/<(\/?[a-z]+)>?/i", $input, $matches)) {
foreach ($matches[1] as $tag) {
if (preg_match("/^[a-z]+$/i", $tag, $regs)) {
// a tag has been opened
if (strtolower($regs[0]) != 'br') $opened[] = $regs[0];
} elseif (preg_match("/^\/([a-z]+)$/i", $tag, $regs)) {
// a tag has been closed
// unset($opened[array_pop(array_keys($opened, $regs[1]))]);
}
}
}
// close tags that are still open
if ($opened) {
$tagstoclose = array_reverse($opened);
foreach ($tagstoclose as $tag) $input .= "</$tag>";
}
return $input;
}
function truncateWords($input, $numwords, $padding = "")
{
$output = strtok($input, " \n");
while (--$numwords > 0) $output .= " " . strtok(" \n");
if ($output != $input) $output .= $padding;
return $output;
}
}