src/Repository/ExamRepository.php line 165

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\Course;
  7. use EADPlataforma\Entity\Product;
  8. use EADPlataforma\Entity\LessonModule;
  9. use EADPlataforma\Entity\Lesson;
  10. use EADPlataforma\Entity\LessonLog;
  11. use EADPlataforma\Entity\LessonLogOrigin;
  12. use EADPlataforma\Entity\Enrollment;
  13. use EADPlataforma\Entity\Question;
  14. use EADPlataforma\Entity\QuestionOption;
  15. use EADPlataforma\Entity\CourseCertificate;
  16. use EADPlataforma\Entity\User;
  17. use EADPlataforma\Entity\Trash;
  18. use EADPlataforma\Enum\ExamEnum;
  19. use EADPlataforma\Enum\ExamUserEnum;
  20. use EADPlataforma\Enum\LessonEnum;
  21. use EADPlataforma\Enum\LessonModuleEnum;
  22. use EADPlataforma\Enum\QuestionEnum;
  23. use EADPlataforma\Enum\TaskQueueEnum;
  24. use EADPlataforma\Enum\UserEnum;
  25. use EADPlataforma\Enum\EnrollmentEnum;
  26. use EADPlataforma\Enum\CourseEnum;
  27. /**
  28.  * @method Exam|null find($id, $lockMode = null, $lockVersion = null)
  29.  * @method Exam|null findOneBy(array $criteria, array $orderBy = null)
  30.  * @method Exam[]    findAll()
  31.  * @method Exam[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  32.  */
  33. class ExamRepository extends AbstractRepository
  34. {
  35.     public function getEntityClass(){
  36.         return Exam::class;
  37.     }
  38.     public function getConnectionName(){
  39.         return "school";
  40.     }
  41.     public function findItems()
  42.     {
  43.         return $this->createQueryBuilder('e')->getQuery()->getResult();
  44.     }
  45.     public function getExamTypeText($type)
  46.     {
  47.         $examTypeText '';
  48.         switch ($type) {
  49.             case ExamEnum::LESSON:
  50.                 $examTypeText $this->configuration->getLanguage('lesson''export');
  51.                 break;
  52.             case ExamEnum::MODULE:
  53.                 $examTypeText $this->configuration->getLanguage('module''export');
  54.                 break;
  55.             case ExamEnum::COURSE:
  56.                 $examTypeText $this->configuration->getLanguage('course''export');
  57.                 break;
  58.         }
  59.         return $examTypeText;
  60.     }
  61.     public function notifyStudentsExam(Exam $exam)
  62.     {   
  63.         $today date('Y-m-d');
  64.         $dateLastNotify $exam->getDateLastNotify('Y-m-d');
  65.         if($today != $dateLastNotify){
  66.             $course $exam->getCourse();
  67.             $lessonModule $exam->getLessonModule();
  68.             $lesson $exam->getLesson();
  69.             if(
  70.                 $course->getStatus() == CourseEnum::PUBLISHED && 
  71.                 $exam->getStatus() == ExamEnum::PUBLISHED
  72.             ){
  73.                 $taskQueueService $this->generalService->getService('TaskQueueService');
  74.                 $enrollmentRepository $this->em->getRepository(Enrollment::class);
  75.                 
  76.                 $users $this->getUsersNotStartExam($exam);
  77.                 foreach ($users as $key => $user) {
  78.                     $taskQueueService->insert(TaskQueueEnum::EMAIL_NEW_EXAM$user$exam->getId());
  79.                 }
  80.                 $exam->setDateLastNotify(date('Y-m-d H:i:s'));
  81.                 $this->em->flush();
  82.             }
  83.         }
  84.     }
  85.     public function getUsersNotStartExam(Exam $exam)
  86.     {
  87.         $userRepository $this->em->getRepository(User::class);
  88.         $query $userRepository->createQueryBuilder('u');
  89.         $query->innerJoin('EADPlataforma:Enrollment''e''WITH''e.user = u.id');
  90.         $query->andWhere('u.deleted = :deleted');
  91.         $query->andWhere('e.course = :course');
  92.         $query->andWhere('e.status = :enrollmentStatus');
  93.         $query->andWhere('e.deleted = :enrollmentDeleted');
  94.         $query->andWhere('e.datePeriod >= :now');
  95.         $subQuery $userRepository->createQueryBuilder('examUser');
  96.         $subQuery->select('IDENTITY(eu.user)');
  97.         $subQuery->from('EADPlataforma:ExamUser''eu');
  98.         $subQuery->andWhere('eu.exam = :exam');
  99.         $subQuery->andWhere('eu.course = :course');
  100.         $subQuery $subQuery->getDQL();
  101.         $query->andWhere($query->expr()->notIn('u.id'$subQuery));
  102.         $subQuery $userRepository->createQueryBuilder('certificate');
  103.         $subQuery->select('IDENTITY(cc.user)');
  104.         $subQuery->from('EADPlataforma:CourseCertificate''cc');
  105.         $subQuery->andWhere('cc.course = :course');
  106.         $subQuery $subQuery->getDQL();
  107.         $query->andWhere($query->expr()->notIn('u.id'$subQuery));
  108.         $query->setParameter('deleted'UserEnum::ITEM_NO_DELETED);
  109.         $query->setParameter('course'$exam->getCourse()->getId());
  110.         $query->setParameter('enrollmentStatus'EnrollmentEnum::STATUS_ACTIVE);
  111.         $query->setParameter('enrollmentDeleted'EnrollmentEnum::ITEM_NO_DELETED);
  112.         $query->setParameter('now'date('Y-m-d H:i:s'));
  113.         $query->setParameter('exam'$exam->getId());
  114.         return $query->getQuery()->execute();
  115.     }
  116.     
  117.     public function isExamTeacher(Exam $examUser $user)
  118.     {
  119.         $lesson $exam->getLesson();
  120.         $lessonModule $exam->getLessonModule();
  121.         $course $exam->getCourse();
  122.         $isTeacher false;
  123.         $uId $user->getId();
  124.         if($course){
  125.             $isTeacher = ($course->getUser()->getId() == $uId);
  126.             if($lesson && !$isTeacher){
  127.                 $lessonTeahcerId $lesson->getUser()->getId();
  128.                 $lessonModuleTeahcerId $lesson->getLessonModule()->getUser()->getId();
  129.                 $isTeacher = ($lessonTeahcerId == $uId || $lessonModuleTeahcerId == $uId);
  130.             }else if($lessonModule && !$isTeacher){
  131.                 $lessonModuleTeahcerId $lessonModule->getUser()->getId();
  132.                 $isTeacher = ($lessonModuleTeahcerId == $uId);
  133.             }
  134.         }
  135.         return $isTeacher;
  136.     }
  137.     public function getExamToIndexNew(
  138.         int $type
  139.         Course $course,
  140.         ?LessonModule $lessonModule null
  141.         ?Lesson $lesson null
  142.     )
  143.     {
  144.         $filter = [
  145.             "course" => $course->getId(),
  146.             "type" => $type,
  147.             "status" => ExamEnum::PUBLISHED,
  148.             "deleted" => ExamEnum::ITEM_NO_DELETED
  149.         ];
  150.         if(!empty($lessonModule)){
  151.             $filter["lessonModule"] = $lessonModule->getId();
  152.         }
  153.         if(!empty($lesson)){
  154.             $filter["lesson"] = $lesson->getId();
  155.         }
  156.         $e $this->findOneBy($filter);
  157.         $examUser null;
  158.         if($e && !empty($e->getQuestionNumber())){
  159.             $examUserData null;
  160.             if($this->getUser()){
  161.                 $examUserRepository $this->em->getRepository(ExamUser::class);
  162.                 $examUser $examUserRepository->findOneBy([
  163.                     "user" => $this->getUser()->getId(),
  164.                     "exam" => $e->getId(),
  165.                     "inactive" => ExamUserEnum::NO,
  166.                     "deleted" => ExamUserEnum::ITEM_NO_DELETED
  167.                 ]);
  168.             }
  169.             $infoAccess $this->checkExamIsAccessible($e$examUser);
  170.             $data = [
  171.                 "id" => $e->getId(),
  172.                 "title" => $e->getTitle(),
  173.                 "type" => $e->getType(),
  174.                 "status" => (
  175.                     $examUser 
  176.                     $examUser->getStatus() : 
  177.                     ExamUserEnum::NOT_STARTED
  178.                 ),
  179.                 "examWeight" => $e->getExamWeight(),
  180.                 "examTime" => $e->getExamTime(),
  181.                 "questionNumber" => $e->getQuestionNumber(),
  182.                 "isAccessible" => $infoAccess->isAccessible,
  183.                 "acessMessage" => $infoAccess->message,
  184.                 "dateReleaseAccess" => $infoAccess->dateRelease,
  185.                 "dateCloseAccess" => $infoAccess->dateClose,
  186.             ];
  187.             return $data;
  188.         }
  189.         return;
  190.     }
  191.     public function getExamToIndex(int $typeCourse $course
  192.                                    ?LessonModule $lessonModule null
  193.                                    ?Lesson $lesson null)
  194.     {
  195.         $filter = [
  196.             "course" => $course->getId(),
  197.             "type" => $type,
  198.             "status" => ExamEnum::PUBLISHED,
  199.             "deleted" => ExamEnum::ITEM_NO_DELETED
  200.         ];
  201.         if(!empty($lessonModule)){
  202.             $filter["lessonModule"] = $lessonModule->getId();
  203.         }
  204.         if(!empty($lesson)){
  205.             $filter["lesson"] = $lesson->getId();
  206.         }
  207.         $e $this->findOneBy($filter);
  208.         $examUser null;
  209.         if($e && !empty($e->getQuestionNumber())){
  210.             $examUserData null;
  211.             if($this->getUser()){
  212.                 $examUserRepository $this->em->getRepository(ExamUser::class);
  213.                 $examUser $examUserRepository->findOneBy([
  214.                     "user" => $this->getUser()->getId(),
  215.                     "exam" => $e->getId(),
  216.                     "inactive" => ExamUserEnum::NO,
  217.                     "deleted" => ExamUserEnum::ITEM_NO_DELETED
  218.                 ]);
  219.                 if($examUser){
  220.                     $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  221.                     $todaySeconds strtotime(date('Y-m-d H:i:s'));
  222.                     $dateStartSeconds strtotime($examUser->getDateStart());
  223.                     $timeSeconds $dateTimeUtil->timeToSec($e->getExamTime());
  224.                     $dateExamEndSecods $dateStartSeconds $timeSeconds;
  225.                     $timeRestToEndSeconds $timeSeconds;
  226.                     if($examUser->getStatus() == ExamUserEnum::IN_PROGRESS){
  227.                         $timeRestToEndSeconds $dateExamEndSecods $todaySeconds;
  228.                         if($timeRestToEndSeconds 0){
  229.                             $timeRestToEndSeconds 0;
  230.                         }
  231.                     }
  232.                     $progress 100;
  233.                     $qNumber $e->getQuestionNumber();
  234.                     
  235.                     if(
  236.                         $examUser->getStatus() == ExamUserEnum::IN_PROGRESS || 
  237.                         $examUser->getStatus() == ExamUserEnum::TIMEOUT
  238.                     ){
  239.                         $euAnswerRepository $this->em->getRepository(ExamUserAnswer::class);
  240.                         $qNumber $euAnswerRepository->countAsnweredByExamUser(
  241.                             $examUser
  242.                         );
  243.                         $progress round($qNumber 100 $e->getQuestionNumber());
  244.                     }
  245.                     $examUserData = (object)[
  246.                         "id" => $examUser->getId(),
  247.                         "status" => $examUser->getStatus(),
  248.                         "grade" => $examUser->getGrade(),
  249.                         "timeRestToEnd" => $dateTimeUtil->secToTime($timeRestToEndSeconds),
  250.                         "timeRestToEndSeconds" => $timeRestToEndSeconds,
  251.                         "dateStart" => $examUser->getDateStart('Y-m-d H:i:s'),
  252.                         "questionAnswerNumber" => $qNumber,
  253.                         "progress" => $progress
  254.                     ];
  255.                 }
  256.             }
  257.             $infoAccess $this->checkExamIsAccessible($e$examUser);
  258.             $data = [
  259.                 "id" => $e->getId(),
  260.                 "courseId" => $e->getCourse()->getId(),
  261.                 "lessonModuleId" => (
  262.                     $e->getLessonModule() ? $e->getLessonModule()->getId() : null
  263.                 ),
  264.                 "lessonId" => ($e->getLesson() ? $e->getLesson()->getId() : null),
  265.                 "title" => $e->getTitle(),
  266.                 "type" => $e->getType(),
  267.                 "examWeight" => $e->getExamWeight(),
  268.                 "examTime" => $e->getExamTime(),
  269.                 "questionNumber" => $e->getQuestionNumber(),
  270.                 "isAccessible" => $infoAccess->isAccessible,
  271.                 "dateReleaseAccess" => $infoAccess->dateRelease,
  272.                 "dateCloseAccess" => $infoAccess->dateClose,
  273.                 "examUser" => $examUserData,
  274.             ];
  275.             return $data;
  276.         }
  277.         return;
  278.     }
  279.     public function getExamByQuestions(Question $question)
  280.     {
  281.         $questionId $question->getId();
  282.         $query $this->createQueryBuilder('e');
  283.         $query->innerJoin(
  284.             'EADPlataforma:Question'
  285.             'q'
  286.             'WITH'
  287.             'e MEMBER OF q.exam AND q.id = :questionId'
  288.         );
  289.         $query->setParameter('questionId'$questionId);
  290.         $query->andWhere('e.deleted = :deleted');
  291.         $query->setParameter('deleted'ExamEnum::ITEM_NO_DELETED);
  292.         return $query->getQuery()->execute();
  293.     }
  294.     public function counterExamAndQuiz(Question $question){
  295.         $quantityQuiz 0;
  296.         $examIds $question->toReturn()["exam"];
  297.         $quantityExam count($question->toReturn()["exam"]);
  298.         $exams $this->findBy([
  299.             "id" => $examIds
  300.         ]);
  301.         
  302.         foreach ($exams as $exam) {
  303.             if($exam->getType() == ExamEnum::QUIZ) {
  304.                 $quantityQuiz++;
  305.                 $quantityExam--;
  306.             }
  307.         }
  308.         $counters = [
  309.             "quantityQuiz" => $quantityQuiz,
  310.             "quantityExam" => $quantityExam
  311.         ];
  312.         return $counters;
  313.     }
  314.     public function checkExamIsAccessible(Exam $exam, ?ExamUser $examUser null){
  315.         $info = (object)[
  316.             "isAccessible" => false,
  317.             "dateRelease" => null,
  318.             "dateClose" => null,
  319.             "message" => null,
  320.         ];
  321.         $typeRelease $exam->getTypeRelease();
  322.         if($typeRelease == ExamEnum::FIXED_DATE){
  323.             $dateStart $exam->getDateStart();
  324.             $info->dateRelease $dateStart;
  325.         }
  326.         if(!$this->getUser()){
  327.             $info->message $this->configuration->getLanguage('error_auth''lesson_view_error');
  328.             return $info;
  329.         }
  330.         $lessonRepository $this->em->getRepository(Lesson::class);
  331.         $logRepository $this->em->getRepository(LessonLogOrigin::class);
  332.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  333.         $courseRepository $this->em->getRepository(Course::class);
  334.         $examUserRepository $this->em->getRepository(ExamUser::class);
  335.         if(empty($examUser)){
  336.             $examUser $examUserRepository->findOneBy([
  337.                 "user" => $this->getUser()->getId(),
  338.                 "exam" => $exam->getId(),
  339.                 "inactive" => ExamUserEnum::NO,
  340.                 "deleted" => ExamUserEnum::ITEM_NO_DELETED
  341.             ]);
  342.         }
  343.         if(!empty($examUser)){
  344.             $info->isAccessible true;
  345.             return $info;
  346.         }
  347.         $today date('Y-m-d');
  348.         $todayDateTime date('Y-m-d H:i:s');
  349.         $course $exam->getCourse();
  350.         $isStudent $courseRepository->isStudent($course);
  351.         if(!$isStudent){
  352.             $info->isAccessible true;
  353.             return $info;
  354.         }
  355.         $lesson null;
  356.         $hasLessonControl $this->configuration->checkModuleIsAbleOnPlan(
  357.             'lessonControlFunction'
  358.         );
  359.         $lessonNumber $lessonRepository->getLessonPublicNumber($course);
  360.         $lessonNumberModule $lessonNumber;
  361.         if(empty($lessonNumber)){
  362.             $info->isAccessible true;
  363.             return $info;
  364.         }
  365.         if(!$hasLessonControl && $exam->getType() != ExamEnum::QUIZ){
  366.             $lessonsNumberComplete $logRepository->count([
  367.                 "complete" => LessonEnum::YES,
  368.                 "course" => $course->getId(),
  369.                 "user" => $this->getUser()->getId()
  370.             ]);
  371.             if($lessonsNumberComplete >= $lessonNumber){
  372.                 $info->isAccessible true;
  373.                 return $info;
  374.             }
  375.         }else if($exam->getType() == ExamEnum::COURSE){
  376.             $lesson $lessonRepository->getLastLesson($course);
  377.             $lessonNumberRequired $lessonRepository->getLessonPublicNumber(
  378.                 $course
  379.                 null
  380.                 true
  381.             );
  382.             $lessonsNumberComplete $logRepository->countLessonLogOriginCompleteRequired(
  383.                 $this->getUser(), 
  384.                 $course
  385.             );
  386.             if($lessonsNumberComplete $lessonNumberRequired){
  387.                 $info->message $this->configuration->getLanguage(
  388.                     'error_required_incomplete'
  389.                     'lesson_view_error'
  390.                 );
  391.                 return $info;
  392.             }
  393.         }else if($exam->getType() == ExamEnum::MODULE){
  394.             $lesson $lessonRepository->getLastLesson($course$exam->getLessonModule());
  395.             $lessonNumberRequired $lessonRepository->getLessonPublicNumber(
  396.                 $course
  397.                 $exam->getLessonModule(), 
  398.                 true
  399.             );
  400.             $lessonNumberModule $lessonRepository->getLessonPublicNumber(
  401.                 $course
  402.                 $exam->getLessonModule(),
  403.                 false,
  404.                 true
  405.             );
  406.             $lessonsNumberComplete $logRepository->countLessonLogOriginCompleteRequired(
  407.                 $this->getUser(), 
  408.                 $course,
  409.                 $exam->getLessonModule()
  410.             );
  411.             if($lessonsNumberComplete $lessonNumberRequired){
  412.                 $info->message $this->configuration->getLanguage(
  413.                     'error_required_incomplete'
  414.                     'lesson_view_error'
  415.                 );
  416.                 return $info;
  417.             }
  418.         }else if($exam->getType() == ExamEnum::LESSON){
  419.             $lesson $exam->getLesson();
  420.         }else if($exam->getType() == ExamEnum::QUIZ){
  421.             $lesson $exam->getLesson();
  422.         }
  423.         if($lesson && $hasLessonControl){
  424.             $currentLesson $lessonRepository->getCurrentLesson($lesson$this->getUser());
  425.             
  426.             if(empty($currentLesson)){
  427.                 if(empty($examUser)){
  428.                     $currentExam $examUserRepository->getCurrentExamOnCourseToUserByLesson(
  429.                         $lesson
  430.                         $this->getUser()
  431.                     );
  432.                     
  433.                     if($currentExam && $currentExam->getId() != $exam->getId()){
  434.                         if($exam->getType() != ExamEnum::QUIZ){
  435.                             $info->message $this->configuration->getLanguage(
  436.                                 'error_required_incomplete'
  437.                                 'lesson_view_error'
  438.                             );
  439.                             return $info;
  440.                         }
  441.                     }
  442.                 }
  443.                 
  444.                 $logId "{$course->getId()}#{$this->getUser()->getId()}#{$lesson->getId()}";
  445.                 $log $lessonLogRepository->find($logId);
  446.                 if($lesson->getControlRequirement() == LessonEnum::YES){
  447.                     if(!$log || ($log && empty($log->getDateConclusion()))){
  448.                         $info->message $this->configuration->getLanguage(
  449.                             'error_required_incomplete'
  450.                             'lesson_view_error'
  451.                         );
  452.                         return $info;
  453.                     }
  454.                 }
  455.                 
  456.                 $dateReference = ($log $log->getDateConclusion() : null);
  457.                 if($typeRelease == ExamEnum::FIXED_DATE){
  458.                     $dateStart $exam->getDateStart();
  459.                     if($dateStart $todayDateTime){
  460.                         $info->dateRelease $dateStart;
  461.                         $info->message "{$this->configuration->getLanguage(
  462.                             'error_date_release'
  463.                             'lesson_view_error'
  464.                         )} {$exam->getDateStart('d/m/Y H:i:s')}";
  465.                         return $info;
  466.                     }
  467.                    
  468.                 }else if($typeRelease == ExamEnum::FLEXIBLE_PERIOD){
  469.                     if(empty($dateReference)){
  470.                         $info->message $this->configuration->getLanguage(
  471.                             'error_required_incomplete'
  472.                             'lesson_view_error'
  473.                         );
  474.                         return $info;
  475.                     }
  476.                     $textDate "{$dateReference} + {$exam->getPeriodStart()} days";
  477.                     $dateStart date('Y-m-d'strtotime($textDate));
  478.                     if($dateStart $today){
  479.                         $info->dateRelease $dateStart;
  480.                         $dateStartText date('d/m/Y H:i:s'strtotime($textDate));
  481.                         $info->message "{$this->configuration->getLanguage(
  482.                             'error_date_release'
  483.                             'lesson_view_error'
  484.                         )} {$dateStartText}";
  485.                         return $info;
  486.                     }
  487.                 }
  488.                 $periodEnd $exam->getPeriodEnd();
  489.                 if(!empty($periodEnd)){
  490.                     if($typeRelease == ExamEnum::FIXED_DATE){
  491.                         $dateReference $exam->getDateStart();
  492.                     }
  493.                     
  494.                     if(empty($dateReference) && $typeRelease != ExamEnum::RELEASED){
  495.                         $info->message $this->configuration->getLanguage(
  496.                             'error_required_incomplete'
  497.                             'lesson_view_error'
  498.                         );
  499.                         return $info;
  500.                     }
  501.                     $textDate "{$dateReference} + {$periodEnd} days";
  502.                     $dateEnd date('Y-m-d'strtotime($textDate));
  503.                     if($dateEnd $today){
  504.                         if(empty($examUser)){
  505.                             $dateEndText date('d/m/Y H:i:s'strtotime($textDate));
  506.                             $info->dateClose $dateEnd;
  507.                             $info->message "{$this->configuration->getLanguage(
  508.                                 'error_date_end'
  509.                                 'lesson_view_error'
  510.                             )} {$dateEndText}";
  511.                             return $info;
  512.                         }
  513.                     }
  514.                 }
  515.                 $info->isAccessible true;
  516.                 return $info;
  517.             }
  518.         }else if(empty($lessonNumber) || empty($lessonNumberModule) || !$hasLessonControl){
  519.             if($typeRelease == ExamEnum::FIXED_DATE){
  520.                 $dateStart $exam->getDateStart();
  521.                 if($dateStart $todayDateTime){
  522.                     $info->dateRelease $dateStart;
  523.                     $info->message "{$this->configuration->getLanguage(
  524.                         'error_date_release'
  525.                         'lesson_view_error'
  526.                     )} {$exam->getDateStart('d/m/Y H:i:s')}";
  527.                     return $info;
  528.                 }
  529.                 $info->isAccessible true;
  530.                 return $info;
  531.             }
  532.             //else if($typeRelease == ExamEnum::FLEXIBLE_PERIOD){
  533.             //}
  534.             $periodEnd $exam->getPeriodEnd();
  535.             if(!empty($periodEnd)){
  536.                 $dateReference null;
  537.                 if($typeRelease == ExamEnum::FIXED_DATE){
  538.                     $dateReference $exam->getDateStart();
  539.                 }
  540.                 
  541.                 if(empty($dateReference) && $typeRelease != ExamEnum::RELEASED){
  542.                     $info->message $this->configuration->getLanguage(
  543.                         'error_required_incomplete'
  544.                         'lesson_view_error'
  545.                     );
  546.                     return $info;
  547.                 }
  548.                 /*$textDate = "{$dateReference} + {$periodEnd} days";
  549.                 $dateEnd = date('Y-m-d', strtotime($textDate));
  550.                 if($dateEnd < $today){
  551.                     if(empty($examUser)){
  552.                         $info->dateClose = $dateEnd;
  553.                         return $info;
  554.                     }
  555.                 }*/
  556.             }
  557.             $info->isAccessible true;
  558.             
  559.             return $info;
  560.         }
  561.         return $info;
  562.     }
  563.     public function getExamNumberByProduct(Product $product)
  564.     {
  565.         $query $this->createQueryBuilder('e');
  566.         $query->select("COUNT(e.id) AS total");
  567.         $query->innerJoin('EADPlataforma:Product''p''WITH''e.course MEMBER OF p.course');
  568.         $query->andWhere('e.deleted = :deleted');
  569.         $query->andWhere('e.status = :examStatus');
  570.         $query->andWhere('p.id = :productId');
  571.         $query->setParameter('deleted'ExamEnum::ITEM_NO_DELETED);
  572.         $query->setParameter('examStatus'ExamEnum::PUBLISHED);
  573.         $query->setParameter('productId'$product->getId());
  574.               
  575.         $result = (object)$query->getQuery()->getOneOrNullResult();
  576.         return $result->total;
  577.     }
  578.     public function getNextExamIdByLesson(Lesson $lessonbool $addTitle false)
  579.     {
  580.         $lessonRepository $this->em->getRepository(Lesson::class);
  581.         $course $lesson->getCourse();
  582.         $lessonModule $lesson->getLessonModule();
  583.         $addExams false;
  584.         $addExamsLimited false;
  585.         if(
  586.             $this->configuration->isModuleActive("exam_module") &&
  587.             $this->configuration->checkModuleIsAbleOnPlan("examFunction")
  588.             
  589.         ){
  590.             $addExams true;
  591.             $addExamsLimited $this->configuration->checkModuleIsAbleOnPlan(
  592.                 "unlimitedExamFunction"
  593.             );
  594.         }
  595.         $exam $this->findOneBy([
  596.             "deleted" => ExamEnum::ITEM_NO_DELETED,
  597.             "course" => $course->getId(),
  598.             "lessonModule" => $lessonModule->getId(),
  599.             "lesson" => $lesson->getId(),
  600.             "status" => ExamEnum::PUBLISHED,
  601.             "type" => ExamEnum::QUIZ
  602.         ]);
  603.         if(!$exam){
  604.             if(!$addExams || !$addExamsLimited){
  605.                 return;
  606.             }
  607.             $exam $this->findOneBy([
  608.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  609.                 "course" => $course->getId(),
  610.                 "lessonModule" => $lessonModule->getId(),
  611.                 "lesson" => $lesson->getId(),
  612.                 "status" => ExamEnum::PUBLISHED,
  613.                 "type" => ExamEnum::LESSON
  614.             ]);
  615.         }
  616.         if(!$exam && $lessonRepository->isLastModuleLesson($lesson)){
  617.             if(!$addExams || !$addExamsLimited){
  618.                 return;
  619.             }
  620.             $exam $this->findOneBy([
  621.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  622.                 "course" => $course->getId(),
  623.                 "lessonModule" => $lessonModule->getId(),
  624.                 "status" => ExamEnum::PUBLISHED,
  625.                 "type" => ExamEnum::MODULE
  626.             ]);
  627.         }
  628.         if(!$exam && $lessonRepository->isLastCourseLesson($lesson)){
  629.             if(!$addExams){
  630.                 return;
  631.             }
  632.             $exam $this->findOneBy([
  633.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  634.                 "course" => $course->getId(),
  635.                 "status" => ExamEnum::PUBLISHED,
  636.                 "type" => ExamEnum::COURSE
  637.             ]);
  638.         }
  639.         if($exam){
  640.             if($addTitle){
  641.                 return (object)[ 
  642.                     "id" => $exam->getId(), 
  643.                     "title" => $exam->getTitle(),
  644.                     "courseId" => $exam->getCourse()->getId(),
  645.                     "moduleId" => (
  646.                         $exam->getLessonModule() ?
  647.                         $exam->getLessonModule()->getId() :
  648.                         null
  649.                     ),
  650.                     "moduleTitle" => (
  651.                         $exam->getLessonModule() ?
  652.                         $exam->getLessonModule()->getTitle() :
  653.                         null
  654.                     ),
  655.                     "lessonId" => (
  656.                         $exam->getLesson() ?
  657.                         $exam->getLesson()->getId() :
  658.                         null
  659.                     ),
  660.                     "type" => $exam->getType(),
  661.                 ];
  662.             }
  663.             return $exam->getId();
  664.         }
  665.         return;
  666.     }
  667.     public function getCurrentNotStartedExamUser(Lesson $lessonBaseUser $user){
  668.         $query $this->createQueryBuilder('e');
  669.         $query->leftJoin(
  670.             'EADPlataforma:LessonModule'
  671.             'lm'
  672.             'WITH'
  673.             'lm.id = e.lessonModule'
  674.         );
  675.         $query->leftJoin(
  676.             'EADPlataforma:Lesson'
  677.             'l'
  678.             'WITH'
  679.             'l.id = e.lesson'
  680.         );
  681.         $query->andWhere('e.course = :course');
  682.         $query->andWhere('e.requirement = :yes');
  683.         $query->andWhere('e.status = :statusExam');
  684.         $query->andWhere('(
  685.             (
  686.                 e.type = :typeLesson 
  687.                 AND l.deleted = :lDeleted 
  688.                 AND l.status = :lStatus
  689.                 AND lm.status = :lmStatus
  690.             ) OR 
  691.             (
  692.                 e.type = :typeModule 
  693.                 AND lm.deleted = :lmDeleted 
  694.                 AND lm.status = :lmStatus
  695.             )
  696.         )');
  697.         $query->andWhere('(
  698.             ( l.order <= :orderL AND lm.order = :orderLM ) OR 
  699.             ( lm.order < :orderLM )
  700.         )');
  701.         $query->andWhere('e.deleted = :deleted');
  702.         $course $lessonBase->getCourse();
  703.         $lessonModule $lessonBase->getLessonModule();
  704.         $subQuery $this->createQueryBuilder('examUser');
  705.         $subQuery->select('IDENTITY(eu.exam)');
  706.         $subQuery->from('EADPlataforma:ExamUser''eu');
  707.         $subQuery->andWhere('eu.course = :course');
  708.         $subQuery->andWhere('eu.deleted = :deletedExamUser');
  709.         $subQuery->andWhere('eu.status = :statusAproved OR eu.releaseAccess = :yes');
  710.         $subQuery->andWhere('eu.user = :user');
  711.         $subQuery $subQuery->getDQL();
  712.         $query->andWhere($query->expr()->notIn('e.id'$subQuery));
  713.         $secondsDay 24 60 60;
  714.         $query->andWhere("
  715.             (e.periodEnd IS NULL OR e.periodEnd = :no) OR
  716.             (
  717.                 ( e.typeRelease = :typeStartReleased )
  718.                 OR
  719.                 (
  720.                     e.typeRelease = :typeStartFixedDate
  721.                     AND TIME_TO_SEC(e.dateStart) <=  TIME_TO_SEC(:now)
  722.                     AND (
  723.                         TIME_TO_SEC(e.dateStart) + (e.periodEnd * {$secondsDay})
  724.                     ) >= TIME_TO_SEC(:now)
  725.                 )
  726.                 OR
  727.                 (
  728.                     e.typeRelease = :typeStartFlexPeriod
  729.                 )
  730.             )
  731.         ");
  732.         /* !!!
  733.             $caseDate = "CASE 
  734.                         WHEN e.type = :typeLesson
  735.                             AND (
  736.                                     SELECT 
  737.                                         lg.id
  738.                                     FROM EADPlataforma:LessonLogOrigin AS lg
  739.                                     WHERE lg.user = :user
  740.                                     AND lg.lesson = e.lesson
  741.                                     AND lg.complete = :completed
  742.                                     LIMIT 1 
  743.                                 ) > 0 
  744.                         THEN
  745.                             (   
  746.                                 SELECT 
  747.                                     lg.dateConclusion 
  748.                                 FROM EADPlataforma:LessonLogOrigin AS lg
  749.                                 WHERE lg.user = :user
  750.                                 AND lg.lesson = e.lesson
  751.                                 AND lg.complete = :completed
  752.                                 LIMIT 1
  753.                             )
  754.                         WHEN e.type = :typeModule
  755.                              AND (   
  756.                                 SELECT 
  757.                                     lg.id
  758.                                 FROM EADPlataforma:LessonLogOrigin AS lg
  759.                                 WHERE lg.user = :user
  760.                                 AND lg.complete = :completed
  761.                                 AND lg.lesson = (
  762.                                     SELECT
  763.                                         le.aula_id 
  764.                                     FROM EADPlataforma:Lesson AS le
  765.                                     WHERE le.lessonModule = e.lessonModule 
  766.                                     AND le.status = :statusL
  767.                                     AND le.deleted = 0
  768.                                     ORDER BY le.order DESC LIMIT 1
  769.                                 )
  770.                                 LIMIT 1
  771.                             ) > 0 
  772.                         THEN
  773.                             (   
  774.                                 SELECT 
  775.                                     lg.dateConclusion
  776.                                 FROM EADPlataforma:LessonLogOrigin AS lg
  777.                                 WHERE lg.user = :user
  778.                                 AND lg.complete = :completed
  779.                                 AND lg.lesson = (
  780.                                     SELECT
  781.                                         le.aula_id 
  782.                                     FROM EADPlataforma:Lesson AS le
  783.                                     WHERE le.lessonModule = e.lessonModule 
  784.                                     AND le.status = :statusL
  785.                                     AND le.deleted = 0
  786.                                     ORDER BY le.order DESC LIMIT 1
  787.                                 )
  788.                                 LIMIT 1
  789.                             )
  790.                         ELSE
  791.                             '0000-00-00 00:00:00'
  792.                     END";
  793.         $caseLogId = "CASE 
  794.                         WHEN e.type = :typeLesson
  795.                         THEN
  796.                             (   
  797.                                 SELECT 
  798.                                     lg.id
  799.                                 FROM EADPlataforma:LessonLogOrigin AS lg
  800.                                 WHERE lg.user = :user
  801.                                 AND lg.lesson = e.lesson
  802.                                 AND lg.complete = :completed
  803.                                 LIMIT 1 
  804.                             )
  805.                         WHEN e.type = :typeModule
  806.                         THEN
  807.                             (   
  808.                                 SELECT 
  809.                                     lg.id
  810.                                 FROM EADPlataforma:LessonLogOrigin AS lg
  811.                                 WHERE lg.user = :user
  812.                                 AND lg.complete = :completed
  813.                                 AND lg.lesson = (
  814.                                     SELECT
  815.                                         le.aula_id 
  816.                                     FROM EADPlataforma:Lesson AS le
  817.                                     WHERE le.lessonModule = e.lessonModule 
  818.                                     AND le.status = :statusL
  819.                                     AND le.deleted = 0
  820.                                     ORDER BY le.order DESC LIMIT 1
  821.                                 )
  822.                                 LIMIT 1
  823.                             )
  824.                         ELSE 0
  825.                     END";
  826.                     
  827.             AND (1) > 0
  828.             AND (
  829.                 TIME_TO_SEC({$caseDate}) + (e.periodStart * {$secondsDay})
  830.             ) <= TIME_TO_SEC(:now)
  831.             AND (
  832.                 TIME_TO_SEC({$caseDate}) + (e.periodEnd * {$secondsDay})
  833.             ) >= TIME_TO_SEC(:now)
  834.         */
  835.         $query->setParameter('lmDeleted'LessonModuleEnum::ITEM_NO_DELETED);
  836.         $query->setParameter('lmStatus'LessonModuleEnum::PUBLISHED);
  837.         $query->setParameter('lDeleted'LessonEnum::ITEM_NO_DELETED);
  838.         $query->setParameter('lStatus'LessonEnum::PUBLISHED);
  839.         $query->setParameter('now'date('Y-m-d H:i:s'));
  840.         $query->setParameter('typeStartReleased'ExamEnum::RELEASED);
  841.         $query->setParameter('typeStartFixedDate'ExamEnum::FIXED_DATE);
  842.         $query->setParameter('typeStartFlexPeriod'ExamEnum::FLEXIBLE_PERIOD);
  843.         $query->setParameter('course'$course->getId());
  844.         $query->setParameter('user'$user->getId());
  845.         $query->setParameter('yes'ExamEnum::YES);
  846.         $query->setParameter('no'ExamEnum::NO);
  847.         $query->setParameter('statusAproved'ExamUserEnum::APPROVED);
  848.         $query->setParameter('statusExam'ExamEnum::PUBLISHED);
  849.         $query->setParameter('typeModule'ExamEnum::MODULE);
  850.         $query->setParameter('typeLesson'ExamEnum::LESSON);
  851.         $query->setParameter('orderL'$lessonBase->getOrder());
  852.         $query->setParameter('orderLM'$lessonModule->getOrder());
  853.         $query->setParameter('deleted'ExamEnum::ITEM_NO_DELETED);
  854.         $query->setParameter('deletedExamUser'ExamUserEnum::ITEM_NO_DELETED);
  855.         $query->setMaxResults(1);
  856.         
  857.         return $query->getQuery()->getOneOrNullResult();
  858.     }
  859.     public function getLastExamIdByLesson(Lesson $lessonBasebool $complete false)
  860.     {
  861.         $addExams false;
  862.         $addExamsLimited false;
  863.         if(
  864.             $this->configuration->isModuleActive("exam_module") &&
  865.             $this->configuration->checkModuleIsAbleOnPlan("examFunction")
  866.         ){
  867.             $addExams true;
  868.             $addExamsLimited $this->configuration->checkModuleIsAbleOnPlan(
  869.                 "unlimitedExamFunction"
  870.             );
  871.         }
  872.         $lessonRepository $this->em->getRepository(Lesson::class);
  873.         
  874.         $lessonIdBefore $lessonRepository->getLessonIdBeforeThat($lessonBase);
  875.         $lesson $lessonRepository->findOneBy([
  876.             "id" => $lessonIdBefore,
  877.             "deleted" => ExamEnum::ITEM_NO_DELETED,
  878.         ]);
  879.         if(!$lesson){
  880.             return;
  881.         }
  882.         $course $lesson->getCourse();
  883.         $lessonModule $lesson->getLessonModule();
  884.         $exam null;
  885.         if(!$exam && $lessonRepository->isLastModuleLesson($lesson)){
  886.             if(!$addExams || !$addExamsLimited){
  887.                 return;
  888.             }
  889.             $exam $this->findOneBy([
  890.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  891.                 "course" => $course->getId(),
  892.                 "lessonModule" => $lessonModule->getId(),
  893.                 "status" => ExamEnum::PUBLISHED,
  894.                 "type" => ExamEnum::MODULE
  895.             ]);
  896.         }
  897.         if(!$exam){
  898.             if(!$addExams || !$addExamsLimited){
  899.                 return;
  900.             }
  901.             $exam $this->findOneBy([
  902.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  903.                 "course" => $course->getId(),
  904.                 "lessonModule" => $lessonModule->getId(),
  905.                 "lesson" => $lesson->getId(),
  906.                 "status" => ExamEnum::PUBLISHED,
  907.                 "type" => ExamEnum::LESSON
  908.             ]);
  909.         }
  910.         if(!$exam){
  911.             $exam $this->findOneBy([
  912.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  913.                 "course" => $course->getId(),
  914.                 "lessonModule" => $lessonModule->getId(),
  915.                 "lesson" => $lesson->getId(),
  916.                 "status" => ExamEnum::PUBLISHED,
  917.                 "type" => ExamEnum::QUIZ
  918.             ]);
  919.         }
  920.         if($exam){
  921.             if($complete){
  922.                 return (object)[ 
  923.                     "id" => $exam->getId(),
  924.                     "title" => $exam->getTitle(),
  925.                     "courseId" => $exam->getCourse()->getId(),
  926.                     "moduleId" => (
  927.                         $exam->getLessonModule() ?
  928.                         $exam->getLessonModule()->getId() :
  929.                         null
  930.                     ),
  931.                     "moduleTitle" => (
  932.                         $exam->getLessonModule() ?
  933.                         $exam->getLessonModule()->getTitle() :
  934.                         null
  935.                     ),
  936.                     "lessonId" => (
  937.                         $exam->getLesson() ?
  938.                         $exam->getLesson()->getId() :
  939.                         null
  940.                     ),
  941.                     "type" => $exam->getType(),
  942.                 ];
  943.             }
  944.             
  945.             return $exam->getId();
  946.         }
  947.         return;
  948.     }
  949.     public function sumCourseWeight($courseId)
  950.     {
  951.         $query $this->createQueryBuilder('e');
  952.         $query->select('SUM(e.examWeight) AS examWeight');
  953.         $query->andWhere('e.status = :yes');
  954.         $query->andWhere('e.requirement = :yes');
  955.         $query->andWhere('e.course = :course');
  956.         $query->andWhere('e.deleted = :deleted');
  957.         $query->setParameter('course'$courseId);
  958.         $query->setParameter('yes'ExamEnum::YES);
  959.         $query->setParameter('deleted'ExamEnum::ITEM_NO_DELETED);
  960.         
  961.         $result = (object)$query->getQuery()->getOneOrNullResult();
  962.         return $result->examWeight;
  963.     }
  964.     public function countCourseWeight($courseId)
  965.     {
  966.         $query $this->createQueryBuilder('e');
  967.         $query->select('COUNT(e.id) AS total');
  968.         $query->andWhere('e.status = 1');
  969.         $query->andWhere('e.examWeight > 0');
  970.         $query->andWhere('e.requirement = 1');
  971.         $query->andWhere('e.course = :course');
  972.         $query->setParameter('course'$courseId);
  973.         
  974.         $result = (object)$query->getQuery()->getOneOrNullResult();
  975.         return $result->total;
  976.     }
  977.     public function countValidExamByCourse(int $courseId)
  978.     {
  979.         $query $this->createQueryBuilder('e');
  980.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  981.         $query->leftJoin('EADPlataforma:LessonModule''lm''WITH''lm.id = e.lessonModule');
  982.         $query->leftJoin('EADPlataforma:Lesson''l''WITH''l.id = e.lesson');
  983.         $query->select('COUNT(e.id) AS total');
  984.         $query->andWhere('e.deleted = :examDeleted');
  985.         $query->andWhere('e.status = :examStatus');
  986.         $query->andWhere('e.examWeight > 0');
  987.         //$query->andWhere('e.requirement = :yes');
  988.         $query->andWhere('e.course = :course');
  989.         $query->andWhere('
  990.             (
  991.                 (e.type = :typeCourse AND c.deleted = :courseDeleted)
  992.                 OR (
  993.                     e.type = :typeLessonModule
  994.                     AND lm.status = :lessonModuleStatus 
  995.                     AND lm.deleted = :lessonModuleDeleted
  996.                 ) 
  997.                 OR (
  998.                     e.type = :typeLesson 
  999.                     AND l.status = :lessonStatus 
  1000.                     AND l.deleted = :lessonDeleted
  1001.                 )
  1002.             )
  1003.         ');
  1004.         $query->setParameter('typeCourse'ExamEnum::COURSE);
  1005.         $query->setParameter('typeLessonModule'ExamEnum::MODULE);
  1006.         $query->setParameter('typeLesson'ExamEnum::LESSON);
  1007.         $query->setParameter('examDeleted'ExamEnum::ITEM_NO_DELETED);
  1008.         $query->setParameter('courseDeleted'CourseEnum::ITEM_NO_DELETED);
  1009.         $query->setParameter('lessonModuleDeleted'LessonModuleEnum::ITEM_NO_DELETED);
  1010.         $query->setParameter('lessonDeleted'LessonEnum::ITEM_NO_DELETED);
  1011.         
  1012.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1013.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1014.         $query->setParameter('examStatus'ExamEnum::PUBLISHED);
  1015.         //$query->setParameter('yes', ExamEnum::YES);
  1016.         $query->setParameter('course'$courseId);
  1017.         
  1018.         $result = (object)$query->getQuery()->getOneOrNullResult();
  1019.         return $result->total;
  1020.     }
  1021.     public function copyExamQuestion(Exam $oldExamExam $newExam)
  1022.     {   
  1023.         $questionRepository $this->em->getRepository(Question::class);
  1024.         $questions $oldExam->getQuestion();
  1025.         if($questions){
  1026.             foreach ($questions as $key => $question) {
  1027.                 if($question->isLive()){
  1028.                     if($oldExam->getCourse()->getId() != $newExam->getCourse()->getId()){
  1029.                         $newQuestion $questionRepository->copyQuestionsByCourse(
  1030.                             $question
  1031.                             $newExam->getCourse()
  1032.                         );
  1033.                         
  1034.                         if($newQuestion){
  1035.                             $newExam->addQuestion($newQuestion);
  1036.                         }
  1037.                     }else{
  1038.                         $newExam->addQuestion($question); 
  1039.                     }
  1040.                 }
  1041.             }
  1042.         }
  1043.         return $newExam;
  1044.     }
  1045.     public function copyExamByCourse(Course $oldCourseCourse $newCourse)
  1046.     {
  1047.         $oldExam $this->findOneBy([
  1048.             "course" => $oldCourse->getId(),
  1049.             "type" => ExamEnum::COURSE,
  1050.             "deleted" => ExamEnum::ITEM_NO_DELETED
  1051.         ]);
  1052.         if($oldExam){
  1053.             $newExam = new Exam();
  1054.             
  1055.             $newExam->setTitle($oldExam->getTitle());
  1056.             $newExam->setType($oldExam->getType());
  1057.             $newExam->setStatus($oldExam->getStatus());
  1058.             $newExam->setRequirement($oldExam->getRequirement());
  1059.             $newExam->setQuestionOrder($oldExam->getQuestionOrder());
  1060.             $newExam->setQuestionNumber($oldExam->getQuestionNumber());
  1061.             $newExam->setExamAverage($oldExam->getExamAverage());
  1062.             $newExam->setExamWeight($oldExam->getExamWeight());
  1063.             $newExam->setTypeRelease($oldExam->getTypeRelease());
  1064.             $newExam->setPeriodStart($oldExam->getPeriodStart());
  1065.             $newExam->setPeriodEnd($oldExam->getPeriodEnd());
  1066.             $newExam->setDateStart($oldExam->getDateStart());
  1067.             $newExam->setExamTime($oldExam->getExamTime());
  1068.             $newExam->setAttempts($oldExam->getAttempts());
  1069.             $newExam->setAttemptsNumber($oldExam->getAttemptsNumber());
  1070.             $newExam->setAttemptsAutoRelease($oldExam->getAttemptsAutoRelease());
  1071.             $newExam->setAttemptsTypeRelease($oldExam->getAttemptsTypeRelease());
  1072.             $newExam->setAttemptsTime($oldExam->getAttemptsTime());
  1073.             $newExam->setAttemptsPeriod($oldExam->getAttemptsPeriod());
  1074.             $newExam->setShowTemplate($oldExam->getShowTemplate());
  1075.             $newExam->setNote($oldExam->getNote());
  1076.             $newExam->setDateLastNotify($oldExam->getDateLastNotify());
  1077.             $newExam->setCourse($newCourse);
  1078.             
  1079.             $newExam $this->copyExamQuestion($oldExam$newExam);
  1080.             $this->em->persist($newExam);
  1081.             $this->em->flush();
  1082.         }
  1083.     }
  1084.     public function copyExamByModule(LessonModule $oldModuleLessonModule $newModule)
  1085.     {
  1086.         $oldExam $this->findOneBy([
  1087.             "course" => $oldModule->getCourse()->getId(), 
  1088.             "lessonModule"=> $oldModule->getId(),
  1089.             "type" => ExamEnum::MODULE,
  1090.             "deleted" => ExamEnum::ITEM_NO_DELETED
  1091.         ]);
  1092.         if($oldExam){
  1093.             $newExam = new Exam();
  1094.             
  1095.             $newExam->setTitle($oldExam->getTitle());
  1096.             $newExam->setType($oldExam->getType());
  1097.             $newExam->setStatus($oldExam->getStatus());
  1098.             $newExam->setRequirement($oldExam->getRequirement());
  1099.             $newExam->setQuestionOrder($oldExam->getQuestionOrder());
  1100.             $newExam->setQuestionNumber($oldExam->getQuestionNumber());
  1101.             $newExam->setExamAverage($oldExam->getExamAverage());
  1102.             $newExam->setExamWeight($oldExam->getExamWeight());
  1103.             $newExam->setTypeRelease($oldExam->getTypeRelease());
  1104.             $newExam->setPeriodStart($oldExam->getPeriodStart());
  1105.             $newExam->setPeriodEnd($oldExam->getPeriodEnd());
  1106.             $newExam->setDateStart($oldExam->getDateStart());
  1107.             $newExam->setExamTime($oldExam->getExamTime());
  1108.             $newExam->setAttempts($oldExam->getAttempts());
  1109.             $newExam->setAttemptsNumber($oldExam->getAttemptsNumber());
  1110.             $newExam->setAttemptsAutoRelease($oldExam->getAttemptsAutoRelease());
  1111.             $newExam->setAttemptsTypeRelease($oldExam->getAttemptsTypeRelease());
  1112.             $newExam->setAttemptsTime($oldExam->getAttemptsTime());
  1113.             $newExam->setAttemptsPeriod($oldExam->getAttemptsPeriod());
  1114.             $newExam->setShowTemplate($oldExam->getShowTemplate());
  1115.             $newExam->setNote($oldExam->getNote());
  1116.             $newExam->setDateLastNotify($oldExam->getDateLastNotify());
  1117.             $newExam->setCourse($newModule->getCourse());
  1118.             $newExam->setLessonModule($newModule);
  1119.             
  1120.             $newExam $this->copyExamQuestion($oldExam$newExam);
  1121.             $this->em->persist($newExam);
  1122.             $this->em->flush();
  1123.         }
  1124.     }
  1125.     public function copyExamByLesson(Lesson $oldLessonLesson $newLesson)
  1126.     {
  1127.         $oldExam $this->findOneBy([
  1128.             "course" => $oldLesson->getCourse()->getId(),
  1129.             "lessonModule" => $oldLesson->getLessonModule()->getId(),
  1130.             "lesson"=> $oldLesson->getId(),
  1131.             "type" => ExamEnum::LESSON,
  1132.             "deleted" => ExamEnum::ITEM_NO_DELETED
  1133.         ]);
  1134.         if($oldExam){
  1135.             $newExam = new Exam();
  1136.             
  1137.             $newExam->setTitle($oldExam->getTitle());
  1138.             $newExam->setType($oldExam->getType());
  1139.             $newExam->setStatus($oldExam->getStatus());
  1140.             $newExam->setRequirement($oldExam->getRequirement());
  1141.             $newExam->setQuestionOrder($oldExam->getQuestionOrder());
  1142.             $newExam->setQuestionNumber($oldExam->getQuestionNumber());
  1143.             $newExam->setExamAverage($oldExam->getExamAverage());
  1144.             $newExam->setExamWeight($oldExam->getExamWeight());
  1145.             $newExam->setTypeRelease($oldExam->getTypeRelease());
  1146.             $newExam->setPeriodStart($oldExam->getPeriodStart());
  1147.             $newExam->setPeriodEnd($oldExam->getPeriodEnd());
  1148.             $newExam->setDateStart($oldExam->getDateStart());
  1149.             $newExam->setExamTime($oldExam->getExamTime());
  1150.             $newExam->setAttempts($oldExam->getAttempts());
  1151.             $newExam->setAttemptsNumber($oldExam->getAttemptsNumber());
  1152.             $newExam->setAttemptsAutoRelease($oldExam->getAttemptsAutoRelease());
  1153.             $newExam->setAttemptsTypeRelease($oldExam->getAttemptsTypeRelease());
  1154.             $newExam->setAttemptsTime($oldExam->getAttemptsTime());
  1155.             $newExam->setAttemptsPeriod($oldExam->getAttemptsPeriod());
  1156.             $newExam->setShowTemplate($oldExam->getShowTemplate());
  1157.             $newExam->setNote($oldExam->getNote());
  1158.             $newExam->setDateLastNotify($oldExam->getDateLastNotify());
  1159.             $newExam->setCourse($newLesson->getCourse());
  1160.             $newExam->setLessonModule($newLesson->getLessonModule());
  1161.             $newExam->setLesson($newLesson);
  1162.             
  1163.             $newExam $this->copyExamQuestion($oldExam$newExam);
  1164.             
  1165.             $this->em->persist($newExam);
  1166.             $this->em->flush();
  1167.         }
  1168.     }
  1169.     public function copyQuizByLesson(Lesson $oldLessonLesson $newLesson)
  1170.     {
  1171.         $oldExam $this->findOneBy([
  1172.             "course" => $oldLesson->getCourse()->getId(),
  1173.             "lessonModule" => $oldLesson->getLessonModule()->getId(),
  1174.             "lesson"=> $oldLesson->getId(),
  1175.             "type" => ExamEnum::QUIZ,
  1176.             "deleted" => ExamEnum::ITEM_NO_DELETED
  1177.         ]);
  1178.         if($oldExam){
  1179.             $newExam = new Exam();
  1180.             
  1181.             $newExam->setTitle($oldExam->getTitle());
  1182.             $newExam->setType($oldExam->getType());
  1183.             $newExam->setStatus($oldExam->getStatus());
  1184.             $newExam->setRequirement($oldExam->getRequirement());
  1185.             $newExam->setQuestionOrder($oldExam->getQuestionOrder());
  1186.             $newExam->setQuestionNumber($oldExam->getQuestionNumber());
  1187.             $newExam->setExamAverage($oldExam->getExamAverage());
  1188.             $newExam->setExamWeight($oldExam->getExamWeight());
  1189.             $newExam->setTypeRelease($oldExam->getTypeRelease());
  1190.             $newExam->setPeriodStart($oldExam->getPeriodStart());
  1191.             $newExam->setPeriodEnd($oldExam->getPeriodEnd());
  1192.             $newExam->setDateStart($oldExam->getDateStart());
  1193.             $newExam->setExamTime($oldExam->getExamTime());
  1194.             $newExam->setAttempts($oldExam->getAttempts());
  1195.             $newExam->setAttemptsNumber($oldExam->getAttemptsNumber());
  1196.             $newExam->setAttemptsAutoRelease($oldExam->getAttemptsAutoRelease());
  1197.             $newExam->setAttemptsTypeRelease($oldExam->getAttemptsTypeRelease());
  1198.             $newExam->setAttemptsTime($oldExam->getAttemptsTime());
  1199.             $newExam->setAttemptsPeriod($oldExam->getAttemptsPeriod());
  1200.             $newExam->setShowTemplate($oldExam->getShowTemplate());
  1201.             $newExam->setNote($oldExam->getNote());
  1202.             $newExam->setDateLastNotify($oldExam->getDateLastNotify());
  1203.             $newExam->setCourse($newLesson->getCourse());
  1204.             $newExam->setLessonModule($newLesson->getLessonModule());
  1205.             $newExam->setLesson($newLesson);
  1206.             
  1207.             $newExam $this->copyExamQuestion($oldExam$newExam);
  1208.             
  1209.             $this->em->persist($newExam);
  1210.             $this->em->flush();
  1211.         }
  1212.     }
  1213.     public function editManyStatus(Exam $exam$permission$status)
  1214.     {
  1215.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1216.         $allTypes $this->configuration->checkModuleIsAbleOnPlan('unlimitedExamFunction');
  1217.         if(!$allTypes){
  1218.             if($exam->getType() != ExamEnum::COURSE && $exam->getType() != ExamEnum::QUIZ){
  1219.                 return false;
  1220.             }
  1221.         }
  1222.         if($exam->getType() == ExamEnum::MODULE){
  1223.             $permission $userPermissionUtil->getPermission(
  1224.                 "course"
  1225.                 "lesson_module"
  1226.                 "exam_configuration"
  1227.                 "edit"
  1228.             );
  1229.         }else if($exam->getType() == ExamEnum::LESSON){
  1230.             $permission $userPermissionUtil->getPermission(
  1231.                 "course"
  1232.                 "lesson"
  1233.                 "exam_configuration"
  1234.                 "edit"
  1235.             );
  1236.         }else if($exam->getType() == ExamEnum::QUIZ){
  1237.             $permission $userPermissionUtil->getPermission(
  1238.                 "course"
  1239.                 "lesson"
  1240.                 "quiz_configuration"
  1241.                 "edit"
  1242.             );
  1243.         }
  1244.         $isExamTeacher $this->isExamTeacher($exam$this->getUser());
  1245.         if($isExamTeacher && $userPermissionUtil->isMiddle($permission) || 
  1246.             $userPermissionUtil->isHigh($permission)){
  1247.             $exam->setStatus($status);
  1248.         }
  1249.     }
  1250.     public function delete(Exam $exam$typeItem$permission$isTrash)
  1251.     {
  1252.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1253.         $allTypes $this->configuration->checkModuleIsAbleOnPlan('unlimitedExamFunction');
  1254.         if(!$allTypes){
  1255.             if($exam->getType() != ExamEnum::COURSE && $exam->getType() != ExamEnum::QUIZ){
  1256.                 return false;
  1257.             }
  1258.         }
  1259.         if($exam->getType() == ExamEnum::MODULE){
  1260.             $permission $userPermissionUtil->getPermission(
  1261.                 "course"
  1262.                 "lesson_module"
  1263.                 "exam_configuration"
  1264.                 "delete"
  1265.             );
  1266.         }else if($exam->getType() == ExamEnum::LESSON){
  1267.             $permission $userPermissionUtil->getPermission(
  1268.                 "course"
  1269.                 "lesson"
  1270.                 "exam_configuration"
  1271.                 "delete"
  1272.             );
  1273.         }else if($exam->getType() == ExamEnum::QUIZ){
  1274.             $permission $userPermissionUtil->getPermission(
  1275.                 "course"
  1276.                 "lesson"
  1277.                 "quiz_configuration"
  1278.                 "delete"
  1279.             );
  1280.         }
  1281.         $isExamTeacher $this->isExamTeacher($exam$this->getUser());
  1282.         if($isExamTeacher || $userPermissionUtil->isHigh($permission)){
  1283.             $questions $exam->getQuestion();
  1284.             if(!empty($questions)){
  1285.                 foreach ($questions as $key => $question) {
  1286.                     $exam->removeQuestion($question);
  1287.                 }
  1288.             }
  1289.             $exam->setTitle(null);
  1290.             $exam->setStatus(ExamEnum::DRAFT);
  1291.             $exam->setRequirement(ExamEnum::NO);
  1292.             $exam->setQuestionOrder(ExamEnum::SEQUENTIAL);
  1293.             $exam->setQuestionNumber(0);
  1294.             $exam->setExamAverage(7);
  1295.             $exam->setExamWeight(0);
  1296.             $exam->setTypeRelease(ExamEnum::RELEASED);
  1297.             $exam->setControlTime(ExamEnum::NO);
  1298.             $exam->setPeriodStart(0);
  1299.             $exam->setPeriodEnd(0);
  1300.             $exam->setDateStart(null);
  1301.             $exam->setExamTime(null);
  1302.             $exam->setAttempts(ExamEnum::NO);
  1303.             $exam->setAttemptsNumber(1);
  1304.             $exam->setAttemptsAutoRelease(ExamEnum::YES);
  1305.             $exam->setAttemptsTypeRelease(ExamEnum::DAYS);
  1306.             $exam->setAttemptsTime(null);
  1307.             $exam->setAttemptsPeriod(null);
  1308.             $exam->setShowTemplate(ExamEnum::NO);
  1309.             $exam->setNote(null);
  1310.             $exam->setDateLastNotify(null);
  1311.             $this->em->flush();
  1312.         }
  1313.     }
  1314.     public function restoreByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1315.         $sql "UPDATE EADPlataforma:Exam AS e 
  1316.                 SET e.deleted = :deleted, e.userDelete = :userDelete, 
  1317.                     e.dateDelete = :dateNow
  1318.                 WHERE e.deleted = (1 - :deleted)
  1319.                 AND e.typeDelete = :typeDelete
  1320.                 AND e.course = :courseId";
  1321.         $query $this->em->createQuery($sql);
  1322.         $query->setParameter('courseId'$courseId);
  1323.         $query->setParameter('deleted'$deleted);
  1324.         $query->setParameter('typeDelete'$typeDelete);
  1325.         $query->setParameter('userDelete'$userDelete);
  1326.         $query->setParameter('dateNow'$dateNow);
  1327.         $query->execute();
  1328.         
  1329.         return true;
  1330.     }
  1331.     public function deleteByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1332.         $sql "UPDATE EADPlataforma:Exam AS e 
  1333.                 SET e.deleted = :deleted, e.typeDelete = :typeDelete,
  1334.                     e.userDelete = :userDelete, e.dateDelete = :dateNow
  1335.                 WHERE e.deleted = (:deleted - 1)
  1336.                 AND e.course = :courseId";
  1337.         $query $this->em->createQuery($sql);
  1338.         $query->setParameter('courseId'$courseId);
  1339.         $query->setParameter('deleted'$deleted);
  1340.         $query->setParameter('typeDelete'$typeDelete);
  1341.         $query->setParameter('userDelete'$userDelete);
  1342.         $query->setParameter('dateNow'$dateNow);
  1343.         $query->execute();
  1344.         
  1345.         return true;
  1346.     }
  1347.     public function restoreByLessonModule($lessonModuleId$deleted$typeDelete$userDelete$dateNow){
  1348.         $sql "UPDATE EADPlataforma:Exam AS e 
  1349.                 SET e.deleted = :deleted, e.userDelete = :userDelete, 
  1350.                     e.dateDelete = :dateNow
  1351.                 WHERE e.deleted = (1 - :deleted)
  1352.                 AND e.typeDelete = :typeDelete
  1353.                 AND e.lessonModule = :lessonModuleId";
  1354.         $query $this->em->createQuery($sql);
  1355.         $query->setParameter('lessonModuleId'$lessonModuleId);
  1356.         $query->setParameter('deleted'$deleted);
  1357.         $query->setParameter('typeDelete'$typeDelete);
  1358.         $query->setParameter('userDelete'$userDelete);
  1359.         $query->setParameter('dateNow'$dateNow);
  1360.         $query->execute();
  1361.         
  1362.         return true;
  1363.     }
  1364.     public function deleteByLessonModule($lessonModuleId$deleted$typeDelete$userDelete$dateNow){
  1365.         $sql "UPDATE EADPlataforma:Exam AS e 
  1366.                 SET e.deleted = :deleted, e.typeDelete = :typeDelete,
  1367.                     e.userDelete = :userDelete, e.dateDelete = :dateNow
  1368.                 WHERE e.deleted = (:deleted - 1)
  1369.                 AND e.lessonModule = :lessonModuleId";
  1370.         $query $this->em->createQuery($sql);
  1371.         $query->setParameter('lessonModuleId'$lessonModuleId);
  1372.         $query->setParameter('deleted'$deleted);
  1373.         $query->setParameter('typeDelete'$typeDelete);
  1374.         $query->setParameter('userDelete'$userDelete);
  1375.         $query->setParameter('dateNow'$dateNow);
  1376.         $query->execute();
  1377.         
  1378.         return true;
  1379.     }
  1380.     public function restoreByLesson($lessonId$deleted$typeDelete$userDelete$dateNow){
  1381.         $sql "UPDATE EADPlataforma:Exam AS e 
  1382.                 SET e.deleted = :deleted, e.userDelete = :userDelete, 
  1383.                     e.dateDelete = :dateNow
  1384.                 WHERE e.deleted = (1 - :deleted)
  1385.                 AND e.typeDelete = :typeDelete
  1386.                 AND e.lesson = :lessonId";
  1387.         $query $this->em->createQuery($sql);
  1388.         $query->setParameter('lessonId'$lessonId);
  1389.         $query->setParameter('deleted'$deleted);
  1390.         $query->setParameter('typeDelete'$typeDelete);
  1391.         $query->setParameter('userDelete'$userDelete);
  1392.         $query->setParameter('dateNow'$dateNow);
  1393.         $query->execute();
  1394.         
  1395.         return true;
  1396.     }
  1397.     public function deleteByLesson($lessonId$deleted$typeDelete$userDelete$dateNow){
  1398.         $sql "UPDATE EADPlataforma:Exam AS e 
  1399.                 SET e.deleted = :deleted, e.typeDelete = :typeDelete,
  1400.                     e.userDelete = :userDelete, e.dateDelete = :dateNow
  1401.                 WHERE e.deleted = (:deleted - 1)
  1402.                 AND e.lesson = :lessonId";
  1403.         $query $this->em->createQuery($sql);
  1404.         $query->setParameter('lessonId'$lessonId);
  1405.         $query->setParameter('deleted'$deleted);
  1406.         $query->setParameter('typeDelete'$typeDelete);
  1407.         $query->setParameter('userDelete'$userDelete);
  1408.         $query->setParameter('dateNow'$dateNow);
  1409.         $query->execute();
  1410.         
  1411.         return true;
  1412.     }
  1413.     public function deleteTrashCron()
  1414.     {
  1415.         $sql "UPDATE EADPlataforma:Exam AS e 
  1416.                 SET e.deleted = 2 WHERE e.dateDelete <= :date AND e.deleted = 1 ";
  1417.         $query $this->em->createQuery($sql);
  1418.         $query->setParameter('date'date('Y-m-d H:i:s'strtotime('-90 days')));
  1419.         $query->execute();
  1420.     }
  1421. }