<?php
namespace App\Controller\Dashboard;
use App\Entity\DataAnalysis\UserActivity;
use App\Entity\Educational\Course;
use App\Entity\Educational\Discipline;
use App\Entity\Educational\Domain;
use App\Entity\Educational\Lesson\ArtWorkStudy;
use App\Entity\Educational\Lesson\DesignScheme\AbstractContent;
use App\Entity\Educational\Lesson\WorkListNode;
use App\Entity\Educational\SchoolBag\ReviewProgram;
use App\Entity\Educational\SchoolBag\ReviewProgramLesson;
use App\Entity\Educational\Speciality;
use App\Entity\Event\RegisterEvent;
use App\Entity\Event\Training\AbstractEventTraining;
use App\Entity\Event\Training\AbstractProgram;
use App\Entity\Event\Training\Boost;
use App\Entity\Event\Training\HolidaysTraining;
use App\Entity\Event\Training\Pack;
use App\Entity\Event\Training\RegisterProgram;
use App\Entity\Event\Training\Resource;
use App\Entity\Event\Training\SessionTraining;
use App\Entity\Event\Training\Training;
use App\Entity\Management\Dashboard\NoticeDashboard;
use App\Entity\Management\ReportPeda\EmailTemplate;
use App\Entity\Management\Subscription\Mission;
use App\Entity\Management\Subscription\Offer;
use App\Entity\Management\Subscription\Purchase\MissionExam;
use App\Entity\Management\Subscription\Subscription;
use App\Entity\Management\Subscription\TypeOffer;
use App\Entity\Users\Child;
use App\Entity\Users\Parents;
use App\Entity\Users\StudentsParents;
use App\Service\Brevo;
use App\Service\DataAnalalysisChild;
use App\Service\Mailer\SubscriptionMailer;
use Doctrine\ORM\EntityManagerInterface;
use Elasticsearch\ClientBuilder;
use Exception;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Knp\Snappy\Pdf;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Message;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\JsonDecode;
use function PHPUnit\Framework\isEmpty;
/**
* @Route("/dashboard")
* @Security("is_granted('ROLE_PARENTS') or is_granted('ROLE_STUDENT') or is_granted('ROLE_FREE') or is_granted('ROLE_ADMIN')")
*/
class IndexController extends AbstractController
{
/**
* @Route("/enter/child", name="enter-child-dashboard")
*
*/
public function enterChildDashboard(Request $request,EntityManagerInterface $entityManager): Response
{
$user = $this->getUser();
if($user instanceof Child){
$last = $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if($last && $last->getOffer() && $last->getOffer()->getTypeOffer()){
if(in_array($last->getOffer()->getTypeOffer()->getSlug(),['mission-bac','mission-brevet','bac-francais'])){
return $this->redirectToRoute('show-mission');
}
}
}
return $this->redirectToRoute('dashboard');
}
/**
* @Route("/nouveau/subscription/{validation}", name="purchase-success")
* @Route("/utilisateur", name="choice-account")
*
*/
public function choiceAccount(Request $request,$validation = null): Response
{
$user = $this->getUser();
$session = $request->getSession();
$get_Offer = $validation;
$amount = 0;
if($user instanceof Parents){
$em = $this->getDoctrine()->getManager();
$listAccounts = [$user];
$children = $em->getRepository(Parents::class)->findChildrenEntityByParent($user);
$listAccounts = array_merge($listAccounts, $children);
$displayPopin = false;
if ($session->has('confirmationEssaiGratuit')) {
$displayPopin = true;
$amount = $session->get('toto');
$session->remove('confirmationEssaiGratuit');
}
$get_Offer = $get_Offer?(in_array($get_Offer,['essentielle','assistance-visio','bac-francais'])?$get_Offer:'essentielle'):'essentielle';
return $this->render('dashboard/choice-account.html.twig', [
'listAccount' => $listAccounts,
'displayPopin' => $displayPopin,
'get_Offer' => $get_Offer,
'validation' => $validation,
'amount' => $amount,
'hasModeDashboard'=>$request->query->has('hasModeDashboard')?boolval($request->query->get('hasModeDashboard')):null,
'mode_free'=>$session->has('mode_tunnel_free')?$session->get('mode_tunnel_free'):true
]);
}
return $this->redirectToRoute('dashboard');
}
/**
* @throws \Exception
*/
private function choiceUserForDisplayTemplate($child)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$targetUserSelect = $user;
if ($user instanceof Parents) {
if (!is_null($child)) {
$find = $em->getRepository(StudentsParents::class)->findByUserStudentandParent($user, $child);
if ($find) {
$targetUserSelect = $child;
} else {
$targetUserSelect = null;
}
} else {
$children = $em->getRepository(Parents::class)->findChildrenEntityByParent($user);
if (!empty($children)) {
$targetUserSelect = $children[0];
}else{
$targetUserSelect = null;
}
}
}
return $targetUserSelect;
}
/**
* @Route("", name="dashboard")
* @Route("/{child}", name="dashboard-child")
* @Route("/mission/{mission}/success", name="dashboard-mission-success")
*/
public function dashboard(Request $request, DataAnalalysisChild $dataAnalalysisChild,Child $child = null,$mission = null): Response
{
$em = $this->getDoctrine()->getManager();
$noticeDashboard = null;
$data = null;
$diplayMonthPeriode = null;
$user = $this->getUser();
$targetUserSelect = $this->choiceUserForDisplayTemplate($child);
if($user instanceof Parents){
if(is_null($targetUserSelect)){
//@TODO Création d'un compte enfant pour pouvoir tester le service
}else{
$lastSub = $em->getRepository(Subscription::class)->getLastSubscriptionByChild($targetUserSelect);
if(is_null($lastSub)){
//@TODO Activer une période d'essaie
}
}
}
if($user instanceof Child){
$lastSub = $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if(is_null($lastSub)){
//@TODO Mettre dans un manager
$sub = new Subscription();
$sub->setRenew(false);
$sub->setStudent($user);
$StudentParents = $em->getRepository(StudentsParents::class)->getByParent($user);
if($StudentParents){
$sub->setGuardiant($StudentParents->getParents());
}
$sub->setBankStripe(true);
$sub->setByChecked(false);
$sub->setRenew(false);
$sub->setIsMobile(false);
$sub->setPrice(0);
$sub->setSubscripted(new \DateTime());
$offer = $em->getRepository(Offer::class)->findOneBySlug(Offer::OFFER_FREE);
if($offer){
$sub->setOffer($offer);
$user->setRoles(['ROLE_STUDENT','ROLE_FREE']);
$em->persist($sub);
$em->flush();
return $this->redirectToRoute('dashboard');
}
}
}
$rPs = $em->getRepository(ReviewProgram::class)->findBy([
'student' => $targetUserSelect->getId()
], ['lastActivityAt' => 'desc'], 10);
[$startdataRange, $endDataRange] = $dataAnalalysisChild->rangePeriodeDateStat($targetUserSelect);
if(!is_null($startdataRange)){
$data = $dataAnalalysisChild->periodSubscriptionAtCurrentMonth($targetUserSelect);
$data = array_reverse($data);
$diplayMonthPeriode = array_reverse($dataAnalalysisChild->displayMonthPeriod($startdataRange,$endDataRange));
}
$back = $rpCopy = null;
$defis = [];
$tawkData = array();
$tawkData['course'] = "N/A";
if($user instanceof Child){
$noticeDashboard = $em->getRepository(NoticeDashboard::class)->getCurrentNotice('student',$user->getCourse());
if($back=$request->get('back')){
$rpCopy = $em->getRepository(ReviewProgram::class)->findOneBy([
'slug' =>trim($back)
]);
if(!$rpCopy || ($rpCopy && !$rpCopy instanceof ReviewProgramLesson) ){
$rpCopy = null;
}
}
$boost = $em->getRepository(Boost::class)->findOneBySlug('boost');
$register = $em->getRepository(RegisterEvent::class)->findOneBy([
'event'=>$boost->getId(),
'child'=>$user->getId()
]);
$defis = $em->getRepository(AbstractProgram::class)->defisProgramEventBoost($register);
$course = $user->getCourse();
if (!empty($course)) {
$tawkData['course'] = $course->getTitle();
}
}
if($user instanceof Parents){
$noticeDashboard = $em->getRepository(NoticeDashboard::class)->getCurrentNotice('parent', $targetUserSelect->getCourse());
}
$missionStat = [];
if($targetUserSelect){
$last = $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($targetUserSelect);
if($last){
$guardiant = $last->getGuardiant();
$missionExam = $em->getRepository(MissionExam::class)->getListMissionExam($user->getId(),$targetUserSelect->getCourse()->getId());
if(!empty($missionExam)){
foreach ($missionExam as $row){
$packs = $program = [];
foreach ($row->getPacks() as $p){
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy([
'child' => $targetUserSelect->getId(), 'event' => $p->getId(),'archive'=>null
]);
if($isRegister) {
$program = $em->getRepository(AbstractContent::class)->getStatMission($targetUserSelect,$isRegister->getEvent()->getDiscipline()->getId(),$isRegister->getPackArtWorkStudy());
// $program = $em->getRepository(AbstractProgram::class)->getStatMission($p, $targetUserSelect, "", $isRegister->getPackArtWorkStudy());
}
$packs[] = array_merge(['discipline'=>$p->getDiscipline()->getTitle(),'disId'=>$p->getDiscipline()->getId()],$program);
}
$missionStat[] = ['mission'=>$row->getMission()->getTypeOffer()->getTitle(),'packs'=>$packs];
}
}
}
}
return $this->render('dashboard/index.html.twig', [
'child' => $targetUserSelect,
'rPs' => $rPs,
'displayMonthPeriode'=>$diplayMonthPeriode,
'startDateRange' => $startdataRange,
'endDateRange' => $endDataRange?$endDataRange->modify('+1 month'):$startdataRange,
'data' => $data,
'noticeDashboard' => $noticeDashboard,
'rpCopy'=>$rpCopy,
'defis'=>$defis,
'tawkData' => $tawkData,
'missionStat'=> $missionStat,
'isPurchaseMission'=>$mission,
'beforeMissionExam'=>$targetUserSelect->getCourse()->getId()==1?'mes-revisions-2-mois-avant-le-bac':'mes-revisions-1-mois-avant-le-brevet'
]);
}
/**
* @Route("/dernieres-activites", name="last-activities",priority="1")
* @Route("/dernieres-activites/{child}", name="last-activities-child")
*/
public function activities(Request $request, Child $child = null): Response
{
$em = $this->getDoctrine()->getManager();
$targetUserSelect = $this->choiceUserForDisplayTemplate($child);
$rPs = $em->getRepository(ReviewProgram::class)->findBy([
'student' => $targetUserSelect->getId()
], ['updated' => 'desc'], 20);
return $this->render('dashboard/last-activities.html.twig', [
'child' => $child,
'rPs' => $rPs,
]);
}
/**
* @Route("/stages", name="training",priority="1")
*/
public function redirectStage(){
return $this->redirectToRoute('event-training',[],301);
}
/**
*
* @Route("/mission/examen", name="show-mission")
* @Route("/mission/{name}", name="show-mission-name")
*/
public function packbac(Request $request,EntityManagerInterface $entityManager,$name = null){
$user = $this->getUser();
$packs = $listPacks = [];
$workshop = $guardiant = $mission = null;
if($user instanceof Child){
$last = $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if($last){
$guardiant = $last->getGuardiant();
$packs = $entityManager->getRepository(MissionExam::class)->getListPack($guardiant->getId(),$user->getCourse()->getId());
}
}
if (!is_null($name)) {
$workshop = $entityManager->getRepository(AbstractEventTraining::class)->findOneBySlug($name);
if($workshop && $workshop instanceof Pack){
$isRegister = $entityManager->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $workshop->getId(),'archive'=>null
]);
if($isRegister){
if ($request->isMethod('post')){
$choiceArtWork = $request->request->get('itemArt');
$choiceArtWork = !is_null($choiceArtWork)&&!empty($choiceArtWork)?implode(',',$choiceArtWork):null;
$isRegister->setPackArtWorkStudy($choiceArtWork);
$entityManager->flush();
$this->addFlash('notice',"Ta sélection a bien été enregistrée");
return $this->redirectToRoute('show-mission-name',['name'=>$name]);
}
$program = $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline_2($workshop, $user,"",$isRegister->getPackArtWorkStudy());
$domains = $artWorkStudy = [];
if($workshop->getCourse() && $workshop->getDiscipline()){
$domains = $entityManager->getRepository(Domain::class)->getDomainV2($workshop->getCourse(),$workshop->getDiscipline());
if($workshop->getCourse()->getslug()=="premiere" && (empty($isRegister->getPackArtWorkStudy()) || is_null($isRegister->getPackArtWorkStudy()))){
$artWorkStudy = $entityManager->getRepository(ArtWorkStudy::class)->getArtwork();
}
}
$resources = $entityManager->getRepository(Resource::class)->findBy(['abstractEventTraining'=>$workshop->getId(),'online'=>true],['position'=>'asc']);
return $this->render('dashboard/mission/list-pack.html.twig', [
'packs' => $packs,
'workshop' => $workshop,
'programs' => $program,
'domains' => $domains,
'artWorkStudy'=> $artWorkStudy,
'isRegister' => $isRegister,
'resources' => $resources,
]);
}
}
}
$typeOffer = $entityManager->getRepository(TypeOffer::class)->findOneBySlug('mission-bac');
if(!is_null($guardiant) && $user->getCourse()->getId()==1){
$mission = $entityManager->getRepository(MissionExam::class)->purchaseMissionBac($guardiant->getId());
if($mission && $mission->getPacks()->isEmpty()){
$listPacks = $typeOffer->getPacks();
}
}
if($request->isMethod('post')){
$packs = $request->request->get('packs');
if(!empty($packs) && $mission->getMission()->getNbrDis()==count($packs)){
foreach ($packs as $id){
$pp = $entityManager->getRepository(Pack::class)->find($id);
$mission->addPacks($pp);
$new = new RegisterEvent($pp,$user);
$entityManager->persist($new);
$entityManager->flush();
}
$this->addFlash('notice',"Tes matières ont bien été enregistrées");
return $this->redirectToRoute('show-mission');
}
}
$last = $entityManager->getRepository(Subscription::class)->getLastSubscriptionByChild($user);
return $this->render('dashboard/mission/training.html.twig', [
'trainings' => $packs,
'listPacks' => $listPacks,
'mission' => $mission,
'lastSubscription' =>$last,
'typeOffer'=>$typeOffer
]);
}
/**
*
* @Route("/offer/mission/examen", name="offer-mission")
*
*/
public function offerPackbac(Request $request,EntityManagerInterface $entityManager){
if($request->isMethod('post')){
$user = $this->getUser();
$last = $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if($request->request->has('filiere')){
$fil = $request->request->get('filiere');
$selectChoice = [128,141];
$selectPack = [24,31];
$isRegister = $entityManager->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $selectPack[intval($fil)-1],'archive'=>null
]);
if(!$isRegister){
$mission = $entityManager->getRepository(Mission::class)->find($selectChoice[intval($fil)-1]);
if($last){
$guardiant = $last->getGuardiant();
$new = new MissionExam();
$new->setMission($mission);
$new->setPrice(0);
$new->setCustomer($guardiant);
$new->setTitle($mission->getTitle());
$new->setNbrDis($mission->getNbrDis());
$entityManager->persist($new);
$entityManager->flush();
$pack = $entityManager->getRepository(Pack::class)->find($selectPack[intval($fil)-1]);
$new->addPacks($pack);
$entityManager->flush();
$register = new RegisterEvent($pack,$user);
$entityManager->persist($register);
$entityManager->flush();
return $this->redirectToRoute('show-mission-name',['name'=>$pack->getSlug()]);
}
}
}
if($request->request->has('pack')){
$packs = $request->request->get('pack');
$packs = explode('-',$packs);
$mission = $entityManager->getRepository(Mission::class)->find(126);
if($last) {
$guardiant = $last->getGuardiant();
$new = new MissionExam();
$new->setMission($mission);
$new->setPrice(0);
$new->setCustomer($guardiant);
$new->setTitle($mission->getTitle());
$new->setNbrDis($mission->getNbrDis());
$entityManager->persist($new);
$entityManager->flush();
foreach ($packs as $id) {
$isRegister = $entityManager->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $id, 'archive' => null
]);
if (!$isRegister) {
$pack = $entityManager->getRepository(Pack::class)->find($id);
$new->addPacks($pack);
$entityManager->flush();
$register = new RegisterEvent($pack, $user);
$entityManager->persist($register);
$entityManager->flush();
}
}
return $this->redirectToRoute('show-mission');
}
}
if($request->request->has('brevet')){
$mission = $entityManager->getRepository(Mission::class)->find(130);
if($last) {
$guardiant = $last->getGuardiant();
$new = new MissionExam();
$new->setMission($mission);
$new->setPrice(0);
$new->setCustomer($guardiant);
$new->setTitle($mission->getTitle());
$new->setNbrDis($mission->getNbrDis());
$entityManager->persist($new);
$entityManager->flush();
$typeOffer = $entityManager->getRepository(TypeOffer::class)->find(5);
foreach ($typeOffer->getPacks() as $pc) {
$isRegister = $entityManager->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $pc->getId(), 'archive' => null
]);
if (!$isRegister) {
$new->addPacks($pc);
$entityManager->flush();
$register = new RegisterEvent($pc, $user);
$entityManager->persist($register);
$entityManager->flush();
}
}
}
}
}
return $this->redirectToRoute('show-mission');
}
/**
*
*
* @IsGranted("ACCESS_FREE", subject="",message="subscripted")
* IsGranted("ACCESS_LBP", subject="",message="subscripted")
* @Route("/evenements", name="event-training",priority="1")
* @Route("/stages/{name}", name="show-training")
* @Route("/stages/{name}/{program}", name="show-program-training")
*/
public function training(Request $request,SubscriptionMailer $subscriptionMailer, $name = null, $program = null): Response
{
$em = $this->getDoctrine()->getManager();
$child = $this->getUser();
$day = null;
$artWorkStudy = null;
$startDate = null;
$userClasse = null;
$now = new \DateTime();
$courses = [];
if (!is_null($name)) {
$workshop = $em->getRepository(AbstractEventTraining::class)->findOneBySlug($name);
$courses = $em->getRepository(Course::class)->findBy(['front'=>true],['order'=>'asc']);
if ($workshop) {
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy([
'child' => $child->getId(), 'event' => $workshop->getId(),'archive'=>null
]);
if ($request->isMethod('post') || $isRegister) {
$choiceArtWork = null;
if ($request->isMethod('post')) {
$selectDiscipline = $request->request->get('selectDisciplines');
$zone = $request->request->get('zone');
$choiceArtWork = $request->request->get('itemArt');
$choiceArtWork = !is_null($choiceArtWork)&&!empty($choiceArtWork)?implode(',',$choiceArtWork):null;
$day = $workshop->displayFreqDay();
if($workshop->getSummer()){
if($workshop instanceOf HolidaysTraining){
$startDate = $request->request->get('startdate');
}
$userClasse = $request->request->get('classes');
$c = $em->getRepository(Course::class)->findOneBySlug($userClasse);
$child->setCourse($c);
$day = null;
}
} elseif ($isRegister) {
$day = $isRegister->displayProgramFreq();
$selectDiscipline = $isRegister->getDisciplineWithTube();
$zone = null;
if($child->getCourse()->getslug()=="premiere" && $isRegister->getEvent() instanceof Pack && $isRegister->getEvent()->getSlug()==="packbac"){
$choiceArtWork = $isRegister->getPackArtWorkStudy();
}
if($workshop instanceOf HolidaysTraining){
$child->setCourse($isRegister->getCourse());
}
}
$program = $em->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($workshop, $child, $selectDiscipline,$choiceArtWork,$isRegister?$isRegister->getCourse():null);
if(!is_null($day)){
$program = array_slice($program,0,$day);
}
return $this->render('dashboard/show-training.html.twig', [
'programs' => $program,
'workshop' => $workshop,
'day' => $day,
'zone' => $zone,
'choiceArtWork'=>$choiceArtWork,
'selectDisciplines' => $selectDiscipline,
'isRegister' => $isRegister,
'startDate'=>$startDate,
'userClasse'=>$userClasse
]);
}
$disciplines = $em->getRepository(AbstractProgram::class)->findAllProgramEvent($workshop, $child);
$sessionTraining = $em->getRepository(SessionTraining::class)->findBy(['training'=>$workshop->getId()]);
if($child->getCourse()->getslug()=="premiere" && $workshop->getSlug()==="packbac"){
$artWorkStudy = $em->getRepository(ArtWorkStudy::class)->findAll();
}
return $this->render('dashboard/show-training.html.twig', [
'workshop' => $workshop,
'disciplines' => $disciplines,
'sessionTraining'=> $sessionTraining,
'artWorkStudy' => $artWorkStudy,
'courses'=>$courses
]);
}
}
$trainings = $em->getRepository(AbstractEventTraining::class)->getTrainingRegisterEvent($child);
return $this->render('dashboard/training.html.twig', [
'trainings' => $trainings,
]);
}
/**
* @Route("/save/register/training",name="save-register-training")
*/
public function registerTraining(Request $request,SubscriptionMailer $subscriptionMailer)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
if ($request->isMethod('post')) {
$workshop = $request->request->get('workshop');
$choiceS = $request->request->get('chapter');
$discipls = $request->request->get('disciplines');
$zone = $request->request->get('zone');
$choiceArtWork = $request->request->get('choiceArtWork');
$startDate = $request->request->get('startdate');
$userClasse = $request->request->get('course');
$discipls = explode('|', $discipls);
$workshop = $em->getRepository(AbstractEventTraining::class)->findOneBySlug($workshop);
if ($workshop) {
$registerEvent = new RegisterEvent($workshop, $user);
foreach ($discipls as $d) {
$disc = $em->getRepository(Discipline::class)->findOneBySlug($d);
$registerEvent->addSelectDisplines($disc);
}
if($zone != 'null' && !is_null($zone)){
$sessionZone = $em->getRepository(SessionTraining::class)->findOneBy(['id'=>$zone,'training'=>$workshop->getId()]);
if($sessionZone){
$registerEvent->setStartAt(clone $sessionZone->getStartAt());
}
}
if(!empty($startDate)){
$date = \DateTime::createFromFormat('Y-m-d H:i:s', $startDate.' 00:00:00');
$registerEvent->setStartAt($date);
}
if(!empty($userClasse)){
$course = $em->getRepository(Course::class)->findOneBySlug($userClasse);
if($course){
$registerEvent->setCourse($course);
}
}
if(!is_null($choiceArtWork) && $choiceArtWork!=null ){
$registerEvent->setPackArtWorkStudy($choiceArtWork);
}
$em->persist($registerEvent);
$em->flush();
foreach ($choiceS as $key=>$val){
if($val!="null"){
$absProgram = $em->getRepository(AbstractProgram::class)->find($key);
$wknode = $em->getRepository(WorkListNode::class)->find($val);
$rp = new RegisterProgram($registerEvent,$absProgram,$wknode);
$em->persist($rp);
$em->flush();
}
}
$startDate = is_null($registerEvent->getStartAt())?$workshop->getStarted():$registerEvent->getStartAt();
$cal = \IntlCalendar::fromDateTime($startDate,'fr');
$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')));
$studentParents = $em->getRepository(StudentsParents::class)->findOneByStudent($user);
if($studentParents){
$subscriptionMailer->sendRegisterTrainingEmail($studentParents->getParents(),$user,$workshop,$startDate);
}
return $this->redirectToRoute('show-training', ['name' => $workshop->getSlug()]);
}
}
}
/**
* @Route("/cancel/register/training/{id}",name="cancel-register-training")
*/
public function cancelTraining(Request $request,$id)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
if ($request->isMethod('post')) {
$workshop = $em->getRepository(AbstractEventTraining::class)->find($id);
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $workshop->getId()
]);
if($isRegister){
$em->getRepository(RegisterProgram::class)->deleteRPByRegisterEvent($isRegister);
$em->remove($isRegister);
$em->flush();
$this->addFlash('notice','Votre inscription a bien été annulée.');
return $this->redirectToRoute('training');
}
}
return $this->redirectToRoute('training');
}
/**
* @param Request $request
* @return JsonResponse
* @Route("/select/other/chapter/train",name="other-chapter")
*/
public function selectOtherChapterForTraining(Request $request){
if($request->isXmlHttpRequest()){
$domId = $request->get('dom');
$em = $this->getDoctrine()->getManager();
$dom = $em->getRepository(Domain::class)->find($domId);
$list = $em->getRepository(WorkListNode::class)->getWkNodeOtherChapterForTraining($dom);
return new JsonResponse(['success'=>true,'list'=>$list]);
}
}
/**
* @Route("/recherche", name="search",priority="1")
*/
public function search(Request $request)
{
$em = $this->getDoctrine()->getManager();
$courses = $em->getRepository(Course::class)->findBy(['front'=>1,],['order'=>'asc']);
try{
$url = $this->getParameter('elastichsearch_url');
$client = ClientBuilder::create()->setHosts([substr($url, 0, -1)])->build();
if(!$client){
$this->addFlash('notice','Notre service de recherche est actuellement hors service.');
return $this->redirectToRoute('dashboard');
}
}catch (\Exception $exception){
$this->addFlash('notice','Notre service de recherche est actuellement hors service.');
return $this->redirectToRoute('dashboard');
}
$q = $request->get('q');
$searchTerm = $q?$q:"*";
$result = [];
$currentPage = $request->get('page')?$request->get('page'):1;
$total = 0;
$maxPerPage = 20;
$filterClass = $request->get('class');
$filterMatiere = $request->get('matiere');
$currentUser = $this->getUser();
if(!empty($searchTerm)){
$params = [
'index' => 'programs',
'body' => [
"from"=> $currentPage<=1?0:($currentPage-1)*$maxPerPage,
"size"=> $maxPerPage,
"track_total_hits"=> true,
'highlight'=>[
'fields'=>[
'title'=>["type"=> "plain",'pre_tags' => ['<span class="highlight">'],"post_tags" => ["</span>"],],
'description'=>["type"=> "plain",'pre_tags' => ['<span class="highlight">'],"post_tags" => ["</span>"],]
]
]
]
];
$filter = [
'nested'=>[
'path'=>'domains',
'query'=>[
'bool'=>[
'must'=>[],
]
]
]
];
$filter['nested']['query']['bool']['must'][0] = ['match'=>['domains.cslug'=>$currentUser->getCourse()->getSlug()]];
$filterUri = [];
if(!empty($q)){
$params['body']['query']['bool']['must'][] = ['multi_match' => [
'query'=>$searchTerm,
'fields'=>['title','description'],
'boost'=>50,
'operator'=>'or',
'minimum_should_match' => "90%",
"analyzer"=> "my_analyzer"
]];
}
if($request->get('matiere') || $request->get('class') || $request->get('free')){
$reClass = $request->get('class');
if($reClass && !empty($reClass) && !is_null($reClass)){
$filter['nested']['query']['bool']['must'][0] = ['match'=>['domains.cslug'=>$request->get('class')]];
$filterUri['class'] = "class=$reClass";
}
$reMatiere = $request->get('matiere');
if($reMatiere && !empty($reMatiere) && !is_null($reMatiere)){
$filter['nested']['query']['bool']['must'][] = ['match'=>['domains.disslug'=>$request->get('matiere')]];
$filterUri['matiere'] = "matiere=$reMatiere";
}
$reMatiere = $request->get('free');
if(!empty($reMatiere) && !is_null($reMatiere)){
// $filter['query']['bool']['must'] = ['match'=>['free'=>true]];
$params['body']['query']['bool']['must'][] = ['match'=>['free'=>true]];
$filterUri['free'] = "free=true";
}
}
$params['body']['query']['bool']['filter']=$filter;
try{
$result = $client->search($params);
}catch (\Exception $exception){
$this->addFlash('notice','Notre service de recherche est actuellement hors service.');
return $this->redirectToRoute('dashboard');
}
$total = $result['hits']['total']["value"];
}
$minPage = 1;
$maxPage = 5;
$nbrPage = $total/$maxPerPage - intval($total/$maxPerPage)>0?intval($total/$maxPerPage)+1:intval($total/$maxPerPage);
if($nbrPage<$currentPage && $total>0){
return $this->redirectToRoute('search',['q'=>$q,'page'=>$nbrPage]);
}
if($currentPage<=0){
return $this->redirectToRoute('search',['q'=>$q,'page'=>1]);
}
if($maxPage >= $nbrPage){
$maxPage = $nbrPage;
}else{
$minPage = $currentPage-5<=0?1:$currentPage-5;
$maxPage = $currentPage+5>$nbrPage?$nbrPage:$currentPage+5;
}
$tmpClass = $request->get('class');
$selectClass = empty($tmpClass)?$currentUser->getCourse()->getSlug():$tmpClass;
$disciplines = $em->getRepository(WorkListNode::class)->getDisciplinesForCourse($selectClass);
return $this->render('dashboard/search.html.twig', [
'query' => $q,
'disciplines'=>$disciplines,
'courses' =>$courses,
'results' =>empty($result)?[]:$em->getRepository(ReviewProgramLesson::class)->addPercentLastActivitySearch($result['hits']['hits'],$currentUser,$selectClass),
'currentPage'=>$currentPage,
'nbrPage'=>$nbrPage,
'minPage'=>$minPage,
'maxPage'=>$maxPage,
'total'=>$total,
'filterClass'=>$filterClass,
'filterMatiere'=>$filterMatiere,
'filterUri' => implode('&',$filterUri),
'courseSelected'=> empty($tmpClass)?$currentUser->getCourse():$em->getRepository(Course::class)->findOneBySlug($tmpClass)
]);
}
/**
* @Route("/bilans-pedagogiques", name="training-report",priority="1")
* @Route("/bilans-pedagogiques/{child}", name="training-report-child")
* @Route("/bilans-pedagogiques/{child}/{bilan}", name="training-report-child-show")
*/
public function trainingReport(Request $request, ?Child $child, DataAnalalysisChild $dataAnalalysisChild,$bilan = null)
{
$targetUserSelect = $this->choiceUserForDisplayTemplate($child);
[$startdataRange, $endDataRange] = $dataAnalalysisChild->rangePeriodeDateStat($targetUserSelect);
$parameters = ['child' => $targetUserSelect,];
if(is_null($bilan)){
if(!is_null($startdataRange)){
$startdataRange->modify('first day of this month');
$diff = $startdataRange->diff($endDataRange);
$diffMonth = $diff->m + $diff->y * 12;
$diffMonth = $diffMonth > 13 ? 12 : $diffMonth;
$parameters = array_merge($parameters,['endRange' => $endDataRange,'diffMonth' => $diffMonth]);
}
}else{
if(!is_integer(intval($bilan))){
return $this->redirectToRoute('training-report-child',['child'=>$child->getId()]);
}
$selectDate = clone $endDataRange;
$selectDate->modify("-{$bilan} month");
$data = $dataAnalalysisChild->rangeDataStatByChild($child, $selectDate->format('Y-m'));
$graph = null;
if (!empty($data) && !empty($data[0])) {
$chart = new \QuickChart([
'width' => 400,
'height' => 150
]);
$chart->setConfig('{
type: "pie",
data: {
datasets: [' . $data[0] . '],
}
}');
$img = $chart->toBinary();
$graph = '<img with="100%" src="data:image/png;base64,' . base64_encode($img) . '"/>';
}
$em = $this->getDoctrine()->getManager();
$findTemplate = $em->getRepository(EmailTemplate::class)->findOneByMonthDate($selectDate->format('Y-m'));
$parameters = array_merge($parameters,["data"=>$data,"img"=>$graph,"date"=>$selectDate,"emailTemplate"=>$findTemplate]);
}
return $this->render('dashboard/training-report.html.twig', $parameters);
}
/**
* @Route("/generate/training/report/pdf/{child}/{month}", name="generate-training-report-pdf")
*/
public function generatetrainingReportPDF(Child $child, $month = 0, DataAnalalysisChild $dataAnalalysisChild, Pdf $knpSnappyPdf)
{
$em = $this->getDoctrine()->getManager();
$now = new \DateTime();
$now->modify("-{$month} month");
$findTemplate = $em->getRepository(EmailTemplate::class)->findOneByStatus(true);
$data = $dataAnalalysisChild->rangeDataStatByChild($child, $now->format('Y-m'));
$graph = 'Votre enfant n\'a pas réalisé d\'activité. Nous espérons que tout va bien';
if ($findTemplate) {
$content = $findTemplate->getPdfContent();
if (!empty($content) && !is_null($content)) {
if (!empty($data) && !empty($data[0])) {
$chart = new \QuickChart([
'width' => 400,
'height' => 150
]);
$chart->setConfig('{
type: "pie",
data: {
datasets: [' . $data[0] . '],
}
}');
$img = $chart->toBinary();
$graph = '<img with="100%" src="data:image/png;base64,' . base64_encode($img) . '"/>';
}
$searchs = [
'#PRENOM_ELEVE#',
'#CLASSE_SERIE_ELEVE#',
'#PRENOM_PARENT#',
'#NB_TOTAL_ACTIVITE#',
'#NB_VIDEO_VUE#',
'#NB_QCM_EXERCICE_REALISE#',
];
$replace = [
utf8_encode($child->getFirstname()),
$child->getCourse()->getTitle(),
utf8_encode($child->getParents()[0]->getParents()->getFirstName()),
empty($data[0]) ? 0 : ($data[2]["video"]+$data[2]["exos"]),
empty($data[0]) ? 0 : $data[2]["video"],
empty($data[0]) ? 0 : $data[2]["exos"],
];
$content = str_replace($searchs, $replace, $content);
$knpSnappyPdf->setOption('encoding', 'UTF-8');
$contentHtml = $this->renderView('dashboard/template-generate-bilanpeda.html.twig', [
'data' => $data,
'content' => $content,
'GRAPHIQUE_MATIERE' => $graph
]);
return new PdfResponse(
$knpSnappyPdf->getOutputFromHtml($contentHtml)
, "bilan-pedagogique.pdf", ['encoding' => 'UTF-8',]);
}
}
$user = $this->getUser();
if($user && $user instanceof Parents){
return $this->redirectToRoute('training-report-child',['child'=>$child->getId()]);
}
return $this->redirectToRoute('training-report');
}
/**
* @Route("/send/email",name="email-contact", methods={"post"})
*/
public function sendEmailContact(Request $request, MailerInterface $mailer)
{
$user = $this->getUser();
$data = $request->request->all();
if (!empty($data['message'])) {
$html = "Nom : {$data['identity']} <br/>" .
"Utilisateur : {$user->getId()}<br/>" .
"Identité : {$data['type']} <br/><br/>" .
"Sujet : {$data['subject']} <br/>" .
"Message :<br/> {$data['message']} <br/><br/>" .
"Réponse : {$data['contact']} <br/>";
$email = (new TemplatedEmail())
->from('[email protected]')
->to('[email protected]')
->subject('WEB Contact')
->htmlTemplate('mailer/alert/alert-contact.html.twig')
->context([
'data' => $data,
'user' => $user
])
;
// ->html($html);
$mailer->send($email);
$this->addFlash('notice', 'Bien reçu ! Nous allons vous répondre très bientôt. Merci !');
} else {
$this->addFlash('notice', 'Veuillez bien remplir tous les champs. Merci !');
}
return $this->redirect($_SERVER['HTTP_REFERER']);
}
/**
* @IsGranted("ACCESS_FREE", subject="",message="subscripted")
* @IsGranted("ACCESS_LBP", subject="",message="subscripted")
* @Route("/service-assistance",name="profexpress",priority="1")
*/
public function profexpress()
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$subscription = $em->getRepository(Subscription::class)->getLastSubscriptionByChild($user);
$now = new \DateTime('now');
if (is_null($subscription->getUnSubscripted()) || $subscription->getUnSubscripted() >= $now) {
return $this->render('dashboard/educational/profexpress.html.twig', []);
}
return $this->redirectToRoute('dashboard');
}
/**
* @Route("/popin/front", name="popin_front")
*/
public function renderPopinFront(Request $request, Child $child = null)
{
$child = $this->getUser();
$em = $this->getDoctrine()->getManager();
$workshop = $em->getRepository(AbstractEventTraining::class)->getCurrentTrainingPopinAdvertise();
if($workshop && $workshop->getDisplayPopinRegistration()){
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy([
'child' => $child->getId(), 'event' => $workshop->getId(),
'archive'=> null
]);
if (!$isRegister) {
$cookies = $request->cookies;
$response = new Response();
$now = new \DateTime('now');
$role = 'child';
$template = 'dashboard/_partials/popin-front.html.twig';
$limit = clone $now;
$str2 = strtotime($limit->format('Y-m-d 23:59:59'));
if ((is_null($cookieTraining = $cookies->get('space_popin_training_promote_' . $child->getId())))) {
$cookie = new Cookie('space_popin_training_promote_' . $child->getId(), $role, $str2);
$response->headers->setCookie($cookie);
$response->sendHeaders();
return $this->render($template, [
'wk'=>$workshop
]);
}
}
}
return new Response();
}
/**
* @Route("/update/change/mission",name="up-change-mission")
*/
public function renderUpdate(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
if($request->isMethod('post')){
if($request->request->has('itemArt')){
$itemArt = $request->request->all('itemArt');
$id = $request->request->get('ms');
$rg = $em->getRepository(RegisterEvent::class)->findOneBy(['id'=>$id,'child'=>$user->getId()]);
$rg->setPackArtWorkStudy(implode(',',$itemArt));
$em->flush();
}
if($request->request->has('itemArtG')){
$itemArt = $request->request->all('itemArtG');
$id = $request->request->get('mg');
$rg = $em->getRepository(RegisterEvent::class)->findOneBy(['id'=>$id,'child'=>$user->getId()]);
$rg->setPackArtWorkStudy(implode(',',$itemArt));
$em->flush();
}
$this->addFlash('notice',"Votre sélection oeuvres a bien été modifiée");
return $this->redirectToRoute('dashboard');
}
if($user){
$mfTechno = $em->getRepository(RegisterEvent::class)->findOneBy(['child'=>$user->getId(),'archive'=>null,'event'=>31]);
$mfGe = $em->getRepository(RegisterEvent::class)->findOneBy(['child'=>$user->getId(),'archive'=>null,'event'=>24]);
$year = new \DateTime('2025-01-24 14:30:00');
$tabF = $this->extracted($mfTechno, $year, $em);
$tabG = $this->extracted($mfGe, $year, $em);
if($tabF[1] || $tabG[1]){
$artWorkStudy = $em->getRepository(ArtWorkStudy::class)->getArtwork();
return $this->render('dashboard/mission/list-artwork.html.twig',[
'tg'=>$tabG,
'tf'=>$tabF,
'artWorkStudy'=>$artWorkStudy
]);
}
}
return new Response('');
}
/**
* @Route("/popin/change/course", name="popin_change_course")
* @IsGranted("ROLE_STUDENT")
*/
public function renderPopinchangePopin(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$courses = $em->getRepository(Course::class)->findBy(['front'=>true],['order'=>'asc']);
$specialities = $em->getRepository(Discipline::class)->findBy(["speciality"=>true],['title'=>'asc']);
$now = new \DateTime('now');
$child = $em->getRepository(Child::class)->find($user->getId());
$year = new \DateTime('10 july this year');
if($child){
$displayPopin = (!is_null($child->getNextScholarYear()) && $child->getNextScholarYear() < $now) || is_null($child->getDisplayPopinNextScholarYear()) && in_array($child->getCourse()->getId(), [1, 4]) ;
$ownerSpeciality = [];
if($user instanceof Child && in_array($user->getCourse()->getId(),[1,4])){
$ownerSpeciality = $em->getRepository(Speciality::class)->findByCourseAndStudent($user->getCourse(),$user);
}
$session = $request->getSession();
$displayPopinAfterRegistration = true;
if ($session->has('dashboardConfirmationEssaiGratuit') && $session->get('dashboardConfirmationEssaiGratuit') == true) {
// utilisateur (eleve) est redirige au dashboard apres l'inscription et l'eleve a deja des specialites -> ne plus afficher le popup
if(!empty($ownerSpeciality)){
$displayPopinAfterRegistration = false;
}
$session->remove('dashboardConfirmationEssaiGratuit');
}
if($displayPopin && $displayPopinAfterRegistration){
$displaySpe = in_array($child->getCourse()->getId(),[1,4]);
return $this->render('popin/popin-change-course.html.twig',[
'courses' => $courses,
'specialities' => $specialities,
'displaySpe' => $displaySpe,
'ownerSpeciality' => $ownerSpeciality,
'displayCourse'=> !is_null($child->getNextScholarYear()) && $child->getNextScholarYear() <$now
]);
}
}
return new Response();
}
public function popinSubscriptionEndTrialPeriod(Request $request){
$currentUser = $this->getUser();
$em = $this->getDoctrine()->getManager();
$cookies = $request->cookies;
$response = new Response();
$now = new \DateTime('now');
$zone = $request->get('zone');
$limit = clone $now;
$limit->modify('+1 day');
$str2 = strtotime($limit->format('Y-m-d 23:59:59'));
$isZoneFind = false;
$isNewId = false;
$value = [];
$target = 'child';
if($currentUser instanceof Parents){
$target = 'parents';
$subs = $em->getRepository(Subscription::class)->getLastSubscriptionsByParents($currentUser);
}
if($currentUser instanceof Child){
$subs = [$em->getRepository(Subscription::class)->getLastSubscriptionByChild($currentUser)];
}
if (!is_null($cookies->get('popin_subscription_end_training_'.$target))) {
$cookieTraining = $cookies->get('popin_subscription_end_training_'.$target);
$value = json_decode($cookieTraining,true);
}
if(!empty($value)){
if(in_array($zone,$value['zone'])){
$isZoneFind = true;
}
}
$value['zone'][] = $zone;
$allSubscriptions = [];
$ids = [];
if(!empty($subs)){
$now = new \DateTime('now');
foreach ($subs as $row){
if(!is_null($row)){
if($row->getOffer()->getRole() == 'ROLE_TEST' && !is_null($row->getUnSubscripted()) && $row->getUnSubscripted()<$now){
$allSubscriptions[] = $row;
$ids[] = $row->getId();
}
}
}
}
if(array_key_exists('ids',$value)){
foreach ($ids as $id){
if(in_array($id,$value['ids'])){
$isNewId = true;
$isZoneFind = true;
}
}
}
$value['ids']=$ids;
if(!empty($allSubscriptions) && !$isZoneFind ){
$cookieTraining = new Cookie('popin_subscription_end_training_'.$target, json_encode($value), $str2);
$response->headers->setCookie($cookieTraining);
$response->sendHeaders();
return $this->render('dashboard/fin-essai-gratuit-tmp.html.twig',['allS'=>$allSubscriptions]);
}
return new Response();
}
/**
* @param object|null $mfTechno
* @param \DateTime $year
* @param \Doctrine\Persistence\ObjectManager $em
* @return array
*/
public function extracted(?object $mfTechno, \DateTime $year, \Doctrine\Persistence\ObjectManager $em): ?array
{
$verifT = false;
$export = [];
if ($mfTechno instanceof RegisterEvent) {
if ($year > $mfTechno->getUpdated() && !is_null($mfTechno->getPackArtWorkStudy())) {
$export = explode(',', $mfTechno->getPackArtWorkStudy());
$listAwId = $em->getRepository(ArtWorkStudy::class)->getArtworkActif();
$listAwId = array_map(function ($list) {
return $list['id'];
}, $listAwId);
foreach ($export as $id) {
if (!in_array($id, $listAwId)) {
$verifT = true;
}
}
}
return array($export,$verifT,$mfTechno->getId());
}
return [$export,$verifT];
}
}