src/Repository/ExamUserRepository.php line 49

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Repository;
  3. use EADPlataforma\Entity\Exam;
  4. use EADPlataforma\Entity\ExamUser;
  5. use EADPlataforma\Entity\ExamUserAnswer;
  6. use EADPlataforma\Entity\Enrollment;
  7. use EADPlataforma\Entity\Course;
  8. use EADPlataforma\Entity\Library;
  9. use EADPlataforma\Entity\Lesson;
  10. use EADPlataforma\Entity\LessonModule;
  11. use EADPlataforma\Entity\CourseCertificate;
  12. use EADPlataforma\Entity\User;
  13. use EADPlataforma\Entity\Question;
  14. use EADPlataforma\Entity\Trash;
  15. use EADPlataforma\Enum\ExamEnum;
  16. use EADPlataforma\Enum\ExamUserEnum;
  17. use EADPlataforma\Enum\CourseEnum;
  18. use EADPlataforma\Enum\LessonEnum;
  19. use EADPlataforma\Enum\LessonModuleEnum;
  20. use EADPlataforma\Enum\QuestionEnum;
  21. use EADPlataforma\Enum\TagsMarketingEnum;
  22. use EADPlataforma\Enum\NotificationEnum;
  23. use EADPlataforma\Enum\UserEnum;
  24. use \PDO;
  25. /**
  26.  * @method ExamUser|null find($id, $lockMode = null, $lockVersion = null)
  27.  * @method ExamUser|null findOneBy(array $criteria, array $orderBy = null)
  28.  * @method ExamUser[]    findAll()
  29.  * @method ExamUser[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  30.  */
  31. class ExamUserRepository extends AbstractRepository
  32. {
  33.     public function getEntityClass(){
  34.         return ExamUser::class;
  35.     }
  36.     public function getConnectionName(){
  37.         return "school";
  38.     }
  39.     public function findItems()
  40.     {
  41.         return $this->createQueryBuilder('eu')->getQuery()->getResult();
  42.     }
  43.     public function getLastContentByExam(Exam $examUser $user)
  44.     {
  45.         $examRepository $this->em->getRepository(Exam::class);
  46.         $lessonRepository $this->em->getRepository(Lesson::class);
  47.         $libraryRepository $this->em->getRepository(Library::class);
  48.         $examType $exam->getType();
  49.         $course $exam->getCourse();
  50.         $lessonModule $exam->getLessonModule();
  51.         $lesson $exam->getLesson();
  52.         $contentPagesNumber null;
  53.         $contentDuration null;
  54.         $contentType null;
  55.         $contentThumb null;
  56.         $lessonId null;
  57.         $moduleId null;
  58.         $courseId $course->getId();
  59.         $lessonRef null;
  60.         $type "lesson";
  61.         if($examType == ExamEnum::QUIZ){
  62.             $lessonRef $lesson;
  63.         }else if($examType == ExamEnum::LESSON){
  64.             $lessonRef $lesson;
  65.         }else if($examType == ExamEnum::MODULE){
  66.             $lessonRef $lessonRepository->getLastLesson($course$lessonModule);
  67.         }else if($examType == ExamEnum::COURSE){
  68.             $lessonRef $lessonRepository->getLastLesson($course);
  69.         }
  70.         if(empty($lessonRef)){
  71.             return;
  72.         }
  73.         $lessonId $lessonRef->getId();
  74.         $moduleRef $lessonRef->getLessonModule();
  75.         $moduleId $moduleRef->getId();
  76.         $examLast null;
  77.         if($examType == ExamEnum::COURSE){
  78.             
  79.             $filter = [
  80.                 "course" => $courseId,
  81.                 "lessonModule" => $moduleId,
  82.                 "type" => ExamEnum::MODULE,
  83.                 "status" => ExamEnum::PUBLISHED,
  84.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  85.             ];
  86.             $type "exam";
  87.             $examLast $examRepository->findOneBy($filter);
  88.         }
  89.         if(empty($examLast) && ($examType == ExamEnum::COURSE || $examType == ExamEnum::MODULE)){
  90.             $filter = [
  91.                 "course" => $courseId,
  92.                 "lessonModule" => $moduleId,
  93.                 "lesson" => $lessonId,
  94.                 "type" => ExamEnum::LESSON,
  95.                 "status" => ExamEnum::PUBLISHED,
  96.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  97.             ];
  98.             $type "exam";
  99.             $examLast $examRepository->findOneBy($filter);
  100.         }
  101.         if(empty($examLast)){
  102.             $filter = [
  103.                 "course" => $courseId,
  104.                 "lessonModule" => $moduleId,
  105.                 "lesson" => $lessonId,
  106.                 "type" => ExamEnum::QUIZ,
  107.                 "status" => ExamEnum::PUBLISHED,
  108.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  109.             ];
  110.             $type "quiz";
  111.             $examLast $examRepository->findOneBy($filter);
  112.         }
  113.         if(empty($examLast)){
  114.             $type "lesson";
  115.             $library $lessonRef->getLibrary();
  116.             if($library){
  117.                 $contentPagesNumber $library->getPagesNumber();
  118.                 $contentDuration $library->getDuration();
  119.                 $contentType $library->getType();
  120.                 $contentThumb $libraryRepository->getCover($library);
  121.             }
  122.         }
  123.         $timeUtil $this->generalService->getUtil('DateTimeUtil');
  124.         
  125.         return (object)[
  126.             "id" => (int)($examLast $examLast->getId() : $lessonRef->getId()),
  127.             "lessonId" => $lessonId,
  128.             "moduleId" => $moduleId,
  129.             "courseId" => $courseId,
  130.             "title" => ($examLast $examLast->getTitle() : $lessonRef->getTitle()),
  131.             "type" => $type,
  132.             "contentPagesNumber" => $contentPagesNumber,
  133.             "contentDuration" => $contentDuration $timeUtil->timeToSec($contentDuration) : null,
  134.             "contentType" => $contentType,
  135.             "contentThumb" => $contentThumb,
  136.             "isAccessible" => true,
  137.             "acessMessage" => null,
  138.         ];
  139.     }
  140.     public function getNextContentByExam(Exam $examUser $user)
  141.     {
  142.         $examRepository $this->em->getRepository(Exam::class);
  143.         $enrollmentRepository $this->em->getRepository(Enrollment::class);
  144.         $lessonRepository $this->em->getRepository(Lesson::class);
  145.         $libraryRepository $this->em->getRepository(Library::class);
  146.         $courseRepository $this->em->getRepository(Course::class);
  147.         $examType $exam->getType();
  148.         $course $exam->getCourse();
  149.         $lessonModule $exam->getLessonModule();
  150.         $lesson $exam->getLesson();
  151.         $contentPagesNumber null;
  152.         $contentDuration null;
  153.         $contentType null;
  154.         $contentThumb null;
  155.         $lessonId null;
  156.         $moduleId null;
  157.         $courseId $course->getId();
  158.         $lessonRef null;
  159.         $type "exam";
  160.         $examNext null;
  161.         $isAccessible false;
  162.         $acessMessage null;
  163.         if($examType == ExamEnum::COURSE){
  164.             return;
  165.         }
  166.         if($examType == ExamEnum::QUIZ){
  167.             $lessonRef $lesson;
  168.             $filter = [
  169.                 "course" => $courseId,
  170.                 "lessonModule" => $moduleId,
  171.                 "lesson" => $lessonId,
  172.                 "type" => ExamEnum::LESSON,
  173.                 "status" => ExamEnum::PUBLISHED,
  174.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  175.             ];
  176.             $examNext $examRepository->findOneBy($filter);
  177.         }else if($examType == ExamEnum::LESSON){
  178.             $lessonRef $lesson;
  179.         }else if($examType == ExamEnum::MODULE){
  180.             $lessonRef $lessonRepository->getLastLesson($course$lessonModule);
  181.         }
  182.         if(!$examNext && $lessonRepository->isLastModuleLesson($lessonRef)){
  183.             $filter = [
  184.                 "course" => $courseId,
  185.                 "lessonModule" => $moduleId,
  186.                 "type" => ExamEnum::MODULE,
  187.                 "status" => ExamEnum::PUBLISHED,
  188.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  189.             ];
  190.             $examNext $examRepository->findOneBy($filter);
  191.         }
  192.         if(!$examNext && $lessonRepository->isLastCourseLesson($lessonRef)){
  193.             $filter = [
  194.                 "course" => $courseId,
  195.                 "type" => ExamEnum::COURSE,
  196.                 "status" => ExamEnum::PUBLISHED,
  197.                 "deleted" => ExamEnum::ITEM_NO_DELETED
  198.             ];
  199.             $examNext $examRepository->findOneBy($filter);
  200.         }
  201.         if(!$examNext){
  202.             if(!$lessonRef){
  203.                 return;
  204.             }
  205.             $type "lesson";
  206.             $nextLessonId $lessonRepository->getLessonIdAfterThat($lessonRef);
  207.             if(empty($nextLessonId)){
  208.                 return;
  209.             }
  210.             $lessonRef $lessonRepository->find($nextLessonId);
  211.             if(!$lessonRef){
  212.                 return;
  213.             }
  214.             $enrollment $enrollmentRepository->findOneBy([
  215.                 "user" => $user->getId(),
  216.                 "course" => $courseId,
  217.             ]);
  218.             if($enrollment){
  219.                 $isStudent $courseRepository->isStudent($course);
  220.                 $infoAccess $lessonRepository->checkLessonIsAccessibleToUser(
  221.                     $lessonRef
  222.                     $enrollment
  223.                     null
  224.                     $isStudent
  225.                 );
  226.                 $isAccessible $infoAccess->isAccessible;
  227.                 $acessMessage $infoAccess->message;
  228.             }
  229.             $library $lessonRef->getLibrary();
  230.             if($library){
  231.                 $contentPagesNumber $library->getPagesNumber();
  232.                 $contentDuration $library->getDuration();
  233.                 $contentType $library->getType();
  234.                 $contentThumb $libraryRepository->getCover($library);
  235.             }
  236.         }else{
  237.             $infoAccess $examRepository->checkExamIsAccessible($examNext);
  238.             $isAccessible $infoAccess->isAccessible;
  239.             $acessMessage $infoAccess->message;
  240.         }
  241.         $timeUtil $this->generalService->getUtil('DateTimeUtil');
  242.         return (object)[
  243.             "id" => (int)($examNext $examNext->getId() : $lessonRef->getId()),
  244.             "lessonId" => $lessonId,
  245.             "moduleId" => $moduleId,
  246.             "courseId" => $courseId,
  247.             "title" => ($examNext $examNext->getTitle() : $lessonRef->getTitle()),
  248.             "type" => $type,
  249.             "contentPagesNumber" => $contentPagesNumber,
  250.             "contentDuration" => (
  251.                 $contentDuration 
  252.                 $timeUtil->timeToSec($contentDuration) : 
  253.                 null
  254.             ),
  255.             "contentType" => $contentType,
  256.             "contentThumb" => $contentThumb,
  257.             "isAccessible" => $isAccessible,
  258.             "acessMessage" => $acessMessage,
  259.         ];
  260.     }
  261.     public function getDataIndexNew(Exam $examUser $user)
  262.     {
  263.         $examUser $this->findOneBy([
  264.             "user" => $user->getId(),
  265.             "exam" => $exam->getId(),
  266.             "inactive" => ExamUserEnum::NO,
  267.             "deleted" => ExamUserEnum::ITEM_NO_DELETED
  268.         ]);
  269.         $attemptsInfo $this->getAttemptsInfo($exam$examUser);
  270.         $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  271.         
  272.         $timeSeconds $dateTimeUtil->timeToSec($exam->getExamTime());
  273.         $timeRestToEndSeconds $timeSeconds;
  274.         $progress 0;
  275.         $withTemplate false;
  276.         $onlyAnswer false;
  277.         $questions null;
  278.         
  279.         if($examUser && $exam->getType() != ExamEnum::QUIZ){
  280.             $expired $this->examUserIsExpired($examUser);
  281.             if($expired){
  282.                 $examUser $this->findOneBy([
  283.                     "id" => $examUser->getId()
  284.                 ]);
  285.             }
  286.             $todaySeconds strtotime(date('Y-m-d H:i:s'));
  287.             $dateStartSeconds strtotime($examUser->getDateStart());
  288.             $dateExamEndSecods $dateStartSeconds $timeSeconds;
  289.             if($examUser->getStatus() == ExamUserEnum::IN_PROGRESS){
  290.                 $timeRestToEndSeconds $dateExamEndSecods $todaySeconds;
  291.                 if($timeRestToEndSeconds 0){
  292.                     $timeRestToEndSeconds 0;
  293.                 }
  294.             }
  295.             $progress $this->getProgress($examUser);
  296.             $onlyAnswer = ($examUser->getStatus() != ExamUserEnum::IN_PROGRESS);
  297.             
  298.             if($exam->getShowTemplate() == QuestionEnum::YES){
  299.                 $withTemplate $onlyAnswer;
  300.                 if($attemptsInfo->attempts == ExamEnum::YES){
  301.                     $withTemplate false;
  302.                 }
  303.             }
  304.             $questionRepository $this->em->getRepository(Question::class);
  305.             $questions $questionRepository->getQuestionsByExamUser(
  306.                 $examUser
  307.                 $withTemplate
  308.                 $onlyAnswer
  309.             );
  310.         }else if($exam->getType() == ExamEnum::QUIZ){
  311.             $questions $exam->getQuestionsArray(true);
  312.         }
  313.         $data = (object)[
  314.             "lastContent" => $this->getLastContentByExam($exam$user),
  315.             "nextContent" => $this->getNextContentByExam($exam$user),
  316.             "examUser" => ($examUser $examUser->toReturn() : null),
  317.             "examConfig" => (object)[
  318.                 "id" => $exam->getId(),
  319.                 "title" => $exam->getTitle(),
  320.                 "questionNumber" => $exam->getQuestionNumber(),
  321.                 "examWeight" => $exam->getExamWeight(),
  322.                 "examTime" => $exam->getExamTime(),
  323.                 "course" => ($exam->getCourse() ? $exam->getCourse()->getId() : null),
  324.                 "lessonModule" => (
  325.                     $exam->getLessonModule() ? 
  326.                     $exam->getLessonModule()->getId() : 
  327.                     null
  328.                 ),
  329.                 "lesson" => ($exam->getLesson() ? $exam->getLesson()->getId() : null),
  330.                 "controlTime" => $exam->getControlTime(),
  331.             ],
  332.             "timeRestToEnd" => $dateTimeUtil->secToTime($timeRestToEndSeconds),
  333.             "timeRestToEndSeconds" => $timeRestToEndSeconds,
  334.             "progress" => $progress,
  335.             "attemptDateRelease" => $attemptsInfo->attemptDateRelease,
  336.             "allowAttempt" => $attemptsInfo->attempts,
  337.             "hasAttempts" => $attemptsInfo->hasAttempts,
  338.             "isLastAttempt" => $attemptsInfo->isLastAttempt,
  339.             "questions" => $questions,
  340.         ];
  341.         return $data;
  342.     }
  343.     public function getProgress(ExamUser $examUser)
  344.     {   
  345.         $user $examUser->getUser();
  346.         $exam $examUser->getExam();
  347.         $progress 100;
  348.         if(
  349.             $examUser->getStatus() == ExamUserEnum::IN_PROGRESS || 
  350.             $examUser->getStatus() == ExamUserEnum::TIMEOUT
  351.         ){
  352.             $examUserAnswerRepository $this->em->getRepository(ExamUserAnswer::class);
  353.             $questionAnswerNumber $examUserAnswerRepository->countAsnweredByExamUser(
  354.                 $examUser
  355.             );
  356.             $questionNumber $exam->getQuestionNumber();
  357.             if(empty($exam->getQuestionNumber())){
  358.                 $questionNumber 1;
  359.             }
  360.             $progress round($questionAnswerNumber 100 $questionNumber);
  361.             $progress = ($progress >= 100 100 $progress);
  362.         }
  363.         return $progress;
  364.     }
  365.     public function getAttemptsInfo(Exam $exam, ?ExamUser $examUser null)
  366.     {
  367.         $isLastAttempt ExamEnum::YES;
  368.         $attempts $exam->getAttempts();
  369.         $hasAttempts $exam->getAttempts();
  370.         $attemptDateRelease null;
  371.         
  372.         $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  373.         if($examUser){
  374.             $user $examUser->getUser();
  375.             if(
  376.                 $attempts == ExamEnum::YES && 
  377.                 $examUser->getStatus() != ExamUserEnum::APPROVED
  378.             ){
  379.                 $attemptsUserNumber $this->count([
  380.                     "deleted" => ExamUserEnum::ITEM_NO_DELETED,
  381.                     "user" => $user->getId(),
  382.                     "exam" => $exam->getId(),
  383.                 ]);
  384.                 if($attemptsUserNumber >= $exam->getAttemptsNumber()){
  385.                     $attempts ExamEnum::NO;
  386.                 }else{
  387.                     $isLastAttempt ExamEnum::NO;
  388.                     
  389.                     if($exam->getAttemptsAutoRelease() == ExamEnum::NO){
  390.                         $typeRelease $exam->getAttemptsTypeRelease();
  391.                         $dateEnd $examUser->getDateEnd();
  392.                         $examTimeTry 0;
  393.                         if($typeRelease == ExamEnum::DAYS){
  394.                             $examTimeTry strtotime(
  395.                                 "{$dateEnd} + {$exam->getAttemptsPeriod()} day"
  396.                             );
  397.                         }else if($typeRelease == ExamEnum::HOURS){
  398.                             $attemptTimeSeconds $dateTimeUtil->timeToSec(
  399.                                 $exam->getAttemptsTime()
  400.                             );
  401.                             $examTimeTry strtotime($dateEnd) + $attemptTimeSeconds;
  402.                         }
  403.                         $todaySeconds strtotime(date('Y-m-d H:i:s'));
  404.                         
  405.                         if($examTimeTry $todaySeconds){
  406.                             $attempts ExamEnum::NO;
  407.                             $attemptDateRelease date('Y-m-d H:i:s'$examTimeTry);
  408.                         }
  409.                     }
  410.                 }
  411.             }else{
  412.                 $attempts ExamEnum::NO;
  413.             }
  414.         }
  415.         return (object)[
  416.             "isLastAttempt" => $isLastAttempt,
  417.             "attempts" => $attempts,
  418.             "hasAttempts" => $hasAttempts,
  419.             "attemptDateRelease" => $attemptDateRelease,
  420.         ];
  421.     }
  422.     public function countValidExamUserByCourse(int $courseIdint $userId)
  423.     {
  424.         $query $this->createQueryBuilder('eu');
  425.         $query->innerJoin('EADPlataforma:Exam''e''WITH''e.id = eu.exam');
  426.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  427.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule');
  428.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson');
  429.         $query->select('COUNT(e.id) AS total');
  430.         $query->andWhere('eu.deleted = :examUserDeleted');
  431.         $query->andWhere('e.deleted = :examDeleted');
  432.         $query->andWhere('e.status = :examStatus');
  433.         $query->andWhere('eu.releaseAccess = :yes');
  434.         $query->andWhere('eu.inactive = :no');
  435.         $query->andWhere('e.examWeight > 0');
  436.         //$query->andWhere('e.requirement = :yes');
  437.         $query->andWhere('e.course = :course');
  438.         $query->andWhere('eu.user = :user');
  439.         $query->andWhere('
  440.             (
  441.                 (e.type = :typeCourse AND c.deleted = :courseDeleted)
  442.                 OR (
  443.                     e.type = :typeLessonModule
  444.                     AND lm.status = :lessonModuleStatus 
  445.                     AND lm.deleted = :lessonModuleDeleted
  446.                 ) 
  447.                 OR (
  448.                     e.type = :typeLesson 
  449.                     AND l.status = :lessonStatus
  450.                     AND lm.status = :lessonModuleStatus
  451.                     AND l.deleted = :lessonDeleted
  452.                 )
  453.             )
  454.         ');
  455.         $query->setParameter('typeCourse'ExamEnum::COURSE);
  456.         $query->setParameter('typeLessonModule'ExamEnum::MODULE);
  457.         $query->setParameter('typeLesson'ExamEnum::LESSON);
  458.         $query->setParameter('examDeleted'ExamEnum::ITEM_NO_DELETED);
  459.         $query->setParameter('examUserDeleted'ExamUserEnum::ITEM_NO_DELETED);
  460.         $query->setParameter('courseDeleted'CourseEnum::ITEM_NO_DELETED);
  461.         $query->setParameter('lessonModuleDeleted'LessonModuleEnum::ITEM_NO_DELETED);
  462.         $query->setParameter('lessonDeleted'LessonEnum::ITEM_NO_DELETED);
  463.         
  464.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  465.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  466.         $query->setParameter('examStatus'ExamEnum::PUBLISHED);
  467.         $query->setParameter('yes'ExamEnum::YES);
  468.         $query->setParameter('no'ExamEnum::NO);
  469.         $query->setParameter('course'$courseId);
  470.         $query->setParameter('user'$userId);
  471.         
  472.         $result = (object)$query->getQuery()->getOneOrNullResult();
  473.         return $result->total;
  474.     }
  475.     public function countExamUserStatus(?int $status null)
  476.     {
  477.         $query $this->createQueryBuilder('eu');
  478.         $query->select('COUNT(eu.id) AS total');
  479.         $query->andWhere('eu.deleted = :deleted');
  480.         $query->setParameter('deleted'ExamUserEnum::ITEM_NO_DELETED);
  481.         if(!is_null($status)){
  482.             $query->andWhere('eu.status = :status');
  483.             $query->setParameter('status'$status);
  484.         }
  485.         $result = (object)$query->getQuery()->getOneOrNullResult();
  486.         return $result->total;
  487.     }
  488.     public function getCurrentStartedExamUser(Course $courseUser $user){
  489.         $q $this->createQueryBuilder('eu');
  490.         $q->innerJoin(
  491.             'EADPlataforma:Exam'
  492.             'e'
  493.             'WITH'
  494.             'e.id = eu.exam AND e.deleted = :examDeleted'
  495.         );
  496.         
  497.         $q->leftJoin(
  498.             'EADPlataforma:LessonModule'
  499.             'lm'
  500.             'WITH'
  501.             'lm.id = e.lessonModule'
  502.         );
  503.         $q->leftJoin(
  504.             'EADPlataforma:Lesson'
  505.             'l'
  506.             'WITH'
  507.             'l.id = e.lesson'
  508.         );
  509.         $q->andWhere('eu.deleted = :deleted');
  510.         $q->andWhere('eu.user = :user');
  511.         $q->andWhere('eu.course = :course');
  512.         $q->andWhere('eu.status != :statusExamUser');
  513.         $q->andWhere('eu.inactive = :inactive');
  514.         $q->andWhere('eu.releaseAccess = :releaseAccess');
  515.         $q->andWhere('e.requirement = :requirement');
  516.         $q->andWhere('e.status = :statusExam');
  517.         
  518.         $q->andWhere('(
  519.             (
  520.                 e.type = :typeLesson 
  521.                 AND l.deleted = :lessonDeleted 
  522.                 AND l.status = :statusL 
  523.                 AND lm.status = :statusLM
  524.             )
  525.             OR 
  526.             (
  527.                 e.type = :typeModule 
  528.                 AND lm.deleted = :lessonModuleDeleted 
  529.                 AND lm.status = :statusLM
  530.             )
  531.         )');
  532.         $q->setParameter('examDeleted'ExamEnum::ITEM_NO_DELETED);
  533.         $q->setParameter('deleted'ExamUserEnum::ITEM_NO_DELETED);
  534.         $q->setParameter('lessonDeleted'LessonEnum::ITEM_NO_DELETED);
  535.         $q->setParameter('lessonModuleDeleted'LessonModuleEnum::ITEM_NO_DELETED);
  536.         $q->setParameter('statusLM'LessonModuleEnum::PUBLISHED);
  537.         $q->setParameter('statusL'LessonEnum::PUBLISHED);
  538.         $q->setParameter('user'$user->getId());
  539.         $q->setParameter('course'$course->getId());
  540.         $q->setParameter('statusExamUser'ExamUserEnum::APPROVED);
  541.         $q->setParameter('inactive'ExamUserEnum::NO);
  542.         $q->setParameter('releaseAccess'ExamUserEnum::NO);
  543.         $q->setParameter('requirement'ExamEnum::YES);
  544.         $q->setParameter('statusExam'ExamEnum::PUBLISHED);
  545.         $q->setParameter('typeModule'ExamEnum::MODULE);
  546.         $q->setParameter('typeLesson'ExamEnum::LESSON);
  547.         $q->setMaxResults(1);
  548.         return $q->getQuery()->getOneOrNullResult();
  549.     }
  550.     public function getCurrentExamOnCourseToUserByLesson(Lesson $lessonBaseUser $user)
  551.     {
  552.         $course $lessonBase->getCourse();
  553.         $lessonModule $lessonBase->getLessonModule();
  554.         $examUser $this->getCurrentStartedExamUser($course$user);
  555.         if($examUser){
  556.             return $examUser->getExam();
  557.         }
  558.         $examRepository $this->em->getRepository(Exam::class);
  559.         $exam $examRepository->getCurrentNotStartedExamUser($lessonBase$user);
  560.         if($exam){
  561.             return $exam;
  562.         }
  563.         return;
  564.     }
  565.     public function examUserIsExpired(ExamUser $examUser)
  566.     {
  567.         if($examUser->getStatus() != ExamUserEnum::IN_PROGRESS){
  568.             return true;
  569.         }
  570.         //valid exam type
  571.         $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  572.         $dateStartSeconds strtotime($examUser->getDateStart());
  573.         $exam $examUser->getExam();
  574.         $course $exam->getCourse();
  575.         $timeSeconds $dateTimeUtil->timeToSec($exam->getExamTime());
  576.         $todaySeconds strtotime(date('Y-m-d H:i:s'));
  577.         $dateExamEndSecods $dateStartSeconds $timeSeconds;
  578.         if($todaySeconds >= $dateExamEndSecods){
  579.             $examUser->setStatus(ExamUserEnum::TIMEOUT);
  580.             $examUser->setGrade(0);
  581.             $examUser->setDateEnd(date("Y-m-d H:i:s"$dateExamEndSecods));
  582.             //notify
  583.             $notificationService $this->generalService->getService('NotificationService');
  584.             $notificationService->create(
  585.                 $examUser->getUser(), 
  586.                 $course->getUser(),
  587.                 NotificationEnum::ORIGIN_EXAM_USER_TIMEOUT
  588.                 $examUser->getId()
  589.             );
  590.             $notificationService->create(
  591.                 $course->getUser(), 
  592.                 $examUser->getUser(),
  593.                 NotificationEnum::ORIGIN_EXAM_USER_TIMEOUT
  594.                 $examUser->getId()
  595.             );
  596.             $this->em->flush();
  597.             $data $examUser->toReturn();
  598.             $userLogService $this->generalService->getService('LogService');
  599.             $userLogService->logUpdate("exam_user"$examUser->getId(), $data);
  600.             return true;
  601.         }
  602.         return false;
  603.     }
  604.     public function getValidExamUserById(?int $examUserId null
  605.                                          ?bool $onlyUserInExam false
  606.                                          ?ExamUser $examUser null)
  607.     {
  608.         if(!$examUser){
  609.             $examUser $this->findOneBy([
  610.                 "id" => $examUserId,
  611.                 "deleted" => ExamUserEnum::ITEM_NO_DELETED
  612.             ]);
  613.         }
  614.         if(!$examUser) {
  615.             return;
  616.         }
  617.         if($onlyUserInExam){
  618.             if($this->getUser()->getId() != $examUser->getUser()->getId()){
  619.                 return;
  620.             }
  621.         }
  622.         if($examUser->getInactive() == ExamUserEnum::YES){
  623.             return;
  624.         }
  625.         $exam $examUser->getExam();
  626.         if($examUser->getCourse()->isDeleted()) {
  627.             return;
  628.         }
  629.         if($exam->getLessonModule()){
  630.             if($exam->getLessonModule()->isDeleted()) {
  631.                 return;
  632.             }
  633.         }
  634.         if($exam->getLesson()){
  635.             if($exam->getLesson()->isDeleted()) {
  636.                 return;
  637.             }
  638.         }
  639.         return $examUser;
  640.     }
  641.     public function updateExamUser(ExamUser $examUser, ?bool $ignoreTemplates false)
  642.     {
  643.         $grade $this->getGrade($examUser);
  644.         $exam $examUser->getExam();
  645.         $examUser->setGrade($grade);
  646.         if(empty($examUser->getDateEnd())){
  647.             $examUser->setDateEnd(date("Y-m-d H:i:s"));
  648.         }
  649.         $examUserAnswerRepository $this->em->getRepository(ExamUserAnswer::class);
  650.         $countQuestionNotEvalueted $examUserAnswerRepository->countQuestionNotEvalueted($examUser);
  651.        
  652.         $examUser->setStatus(ExamUserEnum::WAITING_CORRECTION);
  653.         if(empty($countQuestionNotEvalueted) || $ignoreTemplates){
  654.             if($grade >= $exam->getExamAverage()){
  655.                 $examUser->setReleaseAccess(ExamUserEnum::YES);
  656.                 $examUser->setStatus(ExamUserEnum::APPROVED);
  657.             }else{
  658.                 $examUser->setStatus(ExamUserEnum::DISAPPROVED);
  659.             }
  660.         }
  661.         $this->em->flush();
  662.         $this->processExamUser($examUser);
  663.     }
  664.     public function processExamUser(ExamUser $examUser)
  665.     {   
  666.         $course $examUser->getCourse();
  667.         $user $examUser->getUser();
  668.         $enrollment $this->em->getRepository(Enrollment::class)->findOneBy([
  669.             "deleted" => ExamUserEnum::ITEM_NO_DELETED,
  670.             "user" => $user->getId(),
  671.             "course" => $course->getId(),
  672.         ]);
  673.         if(!$enrollment){
  674.             return;
  675.         }
  676.        
  677.         //notify
  678.         $notificationService $this->generalService->getService('NotificationService');   
  679.         $exam $examUser->getExam();
  680.         
  681.         if($exam->getType() == ExamEnum::COURSE){
  682.             $finalAverage $this->getFinalAvarege($user->getId(), $course->getId());
  683.             $enrollment->setFinalAverage($finalAverage);
  684.             if($this->configuration->isModuleActive('course_certificate_module')){
  685.                 if($enrollment->getCertificate() == ExamEnum::YES){
  686.                     $certificateAverage $course->getCertificateAverage();
  687.                     $courseCertificateTemplate $course->getCourseCertificateTemplate();
  688.                     if(!empty($finalAverage)){
  689.                         if($finalAverage >= $certificateAverage){
  690.                             //issue certificate
  691.                             $courseCertificateRepository $this->em->getRepository(
  692.                                 CourseCertificate::class
  693.                             );
  694.                             
  695.                             $courseCertificateRepository->createCertificate(
  696.                                 $enrollment,
  697.                                 (
  698.                                     $courseCertificateTemplate 
  699.                                     $courseCertificateTemplate 
  700.                                     $enrollment->getCourseCertificateTemplate()
  701.                                 ),
  702.                                 $finalAverage
  703.                             );
  704.                         }
  705.                     }
  706.                 }
  707.             }
  708.             if($examUser->getStatus() == ExamUserEnum::APPROVED){
  709.                 $marketingService $this->generalService->getService(
  710.                     'Marketing\\MarketingService'
  711.                 );
  712.                 $marketingService->setTag(TagsMarketingEnum::TAG_FINISH_COURSE);
  713.                 $marketingService->setTextComplement($exam->getCourse()->getTitle());
  714.                 $marketingService->setUser($examUser->getUser());
  715.                 $marketingService->send();
  716.             }
  717.         }
  718.         if($examUser->getStatus() == ExamUserEnum::APPROVED){
  719.             $notificationService->create(
  720.                 $course->getUser(),
  721.                 $user,
  722.                 NotificationEnum::ORIGIN_EXAM_USER_APPROVED,
  723.                 $examUser->getId()
  724.             );
  725.             $notificationService->create(
  726.                 $user
  727.                 $course->getUser(),
  728.                 NotificationEnum::ORIGIN_EXAM_USER_APPROVED,
  729.                 $examUser->getId()
  730.             );
  731.         }else if($examUser->getStatus() == ExamUserEnum::DISAPPROVED){
  732.             $notificationService->create(
  733.                 $course->getUser(),
  734.                 $user,
  735.                 NotificationEnum::ORIGIN_EXAM_USER_DISAPPROVED,
  736.                 $examUser->getId()
  737.             );
  738.             $notificationService->create(
  739.                 $user,
  740.                 $course->getUser(),
  741.                 NotificationEnum::ORIGIN_EXAM_USER_DISAPPROVED,
  742.                 $examUser->getId()
  743.             );
  744.         }else if($examUser->getStatus() == ExamUserEnum::WAITING_CORRECTION){
  745.             $notificationService->create(
  746.                 $user,
  747.                 $course->getUser(),
  748.                 NotificationEnum::ORIGIN_EXAM_USER_WAITING_CORRECTION,
  749.                 $examUser->getId()
  750.             );
  751.         }
  752.     }
  753.     public function export($courseId null$userId null$groupId null
  754.                            $teacherId null$status null$dateStart null
  755.                            $dateEnd null)
  756.     {
  757.         $query $this->createQueryBuilder('eu');
  758.         $query->innerJoin('EADPlataforma:Exam''e''WITH''e.id = eu.exam AND e.deleted = 0');
  759.         $query->innerJoin('EADPlataforma:User''u''WITH''u.id = eu.user AND u.deleted = 0');
  760.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = eu.course AND c.deleted = 0');
  761.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule AND lm.deleted = 0');
  762.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson AND l.deleted = 0');
  763.         $query->andWhere('eu.deleted = :examUserDeleted');
  764.         $query->setParameter('examUserDeleted'ExamUserEnum::ITEM_NO_DELETED);
  765.         $query->andWhere('u.status != :userStatus');
  766.         $query->setParameter('userStatus'UserEnum::INACTIVE);
  767.         if(!is_null($dateStart) && !is_null($dateEnd)){
  768.             $query->andWhere('DATE(eu.dateStart) BETWEEN :dateStart AND :dateEnd');
  769.             $query->setParameter('dateStart'$dateStart);
  770.             $query->setParameter('dateEnd'$dateEnd);
  771.         }
  772.         
  773.         if($courseId 0){
  774.             $query->andWhere('eu.course = :course')->setParameter('course'$courseId);
  775.         }
  776.         if($userId 0){
  777.             $query->andWhere('eu.user = :user')->setParameter('user'$userId);
  778.         }
  779.         if($teacherId 0){
  780.             $query->andWhere('( 
  781.                 c.user = :teacherId 
  782.                 OR 
  783.                 ( lm.id > 0 AND lm.user = :teacherId )
  784.                 OR
  785.                 ( l.id > 0 AND l.user = :teacherId ) 
  786.             )')->setParameter('teacherId'$teacherId);
  787.         }
  788.         
  789.         if($groupId 0){
  790.             $query->innerJoin('EADPlataforma:Group''gu''WITH''u MEMBER OF gu.user');
  791.             $query->andWhere('gu.id = :groupId')->setParameter('groupId'$groupId);
  792.         }
  793.         if(!is_null($status)){
  794.             $query->andWhere('eu.status = :status')->setParameter('status'$status);
  795.         }
  796.         $query->addOrderBy('eu.course''ASC');
  797.         $query->addOrderBy('eu.user''ASC');
  798.         $query->addOrderBy('eu.id''ASC');
  799.         return $query->getQuery()->execute();
  800.     }
  801.     public function getGrade(ExamUser $examUser)
  802.     {
  803.         $courseRepository $this->em->getRepository(Course::class);
  804.         $isStudent $courseRepository->isStudent($examUser->getCourse());
  805.         $query $this->em->createQueryBuilder();
  806.         $query->from('EADPlataforma:ExamUserAnswer''eua');
  807.         $exam $examUser->getExam();
  808.         $questionNumber $exam->getQuestionNumberReal();
  809.         $query->select("ROUND((ROUND(SUM(eua.grade), 2) * 10) / {$questionNumber}, 2) AS finalGrade");
  810.         
  811.         $query->innerJoin(
  812.             'EADPlataforma:ExamUser'
  813.             'eu'
  814.             'WITH'
  815.             'eu.id = eua.examUser AND eu.deleted = 0'
  816.         );
  817.         $query->innerJoin('EADPlataforma:Exam''e''WITH''e.id = eu.exam AND e.deleted = 0');
  818.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  819.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule');
  820.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson');
  821.         $statusModule "";
  822.         $statusLesson "";
  823.         if($isStudent){
  824.             $statusModule .= "AND lm.status = :moduleStatus ";
  825.             $statusLesson .= "AND l.status = :lessonStatus ";
  826.             $query->setParameter('moduleStatus'ExamEnum::PUBLISHED);
  827.             $query->setParameter('lessonStatus'ExamEnum::PUBLISHED);
  828.         }
  829.         $query->andWhere("(
  830.             ( 
  831.                 e.type = :examModuleType 
  832.                 {$statusModule}
  833.             ) 
  834.             OR ( 
  835.                 e.type = :examLessonType 
  836.                 {$statusLesson}
  837.                 {$statusModule}
  838.             )
  839.             OR ( e.type = :examCourseType )
  840.          )");
  841.         
  842.         $query->setParameter('examModuleType'ExamEnum::MODULE);
  843.         $query->setParameter('examLessonType'ExamEnum::LESSON);
  844.         $query->setParameter('examCourseType'ExamEnum::COURSE);
  845.         
  846.         $query->andWhere('eua.deleted = 0');
  847.         $query->andWhere('eua.examUser = :examUser')->setParameter('examUser'$examUser->getId());
  848.         $result = (object)$query->getQuery()->getOneOrNullResult();
  849.         return $result->finalGrade;
  850.     }
  851.     public function getFinalAvarege($userId$courseId)
  852.     {
  853.         $query $this->em->createQueryBuilder();
  854.         $query->from('EADPlataforma:Exam''e');
  855.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  856.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule');
  857.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson');
  858.         $query->leftJoin(
  859.             'EADPlataforma:ExamUser'
  860.             'eu'
  861.             'WITH'
  862.             '
  863.                 eu.exam = e.id 
  864.                 AND eu.status IN (:statusApproved, :statusDisapproved) 
  865.                 AND eu.user = :user
  866.                 AND eu.inactive = :incative
  867.                 AND eu.deleted = 0
  868.             '
  869.         );
  870.         $query->select('
  871.             ROUND(
  872.                 SUM(
  873.                     e.examWeight * (
  874.                         CASE 
  875.                             WHEN eu.grade IS NOT NULL 
  876.                             THEN eu.grade 
  877.                             ELSE 0 
  878.                         END 
  879.                     )
  880.                 ) / SUM(e.examWeight)
  881.             , 2) AS finalAverage
  882.         ');
  883.         $query->andWhere('(
  884.             ( 
  885.                 e.type = :examModuleType 
  886.                 AND lm.status = :moduleStatus 
  887.             ) 
  888.             OR ( 
  889.                 e.type = :examLessonType 
  890.                 AND l.status = :lessonStatus 
  891.                 AND lm.status = :moduleStatus 
  892.             )
  893.             OR ( e.type = :examCourseType )
  894.          )');
  895.         $query->setParameter('examModuleType'ExamEnum::MODULE);
  896.         $query->setParameter('examLessonType'ExamEnum::LESSON);
  897.         $query->setParameter('examCourseType'ExamEnum::COURSE);
  898.         $query->setParameter('moduleStatus'ExamEnum::PUBLISHED);
  899.         $query->setParameter('lessonStatus'ExamEnum::PUBLISHED);
  900.         $query->setParameter('statusApproved'ExamUserEnum::APPROVED);
  901.         $query->setParameter('statusDisapproved'ExamUserEnum::DISAPPROVED);
  902.         $query->setParameter('incative'ExamUserEnum::NO);
  903.         $query->setParameter('user'$userId);
  904.         //$query->andWhere('e.requirement = :requirement');
  905.         //$query->setParameter('requirement', ExamEnum::YES);
  906.         $query->andWhere('e.deleted = 0');
  907.         $query->andWhere('e.status = :status')->setParameter('status'ExamEnum::PUBLISHED);
  908.         $query->andWhere('e.course = :course')->setParameter('course'$courseId);
  909.         $query->andWhere('e.examWeight > 0');
  910.         $result = (object)$query->getQuery()->getOneOrNullResult();
  911.         return $result->finalAverage;
  912.     }
  913.     public function getStudentReportCard($userId$courseId)
  914.     {
  915.         $examWeight = (float)$this->em->getRepository(Exam::class)->sumCourseWeight($courseId);
  916.         $query $this->em->createQueryBuilder();
  917.         $query->from('EADPlataforma:Exam''e');
  918.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  919.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule');
  920.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson');
  921.         $query->leftJoin(
  922.             'EADPlataforma:ExamUser'
  923.             'eu'
  924.             'WITH'
  925.             '
  926.                 eu.exam = e.id 
  927.                 AND eu.status IN (:statusApproved, :statusDisapproved) 
  928.                 AND eu.user = :user
  929.                 AND eu.inactive = :incative
  930.                 AND eu.deleted = 0
  931.             '
  932.         );
  933.         $query->select("
  934.             e.id,
  935.             c.id AS courseId,
  936.             lm.id AS moduleId,
  937.             l.id AS lessonId,
  938.             e.title AS examTitle,
  939.             e.type as examType,
  940.             lm.title AS moduleTitle,
  941.             l.title AS lessonTitle,
  942.             ROUND(eu.grade, 2) AS grade,
  943.             e.examWeight,
  944.             ROUND((eu.grade * (e.examWeight/:examWeight)), 2) AS parcial,
  945.             DATE_FORMAT(eu.dateEnd, '%Y-%m-%d %H:%i:%s') AS dateEnd
  946.         ");
  947.         //$query->andWhere('e.requirement = :requirement');
  948.         $query->andWhere('e.course = :course');
  949.         $query->andWhere('e.deleted = 0');
  950.         $query->andWhere('e.examWeight > 0');
  951.         $query->andWhere('(
  952.             ( 
  953.                 e.type = :examModuleType 
  954.                 AND lm.status = :moduleStatus 
  955.             ) 
  956.             OR ( 
  957.                 e.type = :examLessonType 
  958.                 AND l.status = :lessonStatus 
  959.                 AND lm.status = :moduleStatus 
  960.             )
  961.             OR ( e.type = :examCourseType )
  962.          )');
  963.         $query->andWhere('( e.status = :status OR eu.id > 0 )');
  964.         $query->setParameter('examWeight'$examWeight);
  965.         $query->setParameter('examModuleType'ExamEnum::MODULE);
  966.         $query->setParameter('examLessonType'ExamEnum::LESSON);
  967.         $query->setParameter('examCourseType'ExamEnum::COURSE);
  968.         $query->setParameter('moduleStatus'ExamEnum::PUBLISHED);
  969.         $query->setParameter('lessonStatus'ExamEnum::PUBLISHED);
  970.         $query->setParameter('status'ExamEnum::PUBLISHED);
  971.         //$query->setParameter('requirement', ExamUserEnum::YES);
  972.         $query->setParameter('statusApproved'ExamUserEnum::APPROVED);
  973.         $query->setParameter('statusDisapproved'ExamUserEnum::DISAPPROVED);
  974.         $query->setParameter('incative'ExamUserEnum::NO);
  975.         $query->setParameter('user'$userId);
  976.         $query->setParameter('course'$courseId);
  977.         
  978.         $query->addOrderBy('c.order''ASC');
  979.         $query->addOrderBy('lm.order''ASC');
  980.         $query->addOrderBy('l.order''ASC');
  981.         $query->addOrderBy('e.type''DESC');
  982.         
  983.         return $query->getQuery()->execute();
  984.     }
  985.     public function getStudentReportCardApi($userId$courseId)
  986.     {
  987.         $examWeight = (int)$this->em->getRepository(Exam::class)->sumCourseWeight($courseId);
  988.         
  989.         $examApproved ExamUserEnum::APPROVED;
  990.         $examDisapproved ExamUserEnum::DISAPPROVED;
  991.         $examModule ExamEnum::MODULE;
  992.         $examLesson ExamEnum::LESSON;
  993.         $examCourse ExamEnum::COURSE;
  994.         $dql "SELECT
  995.                     eu.id AS prova_id,
  996.                     pc.title AS titulo,
  997.                     pc.type AS tipo,
  998.                     lm.id AS modulo_id,
  999.                     lm.title AS modulo,
  1000.                     l.id AS aula_id,
  1001.                     l.title AS aula,
  1002.                     ROUND(eu.grade, 2) AS nota_final,
  1003.                     pc.examWeight AS pontos,
  1004.                     ROUND((eu.grade * (pc.examWeight/:examWeight)), 2) AS parcial
  1005.                 FROM EADPlataforma:Exam AS pc
  1006.                 INNER JOIN EADPlataforma:Course AS c WITH (c.id = pc.course)
  1007.                 LEFT JOIN EADPlataforma:LessonModule AS lm WITH (lm.id = pc.lessonModule)
  1008.                 LEFT JOIN EADPlataforma:Lesson AS l WITH (l.id = pc.lesson)
  1009.                 LEFT JOIN EADPlataforma:ExamUser AS eu WITH (
  1010.                                         eu.exam = pc.id 
  1011.                                         AND (
  1012.                                                 eu.status = {$examApproved}
  1013.                                                 OR eu.status = {$examDisapproved}
  1014.                                             )
  1015.                                         AND eu.user = :user 
  1016.                                         AND eu.inactive = 0
  1017.                                     )
  1018.                 WHERE pc.status = 1
  1019.                 AND pc.examWeight > 0
  1020.                 AND (
  1021.                         ( pc.type = {$examModule} AND lm.status = 1 ) 
  1022.                         OR ( pc.type = {$examLesson} AND l.status = 1 AND lm.status = 1 )
  1023.                         OR ( pc.type = {$examCourse} )
  1024.                     )
  1025.                 AND ( 
  1026.                         ( pc.status = 1 ) 
  1027.                         OR 
  1028.                         (
  1029.                             pc.id IN (
  1030.                                 SELECT 
  1031.                                     p.id 
  1032.                                 FROM EADPlataforma:ExamUser AS p
  1033.                                 WHERE p.user = :user 
  1034.                                 AND p.inactive = 0
  1035.                                 AND p.deleted = 0
  1036.                             )
  1037.                         ) 
  1038.                     )
  1039.                 AND pc.course = :course
  1040.                 AND eu.deleted = 0
  1041.                 AND pc.deleted = 0
  1042.                 ORDER BY c.order ASC, lm.order ASC, l.order ASC, pc.type DESC ";
  1043.         
  1044.         $query $this->em->createQuery($dql);
  1045.         $query->setParameter('course'$courseId);
  1046.         $query->setParameter('user'$userId);
  1047.         $query->setParameter('examWeight'$examWeight);
  1048.         return $query->execute();
  1049.     }
  1050.     public function getStudentReportCardExport($courseId null$userId null$groupId null
  1051.                                                 $teacherId null$dateStart null$dateEnd null)
  1052.     {
  1053.         $examModuleType ExamEnum::MODULE;
  1054.         $examLessonType ExamEnum::LESSON;
  1055.         $examCourseType ExamEnum::COURSE;
  1056.         $moduleStatus ExamEnum::PUBLISHED;
  1057.         $lessonStatus ExamEnum::PUBLISHED;
  1058.         $status ExamEnum::PUBLISHED;
  1059.         $statusApproved ExamUserEnum::APPROVED;
  1060.         $statusDisapproved ExamUserEnum::DISAPPROVED;
  1061.         $incative ExamEnum::NO;
  1062.         $filterCourse "";
  1063.         if($courseId 0){
  1064.             $filterCourse .= "AND e.course_id = {$courseId} ";
  1065.         }
  1066.         $filterUser "";
  1067.         if($userId 0){
  1068.             $filterUser .= "AND eu.user_id = {$userId} ";
  1069.         }
  1070.         $filterGroup "";
  1071.         if($groupId 0){
  1072.             $filterGroup .= "
  1073.                 INNER JOIN group_x_user AS gu
  1074.                 ON (
  1075.                     u.id = gu.user_id AND 
  1076.                     gu.group_id = {$groupId}
  1077.                 )";
  1078.         }
  1079.         $filterTeacher "";
  1080.         if($teacherId 0){
  1081.             $filterTeacher .= "AND c.user_id = {$teacherId}
  1082.                                 OR 
  1083.                                 ( lm.id > 0 AND lm.user_id = {$teacherId} )
  1084.                                 OR
  1085.                                 ( l.id > 0 AND l.user_id = {$teacherId} ) ";
  1086.         }
  1087.         $filterPeriod "";
  1088.         if(!is_null($dateStart) && !is_null($dateEnd)){
  1089.             $filterPeriod .= "AND (
  1090.                 DATE(eu.date_start) BETWEEN '{$dateStart}' AND '{$dateEnd}'
  1091.             ) ";
  1092.         }
  1093.         $sqlExamWeight "(
  1094.             SELECT
  1095.                 SUM(ex.exam_weight)
  1096.             FROM exam AS ex
  1097.             WHERE ex.status = 1 
  1098.             AND ex.requirement = 1
  1099.             AND ex.deleted = 0
  1100.             AND ex.course_id = e.course_id
  1101.             LIMIT 1
  1102.         )";
  1103.         $sqlDefault "SELECT 
  1104.                             u.id AS userId,
  1105.                             u.name AS userName,
  1106.                             u.email AS userEmail,
  1107.                             c.id AS courseId,
  1108.                             c.title AS courseTitle,
  1109.                             c.certificate_average AS mediaCourse,
  1110.                             e.title AS examTitle,
  1111.                             e.type as examType,
  1112.                             DATE_FORMAT(eu.date_start, '%Y-%m-%d %H:%i:%s') AS dateStart, 
  1113.                             DATE_FORMAT(eu.date_end, '%Y-%m-%d %H:%i:%s') AS dateEnd, 
  1114.                             ROUND(eu.grade, 2) AS grade,
  1115.                             eu.status AS userExamStatus,
  1116.                             eu.annotation AS userExamAnnotation,
  1117.                             ROUND((eu.grade * (e.exam_weight/{$sqlExamWeight})), 2) AS examPartial
  1118.                         FROM exam AS e
  1119.                         LEFT JOIN lesson_module AS lm 
  1120.                         ON (lm.id = e.lesson_module_id AND lm.deleted = 0)
  1121.                         LEFT JOIN lesson AS l 
  1122.                         ON (l.id = e.lesson_id AND l.deleted = 0)
  1123.                         INNER JOIN course AS c
  1124.                         ON (c.id = e.course_id AND c.deleted = 0 {$filterTeacher})
  1125.                         LEFT JOIN exam_user AS eu 
  1126.                         ON (
  1127.                                 eu.exam_id = e.id AND eu.deleted = 0 AND
  1128.                                 (
  1129.                                     eu.status = {$statusApproved}
  1130.                                     OR eu.status = {$statusDisapproved}
  1131.                                 )
  1132.                                 AND eu.inactive = {$incative} {$filterUser}
  1133.                             )
  1134.                         INNER JOIN user AS u
  1135.                         ON (u.id = eu.user_id AND u.deleted = 0)
  1136.                         {$filterGroup}
  1137.                         WHERE e.deleted = 0 AND e.exam_weight > 0 {$filterCourse}
  1138.                         AND (
  1139.                                 ( 
  1140.                                     e.type = {$examModuleType} 
  1141.                                     AND lm.status = {$moduleStatus} 
  1142.                                 ) 
  1143.                                 OR ( 
  1144.                                     e.type = {$examLessonType} 
  1145.                                     AND l.status = {$lessonStatus}
  1146.                                     AND lm.status = {$moduleStatus} 
  1147.                                 )
  1148.                                 OR ( e.type = {$examCourseType} )
  1149.                             )
  1150.                         AND ( e.status = {$status} OR eu.id > 0 ) {$filterPeriod}
  1151.                         ORDER BY c.order ASC, u.id ASC, lm.order ASC, l.order ASC, e.type DESC";
  1152.         $stmt $this->em->getConnection()->prepare($sqlDefault);
  1153.         $stmt->execute();
  1154.         $data $stmt->fetchAll(PDO::FETCH_CLASS);
  1155.         return $data;
  1156.     }
  1157.     public function getStringStatus($status){
  1158.         $string '';
  1159.         switch ($status) {
  1160.             case ExamUserEnum::IN_PROGRESS:
  1161.                 $string $this->configuration->getLanguage('in_progress''export');
  1162.             break;
  1163.             case ExamUserEnum::WAITING_CORRECTION:
  1164.                 $string $this->configuration->getLanguage('waiting_correction''export');
  1165.             break;
  1166.             case ExamUserEnum::TIMEOUT:
  1167.                 $string $this->configuration->getLanguage('time_out''export');
  1168.             break;
  1169.             case ExamUserEnum::APPROVED:
  1170.                 $string $this->configuration->getLanguage('approved''export');
  1171.             break;
  1172.             case ExamUserEnum::DISAPPROVED:
  1173.                 $string $this->configuration->getLanguage('disapproved''export');
  1174.             break;
  1175.         }
  1176.         return $string;
  1177.     }
  1178.     public function restore(ExamUser $examUser$typeItem)
  1179.     {
  1180.         $itemId $examUser->getId();
  1181.         $examUser->setUserDelete($this->getUser());
  1182.         $examUser->setDateDelete(date('Y-m-d H:i:s'));
  1183.         $examUser->restore();
  1184.         $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  1185.     }
  1186.     public function delete(ExamUser $examUser$typeItem$permission$isTrash)
  1187.     {
  1188.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1189.         if($isTrash == 1){
  1190.             $permission $userPermissionUtil->getPermission("trash""delete");
  1191.         }
  1192.         $isExamTeacher false;
  1193.         if($this->getUser()){
  1194.             $isExamTeacher $this->em->getRepository(Exam::class)->isExamTeacher(
  1195.                 $examUser->getExam(), 
  1196.                 $this->getUser()
  1197.             );
  1198.         }
  1199.         if($isExamTeacher || $userPermissionUtil->isHigh($permission)){
  1200.             $examUser->setUserDelete($this->getUser());
  1201.             $examUser->setDateDelete(date('Y-m-d H:i:s'));
  1202.             $examUser->individual();
  1203.         
  1204.             if($examUser->isOnTrash() || $examUser->isDeleted()){
  1205.                 $examUser->delete();
  1206.                 $itemId $examUser->getId();
  1207.                 $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  1208.             }
  1209.             if(!$examUser->isOnTrash() && !$examUser->isDeleted()){
  1210.                 $examUser->trash();
  1211.                 $this->em->getRepository(Trash::class)->insertTrash(
  1212.                     $examUser
  1213.                     $typeItem
  1214.                     "Aluno: {$examUser->getUser()->getName()} | Exame: {$examUser->getExam()->getTitle()}"
  1215.                 );
  1216.             }
  1217.         }
  1218.         
  1219.         $this->em->flush();
  1220.     }
  1221.     public function restoreByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1222.         $sql "UPDATE EADPlataforma:ExamUser AS eu 
  1223.                 SET eu.deleted = :deleted, eu.userDelete = :userDelete, 
  1224.                     eu.dateDelete = :dateNow
  1225.                 WHERE eu.deleted = (1 - :deleted)
  1226.                 AND eu.typeDelete = :typeDelete
  1227.                 AND eu.course = :courseId";
  1228.         $query $this->em->createQuery($sql);
  1229.         $query->setParameter('courseId'$courseId);
  1230.         $query->setParameter('deleted'$deleted);
  1231.         $query->setParameter('typeDelete'$typeDelete);
  1232.         $query->setParameter('userDelete'$userDelete);
  1233.         $query->setParameter('dateNow'$dateNow);
  1234.         $query->execute();
  1235.         
  1236.         return true;
  1237.     }
  1238.     public function deleteByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1239.         $sql "UPDATE EADPlataforma:ExamUser AS eu 
  1240.                 SET eu.deleted = :deleted, eu.typeDelete = :typeDelete,
  1241.                     eu.userDelete = :userDelete, eu.dateDelete = :dateNow
  1242.                 WHERE eu.deleted = (:deleted - 1)
  1243.                 AND eu.course = :courseId";
  1244.         $query $this->em->createQuery($sql);
  1245.         $query->setParameter('courseId'$courseId);
  1246.         $query->setParameter('deleted'$deleted);
  1247.         $query->setParameter('typeDelete'$typeDelete);
  1248.         $query->setParameter('userDelete'$userDelete);
  1249.         $query->setParameter('dateNow'$dateNow);
  1250.         $query->execute();
  1251.         
  1252.         return true;
  1253.     }
  1254.     public function restoreByUser($userId$deleted$typeDelete$userDelete$dateNow){
  1255.         $sql "UPDATE EADPlataforma:ExamUser AS eu 
  1256.                 SET eu.deleted = :deleted, eu.userDelete = :userDelete, 
  1257.                     eu.dateDelete = :dateNow
  1258.                 WHERE eu.deleted = (1 - :deleted)
  1259.                 AND eu.typeDelete = :typeDelete
  1260.                 AND eu.user = :userId";
  1261.         $query $this->em->createQuery($sql);
  1262.         $query->setParameter('userId'$userId);
  1263.         $query->setParameter('deleted'$deleted);
  1264.         $query->setParameter('typeDelete'$typeDelete);
  1265.         $query->setParameter('userDelete'$userDelete);
  1266.         $query->setParameter('dateNow'$dateNow);
  1267.         $query->execute();
  1268.         
  1269.         return true;
  1270.     }
  1271.     public function deleteByUser($userId$deleted$typeDelete$userDelete$dateNow){
  1272.         $sql "UPDATE EADPlataforma:ExamUser AS eu
  1273.                 SET eu.deleted = :deleted, eu.typeDelete = :typeDelete,
  1274.                     eu.userDelete = :userDelete, eu.dateDelete = :dateNow
  1275.                 WHERE eu.deleted = (:deleted - 1)
  1276.                 AND eu.user = :userId";
  1277.         $query $this->em->createQuery($sql);
  1278.         $query->setParameter('userId'$userId);
  1279.         $query->setParameter('deleted'$deleted);
  1280.         $query->setParameter('typeDelete'$typeDelete);
  1281.         $query->setParameter('userDelete'$userDelete);
  1282.         $query->setParameter('dateNow'$dateNow);
  1283.         $query->execute();
  1284.         
  1285.         return true;
  1286.     }
  1287.     public function restoreByLessonModule($lessonModuleId$deleted$typeDelete$userDelete$dateNow){
  1288.         $sql "UPDATE EADPlataforma:ExamUser AS eu
  1289.                 SET eu.deleted = :deleted, eu.userDelete = :userDelete, 
  1290.                     eu.dateDelete = :dateNow
  1291.                 WHERE IDENTITY(eu.exam) IN (SELECT e.id 
  1292.                                             FROM EADPlataforma:Exam AS e 
  1293.                                             WHERE e.lessonModule = :lessonModuleId )
  1294.                 AND eu.deleted = (1 - :deleted)
  1295.                 AND eu.typeDelete = :typeDelete";
  1296.         $query $this->em->createQuery($sql);
  1297.         $query->setParameter('lessonModuleId'$lessonModuleId);
  1298.         $query->setParameter('deleted'$deleted);
  1299.         $query->setParameter('typeDelete'$typeDelete);
  1300.         $query->setParameter('userDelete'$userDelete);
  1301.         $query->setParameter('dateNow'$dateNow);
  1302.         $query->execute();
  1303.         
  1304.         return true;
  1305.     }
  1306.     public function deleteByLessonModule($lessonModuleId$deleted$typeDelete$userDelete$dateNow){
  1307.         $sql "UPDATE EADPlataforma:ExamUser AS eu
  1308.                 SET eu.deleted = :deleted, eu.typeDelete = :typeDelete,
  1309.                     eu.userDelete = :userDelete, eu.dateDelete = :dateNow
  1310.                 WHERE IDENTITY(eu.exam) IN (SELECT e.id 
  1311.                                             FROM EADPlataforma:Exam AS e 
  1312.                                             WHERE e.lessonModule = :lessonModuleId )
  1313.                 AND eu.deleted = (:deleted - 1)";
  1314.         $query $this->em->createQuery($sql);
  1315.         $query->setParameter('lessonModuleId'$lessonModuleId);
  1316.         $query->setParameter('deleted'$deleted);
  1317.         $query->setParameter('typeDelete'$typeDelete);
  1318.         $query->setParameter('userDelete'$userDelete);
  1319.         $query->setParameter('dateNow'$dateNow);
  1320.         $query->execute();
  1321.         
  1322.         return true;
  1323.     }
  1324.     public function restoreByExamUser($examUserId$deleted$typeDelete$userDelete$dateNow){
  1325.         $sql "UPDATE EADPlataforma:ExamUser AS eu 
  1326.                 SET eu.deleted = :deleted, eu.userDelete = :userDelete, 
  1327.                     eu.dateDelete = :dateNow
  1328.                 WHERE eu.deleted = (1 + :deleted)
  1329.                 AND eu.typeDelete = :typeDelete
  1330.                 AND eu.id = :examUserId";
  1331.         $query $this->em->createQuery($sql);
  1332.         $query->setParameter('examUserId'$examUserId);
  1333.         $query->setParameter('deleted'$deleted);
  1334.         $query->setParameter('typeDelete'$typeDelete);
  1335.         $query->setParameter('userDelete'$userDelete);
  1336.         $query->setParameter('dateNow'$dateNow);
  1337.         $query->execute();
  1338.         
  1339.         return true;
  1340.     }
  1341.     public function deleteByExamUser($examUserId$deleted$typeDelete$userDelete$dateNow){
  1342.         $sql "
  1343.             UPDATE EADPlataforma:ExamUser AS eu 
  1344.             SET 
  1345.                 eu.deleted = :deleted, 
  1346.                 eu.typeDelete = :typeDelete,
  1347.                 eu.userDelete = :userDelete, 
  1348.                 eu.dateDelete = :dateNow
  1349.             WHERE eu.deleted = (:deleted - 1)
  1350.             AND eu.id = :examUserId
  1351.         ";
  1352.         $query $this->em->createQuery($sql);
  1353.         $query->setParameter('examUserId'$examUserId);
  1354.         $query->setParameter('deleted'$deleted);
  1355.         $query->setParameter('typeDelete'$typeDelete);
  1356.         $query->setParameter('userDelete'$userDelete);
  1357.         $query->setParameter('dateNow'$dateNow);
  1358.         
  1359.         $query->execute();
  1360.         
  1361.         return true;
  1362.     }
  1363.     public function restoreByLesson($lessonId$deleted$typeDelete$userDelete$dateNow){
  1364.         $sql "UPDATE EADPlataforma:ExamUser AS eu
  1365.                 SET eu.deleted = :deleted, eu.userDelete = :userDelete, 
  1366.                     eu.dateDelete = :dateNow
  1367.                 WHERE IDENTITY(eu.exam) IN (SELECT e.id 
  1368.                                             FROM EADPlataforma:Exam AS e 
  1369.                                             WHERE e.lesson = :lessonId )
  1370.                 AND eu.deleted = (1 - :deleted)
  1371.                 AND eu.typeDelete = :typeDelete";
  1372.         $query $this->em->createQuery($sql);
  1373.         $query->setParameter('lessonId'$lessonId);
  1374.         $query->setParameter('deleted'$deleted);
  1375.         $query->setParameter('typeDelete'$typeDelete);
  1376.         $query->setParameter('userDelete'$userDelete);
  1377.         $query->setParameter('dateNow'$dateNow);
  1378.         $query->execute();
  1379.         
  1380.         return true;
  1381.     }
  1382.     public function deleteByLesson($lessonId$deleted$typeDelete$userDelete$dateNow){
  1383.         $sql "UPDATE EADPlataforma:ExamUser AS eu
  1384.                 SET eu.deleted = :deleted, eu.typeDelete = :typeDelete,
  1385.                     eu.userDelete = :userDelete, eu.dateDelete = :dateNow
  1386.                 WHERE IDENTITY(eu.exam) IN (SELECT e.id 
  1387.                                             FROM EADPlataforma:Exam AS e 
  1388.                                             WHERE e.lesson = :lessonId )
  1389.                 AND eu.deleted = (:deleted - 1)";
  1390.         $query $this->em->createQuery($sql);
  1391.         $query->setParameter('lessonId'$lessonId);
  1392.         $query->setParameter('deleted'$deleted);
  1393.         $query->setParameter('typeDelete'$typeDelete);
  1394.         $query->setParameter('userDelete'$userDelete);
  1395.         $query->setParameter('dateNow'$dateNow);
  1396.         $query->execute();
  1397.         
  1398.         return true;
  1399.     }
  1400.     public function deleteTrashCron()
  1401.     {
  1402.         $sql "UPDATE EADPlataforma:ExamUser AS eu SET eu.deleted = 2 
  1403.                 WHERE eu.dateDelete <= :date AND eu.deleted = 1 ";
  1404.         $query $this->em->createQuery($sql);
  1405.         $query->setParameter('date'date('Y-m-d H:i:s'strtotime('-90 days')));
  1406.         $query->execute();
  1407.     }
  1408.     public function findExamUserExpired()
  1409.     {
  1410.         $query $this->createQueryBuilder('eu');
  1411.         $query->andWhere('eu.status = :status');
  1412.         $query->andWhere('DATE(:currentDate) > DATE(eu.dateStart)');
  1413.         $query->andWhere('eu.inactive = :inactive');
  1414.         $query->setParameter('status'ExamUserEnum::IN_PROGRESS);
  1415.         $query->setParameter('currentDate'date('Y-m-d H:i:s'));
  1416.         $query->setParameter('inactive'ExamUserEnum::NO);
  1417.         
  1418.         return $query->getQuery()->getResult();
  1419.     }
  1420.     public function expiredExams()
  1421.     {
  1422.         $examsUsers $this->findExamUserExpired();
  1423.         foreach ($examsUsers as $examUser) {
  1424.             $this->examUserIsExpired($examUser);
  1425.         }
  1426.     }
  1427. }