src/Controller/Dashboard/IndexController.php line 999

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Dashboard;
  3. use App\Entity\DataAnalysis\UserActivity;
  4. use App\Entity\Educational\Course;
  5. use App\Entity\Educational\Discipline;
  6. use App\Entity\Educational\Domain;
  7. use App\Entity\Educational\Lesson\ArtWorkStudy;
  8. use App\Entity\Educational\Lesson\DesignScheme\AbstractContent;
  9. use App\Entity\Educational\Lesson\WorkListNode;
  10. use App\Entity\Educational\SchoolBag\ReviewProgram;
  11. use App\Entity\Educational\SchoolBag\ReviewProgramLesson;
  12. use App\Entity\Educational\Speciality;
  13. use App\Entity\Event\RegisterEvent;
  14. use App\Entity\Event\Training\AbstractEventTraining;
  15. use App\Entity\Event\Training\AbstractProgram;
  16. use App\Entity\Event\Training\Boost;
  17. use App\Entity\Event\Training\HolidaysTraining;
  18. use App\Entity\Event\Training\Pack;
  19. use App\Entity\Event\Training\RegisterProgram;
  20. use App\Entity\Event\Training\Resource;
  21. use App\Entity\Event\Training\SessionTraining;
  22. use App\Entity\Event\Training\Training;
  23. use App\Entity\Management\Dashboard\NoticeDashboard;
  24. use App\Entity\Management\ReportPeda\EmailTemplate;
  25. use App\Entity\Management\Subscription\Mission;
  26. use App\Entity\Management\Subscription\Offer;
  27. use App\Entity\Management\Subscription\Purchase\MissionExam;
  28. use App\Entity\Management\Subscription\Subscription;
  29. use App\Entity\Management\Subscription\TypeOffer;
  30. use App\Entity\Users\Child;
  31. use App\Entity\Users\Parents;
  32. use App\Entity\Users\StudentsParents;
  33. use App\Service\Brevo;
  34. use App\Service\DataAnalalysisChild;
  35. use App\Service\Mailer\SubscriptionMailer;
  36. use Doctrine\ORM\EntityManagerInterface;
  37. use Elasticsearch\ClientBuilder;
  38. use Exception;
  39. use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
  40. use Knp\Snappy\Pdf;
  41. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  42. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  43. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  44. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  45. use Symfony\Component\HttpFoundation\Cookie;
  46. use Symfony\Component\HttpFoundation\JsonResponse;
  47. use Symfony\Component\HttpFoundation\RedirectResponse;
  48. use Symfony\Component\HttpFoundation\Request;
  49. use Symfony\Component\HttpFoundation\Response;
  50. use Symfony\Component\Mailer\Mailer;
  51. use Symfony\Component\Mailer\MailerInterface;
  52. use Symfony\Component\Mime\Email;
  53. use Symfony\Component\Mime\Message;
  54. use Symfony\Component\Routing\Annotation\Route;
  55. use Symfony\Component\Serializer\Encoder\JsonDecode;
  56. use function PHPUnit\Framework\isEmpty;
  57. /**
  58.  * @Route("/dashboard")
  59.  * @Security("is_granted('ROLE_PARENTS') or is_granted('ROLE_STUDENT') or is_granted('ROLE_FREE') or is_granted('ROLE_ADMIN')")
  60.  */
  61. class IndexController extends AbstractController
  62. {
  63.     /**
  64.      * @Route("/enter/child", name="enter-child-dashboard")
  65.      *
  66.      */
  67.     public function enterChildDashboard(Request $request,EntityManagerInterface $entityManager): Response
  68.     {
  69.         $user $this->getUser();
  70.         if($user instanceof Child){
  71.             $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  72.             if($last && $last->getOffer() && $last->getOffer()->getTypeOffer()){
  73.                 if(in_array($last->getOffer()->getTypeOffer()->getSlug(),['mission-bac','mission-brevet','bac-francais'])){
  74.                     return $this->redirectToRoute('show-mission');
  75.                 }
  76.             }
  77.         }
  78.         return $this->redirectToRoute('dashboard');
  79.     }
  80.     /**
  81.      * @Route("/nouveau/subscription/{validation}", name="purchase-success")
  82.      * @Route("/utilisateur", name="choice-account")
  83.      *
  84.      */
  85.     public function choiceAccount(Request $request,$validation null): Response
  86.     {
  87.         $user       $this->getUser();
  88.         $session    $request->getSession();
  89.         $get_Offer  $validation;
  90.         $amount     0;
  91.         if($user instanceof Parents){
  92.             $em $this->getDoctrine()->getManager();
  93.             $listAccounts = [$user];
  94.             $children $em->getRepository(Parents::class)->findChildrenEntityByParent($user);
  95.             $listAccounts array_merge($listAccounts$children);
  96.             $displayPopin false;
  97.             if ($session->has('confirmationEssaiGratuit')) {
  98.                 $displayPopin true;
  99.                 $amount $session->get('toto');
  100.                 $session->remove('confirmationEssaiGratuit');
  101.             }
  102.             $get_Offer $get_Offer?(in_array($get_Offer,['essentielle','assistance-visio','bac-francais'])?$get_Offer:'essentielle'):'essentielle';
  103.             return $this->render('dashboard/choice-account.html.twig', [
  104.                 'listAccount'  => $listAccounts,
  105.                 'displayPopin' => $displayPopin,
  106.                 'get_Offer'    => $get_Offer,
  107.                 'validation'   => $validation,
  108.                 'amount'       => $amount,
  109.                 'hasModeDashboard'=>$request->query->has('hasModeDashboard')?boolval($request->query->get('hasModeDashboard')):null,
  110.                 'mode_free'=>$session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true
  111.             ]);
  112.         }
  113.         return $this->redirectToRoute('dashboard');
  114.     }
  115.     /**
  116.      * @throws \Exception
  117.      */
  118.     private function choiceUserForDisplayTemplate($child)
  119.     {
  120.         $em $this->getDoctrine()->getManager();
  121.         $user $this->getUser();
  122.         $targetUserSelect $user;
  123.         if ($user instanceof Parents) {
  124.             if (!is_null($child)) {
  125.                 $find $em->getRepository(StudentsParents::class)->findByUserStudentandParent($user$child);
  126.                 if ($find) {
  127.                     $targetUserSelect $child;
  128.                 } else {
  129.                     $targetUserSelect null;
  130.                 }
  131.             } else {
  132.                 $children $em->getRepository(Parents::class)->findChildrenEntityByParent($user);
  133.                 if (!empty($children)) {
  134.                     $targetUserSelect $children[0];
  135.                 }else{
  136.                     $targetUserSelect null;
  137.                 }
  138.             }
  139.         }
  140.         return $targetUserSelect;
  141.     }
  142.     /**
  143.      * @Route("", name="dashboard")
  144.      * @Route("/{child}", name="dashboard-child")
  145.      * @Route("/mission/{mission}/success", name="dashboard-mission-success")
  146.      */
  147.     public function dashboard(Request $requestDataAnalalysisChild $dataAnalalysisChild,Child $child null,$mission null): Response
  148.     {
  149.         $em $this->getDoctrine()->getManager();
  150.         $noticeDashboard null;
  151.         $data null;
  152.         $diplayMonthPeriode null;
  153.         $user $this->getUser();
  154.         $targetUserSelect $this->choiceUserForDisplayTemplate($child);
  155.         if($user instanceof Parents){
  156.             if(is_null($targetUserSelect)){
  157.                  //@TODO Création d'un compte enfant pour pouvoir tester le service
  158.             }else{
  159.                $lastSub $em->getRepository(Subscription::class)->getLastSubscriptionByChild($targetUserSelect);
  160.                if(is_null($lastSub)){
  161.                    //@TODO Activer une période d'essaie
  162.                }
  163.             }
  164.         }
  165.         if($user instanceof Child){
  166.             $lastSub $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  167.             if(is_null($lastSub)){
  168.                 //@TODO Mettre dans un manager
  169.                 $sub = new Subscription();
  170.                 $sub->setRenew(false);
  171.                 $sub->setStudent($user);
  172.                 $StudentParents $em->getRepository(StudentsParents::class)->getByParent($user);
  173.                 if($StudentParents){
  174.                     $sub->setGuardiant($StudentParents->getParents());
  175.                 }
  176.                 $sub->setBankStripe(true);
  177.                 $sub->setByChecked(false);
  178.                 $sub->setRenew(false);
  179.                 $sub->setIsMobile(false);
  180.                 $sub->setPrice(0);
  181.                 $sub->setSubscripted(new \DateTime());
  182.                 $offer $em->getRepository(Offer::class)->findOneBySlug(Offer::OFFER_FREE);
  183.                 if($offer){
  184.                     $sub->setOffer($offer);
  185.                     $user->setRoles(['ROLE_STUDENT','ROLE_FREE']);
  186.                     $em->persist($sub);
  187.                     $em->flush();
  188.                     return $this->redirectToRoute('dashboard');
  189.                 }
  190.             }
  191.         }
  192.         $rPs $em->getRepository(ReviewProgram::class)->findBy([
  193.             'student' => $targetUserSelect->getId()
  194.         ], ['lastActivityAt' => 'desc'], 10);
  195.         [$startdataRange$endDataRange] = $dataAnalalysisChild->rangePeriodeDateStat($targetUserSelect);
  196.         if(!is_null($startdataRange)){
  197.             $data $dataAnalalysisChild->periodSubscriptionAtCurrentMonth($targetUserSelect);
  198.             $data array_reverse($data);
  199.             $diplayMonthPeriode array_reverse($dataAnalalysisChild->displayMonthPeriod($startdataRange,$endDataRange));
  200.         }
  201.         $back $rpCopy null;
  202.         $defis = [];
  203.         $tawkData = array();
  204.         $tawkData['course'] = "N/A";
  205.         if($user instanceof Child){
  206.             $noticeDashboard $em->getRepository(NoticeDashboard::class)->getCurrentNotice('student',$user->getCourse());
  207.             if($back=$request->get('back')){
  208.                 $rpCopy $em->getRepository(ReviewProgram::class)->findOneBy([
  209.                     'slug'   =>trim($back)
  210.                 ]);
  211.                 if(!$rpCopy || ($rpCopy && !$rpCopy instanceof ReviewProgramLesson) ){
  212.                     $rpCopy null;
  213.                 }
  214.             }
  215.             $boost    $em->getRepository(Boost::class)->findOneBySlug('boost');
  216.             $register $em->getRepository(RegisterEvent::class)->findOneBy([
  217.                 'event'=>$boost->getId(),
  218.                 'child'=>$user->getId()
  219.             ]);
  220.             $defis $em->getRepository(AbstractProgram::class)->defisProgramEventBoost($register);
  221.             $course $user->getCourse();
  222.             if (!empty($course)) {
  223.                 $tawkData['course'] = $course->getTitle();
  224.             }
  225.         }
  226.         if($user instanceof Parents){
  227.             $noticeDashboard $em->getRepository(NoticeDashboard::class)->getCurrentNotice('parent'$targetUserSelect->getCourse());
  228.         }
  229.         $missionStat = [];
  230.         if($targetUserSelect){
  231.             $last $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($targetUserSelect);
  232.             if($last){
  233.                 $guardiant    $last->getGuardiant();
  234.                 $missionExam  $em->getRepository(MissionExam::class)->getListMissionExam($user->getId(),$targetUserSelect->getCourse()->getId());
  235.                 if(!empty($missionExam)){
  236.                     foreach ($missionExam as $row){
  237.                         $packs $program = [];
  238.                         foreach ($row->getPacks() as $p){
  239.                             $isRegister $em->getRepository(RegisterEvent::class)->findOneBy([
  240.                                 'child' => $targetUserSelect->getId(), 'event' => $p->getId(),'archive'=>null
  241.                             ]);
  242.                             if($isRegister) {
  243.                                 $program $em->getRepository(AbstractContent::class)->getStatMission($targetUserSelect,$isRegister->getEvent()->getDiscipline()->getId(),$isRegister->getPackArtWorkStudy());
  244.                                // $program = $em->getRepository(AbstractProgram::class)->getStatMission($p, $targetUserSelect, "", $isRegister->getPackArtWorkStudy());
  245.                             }
  246.                             $packs[] = array_merge(['discipline'=>$p->getDiscipline()->getTitle(),'disId'=>$p->getDiscipline()->getId()],$program);
  247.                         }
  248.                         $missionStat[] = ['mission'=>$row->getMission()->getTypeOffer()->getTitle(),'packs'=>$packs];
  249.                     }
  250.                 }
  251.             }
  252.         }
  253.         return $this->render('dashboard/index.html.twig', [
  254.             'child' => $targetUserSelect,
  255.             'rPs' => $rPs,
  256.             'displayMonthPeriode'=>$diplayMonthPeriode,
  257.             'startDateRange' => $startdataRange,
  258.             'endDateRange' => $endDataRange?$endDataRange->modify('+1 month'):$startdataRange,
  259.             'data' => $data,
  260.             'noticeDashboard' => $noticeDashboard,
  261.             'rpCopy'=>$rpCopy,
  262.             'defis'=>$defis,
  263.             'tawkData' => $tawkData,
  264.             'missionStat'=> $missionStat,
  265.             'isPurchaseMission'=>$mission,
  266.             'beforeMissionExam'=>$targetUserSelect->getCourse()->getId()==1?'mes-revisions-2-mois-avant-le-bac':'mes-revisions-1-mois-avant-le-brevet'
  267.         ]);
  268.     }
  269.     /**
  270.      * @Route("/dernieres-activites", name="last-activities",priority="1")
  271.      * @Route("/dernieres-activites/{child}", name="last-activities-child")
  272.      */
  273.     public function activities(Request $requestChild $child null): Response
  274.     {
  275.         $em $this->getDoctrine()->getManager();
  276.         $targetUserSelect $this->choiceUserForDisplayTemplate($child);
  277.         $rPs $em->getRepository(ReviewProgram::class)->findBy([
  278.             'student' => $targetUserSelect->getId()
  279.         ], ['updated' => 'desc'], 20);
  280.         return $this->render('dashboard/last-activities.html.twig', [
  281.             'child' => $child,
  282.             'rPs' => $rPs,
  283.         ]);
  284.     }
  285.     /**
  286.      * @Route("/stages", name="training",priority="1")
  287.      */
  288.     public function redirectStage(){
  289.         return $this->redirectToRoute('event-training',[],301);
  290.     }
  291.     /**
  292.      *
  293.      * @Route("/mission/examen", name="show-mission")
  294.      * @Route("/mission/{name}", name="show-mission-name")
  295.      */
  296.     public function packbac(Request $request,EntityManagerInterface $entityManager,$name null){
  297.         $user  $this->getUser();
  298.         $packs $listPacks = [];
  299.         $workshop $guardiant $mission null;
  300.         if($user instanceof Child){
  301.             $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  302.             if($last){
  303.                 $guardiant $last->getGuardiant();
  304.                 $packs     $entityManager->getRepository(MissionExam::class)->getListPack($guardiant->getId(),$user->getCourse()->getId());
  305.             }
  306.         }
  307.         if (!is_null($name)) {
  308.             $workshop $entityManager->getRepository(AbstractEventTraining::class)->findOneBySlug($name);
  309.             if($workshop && $workshop instanceof Pack){
  310.                 $isRegister $entityManager->getRepository(RegisterEvent::class)->findOneBy([
  311.                     'child' => $user->getId(), 'event' => $workshop->getId(),'archive'=>null
  312.                 ]);
  313.                 if($isRegister){
  314.                     if ($request->isMethod('post')){
  315.                         $choiceArtWork $request->request->get('itemArt');
  316.                         $choiceArtWork = !is_null($choiceArtWork)&&!empty($choiceArtWork)?implode(',',$choiceArtWork):null;
  317.                         $isRegister->setPackArtWorkStudy($choiceArtWork);
  318.                         $entityManager->flush();
  319.                         $this->addFlash('notice',"Ta sélection a bien été enregistrée");
  320.                         return $this->redirectToRoute('show-mission-name',['name'=>$name]);
  321.                     }
  322.                     $program $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline_2($workshop$user,"",$isRegister->getPackArtWorkStudy());
  323.                     $domains $artWorkStudy = [];
  324.                     if($workshop->getCourse() && $workshop->getDiscipline()){
  325.                         $domains $entityManager->getRepository(Domain::class)->getDomainV2($workshop->getCourse(),$workshop->getDiscipline());
  326.                         if($workshop->getCourse()->getslug()=="premiere" && (empty($isRegister->getPackArtWorkStudy()) || is_null($isRegister->getPackArtWorkStudy()))){
  327.                             $artWorkStudy  $entityManager->getRepository(ArtWorkStudy::class)->getArtwork();
  328.                         }
  329.                     }
  330.                     $resources $entityManager->getRepository(Resource::class)->findBy(['abstractEventTraining'=>$workshop->getId(),'online'=>true],['position'=>'asc']);
  331.                     return $this->render('dashboard/mission/list-pack.html.twig', [
  332.                         'packs'       => $packs,
  333.                         'workshop'    => $workshop,
  334.                         'programs'    => $program,
  335.                         'domains'     => $domains,
  336.                         'artWorkStudy'=> $artWorkStudy,
  337.                         'isRegister'  => $isRegister,
  338.                         'resources'   => $resources,
  339.                     ]);
  340.                 }
  341.             }
  342.         }
  343.         $typeOffer $entityManager->getRepository(TypeOffer::class)->findOneBySlug('mission-bac');
  344.         if(!is_null($guardiant) && $user->getCourse()->getId()==1){
  345.             $mission $entityManager->getRepository(MissionExam::class)->purchaseMissionBac($guardiant->getId());
  346.             if($mission && $mission->getPacks()->isEmpty()){
  347.                 $listPacks $typeOffer->getPacks();
  348.             }
  349.         }
  350.         if($request->isMethod('post')){
  351.             $packs $request->request->get('packs');
  352.             if(!empty($packs) && $mission->getMission()->getNbrDis()==count($packs)){
  353.                 foreach ($packs as $id){
  354.                     $pp $entityManager->getRepository(Pack::class)->find($id);
  355.                     $mission->addPacks($pp);
  356.                     $new = new RegisterEvent($pp,$user);
  357.                     $entityManager->persist($new);
  358.                     $entityManager->flush();
  359.                 }
  360.                 $this->addFlash('notice',"Tes matières ont bien été enregistrées");
  361.                 return $this->redirectToRoute('show-mission');
  362.             }
  363.         }
  364.         $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByChild($user);
  365.         return $this->render('dashboard/mission/training.html.twig', [
  366.             'trainings' => $packs,
  367.             'listPacks' => $listPacks,
  368.             'mission'   => $mission,
  369.             'lastSubscription'      =>$last,
  370.             'typeOffer'=>$typeOffer
  371.         ]);
  372.     }
  373.     /**
  374.      *
  375.      * @Route("/offer/mission/examen", name="offer-mission")
  376.      *
  377.      */
  378.     public function offerPackbac(Request $request,EntityManagerInterface $entityManager){
  379.         if($request->isMethod('post')){
  380.             $user $this->getUser();
  381.             $last $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
  382.             if($request->request->has('filiere')){
  383.                 $fil $request->request->get('filiere');
  384.                 $selectChoice = [128,141];
  385.                 $selectPack = [24,31];
  386.                 $isRegister $entityManager->getRepository(RegisterEvent::class)->findOneBy([
  387.                     'child' => $user->getId(), 'event' => $selectPack[intval($fil)-1],'archive'=>null
  388.                 ]);
  389.                 if(!$isRegister){
  390.                     $mission    $entityManager->getRepository(Mission::class)->find($selectChoice[intval($fil)-1]);
  391.                     if($last){
  392.                         $guardiant $last->getGuardiant();
  393.                         $new = new MissionExam();
  394.                         $new->setMission($mission);
  395.                         $new->setPrice(0);
  396.                         $new->setCustomer($guardiant);
  397.                         $new->setTitle($mission->getTitle());
  398.                         $new->setNbrDis($mission->getNbrDis());
  399.                         $entityManager->persist($new);
  400.                         $entityManager->flush();
  401.                         $pack $entityManager->getRepository(Pack::class)->find($selectPack[intval($fil)-1]);
  402.                         $new->addPacks($pack);
  403.                         $entityManager->flush();
  404.                         $register = new RegisterEvent($pack,$user);
  405.                         $entityManager->persist($register);
  406.                         $entityManager->flush();
  407.                         return $this->redirectToRoute('show-mission-name',['name'=>$pack->getSlug()]);
  408.                     }
  409.                 }
  410.             }
  411.             if($request->request->has('pack')){
  412.                 $packs $request->request->get('pack');
  413.                 $packs explode('-',$packs);
  414.                 $mission $entityManager->getRepository(Mission::class)->find(126);
  415.                 if($last) {
  416.                     $guardiant $last->getGuardiant();
  417.                     $new = new MissionExam();
  418.                     $new->setMission($mission);
  419.                     $new->setPrice(0);
  420.                     $new->setCustomer($guardiant);
  421.                     $new->setTitle($mission->getTitle());
  422.                     $new->setNbrDis($mission->getNbrDis());
  423.                     $entityManager->persist($new);
  424.                     $entityManager->flush();
  425.                     foreach ($packs as $id) {
  426.                         $isRegister $entityManager->getRepository(RegisterEvent::class)->findOneBy([
  427.                             'child' => $user->getId(), 'event' => $id'archive' => null
  428.                         ]);
  429.                         if (!$isRegister) {
  430.                             $pack $entityManager->getRepository(Pack::class)->find($id);
  431.                             $new->addPacks($pack);
  432.                             $entityManager->flush();
  433.                             $register = new RegisterEvent($pack$user);
  434.                             $entityManager->persist($register);
  435.                             $entityManager->flush();
  436.                         }
  437.                     }
  438.                     return $this->redirectToRoute('show-mission');
  439.                 }
  440.             }
  441.             if($request->request->has('brevet')){
  442.                 $mission $entityManager->getRepository(Mission::class)->find(130);
  443.                 if($last) {
  444.                     $guardiant $last->getGuardiant();
  445.                     $new = new MissionExam();
  446.                     $new->setMission($mission);
  447.                     $new->setPrice(0);
  448.                     $new->setCustomer($guardiant);
  449.                     $new->setTitle($mission->getTitle());
  450.                     $new->setNbrDis($mission->getNbrDis());
  451.                     $entityManager->persist($new);
  452.                     $entityManager->flush();
  453.                     $typeOffer $entityManager->getRepository(TypeOffer::class)->find(5);
  454.                     foreach ($typeOffer->getPacks() as $pc) {
  455.                         $isRegister $entityManager->getRepository(RegisterEvent::class)->findOneBy([
  456.                             'child' => $user->getId(), 'event' => $pc->getId(), 'archive' => null
  457.                         ]);
  458.                         if (!$isRegister) {
  459.                             $new->addPacks($pc);
  460.                             $entityManager->flush();
  461.                             $register = new RegisterEvent($pc$user);
  462.                             $entityManager->persist($register);
  463.                             $entityManager->flush();
  464.                         }
  465.                     }
  466.                 }
  467.             }
  468.         }
  469.         return $this->redirectToRoute('show-mission');
  470.     }
  471.     /**
  472.      *
  473.      *
  474.      * @IsGranted("ACCESS_FREE", subject="",message="subscripted")
  475.      * IsGranted("ACCESS_LBP", subject="",message="subscripted")
  476.      * @Route("/evenements", name="event-training",priority="1")
  477.      * @Route("/stages/{name}", name="show-training")
  478.      * @Route("/stages/{name}/{program}", name="show-program-training")
  479.      */
  480.     public function training(Request $request,SubscriptionMailer $subscriptionMailer$name null$program null): Response
  481.     {
  482.         $em $this->getDoctrine()->getManager();
  483.         $child $this->getUser();
  484.         $day null;
  485.         $artWorkStudy null;
  486.         $startDate  null;
  487.         $userClasse null;
  488.         $now = new \DateTime();
  489.         $courses = [];
  490.         if (!is_null($name)) {
  491.             $workshop $em->getRepository(AbstractEventTraining::class)->findOneBySlug($name);
  492.             $courses $em->getRepository(Course::class)->findBy(['front'=>true],['order'=>'asc']);
  493.             if ($workshop) {
  494.                 $isRegister $em->getRepository(RegisterEvent::class)->findOneBy([
  495.                     'child' => $child->getId(), 'event' => $workshop->getId(),'archive'=>null
  496.                 ]);
  497.                 if ($request->isMethod('post') || $isRegister) {
  498.                     $choiceArtWork null;
  499.                     if ($request->isMethod('post')) {
  500.                         $selectDiscipline $request->request->get('selectDisciplines');
  501.                         $zone $request->request->get('zone');
  502.                         $choiceArtWork $request->request->get('itemArt');
  503.                         $choiceArtWork = !is_null($choiceArtWork)&&!empty($choiceArtWork)?implode(',',$choiceArtWork):null;
  504.                         $day $workshop->displayFreqDay();
  505.                         if($workshop->getSummer()){
  506.                             if($workshop instanceOf HolidaysTraining){
  507.                                 $startDate  $request->request->get('startdate');
  508.                             }
  509.                             $userClasse $request->request->get('classes');
  510.                             $c $em->getRepository(Course::class)->findOneBySlug($userClasse);
  511.                             $child->setCourse($c);
  512.                             $day null;
  513.                         }
  514.                     } elseif ($isRegister) {
  515.                         $day $isRegister->displayProgramFreq();
  516.                         $selectDiscipline $isRegister->getDisciplineWithTube();
  517.                         $zone null;
  518.                         if($child->getCourse()->getslug()=="premiere" && $isRegister->getEvent() instanceof Pack && $isRegister->getEvent()->getSlug()==="packbac"){
  519.                             $choiceArtWork $isRegister->getPackArtWorkStudy();
  520.                         }
  521.                         if($workshop instanceOf HolidaysTraining){
  522.                             $child->setCourse($isRegister->getCourse());
  523.                         }
  524.                     }
  525.                     $program $em->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($workshop$child$selectDiscipline,$choiceArtWork,$isRegister?$isRegister->getCourse():null);
  526.                     if(!is_null($day)){
  527.                         $program array_slice($program,0,$day);
  528.                     }
  529.                     return $this->render('dashboard/show-training.html.twig', [
  530.                         'programs' => $program,
  531.                         'workshop' => $workshop,
  532.                         'day'      => $day,
  533.                         'zone'     => $zone,
  534.                         'choiceArtWork'=>$choiceArtWork,
  535.                         'selectDisciplines' => $selectDiscipline,
  536.                         'isRegister' => $isRegister,
  537.                         'startDate'=>$startDate,
  538.                         'userClasse'=>$userClasse
  539.                     ]);
  540.                 }
  541.                 $disciplines     $em->getRepository(AbstractProgram::class)->findAllProgramEvent($workshop$child);
  542.                 $sessionTraining $em->getRepository(SessionTraining::class)->findBy(['training'=>$workshop->getId()]);
  543.                 if($child->getCourse()->getslug()=="premiere" && $workshop->getSlug()==="packbac"){
  544.                     $artWorkStudy    $em->getRepository(ArtWorkStudy::class)->findAll();
  545.                 }
  546.                 return $this->render('dashboard/show-training.html.twig', [
  547.                     'workshop'       => $workshop,
  548.                     'disciplines'    => $disciplines,
  549.                     'sessionTraining'=> $sessionTraining,
  550.                     'artWorkStudy'   => $artWorkStudy,
  551.                     'courses'=>$courses
  552.                 ]);
  553.             }
  554.         }
  555.         $trainings $em->getRepository(AbstractEventTraining::class)->getTrainingRegisterEvent($child);
  556.         return $this->render('dashboard/training.html.twig', [
  557.             'trainings' => $trainings,
  558.         ]);
  559.     }
  560.     /**
  561.      * @Route("/save/register/training",name="save-register-training")
  562.      */
  563.     public function registerTraining(Request $request,SubscriptionMailer $subscriptionMailer)
  564.     {
  565.         $em $this->getDoctrine()->getManager();
  566.         $user $this->getUser();
  567.         if ($request->isMethod('post')) {
  568.             $workshop $request->request->get('workshop');
  569.             $choiceS  $request->request->get('chapter');
  570.             $discipls $request->request->get('disciplines');
  571.             $zone     $request->request->get('zone');
  572.             $choiceArtWork $request->request->get('choiceArtWork');
  573.             $startDate  $request->request->get('startdate');
  574.             $userClasse $request->request->get('course');
  575.             $discipls explode('|'$discipls);
  576.             $workshop $em->getRepository(AbstractEventTraining::class)->findOneBySlug($workshop);
  577.             if ($workshop) {
  578.                 $registerEvent = new RegisterEvent($workshop$user);
  579.                 foreach ($discipls as $d) {
  580.                     $disc $em->getRepository(Discipline::class)->findOneBySlug($d);
  581.                     $registerEvent->addSelectDisplines($disc);
  582.                 }
  583.                 if($zone != 'null' && !is_null($zone)){
  584.                     $sessionZone $em->getRepository(SessionTraining::class)->findOneBy(['id'=>$zone,'training'=>$workshop->getId()]);
  585.                     if($sessionZone){
  586.                         $registerEvent->setStartAt(clone $sessionZone->getStartAt());
  587.                     }
  588.                 }
  589.                 if(!empty($startDate)){
  590.                     $date \DateTime::createFromFormat('Y-m-d H:i:s'$startDate.' 00:00:00');
  591.                     $registerEvent->setStartAt($date);
  592.                 }
  593.                 if(!empty($userClasse)){
  594.                     $course $em->getRepository(Course::class)->findOneBySlug($userClasse);
  595.                     if($course){
  596.                         $registerEvent->setCourse($course);
  597.                     }
  598.                 }
  599.                 if(!is_null($choiceArtWork) && $choiceArtWork!=null ){
  600.                     $registerEvent->setPackArtWorkStudy($choiceArtWork);
  601.                 }
  602.                 $em->persist($registerEvent);
  603.                 $em->flush();
  604.                 foreach ($choiceS as $key=>$val){
  605.                     if($val!="null"){
  606.                         $absProgram $em->getRepository(AbstractProgram::class)->find($key);
  607.                         $wknode     $em->getRepository(WorkListNode::class)->find($val);
  608.                         $rp = new RegisterProgram($registerEvent,$absProgram,$wknode);
  609.                         $em->persist($rp);
  610.                         $em->flush();
  611.                     }
  612.                 }
  613.                 $startDate is_null($registerEvent->getStartAt())?$workshop->getStarted():$registerEvent->getStartAt();
  614.                 $cal \IntlCalendar::fromDateTime($startDate,'fr');
  615.                 $this->addFlash('notice'sprintf('Super ! Ton inscription au %s est validée ! Bravo pour ta motivation.<br/> On se retrouve pour les premiers programmes le %s.'$workshop->getTitle(),\IntlDateFormatter::formatObject($cal"d MMMM yyyy"'fr_FR')));
  616.                 $studentParents $em->getRepository(StudentsParents::class)->findOneByStudent($user);
  617.                 if($studentParents){
  618.                     $subscriptionMailer->sendRegisterTrainingEmail($studentParents->getParents(),$user,$workshop,$startDate);
  619.                 }
  620.                 return $this->redirectToRoute('show-training', ['name' => $workshop->getSlug()]);
  621.             }
  622.         }
  623.     }
  624.     /**
  625.      * @Route("/cancel/register/training/{id}",name="cancel-register-training")
  626.      */
  627.     public function cancelTraining(Request $request,$id)
  628.     {
  629.         $em $this->getDoctrine()->getManager();
  630.         $user $this->getUser();
  631.         if ($request->isMethod('post')) {
  632.             $workshop $em->getRepository(AbstractEventTraining::class)->find($id);
  633.             $isRegister $em->getRepository(RegisterEvent::class)->findOneBy([
  634.                 'child' => $user->getId(), 'event' => $workshop->getId()
  635.             ]);
  636.             if($isRegister){
  637.                 $em->getRepository(RegisterProgram::class)->deleteRPByRegisterEvent($isRegister);
  638.                 $em->remove($isRegister);
  639.                 $em->flush();
  640.                 $this->addFlash('notice','Votre inscription a bien été annulée.');
  641.                 return $this->redirectToRoute('training');
  642.             }
  643.         }
  644.         return $this->redirectToRoute('training');
  645.     }
  646.     /**
  647.      * @param Request $request
  648.      * @return JsonResponse
  649.      * @Route("/select/other/chapter/train",name="other-chapter")
  650.      */
  651.     public function selectOtherChapterForTraining(Request $request){
  652.         if($request->isXmlHttpRequest()){
  653.             $domId $request->get('dom');
  654.             $em    $this->getDoctrine()->getManager();
  655.             $dom   $em->getRepository(Domain::class)->find($domId);
  656.             $list $em->getRepository(WorkListNode::class)->getWkNodeOtherChapterForTraining($dom);
  657.             return new JsonResponse(['success'=>true,'list'=>$list]);
  658.         }
  659.     }
  660.     /**
  661.      * @Route("/recherche", name="search",priority="1")
  662.      */
  663.     public function search(Request $request)
  664.     {
  665.         $em          $this->getDoctrine()->getManager();
  666.         $courses     $em->getRepository(Course::class)->findBy(['front'=>1,],['order'=>'asc']);
  667.         try{
  668.             $url $this->getParameter('elastichsearch_url');
  669.             $client  ClientBuilder::create()->setHosts([substr($url0, -1)])->build();
  670.             if(!$client){
  671.                 $this->addFlash('notice','Notre service de recherche est actuellement hors service.');
  672.                 return $this->redirectToRoute('dashboard');
  673.             }
  674.         }catch (\Exception $exception){
  675.             $this->addFlash('notice','Notre service de recherche est actuellement hors service.');
  676.             return $this->redirectToRoute('dashboard');
  677.         }
  678.         $q $request->get('q');
  679.         $searchTerm  $q?$q:"*";
  680.         $result      = [];
  681.         $currentPage $request->get('page')?$request->get('page'):1;
  682.         $total       0;
  683.         $maxPerPage  20;
  684.         $filterClass =  $request->get('class');
  685.         $filterMatiere $request->get('matiere');
  686.         $currentUser   $this->getUser();
  687.         if(!empty($searchTerm)){
  688.             $params = [
  689.                 'index' => 'programs',
  690.                 'body' => [
  691.                     "from"=> $currentPage<=1?0:($currentPage-1)*$maxPerPage,
  692.                     "size"=> $maxPerPage,
  693.                     "track_total_hits"=> true,
  694.                     'highlight'=>[
  695.                         'fields'=>[
  696.                             'title'=>["type"=> "plain",'pre_tags' => ['<span class="highlight">'],"post_tags" => ["</span>"],],
  697.                             'description'=>["type"=> "plain",'pre_tags' => ['<span class="highlight">'],"post_tags" => ["</span>"],]
  698.                         ]
  699.                     ]
  700.                 ]
  701.             ];
  702.             $filter = [
  703.                 'nested'=>[
  704.                     'path'=>'domains',
  705.                     'query'=>[
  706.                         'bool'=>[
  707.                             'must'=>[],
  708.                         ]
  709.                     ]
  710.                 ]
  711.             ];
  712.             $filter['nested']['query']['bool']['must'][0] = ['match'=>['domains.cslug'=>$currentUser->getCourse()->getSlug()]];
  713.             $filterUri = [];
  714.             if(!empty($q)){
  715.                 $params['body']['query']['bool']['must'][] = ['multi_match' => [
  716.                     'query'=>$searchTerm,
  717.                     'fields'=>['title','description'],
  718.                     'boost'=>50,
  719.                     'operator'=>'or',
  720.                     'minimum_should_match' => "90%",
  721.                     "analyzer"=> "my_analyzer"
  722.                 ]];
  723.             }
  724.             if($request->get('matiere') || $request->get('class') || $request->get('free')){
  725.                 $reClass $request->get('class');
  726.                 if($reClass && !empty($reClass) && !is_null($reClass)){
  727.                     $filter['nested']['query']['bool']['must'][0] = ['match'=>['domains.cslug'=>$request->get('class')]];
  728.                     $filterUri['class'] = "class=$reClass";
  729.                 }
  730.                 $reMatiere $request->get('matiere');
  731.                 if($reMatiere && !empty($reMatiere) && !is_null($reMatiere)){
  732.                     $filter['nested']['query']['bool']['must'][] = ['match'=>['domains.disslug'=>$request->get('matiere')]];
  733.                     $filterUri['matiere'] = "matiere=$reMatiere";
  734.                 }
  735.                 $reMatiere $request->get('free');
  736.                 if(!empty($reMatiere) && !is_null($reMatiere)){
  737.                    // $filter['query']['bool']['must'] = ['match'=>['free'=>true]];
  738.                     $params['body']['query']['bool']['must'][] = ['match'=>['free'=>true]];
  739.                     $filterUri['free'] = "free=true";
  740.                 }
  741.             }
  742.             $params['body']['query']['bool']['filter']=$filter;
  743.             try{
  744.                 $result $client->search($params);
  745.             }catch (\Exception $exception){
  746.                 $this->addFlash('notice','Notre service de recherche est actuellement hors service.');
  747.                 return $this->redirectToRoute('dashboard');
  748.             }
  749.             $total $result['hits']['total']["value"];
  750.         }
  751.         $minPage 1;
  752.         $maxPage 5;
  753.         $nbrPage $total/$maxPerPage intval($total/$maxPerPage)>0?intval($total/$maxPerPage)+1:intval($total/$maxPerPage);
  754.         if($nbrPage<$currentPage && $total>0){
  755.             return $this->redirectToRoute('search',['q'=>$q,'page'=>$nbrPage]);
  756.         }
  757.         if($currentPage<=0){
  758.             return $this->redirectToRoute('search',['q'=>$q,'page'=>1]);
  759.         }
  760.         if($maxPage >= $nbrPage){
  761.             $maxPage $nbrPage;
  762.         }else{
  763.             $minPage $currentPage-5<=0?1:$currentPage-5;
  764.             $maxPage $currentPage+5>$nbrPage?$nbrPage:$currentPage+5;
  765.         }
  766.         $tmpClass    $request->get('class');
  767.         $selectClass = empty($tmpClass)?$currentUser->getCourse()->getSlug():$tmpClass;
  768.         $disciplines $em->getRepository(WorkListNode::class)->getDisciplinesForCourse($selectClass);
  769.         return $this->render('dashboard/search.html.twig', [
  770.             'query'      => $q,
  771.             'disciplines'=>$disciplines,
  772.             'courses'    =>$courses,
  773.             'results'     =>empty($result)?[]:$em->getRepository(ReviewProgramLesson::class)->addPercentLastActivitySearch($result['hits']['hits'],$currentUser,$selectClass),
  774.             'currentPage'=>$currentPage,
  775.             'nbrPage'=>$nbrPage,
  776.             'minPage'=>$minPage,
  777.             'maxPage'=>$maxPage,
  778.             'total'=>$total,
  779.             'filterClass'=>$filterClass,
  780.             'filterMatiere'=>$filterMatiere,
  781.             'filterUri' => implode('&',$filterUri),
  782.             'courseSelected'=> empty($tmpClass)?$currentUser->getCourse():$em->getRepository(Course::class)->findOneBySlug($tmpClass)
  783.         ]);
  784.     }
  785.     /**
  786.      * @Route("/bilans-pedagogiques", name="training-report",priority="1")
  787.      * @Route("/bilans-pedagogiques/{child}", name="training-report-child")
  788.      * @Route("/bilans-pedagogiques/{child}/{bilan}", name="training-report-child-show")
  789.      */
  790.     public function trainingReport(Request $request, ?Child $childDataAnalalysisChild $dataAnalalysisChild,$bilan null)
  791.     {
  792.         $targetUserSelect $this->choiceUserForDisplayTemplate($child);
  793.         [$startdataRange$endDataRange] = $dataAnalalysisChild->rangePeriodeDateStat($targetUserSelect);
  794.         $parameters = ['child' => $targetUserSelect,];
  795.         if(is_null($bilan)){
  796.             if(!is_null($startdataRange)){
  797.                 $startdataRange->modify('first day of this month');
  798.                 $diff $startdataRange->diff($endDataRange);
  799.                 $diffMonth $diff->$diff->12;
  800.                 $diffMonth $diffMonth 13 12 $diffMonth;
  801.                 $parameters array_merge($parameters,['endRange' => $endDataRange,'diffMonth' => $diffMonth]);
  802.             }
  803.         }else{
  804.             if(!is_integer(intval($bilan))){
  805.                 return $this->redirectToRoute('training-report-child',['child'=>$child->getId()]);
  806.             }
  807.             $selectDate = clone $endDataRange;
  808.             $selectDate->modify("-{$bilan} month");
  809.             $data $dataAnalalysisChild->rangeDataStatByChild($child$selectDate->format('Y-m'));
  810.             $graph null;
  811.             if (!empty($data) && !empty($data[0])) {
  812.                 $chart = new \QuickChart([
  813.                     'width' => 400,
  814.                     'height' => 150
  815.                 ]);
  816.                 $chart->setConfig('{
  817.                           type: "pie",
  818.                           data: {
  819.                             datasets: [' $data[0] . '],
  820.                           }
  821.                         }');
  822.                 $img $chart->toBinary();
  823.                 $graph '<img with="100%" src="data:image/png;base64,' base64_encode($img) . '"/>';
  824.             }
  825.             $em $this->getDoctrine()->getManager();
  826.             $findTemplate $em->getRepository(EmailTemplate::class)->findOneByMonthDate($selectDate->format('Y-m'));
  827.             $parameters array_merge($parameters,["data"=>$data,"img"=>$graph,"date"=>$selectDate,"emailTemplate"=>$findTemplate]);
  828.         }
  829.         return $this->render('dashboard/training-report.html.twig'$parameters);
  830.     }
  831.     /**
  832.      * @Route("/generate/training/report/pdf/{child}/{month}", name="generate-training-report-pdf")
  833.      */
  834.     public function generatetrainingReportPDF(Child $child$month 0DataAnalalysisChild $dataAnalalysisChildPdf $knpSnappyPdf)
  835.     {
  836.         $em $this->getDoctrine()->getManager();
  837.         $now = new \DateTime();
  838.         $now->modify("-{$month} month");
  839.         $findTemplate $em->getRepository(EmailTemplate::class)->findOneByStatus(true);
  840.         $data $dataAnalalysisChild->rangeDataStatByChild($child$now->format('Y-m'));
  841.         $graph 'Votre enfant n\'a pas réalisé d\'activité. Nous espérons que tout va bien';
  842.         if ($findTemplate) {
  843.             $content $findTemplate->getPdfContent();
  844.             if (!empty($content) && !is_null($content)) {
  845.                 if (!empty($data) && !empty($data[0])) {
  846.                     $chart = new \QuickChart([
  847.                         'width' => 400,
  848.                         'height' => 150
  849.                     ]);
  850.                     $chart->setConfig('{
  851.                           type: "pie",
  852.                           data: {
  853.                             datasets: [' $data[0] . '],
  854.                           }
  855.                         }');
  856.                     $img $chart->toBinary();
  857.                     $graph '<img with="100%" src="data:image/png;base64,' base64_encode($img) . '"/>';
  858.                 }
  859.                 $searchs = [
  860.                     '#PRENOM_ELEVE#',
  861.                     '#CLASSE_SERIE_ELEVE#',
  862.                     '#PRENOM_PARENT#',
  863.                     '#NB_TOTAL_ACTIVITE#',
  864.                     '#NB_VIDEO_VUE#',
  865.                     '#NB_QCM_EXERCICE_REALISE#',
  866.                 ];
  867.                 $replace = [
  868.                     utf8_encode($child->getFirstname()),
  869.                     $child->getCourse()->getTitle(),
  870.                     utf8_encode($child->getParents()[0]->getParents()->getFirstName()),
  871.                     empty($data[0]) ? : ($data[2]["video"]+$data[2]["exos"]),
  872.                     empty($data[0]) ? $data[2]["video"],
  873.                     empty($data[0]) ? $data[2]["exos"],
  874.                 ];
  875.                 $content str_replace($searchs$replace$content);
  876.                 $knpSnappyPdf->setOption('encoding''UTF-8');
  877.                 $contentHtml $this->renderView('dashboard/template-generate-bilanpeda.html.twig', [
  878.                     'data' => $data,
  879.                     'content' => $content,
  880.                     'GRAPHIQUE_MATIERE' => $graph
  881.                 ]);
  882.                 return new PdfResponse(
  883.                     $knpSnappyPdf->getOutputFromHtml($contentHtml)
  884.                     , "bilan-pedagogique.pdf", ['encoding' => 'UTF-8',]);
  885.             }
  886.         }
  887.         $user $this->getUser();
  888.         if($user && $user instanceof Parents){
  889.             return $this->redirectToRoute('training-report-child',['child'=>$child->getId()]);
  890.         }
  891.         return $this->redirectToRoute('training-report');
  892.     }
  893.     /**
  894.      * @Route("/send/email",name="email-contact", methods={"post"})
  895.      */
  896.     public function sendEmailContact(Request $requestMailerInterface $mailer)
  897.     {
  898.         $user $this->getUser();
  899.         $data $request->request->all();
  900.         if (!empty($data['message'])) {
  901.             $html "Nom         : {$data['identity']} <br/>" .
  902.                 "Utilisateur : {$user->getId()}<br/>" .
  903.                 "Identité : {$data['type']} <br/><br/>" .
  904.                 "Sujet    : {$data['subject']} <br/>" .
  905.                 "Message  :<br/> {$data['message']} <br/><br/>" .
  906.                 "Réponse  : {$data['contact']} <br/>";
  907.             $email = (new TemplatedEmail())
  908.                 ->from('[email protected]')
  909.                 ->to('[email protected]')
  910.                 ->subject('WEB Contact')
  911.                 ->htmlTemplate('mailer/alert/alert-contact.html.twig')
  912.                 ->context([
  913.                     'data' => $data,
  914.                     'user' => $user
  915.                 ])
  916.             ;
  917.                // ->html($html);
  918.             $mailer->send($email);
  919.             $this->addFlash('notice''Bien reçu ! Nous allons vous répondre très bientôt. Merci !');
  920.         } else {
  921.             $this->addFlash('notice''Veuillez bien remplir tous les champs. Merci !');
  922.         }
  923.         return $this->redirect($_SERVER['HTTP_REFERER']);
  924.     }
  925.     /**
  926.      * @IsGranted("ACCESS_FREE", subject="",message="subscripted")
  927.      * @IsGranted("ACCESS_LBP", subject="",message="subscripted")
  928.      * @Route("/service-assistance",name="profexpress",priority="1")
  929.      */
  930.     public function profexpress()
  931.     {
  932.         $user $this->getUser();
  933.         $em $this->getDoctrine()->getManager();
  934.         $subscription $em->getRepository(Subscription::class)->getLastSubscriptionByChild($user);
  935.         $now = new \DateTime('now');
  936.         if (is_null($subscription->getUnSubscripted()) || $subscription->getUnSubscripted() >= $now) {
  937.             return $this->render('dashboard/educational/profexpress.html.twig', []);
  938.         }
  939.         return $this->redirectToRoute('dashboard');
  940.     }
  941.     /**
  942.      * @Route("/popin/front", name="popin_front")
  943.      */
  944.     public function renderPopinFront(Request $requestChild $child null)
  945.     {
  946.         $child $this->getUser();
  947.         $em $this->getDoctrine()->getManager();
  948.         $workshop  $em->getRepository(AbstractEventTraining::class)->getCurrentTrainingPopinAdvertise();
  949.         if($workshop && $workshop->getDisplayPopinRegistration()){
  950.             $isRegister $em->getRepository(RegisterEvent::class)->findOneBy([
  951.                 'child'  => $child->getId(), 'event' => $workshop->getId(),
  952.                 'archive'=> null
  953.             ]);
  954.             if (!$isRegister) {
  955.                 $cookies $request->cookies;
  956.                 $response = new Response();
  957.                 $now = new \DateTime('now');
  958.                 $role 'child';
  959.                 $template 'dashboard/_partials/popin-front.html.twig';
  960.                 $limit = clone $now;
  961.                 $str2 strtotime($limit->format('Y-m-d 23:59:59'));
  962.                 if ((is_null($cookieTraining $cookies->get('space_popin_training_promote_' $child->getId())))) {
  963.                     $cookie = new Cookie('space_popin_training_promote_' $child->getId(), $role$str2);
  964.                     $response->headers->setCookie($cookie);
  965.                     $response->sendHeaders();
  966.                     return $this->render($template, [
  967.                         'wk'=>$workshop
  968.                     ]);
  969.                 }
  970.             }
  971.         }
  972.         return new Response();
  973.     }
  974.     /**
  975.      * @Route("/update/change/mission",name="up-change-mission")
  976.      */
  977.     public function renderUpdate(Request $request)
  978.     {
  979.         $user         $this->getUser();
  980.         $em           $this->getDoctrine()->getManager();
  981.         if($request->isMethod('post')){
  982.             if($request->request->has('itemArt')){
  983.                 $itemArt  $request->request->all('itemArt');
  984.                 $id $request->request->get('ms');
  985.                 $rg $em->getRepository(RegisterEvent::class)->findOneBy(['id'=>$id,'child'=>$user->getId()]);
  986.                 $rg->setPackArtWorkStudy(implode(',',$itemArt));
  987.                 $em->flush();
  988.             }
  989.             if($request->request->has('itemArtG')){
  990.                 $itemArt  $request->request->all('itemArtG');
  991.                 $id $request->request->get('mg');
  992.                 $rg $em->getRepository(RegisterEvent::class)->findOneBy(['id'=>$id,'child'=>$user->getId()]);
  993.                 $rg->setPackArtWorkStudy(implode(',',$itemArt));
  994.                 $em->flush();
  995.             }
  996.             $this->addFlash('notice',"Votre sélection oeuvres a bien été modifiée");
  997.             return $this->redirectToRoute('dashboard');
  998.         }
  999.         if($user){
  1000.             $mfTechno $em->getRepository(RegisterEvent::class)->findOneBy(['child'=>$user->getId(),'archive'=>null,'event'=>31]);
  1001.             $mfGe     $em->getRepository(RegisterEvent::class)->findOneBy(['child'=>$user->getId(),'archive'=>null,'event'=>24]);
  1002.             $year     = new \DateTime('2025-01-24 14:30:00');
  1003.             $tabF $this->extracted($mfTechno$year$em);
  1004.             $tabG $this->extracted($mfGe$year$em);
  1005.             if($tabF[1] || $tabG[1]){
  1006.                 $artWorkStudy  $em->getRepository(ArtWorkStudy::class)->getArtwork();
  1007.                 return $this->render('dashboard/mission/list-artwork.html.twig',[
  1008.                     'tg'=>$tabG,
  1009.                     'tf'=>$tabF,
  1010.                     'artWorkStudy'=>$artWorkStudy
  1011.                 ]);
  1012.             }
  1013.         }
  1014.         return new Response('');
  1015.     }
  1016.     /**
  1017.      * @Route("/popin/change/course", name="popin_change_course")
  1018.      * @IsGranted("ROLE_STUDENT")
  1019.      */
  1020.     public function renderPopinchangePopin(Request $request)
  1021.     {
  1022.         $user         $this->getUser();
  1023.         $em           $this->getDoctrine()->getManager();
  1024.         $courses      $em->getRepository(Course::class)->findBy(['front'=>true],['order'=>'asc']);
  1025.         $specialities $em->getRepository(Discipline::class)->findBy(["speciality"=>true],['title'=>'asc']);
  1026.         $now          = new \DateTime('now');
  1027.         $child        $em->getRepository(Child::class)->find($user->getId());
  1028.         $year = new \DateTime('10 july this year');
  1029.         if($child){
  1030.             $displayPopin = (!is_null($child->getNextScholarYear()) && $child->getNextScholarYear() < $now) || is_null($child->getDisplayPopinNextScholarYear()) && in_array($child->getCourse()->getId(), [14]) ;
  1031.             $ownerSpeciality = [];
  1032.             if($user instanceof Child && in_array($user->getCourse()->getId(),[1,4])){
  1033.                 $ownerSpeciality $em->getRepository(Speciality::class)->findByCourseAndStudent($user->getCourse(),$user);
  1034.             }
  1035.             $session $request->getSession();
  1036.             $displayPopinAfterRegistration true;
  1037.             if ($session->has('dashboardConfirmationEssaiGratuit') && $session->get('dashboardConfirmationEssaiGratuit') == true) {
  1038.                 // utilisateur (eleve) est redirige au dashboard apres l'inscription et l'eleve a deja des specialites -> ne plus afficher le popup
  1039.                 if(!empty($ownerSpeciality)){
  1040.                     $displayPopinAfterRegistration false;
  1041.                 }
  1042.                 $session->remove('dashboardConfirmationEssaiGratuit');
  1043.             }
  1044.             if($displayPopin && $displayPopinAfterRegistration){
  1045.                 $displaySpe   in_array($child->getCourse()->getId(),[1,4]);
  1046.                 return $this->render('popin/popin-change-course.html.twig',[
  1047.                     'courses'      => $courses,
  1048.                     'specialities' => $specialities,
  1049.                     'displaySpe'   => $displaySpe,
  1050.                     'ownerSpeciality' => $ownerSpeciality,
  1051.                     'displayCourse'=> !is_null($child->getNextScholarYear()) && $child->getNextScholarYear() <$now
  1052.                 ]);
  1053.             }
  1054.         }
  1055.         return new Response();
  1056.     }
  1057.     public function popinSubscriptionEndTrialPeriod(Request $request){
  1058.         $currentUser $this->getUser();
  1059.         $em $this->getDoctrine()->getManager();
  1060.         $cookies $request->cookies;
  1061.         $response = new Response();
  1062.         $now = new \DateTime('now');
  1063.         $zone $request->get('zone');
  1064.         $limit = clone $now;
  1065.         $limit->modify('+1 day');
  1066.         $str2 strtotime($limit->format('Y-m-d 23:59:59'));
  1067.         $isZoneFind false;
  1068.         $isNewId    false;
  1069.         $value = [];
  1070.         $target 'child';
  1071.         if($currentUser instanceof Parents){
  1072.             $target 'parents';
  1073.             $subs $em->getRepository(Subscription::class)->getLastSubscriptionsByParents($currentUser);
  1074.         }
  1075.         if($currentUser instanceof Child){
  1076.             $subs = [$em->getRepository(Subscription::class)->getLastSubscriptionByChild($currentUser)];
  1077.         }
  1078.         if (!is_null($cookies->get('popin_subscription_end_training_'.$target))) {
  1079.             $cookieTraining $cookies->get('popin_subscription_end_training_'.$target);
  1080.             $value json_decode($cookieTraining,true);
  1081.         }
  1082.         if(!empty($value)){
  1083.             if(in_array($zone,$value['zone'])){
  1084.                 $isZoneFind true;
  1085.             }
  1086.         }
  1087.         $value['zone'][] = $zone;
  1088.         $allSubscriptions = [];
  1089.         $ids = [];
  1090.         if(!empty($subs)){
  1091.             $now = new \DateTime('now');
  1092.             foreach ($subs as $row){
  1093.                 if(!is_null($row)){
  1094.                     if($row->getOffer()->getRole() == 'ROLE_TEST' && !is_null($row->getUnSubscripted()) && $row->getUnSubscripted()<$now){
  1095.                         $allSubscriptions[] = $row;
  1096.                         $ids[] = $row->getId();
  1097.                     }
  1098.                 }
  1099.             }
  1100.         }
  1101.         if(array_key_exists('ids',$value)){
  1102.             foreach ($ids as $id){
  1103.                 if(in_array($id,$value['ids'])){
  1104.                     $isNewId true;
  1105.                     $isZoneFind true;
  1106.                 }
  1107.             }
  1108.         }
  1109.         $value['ids']=$ids;
  1110.         if(!empty($allSubscriptions) && !$isZoneFind ){
  1111.             $cookieTraining = new Cookie('popin_subscription_end_training_'.$targetjson_encode($value), $str2);
  1112.             $response->headers->setCookie($cookieTraining);
  1113.             $response->sendHeaders();
  1114.             return $this->render('dashboard/fin-essai-gratuit-tmp.html.twig',['allS'=>$allSubscriptions]);
  1115.         }
  1116.         return new Response();
  1117.     }
  1118.     /**
  1119.      * @param object|null $mfTechno
  1120.      * @param \DateTime $year
  1121.      * @param \Doctrine\Persistence\ObjectManager $em
  1122.      * @return array
  1123.      */
  1124.     public function extracted(?object $mfTechno\DateTime $year\Doctrine\Persistence\ObjectManager $em): ?array
  1125.     {
  1126.         $verifT false;
  1127.         $export = [];
  1128.         if ($mfTechno instanceof RegisterEvent) {
  1129.             if ($year $mfTechno->getUpdated() && !is_null($mfTechno->getPackArtWorkStudy())) {
  1130.                 $export explode(','$mfTechno->getPackArtWorkStudy());
  1131.                 $listAwId $em->getRepository(ArtWorkStudy::class)->getArtworkActif();
  1132.                 $listAwId array_map(function ($list) {
  1133.                     return $list['id'];
  1134.                 }, $listAwId);
  1135.                 foreach ($export as $id) {
  1136.                     if (!in_array($id$listAwId)) {
  1137.                         $verifT true;
  1138.                     }
  1139.                 }
  1140.             }
  1141.             return array($export,$verifT,$mfTechno->getId());
  1142.         }
  1143.         return [$export,$verifT];
  1144.     }
  1145. }