<?php
namespace App\Controller\Dashboard;
use App\Entity\DataAnalysis\UserActivityAbstractWorkListTable;
use App\Entity\Educational\Chapter;
use App\Entity\Educational\Course;
use App\Entity\Educational\Discipline;
use App\Entity\Educational\Domain;
use App\Entity\Educational\FeedbackScore;
use App\Entity\Educational\Lesson\DesignScheme\AbstractContent;
use App\Entity\Educational\Lesson\Exercise\Tip;
use App\Entity\Educational\Lesson\Exercise\Pratical;
use App\Entity\Educational\Lesson\WorkList;
use App\Entity\Educational\Lesson\WorkListLine;
use App\Entity\Educational\Lesson\WorkListNode;
use App\Entity\Educational\SchoolBag\ReviewProgram;
use App\Entity\Educational\SchoolBag\ReviewProgramBoost;
use App\Entity\Educational\SchoolBag\ReviewProgramEvent;
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\Training;
use App\Entity\Management\Subscription\Purchase\MissionExam;
use App\Entity\Management\Subscription\Subscription;
use App\Entity\Media\Video;
use App\Entity\Users\Child;
use App\Entity\Users\Parents;
use App\Entity\Users\StudentsParents;
use App\Service\Mailer\MailerService;
use App\Service\ManagerRP;
use App\Service\ProfExpressService;
use Dompdf\Dompdf;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Options;
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\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGenerator;
/**
* Class EducationalController
* @package App\Controller\Dashboard
*
* @Security("is_granted('ROLE_STUDENT') or is_granted('ROLE_PARENTS')")
*/
class EducationalController extends AbstractController
{
/*
* Le but de cette fonction est d'affichée la popin program et de sauvegarder
* le parcours utilisateur pour afficher la totalité des popins.
*/
/**
* @param Request $request
* @return Response
* @Route("/educational/list/program",name="list-program")
*/
public function renderPopinProgram(Request $request)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$courseSlugSelected = $disciplineSlugSelected = $chapterSlugSelected = null;
$courseSelected = $disciplineSelected = $chapterSelected = $wnSlugSelected = null;
$listChapters = $listDisciplines = $listCourses = $listWorklists = [];
$session = $request->getSession();
$appSession = $session->get('Application');
$processPopinProgramEnd = $displayLastPopinProgram = $sessionDemand = false;
if ($user && $user instanceof Child) {
if(!$request->get('user-select-chapter')){
$sessionDemand = !$request->isXmlHttpRequest() && isset($appSession['popin']['program']['displayLastPopinProgram']) && $appSession['popin']['program']['displayLastPopinProgram'];
}else{
$sessionDemand = true;
$appSession['popin']['program'] = [
'course' => $request->get('course'),
'discipline'=>$request->get('discipline'),
'chapter'=>$request->get('chapter'),
'worklistnode'=>null
];
$session->set('Application', $appSession);
}
//Check si l'utilisateur (requête ajax) à demander de changer les items ou c'est la session (php) qui le demande
if (!$session->has('Application')) {
$appSession = ['popin' => ['program' => ['course' => null,'discipline'=>null,'chapter'=>null,'worklistnode'=>null]]];
}
$tmpSessionProgram = $appSession['popin']['program'];
if (!$sessionDemand) {
$tmpSessionProgram['displayLastPopinProgram'] = false;
//Check si il y a une demande utilisateur de modifier une classe ou la session
if ($request->get('course') || $tmpSessionProgram['course'] != null) {
$courseSlugSelected = !is_null($request->get('course')) ? $request->get('course') : $tmpSessionProgram['course'];
$courseSelected = $em->getRepository(Course::class)->findOneBySlug($courseSlugSelected);
} else {
$courseSelected = $user->getCourse();
}
$courseSlugSelected = $courseSelected->getSlug();
$tmpSessionProgram['course'] = $courseSlugSelected;
if ($request->get('discipline')) {
$disciplineSlugSelected = $request->get('discipline');
$disciplineSelected = $em->getRepository(Discipline::class)->findOneBySlug($disciplineSlugSelected);
$disciplineSlugSelected = $disciplineSelected->getSlug();
$tmpSessionProgram['discipline'] = $disciplineSlugSelected;
}
if ($request->get('chapter')) {
$chapterSlugSelected = $request->get('chapter');
$tmpSessionProgram['chapter'] = $chapterSlugSelected;
$tmpSessionProgram['displayLastPopinProgram'] = true;
}
} else {
$disciplineSlugSelected = $tmpSessionProgram['discipline'];
$chapterSlugSelected = $tmpSessionProgram['chapter'];
$wnSlugSelected = $tmpSessionProgram['worklistnode'];
$processPopinProgramEnd = true;
$disciplineSelected = $em->getRepository(Discipline::class)->findOneBySlug($disciplineSlugSelected);
}
$courseSelected = $em->getRepository(Course::class)->findOneBySlug($tmpSessionProgram['course']);
$listDisciplines = $em->getRepository(Domain::class)->getAllDisciplineByCourseV2($courseSelected, true);
if($user instanceof Child){
$last = $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if($last){
$guardiant = $last->getGuardiant();
if($user->getCourse() && $guardiant){
$examDis = $em->getRepository(MissionExam::class)->getListDis($guardiant->getId(),$courseSelected->getId());
$listDisciplines = array_merge($examDis,$listDisciplines);
}
}
}
$domain = $em->getRepository(Domain::class)->findOneBySlug($chapterSlugSelected);
$choiceArtWork = [];
$reEv = null;
if($tmpSessionProgram['discipline']){
$reEv = $em->getRepository(RegisterEvent::class)->findRegisterByDisciSlug($user->getId(),$tmpSessionProgram['discipline']);
if($reEv && in_array($tmpSessionProgram['discipline'],[ 'mission-bac-francais','mission-bac-techno-francais'])){
$choiceArtWork = $reEv->getPackArtWorkStudy();
}
}
$listChapters = $em->getRepository(Domain::class)->getChapterAndNbrProgramForPopinByDiscipline($courseSelected, $disciplineSelected, null, true,$choiceArtWork);
if($domain &&
($domain->getMissionExamProgram() ||
(in_array($domain->getDiscipline()->getSlug(),[ 'mission-bac-francais','mission-bac-techno-francais'])))){
if($reEv) {
if (in_array($domain->getDiscipline()->getSlug(),[ 'mission-bac-francais','mission-bac-techno-francais'])) {
$listWorklists = $em->getRepository(WorkList::class)->getWorkListByDomainForPopinProgram($chapterSlugSelected, $user,$choiceArtWork);
} else {
$listWorklists = $em->getRepository(AbstractProgram::class)->findAllProgramEventByRegister($reEv, $domain->getCourse()->getId(), $domain->getDiscipline()->getSlug());
}
}
}else{
$listWorklists = $em->getRepository(WorkList::class)->getWorkListByDomainForPopinProgram($chapterSlugSelected,$user);
}
//Il est appelé qu'une seule fois lorsque j'affiche la première popin Course&Discipline
if ((!is_null($courseSelected) && is_null($disciplineSelected)) || $sessionDemand) {
$listCourses = $em->getRepository(Course::class)->findBy(['front' => true], ['order' => 'asc']);
}
//Save Choice in session
$appSession['popin']['program'] = array_merge($tmpSessionProgram, ['worklistNode' => null,]);
$session->set('Application', $appSession);
return $this->render('dashboard/educational/program.html.twig', [
'listCourses' => $listCourses,
'courseS' => $tmpSessionProgram['course'],
'disciplineS' => $disciplineSlugSelected,
'chapterS' => $chapterSlugSelected,
'listChapters' => $listChapters,
'listDisciplines' => $listDisciplines,
'listWorklists' => $listWorklists,
'sessionDemand' => $sessionDemand,
'wnS'=>$wnSlugSelected
]);
}
return new JsonResponse();
}
/**
* @Route("/enter/{slug}", name="enter-rp-wn")
* @Route("/enter/program/{program}/{pregister}", name="enter-program")
*/
public function enterPlaylist(Request $request, ManagerRP $managerRP, $slug = null, $program=null, $pregister=null){
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$start = false;
if (!is_null($slug)) {
$Rp = $em->getRepository(ReviewProgramLesson::class)->findOneByWnSlug($user, $slug);
if (!$Rp) {
$wn = $em->getRepository(WorkListNode::class)->findOneBySlug($slug);
if (!$wn) {
return $this->redirectToRoute('dashboard');
}
$Rp = $managerRP->createRpByWorklistNode($wn,$user);
if($wn->getDomain()->getDiscipline()->isExam()){
$last = $em->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
if($user instanceof Child && ( ($last && $last->isCurrentSubscription()) || in_array("ROLE_EXAM",$user->getRoles()))){
if($last){
$guardiant = $last->getGuardiant();
$packs = $em->getRepository(MissionExam::class)->getListPack($guardiant->getId(),$user->getCourse()->getId());
if(!empty($packs)){
if($wn->getDomain()->getMissionExamProgram()){
$list = $em->getRepository(AbstractProgram::class)->ifProgramIsPackByWk($wn->getId());
if(!empty($list)){
$tmp = null;
foreach ($list as $row){
foreach ($packs as $p){
if($row['packId'] == $p->getId()){
$tmp = $row['id'];
}
}
}
if($tmp){
return $this->redirectToRoute('enter-program',['program'=>$tmp]);
}
}
}else{
$list = $em->getRepository(MissionExam::class)->getListDis($guardiant->getId(),$user->getCourse()->getId());
foreach ($list as $row){
if($row['id'] == $wn->getDomain()->getDiscipline()->getId()){
$Rp->setAccessView(true);
}
}
}
}else{
return $this->redirectToRoute('dashboard');
}
}
}else{
return $this->redirectToRoute('dashboard');
}
}
$em->persist($Rp);
$em->flush();
$Rp->setSlug("{$Rp->getSlug()}-{$Rp->getId()}");
$em->flush();
$start = true;
}
// Enregistre le choix de l'utilisateur
$session = $request->getSession();
$appSession = $session->get('Application');
if (isset($appSession['popin']['program']['chapter'])) {
$appSession['popin']['program']['worklistnode'] = $slug;
$session->set('Application', $appSession);
}
$paramerters = $start?["start"=>true]:[];
$paramerters["slug"]= $Rp->getSlug();
return $this->redirectToRoute('show-playlist-lesson', $paramerters);
}
if(!is_null($program)){
$lineProgram = $em->getRepository(AbstractProgram::class)->find($program);
if($lineProgram){
$event = $lineProgram->getEventTraining();
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy(
[
'child'=>$user->getId(),
'event'=>$event->getId()
]);
if($isRegister){
$Rp = $em->getRepository(ReviewProgramEvent::class)->findOneBy([
'student'=>$user->getId(),
'program'=>$lineProgram->getId()
]);
if(!$Rp){
$worklist = null;
if(!is_null($pregister)){
$pregister = $em->getRepository(RegisterProgram::class)->find($pregister);
if($pregister){
$worklist = $pregister->getWorkListNode()->getWorklist();
}
}
$Rp = $managerRP->createRpByTraining($lineProgram,$user,$worklist);
$em->persist($Rp);
$em->flush();
$Rp->setSlug("{$Rp->getSlug()}-{$Rp->getId()}");
$em->flush();
}
return $this->redirectToRoute('show-playlist-lesson',['slug'=>$Rp->getSlug()]);
}
}
return $this->redirectToRoute('training');
}
return $this->redirectToRoute('dashboard');
}
/**
* @Route("/reset/{slug}", name="reset-program")
*/
public function resetProgram(Request $request, $slug, ManagerRP $managerRP) {
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$rp = $em->getRepository(ReviewProgram::class)->findOneBy([
'student' => $user->getId(),
'slug' => $slug
]);
if ($rp) {
$worklist = $rp->getWorklist();
$wlWithUA = $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist, $user);
foreach ($wlWithUA as $wl) {
if (!empty($wl["ua"])) {
$findActivity = $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
if (!empty($findActivity)) {
$findActivity->setRedo(true);
}
}
}
$em->flush();
return $this->redirectToRoute('show-playlist-lesson', ['slug' => $slug]);
} else {
return $this->redirectToRoute('dashboard');
}
}
/**
* @Route("/programme/{slug}", name="show-playlist-lesson",priority="1")
* @Route("/programme/{slug}/{position}", name="show-playlist-media")
*/
public function playlist(Request $request,$slug = null, $position = 1)
{
if (is_null($slug)) {
return $this->redirectToRoute('dashboard');
}
$em = $this->getDoctrine()->getManager();
$user = $this->getUser();
$content = null;
$nbrUas = 0;
$nbrUasToDoAgain = 0;
$findActivity = false;
$findRp = null;
if (!$user) {
return $this->redirectToRoute('app_login');
}
$rp = $em->getRepository(ReviewProgram::class)->findOneBy([
'student' => $user->getId(),
'slug' => $slug
]);
if (!$rp) {
$findRp = $em->getRepository(ReviewProgram::class)->findOneBy([
'slug' => $slug
]);
if ($findRp) {
return $this->redirectToRoute('dashboard', ['back' => $slug]);
}
return $this->redirectToRoute('dashboard');
}
$slugReviewProgram = $rp->getSlug();
$worklist = $rp->getWorklist();
if(!$this->isGranted('ACCESS_ONLY_SUBSCRIBER', $worklist) ){
// NE pas modifier !!
if(!$this->isGranted('ROLE_EXAM') && $findRp instanceof ReviewProgramEvent){
return $this->redirectToRoute('access-service');
}
}
// $this->denyAccessUnlessGranted('ACCESS_ONLY_SUBSCRIBER', $worklist);
//$wlWithUA = $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist, $user);
$wlWithUA = $em->getRepository(WorkListLine::class)->getWlDirectoryByWId($worklist, $user);
if (!$worklist->getWorklistLines()->isEmpty()) {
if (is_numeric($position) && $position <= $worklist->getWorklistLines()->count()) {
$content = $worklist->getWorklistLines()[$position - 1]->getAbstractContent();
} else {
return $this->redirectToRoute('show-playlist-media', ['slug' => $slug]);
}
$uas = $em->getRepository(UserActivityAbstractWorkListTable::class)->findBy([
'user' => $user->getId(),
'reviewProgram' => $rp->getId()
]);
$nbrUas = count($uas);
$uasToRedo = $em->getRepository(UserActivityAbstractWorkListTable::class)->findBy([
'user' => $user->getId(),
'reviewProgram' => $rp->getId(),
'redo' => 1,
]);
$nbrUasToDoAgain = count($uasToRedo);
$findActivity = $em->getRepository(UserActivityAbstractWorkListTable::class)->findOneBy([
'user' => $user->getId(),
'reviewProgram' => $rp->getId(),
'abstractContent' => $content->getId()
]);
}
$start = $request->query->has('start');
$isPack = $rp instanceof ReviewProgramEvent ?($rp->getProgram()->getEventTraining() instanceof Pack):false;
return $this->render('dashboard/educational/playlist.html.twig', [
'worklist' => $worklist,
'position' => $position,
'content' => $content,
'slugReviewProgram' => $slugReviewProgram,
'wlWithUA' => $wlWithUA,
'findActivity' => $findActivity,
'nbrUas' => $nbrUas,
'nbrUasToDoAgain' => $nbrUasToDoAgain,
'wn' => $rp->getWorkListNode(),
'openPopinStart'=>$start,
'islesson' =>$rp instanceof ReviewProgramLesson,
'isPack' =>$isPack,
'rp' =>$rp
]);
}
/**
* @Route("/programme/{slug}/termine", name="end-playlist",priority="1")
*
*/
public function endplaylist($slug = null)
{
if (is_null($slug)) {
return $this->redirectToRoute('dashboard');
}
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$rp = $em->getRepository(ReviewProgram::class)->findOneBy([
'student'=>$user->getId(),
'slug' =>$slug
]);
$event = null;
$listWorklists = $listProgram = [];
$slugReviewProgram = $rp->getSlug();
$worklist = $rp->getWorklist();
// Calcul du pourcentage de réussite aux exercices du programme
$successPercentage = 0;
$sumScores = 0;
$sumQuestions = 0;
if($rp instanceof ReviewProgramLesson){
$wn = $rp->getWorkListNode();
if(!is_null($wn)){
$listWorklists = $em->getRepository(WorkList::class)->getWorklistByWn($wn->getId(),$wn->getDomain()->getId());
}
}
if($rp instanceof ReviewProgramEvent){
$day = null;
$event = $rp->getProgram()->getEventTraining();
$isRegister = $em->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $event->getId()
]);
if($isRegister && $event instanceof Training){
$selectDiscipline = $isRegister->getDisciplineWithTube();
$listProgram = $em->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($event,$user,$selectDiscipline);
$now = new \DateTime();
$startAt = $isRegister->getStartAt();
$day = $startAt<=$now?$now->diff($startAt)->days:null;
if(!is_null($day))
$listProgram = array_slice($listProgram, 0, $day+1);
}
}
if($worklist){
$rp->setFinished(new \DateTime());
$em->flush();
$wlWithUA = $em->getRepository(WorkListLine::class)->getWorkListLineWithUAByWid($worklist, $user);
// print_r($wlWithUA);
// Ajout des scores
foreach ($wlWithUA as $key => $wl) {
if ($wl["type"] != "Video") {
$wl["scores"] = array(
"best" => "0",
"last" => "0",
);
if (!empty($wl["ua"])) {
$findActivity = $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
if (!empty($findActivity) && !is_null($findActivity->getLastScore())) {
$wl["scores"]["best"] = $findActivity->getBestScore();
$wl["scores"]["last"] = $findActivity->getLastScore();
$sumScores += $findActivity->getLastScore();
if ($wl["type"] == "Exercice") {
$wl["scores"]["best"] .= "/5";
$wl["scores"]["last"] .= "/5";
$sumQuestions += 5;
}
else {
$questions = $findActivity->getAbstractContent()->getContent()->getQuestions();
if (!empty($questions)) {
$totalQuestions = count($questions);
$wl["scores"]["best"] .= "/" . $totalQuestions;
$wl["scores"]["last"] .= "/" . $totalQuestions;
$sumQuestions += $totalQuestions;
}
}
}
}
$wlWithUA[$key] = $wl;
}
else {
if (!empty($wl["ua"]) && $wl["redo"]) {
// print_r($wl); exit;
$findActivity = $em->getRepository(UserActivityAbstractWorkListTable::class)->find($wl["ua"]);
if (!empty($findActivity)) {
if ($findActivity->getRedo()) {
$findActivity->setRedo(false);
$wlWithUA[$key]["redo"] = 0;
}
}
}
}
}
$feedback = '';
if ($sumQuestions > 0) {
$successPercentage = ceil($sumScores / $sumQuestions * 100);
$rp->setLastSuccessPercentage($successPercentage);
$bestPercentage = $rp->getBestSuccessPercentage();
if (empty($bestPercentage) || $bestPercentage < $successPercentage) {
$rp->setBestSuccessPercentage($successPercentage);
}
if(!is_null($rp->getDiscipline())){
$disciplineId = $rp->getDiscipline()->getId();
}else{
if($rp instanceof ReviewProgramLesson){
$wpT = $rp->getWorklist();
$dT = $rp->getDomain();
if(!is_null($dT)){
$disciplineId = $dT->getDiscipline()->getId();
}
if(!is_null($wpT) && !is_null($dT)){
$wnT = $em->getRepository(WorkListNode::class)->findBy([
'domain'=>$dT->getId(),
'worklist'=>$wpT->getId()
]);
if(!empty($wnT)){
$rp->setWorkListNode($wnT[0]);
}
}
}
}
$feedback = $em->getRepository(FeedbackScore::class)->getFeedback($successPercentage, $disciplineId);
}
$em->flush();
return $this->render('dashboard/educational/playlist.html.twig', [
'openPopinStart' => true,
'worklist' => $worklist,
'finish' => true,
'position' => 0,
'content' => null,
'slugReviewProgram' => $slugReviewProgram,
'listWorklists' => $listWorklists,
'wlWithUA' => $wlWithUA,
'listProgram' => $listProgram,
'event' => $event,
'successPercentage' => $successPercentage,
'feedback' => $feedback,
'rp' => $rp,
'islesson' => false
]);
}
return $this->redirectToRoute('dashboard');
}
/**
* @Route("/event/{slug}")
*
*/
public function listProgram(Request $request,EntityManagerInterface $entityManager,$slug = null)
{
$user = $this->getUser();
$event = null;
$programs = [];
$domain = null;
$rp = $entityManager->getRepository(ReviewProgram::class)->findOneBy([
'student' => $user->getId(),
'slug' => $slug
]);
if($rp){
if($rp instanceof ReviewProgramEvent){
$event = $rp->getProgram()->getEventTraining();
if($event){
$isRegister = $entityManager->getRepository(RegisterEvent::class)->findOneBy([
'child' => $user->getId(), 'event' => $event->getId(),'archive'=>null
]);
if($isRegister && $event instanceof Pack){
$artWork = null;
if($event->getCourse()->getSlug()=="premiere"){
$artWork = $isRegister->getPackArtWorkStudy();
}
$programs = $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline_2($event, $user,"",$artWork);
}
if($isRegister && ($event instanceof Training || $event instanceof HolidaysTraining)){
$selectProgram = $rp->getProgram();
$selectDiscipline = $isRegister->getDisciplineWithTube();
$programs = $entityManager->getRepository(AbstractProgram::class)->findAllProgramEventByDiscipline($event, $user,$selectDiscipline,null,$isRegister->getCourse());
//echo '<pre>';var_dump($isRegister->getDisciplineWithTube());die;
if(!is_null($selectProgram->getDays())){
// $programs = array_slice($programs,0,$selectProgram->getDays());
$programs = [$programs[$selectProgram->getDays()]];
//echo '<pre>';var_dump($programs);die;
}
}
$domain = $rp->getWorkListNode()?$rp->getWorkListNode()->getDomain():null;
}
}
if($rp instanceof ReviewProgramLesson){
$programs = $entityManager->getRepository(WorkListNode::class)->getWkNodeChapter($rp->getWorkListNode()->getDomain());
$domain = $rp->getWorkListNode()?$rp->getWorkListNode()->getDomain():null;
}
}
return $this->render('dashboard/educational/template-other-chapter.html.twig',[
'programs'=>$programs,
'event' =>$event,
'domain' =>$domain
]);
}
/**
* @Route("/report/worklist",name="report-worklist",methods={"post"})
*/
public function reportUserPlaylist(Request $request,MailerService $mailer){
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$contentId = $request->request->get('contentId');
$msg = $request->request->get('msg');
$wnId = $request->request->get('wnId');
$abstractContent = $em->getRepository(AbstractContent::class)->find($contentId);
$worklistNode = $em->getRepository(WorkListNode::class)->find($wnId);
if($user && $abstractContent){
$back = $request->get('back');
$mailer->sendEmail("Rapport d'erreur utilisateu","[email protected]","mailer/report/worklist.html.twig",[
"child" =>$user,
"abstractContent"=>$abstractContent,
"msg" =>$msg,
"wn" =>$worklistNode
]);
$this->addFlash('notice','Votre signalement a bien été pris en compte. Nous allons traiter votre demande dans les plus brefs délais.<br/><br/>Merci pour votre collaboration ! ');
if($back){
return $this->redirect($back);
}
}
return $this->redirectToRoute('dashboard');
}
/**
* @Route("/display/tip",name="show-tip")
*/
public function ajaxDisplayTip(Request $request){
if($request->isXmlHttpRequest()){
$id = $request->get('id');
$em = $this->getDoctrine()->getManager();
$tips= $em->getRepository(Tip::class)->findBy(['question'=>$id]);
if(!empty($tips)){
$json = [];
foreach ($tips as $row){
$json[] = ['content'=>$row->getStatement()];
}
return new JsonResponse(['success'=>true,'data'=>$json]);
}
return new JsonResponse(['success'=>false]);
}
}
/**
* @Route("/upload/transcript/video/file/{slug}/{wn}",name="uplaod-file-video")
* @Route("/upload/transcript/video/file/{slug}/{wn}/js",name="js-uplaod-file-video")
*/
public function uploadTranscriptVideo(Request $request,$slug = null,$wn=null,Pdf $knpSnappyPdf){
if(!is_null($slug)){
$em = $this->getDoctrine()->getManager();
$video = $em->getRepository(Video::class)->findOneBySlug($slug);
if(!is_null($video->getTranscript())){
$file = sprintf("%s/public/gatewayImages/front/videos/transcripts/%s",dirname(__FILE__).'/../../..',$video->getTranscript());
if(is_file($file)){
return $this->file($file);
}
}else{
if(!is_null($video->getTranscriptAuto())){
$file = sprintf("%s/public/gatewayImages/front/videos/transcripts/%s",dirname(__FILE__).'/../../..',$video->getTranscriptAuto());
if(is_file($file)){
return $this->file($file);
}
}
if(!is_null($video->getDescription())){
$wn = $em->getRepository(WorkListNode::class)->findOneBySlug($wn);
/* return $this->render('dashboard/educational/pdf/generate-pdf.html.twig', [
"content"=>str_replace('<p> </p>','<br/> ',$video->getDescription()),
"video"=>$video,
'wn'=>$wn
]);*/
$tmpFiles = [];
function extractLatex($text) {
preg_match_all('/(\\\\\((.*?)\\\\\))|(\\\\\[(.*?)\\\\\])|(\$\$(.*?)\$\$)|(\$(.*?)\$)/', $text, $matches);
return $matches; // Retourne les expressions LaTeX extraites
}
function latexToImage($latex, $outputPath) {
$tmpDir = sys_get_temp_dir(); // Dossier temporaire
$texFile = $tmpDir . "/equation.tex";
$dviFile = $tmpDir . "/equation.dvi";
$pngFile = $outputPath;
// Création du fichier .tex
$texContent = "
\\documentclass[preview]{standalone}
\\usepackage{amsmath,amssymb}
\\usepackage{yhmath}
\\usepackage{amsfonts} % optionnel
\\usepackage{mathtools}
\\usepackage{graphicx}
\\usepackage{calc}
\\begin{document}
$".trim(html_entity_decode($latex))."$
\\end{document}";
file_put_contents($texFile, $texContent);
// Compilation LaTeX -> DVI
$cmdLatex = "latex -output-directory=$tmpDir $texFile";
exec($cmdLatex, $output, $returnVar);
if ($returnVar !== 0) {
return null;
}else{
// Conversion DVI -> PNG
$cmdDvipng = "dvipng -D 600 -x 1000 -y 1000 -bg Transparent -T tight -o $pngFile $dviFile";
exec($cmdDvipng, $output, $returnVar);
/* if ($returnVar !== 0) {
throw new Exception("Erreur lors de la conversion DVI en PNG.");
}*/
if (extension_loaded('imagick')) {
$image = new \Imagick($pngFile);
unlink($pngFile);
$scale = 0.23; // 50%
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$image->resizeImage($width * $scale, $height * $scale, \Imagick::FILTER_LANCZOS, 1);
$image->writeImage($pngFile);
}
return $pngFile;
}
}
function imageToBase64($path) {
//$path = $path;
$type = pathinfo($path, PATHINFO_EXTENSION);
$tmp = explode('?',$type);
$data = file_get_contents($path);
$base64 = 'data:image/' . $tmp[0] . ';base64,' . base64_encode($data);
return $base64;
}
function replaceLatexWithImages($text,&$tmpFiles) {
$matches = extractLatex($text);
$replacements = $fLatexImag = [];
foreach ($matches[0] as $index => $row){
$tab = [1,3,5,7];
$f_latex = null;
foreach ($tab as $cpt){
if($matches[$cpt][$index] == $row){
$f_latex = $matches[$cpt+1][$index];
}
}
if(!array_keys($fLatexImag,$f_latex)){
$imagePath = "latex_image_" . uniqid() . ".png";
$tmp = latexToImage($f_latex, $imagePath);
$fLatexImag[$f_latex] = is_null($tmp)?$row:"<img style='margin-top:25px;display:block;margin-left: 5px;margin-right:5px' src='".imageToBase64(dirname(__DIR__).'/../../public/'.$imagePath)."' alt='Latex Equation'/>";
}
$replacements[$row] = $fLatexImag[$f_latex];
}
return str_replace(array_keys($replacements), array_values($replacements), $text);
};
function replaceWithImages($text) {
preg_match_all('/src="(.*?)"/', $text, $matches);
$replacements = [];
foreach ($matches[1] as $latex) {
$replacements[$latex] = imageToBase64($latex);
/* } catch (Exception $e) {
echo "Erreur : " . $e->getMessage() . "\n";
}*/
}
return str_replace(array_keys($replacements), array_values($replacements), $text);
}
$conversions = [
'Δ' => '\Delta ',
'δ' => '\delta ',
'α' => '\alpha ',
'β' => '\beta ',
'Ω' => '\Omega ',
'ω' => '\omega ',
'φ' => '\phi ',
'Φ' => '\Phi ',
'π' => '\pi ',
'Π' => '\Pi '
];
// $formuleLatex = str_replace(array_keys($conversions), array_values($conversions), $texte);
$descriptionV = $video->getDescription();
$descriptionV = str_replace(array_keys($conversions), array_values($conversions), $descriptionV);
$descriptionV = replaceWithImages($descriptionV);
try{
$descriptionV = replaceLatexWithImages(str_replace('<p> </p>','<div style="margin-bottom: 10px"></div> ',$descriptionV),$tmpFiles);
$descriptionV = str_replace(array_values($conversions), array_keys($conversions), $descriptionV);
$html = $this->render('dashboard/educational/pdf/generate-pdf-2.html.twig', [
"content"=>utf8_encode($descriptionV),
"video" =>$video,
'wn' =>$wn,
'logo' =>imageToBase64(dirname(__DIR__).'/../../public/static/img/commun/LOGO-LBP-Hibou-blanc.png')
]);
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isRemoteEnabled', true);
$domPdf = new Dompdf($options);
$conversions = [
'Δ' => 'Δ', // U+0394
'δ' => 'δ', // U+03B4
'α' => 'α', // U+03B1
'β' => 'β', // U+03B2
'Ω' => 'Ω', // U+03A9
'ω' => 'ω', // U+03C9
'φ' => 'φ', // U+03C6
'θ' => 'θ' // U+03B8
];
$html = str_replace(array_keys($conversions), array_values($conversions), $html);
$domPdf->loadHtml($html, 'UTF-8');
$domPdf->setPaper('A4', 'portrait');
$domPdf->render();
$nameFile = uniqid().".pdf";
$newFile = dirname(__DIR__)."/../../public/gatewayImages/front/videos/transcripts/".$nameFile;
file_put_contents($newFile,$domPdf->output());
if(is_file($newFile)){
$video->setTranscriptAuto($nameFile);
$em->flush();
}
foreach ($tmpFiles as $file){
if(is_file(dirname(__DIR__).'/../../public/'.$file)){
unlink(dirname(__DIR__).'/../../public/'.$file);
}
}
return new Response(
$domPdf->stream('resume.pdf', ["Attachment" => false]),
Response::HTTP_OK,
['Content-Type' => 'application/pdf']
);
}catch (Exception $exception){
if(!empty($tmpFiles)){
foreach ($tmpFiles as $file){
if(is_file(dirname(__DIR__).'/../../public/'.$file)){
unlink(dirname(__DIR__).'/../../public/'.$file);
}
}
}
if($request->get('back')){
return $this->redirect($request->get('back'));
}
}
}
}
}
if($request->get('back')){
return $this->redirect($request->get('back'));
}
return $this->redirectToRoute('dashboard');
}
/**
*
* @Route("/change/phone/number", name="ajaxChangePhoneNumber", methods="GET")
*
*/
public function profExpressChangeNumber(Request $request)
{
if ($request->isXmlHttpRequest()) {
$phone = $request->get('phone');
$user = $this->getUser();
if ($user && !empty($phone)) {
$user->setPhoneProfExpress($phone);
$this->getDoctrine()->getManager()->flush();
return new JsonResponse(['success' => true]);
}
}
return new JsonResponse(['success' => false]);
}
//@Security("has_role('ROLE_TEACHER_EXPRESS')")
/**
* @Route("/prof-express/{student}", name="api_prof_express", methods="GET|POST")
*
*/
public function profExpress(Child $student,ProfExpressService $profExpressService)
{
$url = $profExpressService->connect($student);
return $this->redirect($url);
}
/**
* @Route("/get/disciplines/by/course", name="get-disciplines-by-course", methods="GET")
*
*/
public function getDisciplineByCourse(Request $request)
{
$courseSelected = $request->get('course');
$em = $this->getDoctrine()->getManager();
$courseSelected = $em->getRepository(Course::class)->findOneBySlug($courseSelected);
if ($courseSelected) {
$listDisciplines = $em->getRepository(WorkListNode::class)->getDisciplinesForCourse($courseSelected->getSlug());
return new JsonResponse(['success' => true, 'list' => $listDisciplines]);
}
return new JsonResponse(['success' => false]);
}
/**
* @return Response
* @IsGranted("ACCESS_FREE", subject="",message="subscripted")
* @IsGranted("ACCESS_LBP", subject="",message="subscripted")
* @Route("/boost/matieres",name="boost-disciplines")
*/
public function boostDisciplines(Request $request){
//$this->denyAccessUnlessGranted('ACCESS_LBP', null,'subscripted');
$em = $this->getDoctrine()->getManager();
$boost = $em->getRepository(Boost::class)->findOneBySlug('boost');
$user = $this->getUser();
$register = $em->getRepository(RegisterEvent::class)->findOneBy([
'event'=>$boost->getId(),
'child'=>$user->getId()
]);
$program = $em->getRepository(AbstractProgram::class)->findAllProgramEventBoostByRegister($register);
$now = new \DateTime();
$day = $now->format('N');
$nextSendDate = $day<3 || 6<$day?$now->modify('wednesday'):$now->modify('saturday');
if($request->isMethod('post')){
$discipls = $request->request->get('selectDisciplines');
$discipls = explode('|', $discipls);
if ($boost && !empty($discipls)) {
if(!$register){
$registerEvent = new RegisterEvent($boost, $user);
foreach ($discipls as $d) {
$disc = $em->getRepository(Discipline::class)->findOneBySlug($d);
$registerEvent->addSelectDisplines($disc);
}
$em->persist($registerEvent);
$this->addFlash("notice", "Tu es inscrit(e) au boost Matière en {$registerEvent->getDisciplineByTitle()}<br/> la date du prochain envoi est le ".\IntlDateFormatter::formatObject($nextSendDate, 'd MMMM', 'fr_FR'));
}else{
$tmp = new ArrayCollection();
foreach ($discipls as $d) {
$disc = $em->getRepository(Discipline::class)->findOneBySlug($d);
$tmp->add($disc);
}
$register->setSelectDisplines($tmp);
$this->addFlash('notice', 'Tes matières ont été modifiées');
}
$em->flush();
return $this->redirectToRoute('boost-disciplines');
}
}
return $this->render('/dashboard/educational/boost-disciplines.html.twig',[
'register'=>$register,
'program'=>$program,
'nextSendDate'=>$nextSendDate,
'boost'=>$boost
]);
}
/**
* @Route("/save-student-score", name="save-student-score")
*/
public function saveStudentScore(Request $request) {
$slug = $request->get('rp');
$contentId = $request->get('content');
$score = $request->get('score');
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$rp = $em->getRepository(ReviewProgram::class)->findOneBy([
'student' => $user->getId(),
'slug' => $slug
]);
$id = -1;
if ($rp) {
$activity = $em->getRepository(UserActivityAbstractWorkListTable::class)->findOneBy([
'abstractContent' => $contentId,
'reviewProgram' => $rp->getId(),
]);
$now = new \DateTime();
if (empty($activity)) {
$content = $em->getRepository(AbstractContent::class)->find($contentId);
$activity = new UserActivityAbstractWorkListTable();
$activity->setReviewProgram($rp);
$activity->setAbstractContent($content);
$activity->setSpentTime(10);
$activity->setUser($user);
$activity->setDate($now);
$em->persist($activity);
}
if (!empty($activity)) {
$activity->setLastScore($score);
$activity->setLastScoreDate($now);
$activity->setRedo(false);
$bestScore = $activity->getBestScore();
if (empty($bestScore) || $bestScore < $score) {
$activity->setBestScore($score);
$activity->setBestScoreDate($now);
}
$rp->setLastActivityAt($now);
$em->flush();
$id = $activity->getId();
return new JsonResponse([
'success' => true,
"activity" => $id,
"rp" => $rp->getId(),
"score" => $score,
]);
}
}
return new JsonResponse(['success'=> false]);
}
/**
* @Route("/activity-redone", name="activity-redone")
*/
public function activityRedone(Request $request) {
$activityId = $request->get('activityId');
$em = $this->getDoctrine()->getManager();
if ($activityId) {
$activity = $em->getRepository(UserActivityAbstractWorkListTable::class)->find($activityId);
if (!empty($activity)) {
$activity->setRedo(false);
$em->flush();
}
return new JsonResponse(['success' => true]);
}
return new JsonResponse(['success'=> false]);
}
/**
* @Route("/ajax/workshop/list/disiplines", name="ajaxWorkshopListDisciplines")
*/
public function ajaxWorkshopListDisciplines(Request $request) {
$slug = $request->get('course');
$workshop = $request->get('workshop');
$em = $this->getDoctrine()->getManager();
$course = $em->getRepository(Course::class)->findOneBySlug($slug);
$workshop = $em->getRepository(AbstractEventTraining::class)->findOneBySlug($workshop);
if ($course && $workshop) {
$child = new Child();
$child->setCourse($course);
$disciplines = $em->getRepository(AbstractProgram::class)->findAllProgramEvent($workshop, $child);
if (!empty($disciplines)) {
return $this->render('dashboard/_partials/list-disciplines-workshop.html.twig',
['disciplines' => $disciplines,'workshop'=>$workshop]);
}
}
return new JsonResponse(['success'=> false]);
}
/**
* @Route("/validation/change/course/end/year", name="changeCourseYear")
* @IsGranted("ROLE_STUDENT")
*
*/
public function changeCourseEndYear(Request $request){
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$isPopin = false;
if($request->isMethod('post')){
$course = $request->request->get('course');
$disciplines = $request->request->get('spe');
$isPopin = $request->request->has('popin');
$course = $em->getRepository(Course::class)->find($course);
$child = $em->getRepository(Child::class)->find($user->getUserIdentifier());
if(!$isPopin){
$check = false;
if($course->getId()==1 && count($disciplines)!=2){
$this->addFlash('notice','Veuillez cocher que 2 spécialités');
$check = true;
}
if($course->getId()==4 && count($disciplines)!=3){
$this->addFlash('notice','Veuillez cocher que 3 spécialités');
$check = true;
}
if($check){
return $this->redirectToRoute('account');
}
}
if($course && $user){
$em->getRepository(Speciality::class)->deleteByCourseAndStudent($course,$user);
if(!empty($disciplines)){
foreach ($disciplines as $item){
$disc = $em->getRepository(Discipline::class)->find($item);
if($disc){
$spe = new Speciality();
$spe->setCourse($course);
$spe->setDiscipline($disc);
$spe->setStudent($user);
$em->persist($spe);
$em->flush();
}
}
}
if($isPopin){
$tmp = new \DateTime('30 june this year');
$now = new \DateTime('now');
$tmp = $now<$tmp?$tmp:new \DateTime('30 june next year');
$child->setCourse($course);
$user->setNextScholarYear($tmp);
$user->setDisplayPopinNextScholarYear($now);
}
$this->addFlash('notice','Super, nous avons bien noté tes modifications, ton espace Elève a été mis à jour en conséquence.');
$em->flush();
}else{
$this->addFlash('notice','Une erreur est survenue durant l\'enregistrement votre spécialité');
}
}
if($isPopin){
return $this->redirectToRoute('dashboard');
}else{
return $this->redirectToRoute('account');
}
}
public function renderAccesContent(EntityManagerInterface $entityManager){
$last = $subscription = null;
$user = $this->getUser();
if($user instanceof Child){
$subscription = $entityManager->getRepository(Subscription::class)->getLastSubscriptionByStudent($user);
}
return $this->render("dashboard/educational/template-access-content.html.twig",[
'user'=>$user,
'subscription'=>$subscription
]);
}
}