src/Controller/StudentController.php line 491

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Security\Core\Security;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Session\Session;
  9. use Symfony\Component\HttpFoundation\StreamedResponse;
  10. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Knp\Component\Pager\PaginatorInterface;
  13. use App\Entity\Courses;
  14. use App\Entity\DocumentsTypes;
  15. use App\Entity\Levels;
  16. use App\Entity\Modules;
  17. use App\Entity\Students;
  18. use App\Entity\StudentCourse;
  19. use App\Entity\StudentEvaluation;
  20. use App\Entity\StudentEvaluationAnswer;
  21. use App\Entity\StudentEvaluationPostRevision;
  22. use App\Entity\StudentLevels;
  23. use App\Entity\StudentModule;
  24. use App\Entity\User;
  25. use App\Utilities\Utilities;
  26. use DateTime;
  27. class StudentController extends AbstractController {
  28.     private $userPasswordHasher;
  29.     private $security;
  30.     
  31.     public function __construct(Security $security) {
  32.         date_default_timezone_set('America/Bogota');
  33.         $this->security $security;
  34.     }
  35.     public function index(PaginatorInterface $paginatorRequest $request) {
  36.         $myDate = new DateTime('now');
  37.         
  38.         $names trim($request->get('names'));
  39.         $lastname trim($request->get('lastname'));
  40.         $email trim($request->get('email'));
  41.         $phone trim($request->get('phone'));
  42.         $identification trim($request->get('identification'));
  43.         $checkProcessTest trim($request->get('checkProcessTest'));
  44.         $modality trim($request->get('modality'));
  45.         $campus trim($request->get('campus'));
  46.         $em $this->getDoctrine()->getManager();
  47.         
  48.         $filters false;
  49.         if ($this->validateFilter([$names$lastname$email$phone$identification$checkProcessTest$modality$campus])) {
  50.             $filters true;
  51.         }
  52.         
  53.         // listado de estudiantes
  54.         $studentList $em->getRepository(Students::class)
  55.                 ->getStudentList($names$lastname$email$phone$identification$checkProcessTest$modality$campus);
  56.         $list $paginator->paginate(
  57.                 $studentList,
  58.                 $request->query->getInt('page'1),
  59.                 50
  60.         );
  61.         // obtener los niveles por cada estudiante
  62.         $arrStudentLevel = [];
  63.         foreach($list->getItems() as $myStudent) {
  64.             // obtener los studen_level
  65.             $level $em->getRepository(StudentLevels::class)->getStudentLevel($myStudent);
  66.             $lastModule $em->getRepository(StudentModule::class)->getModuleScheduled($myDate$myStudent);
  67.             $arrStudentLevel[$myStudent->getId()] = ['level' => $level'module' => $lastModule];
  68.         }
  69.         return $this->render('student/index.html.twig', [
  70.                     'controller_name' => 'StudentController',
  71.                     'listdata' => $list,
  72.                     'studentLevel' => $arrStudentLevel,
  73.                     'filters' => $filters,
  74.                     'names' => $names,
  75.                     'lastname' => $lastname,
  76.                     'email' => $email,
  77.                     'phone' => $phone,
  78.                     'identification' => $identification,
  79.                     'checkProcessTest' => $checkProcessTest,
  80.                     'modality' => $modality,
  81.                     'campus' => $campus,
  82.         ]);
  83.     }
  84.     public function new() {
  85.         $em $this->getDoctrine()->getManager();
  86.         $documentsTypes $em->getRepository(DocumentsTypes::class)->findAll();
  87.         $courses $em->getRepository(Courses::class)->findAll();
  88.         return $this->render('student/new.html.twig', [
  89.                     'documentsTypes' => $documentsTypes,
  90.                     'courses' => $courses,
  91.         ]);
  92.     }
  93.     public function create(Request $requestUserPasswordHasherInterface $userPasswordHasher) {
  94.         $em $this->getDoctrine()->getManager();
  95.         $dateNow = new DateTime('now');
  96.         $docutmenType $em->getRepository(DocumentsTypes::class)->find($request->get('stdDocumentType'));
  97.         $course $em->getRepository(Courses::class)->find($request->get('stdCourse'));
  98.         $level $em->getRepository(Levels::class)->find($request->get('stdcourse-level'));
  99.         /*
  100.          * crear usuario y luego el estudiante para asociarle el usuario
  101.          */
  102.         $this->userPasswordHasher $userPasswordHasher;
  103.         $studenDni preg_replace('/[^\da-z]/i'''$request->get('stdIdentification'));
  104.         $usFullname $request->get('stdname') . ' ' $request->get('stdlastname');
  105.         $user $this->praxisNewUser($studenDni$usFullname);
  106.         /*
  107.          * Crear nuevo registro en Student
  108.          */
  109.         $util = new Utilities();
  110.         $util->setEm($em);
  111.         $data = [
  112.             'stdCourse' => $request->get('stdCourse'),
  113.             'stdcourseLevel' => $request->get('stdcourse-level'),
  114.             'stdDocumentType' => $request->get('stdDocumentType'),
  115.             'stdname' => $request->get('stdname'),
  116.             'stdlastname' => $request->get('stdlastname'),
  117.             'stdIdentification' => $studenDni,
  118.             'stdPhone' => $request->get('stdPhone'),
  119.             'stdEmail' => $request->get('stdEmail'),
  120.             'stdCity' => $request->get('stdCity'),
  121.             'stdAddress' => $request->get('stdAddress'),
  122.             'stdCampus' => $request->get('stdCampus'),
  123.             'stdModality' => $request->get('stdModality'),
  124.             'stdEPS' => $request->get('stdEPS'),
  125.             'stdContact' => $request->get('stdContact'),
  126.             'stdContactPhone' => $request->get('stdContactPhone'),
  127.         ];
  128.         $util->createStudent($data$user);
  129.         $redirectUrl $this->generateUrl('admin_student_list') . '?identification=' $request->get('stdIdentification');
  130.         return $this->redirect($redirectUrl);
  131.     }
  132.     public function edit($id) {
  133.         $em $this->getDoctrine()->getManager();
  134.         $documentsTypes $em->getRepository(DocumentsTypes::class)->findAll();
  135.         $courses $em->getRepository(Courses::class)->findAll();
  136.         $student $em->getRepository(Students::class)->find($id);
  137.         $studentLevel $em->getRepository(StudentLevels::class)->findOneBy(['student' => $id]);
  138.         $myCourse $studentLevel->getLevel()->getCourse();
  139.         $myLevels $em->getRepository(Levels::class)->findAll(['course' => $myCourse], ['sequence' => 'ASC']);
  140.         return $this->render('student/edit.html.twig', [
  141.                     'documentsTypes' => $documentsTypes,
  142.                     'courses' => $courses,
  143.                     'student' => $student,
  144.                     'studentLevel' => $studentLevel,
  145.                     'myLevels' => $myLevels,
  146.         ]);
  147.         
  148.     }
  149.     public function update(Request $request) {
  150.         $id $request->get('stdudentid');
  151.         $em $this->getDoctrine()->getManager();
  152.         $student $em->getRepository(Students::class)->find($id);
  153.         $docutmenType $em->getRepository(DocumentsTypes::class)->find($request->get('stdDocumentType'));
  154.         $student->setNames(mb_strtoupper($request->get('stdname'), 'UTF-8'));
  155.         $student->setLastname(mb_strtoupper($request->get('stdlastname'), 'UTF-8'));
  156.         $student->setDocumentType($docutmenType);
  157.         $student->setDocumentNumber($request->get('stdIdentification'));
  158.         $student->setPhone($request->get('stdPhone'));
  159.         $student->setEmail($request->get('stdEmail'));
  160.         $student->setCity(mb_strtoupper($request->get('stdCity'), 'UTF-8'));
  161.         $student->setAddress(mb_strtoupper($request->get('stdAddress'), 'UTF-8'));
  162.         $student->setCampus(mb_convert_case($request->get('stdCampus'), MB_CASE_TITLE'UTF-8'));
  163.         $student->setModality(mb_convert_case($request->get('stdModality'), MB_CASE_TITLE'UTF-8'));
  164. //        $student->setEps(mb_strtoupper($request->get('stdEPS'), 'UTF-8'));
  165. //        $student->setParent(mb_strtoupper($request->get('stdContact'), 'UTF-8'));
  166. //        $student->setParentPhone($request->get('stdContactPhone'));
  167.         $em->persist($student);
  168.         $em->flush();
  169.         $redirectUrl $this->generateUrl('admin_student_list') . '?identification=' $request->get('stdIdentification');
  170.         return $this->redirect($redirectUrl);
  171.     }
  172.     
  173.     public function modules($studentid) {
  174.         $em $this->getDoctrine()->getManager();
  175.         /*
  176.          * en caso que el usuario logeado no sea ADMIN se consulta el estudiante
  177.          * esto para evitar que estudiantes vean información de los demás
  178.          */
  179.         if (!in_array('ROLE_ADMIN'$this->getUser()->getRoles()) && !in_array('ROLE_TEACHER'$this->getUser()->getRoles())) {
  180.             $student $em->getRepository(Students::class)->findOneBy(['user' => $this->getUser()->getId(), 'id' => $studentid]);
  181.             
  182.             if(empty($student)) {
  183.                 // return to home
  184.                 return $this->redirectToRoute('app_home');
  185.             }
  186.             $studentid $student->getId();
  187.         }
  188.         $student $em->getRepository(Students::class)->find($studentid);
  189.         // obtener el ultimo nivel del estudiante
  190.         $studentLevels $em->getRepository(StudentLevels::class)->findBy(['student' => $studentid], ['level' => 'DESC']);
  191.         // obtener todos los modulos activados al estudiante
  192.         $studentModules $em->getRepository(StudentModule::class)->findBy(['student' => $studentid]);
  193.         // obtener los modulos del nivel actual cursado
  194.         $modules $em->getRepository(Modules::class)->getModulesByLevels($studentLevels);
  195.         $modulesHistory = [];
  196.         foreach ($modules as $module) {
  197.             $checked false;
  198.             $approved false;
  199.             $score 0;
  200.             $scoreReading 0;
  201.             $scoreWriting 0;
  202.             $scoreListening 0;
  203.             $scoreSpeaking 0;
  204.             $stdAttempts 0;
  205.             $available 0;
  206.             $enbSince null;
  207.             $enbUntil null;
  208.             $presentedAt null;
  209.             $checkedAt null;
  210.             // 
  211.             foreach ($studentModules as $stdModule) {
  212.                 if ($stdModule->getModule() == $module) {
  213.                     $checked true;
  214.                     $score $stdModule->getScore();
  215.                     $approved $stdModule->getApproved();
  216.                     $available $stdModule->getAvailable();
  217.                     $enbSince $stdModule->getEnableSince();
  218.                     $enbUntil $stdModule->getEnableUntil();
  219.                     break;
  220.                 }
  221.             }
  222.             // obtener los registros de la ultima evaluación del estudiante
  223.             $studentEvaluation $em->getRepository(StudentEvaluation::class)
  224.                     ->findOneBy(['module' => $module->getId(), 'student' => $studentid], ['id' => 'DESC']);
  225.             if (!empty($studentEvaluation)) {
  226.                 $scoreReading $studentEvaluation->getScoreReading();
  227.                 $scoreWriting $studentEvaluation->getScoreWriting();
  228.                 $scoreListening $studentEvaluation->getScoreListening();
  229.                 $scoreSpeaking $studentEvaluation->getScoreSpeaking();
  230.                 $stdAttempts $studentEvaluation->getAttemps();
  231.                 $presentedAt $studentEvaluation->getPresentedAt();
  232.                 $checkedAt $studentEvaluation->getCheckedAt();
  233.             }
  234.             $modulesHistory[] = [
  235.                 'moduleId' => $module->getId(),
  236.                 'courseName' => $module->getLevel()->getCourse()->getName(),
  237.                 'moduleName' => $module->getName(),
  238.                 'scoreReading' => $scoreReading,
  239.                 'scoreWriting' => $scoreWriting,
  240.                 'scoreListening' => $scoreListening,
  241.                 'scoreSpeaking' => $scoreSpeaking,
  242.                 'moduleScore' => $score,
  243.                 'minScore' => $module->getScoreMinimun(),
  244.                 'evaluationStatus' => !empty($studentEvaluation) ? $studentEvaluation->getStatus() : 'NONE',
  245.                 'levelId' => $module->getLevel()->getId(),
  246.                 'levelName' => $module->getLevel()->getName(),
  247.                 'isChecked' => $checked,
  248.                 'approved' => $approved,
  249.                 'available' => $available,
  250.                 'enbSince' => $enbSince,
  251.                 'enbUntil' => $enbUntil,
  252.                 'enabled' => $module->getEnableShow(),
  253.                 'studentEvaluation' => $studentEvaluation,
  254.                 'attempts' => $stdAttempts,
  255.                 'presentedAt' => $presentedAt,
  256.                 'checkedAt' => $checkedAt,
  257.             ];
  258.         }
  259.         return $this->render('student/modules.html.twig', [
  260.                     'student' => $student,
  261.                     'moduleHistory' => $modulesHistory,
  262.         ]);
  263.     }
  264.     public function makeEvaluation($student$moduleRequest $request) {
  265.         $em $this->getDoctrine()->getManager();
  266.         // obtener el modulo del estudiante para validar que este disponible para continuar
  267.         $studentModule $em->getRepository(StudentModule::class)->findOneBy(['module' => $module'student' => $student]);
  268.         $studentEvaluation $em->getRepository(StudentEvaluation::class)
  269.                 ->findOneBy(['module' => $module'student' => $student], ['attemps' => 'DESC']);
  270.         if(!empty($studentEvaluation)) {
  271.             if($studentEvaluation->getStatus() == StudentEvaluation::STATUS_IN_PROCESS || $studentEvaluation->getApproved() == 1) {
  272.                 return $this->redirectToRoute('student_modules', ['studentid' => $studentEvaluation->getStudent()->getId()]);
  273.             }
  274.         }
  275.         $myModule $studentModule->getModule();
  276.         $myStudent $studentModule->getStudent();
  277.         // validar si el modulo ya esta evaluado y aprobado TODO
  278.         $isAvailable 1;
  279.         if($studentModule->getAvailable() != 1) {
  280.             $isAvailable 0;
  281.         }
  282.         return $this->render('student/makeEvaluation.html.twig', [
  283.                     'myModule' => $myModule,
  284.                     'myStudent' => $myStudent,
  285.                     'isAvailable' => $isAvailable,
  286.                     'attemps' => empty($studentEvaluation) ? $studentEvaluation->getAttemps(),
  287.         ]);
  288.     }
  289.     /**
  290.      * Almacenar las respuestas del estudiante esto es para que luego el profesor califique
  291.      * @param Request $request
  292.      * @return JsonResponse
  293.      */
  294.     public function saveEvaluationAnswers(Request $request) {
  295.         $myAnswers json_decode($request->get('answers'));
  296.         $myModule $request->get('module');
  297.         $studentId $request->get('studentId');
  298.         $myFullScore round($request->get('fullScore'), 2);
  299.         $myScore round($request->get('myScore'), 2);
  300.         $em $this->getDoctrine()->getManager();
  301.         // obtener el estudiante segun el usuario logeado
  302.         $student $em->getRepository(Students::class)->find($studentId);
  303.         // validar si el estudiante esta logeado
  304.         if (empty($student)) {
  305.             return new JsonResponse(['msn' => '__KO__''evaluationId' => 0,
  306.                 'score' => 0'approved' => 0]);
  307.         }
  308.         // obtener el modulo que se esta evaluando
  309.         $module $em->getRepository(Modules::class)->find($myModule);
  310.         // obtener el puntaje minimo para aprobar el modulo
  311.         $moduleScoreMinimun $module->getScoreMinimun();
  312.         // incrementar los intentos cuando presenta el examen
  313.         $studentEval $em->getRepository(StudentEvaluation::class)
  314.                 ->findBy(['student' => $student->getId(), 'module' => $module->getId()]);
  315.         $attemps count($studentEval) + 1;
  316.         // crear un nuevo registro de StudentEvaluation para almacenar las respuestas dadas
  317.         $studentEvaluation = new StudentEvaluation();
  318.         $studentEvaluation->setAttemps($attemps);
  319.         $studentEvaluation->setModule($module);
  320.         $studentEvaluation->setStudent($student);
  321.         $studentEvaluation->setAllPoints($myFullScore);
  322.         $studentEvaluation->setGettedPoints($myScore);
  323.         $studentEvaluation->setScoreMinimun($moduleScoreMinimun);
  324.         $studentEvaluation->setStatus(StudentEvaluation::STATUS_IN_PROCESS);
  325.         $student->setHasInProcessTest(Students::STUDENT_HAS_IN_PROGRESS_TEST_YES);
  326.         $em->persist($student);
  327.         // almacenar las respuestas
  328.         $scoreReading = [000];
  329.         $scoreWriting = [000];
  330.         $scoreListening = [000];
  331.         $scoreSpeaking = [000];
  332.         foreach ($myAnswers as $answersx) {
  333.             $answers = new StudentEvaluationAnswer();
  334.             $answers->setPoints($answersx->score); // puntaje de la pregunta
  335.             $answers->setScore(round($answersx->scoreGot2)); // puntaje obtenido en la calificacion previa a la validacion del docente
  336.             $answers->setQuestion($answersx->questionText); // la formulacion de la pregunta
  337.             $answers->setAnswerSkillType($answersx->questionSkill); // el tipo de pregunta y la habilidad
  338.             $answers->setRightAnswer($answersx->rightAnswer); // esta es la respuesta correcta esperada
  339.             $answers->setAnswerGiven($answersx->answerGiven); // respuesta dada por el estudiante
  340.             $answers->setIsChecked($answersx->checked); // respuesta validada y calificada
  341.             $answers->setAnswerType($answersx->answerType); // tipo de la respuesta
  342.             $answers->setStudentEvaluation($studentEvaluation); // asociar la evaluacion al estudiante
  343.             $em->persist($answers);
  344.             // calcular los porcentajes por habilidad
  345.             if($answersx->questionSkill == 'reading') {
  346.                 $scoreReading[0] += $answersx->score;
  347.                 $scoreReading[1] += $answersx->scoreGot;
  348.             } elseif($answersx->questionSkill == 'writing') {
  349.                 $scoreWriting[0] += $answersx->score;
  350.                 $scoreWriting[1] += $answersx->scoreGot;
  351.             } elseif($answersx->questionSkill == 'listening') {
  352.                 $scoreListening[0] += $answersx->score;
  353.                 $scoreListening[1] += $answersx->scoreGot;
  354.             } elseif($answersx->questionSkill == 'speaking') {
  355.                 $scoreSpeaking[0] += $answersx->score;
  356.                 $scoreSpeaking[1] += $answersx->scoreGot;
  357.             }
  358.         }
  359.         $scoreReading[2] = $scoreReading[1] * 100 $scoreReading[0];
  360.         $scoreWriting[2] = $scoreWriting[1] * 100 $scoreWriting[0];
  361.         $scoreListening[2] = $scoreListening[1] * 100 $scoreListening[0];
  362.         $scoreSpeaking[2] = $scoreSpeaking[1] * 100 $scoreSpeaking[0];
  363.         $stdEvalScore = ($scoreSpeaking[2] + $scoreListening[2] + $scoreWriting[2] + $scoreReading[2]) / 4;
  364.         $moduleApproved $stdEvalScore >= $moduleScoreMinimun 0;
  365.         $studentEvaluation->setScoreReading(round($scoreReading[2], 2));
  366.         $studentEvaluation->setScoreWriting(round($scoreWriting[2], 2));
  367.         $studentEvaluation->setScoreListening(round($scoreListening[2], 2));
  368.         $studentEvaluation->setScoreSpeaking(round($scoreSpeaking[2], 2));
  369.         $studentEvaluation->setPresentedAt(new DateTime('now'));
  370.         $studentEvaluation->setScore(round($stdEvalScore2));
  371.         $studentEvaluation->setApproved($moduleApproved);
  372.         $em->persist($studentEvaluation);
  373.         $em->flush();
  374.         return new JsonResponse(['msn' => '__OK__''evaluationId' => $studentEvaluation->getId(),
  375.             'score' => $stdEvalScore'approved' => $moduleApproved]);
  376.     }
  377.     public function reOpenExamToSetRating($evaluationId) {
  378.         $em $this->getDoctrine()->getManager();
  379.         $myEvaluation $em->getRepository(StudentEvaluation::class)
  380.                 ->find($evaluationId);
  381.         $myEvaluation->setStatus(StudentEvaluation::STATUS_IN_PROCESS);
  382.         $myAnswers $em->getRepository(StudentEvaluationAnswer::class)
  383.                 ->findBy(['studentEvaluation' => $myEvaluation'answerType' => 'opened']);
  384.         foreach($myAnswers as $answer) {
  385.             $arrPostReview $answer->getStudentEvaluationPostRevisions();
  386.             foreach($arrPostReview as $postReview) {
  387.                 $em->remove($postReview);
  388.             }
  389.             $answer->setIsChecked(false);
  390.             $answer->setScore(0);
  391.             $em->persist($answer);
  392.         }
  393.         $em->persist($myEvaluation);
  394.         $em->flush();
  395.         return $this->redirectToRoute('student_view_test', [
  396.                 'student' => $myEvaluation->getStudent()->getId(),
  397.                 'module' => $myEvaluation->getModule()->getId(),
  398.                 'evaluationid' => 0
  399.             ], Response::HTTP_SEE_OTHER);
  400.     }
  401.     public function viewEvaluation($student$module$evaluationid 0) {
  402.         $em $this->getDoctrine()->getManager();
  403.         // obtener la ultima evaluacion del estudiante
  404.         $arrEvaluationParams = ['student' => $student'module' => $module];
  405.         if(!empty($evaluationid)) {
  406.             $arrEvaluationParams = ['student' => $student'module' => $module'id' => $evaluationid];
  407.         }
  408.         $myEvaluation $em->getRepository(StudentEvaluation::class)
  409.                 ->findOneBy($arrEvaluationParams, ['id' => 'DESC']);
  410.         if(empty($myEvaluation)) {
  411.             return $this->redirectToRoute('admin_student_modules', ['studentid' => $student], Response::HTTP_SEE_OTHER);
  412.         }
  413.         // obtener las respuestas de esa evaluacion
  414.         $myEvaluationAnswer $em->getRepository(StudentEvaluationAnswer::class)
  415.                 ->findBy(['studentEvaluation' => $myEvaluation->getId()]);
  416.         return $this->render('student/viewEvaluation.html.twig', [
  417.                     'module' => $myEvaluation->getModule(),
  418.                     'evaluation' => $myEvaluation,
  419.                     'evaluationAnswer' => $myEvaluationAnswer,
  420.                     'student' => $myEvaluation->getStudent(),
  421.         ]);
  422.     }
  423.     /**
  424.      * Almacenar un archivo audio
  425.      * @param Request $request
  426.      * @return JsonResponse
  427.      */
  428.     public function studentUploadRecordingAudio(Request $request) {
  429.         
  430.         $dir $this->getParameter('kernel.project_dir') . '/public/logs/';
  431.         $fileMade $dir $this->getParameter('audio_logfile') . date('-Ymd') . '.log';
  432.         Utilities::setLogFile($fileMade'Inicio almacenar audio');
  433.         $fileName $request->get('name') . '.wav';
  434.         try {
  435.             $file $request->files->get('playload');
  436.             $fileOrigName $file->getClientOriginalName();
  437.             $filePath $this->getParameter('uploads_directory') . '/recording';
  438.             Utilities::setLogFile($fileMade$fileOrigName ' Nombre archivo ');
  439.             $file->move($filePath$fileName);
  440.             Utilities::setLogFile($fileMade$fileOrigName ' Moviendo archivo archivo ');
  441.             $response = new JsonResponse([
  442.                 'filePath' => '/uploads/recording/' $fileName
  443.             ]);
  444.             $response->setStatusCode(200);
  445.             Utilities::setLogFile($fileMade$fileOrigName ' Respondiendo al cliente');
  446.            return $response
  447.         } catch (Exception $ex) {
  448.             Utilities::setLogFile($fileMadesprintf('ERROR al guardar archivo %s , Mensaje %s'$fileName$ex->getMessage()));
  449.             $error = new JsonResponse(['error' => $ex->getMessage()]);
  450.             $error->setStatusCode(500);
  451.             return $error;
  452.         }
  453.     }
  454.     /**
  455.      * Por cada respuesta abierta guardar la calificacion del docente
  456.      * @param Request $request
  457.      * @return JsonResponse
  458.      */
  459.     public function savePostRevision(Request $request) {
  460.         $answerId $request->get('answerId');
  461.         $revisionId $request->get('revisionid');
  462.         $observation $request->get('observation');
  463.         $scoreVal round($request->get('scoreVal'), 2);
  464.         $em $this->getDoctrine()->getManager();
  465.         // obtener las respuestas de esa evaluacion
  466.         $myEvaluationAnswer $em->getRepository(StudentEvaluationAnswer::class)->find($answerId);
  467.         $myEvaluation $myEvaluationAnswer->getStudentEvaluation();
  468.         $answerScore $myEvaluationAnswer->getScore(); // puntaje obtenido en esta pregunta
  469.         $sumScore $answerScore $scoreVal;
  470.         $postRevision = new StudentEvaluationPostRevision();
  471.         // en caso que la revision exista se le resta ese puntaje al neuvo score
  472.         if(!empty($revisionId)) {
  473.             $postRevision $em->getRepository(StudentEvaluationPostRevision::class)->find($revisionId);
  474.             $sumScore -= $postRevision->getScore();
  475.         }
  476.         // calcular el nuevo puntale obtenido en la evaluacion
  477.         $examVal $myEvaluation->getGettedPoints() - $answerScore $sumScore;
  478.         // calcular el porcentaje obtenido
  479.         $examPercent round($examVal $myEvaluation->getAllPoints() * 100 2);
  480.         
  481.         $myEvaluation->setGettedPoints(round($examVal2));
  482.         $postRevision->setObservation($observation);
  483.         $postRevision->setScore($scoreVal);
  484.         $postRevision->setAnswer($myEvaluationAnswer);
  485.         $myEvaluationAnswer->setScore(round($sumScore2));
  486.         $myEvaluationAnswer->setIsChecked(true);
  487.         $em->persist($myEvaluation);
  488.         $em->persist($myEvaluationAnswer);
  489.         $em->persist($postRevision);
  490.         $em->flush();
  491.         return new JsonResponse(['revisionid' => $postRevision->getId(), 'evaluationScore' => $examPercent]);
  492.     }
  493.     /**
  494.      * cerrar la calificacion del docente y validar si el examen fue aprobado
  495.      * tambien promedia los resultados en las 4 habilidad comunicativas
  496.      * para activar el siguiente modulo al estudiante
  497.      * @param Request $request
  498.      * @return JsonResponse
  499.      */
  500.     public function closeEvaluation(Request $request) {
  501.         $evaluationId $request->get('evaluationId');
  502.         $studentId $request->get('studentId');
  503.         $moduleId $request->get('moduleId');
  504.         $em $this->getDoctrine()->getManager();
  505.         // obtener el registro StudenEvaluation
  506.         // # a este objeto se le deben actualizar los promedios para las 4 habilidades
  507.         $studentEvaluation $em->getRepository(StudentEvaluation::class)
  508.                 ->find($evaluationId);
  509.         $stdEvaluationInProcess $em->getRepository(StudentEvaluation::class)
  510.                 ->getInProcess($studentId$moduleId);
  511.         $sumTotalScored $this->calculatePonderatedSkills($evaluationId$studentEvaluation);
  512.         $studentEvaluation->setScore(round($sumTotalScored2));
  513.         $realStudent $studentEvaluation->getStudent();
  514.         // obtener el registro de StudenModule
  515.         $myStudentModule $em->getRepository(StudentModule::class)
  516.                 ->findOneBy(['student' => $studentId'module' => $moduleId], ['id' => 'DESC']);
  517.         // validar el puntaje obtenido para aprobar o no el examen
  518.         $myDate = new DateTime('now');
  519.         $approved = ($studentEvaluation->getScore() >= $studentEvaluation->getScoreMinimun()) ? 0;
  520.         $studentEvaluation->setStatus(StudentEvaluation::STATUS_FINISHED);
  521.         $studentEvaluation->setApproved($approved);
  522.         $studentEvaluation->setCheckedAt($myDate);
  523.         $myStudentModule->setFinishedAt($myDate);
  524.         $myStudentModule->setScore($studentEvaluation->getScore());
  525.         $myStudentModule->setApproved($approved);
  526.         // desactivar el examen actual para evitar que lo vuelvan a presentar
  527.         $myStudentModule->setAvailable(0);
  528.         // consultar si el estudiante tiene mas evaluaciones pendientes por calificar
  529.         // la presente evaluacion se cuenta como
  530.         if (count($stdEvaluationInProcess) == 0) {
  531.             $myStudentModule->getStudent()->setHasInProcessTest(Students::STUDENT_HAS_IN_PROGRESS_TEST_NO);
  532.         } else {
  533.             $myStudentModule->getStudent()->setHasInProcessTest(Students::STUDENT_HAS_IN_PROGRESS_TEST_YES);
  534.         }
  535.         $em->persist($myStudentModule);
  536.         $em->persist($studentEvaluation);
  537.         /*
  538.          * Validar si el examen fue aprobado y que sea un modulo que valida el nivel
  539.          * para activar el siguiente nivel en el modulo
  540.          */
  541.         $typeExamLevelModule 'module';
  542.         $typeExamName $myStudentModule->getModule()->getName();
  543.         $scRead round(($studentEvaluation->getScoreReading()/10), 0);
  544.         $scWrit round(($studentEvaluation->getScoreWriting()/10), 0);
  545.         $scList round(($studentEvaluation->getScoreListening()/10), 0);
  546.         $scSpek round(($studentEvaluation->getScoreSpeaking()/10), 0);
  547.         $scScore round(($studentEvaluation->getScore()/10), 0);
  548.         if ($myStudentModule->getModule()->getThisValidateLevel() == 1) {
  549.             /*
  550.              * Obtener los valores cuando el examen es para evaluar un nivel
  551.              */
  552.             $typeExamLevelModule 'level';
  553.             $typeExamName $myStudentModule->getModule()->getLevel()->getName();
  554.             $scRead round(($studentEvaluation->getScoreReading()/10), 2);
  555.             $scWrit round(($studentEvaluation->getScoreWriting()/10), 2);
  556.             $scList round(($studentEvaluation->getScoreListening()/10), 2);
  557.             $scSpek round(($studentEvaluation->getScoreSpeaking()/10), 2);
  558.             $scScore round(($studentEvaluation->getScore()/10), 2);
  559.         }
  560.         if ($approved == && $myStudentModule->getModule()->getThisValidateLevel() == 1) {
  561.             // al haber aprobado este modulo se habilita el siguiente modulo,
  562.             // marcando availabel=1 para StudentModule
  563.             $levelSequence $myStudentModule->getModule()->getLevel()->getSequence();
  564.             $levelCourse $myStudentModule->getModule()->getLevel()->getCourse()->getId();
  565.             // obtener el siguiente módulo, no necesariamente es un nuevo nivel
  566.             $nextModule $em->getRepository(Modules::class)->getNextLevel($levelCourse$levelSequence);
  567.             if (!empty($nextModule)) {
  568.                 
  569.                 /*
  570.                  * No se permite activar el siguiente modulo
  571.                  * @deprecated obtener el modulo para activarlo y se pueda presentar la evaluacion
  572.                  */
  573.                 $nextStudentModule $em->getRepository(StudentModule::class)
  574.                         ->findOneBy(['student' => $studentId'module' => $nextModule->getId()]);
  575.                 if (!empty($nextStudentModule)) {
  576.                     $nextStudentModule->setAvailable(0);
  577.                     $nextStudentModule->setApproved(0);
  578.                 } else {
  579.                     // si el estudiante no tiene el modulo registrado se crea el registro
  580.                     $nextStudentModule = new StudentModule();
  581.                     $nextStudentModule->setStudent($realStudent);
  582.                     $nextStudentModule->setModule($nextModule);
  583.                     $nextStudentModule->setAvailable(0);
  584.                     $nextStudentModule->setApproved(0);
  585.                 }
  586.                 $em->persist($nextStudentModule);
  587.                 // en caso que el nivel actual sea diferente al nivel del siguiente modulo se crea el registro en StudentLevel
  588.                 if($nextStudentModule->getModule()->getlevel() != $myStudentModule->getModule()->getLevel()) {
  589.                     $nextLevel $nextStudentModule->getModule()->getlevel();
  590.                     $newStudenLevel = new StudentLevels();
  591.                     $newStudenLevel->setStudent($realStudent);
  592.                     $newStudenLevel->setLevel($nextLevel);
  593.                     $newStudenLevel->setCreatedAt(new DateTime('now'));
  594.                     $em->persist($newStudenLevel);
  595.                 }
  596.             }
  597.         }
  598.         $em->flush();
  599.         /*
  600.          * enviar al WS las calificaciones
  601.          */
  602.         $util = new Utilities();
  603.         $url $this->getParameter('api_setcalification_url');
  604.         $data "{\"id\":\"" trim($realStudent->getDocumentNumber()) . "\"" .
  605.                 ", \"type\":\"" trim($typeExamLevelModule) . "\"" .
  606.                 ", \"typeName\":\"" .trim($typeExamName) . "\"" .
  607.                 ", \"listening\": " number_format($scList2'.''') .
  608.                 ", \"reading\":" number_format($scRead2'.''') .
  609.                 ", \"speaking\":" number_format($scSpek2'.''') .
  610.                 ", \"writing\":" number_format($scWrit2'.''') .
  611.                 ", \"score\":" number_format($scScore2'.''') . "}";
  612.         $username $this->getParameter('api_query_user');
  613.         $password $this->getParameter('api_query_pass');
  614.         $fileMade $this->getParameter('log_file') . date('-Ymd') . '.log';
  615.         $projectDir $this->getParameter('project_dir_path') . '/var/log';
  616.         $resultcurl $util->curlResultTest($url$datatrue$username$password);
  617.         $util->setDirectoryPath($projectDir);
  618.         $docNewLine '> CURL Envio notas' PHP_EOL json_encode($data) . PHP_EOL json_encode($resultcurl);
  619.         $util->writeLogFile($fileMade$docNewLine);
  620.         return new JsonResponse(['studentModule' => $myStudentModule->getId(), 'moduleApproved' => $approved]);
  621.     }
  622.     private function calculatePonderatedSkills($evaluationId$studentEvaluation) {
  623.         $em $this->getDoctrine()->getManager();
  624.         $pintsSkill $em->getRepository(StudentEvaluationAnswer::class)->getSumPointsToQuestionsBySkill($evaluationId);
  625.         $sumTotalScored 0;
  626.         // obtener los ponderados del 25% para cada habilidad
  627.         foreach ($pintsSkill as $pointSkill) {
  628.             $ponderated round($pointSkill['scoredExam'] * 100 $pointSkill['totalExam'], 2);
  629.             if ($pointSkill['skill'] == 'listening') {
  630.                 $sumTotalScored += $ponderated;
  631.                 $studentEvaluation->setScoreListening($ponderated);
  632.             } elseif ($pointSkill['skill'] == 'reading') {
  633.                 $sumTotalScored += $ponderated;
  634.                 $studentEvaluation->setScoreReading($ponderated);
  635.             } elseif ($pointSkill['skill'] == 'speaking') {
  636.                 $sumTotalScored += $ponderated;
  637.                 $studentEvaluation->setScoreSpeaking($ponderated);
  638.             } elseif ($pointSkill['skill'] == 'writing') {
  639.                 $sumTotalScored += $ponderated;
  640.                 $studentEvaluation->setScoreWriting($ponderated);
  641.             }
  642.         }
  643.         return $sumTotalScored 4;
  644.     }
  645.     public function activateModule(Request $request) {
  646.         $moduleId $request->get('moduleId');
  647.         $studentId $request->get('studentId');
  648.         $action $request->get('action');
  649.         $em $this->getDoctrine()->getManager();
  650.         $studentModule $em->getRepository(StudentModule::class)->findOneBy(['student' => $studentId'module' => $moduleId]);
  651.         if(empty($studentModule)) {
  652.             return new JsonResponse(['msn' => '__KO__''isAvailable' => $action]);
  653.         }
  654.         
  655.         $studentModule->setAvailable($action);
  656.         $em->persist($studentModule);
  657.         $em->flush();
  658.         return new JsonResponse(['msn' => '__OK__''isAvailable' => $action]);
  659.     }
  660.     public function praxisMakeTest($cardid$moduleUserPasswordHasherInterface $userPasswordHasherRequest $request) {
  661.         // decodificar los parametros para obtener la identificacion y el modulo para el test
  662.         $studentCardId trim(base64_decode($cardid));
  663.         $moduleId trim(base64_decode($module));
  664.         
  665.         // buscar o crear el estudiante y el usuario
  666.         $em $this->getDoctrine()->getManager();
  667.         $student $em->getRepository(Students::class)->findOneBy(['documentNumber' => $studentCardId]);
  668.         $module $em->getRepository(Modules::class)->getModuleLikeName($moduleId);
  669.         $user null;
  670.         if(empty($module)) {
  671.             return $this->render('default/error.html.twig', [
  672.                 'message' => "YOU DON'T HAVE ACCESS TO THIS PAGE"
  673.             ]);
  674.         }
  675.         if (!empty($student)) {
  676.             $user $student->getUser();
  677.         } else {
  678.             $dateNow = new DateTime('now');
  679.             // crear el estudiante y usuario en caso que no exista
  680.             $this->userPasswordHasher $userPasswordHasher;
  681.             $user $this->praxisNewUser($studentCardId"Student $studentCardId");
  682.             $student = new Students();
  683.             $student->setDocumentNumber($studentCardId);
  684.             $student->setNames('name ' $studentCardId);
  685.             $student->setLastname('lastname ' $studentCardId);
  686.             $student->setHasInProcessTest(0);
  687.             $student->setUser($user);
  688.             $em->persist($student);
  689.             //crear registro de la tabla intermedia estudiante_curso
  690.             $course $em->getRepository(Courses::class)->findOneBy([], ['id' => 'ASC']);
  691.             $studentCourse = new StudentCourse();
  692.             $studentCourse->setStudent($student);
  693.             $studentCourse->setCourse($course);
  694.             $studentCourse->setInitDate($dateNow);
  695.             $em->persist($studentCourse);
  696.             // crear registro de la tabla intermedia estudiante_level
  697.             $level $module->getLevel();
  698.             $studentLevel = new StudentLevels();
  699.             $studentLevel->setStudent($student);
  700.             $studentLevel->setLevel($level);
  701.             $studentLevel->setCreatedAt($dateNow);
  702.             $em->persist($studentLevel);
  703.             //obtener todos los modulos del nivel actual y de los siguientes
  704.             $modulesByLevel $em->getRepository(Levels::class)->getModulesGTlevel($level);
  705.             foreach($modulesByLevel as $modulex) {
  706.                 // Agregar student_module los modulos del nivel  en esatdo desabilitado
  707.                 $isAvailable = ($module == $modulex) ? 0;
  708.                 $stModul = new StudentModule();
  709.                 $stModul->setAvailable($isAvailable);
  710.                 $stModul->setModule($modulex);
  711.                 $stModul->setStudent($student);
  712.                 $em->persist($stModul);
  713.             }
  714.             $em->flush();
  715.         }
  716.         $session = new Session();
  717.         $session->start();
  718.         $session->set('user'$user);
  719. //        'student_make_test',{'student': student.id, 'module': module.moduleId}
  720.         return $this->redirectToRoute('app_home');
  721.         
  722.     }
  723.     private function praxisNewUser($cardtId$fullname '---') {
  724.         $em $this->getDoctrine()->getManager();
  725.         // consultar si el estudiante existe
  726.         $userQ $em->getRepository(User::class)->findOneBy(['username' => $cardtId]);
  727.         if(!empty($userQ)) {
  728.             return $userQ;
  729.         }
  730.         $user = new User();
  731.         $user->setUsername($cardtId);
  732.         $user->setFullname($fullname);
  733.         $user->setIsActive(true);
  734.         $user->setRoles(['ROLE_USER''ROLE_STUDENT']);
  735.         $user->setPassword($this->userPasswordHasher->hashPassword($user$cardtId));
  736.         $em->persist($user);
  737.         $em->flush();
  738.         return $user;
  739.     }
  740.     /**
  741.      * @Route("/login_check", name="login_check")
  742.      */
  743. //    public function someAction(NotifierInterface $notifier, LoginLinkHandlerInterface $loginLinkHandler, Request $request): Response {
  744.     public function someAction(Request $request) {
  745. dd(333);
  746.         $expires $request->get('expires');
  747.         $username $request->get('user');
  748.         $hash $request->get('hash');
  749.     dd($hash);
  750.         
  751.         // get the user to be authenticated
  752.         $em $this->getDoctrine()->getManager();
  753.         $user $em->getRepository(User::class)->findOneBy(['username' => '1022334123']);
  754. dd($user);
  755.         // log the user in on the current firewall
  756.         $this->security->login($user);
  757. dd($user);
  758.         // if the firewall has more than one authenticator, you must pass it explicitly
  759.         // by using the name of built-in authenticators...
  760.         $this->security->login($user'form_login');
  761.         // ...or the service id of custom authenticators
  762.         $this->security->login($userExampleAuthenticator::class);
  763.         // you can also log in on a different firewall
  764.         $this->security->login($user'form_login''other_firewall');
  765.         // ... redirect the user to its account page for instance
  766.     }
  767.     /**
  768.      * Validar los valores de un array y si alguno no es vacio se retorna true <br>
  769.      * en caso que todos esten vacios se retorna false
  770.      * @param type $arrFileds
  771.      * @return boolean true|false
  772.      */
  773.     private function validateFilter($arrFileds) {
  774.         $hasFilter false;
  775.         foreach($arrFileds as $filter) {
  776.             if(!empty($filter)) {
  777.                 $hasFilter true;
  778.                 break;
  779.             }
  780.         }
  781.         return $hasFilter;
  782.     }
  783.     public function reportTestsScore(PaginatorInterface $paginatorRequest $request) {
  784.         $em $this->getDoctrine()->getManager();
  785.         $course trim($request->get('course'));
  786.         $dateI trim($request->get('dateI'));
  787.         $dateO trim($request->get('dateO'));
  788.         if(empty($dateI)) {
  789.             $date = new DateTime('now');
  790.             $dateI $date->format('Y-m-01');
  791.             $dateO $date->format('Y-m-t');
  792.         }
  793.         $studentList $em->getRepository(Students::class)->getScoreTest($course$dateI$dateO);
  794.         $courses $em->getRepository(Courses::class)->findBy([], ['id' => 'ASC']);
  795.         $listdata $paginator->paginate(
  796.                 $studentList,
  797.                 $request->query->getInt('page'1),
  798.                 50
  799.         );
  800.         return $this->render('student/reportTestScore.html.twig', [
  801.                     'listdata' => $listdata,
  802.                     'dateI' => $dateI,
  803.                     'dateO' => $dateO,
  804.                     'course' => $course,
  805.                     'coursesList' => $courses,
  806.         ]);
  807.     }
  808.     public function reportTestsScoreExcel(Request $request) {
  809.         $em $this->getDoctrine()->getManager();
  810.         $course trim($request->get('course'));
  811.         $dateI trim($request->get('dateI'));
  812.         $dateO trim($request->get('dateO'));
  813.         if (empty($dateI)) {
  814.             $date = new DateTime('now');
  815.             $dateI $date->format('Y-m-01');
  816.             $dateO $date->format('Y-m-t');
  817.         }
  818.         $studentList $em->getRepository(Students::class)->getScoreTest($course$dateI$dateO);
  819.         $list $studentList->getResult();
  820.         $header = ['Nombres''Apellidos''Identificación''Sede''Curso''Nivel''F. Presentado''F. Revisado',
  821.             'Estado''Aprobación''Intentos''Reading''Writing''Listenig''Speaking''Total'];
  822.         $body = [];
  823.         foreach ($list as $score) {
  824.             $txtApproved '';
  825.             if ($score->getStatus() == 'FINISHED') {
  826.                 $txtApproved $score->getApprovedText();
  827.             }
  828.             
  829.             $body[] = [
  830.                 $score->getStudent()->getNames(),
  831.                 $score->getStudent()->getLastname(),
  832.                 $score->getStudent()->getDocumentNumber(),
  833.                 $score->getStudent()->getCampus(),
  834.                 $score->getModule()->getLevel()->getCourse()->getName(),
  835.                 $score->getModule()->getLevel()->getName(),
  836.                 $score->getPresentedAt() ? $score->getPresentedAt()->format('Y-m-d h:i a') : '',
  837.                 $score->getCheckedAt() ? $score->getCheckedAt()->format('Y-m-d h:i a') : '',
  838.                 $score->getStatusText(),
  839.                 $txtApproved,
  840.                 $score->getAttemps(),
  841.                 $score->getScoreReading(),
  842.                 $score->getScoreWriting(),
  843.                 $score->getScoreListening(),
  844.                 $score->getScoreSpeaking(),
  845.                 $score->getScore(),
  846.             ];
  847.         }
  848.         $filexlsx Utilities::generateExcelByArr($header$body);
  849.         $fileName "Reporte de Notas $dateI-$dateO .xlsx";
  850.         $response = new StreamedResponse(function () use ($filexlsx) {
  851.                     $filexlsx->save('php://output');
  852.                 });
  853.         $response->headers->set('Content-Type''application/vnd.ms-excel');
  854.         $response->headers->set('Content-Disposition''attachment;filename="' $fileName '"');
  855.         $response->headers->set('Cache-Control''max-age=0');
  856.         return $response;
  857.     }
  858.     public function downloadExcelTemplate() {
  859.         $response = new Response();
  860.         $response->headers->set('Content-type''application/octet-stream');
  861.         $response->headers->set('Content-Disposition'sprintf('attachment; filename="%s"'"plantilla_examenes.xlsx"));
  862.         $response->setContent(file_get_contents($this->getParameter('kernel.project_dir') . '/documentation/PlantillaExamenes.xlsx'));
  863.         $response->setStatusCode(200);
  864.         $response->headers->set('Content-Transfer-Encoding''binary');
  865.         $response->headers->set('Pragma''no-cache');
  866.         $response->headers->set('Expires''0');
  867.         return $response;
  868.     }
  869.     
  870. }