src/Controller/Dashboard/EducationalController.php line 782

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Dashboard;
  3. use App\Entity\DataAnalysis\UserActivityAbstractWorkListTable;
  4. use App\Entity\Educational\Chapter;
  5. use App\Entity\Educational\Course;
  6. use App\Entity\Educational\Discipline;
  7. use App\Entity\Educational\Domain;
  8. use App\Entity\Educational\FeedbackScore;
  9. use App\Entity\Educational\Lesson\DesignScheme\AbstractContent;
  10. use App\Entity\Educational\Lesson\Exercise\Tip;
  11. use App\Entity\Educational\Lesson\Exercise\Pratical;
  12. use App\Entity\Educational\Lesson\WorkList;
  13. use App\Entity\Educational\Lesson\WorkListLine;
  14. use App\Entity\Educational\Lesson\WorkListNode;
  15. use App\Entity\Educational\SchoolBag\ReviewProgram;
  16. use App\Entity\Educational\SchoolBag\ReviewProgramBoost;
  17. use App\Entity\Educational\SchoolBag\ReviewProgramEvent;
  18. use App\Entity\Educational\SchoolBag\ReviewProgramLesson;
  19. use App\Entity\Educational\Speciality;
  20. use App\Entity\Event\RegisterEvent;
  21. use App\Entity\Event\Training\AbstractEventTraining;
  22. use App\Entity\Event\Training\AbstractProgram;
  23. use App\Entity\Event\Training\Boost;
  24. use App\Entity\Event\Training\HolidaysTraining;
  25. use App\Entity\Event\Training\Pack;
  26. use App\Entity\Event\Training\RegisterProgram;
  27. use App\Entity\Event\Training\Training;
  28. use App\Entity\Management\Subscription\Purchase\MissionExam;
  29. use App\Entity\Management\Subscription\Subscription;
  30. use App\Entity\Media\Video;
  31. use App\Entity\Users\Child;
  32. use App\Entity\Users\Parents;
  33. use App\Entity\Users\StudentsParents;
  34. use App\Service\Mailer\MailerService;
  35. use App\Service\ManagerRP;
  36. use App\Service\ProfExpressService;
  37. use Dompdf\Dompdf;
  38. use Doctrine\Common\Collections\ArrayCollection;
  39. use Doctrine\ORM\EntityManagerInterface;
  40. use Dompdf\Options;
  41. use Exception;
  42. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  43. use Knp\Snappy\Pdf;
  44. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  45. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  46. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  47. use Symfony\Component\HttpFoundation\JsonResponse;
  48. use Symfony\Component\HttpFoundation\Request;
  49. use Symfony\Component\HttpFoundation\Response;
  50. use Symfony\Component\Mailer\MailerInterface;
  51. use Symfony\Component\Routing\Annotation\Route;
  52. use Symfony\Component\Routing\Generator\UrlGenerator;
  53. /**
  54.  * Class EducationalController
  55.  * @package App\Controller\Dashboard
  56.  *
  57.  * @Security("is_granted('ROLE_STUDENT') or is_granted('ROLE_PARENTS')")
  58.  */
  59. class EducationalController extends AbstractController
  60. {
  61.     /*
  62.         * Le but de cette fonction est d'affichée la popin program et de sauvegarder
  63.         * le parcours utilisateur pour afficher la totalité des popins.
  64.         */
  65.     /**
  66.      * @param Request $request
  67.      * @return Response
  68.      * @Route("/educational/list/program",name="list-program")
  69.      */
  70.     public function renderPopinProgram(Request $request)
  71.     {
  72.         $em $this->getDoctrine()->getManager();
  73.         $user $this->getUser();
  74.         $courseSlugSelected $disciplineSlugSelected $chapterSlugSelected null;
  75.         $courseSelected $disciplineSelected $chapterSelected $wnSlugSelected null;
  76.         $listChapters $listDisciplines $listCourses $listWorklists = [];
  77.         $session $request->getSession();
  78.         $appSession $session->get('Application');
  79.         $processPopinProgramEnd $displayLastPopinProgram $sessionDemand false;
  80.         if ($user && $user instanceof Child) {
  81.             if(!$request->get('user-select-chapter')){
  82.                 $sessionDemand = !$request->isXmlHttpRequest() && isset($appSession['popin']['program']['displayLastPopinProgram']) && $appSession['popin']['program']['displayLastPopinProgram'];
  83.             }else{
  84.                 $sessionDemand true;
  85.                 $appSession['popin']['program'] = [
  86.                     'course' => $request->get('course'),
  87.                     'discipline'=>$request->get('discipline'),
  88.                     'chapter'=>$request->get('chapter'),
  89.                     'worklistnode'=>null
  90.                 ];
  91.                 $session->set('Application'$appSession);
  92.             }
  93.             //Check si l'utilisateur (requête ajax) à demander de changer les items ou c'est la session (php) qui le demande
  94.             if (!$session->has('Application')) {
  95.                 $appSession = ['popin' => ['program' => ['course' => null,'discipline'=>null,'chapter'=>null,'worklistnode'=>null]]];
  96.             }
  97.             $tmpSessionProgram $appSession['popin']['program'];
  98.             if (!$sessionDemand) {
  99.                 $tmpSessionProgram['displayLastPopinProgram'] = false;
  100.                 //Check si il y a une demande utilisateur de modifier une classe ou la session
  101.                 if ($request->get('course') || $tmpSessionProgram['course'] != null) {
  102.                     $courseSlugSelected = !is_null($request->get('course')) ? $request->get('course') : $tmpSessionProgram['course'];
  103.                     $courseSelected $em->getRepository(Course::class)->findOneBySlug($courseSlugSelected);
  104.                 } else {
  105.                     $courseSelected $user->getCourse();
  106.                 }
  107.                 $courseSlugSelected $courseSelected->getSlug();
  108.                 $tmpSessionProgram['course'] = $courseSlugSelected;
  109.                 if ($request->get('discipline')) {
  110.                     $disciplineSlugSelected $request->get('discipline');
  111.                     $disciplineSelected $em->getRepository(Discipline::class)->findOneBySlug($disciplineSlugSelected);
  112.                     $disciplineSlugSelected $disciplineSelected->getSlug();
  113.                     $tmpSessionProgram['discipline'] = $disciplineSlugSelected;
  114.                 }
  115.                 if ($request->get('chapter')) {
  116.                     $chapterSlugSelected $request->get('chapter');
  117.                     $tmpSessionProgram['chapter'] = $chapterSlugSelected;
  118.                     $tmpSessionProgram['displayLastPopinProgram'] = true;
  119.                 }
  120.             } else {
  121.                 $disciplineSlugSelected $tmpSessionProgram['discipline'];
  122.                 $chapterSlugSelected    $tmpSessionProgram['chapter'];
  123.                 $wnSlugSelected         $tmpSessionProgram['worklistnode'];
  124.                 $processPopinProgramEnd true;
  125.                 $disciplineSelected     $em->getRepository(Discipline::class)->findOneBySlug($disciplineSlugSelected);
  126.             }
  127.             $courseSelected  $em->getRepository(Course::class)->findOneBySlug($tmpSessionProgram['course']);
  128.             $listDisciplines $em->getRepository(Domain::class)->getAllDisciplineByCourseV2($courseSelectedtrue);
  129.             if($user instanceof Child){
  130.                 $last $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  131.                 if($last){
  132.                     $guardiant $last->getGuardiant();
  133.                     if($user->getCourse() && $guardiant){
  134.                         $examDis $em->getRepository(MissionExam::class)->getListDis($guardiant->getId(),$courseSelected->getId());
  135.                         $listDisciplines array_merge($examDis,$listDisciplines);
  136.                     }
  137.                 }
  138.             }
  139.             $domain $em->getRepository(Domain::class)->findOneBySlug($chapterSlugSelected);
  140.             $choiceArtWork = [];
  141.             $reEv null;
  142.             if($tmpSessionProgram['discipline']){
  143.                 $reEv $em->getRepository(RegisterEvent::class)->findRegisterByDisciSlug($user->getId(),$tmpSessionProgram['discipline']);
  144.                 if($reEv && in_array($tmpSessionProgram['discipline'],[ 'mission-bac-francais','mission-bac-techno-francais'])){
  145.                     $choiceArtWork $reEv->getPackArtWorkStudy();
  146.                 }
  147.             }
  148.             $listChapters $em->getRepository(Domain::class)->getChapterAndNbrProgramForPopinByDiscipline($courseSelected$disciplineSelectednulltrue,$choiceArtWork);
  149.             if($domain &&
  150.                 ($domain->getMissionExamProgram() ||
  151.                     (in_array($domain->getDiscipline()->getSlug(),[ 'mission-bac-francais','mission-bac-techno-francais'])))){
  152.                 if($reEv) {
  153.                     if (in_array($domain->getDiscipline()->getSlug(),[ 'mission-bac-francais','mission-bac-techno-francais'])) {
  154.                         $listWorklists $em->getRepository(WorkList::class)->getWorkListByDomainForPopinProgram($chapterSlugSelected$user,$choiceArtWork);
  155.                     } else {
  156.                         $listWorklists $em->getRepository(AbstractProgram::class)->findAllProgramEventByRegister($reEv$domain->getCourse()->getId(), $domain->getDiscipline()->getSlug());
  157.                     }
  158.                 }
  159.             }else{
  160.                 $listWorklists $em->getRepository(WorkList::class)->getWorkListByDomainForPopinProgram($chapterSlugSelected,$user);
  161.             }
  162.             //Il est appelé qu'une seule fois lorsque j'affiche la première popin Course&Discipline
  163.             if ((!is_null($courseSelected) && is_null($disciplineSelected)) || $sessionDemand) {
  164.                 $listCourses $em->getRepository(Course::class)->findBy(['front' => true], ['order' => 'asc']);
  165.             }
  166.             //Save Choice in session
  167.             $appSession['popin']['program'] = array_merge($tmpSessionProgram, ['worklistNode' => null,]);
  168.             $session->set('Application'$appSession);
  169.             return $this->render('dashboard/educational/program.html.twig', [
  170.                 'listCourses' => $listCourses,
  171.                 'courseS' => $tmpSessionProgram['course'],
  172.                 'disciplineS' => $disciplineSlugSelected,
  173.                 'chapterS' => $chapterSlugSelected,
  174.                 'listChapters' => $listChapters,
  175.                 'listDisciplines' => $listDisciplines,
  176.                 'listWorklists' => $listWorklists,
  177.                 'sessionDemand' => $sessionDemand,
  178.                 'wnS'=>$wnSlugSelected
  179.             ]);
  180.         }
  181.         return new JsonResponse();
  182.     }
  183.     /**
  184.      * @Route("/enter/{slug}", name="enter-rp-wn")
  185.      * @Route("/enter/program/{program}/{pregister}", name="enter-program")
  186.      */
  187.     public function enterPlaylist(Request $requestManagerRP $managerRP$slug null$program=null$pregister=null){
  188.         $em $this->getDoctrine()->getManager();
  189.         $user $this->getUser();
  190.         $start false;
  191.         if (!is_null($slug)) {
  192.             $Rp $em->getRepository(ReviewProgramLesson::class)->findOneByWnSlug($user$slug);
  193.             if (!$Rp) {
  194.                 $wn $em->getRepository(WorkListNode::class)->findOneBySlug($slug);
  195.                 if (!$wn) {
  196.                     return $this->redirectToRoute('dashboard');
  197.                 }
  198.                 $Rp $managerRP->createRpByWorklistNode($wn,$user);
  199.                 if($wn->getDomain()->getDiscipline()->isExam()){
  200.                     $last $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  201.                     if($user instanceof Child && ( ($last && $last->isCurrentSubscription()) || in_array("ROLE_EXAM",$user->getRoles()))){
  202.                         if($last){
  203.                             $guardiant $last->getGuardiant();
  204.                             $packs     $em->getRepository(MissionExam::class)->getListPack($guardiant->getId(),$user->getCourse()->getId());
  205.                             if(!empty($packs)){
  206.                                 if($wn->getDomain()->getMissionExamProgram()){
  207.                                     $list $em->getRepository(AbstractProgram::class)->ifProgramIsPackByWk($wn->getId());
  208.                                     if(!empty($list)){
  209.                                         $tmp null;
  210.                                         foreach ($list as $row){
  211.                                             foreach ($packs as $p){
  212.                                                 if($row['packId'] == $p->getId()){
  213.                                                     $tmp $row['id'];
  214.                                                 }
  215.                                             }
  216.                                         }
  217.                                         if($tmp){
  218.                                             return $this->redirectToRoute('enter-program',['program'=>$tmp]);
  219.                                         }
  220.                                     }
  221.                                 }else{
  222.                                     $list $em->getRepository(MissionExam::class)->getListDis($guardiant->getId(),$user->getCourse()->getId());
  223.                                     foreach ($list as $row){
  224.                                         if($row['id'] == $wn->getDomain()->getDiscipline()->getId()){
  225.                                             $Rp->setAccessView(true);
  226.                                         }
  227.                                     }
  228.                                 }
  229.                             }else{
  230.                                 return $this->redirectToRoute('dashboard');
  231.                             }
  232.                         }
  233.                     }else{
  234.                         return $this->redirectToRoute('dashboard');
  235.                     }
  236.                 }
  237.                 $em->persist($Rp);
  238.                 $em->flush();
  239.                 $Rp->setSlug("{$Rp->getSlug()}-{$Rp->getId()}");
  240.                 $em->flush();
  241.                 $start true;
  242.             }
  243.             // Enregistre le choix de l'utilisateur
  244.             $session $request->getSession();
  245.             $appSession $session->get('Application');
  246.             if (isset($appSession['popin']['program']['chapter'])) {
  247.                 $appSession['popin']['program']['worklistnode'] = $slug;
  248.                 $session->set('Application'$appSession);
  249.             }
  250.             $paramerters $start?["start"=>true]:[];
  251.             $paramerters["slug"]= $Rp->getSlug();
  252.             return $this->redirectToRoute('show-playlist-lesson'$paramerters);
  253.         }
  254.         if(!is_null($program)){
  255.             $lineProgram $em->getRepository(AbstractProgram::class)->find($program);
  256.             if($lineProgram){
  257.                 $event      $lineProgram->getEventTraining();
  258.                 $isRegister $em->getRepository(RegisterEvent::class)->findOneBy(
  259.                     [
  260.                         'child'=>$user->getId(),
  261.                         'event'=>$event->getId()
  262.                     ]);
  263.                 if($isRegister){
  264.                     $Rp $em->getRepository(ReviewProgramEvent::class)->findOneBy([
  265.                         'student'=>$user->getId(),
  266.                         'program'=>$lineProgram->getId()
  267.                     ]);
  268.                     if(!$Rp){
  269.                         $worklist null;
  270.                         if(!is_null($pregister)){
  271.                             $pregister $em->getRepository(RegisterProgram::class)->find($pregister);
  272.                             if($pregister){
  273.                                 $worklist $pregister->getWorkListNode()->getWorklist();
  274.                             }
  275.                         }
  276.                         $Rp $managerRP->createRpByTraining($lineProgram,$user,$worklist);
  277.                         $em->persist($Rp);
  278.                         $em->flush();
  279.                         $Rp->setSlug("{$Rp->getSlug()}-{$Rp->getId()}");
  280.                         $em->flush();
  281.                     }
  282.                     return $this->redirectToRoute('show-playlist-lesson',['slug'=>$Rp->getSlug()]);
  283.                 }
  284.             }
  285.             return $this->redirectToRoute('training');
  286.         }
  287.         return $this->redirectToRoute('dashboard');
  288.     }
  289.     /**
  290.      * @Route("/reset/{slug}", name="reset-program")
  291.      */
  292.     public function resetProgram(Request $request$slugManagerRP $managerRP) {
  293.         $em $this->getDoctrine()->getManager();
  294.         $user $this->getUser();
  295.         $rp $em->getRepository(ReviewProgram::class)->findOneBy([
  296.             'student' => $user->getId(),
  297.             'slug' => $slug
  298.         ]);
  299.         if ($rp) {
  300.             $worklist $rp->getWorklist();
  301.             $wlWithUA $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist$user);
  302.             foreach ($wlWithUA as $wl) {
  303.                 if (!empty($wl["ua"])) {
  304.                     $findActivity $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
  305.                     if (!empty($findActivity)) {
  306.                         $findActivity->setRedo(true);
  307.                     }
  308.                 }
  309.             }
  310.             $em->flush();
  311.             return $this->redirectToRoute('show-playlist-lesson', ['slug' => $slug]);
  312.         } else {
  313.             return $this->redirectToRoute('dashboard');
  314.         }
  315.     }
  316.     /**
  317.      * @Route("/programme/{slug}", name="show-playlist-lesson",priority="1")
  318.      * @Route("/programme/{slug}/{position}", name="show-playlist-media")
  319.      */
  320.     public function playlist(Request $request,$slug null$position 1)
  321.     {
  322.         if (is_null($slug)) {
  323.             return $this->redirectToRoute('dashboard');
  324.         }
  325.         $em $this->getDoctrine()->getManager();
  326.         $user $this->getUser();
  327.         $content null;
  328.         $nbrUas 0;
  329.         $nbrUasToDoAgain 0;
  330.         $findActivity false;
  331.         $findRp null;
  332.         if (!$user) {
  333.             return $this->redirectToRoute('app_login');
  334.         }
  335.         $rp $em->getRepository(ReviewProgram::class)->findOneBy([
  336.             'student' => $user->getId(),
  337.             'slug' => $slug
  338.         ]);
  339.         if (!$rp) {
  340.             $findRp $em->getRepository(ReviewProgram::class)->findOneBy([
  341.                 'slug' => $slug
  342.             ]);
  343.             if ($findRp) {
  344.                 return $this->redirectToRoute('dashboard', ['back' => $slug]);
  345.             }
  346.             return $this->redirectToRoute('dashboard');
  347.         }
  348.         $slugReviewProgram $rp->getSlug();
  349.         $worklist $rp->getWorklist();
  350.         if(!$this->isGranted('ACCESS_ONLY_SUBSCRIBER'$worklist)  ){
  351. // NE pas modifier !!
  352.             if(!$this->isGranted('ROLE_EXAM') && $findRp instanceof ReviewProgramEvent){
  353.                 return $this->redirectToRoute('access-service');
  354.             }
  355.         }
  356.       //  $this->denyAccessUnlessGranted('ACCESS_ONLY_SUBSCRIBER', $worklist);
  357.         //$wlWithUA = $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist, $user);
  358.         $wlWithUA $em->getRepository(WorkListLine::class)->getWlDirectoryByWId($worklist$user);
  359.         if (!$worklist->getWorklistLines()->isEmpty()) {
  360.             if (is_numeric($position) && $position <= $worklist->getWorklistLines()->count()) {
  361.                 $content $worklist->getWorklistLines()[$position 1]->getAbstractContent();
  362.             } else {
  363.                 return $this->redirectToRoute('show-playlist-media', ['slug' => $slug]);
  364.             }
  365.             $uas $em->getRepository(UserActivityAbstractWorkListTable::class)->findBy([
  366.                 'user' => $user->getId(),
  367.                 'reviewProgram' => $rp->getId()
  368.             ]);
  369.             $nbrUas count($uas);
  370.             $uasToRedo $em->getRepository(UserActivityAbstractWorkListTable::class)->findBy([
  371.                 'user' => $user->getId(),
  372.                 'reviewProgram' => $rp->getId(),
  373.                 'redo' => 1,
  374.             ]);
  375.             $nbrUasToDoAgain count($uasToRedo);
  376.             $findActivity $em->getRepository(UserActivityAbstractWorkListTable::class)->findOneBy([
  377.                 'user' => $user->getId(),
  378.                 'reviewProgram' => $rp->getId(),
  379.                 'abstractContent' => $content->getId()
  380.             ]);
  381.         }
  382.         $start  $request->query->has('start');
  383.         $isPack $rp instanceof ReviewProgramEvent ?($rp->getProgram()->getEventTraining() instanceof Pack):false;
  384.         return $this->render('dashboard/educational/playlist.html.twig', [
  385.             'worklist'          => $worklist,
  386.             'position'          => $position,
  387.             'content'           => $content,
  388.             'slugReviewProgram' => $slugReviewProgram,
  389.             'wlWithUA'        => $wlWithUA,
  390.             'findActivity'    => $findActivity,
  391.             'nbrUas'          => $nbrUas,
  392.             'nbrUasToDoAgain' => $nbrUasToDoAgain,
  393.             'wn'              => $rp->getWorkListNode(),
  394.             'openPopinStart'=>$start,
  395.             'islesson'      =>$rp instanceof ReviewProgramLesson,
  396.             'isPack'        =>$isPack,
  397.             'rp'            =>$rp
  398.         ]);
  399.     }
  400.     /**
  401.      * @Route("/programme/{slug}/termine", name="end-playlist",priority="1")
  402.      *
  403.      */
  404.     public function endplaylist($slug null)
  405.     {
  406.         if (is_null($slug)) {
  407.             return $this->redirectToRoute('dashboard');
  408.         }
  409.         $user $this->getUser();
  410.         $em $this->getDoctrine()->getManager();
  411.         $rp $em->getRepository(ReviewProgram::class)->findOneBy([
  412.             'student'=>$user->getId(),
  413.             'slug'   =>$slug
  414.         ]);
  415.         $event null;
  416.         $listWorklists $listProgram = [];
  417.         $slugReviewProgram $rp->getSlug();
  418.         $worklist $rp->getWorklist();
  419.         // Calcul du pourcentage de réussite aux exercices du programme
  420.         $successPercentage 0;
  421.         $sumScores 0;
  422.         $sumQuestions 0;
  423.         if($rp instanceof ReviewProgramLesson){
  424.             $wn $rp->getWorkListNode();
  425.             if(!is_null($wn)){
  426.                 $listWorklists $em->getRepository(WorkList::class)->getWorklistByWn($wn->getId(),$wn->getDomain()->getId());
  427.             }
  428.         }
  429.         if($rp instanceof ReviewProgramEvent){
  430.             $day          null;
  431.             $event        $rp->getProgram()->getEventTraining();
  432.             $isRegister $em->getRepository(RegisterEvent::class)->findOneBy([
  433.                 'child' => $user->getId(), 'event' => $event->getId()
  434.             ]);
  435.             if($isRegister && $event instanceof Training){
  436.                 $selectDiscipline $isRegister->getDisciplineWithTube();
  437.                 $listProgram      $em->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($event,$user,$selectDiscipline);
  438.                 $now = new \DateTime();
  439.                 $startAt $isRegister->getStartAt();
  440.                 $day $startAt<=$now?$now->diff($startAt)->days:null;
  441.                 if(!is_null($day))
  442.                 $listProgram      array_slice($listProgram0$day+1);
  443.             }
  444.         }
  445.         if($worklist){
  446.             $rp->setFinished(new \DateTime());
  447.             $em->flush();
  448.             $wlWithUA $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist$user);
  449.             // print_r($wlWithUA);
  450.             // Ajout des scores
  451.             foreach ($wlWithUA as $key => $wl) {
  452.                 if ($wl["type"] != "Video") {
  453.                     $wl["scores"] = array(
  454.                         "best" => "0",
  455.                         "last" => "0",
  456.                     );
  457.                     if (!empty($wl["ua"])) {
  458.                         $findActivity $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
  459.                         if (!empty($findActivity) && !is_null($findActivity->getLastScore())) {
  460.                             $wl["scores"]["best"] = $findActivity->getBestScore();
  461.                             $wl["scores"]["last"] = $findActivity->getLastScore();
  462.                             $sumScores += $findActivity->getLastScore();
  463.     
  464.                             if ($wl["type"] == "Exercice") {
  465.                                 $wl["scores"]["best"] .= "/5";
  466.                                 $wl["scores"]["last"] .= "/5";
  467.     
  468.                                 $sumQuestions += 5;
  469.                             }
  470.                             else {
  471.                                 $questions $findActivity->getAbstractContent()->getContent()->getQuestions();
  472.                                 if (!empty($questions)) {
  473.                                     $totalQuestions count($questions);
  474.     
  475.                                     $wl["scores"]["best"] .= "/" $totalQuestions;
  476.                                     $wl["scores"]["last"] .= "/" $totalQuestions;
  477.     
  478.                                     $sumQuestions += $totalQuestions;
  479.                                 }
  480.                             }
  481.                         }
  482.                     }
  483.                     $wlWithUA[$key] = $wl;
  484.                 }
  485.                 else {
  486.                     if (!empty($wl["ua"]) && $wl["redo"]) {
  487.                         // print_r($wl); exit;
  488.                         $findActivity $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
  489.                         if (!empty($findActivity)) {
  490.                             if ($findActivity->getRedo()) {
  491.                                 $findActivity->setRedo(false);
  492.                                 $wlWithUA[$key]["redo"] = 0;
  493.                             }
  494.                         }
  495.                     }
  496.                 }
  497.             }
  498.             $feedback '';
  499.             if ($sumQuestions 0) {
  500.                 $successPercentage ceil($sumScores $sumQuestions 100);
  501.                 $rp->setLastSuccessPercentage($successPercentage);
  502.                 $bestPercentage $rp->getBestSuccessPercentage();
  503.                 if (empty($bestPercentage) || $bestPercentage $successPercentage) {
  504.                     $rp->setBestSuccessPercentage($successPercentage);
  505.                 }
  506.                 if(!is_null($rp->getDiscipline())){
  507.                     $disciplineId $rp->getDiscipline()->getId();
  508.                 }else{
  509.                     if($rp instanceof ReviewProgramLesson){
  510.                         $wpT $rp->getWorklist();
  511.                         $dT  $rp->getDomain();
  512.                         if(!is_null($dT)){
  513.                             $disciplineId $dT->getDiscipline()->getId();
  514.                         }
  515.                         if(!is_null($wpT) && !is_null($dT)){
  516.                             $wnT $em->getRepository(WorkListNode::class)->findBy([
  517.                                 'domain'=>$dT->getId(),
  518.                                 'worklist'=>$wpT->getId()
  519.                             ]);
  520.                             if(!empty($wnT)){
  521.                                 $rp->setWorkListNode($wnT[0]);
  522.                             }
  523.                         }
  524.                     }
  525.                 }
  526.                 $feedback $em->getRepository(FeedbackScore::class)->getFeedback($successPercentage$disciplineId);
  527.             }
  528.             $em->flush();
  529.             return $this->render('dashboard/educational/playlist.html.twig', [
  530.                 'openPopinStart'    => true,
  531.                 'worklist'          => $worklist,
  532.                 'finish'            => true,
  533.                 'position'          => 0,
  534.                 'content'           => null,
  535.                 'slugReviewProgram' => $slugReviewProgram,
  536.                 'listWorklists'     => $listWorklists,
  537.                 'wlWithUA'          => $wlWithUA,
  538.                 'listProgram'       => $listProgram,
  539.                 'event'             => $event,
  540.                 'successPercentage' => $successPercentage,
  541.                 'feedback'          => $feedback,
  542.                 'rp'                => $rp,
  543.                 'islesson'      => false
  544.             ]);
  545.         }
  546.         return $this->redirectToRoute('dashboard');
  547.     }
  548.     /**
  549.      * @Route("/event/{slug}")
  550.      *
  551.      */
  552.     public function listProgram(Request $request,EntityManagerInterface $entityManager,$slug null)
  553.     {
  554.         $user $this->getUser();
  555.         $event null;
  556.         $programs = [];
  557.         $domain null;
  558.         $rp $entityManager->getRepository(ReviewProgram::class)->findOneBy([
  559.             'student' => $user->getId(),
  560.             'slug' => $slug
  561.         ]);
  562.         if($rp){
  563.             if($rp instanceof ReviewProgramEvent){
  564.                 $event $rp->getProgram()->getEventTraining();
  565.                 if($event){
  566.                     $isRegister $entityManager->getRepository(RegisterEvent::class)->findOneBy([
  567.                         'child' => $user->getId(), 'event' => $event->getId(),'archive'=>null
  568.                     ]);
  569.                     if($isRegister && $event instanceof Pack){
  570.                         $artWork null;
  571.                         if($event->getCourse()->getSlug()=="premiere"){
  572.                             $artWork $isRegister->getPackArtWorkStudy();
  573.                         }
  574.                         $programs $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline_2($event$user,"",$artWork);
  575.                     }
  576.                     if($isRegister && ($event instanceof Training || $event instanceof HolidaysTraining)){
  577.                         $selectProgram $rp->getProgram();
  578.                         $selectDiscipline $isRegister->getDisciplineWithTube();
  579.                         $programs $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($event$user,$selectDiscipline,null,$isRegister->getCourse());
  580.                         //echo '<pre>';var_dump($isRegister->getDisciplineWithTube());die;
  581.                         if(!is_null($selectProgram->getDays())){
  582.                            // $programs = array_slice($programs,0,$selectProgram->getDays());
  583.                             $programs = [$programs[$selectProgram->getDays()]];
  584.                             //echo '<pre>';var_dump($programs);die;
  585.                         }
  586.                     }
  587.                     $domain $rp->getWorkListNode()?$rp->getWorkListNode()->getDomain():null;
  588.                 }
  589.             }
  590.             if($rp instanceof ReviewProgramLesson){
  591.                 $programs $entityManager->getRepository(WorkListNode::class)->getWkNodeChapter($rp->getWorkListNode()->getDomain());
  592.                 $domain   $rp->getWorkListNode()?$rp->getWorkListNode()->getDomain():null;
  593.             }
  594.         }
  595.         return $this->render('dashboard/educational/template-other-chapter.html.twig',[
  596.             'programs'=>$programs,
  597.             'event'   =>$event,
  598.             'domain'  =>$domain
  599.         ]);
  600.     }
  601.     /**
  602.      * @Route("/report/worklist",name="report-worklist",methods={"post"})
  603.      */
  604.     public function reportUserPlaylist(Request $request,MailerService $mailer){
  605.         $user $this->getUser();
  606.         $em   $this->getDoctrine()->getManager();
  607.         $contentId $request->request->get('contentId');
  608.         $msg       $request->request->get('msg');
  609.         $wnId      $request->request->get('wnId');
  610.         $abstractContent $em->getRepository(AbstractContent::class)->find($contentId);
  611.         $worklistNode    $em->getRepository(WorkListNode::class)->find($wnId);
  612.         if($user && $abstractContent){
  613.             $back $request->get('back');
  614.             $mailer->sendEmail("Rapport d'erreur utilisateu","[email protected]","mailer/report/worklist.html.twig",[
  615.                 "child"          =>$user,
  616.                 "abstractContent"=>$abstractContent,
  617.                 "msg"            =>$msg,
  618.                 "wn"             =>$worklistNode
  619.             ]);
  620.             $this->addFlash('notice','Votre signalement a bien été pris en compte. Nous allons traiter votre demande dans les plus brefs délais.<br/><br/>Merci pour votre collaboration ! ');
  621.             if($back){
  622.                 return $this->redirect($back);
  623.             }
  624.         }
  625.          return $this->redirectToRoute('dashboard');
  626.     }
  627.     /**
  628.      * @Route("/display/tip",name="show-tip")
  629.      */
  630.     public function ajaxDisplayTip(Request $request){
  631.         if($request->isXmlHttpRequest()){
  632.             $id $request->get('id');
  633.             $em $this->getDoctrine()->getManager();
  634.             $tips$em->getRepository(Tip::class)->findBy(['question'=>$id]);
  635.             if(!empty($tips)){
  636.                 $json = [];
  637.                 foreach ($tips as $row){
  638.                     $json[] = ['content'=>$row->getStatement()];
  639.             }
  640.                 return new JsonResponse(['success'=>true,'data'=>$json]);
  641.             }
  642.             return new JsonResponse(['success'=>false]);
  643.         }
  644.     }
  645.     /**
  646.      * @Route("/upload/transcript/video/file/{slug}/{wn}",name="uplaod-file-video")
  647.      * @Route("/upload/transcript/video/file/{slug}/{wn}/js",name="js-uplaod-file-video")
  648.      */
  649.     public function uploadTranscriptVideo(Request  $request,$slug null,$wn=null,Pdf $knpSnappyPdf){
  650.         if(!is_null($slug)){
  651.             $em $this->getDoctrine()->getManager();
  652.             $video $em->getRepository(Video::class)->findOneBySlug($slug);
  653.             if(!is_null($video->getTranscript())){
  654.                 $file sprintf("%s/public/gatewayImages/front/videos/transcripts/%s",dirname(__FILE__).'/../../..',$video->getTranscript());
  655.                 if(is_file($file)){
  656.                     return $this->file($file);
  657.                 }
  658.             }else{
  659.                 if(!is_null($video->getTranscriptAuto())){
  660.                     $file sprintf("%s/public/gatewayImages/front/videos/transcripts/%s",dirname(__FILE__).'/../../..',$video->getTranscriptAuto());
  661.                     if(is_file($file)){
  662.                         return $this->file($file);
  663.                     }
  664.                 }
  665.                 if(!is_null($video->getDescription())){
  666.                         $wn $em->getRepository(WorkListNode::class)->findOneBySlug($wn);
  667.                         /* return $this->render('dashboard/educational/pdf/generate-pdf.html.twig', [
  668.                            "content"=>str_replace('<p>&nbsp;</p>','<br/> ',$video->getDescription()),
  669.                              "video"=>$video,
  670.                              'wn'=>$wn
  671.                          ]);*/
  672.                         $tmpFiles = [];
  673.                         function extractLatex($text) {
  674.                             preg_match_all('/(\\\\\((.*?)\\\\\))|(\\\\\[(.*?)\\\\\])|(\$\$(.*?)\$\$)|(\$(.*?)\$)/'$text$matches);
  675.                             return $matches// Retourne les expressions LaTeX extraites
  676.                         }
  677.                         function latexToImage($latex$outputPath) {
  678.                             $tmpDir sys_get_temp_dir(); // Dossier temporaire
  679.                             $texFile $tmpDir "/equation.tex";
  680.                             $dviFile $tmpDir "/equation.dvi";
  681.                             $pngFile $outputPath;
  682.                             // Création du fichier .tex
  683.                             $texContent "
  684.     \\documentclass[preview]{standalone}
  685.     \\usepackage{amsmath,amssymb}
  686.     \\usepackage{yhmath}
  687.     \\usepackage{amsfonts}   % optionnel
  688.     \\usepackage{mathtools} 
  689.     \\usepackage{graphicx}
  690.     \\usepackage{calc}
  691.     \\begin{document}
  692.     $".trim(html_entity_decode($latex))."$
  693.     \\end{document}";
  694.                             file_put_contents($texFile$texContent);
  695.                             // Compilation LaTeX -> DVI
  696.                             $cmdLatex "latex -output-directory=$tmpDir $texFile";
  697.                             exec($cmdLatex$output$returnVar);
  698.                             if ($returnVar !== 0) {
  699.                                 return null;
  700.                             }else{
  701.                                 // Conversion DVI -> PNG
  702.                                 $cmdDvipng "dvipng -D 600 -x 1000 -y 1000 -bg Transparent -T tight -o $pngFile $dviFile";
  703.                                 exec($cmdDvipng$output$returnVar);
  704.                                 /*  if ($returnVar !== 0) {
  705.                                       throw new Exception("Erreur lors de la conversion DVI en PNG.");
  706.                                   }*/
  707.                                 if (extension_loaded('imagick')) {
  708.                                 $image = new \Imagick($pngFile);
  709.                                     unlink($pngFile);
  710.                                 $scale 0.23// 50%
  711.                                 $width $image->getImageWidth();
  712.                                 $height $image->getImageHeight();
  713.                                 $image->resizeImage($width $scale$height $scale\Imagick::FILTER_LANCZOS1);
  714.                                 $image->writeImage($pngFile);
  715.                                 }
  716.                                 return $pngFile;
  717.                             }
  718.                         }
  719.                         function imageToBase64($path) {
  720.                             //$path = $path;
  721.                             $type pathinfo($pathPATHINFO_EXTENSION);
  722.                             $tmp explode('?',$type);
  723.                             $data file_get_contents($path);
  724.                             $base64 'data:image/' $tmp[0] . ';base64,' base64_encode($data);
  725.                             return $base64;
  726.                         }
  727.                         function replaceLatexWithImages($text,&$tmpFiles) {
  728.                             $matches extractLatex($text);
  729.                             $replacements $fLatexImag = [];
  730.                             foreach ($matches[0] as $index => $row){
  731.                                 $tab = [1,3,5,7];
  732.                                 $f_latex null;
  733.                                 foreach ($tab as $cpt){
  734.                                     if($matches[$cpt][$index] == $row){
  735.                                         $f_latex $matches[$cpt+1][$index];
  736.                                     }
  737.                                 }
  738.                                 if(!array_keys($fLatexImag,$f_latex)){
  739.                                     $imagePath "latex_image_" uniqid() . ".png";
  740.                                     $tmp latexToImage($f_latex$imagePath);
  741.                                     $fLatexImag[$f_latex] = is_null($tmp)?$row:"<img style='margin-top:25px;display:block;margin-left: 5px;margin-right:5px' src='".imageToBase64(dirname(__DIR__).'/../../public/'.$imagePath)."' alt='Latex Equation'/>";
  742.                                 }
  743.                                 $replacements[$row] = $fLatexImag[$f_latex];
  744.                             }
  745.                             return str_replace(array_keys($replacements), array_values($replacements), $text);
  746.                         };
  747.                         function replaceWithImages($text) {
  748.                             preg_match_all('/src="(.*?)"/'$text$matches);
  749.                             $replacements = [];
  750.                             foreach ($matches[1] as  $latex) {
  751.                                 $replacements[$latex] = imageToBase64($latex);
  752.                                 /* } catch (Exception $e) {
  753.                                      echo "Erreur : " . $e->getMessage() . "\n";
  754.                                  }*/
  755.                             }
  756.                             return str_replace(array_keys($replacements), array_values($replacements), $text);
  757.                         }
  758.                     $conversions = [
  759.                         '&Delta;' => '\Delta ',
  760.                         '&delta;' => '\delta ',
  761.                         '&alpha;' => '\alpha ',
  762.                         '&beta;' => '\beta ',
  763.                         '&Omega;' => '\Omega ',
  764.                         '&omega;' => '\omega ',
  765.                         '&phi;' => '\phi ',
  766.                         '&Phi;' => '\Phi ',
  767.                         '&pi;' => '\pi ',
  768.                         '&Pi;' => '\Pi '
  769.                     ];
  770.                    // $formuleLatex = str_replace(array_keys($conversions), array_values($conversions), $texte);
  771.                     $descriptionV $video->getDescription();
  772.                     $descriptionV str_replace(array_keys($conversions), array_values($conversions), $descriptionV);
  773.                         $descriptionV replaceWithImages($descriptionV);
  774.                         try{
  775.                             $descriptionV replaceLatexWithImages(str_replace('<p>&nbsp;</p>','<div style="margin-bottom: 10px"></div> ',$descriptionV),$tmpFiles);
  776.                             $descriptionV str_replace(array_values($conversions), array_keys($conversions), $descriptionV);
  777.                             $html $this->render('dashboard/educational/pdf/generate-pdf-2.html.twig', [
  778.                                 "content"=>utf8_encode($descriptionV),
  779.                                 "video"  =>$video,
  780.                                 'wn'     =>$wn,
  781.                                 'logo'   =>imageToBase64(dirname(__DIR__).'/../../public/static/img/commun/LOGO-LBP-Hibou-blanc.png')
  782.                             ]);
  783.                             $options = new Options();
  784.                             $options->set('isHtml5ParserEnabled'true);
  785.                             $options->set('isRemoteEnabled'true);
  786.                             $domPdf = new Dompdf($options);
  787.                             $conversions = [
  788.                                 '&Delta;' => 'Δ',    // U+0394
  789.                                 '&delta;' => 'δ',    // U+03B4
  790.                                 '&alpha;' => 'α',    // U+03B1
  791.                                 '&beta;' => 'β',     // U+03B2
  792.                                 '&Omega;' => 'Ω',    // U+03A9
  793.                                 '&omega;' => 'ω',    // U+03C9
  794.                                 '&phi;' => 'φ',      // U+03C6
  795.                                 '&theta;' => 'θ'     // U+03B8
  796.                             ];
  797.                             $html str_replace(array_keys($conversions), array_values($conversions), $html);
  798.                             $domPdf->loadHtml($html'UTF-8');
  799.                             $domPdf->setPaper('A4''portrait');
  800.                             $domPdf->render();
  801.                             $nameFile uniqid().".pdf";
  802.                             $newFile dirname(__DIR__)."/../../public/gatewayImages/front/videos/transcripts/".$nameFile;
  803.                             file_put_contents($newFile,$domPdf->output());
  804.                             if(is_file($newFile)){
  805.                                 $video->setTranscriptAuto($nameFile);
  806.                                 $em->flush();
  807.                             }
  808.                             foreach ($tmpFiles as $file){
  809.                                 if(is_file(dirname(__DIR__).'/../../public/'.$file)){
  810.                                     unlink(dirname(__DIR__).'/../../public/'.$file);
  811.                                 }
  812.                             }
  813.                             return new Response(
  814.                                 $domPdf->stream('resume.pdf', ["Attachment" => false]),
  815.                                 Response::HTTP_OK,
  816.                                 ['Content-Type' => 'application/pdf']
  817.                             );
  818.                         }catch (Exception $exception){
  819.                             if(!empty($tmpFiles)){
  820.                                 foreach ($tmpFiles as $file){
  821.                                     if(is_file(dirname(__DIR__).'/../../public/'.$file)){
  822.                                         unlink(dirname(__DIR__).'/../../public/'.$file);
  823.                                     }
  824.                                 }
  825.                             }
  826.                             if($request->get('back')){
  827.                                 return $this->redirect($request->get('back'));
  828.                             }
  829.                         }
  830.                     }
  831.             }
  832.         }
  833.         if($request->get('back')){
  834.             return $this->redirect($request->get('back'));
  835.         }
  836.         return $this->redirectToRoute('dashboard');
  837.     }
  838.     /**
  839.      *
  840.      * @Route("/change/phone/number", name="ajaxChangePhoneNumber", methods="GET")
  841.      *
  842.      */
  843.     public function profExpressChangeNumber(Request $request)
  844.     {
  845.         if ($request->isXmlHttpRequest()) {
  846.             $phone $request->get('phone');
  847.             $user $this->getUser();
  848.             if ($user && !empty($phone)) {
  849.                 $user->setPhoneProfExpress($phone);
  850.                 $this->getDoctrine()->getManager()->flush();
  851.                 return new JsonResponse(['success' => true]);
  852.             }
  853.         }
  854.         return new JsonResponse(['success' => false]);
  855.     }
  856. //@Security("has_role('ROLE_TEACHER_EXPRESS')")
  857.     /**
  858.      * @Route("/prof-express/{student}", name="api_prof_express", methods="GET|POST")
  859.      *
  860.      */
  861.     public function profExpress(Child $student,ProfExpressService $profExpressService)
  862.     {
  863.         $url $profExpressService->connect($student);
  864.         return $this->redirect($url);
  865.     }
  866.     /**
  867.      * @Route("/get/disciplines/by/course", name="get-disciplines-by-course", methods="GET")
  868.      *
  869.      */
  870.     public function getDisciplineByCourse(Request $request)
  871.     {
  872.         $courseSelected $request->get('course');
  873.         $em $this->getDoctrine()->getManager();
  874.         $courseSelected $em->getRepository(Course::class)->findOneBySlug($courseSelected);
  875.         if ($courseSelected) {
  876.             $listDisciplines $em->getRepository(WorkListNode::class)->getDisciplinesForCourse($courseSelected->getSlug());
  877.             return new JsonResponse(['success' => true'list' => $listDisciplines]);
  878.         }
  879.         return new JsonResponse(['success' => false]);
  880.     }
  881.     /**
  882.      * @return Response
  883.      * @IsGranted("ACCESS_FREE", subject="",message="subscripted")
  884.      * @IsGranted("ACCESS_LBP", subject="",message="subscripted")
  885.      * @Route("/boost/matieres",name="boost-disciplines")
  886.      */
  887.     public function boostDisciplines(Request $request){
  888.         //$this->denyAccessUnlessGranted('ACCESS_LBP', null,'subscripted');
  889.         $em       $this->getDoctrine()->getManager();
  890.         $boost    $em->getRepository(Boost::class)->findOneBySlug('boost');
  891.         $user     $this->getUser();
  892.         $register $em->getRepository(RegisterEvent::class)->findOneBy([
  893.             'event'=>$boost->getId(),
  894.             'child'=>$user->getId()
  895.         ]);
  896.         $program $em->getRepository(AbstractProgram::class)->findAllProgramEventBoostByRegister($register);
  897.         $now = new \DateTime();
  898.         $day $now->format('N');
  899.         $nextSendDate $day<|| 6<$day?$now->modify('wednesday'):$now->modify('saturday');
  900.         if($request->isMethod('post')){
  901.             $discipls $request->request->get('selectDisciplines');
  902.             $discipls explode('|'$discipls);
  903.             if ($boost && !empty($discipls)) {
  904.                 if(!$register){
  905.                     $registerEvent = new RegisterEvent($boost$user);
  906.                     foreach ($discipls as $d) {
  907.                         $disc $em->getRepository(Discipline::class)->findOneBySlug($d);
  908.                         $registerEvent->addSelectDisplines($disc);
  909.                     }
  910.                     $em->persist($registerEvent);
  911.                     $this->addFlash("notice""Tu es inscrit(e) au boost Matière en {$registerEvent->getDisciplineByTitle()}<br/> la date du prochain envoi est le ".\IntlDateFormatter::formatObject($nextSendDate'd MMMM''fr_FR'));
  912.                 }else{
  913.                     $tmp = new ArrayCollection();
  914.                     foreach ($discipls as $d) {
  915.                         $disc $em->getRepository(Discipline::class)->findOneBySlug($d);
  916.                         $tmp->add($disc);
  917.                     }
  918.                     $register->setSelectDisplines($tmp);
  919.                     $this->addFlash('notice''Tes matières ont été modifiées');
  920.                 }
  921.                 $em->flush();
  922.                 return $this->redirectToRoute('boost-disciplines');
  923.             }
  924.         }
  925.          return $this->render('/dashboard/educational/boost-disciplines.html.twig',[
  926.             'register'=>$register,
  927.              'program'=>$program,
  928.              'nextSendDate'=>$nextSendDate,
  929.              'boost'=>$boost
  930.          ]);
  931.     }
  932.     /**
  933.      * @Route("/save-student-score", name="save-student-score")
  934.      */
  935.     public function saveStudentScore(Request $request) {
  936.         $slug      $request->get('rp');
  937.         $contentId $request->get('content');
  938.         $score     $request->get('score');
  939.         $user      $this->getUser();
  940.         $em        $this->getDoctrine()->getManager();
  941.         $rp $em->getRepository(ReviewProgram::class)->findOneBy([
  942.             'student' => $user->getId(),
  943.             'slug' => $slug
  944.         ]);
  945.         $id = -1;
  946.         if ($rp) {
  947.             $activity $em->getRepository(UserActivityAbstractWorkListTable::class)->findOneBy([
  948.                 'abstractContent' => $contentId,
  949.                 'reviewProgram' => $rp->getId(),
  950.             ]);
  951.             $now = new \DateTime();
  952.             if (empty($activity)) {
  953.                 $content $em->getRepository(AbstractContent::class)->find($contentId);
  954.                 $activity = new UserActivityAbstractWorkListTable();
  955.                 $activity->setReviewProgram($rp);
  956.                 $activity->setAbstractContent($content);
  957.                 $activity->setSpentTime(10);
  958.                 $activity->setUser($user);
  959.                 $activity->setDate($now);
  960.                 $em->persist($activity);
  961.             }
  962.             if (!empty($activity)) {
  963.                 $activity->setLastScore($score);
  964.                 $activity->setLastScoreDate($now);
  965.                 $activity->setRedo(false);
  966.                 $bestScore $activity->getBestScore();
  967.                 if (empty($bestScore) || $bestScore $score) {
  968.                     $activity->setBestScore($score);
  969.                     $activity->setBestScoreDate($now);
  970.                 }
  971.                 $rp->setLastActivityAt($now);
  972.                 $em->flush();
  973.                 $id $activity->getId();
  974.                 return new JsonResponse([
  975.                     'success' => true,
  976.                     "activity" => $id,
  977.                     "rp" => $rp->getId(),
  978.                     "score" => $score,
  979.                 ]);
  980.             }
  981.         }
  982.         return new JsonResponse(['success'=> false]);
  983.     }
  984.     /**
  985.      * @Route("/activity-redone", name="activity-redone")
  986.      */
  987.     public function activityRedone(Request $request) {
  988.         $activityId $request->get('activityId');
  989.         $em $this->getDoctrine()->getManager();
  990.         if ($activityId) {
  991.             $activity $em->getRepository(UserActivityAbstractWorkListTable::class)->find($activityId);
  992.             if (!empty($activity)) {
  993.                 $activity->setRedo(false);
  994.                 $em->flush();
  995.             }
  996.             return new JsonResponse(['success' => true]);
  997.         }
  998.         return new JsonResponse(['success'=> false]);
  999.     }
  1000.     /**
  1001.      * @Route("/ajax/workshop/list/disiplines", name="ajaxWorkshopListDisciplines")
  1002.      */
  1003.     public function ajaxWorkshopListDisciplines(Request $request) {
  1004.         $slug $request->get('course');
  1005.         $workshop $request->get('workshop');
  1006.         $em $this->getDoctrine()->getManager();
  1007.         $course $em->getRepository(Course::class)->findOneBySlug($slug);
  1008.         $workshop $em->getRepository(AbstractEventTraining::class)->findOneBySlug($workshop);
  1009.         if ($course && $workshop) {
  1010.             $child = new Child();
  1011.             $child->setCourse($course);
  1012.             $disciplines $em->getRepository(AbstractProgram::class)->findAllProgramEvent($workshop$child);
  1013.             if (!empty($disciplines)) {
  1014.                 return $this->render('dashboard/_partials/list-disciplines-workshop.html.twig',
  1015.                     ['disciplines' => $disciplines,'workshop'=>$workshop]);
  1016.             }
  1017.         }
  1018.         return new JsonResponse(['success'=> false]);
  1019.     }
  1020.     /**
  1021.      * @Route("/validation/change/course/end/year", name="changeCourseYear")
  1022.      * @IsGranted("ROLE_STUDENT")
  1023.      *
  1024.      */
  1025.     public function changeCourseEndYear(Request $request){
  1026.         $user    $this->getUser();
  1027.         $em      $this->getDoctrine()->getManager();
  1028.         $isPopin false;
  1029.         if($request->isMethod('post')){
  1030.             $course        $request->request->get('course');
  1031.             $disciplines   $request->request->get('spe');
  1032.             $isPopin       $request->request->has('popin');
  1033.             $course        $em->getRepository(Course::class)->find($course);
  1034.             $child         $em->getRepository(Child::class)->find($user->getUserIdentifier());
  1035.             if(!$isPopin){
  1036.                 $check false;
  1037.                 if($course->getId()==&& count($disciplines)!=2){
  1038.                     $this->addFlash('notice','Veuillez cocher que 2 spécialités');
  1039.                     $check true;
  1040.                 }
  1041.                 if($course->getId()==&& count($disciplines)!=3){
  1042.                     $this->addFlash('notice','Veuillez cocher que 3 spécialités');
  1043.                     $check true;
  1044.                 }
  1045.                 if($check){
  1046.                     return $this->redirectToRoute('account');
  1047.                 }
  1048.             }
  1049.             if($course && $user){
  1050.                 $em->getRepository(Speciality::class)->deleteByCourseAndStudent($course,$user);
  1051.                 if(!empty($disciplines)){
  1052.                     foreach ($disciplines as $item){
  1053.                         $disc $em->getRepository(Discipline::class)->find($item);
  1054.                         if($disc){
  1055.                             $spe = new Speciality();
  1056.                             $spe->setCourse($course);
  1057.                             $spe->setDiscipline($disc);
  1058.                             $spe->setStudent($user);
  1059.                             $em->persist($spe);
  1060.                             $em->flush();
  1061.                         }
  1062.                     }
  1063.                 }
  1064.                 if($isPopin){
  1065.                     $tmp = new \DateTime('30 june this year');
  1066.                     $now = new \DateTime('now');
  1067.                     $tmp $now<$tmp?$tmp:new \DateTime('30 june next year');
  1068.                     $child->setCourse($course);
  1069.                     $user->setNextScholarYear($tmp);
  1070.                     $user->setDisplayPopinNextScholarYear($now);
  1071.                 }
  1072.                 $this->addFlash('notice','Super, nous avons bien noté tes modifications, ton espace Elève a été mis à jour en conséquence.');
  1073.                 $em->flush();
  1074.             }else{
  1075.                 $this->addFlash('notice','Une erreur est survenue durant l\'enregistrement votre spécialité');
  1076.             }
  1077.         }
  1078.         if($isPopin){
  1079.             return $this->redirectToRoute('dashboard');
  1080.         }else{
  1081.             return $this->redirectToRoute('account');
  1082.         }
  1083.     }
  1084.     public function renderAccesContent(EntityManagerInterface $entityManager){
  1085.         $last $subscription null;
  1086.         $user $this->getUser();
  1087.         if($user instanceof Child){
  1088.             $subscription $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  1089.         }
  1090.         return $this->render("dashboard/educational/template-access-content.html.twig",[
  1091.             'user'=>$user,
  1092.             'subscription'=>$subscription
  1093.         ]);
  1094.     }
  1095. }