src/Repository/LessonRepository.php line 394

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Repository;
  3. use EADPlataforma\Entity\Course;
  4. use EADPlataforma\Entity\Product;
  5. use EADPlataforma\Entity\LessonModule;
  6. use EADPlataforma\Entity\Lesson;
  7. use EADPlataforma\Entity\LessonLog;
  8. use EADPlataforma\Entity\LessonLogOrigin;
  9. use EADPlataforma\Entity\CourseTeam;
  10. use EADPlataforma\Entity\Exam;
  11. use EADPlataforma\Entity\ExamUser;
  12. use EADPlataforma\Entity\Enrollment;
  13. use EADPlataforma\Entity\Library;
  14. use EADPlataforma\Entity\LessonXLibrary;
  15. use EADPlataforma\Entity\LessonSupport;
  16. use EADPlataforma\Entity\User;
  17. use EADPlataforma\Entity\Trash;
  18. use EADPlataforma\Enum\CourseEnum;
  19. use EADPlataforma\Enum\CourseTeamEnum;
  20. use EADPlataforma\Enum\LessonEnum;
  21. use EADPlataforma\Enum\LessonModuleEnum;
  22. use EADPlataforma\Enum\EnrollmentEnum;
  23. use EADPlataforma\Enum\ExamEnum;
  24. use EADPlataforma\Enum\UserEnum;
  25. use EADPlataforma\Enum\LibraryEnum;
  26. use EADPlataforma\Enum\LessonXLibraryEnum;
  27. use EADPlataforma\Enum\ServicesEnum;
  28. use EADPlataforma\Enum\NotificationEnum;
  29. use EADPlataforma\Enum\TrashEnum;
  30. use Firebase\JWT\JWT;
  31. use \PDO;
  32. /**
  33.  * @method Lesson|null find($id, $lockMode = null, $lockVersion = null)
  34.  * @method Lesson|null findOneBy(array $criteria, array $orderBy = null)
  35.  * @method Lesson[]    findAll()
  36.  * @method Lesson[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  37.  */
  38. class LessonRepository extends AbstractRepository
  39. {
  40.     private $lessonIdsCourse = [];
  41.     public function getEntityClass(){
  42.         return Lesson::class;
  43.     }
  44.     public function getConnectionName(){
  45.         return "school";
  46.     }
  47.     public function getMeetCredentials(lesson $lessonUser $user)
  48.     {
  49.         $library $lesson->getLibrary();
  50.         if(!$library){
  51.             return null;
  52.         }
  53.         $libraryType $library->getType();
  54.         if($libraryType != LibraryEnum::CONTENT_CONFERENCE){
  55.             return null;
  56.         }
  57.         $info $this->generalService->getServiceAccess(ServicesEnum::MEET);
  58.         $privateKey $info->privateKey;
  59.         $publicKey $info->publicKey;
  60.         $appId $info->appId;
  61.         $fileService $this->generalService->getService('FileService');
  62.         $photo $fileService->getFilePathComplete(
  63.             $user->getPhoto(), 
  64.             UserEnum::PATH_PROFILES
  65.             true
  66.             true
  67.         );
  68.         $courseRepository $this->em->getRepository(Course::class);
  69.         $isStudent $courseRepository->isStudent($lesson->getCourse());
  70.         $isAdmin = ($isStudent false true );
  71.         $client $this->getConfiguration()->getClient();
  72.         $clientId $client->getClientId();
  73.         $formatClientId = [
  74.             "1" => "00000{$clientId}",
  75.             "2" => "0000{$clientId}",
  76.             "3" => "000{$clientId}",
  77.             "4" => "00{$clientId}",
  78.             "5" => "0{$clientId}",
  79.         ];
  80.         
  81.         if(isset($formatClientId[strlen($clientId)])){
  82.             $clientId $formatClientId[strlen($clientId)];
  83.         }
  84.         
  85.         $channelId md5($clientId $lesson->getId());
  86.         $userId md5($clientId $this->getUser()->getId());
  87.         $payload = [
  88.             'iss' => 'chat',
  89.             'aud' => 'jitsi',
  90.             'exp' => time() + 7200,
  91.             'nbf' => time() - 10,
  92.             'room'=> '*',
  93.             'sub' => $appId,
  94.             'context' => [
  95.                 'user' => [
  96.                     'moderator' => $isAdmin "true" "false",
  97.                     'email' => $user->getEmail(),
  98.                     'name' => $user->getName(),
  99.                     'avatar' => $photo,
  100.                     'id' => $userId
  101.                 ],
  102.                 'features' => [
  103.                     'recording' => $isAdmin "true" "false",
  104.                     'livestreaming' => "false",
  105.                     'transcription' => "false",
  106.                     'outbound-call' => "false"
  107.                 ]
  108.             ]
  109.         ];
  110.         $token JWT::encode($payload$privateKey"RS256"$publicKey);
  111.         return (object)[
  112.             "token" => $token,
  113.             "room" => $channelId,
  114.             "appId" => $appId,
  115.         ];
  116.     }
  117.     public function getLessonChatCredentialsNew(Lesson $lesson)
  118.     {
  119.         $library $lesson->getLibrary();
  120.         if(!$this->getUser()){
  121.             return;
  122.         }
  123.         if(!$library){
  124.             return;
  125.         }
  126.         if(
  127.             $library->getType() != LibraryEnum::CONTENT_LIVE && 
  128.             $library->getType() != LibraryEnum::CONTENT_EXTERNAL_LIVE
  129.         ){
  130.             return;
  131.         }
  132.         $courseRepository $this->em->getRepository(Course::class);
  133.         $isStudent $courseRepository->isStudent($lesson->getCourse());
  134.         if($lesson->getShowLiveChat() == LessonEnum::NO && $isStudent){
  135.             return;
  136.         }
  137.         
  138.         $today date('Y-m-d H:i:s');
  139.         $todayDate date('Y-m-d');
  140.         $timeToday strtotime($today);
  141.         $showLiveChat LessonEnum::NO;
  142.         $liveDateStart $library->getLiveStart();
  143.         $timeLiveEnd date('Y-m-d'strtotime($liveDateStart));
  144.         $timeLiveStart strtotime($liveDateStart ' - 1 hours'); 
  145.         
  146.         if($timeToday >= $timeLiveStart && $todayDate == $timeLiveEnd || !$isStudent){
  147.             $showLiveChat LessonEnum::YES;
  148.         }
  149.         if($showLiveChat == LessonEnum::NO){
  150.             return;
  151.         }
  152.         $client $this->getConfiguration()->getClient();
  153.         $clientId $client->getClientId();
  154.         $formatClientId = [
  155.             "1" => "00000{$clientId}",
  156.             "2" => "0000{$clientId}",
  157.             "3" => "000{$clientId}",
  158.             "4" => "00{$clientId}",
  159.             "5" => "0{$clientId}",
  160.         ];
  161.         
  162.         if(isset($formatClientId[strlen($clientId)])){
  163.             $clientId $formatClientId[strlen($clientId)];
  164.         }
  165.         
  166.         $channelId md5($clientId $lesson->getId());
  167.         $userId md5($clientId $this->getUser()->getId());
  168.         $isAdmin = ($isStudent false true );
  169.         $fileService $this->generalService->getService('FileService');
  170.         $photo $fileService->getFilePathComplete(
  171.             $this->getUser()->getPhoto(), 
  172.             UserEnum::PATH_PROFILES
  173.             true
  174.             true
  175.         );
  176.         $tokenAuth $this->generalService->getTokenCron();
  177.         $url "https://chat.eadplataforma.app/api/users/token";
  178.         $ch curl_init($url);
  179.         $dataPost = [
  180.             "isAdmin" => $isAdmin,
  181.             "id" => $userId,
  182.             "name" => $this->getUser()->getName(),
  183.             "roomId" => $channelId,
  184.             "photoSrc" => $photo,
  185.             "lessonId" => $lesson->getId(),
  186.             "clientId" => $clientId,
  187.         ];
  188.         curl_setopt($chCURLOPT_CUSTOMREQUEST'POST');
  189.         curl_setopt($chCURLOPT_POSTFIELDSjson_encode($dataPost));
  190.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  191.         curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  192.         curl_setopt($chCURLOPT_HTTPHEADER, [ 
  193.             "Authorization: {$tokenAuth}",
  194.             "Content-Type: application/json"
  195.         ]);
  196.         $dataToken curl_exec($ch);
  197.         $error curl_error($ch);
  198.         $dataToken json_decode($dataToken);
  199.         curl_close($ch);
  200.         return (object)[
  201.             "role" => ($isAdmin "admin" "user"),
  202.             "userId" => $userId,
  203.             "userFoto" => $photo,
  204.             "userName" => $this->getUser()->getName(),
  205.             "channelId" => $channelId,
  206.             "channelLogo" => "",
  207.             "channelName" => $lesson->getTitle(),
  208.             "userToken" => (!empty($dataToken->token) ? $dataToken->token null),
  209.             "clientId" => $clientId
  210.         ];
  211.     }
  212.     public function getLessonChatCredentials(Lesson $lesson)
  213.     {
  214.         $library $lesson->getLibrary();
  215.         if(!$this->getUser()){
  216.             return;
  217.         }
  218.         if(!$library){
  219.             return;
  220.         }
  221.         if(
  222.             $library->getType() != LibraryEnum::CONTENT_LIVE && 
  223.             $library->getType() != LibraryEnum::CONTENT_EXTERNAL_LIVE
  224.         ){
  225.             return;
  226.         }
  227.         $courseRepository $this->em->getRepository(Course::class);
  228.         $isStudent $courseRepository->isStudent($lesson->getCourse());
  229.         if($lesson->getShowLiveChat() == LessonEnum::NO && $isStudent){
  230.             return;
  231.         }
  232.         
  233.         $today date('Y-m-d H:i:s');
  234.         $todayDate date('Y-m-d');
  235.         $timeToday strtotime($today);
  236.         $showLiveChat LessonEnum::NO;
  237.         $liveDateStart $library->getLiveStart();
  238.         $timeLiveEnd date('Y-m-d'strtotime($liveDateStart));
  239.         $timeLiveStart strtotime($liveDateStart ' - 1 hours'); 
  240.         
  241.         if($timeToday >= $timeLiveStart && $todayDate == $timeLiveEnd || !$isStudent){
  242.             $showLiveChat LessonEnum::YES;
  243.         }
  244.         if($showLiveChat == LessonEnum::NO){
  245.             return;
  246.         }
  247.         $header = [ 
  248.             'typ' => 'JWT'
  249.             'alg' => 'HS256'
  250.         ];
  251.         $info $this->generalService->getServiceAccess(ServicesEnum::LIVECHAT);
  252.         $client $this->getConfiguration()->getClient();
  253.         $clientId $client->getClientId();
  254.         $formatClientId = [
  255.             "1" => "00000{$clientId}",
  256.             "2" => "0000{$clientId}",
  257.             "3" => "000{$clientId}",
  258.             "4" => "00{$clientId}",
  259.             "5" => "0{$clientId}",
  260.         ];
  261.         
  262.         if(isset($formatClientId[strlen($clientId)])){
  263.             $clientId $formatClientId[strlen($clientId)];
  264.         }
  265.         
  266.         $channelId md5($clientId $lesson->getId());
  267.         $clientStream = new \GetStream\StreamChat\Client($info->client$info->token);
  268.         $channel $clientStream->Channel("livestream"$channelId);
  269.         $userId md5($clientId $this->getUser()->getId());
  270.         $role = ($isStudent 'user' 'admin' );
  271.         $stringUtil $this->generalService->getUtil('StringUtil');
  272.         $chatToken $info->token;
  273.         $segments = [];
  274.         $segments[] = $stringUtil->urlSafeB64Encode(json_encode($header));
  275.         $segments[] = $stringUtil->urlSafeB64Encode(json_encode([ 
  276.             "user_id" => $userId 
  277.         ]));
  278.         $signingInput implode('.'$segments);
  279.         $signature hash_hmac('SHA256'$signingInput$chatTokentrue);
  280.         $segments[] = $stringUtil->urlSafeB64Encode($signature);
  281.         $userToken =  implode('.'$segments);
  282.         $fileService $this->generalService->getService('FileService');
  283.         $photo $fileService->getFilePathComplete(
  284.             $this->getUser()->getPhoto(), 
  285.             UserEnum::PATH_PROFILES
  286.             true
  287.             true
  288.         );
  289.         return (object)[
  290.             "role" => $role,
  291.             "userId" => $userId,
  292.             "userFoto" => $photo,
  293.             "userName" => $this->getUser()->getName(),
  294.             "channelId" => $channelId,
  295.             "channelLogo" => "",
  296.             "channelName" => $lesson->getTitle(),
  297.             "userToken" => $userToken,
  298.             "clientId" => $info->client
  299.         ];
  300.     }
  301.     public function getLessonTeacher(Lesson $lesson)
  302.     {
  303.         $userLesson $lesson->getUser();
  304.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  305.         $fileService $this->generalService->getService('FileService');
  306.         $dataImg = [
  307.             "fileName" => $userLesson->getPhoto(),
  308.             "pathConst" => LessonEnum::PATH_PROFILES,
  309.             "option" => "l-user-profile-teacher",
  310.             "addUpload" => true,
  311.             "addStream" => true,
  312.         ];
  313.         $request $this->generalService->getRequest();
  314.         $teacher = (object)[
  315.             "id" => $userLesson->getId(),
  316.             "ip" => $request->getClientIp(),
  317.             "name" => $userLesson->getName(),
  318.             "canAccessAdm" => $userPermissionUtil->canAccessAdm(),
  319.             "document" => $userLesson->getDocument(),
  320.             "username" => $userLesson->getUsername(),
  321.             "photo" => $fileService->getFilePathObj($dataImg),
  322.             "permissionName" => (
  323.                 $userLesson->getUserProfile() ? 
  324.                 $userLesson->getUserProfile()->getName() 
  325.                 : null
  326.             ),
  327.         ];
  328.         return $teacher;
  329.     }
  330.     public function getLessonNextContent(Lesson $lesson, ?LessonLog $lessonLog null)
  331.     {
  332.         $libraryRepository $this->em->getRepository(Library::class);
  333.         $examRepository $this->em->getRepository(Exam::class);
  334.         $nextExamLesson $examRepository->getNextExamIdByLesson($lessontrue);
  335.         $lessonAfter $this->getLessonIdAfterThat($lessontrue);
  336.         $course $lesson->getCourse();
  337.         $courseId $course->getId();
  338.         $isAccessible false;
  339.         $acessMessage null;
  340.         $lessonAfterClass null;
  341.         $nextContent null;
  342.         if($nextExamLesson || $lessonAfter){
  343.             $contentPagesNumber null;
  344.             $contentDuration null;
  345.             $contentType null;
  346.             $contentThumb null;
  347.             if($lessonAfter && empty($nextExamLesson)){
  348.                 $lessonAfterClass $this->find($lessonAfter->id);
  349.                 if($lessonAfterClass){
  350.                     $library $lessonAfterClass->getLibrary();
  351.                     if($library){
  352.                         $contentPagesNumber $library->getPagesNumber();
  353.                         $contentDuration $library->getDuration();
  354.                         $contentType $library->getType();
  355.                         $libraryType = [
  356.                             LibraryEnum::CONTENT_EMBED
  357.                             LibraryEnum::CONTENT_CONFERENCE
  358.                             LibraryEnum::CONTENT_TEXT
  359.                             LibraryEnum::CONTENT_FILES
  360.                         ];
  361.                         if(!in_array($contentType$libraryType)){
  362.                             $contentThumb $libraryRepository->getCover($library);
  363.                         }
  364.                     }
  365.                 }
  366.             }
  367.             if($nextExamLesson){
  368.                 $nextExamLessonClass $examRepository->find($nextExamLesson->id);
  369.                 $infoAccess $examRepository->checkExamIsAccessible($nextExamLessonClass);
  370.                 $isAccessible $infoAccess->isAccessible;
  371.                 $acessMessage $infoAccess->message;
  372.             }else{
  373.                 $enrollmentRepository $this->em->getRepository(Enrollment::class);
  374.                 $courseRepository $this->em->getRepository(Course::class);
  375.                 $enrollment $enrollmentRepository->findOneBy([
  376.                     "user" => $this->getUser()->getId(),
  377.                     "course" => $courseId,
  378.                 ]);
  379.                 if($enrollment){
  380.                     $isStudent $courseRepository->isStudent($course);
  381.                     $infoAccess $this->checkLessonIsAccessibleToUser(
  382.                         $lessonAfterClass
  383.                         $enrollment
  384.                         $lessonLog
  385.                         $isStudent,
  386.                         $lesson->getId()
  387.                     );
  388.                     $isAccessible $infoAccess->isAccessible;
  389.                     $acessMessage $infoAccess->message;
  390.                 }
  391.             }
  392.             $module null;
  393.             if($lessonAfter){
  394.                 $module = (object)[
  395.                     "id" => (int)$lessonAfter->moduleId,
  396.                     "title" => $lessonAfter->moduleTitle,
  397.                 ];
  398.             }
  399.             if($nextExamLesson){
  400.                 $module null;
  401.                 if(!empty($nextExamLesson->moduleId)){
  402.                     $module = (object)[
  403.                         "id" => (int)$nextExamLesson->moduleId,
  404.                         "title" => $nextExamLesson->moduleTitle,
  405.                     ];
  406.                 }
  407.             }
  408.             $timeUtil $this->generalService->getUtil('DateTimeUtil');
  409.             $nextContent = (object)[
  410.                 "id" => (int)($nextExamLesson $nextExamLesson->id $lessonAfter->id),
  411.                 "lessonId" => (
  412.                     $nextExamLesson 
  413.                     $nextExamLesson->lessonId 
  414.                     (int)$lessonAfter->id
  415.                 ),
  416.                 "module" => $module,
  417.                 "courseId" => (
  418.                     $nextExamLesson 
  419.                     $nextExamLesson->courseId 
  420.                     (int)$lessonAfter->courseId
  421.                 ),
  422.                 "title" => ($nextExamLesson $nextExamLesson->title $lessonAfter->title),
  423.                 "type" => (
  424.                     $nextExamLesson 
  425.                     ($nextExamLesson->type == ExamEnum::QUIZ 'quiz' 'exam') : 
  426.                     'lesson'
  427.                 ),
  428.                 "contentPagesNumber" => $contentPagesNumber,
  429.                 "contentDuration" => $contentDuration $timeUtil->timeToSec($contentDuration) : null,
  430.                 "contentType" => $contentType,
  431.                 "contentThumb" => $contentThumb,
  432.                 "isAccessible" => $isAccessible,
  433.                 "acessMessage" => $acessMessage,
  434.             ];
  435.         }
  436.         return $nextContent;
  437.     }
  438.     public function getLessonLastContent(Lesson $lesson)
  439.     {
  440.         $libraryRepository $this->em->getRepository(Library::class);
  441.         $examRepository $this->em->getRepository(Exam::class);
  442.         $lastExamLesson $examRepository->getLastExamIdByLesson($lessontrue);
  443.         $lessonBefore $this->getLessonIdBeforeThat($lessontrue);
  444.         $timeUtil $this->generalService->getUtil('DateTimeUtil');
  445.         $lastContent null;
  446.         if($lastExamLesson || $lessonBefore){
  447.             $contentPagesNumber null;
  448.             $contentDuration null;
  449.             $contentType null;
  450.             $contentThumb null;
  451.             if($lessonBefore && empty($lastExamLesson)){
  452.                 $lessonBeforeClass $this->find($lessonBefore->id);
  453.                 if($lessonBeforeClass){
  454.                     $library $lessonBeforeClass->getLibrary();
  455.                     if($library){
  456.                         $contentPagesNumber $library->getPagesNumber();
  457.                         $contentDuration $library->getDuration();
  458.                         $contentType $library->getType();
  459.                         
  460.                         $libraryType = [
  461.                             LibraryEnum::CONTENT_EMBED
  462.                             LibraryEnum::CONTENT_CONFERENCE
  463.                             LibraryEnum::CONTENT_TEXT
  464.                             LibraryEnum::CONTENT_FILES
  465.                         ];
  466.                         if(!in_array($contentType$libraryType)){
  467.                             $contentThumb $libraryRepository->getCover($library);
  468.                         }
  469.                     }
  470.                 }
  471.             }
  472.             $module = (object)[
  473.                 "id" => (int)$lessonBefore->moduleId,
  474.                 "title" => $lessonBefore->moduleTitle,
  475.             ];
  476.             if($lastExamLesson){
  477.                 $module null;
  478.                 if(!empty($lastExamLesson->moduleId)){
  479.                     $module = (object)[
  480.                         "id" => (int)$lastExamLesson->moduleId,
  481.                         "title" => $lastExamLesson->moduleTitle,
  482.                     ];
  483.                 }
  484.             }
  485.             $lastContent = (object)[
  486.                 "id" => (int)($lastExamLesson $lastExamLesson->id $lessonBefore->id),
  487.                 "lessonId" => (
  488.                     $lastExamLesson 
  489.                     $lastExamLesson->lessonId 
  490.                     (int)$lessonBefore->id
  491.                 ),
  492.                 "module" => $module,
  493.                 "courseId" => (
  494.                     $lastExamLesson 
  495.                     $lastExamLesson->courseId 
  496.                     (int)$lessonBefore->courseId
  497.                 ),
  498.                 "title" => ($lastExamLesson $lastExamLesson->title $lessonBefore->title),
  499.                 "type" => (
  500.                     $lastExamLesson 
  501.                     ($lastExamLesson->type == ExamEnum::QUIZ 'quiz' 'exam') : 
  502.                     'lesson'
  503.                 ),
  504.                 "contentPagesNumber" => $contentPagesNumber,
  505.                 "contentDuration" => $contentDuration $timeUtil->timeToSec($contentDuration) : null,
  506.                 "contentType" => $contentType,
  507.                 "contentThumb" => $contentThumb,
  508.                 "isAccessible" => true,
  509.                 "acessMessage" => null,
  510.             ];
  511.         }
  512.         return $lastContent;
  513.     }
  514.     public function getShowLiveChat(Lesson $lesson, ?bool $isStudent true)
  515.     {   
  516.         $library $lesson->getLibrary();
  517.         if(!$library){
  518.             return LessonEnum::NO;
  519.         }
  520.         if($library->getType() == LibraryEnum::CONTENT_LIVE){
  521.             if($this->configuration->checkModuleIsAbleOnPlan('liveContentFunction')){
  522.                 if($lesson->getShowLiveChat() == LessonEnum::YES){
  523.                     $liveDateStart $library->getLiveStart();
  524.                     $timeLiveEnd date('Y-m-d'strtotime($liveDateStart));
  525.                     $timeLiveStart strtotime($liveDateStart ' - 1 hours'); 
  526.                     $todayDate date('Y-m-d');
  527.                     $timeToday strtotime($todayDate);
  528.                     if(
  529.                         $timeToday >= $timeLiveStart && 
  530.                         $todayDate == $timeLiveEnd || !$isStudent
  531.                     ){
  532.                         return LessonEnum::YES;
  533.                     }
  534.                 }
  535.             }
  536.         }
  537.         return LessonEnum::NO;
  538.     }
  539.     public function findItems(?Course $course)
  540.     {
  541.         $query $this->createQueryBuilder('l');
  542.         if($course){
  543.             $query->andWhere('l.course = :courseId');
  544.             $query->setParameter('courseId'$course->getId());
  545.         }
  546.         return $query->orderBy('l.order''ASC')->getQuery()->getResult();
  547.     }
  548.     public function countLessons()
  549.     {
  550.         $query $this->createQueryBuilder('l');
  551.         $query->select("COUNT(l.id) AS total");
  552.         $query->andWhere('l.deleted != :deleted');
  553.         $query->setParameter('deleted'LessonEnum::ITEM_DELETED);
  554.         $result = (object)$query->getQuery()->getOneOrNullResult();
  555.         return $result->total;
  556.     }
  557.     public function countLessonByLibrary(int $libraryId, ?Lesson $lesson null)
  558.     {
  559.         
  560.         $query $this->createQueryBuilder('l');
  561.         $query->select("COUNT(l.id) AS total");
  562.         $query->andWhere('l.library = :library');
  563.         $query->andWhere('l.deleted != :deleted');
  564.         
  565.         $query->setParameter('deleted'LessonEnum::ITEM_DELETED);
  566.         $query->setParameter('library'$libraryId);
  567.         if(!empty($lesson)){
  568.             $query->andWhere('l.id =! :lessonId');
  569.             $query->setParameter('lessonId'$lesson->getId());
  570.         }
  571.         $result = (object)$query->getQuery()->getOneOrNullResult();
  572.         return $result->total;
  573.     }
  574.     public function countAllLessonByLibraryType(?int $status null, ?int $type null)
  575.     {
  576.         $query $this->createQueryBuilder('l');
  577.         $query->select("COUNT(l.id) AS total");
  578.         if(!is_null($type)){
  579.             $query->innerJoin('EADPlataforma:Library''lb''WITH''lb.id = l.library');
  580.             $query->andWhere('lb.type = :type');
  581.             $query->andWhere('lb.deleted = :deleted');
  582.             $query->setParameter('type'$type);
  583.             $query->setParameter('deleted'LibraryEnum::ITEM_NO_DELETED);
  584.         }
  585.         if(!empty($status)){
  586.             $query->andWhere('l.status = :status');
  587.             $query->setParameter('status'$status);
  588.         }
  589.         $query->andWhere('l.deleted = :deleted');
  590.         $query->setParameter('deleted'LessonEnum::ITEM_NO_DELETED);
  591.         $result = (object)$query->getQuery()->getOneOrNullResult();
  592.         return $result->total;
  593.     }
  594.     public function getAllLessonByLibraryLive(?int $user null)
  595.     {
  596.         $query $this->createQueryBuilder('l');
  597.         $query->innerJoin('EADPlataforma:Course''c''WITH''l.course = c.id');
  598.         $query->innerJoin('EADPlataforma:LessonModule''lm''WITH''l.lessonModule = lm.id');
  599.         $query->innerJoin('EADPlataforma:Library''lb''WITH''lb.id = l.library');
  600.         $query->andWhere('(lb.type = :type OR lb.type = :typeExternalLive)');
  601.         $query->setParameter('type'LibraryEnum::CONTENT_LIVE);
  602.         $query->setParameter('typeExternalLive'LibraryEnum::CONTENT_EXTERNAL_LIVE);
  603.         
  604.         if(!empty($user)){
  605.             
  606.             $query->andWhere('(
  607.                 l.user = :user OR 
  608.                 lm.user = :user OR 
  609.                 c.user = :user
  610.             )');
  611.             $query->setParameter('user'$user);
  612.         }
  613.         $query->andWhere('c.deleted = :deletedCourse');
  614.         $query->andWhere('lm.deleted = :deletedLessonModule');
  615.         $query->andWhere('lb.deleted = :deletedLibrary');
  616.         $query->andWhere('l.deleted = :deleted');
  617.         $query->setParameter('deletedCourse'CourseEnum::ITEM_NO_DELETED);
  618.         $query->setParameter('deletedLessonModule'LessonModuleEnum::ITEM_NO_DELETED);
  619.         $query->setParameter('deletedLibrary'LibraryEnum::ITEM_NO_DELETED);
  620.         $query->setParameter('deleted'LessonEnum::ITEM_NO_DELETED);
  621.         $data $query->getQuery()->getResult();
  622.         return $data;
  623.     }
  624.     public function getAllLessons()
  625.     {
  626.         $query $this->createQueryBuilder('l');
  627.         $query->select('
  628.             l.id AS lessonId,
  629.             c.id AS courseId,
  630.             lm.id AS lessonModuleId,
  631.             l.title AS lessonTitle,
  632.             c.title AS courseTitle,
  633.             lm.title AS lessonModuleTitle
  634.         ');
  635.         $query->innerJoin(
  636.             'EADPlataforma:Course'
  637.             'c'
  638.             'WITH'
  639.             'c.id = l.course AND c.deleted = :courseDeleted'
  640.         );
  641.         $query->innerJoin(
  642.             'EADPlataforma:LessonModule'
  643.             'lm'
  644.             'WITH'
  645.             'lm.id = l.lessonModule AND lm.deleted = :lessonModuleDeleted'
  646.         );
  647.         $query->andWhere('l.deleted = :lessonDeleted');
  648.         $query->setParameter('courseDeleted'CourseEnum::ITEM_NO_DELETED);
  649.         $query->setParameter('lessonModuleDeleted'LessonModuleEnum::ITEM_NO_DELETED);
  650.         $query->setParameter('lessonDeleted'LessonEnum::ITEM_NO_DELETED);
  651.         $query->addOrderBy('c.order''ASC');
  652.         $query->addOrderBy('lm.order''ASC');
  653.         $query->addOrderBy('l.order''ASC');
  654.         $data $query->getQuery()->getResult();
  655.         return $data;
  656.     }
  657.     public function getLessonPublicDemoById(int $lessonId)
  658.     {
  659.         $query $this->createQueryBuilder('l');
  660.         $query->innerJoin(
  661.             'EADPlataforma:LessonModule'
  662.             'lm'
  663.             'WITH'
  664.             'lm.id = l.lessonModule AND lm.deleted = 0'
  665.         );
  666.         $query->innerJoin(
  667.             'EADPlataforma:Course'
  668.             'c'
  669.             'WITH'
  670.             'c.id = l.course AND c.deleted = 0'
  671.         );
  672.         $query->andWhere('l.deleted = 0');
  673.         $query->andWhere('l.id = :lessonId');
  674.         $query->andWhere('l.demonstration = :demonstration');
  675.         $query->andWhere('c.status = :courseStatus');
  676.         $query->andWhere('l.status = :lessonStatus');
  677.         $query->andWhere('lm.status = :lessonModuleStatus');
  678.         $query->setParameter('lessonId'$lessonId);
  679.         $query->setParameter('demonstration'LessonEnum::YES);
  680.         $query->setParameter('courseStatus'CourseEnum::PUBLISHED);
  681.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  682.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  683.         $data $query->getQuery()->getOneOrNullResult();
  684.         return $data;
  685.     }
  686.     public function isLessonTeacher(Lesson $lessonUser $user)
  687.     {
  688.         if(!$lesson->getCourse()){
  689.             return false;
  690.         }
  691.         if(!$lesson->getLessonModule()){
  692.             return false;
  693.         }
  694.         $courseTeacherId $lesson->getCourse()->getUser()->getId();
  695.         $lessonModuleTeacherId $lesson->getLessonModule()->getUser()->getId();
  696.         $lessonTeacherId $lesson->getUser()->getId();
  697.         if(
  698.             $courseTeacherId == $user->getId() || 
  699.             $lessonModuleTeacherId == $user->getId() || 
  700.             $lessonTeacherId == $user->getId()
  701.         ){
  702.             return true;
  703.         }
  704.         return false;
  705.     }
  706.     public function checkLessonIsAccessibleToUser(
  707.         Lesson $lesson
  708.         Enrollment $enrollment
  709.         ?LessonLog $log null
  710.         ?bool $isStudent true,
  711.         ?int $lessonIdBefore null,
  712.         ?bool $blockIsNotAccess false
  713.     )
  714.     {
  715.         $info = (object)[
  716.             "isAccessible" => false,
  717.             "isAccessPeriodExpired" => false,
  718.             "message" => null,
  719.         ];
  720.         if(!$this->getUser()){
  721.             $info->message $this->configuration->getLanguage('error_auth''lesson_view_error');
  722.             return $info;
  723.         }
  724.         $user $enrollment->getUser();
  725.         $course $lesson->getCourse();
  726.         $lessonModule $lesson->getLessonModule();
  727.         $today strtotime('now');
  728.         if(!$isStudent){
  729.             $info->isAccessible true;
  730.             return $info;
  731.         }
  732.         if(!$enrollment){
  733.             $info->message $this->configuration->getLanguage(
  734.                 'error_enrollment_not_found',
  735.                 'lesson_view'
  736.             );
  737.             return $info;
  738.         }
  739.         if(
  740.             $lesson->getStatus() == LessonEnum::DRAFT ||
  741.             $lessonModule->getStatus() == LessonModuleEnum::DRAFT ||
  742.             $course->getStatus() == CourseEnum::DRAFT
  743.         ){
  744.             $info->message $this->configuration->getLanguage(
  745.                 'error_unavailable',
  746.                 'lesson_view'
  747.             );
  748.             return $info;
  749.         }
  750.         if($enrollment->getStatus(falsetrue) == EnrollmentEnum::STATUS_EXPIRED){
  751.             
  752.             $info->message $this->configuration->getLanguage(
  753.                 'error_enrollment_expired'
  754.                 'lesson_view_error'
  755.             );
  756.             return $info;
  757.         }
  758.         $courseDateRelease strtotime($course->getDateRelease());
  759.         if($courseDateRelease >= $today){
  760.             $info->message "{$this->configuration->getLanguage(
  761.                 'error_date_release'
  762.                 'lesson_view_error'
  763.             )} {$course->getDateRelease('d/m/Y')}";
  764.             return $info;
  765.         }
  766.         $lessonModuleRepository $this->em->getRepository(LessonModule::class);
  767.         $moduleInfo $lessonModuleRepository->checkLessonModuleIsAccessibleToUser(
  768.             $lessonModule
  769.             $enrollment
  770.             $isStudent,
  771.             $lessonIdBefore
  772.         );
  773.         
  774.         if(!$moduleInfo->isAccessible) {
  775.             return $moduleInfo;
  776.         }
  777.         $unlimitedexamFunction $this->configuration->checkModuleIsAbleOnPlan(
  778.             'unlimitedExamFunction'
  779.         );
  780.         $hasLessonControl $this->configuration->checkModuleIsAbleOnPlan(
  781.             'lessonControlFunction'
  782.         );
  783.         $examModule $this->configuration->isModuleActive("exam_module");
  784.         if(!$hasLessonControl){
  785.             $info->isAccessible true;
  786.             return $info;
  787.         }
  788.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  789.         if(empty($log)){
  790.             $logLessonId "{$course->getId()}#{$user->getId()}#{$lesson->getId()}";
  791.             $log $lessonLogRepository->find($logLessonId);
  792.         }
  793.         if($log && !empty($log->getDateConclusion())){
  794.             $info->isAccessible true;
  795.             $periodEnd $lesson->getControlClosePeriod();
  796.             if(!empty($periodEnd)){
  797.                 $dateEnd strtotime("{$log->getDateConclusion()} + {$periodEnd} days");
  798.                 if($dateEnd $today){                    
  799.                     $info->isAccessible false;
  800.                     $info->isAccessPeriodExpired true;
  801.                 }
  802.             }
  803.             return $info;
  804.         }
  805.         if($blockIsNotAccess){
  806.             $info->message $this->configuration->getLanguage(
  807.                 'error_required_incomplete'
  808.                 'lesson_view_error'
  809.             );
  810.             return $info;
  811.         }
  812.         if($examModule){
  813.             if($log && empty($log->getDateConclusion()) || !$log){
  814.                 $examUserRepository $this->em->getRepository(ExamUser::class);
  815.                 $currentExam $examUserRepository->getCurrentExamOnCourseToUserByLesson(
  816.                     $lesson
  817.                     $user
  818.                 );
  819.                 if($currentExam){
  820.                     if($unlimitedexamFunction){
  821.                         //check the exam type
  822.                         if($currentExam->getType() == ExamEnum::LESSON){
  823.                             $lessonExam $currentExam->getLesson();
  824.                             $lessonModuleExam $lessonExam->getLessonModule();
  825.                             //if exam is from this lesson redirect to exam
  826.                             if($lessonExam->getId() != $lesson->getId()){
  827.                                 //if the exam is from a module before that redirect to exam
  828.                                 if($lessonModuleExam->getOrder() < $lessonModule->getOrder()){
  829.                                     $info->message $this->configuration->getLanguage(
  830.                                         'error_required_incomplete'
  831.                                         'lesson_view_error'
  832.                                     );
  833.                                     return $info;
  834.                                 }else if(
  835.                                     $lessonExam->getOrder() < $lesson->getOrder() && 
  836.                                     $lessonModuleExam->getId() == $lessonModule->getId()
  837.                                 ){ //if is the same module but the lesson is before that rediret to exam
  838.                                     $info->message $this->configuration->getLanguage(
  839.                                         'error_required_incomplete'
  840.                                         'lesson_view_error'
  841.                                     );
  842.                                     return $info;
  843.                                 }
  844.                             }
  845.                         }else if($currentExam->getType() == ExamEnum::MODULE){
  846.                             $lessonModuleExam $currentExam->getLessonModule();
  847.                             
  848.                             if(
  849.                                 $lessonModuleExam->getId() != $lessonModule->getId() && 
  850.                                 $lessonModuleExam->getOrder() < $lessonModule->getOrder()
  851.                             ){ //if is not the same module and the module is before that rediret to exam
  852.                                 $info->message $this->configuration->getLanguage(
  853.                                     'error_required_incomplete'
  854.                                     'lesson_view_error'
  855.                                 );
  856.                                 return $info;
  857.                             }
  858.                         }
  859.                     }
  860.                     if($currentExam->getType() == ExamEnum::COURSE){
  861.                         $info->message $this->configuration->getLanguage(
  862.                             'error_required_incomplete'
  863.                             'lesson_view_error'
  864.                         );
  865.                         return $info;
  866.                     }
  867.                 }
  868.                 if($unlimitedexamFunction){
  869.                     $examRepository $this->em->getRepository(Exam::class);
  870.                     $exam $examRepository->getCurrentNotStartedExamUser(
  871.                         $lesson
  872.                         $user
  873.                     );
  874.                     if($exam){
  875.                         $lessonExam $exam->getLesson();
  876.                         if(!$lessonExam || $lessonExam->getId() != $lesson->getId()){
  877.                             $info->message $this->configuration->getLanguage(
  878.                                 'error_required_incomplete'
  879.                                 'lesson_view_error'
  880.                             );
  881.                             return $info;
  882.                         }
  883.                     }
  884.                 }
  885.             }
  886.         }
  887.         //if exist a lesson with requirement before that redirect to there
  888.         $currentLesson $this->getCurrentLesson($lesson$user);
  889.         if(!empty($currentLesson)){
  890.             if($currentLesson->getId() != $lesson->getId()){
  891.                 $logId "{$course->getId()}#{$user->getId()}#{$currentLesson->getId()}";
  892.                 $logCurrent $lessonLogRepository->find($logId);
  893.                 if(empty($logCurrent)){
  894.                     $info->message $this->configuration->getLanguage(
  895.                         'error_required_incomplete'
  896.                         'lesson_view_error'
  897.                     );
  898.                     return $info;
  899.                 }else if(empty($logCurrent->getDateConclusion())){
  900.                     $info->message $this->configuration->getLanguage(
  901.                         'error_required_incomplete'
  902.                         'lesson_view_error'
  903.                     );
  904.                     return $info;
  905.                 }
  906.             }
  907.         }
  908.         if($lesson->getControlReleaseType() == LessonEnum::RELEASED){
  909.             $info->isAccessible true;
  910.             return $info;
  911.         }else if($lesson->getControlReleaseType() == LessonEnum::FIXED_DATE){
  912.             $controlDateRelease $lesson->getControlDateRelease();
  913.             $time strtotime($controlDateRelease);
  914.             $todaySeconds strtotime(date('Y-m-d H:i:s'));
  915.            
  916.             $controlClosePeriod $lesson->getControlClosePeriod();
  917.             if(!empty($controlClosePeriod)){
  918.                 $timeLog strtotime(
  919.                     "{$controlDateRelease} + {$controlClosePeriod} day"
  920.                 );
  921.                 if($todaySeconds $timeLog){
  922.                     $timeLogText date('d/m/Y H:i:s'$timeLog);
  923.                     $info->message "{$this->configuration->getLanguage(
  924.                         'error_date_end'
  925.                         'lesson_view_error'
  926.                     )} {$timeLogText}";
  927.                     return $info;
  928.                 }
  929.             }
  930.            
  931.             if($today >= $time){
  932.                 $info->isAccessible true;
  933.                 return $info;
  934.             }
  935.             $timeText date('d/m/Y H:i:s'$time);
  936.                         
  937.             $info->message "{$this->configuration->getLanguage(
  938.                 'error_date_release'
  939.                 'lesson_view_error'
  940.             )} {$timeText}";
  941.             return $info;
  942.         }else if($lesson->getControlReleaseType() == LessonEnum::FLEXIBLE_DATE){
  943.             $controlReleasePeriod $lesson->getControlReleasePeriod();
  944.             if($lesson->getControlReleaseAfterType() == LessonEnum::ENROLLMENT){
  945.                 $time strtotime(
  946.                     "{$enrollment->getDateRegister()} + {$controlReleasePeriod} day"
  947.                 );
  948.                 
  949.                 $todaySeconds strtotime(date('Y-m-d H:i:s'));
  950.                 $controlClosePeriod $lesson->getControlClosePeriod();
  951.                 if(!empty($controlClosePeriod)){
  952.                     
  953.                     /*
  954.                     if($log && empty($log->getDateConclusion()) || !$log){
  955.                         return false;
  956.                     }
  957.                     
  958.                     if($log->getComplete() == LessonEnum::NO){
  959.                         return false;
  960.                     }*/
  961.                     if($log && !empty($log->getDateConclusion())){
  962.                         $timeLog strtotime(
  963.                             "{$log->getDateConclusion()} + {$controlClosePeriod} day"
  964.                         );
  965.                         if($todaySeconds $timeLog){
  966.                             $timeLogText date('d/m/Y H:i:s'$timeLog);
  967.                             $info->message "{$this->configuration->getLanguage(
  968.                                 'error_date_end'
  969.                                 'lesson_view_error'
  970.                             )} {$timeLogText}";
  971.                             return $info;
  972.                         }
  973.                     }
  974.                 }
  975.                 
  976.                 if($today >= $time){
  977.                     $info->isAccessible true;
  978.                     return $info;
  979.                 }
  980.                 $timeText date('d/m/Y H:i:s'$time);
  981.                         
  982.                 $info->message "{$this->configuration->getLanguage(
  983.                     'error_date_release'
  984.                     'lesson_view_error'
  985.                 )} {$timeText}";
  986.                 return $info;
  987.             }else if(
  988.                 $lesson->getControlReleaseAfterType() == LessonEnum::LAST_LESSON && 
  989.                 !empty($lessonIdBefore)
  990.             ){
  991.                 $logId "{$course->getId()}#{$user->getId()}#{$lessonIdBefore}";
  992.                 $logLast $lessonLogRepository->find($logId);
  993.                 
  994.                 if($logLast && !empty($logLast->getDateConclusion())){
  995.                     $time strtotime(
  996.                         "{$logLast->getDateConclusion()} + {$controlReleasePeriod} day"
  997.                     );
  998.                     if($today >= $time){
  999.                         $info->isAccessible true;
  1000.                         return $info;
  1001.                     }
  1002.                 }
  1003.             }
  1004.         }
  1005.         $info->message $this->configuration->getLanguage('error_unavailable''lesson_view_error');
  1006.         return $info;
  1007.     }
  1008.     public function getLessonDateReleaseAccess(
  1009.         Lesson $lesson
  1010.         Enrollment $enrollment
  1011.         ?bool $isStudent true
  1012.         ?int $lessonIdBefore null
  1013.     )
  1014.     {
  1015.         $date date('Y-m-d H:i:s');
  1016.         if(!$this->getUser()){
  1017.             return $date;
  1018.         }
  1019.         $user $enrollment->getUser();
  1020.         $course $lesson->getCourse();
  1021.         $today strtotime('now');
  1022.         if(!$isStudent){
  1023.             return $date;
  1024.         }
  1025.         if(!$enrollment){
  1026.             return $date;
  1027.         }
  1028.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  1029.         if($lesson->getStatus() == LessonEnum::PUBLISHED){
  1030.             if($lesson->getControlReleaseType() == LessonEnum::RELEASED){
  1031.                 return $date;
  1032.             }else if($lesson->getControlReleaseType() == LessonEnum::FIXED_DATE){
  1033.                 return $lesson->getControlDateRelease();
  1034.             }else if($lesson->getControlReleaseType() == LessonEnum::FLEXIBLE_DATE){
  1035.                 $controlReleasePeriod $lesson->getControlReleasePeriod();
  1036.                 if($lesson->getControlReleaseAfterType() == LessonEnum::ENROLLMENT){
  1037.                     $time strtotime(
  1038.                         "{$enrollment->getDateRegister()} + {$controlReleasePeriod} day"
  1039.                     );
  1040.                     return date('Y-m-d H:i:s'$time);
  1041.                 }else if(
  1042.                     $lesson->getControlReleaseAfterType() == LessonEnum::LAST_LESSON && 
  1043.                     !empty($lessonIdBefore)
  1044.                 ){
  1045.                     $logId "{$course->getId()}#{$user->getId()}#{$lessonIdBefore}";
  1046.                     $logLast $lessonLogRepository->find($logId);
  1047.                     if($logLast){
  1048.                         $time strtotime(
  1049.                             "{$logLast->getDateConclusion()} + {$controlReleasePeriod} day"
  1050.                         );
  1051.                         return date('Y-m-d H:i:s'$time);
  1052.                     }
  1053.                 }
  1054.             }
  1055.         }
  1056.         return $date;
  1057.     }
  1058.     public function getCurrentLessonLogOrigin(Lesson $lessonBase)
  1059.     {
  1060.         $course $lessonBase->getCourse();
  1061.         $lessonModule $lessonBase->getLessonModule();
  1062.         $query $this->createQueryBuilder('l');
  1063.         $query->select('l.id');
  1064.         $query->innerJoin(
  1065.             'EADPlataforma:LessonModule'
  1066.             'lm'
  1067.             'WITH'
  1068.             'lm.id = l.lessonModule'
  1069.         );
  1070.         $query->leftJoin(
  1071.             'EADPlataforma:LessonLogOrigin'
  1072.             'lg'
  1073.             'WITH'
  1074.             'lg.lesson = l.id AND lg.user = :user'
  1075.         );
  1076.         $query->andWhere('l.deleted = 0');
  1077.         $query->andWhere('lm.deleted = 0');
  1078.         $query->andWhere('l.controlRequirement = :requirement');
  1079.         $query->andWhere('l.status = :lessonStatus');
  1080.         $query->andWhere('lm.status = :lessonModuleStatus');
  1081.         $query->andWhere('l.course = :course');
  1082.         if($lessonBase->getOrder() == LessonEnum::YES){
  1083.             $query->andWhere('(
  1084.                 ( l.order <= :orderL AND lm.order = :orderLM ) OR ( lm.order < :orderLM )
  1085.             )');
  1086.         }else{
  1087.             $query->andWhere('(
  1088.                 ( l.order < :orderL AND lm.order = :orderLM ) OR ( lm.order < :orderLM )
  1089.             )');
  1090.         }
  1091.         $query->andWhere('lg.dateConclusion IS NULL');
  1092.         $query->setParameter('user'$this->getUser()->getId());
  1093.         $query->setParameter('course'$lessonBase->getCourse()->getId());
  1094.         $query->setParameter('requirement'LessonEnum::YES);
  1095.         $query->setParameter('orderL'$lessonBase->getOrder());
  1096.         $query->setParameter('orderLM'$lessonModule->getOrder());
  1097.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1098.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1099.         $query->addOrderBy('lm.order''ASC');
  1100.         $query->addOrderBy('l.order''ASC');
  1101.         $query->setMaxResults(1);
  1102.         $lesson = (object)$query->getQuery()->getOneOrNullResult();
  1103.         if(!empty($lesson->id)){
  1104.             return $this->findOneBy([ "id" => $lesson->id ]);
  1105.         }
  1106.         return;
  1107.     }
  1108.     public function getCurrentLesson(Lesson $lessonBaseUser $user)
  1109.     {
  1110.         $course $lessonBase->getCourse();
  1111.         $lessonModule $lessonBase->getLessonModule();
  1112.         $query $this->createQueryBuilder('l');
  1113.         $query->select('l.id');
  1114.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = l.course');
  1115.         $query->innerJoin(
  1116.             'EADPlataforma:LessonModule''lm''WITH''lm.id = l.lessonModule'
  1117.         );
  1118.         $query->innerJoin('EADPlataforma:Library''lb''WITH''lb.id = l.library');
  1119.         
  1120.         $query->andWhere('c.deleted = 0');
  1121.         $query->andWhere('l.deleted = 0');
  1122.         $query->andWhere('lm.deleted = 0');
  1123.         $query->andWhere('lb.deleted = 0');
  1124.         $query->andWhere('l.controlRequirement = :requirement');
  1125.         $query->andWhere('l.status = :lessonStatus');
  1126.         $query->andWhere('lm.status = :lessonModuleStatus');
  1127.         $query->andWhere('l.course = :course');
  1128.         $query->andWhere('l.id != :lessonBase');
  1129.         if($lessonBase->getOrder() == LessonEnum::YES){
  1130.             $query->andWhere('(
  1131.                 ( l.order <= :orderL AND lm.order = :orderLM ) OR ( lm.order < :orderLM )
  1132.             )');
  1133.         }else{
  1134.             $query->andWhere('(
  1135.                 ( l.order < :orderL AND lm.order = :orderLM ) OR ( lm.order < :orderLM )
  1136.             )');
  1137.         }
  1138.         $query->setParameter('course'$lessonBase->getCourse()->getId());
  1139.         $query->setParameter('requirement'LessonEnum::YES);
  1140.         $query->setParameter('orderL'$lessonBase->getOrder());
  1141.         $query->setParameter('orderLM'$lessonModule->getOrder());
  1142.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1143.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1144.         $query->setParameter('lessonBase'$lessonBase->getId());
  1145.         $query->addOrderBy('lm.order''DESC');
  1146.         $query->addOrderBy('l.order''DESC');
  1147.         $query->setMaxResults(1);
  1148.         $lesson = (object)$query->getQuery()->getOneOrNullResult();
  1149.         if(!empty($lesson->id)){
  1150.             $logId "{$course->getId()}#{$user->getId()}#{$lesson->id}";
  1151.             $log $this->emEadmin->getRepository(LessonLog::class)->find($logId);
  1152.             if(!$log || ($log && empty($log->getDateConclusion()))){
  1153.                 return $this->findOneBy([ "id" => $lesson->id ]);
  1154.             }
  1155.         }
  1156.         return;
  1157.     }
  1158.     public function getCourseLessonsIds(
  1159.         Course $course
  1160.         ?LessonModule $lessonModule null
  1161.         ?string $searchText null
  1162.     )
  1163.     {
  1164.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1165.         $permission $userPermissionUtil->getPermission("course""see");
  1166.         $user $userPermissionUtil->getUser();
  1167.         $lessonModuleId = ($lessonModule $lessonModule->getId() : null);
  1168.         $keyCache md5(
  1169.             "getCourseLessonsIds{$course->getId()}-{$user->getId()}-{$lessonModuleId}"
  1170.         );
  1171.         if(isset($this->lessonIdsCourse[$keyCache])){
  1172.             return $this->lessonIdsCourse[$keyCache];
  1173.         }
  1174.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1175.             $course
  1176.             $user
  1177.         );
  1178.         
  1179.         $query $this->createQueryBuilder('l');
  1180.         $query->select('
  1181.             l.id, 
  1182.             l.title,
  1183.             IDENTITY(l.course) AS courseId,
  1184.             IDENTITY(l.lessonModule) AS moduleId,
  1185.             lm.title AS moduleTitle
  1186.         ');
  1187.         $query->innerJoin(
  1188.             'EADPlataforma:LessonModule''lm''WITH''lm.id = l.lessonModule'
  1189.         );
  1190.         if(!empty($searchText)){
  1191.             $query->andWhere('l.title LIKE :searchText');
  1192.             $query->setParameter('searchText'"%{$searchText}%");
  1193.         }
  1194.         $query->andWhere('l.deleted = 0');
  1195.         $query->andWhere('lm.deleted = 0');
  1196.         $query->andWhere('l.course = :courseId');
  1197.         $query->setParameter('courseId'$course->getId());
  1198.         if($lessonModule){
  1199.             $query->andWhere('l.lessonModule = :lessonModuleId');
  1200.             $query->setParameter('lessonModuleId'$lessonModule->getId());
  1201.         }
  1202.         if(
  1203.             $userPermissionUtil->isLow($permission) || 
  1204.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1205.         ){
  1206.             $query->andWhere('l.status = :lessonStatus');
  1207.             $query->andWhere('lm.status = :lessonModuleStatus');
  1208.             $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1209.             $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1210.         }
  1211.         
  1212.         $query->addOrderBy('lm.order''ASC');
  1213.         $query->addOrderBy('l.order''ASC');
  1214.         
  1215.         $data $query->getQuery()->execute();
  1216.         $this->lessonIdsCourse[$keyCache] = $data;
  1217.         return $this->lessonIdsCourse[$keyCache];
  1218.     }
  1219.     public function getLessonIdBeforeThat(Lesson $lessonBasebool $complete false)
  1220.     {
  1221.         $lessons $this->getCourseLessonsIds($lessonBase->getCourse());
  1222.         foreach ($lessons as $key => $lesson) {
  1223.             $lesson = (object)$lesson;
  1224.             if($lesson->id == $lessonBase->getId()){
  1225.                 if($key == 0){
  1226.                     return;
  1227.                 }else{
  1228.                     $obj = (object)$lessons[$key-1];
  1229.                     if($complete){
  1230.                         return $obj;
  1231.                     }
  1232.                     
  1233.                     return $obj->id;
  1234.                 }
  1235.             }
  1236.         }
  1237.         return;
  1238.     }
  1239.     public function getLessonIdAfterThat(Lesson $lessonBasebool $complete false)
  1240.     {
  1241.         $lessons $this->getCourseLessonsIds($lessonBase->getCourse());
  1242.         $maxPosition count($lessons) - 1;
  1243.         foreach ($lessons as $key => $lesson) {
  1244.             $lesson = (object)$lesson;
  1245.             if($lesson->id == $lessonBase->getId()){
  1246.                 if($key == $maxPosition){
  1247.                     return;
  1248.                 }else{
  1249.                     $obj = (object)$lessons[$key+1];
  1250.                     if($complete){
  1251.                         return $obj;
  1252.                     }
  1253.                     return $obj->id;
  1254.                 }
  1255.             }
  1256.         }
  1257.         return;
  1258.     }
  1259.     public function refreshOrder(
  1260.         $courseId
  1261.         $lessonModuleId
  1262.         $oldOrder
  1263.         $newOrder
  1264.         $isDelete false
  1265.     )
  1266.     {
  1267.         $sql "UPDATE EADPlataforma:Lesson AS l 
  1268.                 SET l.order = l.order - 1 
  1269.                 WHERE l.order > :oldOrder
  1270.                 AND l.deleted = 0
  1271.                 AND l.course = :courseId
  1272.                 AND l.lessonModule = :lessonModuleId ";
  1273.         
  1274.         $query $this->em->createQuery($sql);
  1275.         $query->setParameter('oldOrder'$oldOrder);
  1276.         $query->setParameter('courseId'$courseId);
  1277.         $query->setParameter('lessonModuleId'$lessonModuleId);
  1278.         
  1279.         $query->execute();
  1280.         if(!$isDelete){
  1281.             $sql "UPDATE EADPlataforma:Lesson AS l 
  1282.                     SET l.order = l.order + 1 
  1283.                     WHERE l.order >= :newOrder
  1284.                     AND l.deleted = 0
  1285.                     AND l.course = :courseId
  1286.                     AND l.lessonModule = :lessonModuleId ";
  1287.             $query $this->em->createQuery($sql);
  1288.             
  1289.             $query->setParameter('newOrder'$newOrder);
  1290.             $query->setParameter('courseId'$courseId);
  1291.             $query->setParameter('lessonModuleId'$lessonModuleId);
  1292.             $query->execute();
  1293.         }
  1294.     }
  1295.     public function copyLesson(
  1296.         LessonModule $newModule
  1297.         Lesson $lesson
  1298.         $isPartial false,
  1299.         $isModulePartial false
  1300.         $copyType null
  1301.     )
  1302.     {
  1303.         $course $newModule->getCourse();
  1304.         $courseId $course->getId();
  1305.     
  1306.         $newLesson = clone $lesson;
  1307.         $newLesson->setLessonModule($newModule);
  1308.         $newLesson->setCourse($course);
  1309.         if($copyType == LessonEnum::COPY_PUBLISHED){
  1310.             $newLesson->setStatus(LessonEnum::PUBLISHED);
  1311.         }else if($copyType == LessonEnum::COPY_DRAFT){
  1312.             $newLesson->setStatus(LessonEnum::DRAFT);
  1313.         }
  1314.         
  1315.         if($isPartial){
  1316.             $lastOrder $this->count([ 
  1317.                 "course" => $courseId,
  1318.                 "lessonModule" => $newModule->getId(),
  1319.                 "deleted" => LessonEnum::ITEM_NO_DELETED 
  1320.             ]);
  1321.             $newLesson->setOrder($lastOrder 1);
  1322.         }
  1323.         $this->em->persist($newLesson);
  1324.         $this->em->flush();
  1325.         if($isPartial || $isModulePartial){
  1326.             $userLessonId $newLesson->getUser()->getId();
  1327.             $courseTeam $this->em->getRepository(CourseTeam::class)->findOneBy([
  1328.                 "course" => $courseId
  1329.                 "user" => $userLessonId,
  1330.                 "deleted" => LessonEnum::ITEM_NO_DELETED
  1331.             ]);
  1332.             
  1333.             if(!$courseTeam){
  1334.                 $newCourseTeam = new CourseTeam();
  1335.                 $newCourseTeam->setCourse($course);
  1336.                 $newCourseTeam->setUser($newLesson->getUser());
  1337.                 $this->em->persist($newCourseTeam);
  1338.                 $this->em->flush();
  1339.             }
  1340.         }
  1341.         
  1342.         $files $this->em->getRepository(LessonXLibrary::class)->findBy([
  1343.             "lesson"=> $lesson->getId(),
  1344.             "deleted"=> LessonXLibraryEnum::ITEM_NO_DELETED
  1345.         ]);
  1346.         
  1347.         if($files){
  1348.             foreach ($files as $key => $file) {
  1349.                 $newFile = clone $file;
  1350.                 $newFile->setLesson($newLesson);
  1351.                 
  1352.                 $this->em->persist($newFile);
  1353.                 $this->em->flush();
  1354.             }
  1355.         }
  1356.         
  1357.         $this->em->getRepository(Exam::class)->copyExamByLesson($lesson$newLesson);
  1358.         $this->em->getRepository(Exam::class)->copyQuizByLesson($lesson$newLesson);
  1359.     }
  1360.     public function notifyStudentsLesson(Lesson $lesson$type)
  1361.     {   
  1362.         if(!$this->configuration->checkModuleIsAbleOnPlan('notificationFunction')){
  1363.             return;
  1364.         }
  1365.         $today date('Y-m-d');
  1366.         $dateLastNotify $lesson->getDateLastNotify('Y-m-d');
  1367.         if($today != $dateLastNotify && $lesson->getStatus() == LessonEnum::PUBLISHED){
  1368.             $course $lesson->getCourse();
  1369.             $lessonModule $lesson->getLessonModule();
  1370.             if(
  1371.                 $course->getStatus() == CourseEnum::PUBLISHED && 
  1372.                 $lessonModule->getStatus() == LessonModuleEnum::PUBLISHED
  1373.             ){
  1374.                 $taskQueueService $this->generalService->getService('TaskQueueService');
  1375.                 $enrollmentRepository $this->em->getRepository(Enrollment::class);
  1376.                 
  1377.                 $enrollments $enrollmentRepository->getEnrollmentsByCourse(
  1378.                     $course->getId(), 
  1379.                     EnrollmentEnum::STATUS_ACTIVE
  1380.                 );
  1381.                 foreach ($enrollments as $key => $enrollment) {
  1382.                     $taskQueueService->insert($type$enrollment->getUser(), $lesson->getId());
  1383.                 }
  1384.                 $lesson->setDateLastNotify(date('Y-m-d H:i:s'));
  1385.                 $this->em->flush();
  1386.             }
  1387.         }
  1388.     }
  1389.     public function lessonUpdateOrder($modules)
  1390.     {
  1391.         $dqlModule "UPDATE EADPlataforma:LessonModule AS lm SET lm.order = CASE";
  1392.         $idModules "";
  1393.         $dqlExam "";
  1394.         $newModuleId "";
  1395.         $whereExam "";
  1396.         $caseLesson1 " l.order = CASE ";
  1397.         $caseLesson2 " l.lessonModule = CASE ";
  1398.         $caseLesson3 " e.lessonModule = CASE ";
  1399.         $idsLesson "";
  1400.         foreach ($modules as $key => $value) {
  1401.             
  1402.             $orderNew $key 1;
  1403.             $dqlModule .= " WHEN lm.id = {$value->moduleId} THEN {$orderNew}";
  1404.             if(empty($idModules)){
  1405.                 $idModules .= "{$value->moduleId}";
  1406.             }else{
  1407.                 $idModules .= ", {$value->moduleId}";
  1408.             }
  1409.             foreach ($value->lessons as $key_lesson => $valLesson) {
  1410.                 if(!empty($valLesson->lessonId)){
  1411.                     $ordemNewLesson $key_lesson 1;
  1412.                 
  1413.                     $caseLesson1 .= " WHEN l.id = {$valLesson->lessonId} THEN {$ordemNewLesson}";
  1414.                     $caseLesson2 .= " WHEN l.id = {$valLesson->lessonId} THEN {$value->moduleId}";
  1415.                     $caseLesson3 .= " WHEN e.lesson = {$valLesson->lessonId} THEN {$value->moduleId}";
  1416.                 
  1417.                     if(empty($idsLesson)){
  1418.                         $idsLesson .= {$valLesson->lessonId} ";
  1419.                     }else{
  1420.                         $idsLesson .= ", {$valLesson->lessonId} ";
  1421.                     }
  1422.                 }
  1423.             }
  1424.         }
  1425.         
  1426.         $dqlModule .= " ELSE lm.order END WHERE lm.id IN ({$idModules}) ";
  1427.         $dqlLesson "UPDATE EADPlataforma:Lesson AS l 
  1428.                       SET {$caseLesson1} ELSE l.order END, 
  1429.                           {$caseLesson2} ELSE IDENTITY(l.lessonModule) END 
  1430.                      WHERE l.id IN ({$idsLesson}) ";
  1431.         $dqlExam "UPDATE EADPlataforma:Exam AS e
  1432.                     SET {$caseLesson3} ELSE IDENTITY(e.lessonModule) END 
  1433.                     WHERE e.lesson IN ({$idsLesson}) ";
  1434.         $query $this->em->createQuery($dqlModule);
  1435.         $queryLesson $this->em->createQuery($dqlLesson);
  1436.         $queryExam $this->em->createQuery($dqlExam);
  1437.         $query->execute();
  1438.         $queryLesson->execute();
  1439.         $queryExam->execute();
  1440.     }
  1441.     public function getLessonPublicNumber(
  1442.         Course $course
  1443.         ?LessonModule $lessonModule null,
  1444.         ?bool $required false
  1445.         ?bool $filterModule false
  1446.     )
  1447.     {
  1448.         $query $this->createQueryBuilder('l');
  1449.         $query->select('COUNT(l.id) AS total');
  1450.         $query->innerJoin(
  1451.             'EADPlataforma:LessonModule'
  1452.             'lm'
  1453.             'WITH'
  1454.             'lm.id = l.lessonModule AND lm.deleted = :deleted'
  1455.         );
  1456.         $query->innerJoin(
  1457.             'EADPlataforma:Course'
  1458.             'c'
  1459.             'WITH'
  1460.             'c.id = l.course AND c.deleted = :deleted'
  1461.         );
  1462.         if($lessonModule){
  1463.             $query->andWhere('lm.order <= :lessonModuleOrder');
  1464.             $query->setParameter('lessonModuleOrder'$lessonModule->getOrder());
  1465.             if($filterModule){
  1466.                 $query->andWhere('lm.id = :lessonModule');
  1467.                 $query->setParameter('lessonModule'$lessonModule->getId());
  1468.             }
  1469.         }
  1470.         if($required){
  1471.             $query->andWhere('l.controlRequirement = :required');
  1472.             $query->setParameter('required'LessonEnum::YES);
  1473.         }
  1474.         $query->andWhere('l.deleted = :deleted');
  1475.         $query->andWhere('l.course = :courseId');
  1476.         $query->andWhere('l.status = :lessonStatus');
  1477.         $query->andWhere('lm.status = :lessonModuleStatus');
  1478.         
  1479.         $query->setParameter('courseId'$course->getId());
  1480.         $query->setParameter('deleted'LessonEnum::ITEM_NO_DELETED);
  1481.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1482.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1483.         $query->setMaxResults(1);
  1484.         $result = (object)$query->getQuery()->getOneOrNullResult();
  1485.         return $result->total;
  1486.     }
  1487.     public function countCourseLessons(
  1488.         Course $course,
  1489.         int $userId,
  1490.         ?LessonModule $lessonModule null
  1491.         $isHistory false
  1492.     )
  1493.     {
  1494.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1495.         $permission $userPermissionUtil->getPermission("course""see");
  1496.         $user $userPermissionUtil->getUser();
  1497.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1498.             $course
  1499.             $user
  1500.         );
  1501.         $sqlDateConclusion "
  1502.             SELECT
  1503.                 (
  1504.                     CASE 
  1505.                         WHEN ll.complete = :yes THEN ll.date_conclusion 
  1506.                         ELSE CURDATE() 
  1507.                     END
  1508.                 ) AS date_conclusion
  1509.             FROM lesson_log AS ll
  1510.             WHERE ll.lesson_id = l.id
  1511.             AND ll.course_id = l.course_id
  1512.             AND ll.user_id = :userId
  1513.             ORDER BY ll.id DESC
  1514.             LIMIT 1
  1515.         ";
  1516.         $sqlDateRegisterEnrollement "
  1517.             SELECT
  1518.                 e.date_register
  1519.             FROM enrollment AS e
  1520.             WHERE e.deleted = :deletedEnrollment
  1521.             AND e.course_id = l.course_id
  1522.             AND e.user_id = :userId
  1523.             ORDER BY e.id DESC
  1524.             LIMIT 1
  1525.         ";
  1526.         $sql "
  1527.             SELECT
  1528.                 COUNT(l.id) AS total
  1529.             FROM lesson AS l
  1530.             INNER JOIN course AS c ON (c.id = l.course_id AND c.deleted = :deletedCourse)
  1531.             INNER JOIN lesson_module AS lm ON (
  1532.                 lm.id = l.lesson_module_id AND lm.deleted = :deletedModule
  1533.             )
  1534.             LEFT JOIN library AS lb ON (lb.id = l.library_id AND lb.deleted = :deletedLibrary)
  1535.             WHERE l.deleted = :deleted
  1536.             AND l.course_id = :courseId
  1537.             /* AND  CASO FOSSE CONSIDERADA DATA DE LIBERAÇÃO DA AULA PARA ENCERRAR O ACESSO
  1538.             (
  1539.                 (
  1540.                     l.control_close_period = 0 OR 
  1541.                     l.control_close_period IS NULL
  1542.                 )
  1543.                 OR
  1544.                 (
  1545.                     l.control_close_period > 0
  1546.                     AND l.control_release_type = 0
  1547.                     AND DATEDIFF(CURDATE(), (DATE(
  1548.                         (
  1549.                             CASE 
  1550.                                 WHEN ({$sqlDateConclusion}) IS NOT NULL THEN ({$sqlDateConclusion})
  1551.                                 ELSE CURDATE()
  1552.                             END
  1553.                         )
  1554.                     ) + INTERVAL l.control_close_period DAY)) < 0
  1555.                 )
  1556.                 OR
  1557.                 (
  1558.                     l.control_close_period > 0
  1559.                     AND l.control_release_type = 1
  1560.                     AND DATEDIFF(CURDATE(), (DATE(
  1561.                         (l.control_date_release)
  1562.                     ) + INTERVAL l.control_close_period DAY)) < 0
  1563.                 )
  1564.                 OR
  1565.                 (
  1566.                     l.control_close_period > 0
  1567.                     AND l.control_release_type = 2
  1568.                     AND l.control_release_after_type = 1
  1569.                     AND DATEDIFF(CURDATE(), (DATE(
  1570.                         ({$sqlDateRegisterEnrollement})
  1571.                     ) + INTERVAL l.control_close_period DAY)) < 0
  1572.                 )
  1573.                 OR
  1574.                 (
  1575.                     l.control_close_period > 0
  1576.                     AND l.control_release_type = 2
  1577.                     AND l.control_release_after_type = 2
  1578.                 )
  1579.             )*/
  1580.         ";
  1581.         if($lessonModule){
  1582.             $sql .= " AND l.lesson_module_id = :lessonModuleId ";
  1583.         }
  1584.         if(
  1585.             $isHistory ||
  1586.             $userPermissionUtil->isLow($permission) || 
  1587.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1588.         ){
  1589.             $sql .= " AND l.status = :lessonStatus ";
  1590.             $sql .= " AND lm.status = :lessonModuleStatus ";
  1591.         }
  1592.         $stmt $this->em->getConnection()->prepare($sql);
  1593.         //$stmt->bindValue(':deletedEnrollment', EnrollmentEnum::ITEM_NO_DELETED, PDO::PARAM_INT);
  1594.         $stmt->bindValue(':deletedCourse'CourseEnum::ITEM_NO_DELETEDPDO::PARAM_INT);
  1595.         $stmt->bindValue(':deletedModule'LessonModuleEnum::ITEM_NO_DELETEDPDO::PARAM_INT);
  1596.         $stmt->bindValue(':deletedLibrary'LibraryEnum::ITEM_NO_DELETEDPDO::PARAM_INT);
  1597.         $stmt->bindValue(':deleted'LessonEnum::ITEM_NO_DELETEDPDO::PARAM_INT);
  1598.         $stmt->bindValue(':courseId'$course->getId(), PDO::PARAM_INT);
  1599.         //$stmt->bindValue(':yes', LessonEnum::YES, PDO::PARAM_INT);
  1600.         //$stmt->bindValue(':userId', $userId, PDO::PARAM_INT);
  1601.         if($lessonModule){
  1602.             $stmt->bindValue(':lessonModuleId'$lessonModule->getId(), PDO::PARAM_INT);
  1603.         }
  1604.         if(
  1605.             $isHistory ||
  1606.             $userPermissionUtil->isLow($permission) ||
  1607.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1608.         ){
  1609.             $stmt->bindValue(':lessonStatus'LessonEnum::PUBLISHEDPDO::PARAM_INT);
  1610.             $stmt->bindValue(':lessonModuleStatus'LessonModuleEnum::PUBLISHEDPDO::PARAM_INT);
  1611.         }
  1612.         
  1613.         $stmt->execute();
  1614.         $result $stmt->fetchAll(PDO::FETCH_CLASS);
  1615.         return $result[0]->total;
  1616.     }
  1617.     public function getCourseLessons(
  1618.         Course $course
  1619.         ?LessonModule $lessonModule null
  1620.         ?array $lessonIds null
  1621.         ?string $searchText null
  1622.     )
  1623.     {
  1624.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1625.         $permission $userPermissionUtil->getPermission("course""see");
  1626.         $user $userPermissionUtil->getUser();
  1627.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1628.             $course
  1629.             $user
  1630.         );
  1631.         
  1632.         $query $this->createQueryBuilder('l');
  1633.         $query->innerJoin(
  1634.             'EADPlataforma:LessonModule'
  1635.             'lm'
  1636.             'WITH'
  1637.             'lm.id = l.lessonModule AND lm.deleted = 0'
  1638.         );
  1639.         $query->innerJoin(
  1640.             'EADPlataforma:Course'
  1641.             'c'
  1642.             'WITH'
  1643.             'c.id = l.course AND c.deleted = 0'
  1644.         );
  1645.         $query->leftJoin(
  1646.             'EADPlataforma:Library'
  1647.             'lb'
  1648.             'WITH'
  1649.             'lb.id = l.library AND lb.deleted = 0'
  1650.         );
  1651.         $query->andWhere('l.deleted = 0');
  1652.         $query->andWhere('l.course = :courseId');
  1653.         $query->setParameter('courseId'$course->getId());
  1654.         if(!empty($searchText)){
  1655.             $query->andWhere('(l.title LIKE :searchText OR lm.title LIKE :searchText)');
  1656.             $query->setParameter('searchText'"%{$searchText}%");
  1657.         }
  1658.         if($lessonModule){
  1659.             $query->andWhere('l.lessonModule = :lessonModuleId');
  1660.             $query->setParameter('lessonModuleId'$lessonModule->getId());
  1661.         }
  1662.         if(is_array($lessonIds) && !empty($lessonIds)){
  1663.             $query->andWhere($query->expr()->in('l.id'$lessonIds));
  1664.         }
  1665.         if(
  1666.             $userPermissionUtil->isLow($permission) || 
  1667.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1668.         ){
  1669.             $query->andWhere('l.status = :lessonStatus');
  1670.             $query->andWhere('lm.status = :lessonModuleStatus');
  1671.             $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1672.             $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1673.         }
  1674.         $query->addOrderBy('l.order''ASC');
  1675.         $query->addOrderBy('l.lessonModule''ASC');
  1676.         $data $query->getQuery()->execute();
  1677.         return $data;
  1678.     }
  1679.     public function getFirstLesson(Course $course, ?LessonModule $lessonModule null)
  1680.     {
  1681.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1682.         $permission $userPermissionUtil->getPermission("course""see");
  1683.         $user $userPermissionUtil->getUser();
  1684.         $courseTeamRepository $this->em->getRepository(CourseTeam::class);
  1685.         $isInTeam $courseTeamRepository->userExistInCourseTeam($course$user);
  1686.         
  1687.         $query $this->createQueryBuilder('l');
  1688.         $query->innerJoin(
  1689.             'EADPlataforma:LessonModule'
  1690.             'lm'
  1691.             'WITH'
  1692.             'lm.id = l.lessonModule AND lm.deleted = 0'
  1693.         );
  1694.         $query->innerJoin(
  1695.             'EADPlataforma:Course'
  1696.             'c'
  1697.             'WITH'
  1698.             'c.id = l.course AND c.deleted = 0'
  1699.         );
  1700.         $query->andWhere('l.deleted = 0');
  1701.         $query->andWhere('l.course = :courseId');
  1702.         $query->setParameter('courseId'$course->getId());
  1703.         if($lessonModule){
  1704.             $query->andWhere('l.lessonModule = :lessonModuleId');
  1705.             $query->setParameter('lessonModuleId'$lessonModule->getId());
  1706.         }
  1707.         if(
  1708.             $userPermissionUtil->isLow($permission) || 
  1709.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1710.         ){
  1711.             $query->andWhere('l.status = :lessonStatus');
  1712.             $query->andWhere('lm.status = :lessonModuleStatus');
  1713.             $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1714.             $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1715.         }
  1716.         $query->addOrderBy('lm.order''ASC');
  1717.         $query->addOrderBy('l.order''ASC');
  1718.         $query->setMaxResults(1);
  1719.         return $query->getQuery()->getOneOrNullResult();
  1720.     }
  1721.     public function getLastLesson(Course $course, ?LessonModule $lessonModule null)
  1722.     {
  1723.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1724.         $permission $userPermissionUtil->getPermission("course""see");
  1725.         $user $userPermissionUtil->getUser();
  1726.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1727.             $course
  1728.             $user
  1729.         );
  1730.         
  1731.         $query $this->createQueryBuilder('l');
  1732.         $query->innerJoin(
  1733.             'EADPlataforma:LessonModule'
  1734.             'lm'
  1735.             'WITH'
  1736.             'lm.id = l.lessonModule AND lm.deleted = 0'
  1737.         );
  1738.         $query->innerJoin(
  1739.             'EADPlataforma:Course'
  1740.             'c'
  1741.             'WITH'
  1742.             'c.id = l.course AND c.deleted = 0'
  1743.         );
  1744.         $query->andWhere('l.deleted = 0');
  1745.         $query->andWhere('l.course = :courseId');
  1746.         $query->setParameter('courseId'$course->getId());
  1747.         if($lessonModule){
  1748.             $query->andWhere('l.lessonModule = :lessonModuleId');
  1749.             $query->setParameter('lessonModuleId'$lessonModule->getId());
  1750.         }
  1751.         if(
  1752.             $userPermissionUtil->isLow($permission) || 
  1753.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1754.         ){
  1755.             $query->andWhere('l.status = :lessonStatus');
  1756.             $query->andWhere('lm.status = :lessonModuleStatus');
  1757.             $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1758.             $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1759.         }
  1760.         $query->addOrderBy('lm.order''DESC');
  1761.         $query->addOrderBy('l.order''DESC');
  1762.         $query->setMaxResults(1);
  1763.         return $query->getQuery()->getOneOrNullResult();
  1764.     }
  1765.     public function getLessonByLessonModule(LessonModule $lessonModule)
  1766.     {   
  1767.         $query $this->createQueryBuilder('l');
  1768.         $query->leftJoin(
  1769.             'EADPlataforma:Library'
  1770.             'li'
  1771.             'WITH'
  1772.             'li.id = l.library AND li.deleted = 0'
  1773.         );
  1774.         $query->andWhere('l.deleted = 0');
  1775.         $query->andWhere('l.status = :status');
  1776.         $query->andWhere('l.course = :courseId');
  1777.         $query->andWhere('l.lessonModule = :lessonModule');
  1778.         $query->setParameter('courseId'$lessonModule->getCourse()->getId());
  1779.         $query->setParameter('lessonModule'$lessonModule->getId());
  1780.         $query->setParameter('status'LessonEnum::PUBLISHED);
  1781.         $query->addOrderBy('l.order''ASC');
  1782.         return $query->getQuery()->execute();
  1783.     }
  1784.     public function getNextLessonByLessonModule(
  1785.         int $order
  1786.         LessonModule $lessonModule
  1787.         int $limit 3
  1788.     )
  1789.     {   
  1790.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1791.         $permission $userPermissionUtil->getPermission("course""see");
  1792.         $course $lessonModule->getCourse();
  1793.         $user $userPermissionUtil->getUser();
  1794.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1795.             $course
  1796.             $user
  1797.         );
  1798.         $query $this->createQueryBuilder('l');
  1799.         $query->select('
  1800.             l.id,
  1801.             l.order,
  1802.             l.title,
  1803.             l.status,
  1804.             l.controlRequirement,
  1805.             l.controlReleaseType,
  1806.             l.controlReleaseAfterType,
  1807.             l.controlDateRelease,
  1808.             l.controlReleasePeriod,
  1809.             l.controlClosePeriod,
  1810.             lm.id AS lessonModule,
  1811.             li.type AS libraryType,
  1812.             li.pagesNumber,
  1813.             li.duration
  1814.         ');
  1815.         $query->innerJoin(
  1816.             'EADPlataforma:LessonModule'
  1817.             'lm'
  1818.             'WITH'
  1819.             'lm.id = l.lessonModule AND lm.deleted = 0'
  1820.         );
  1821.         $query->innerJoin(
  1822.             'EADPlataforma:Course'
  1823.             'c'
  1824.             'WITH'
  1825.             'c.id = l.course AND c.deleted = 0'
  1826.         );
  1827.         $query->leftJoin(
  1828.             'EADPlataforma:Library'
  1829.             'li'
  1830.             'WITH'
  1831.             'li.id = l.library AND li.deleted = 0'
  1832.         );
  1833.         if(
  1834.             $userPermissionUtil->isLow($permission) || 
  1835.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  1836.         ){
  1837.             $query->andWhere('l.status = :lessonStatus');
  1838.             $query->andWhere('lm.status = :lessonModuleStatus');
  1839.             $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  1840.             $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  1841.         }
  1842.         $query->andWhere('l.deleted = 0');
  1843.         $query->andWhere('l.course = :courseId');
  1844.         $query->andWhere('l.lessonModule = :lessonModule');
  1845.         $query->andWhere('l.order > :order');
  1846.         $query->setParameter('courseId'$course->getId());
  1847.         $query->setParameter('lessonModule'$lessonModule->getId());
  1848.         $query->setParameter('order'$order);
  1849.         $query->addOrderBy('l.order''ASC');
  1850.         $query->setMaxResults($limit);
  1851.         return $query->getQuery()->execute();
  1852.     }
  1853.     public function getLessonNotView($userId$courseId$lessonId null)
  1854.     {
  1855.         $and '';
  1856.         if(!empty($lessonId))
  1857.         {
  1858.             $and .= " AND l.id = :lessonId";
  1859.         }
  1860.         if(empty($courseId) || empty($userId))
  1861.         {
  1862.             return [];
  1863.         }
  1864.         $dql "SELECT
  1865.                     l.id,
  1866.                     l.title,
  1867.                     lm.title AS titleModule,
  1868.                     '0' AS totalView,
  1869.                     '' AS lastAccess,
  1870.                     '--' AS timeWatch,
  1871.                     '0' AS completed,
  1872.                     '---' AS dateConclusion
  1873.                 FROM EADPlataforma:Lesson AS l
  1874.                 INNER JOIN EADPlataforma:LessonModule AS lm WITH (lm.id = l.lessonModule AND lm.deleted = 0)
  1875.                 WHERE l.deleted = 0
  1876.                 AND l.course = :courseId
  1877.                 {$and}
  1878.                 AND l.id NOT IN (
  1879.                     SELECT
  1880.                         IDENTITY (ll.lesson)
  1881.                     FROM EADPlataforma:LessonLogOrigin AS ll
  1882.                     WHERE ll.user != 1
  1883.                     AND ll.user = :userId
  1884.                     AND ll.course = :courseId
  1885.                 )
  1886.                 ORDER BY l.order ASC";
  1887.                 
  1888.         $query $this->em->createQuery($dql);
  1889.         $query->setParameter('userId'$userId);
  1890.         $query->setParameter('courseId'$courseId);
  1891.       
  1892.         if(!empty($lessonId))
  1893.         {
  1894.             $query->setParameter('lessonId'$lessonId);
  1895.         }
  1896.         $data $query->execute();
  1897.         
  1898.         $result = [];
  1899.         foreach ($data as $key => $value) {
  1900.             $result[] = [
  1901.                 $value["id"],
  1902.                 $value["title"],
  1903.                 $value["titleModule"],
  1904.                 $value["totalView"],
  1905.                 $value["lastAccess"],
  1906.                 $value["timeWatch"],
  1907.                 $value["completed"],
  1908.                 $value["dateConclusion"]
  1909.             ];
  1910.         }
  1911.         return $result;
  1912.     }
  1913.     public function isFirstCourseLesson(?Lesson $lesson)
  1914.     {
  1915.         if(!$lesson){
  1916.             return false;
  1917.         }
  1918.         $firstLesson $this->getFirstLesson($lesson->getCourse());
  1919.         if($firstLesson){
  1920.             return $firstLesson->getId() == $lesson->getId();
  1921.         }
  1922.         return true;
  1923.     }
  1924.     public function isFirstModuleLesson(?Lesson $lesson)
  1925.     {
  1926.         if(!$lesson){
  1927.             return false;
  1928.         }
  1929.         $firstLesson $this->getFirstLesson($lesson->getCourse(), $lesson->getLessonModule());
  1930.         if($firstLesson){
  1931.             return $firstLesson->getId() == $lesson->getId();
  1932.         }
  1933.         return true;
  1934.     }
  1935.     public function isLastCourseLesson(?Lesson $lesson)
  1936.     {
  1937.         if(!$lesson){
  1938.             return false;
  1939.         }
  1940.         $firstLesson $this->getLastLesson($lesson->getCourse());
  1941.         if($firstLesson){
  1942.             return $firstLesson->getId() == $lesson->getId();
  1943.         }
  1944.         return true;
  1945.     }
  1946.     public function isLastModuleLesson(?Lesson $lesson)
  1947.     {
  1948.         if(!$lesson){
  1949.             return false;
  1950.         }
  1951.         $firstLesson $this->getLastLesson(
  1952.             $lesson->getCourse(), 
  1953.             $lesson->getLessonModule()
  1954.         );
  1955.         if($firstLesson){
  1956.             return $firstLesson->getId() == $lesson->getId();
  1957.         }
  1958.         return true;
  1959.     }
  1960.     public function isLessonVisibleToStudent(
  1961.         Lesson $lesson
  1962.         ?bool $ignoreControlFunction false
  1963.     ): bool
  1964.     {
  1965.         $info $this->checkLessonVisibleToStudent($lesson$ignoreControlFunction);
  1966.         return $info->visible;
  1967.     }
  1968.     public function checkLessonVisibleToStudent(
  1969.         Lesson $lesson
  1970.         ?bool $ignoreControlFunction false
  1971.     ): object
  1972.     {
  1973.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1974.         $user $userPermissionUtil->getUser();
  1975.         $info = (object)[
  1976.             "visible" => true,
  1977.             "message" => "",
  1978.         ];
  1979.         if(!$user){
  1980.             $info->visible false;
  1981.             return $info;
  1982.         }
  1983.         $course $lesson->getCourse();
  1984.         $lessonModule $lesson->getLessonModule();
  1985.         if($lesson->isDeleted() || $lessonModule->isDeleted() || $course->isDeleted()){
  1986.             $info->visible false;
  1987.             return $info;
  1988.         }
  1989.         $permission $userPermissionUtil->getPermission("course""see");
  1990.         
  1991.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1992.             $course,
  1993.             $user
  1994.         );
  1995.         $enrollmentRepository $this->em->getRepository(Enrollment::class);
  1996.         $isEnroll $enrollmentRepository->isValidEnrollmentByUser(
  1997.             $user->getId(), 
  1998.             $course->getId()
  1999.         );
  2000.         $hasLessonControl $this->configuration->checkModuleIsAbleOnPlan(
  2001.             'lessonControlFunction'
  2002.         );
  2003.         if(
  2004.             $userPermissionUtil->isLow($permission) || 
  2005.             ($userPermissionUtil->isMiddle($permission) && !$isInTeam)
  2006.         ){
  2007.             
  2008.             if($lesson->getStatus() == LessonEnum::DRAFT){
  2009.                 $info->visible false;
  2010.                 return $info;
  2011.             }
  2012.             if($lessonModule->getStatus() == LessonModuleEnum::DRAFT){
  2013.                 $info->visible false;
  2014.                 return $info;
  2015.             }
  2016.             if($course->getStatus() == CourseEnum::DRAFT){
  2017.                 $info->visible false;
  2018.                 return $info;
  2019.             }
  2020.             if(!$isEnroll){
  2021.                 $info->visible false;
  2022.                 return $info;
  2023.             }
  2024.             
  2025.             if(!$ignoreControlFunction){
  2026.                 if($lesson->getControlReleaseType() == LessonEnum::FIXED_DATE){
  2027.                     $todaySeconds strtotime(date('Y-m-d H:i:s'));
  2028.                     if($hasLessonControl){
  2029.                         $controlClosePeriod $lesson->getControlClosePeriod();
  2030.                         if(!empty($controlClosePeriod)){
  2031.                             $timeLog strtotime(
  2032.                                 "{$lesson->getControlDateRelease()} + {$controlClosePeriod} day"
  2033.                             );
  2034.                             if($todaySeconds $timeLog){
  2035.                                 $info->visible false;
  2036.                                 return $info;
  2037.                             }
  2038.                         }
  2039.                     }
  2040.                 }else{
  2041.                     $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  2042.                     $logId "{$course->getId()}#{$user->getId()}#{$lesson->getId()}";
  2043.                     $lessonLog $lessonLogRepository->find($logId);
  2044.                     //check lesson to user is closed
  2045.                     if($lessonLog){
  2046.                         $todaySeconds strtotime(date('Y-m-d H:i:s'));
  2047.                         if($hasLessonControl){
  2048.                             $controlClosePeriod $lesson->getControlClosePeriod();
  2049.                             if(
  2050.                                 !empty($controlClosePeriod) && 
  2051.                                 $lessonLog->getComplete() == LessonEnum::YES
  2052.                             ){
  2053.                                 $timeLog strtotime(
  2054.                                     "{$lessonLog->getDateConclusion()} + {$controlClosePeriod} day"
  2055.                                 );
  2056.                                 if($todaySeconds $timeLog){
  2057.                                     $info->visible false;
  2058.                                     return $info;
  2059.                                 }
  2060.                             }
  2061.                         }
  2062.                     }
  2063.                 } 
  2064.             }
  2065.         }else if(!$isEnroll){
  2066.             $enrollmentService $this->generalService->getService('EnrollmentService');
  2067.             $enrollmentService->enrollUser($user$course);
  2068.         }
  2069.         return $info;
  2070.     }
  2071.     public function getLessonNumberByProduct(Product $product)
  2072.     {
  2073.         $query $this->createQueryBuilder('l');
  2074.         $query->select("COUNT(l.id) AS total");
  2075.         $query->innerJoin('EADPlataforma:Course''c''WITH''l.course = c.id');
  2076.         $query->innerJoin('EADPlataforma:Product''p''WITH''l.course MEMBER OF p.course');
  2077.         $query->innerJoin('EADPlataforma:LessonModule''lm''WITH''l.lessonModule = lm.id');
  2078.         $query->andWhere('l.deleted = :deletedLesson');
  2079.         $query->andWhere('c.deleted = :deletedCourse');
  2080.         $query->andWhere('lm.deleted = :deletedLessonModule');
  2081.         $query->andWhere('l.status = :statusLesson');
  2082.         $query->andWhere('c.status = :statusCourse');
  2083.         $query->andWhere('lm.status = :statusLessonModule');
  2084.         $query->andWhere('p.id = :productId');
  2085.         $query->setParameter('deletedLesson'LessonEnum::ITEM_NO_DELETED);
  2086.         $query->setParameter('deletedCourse'CourseEnum::ITEM_NO_DELETED);
  2087.         $query->setParameter('deletedLessonModule'LessonModuleEnum::ITEM_NO_DELETED);
  2088.         $query->setParameter('statusLesson'LessonEnum::PUBLISHED);
  2089.         $query->setParameter('statusCourse'CourseEnum::PUBLISHED);
  2090.         $query->setParameter('statusLessonModule'LessonModuleEnum::PUBLISHED);
  2091.         $query->setParameter('productId'$product->getId());
  2092.         $result = (object)$query->getQuery()->getOneOrNullResult();
  2093.         return $result->total;
  2094.     }
  2095.     public function getLessonForExportPresence(Course $course$lessonModuleId null){
  2096.         $query $this->createQueryBuilder('l');
  2097.         $query->select('
  2098.             l.id,
  2099.             lm.id AS lessonModuleId,
  2100.             l.order,
  2101.             lm.title,
  2102.             l.title AS lessonTitle
  2103.         ');
  2104.         $query->innerJoin(
  2105.             'EADPlataforma:LessonModule'
  2106.             'lm'
  2107.             'WITH'
  2108.             'lm.id = l.lessonModule AND lm.deleted = 0'
  2109.         );
  2110.         if($lessonModuleId){
  2111.             $query->andWhere('lm.id = :lessonModuleId');
  2112.             $query->setParameter('lessonModuleId'$lessonModuleId);
  2113.         }
  2114.         
  2115.         $query->andWhere('l.status = :lessonStatus');
  2116.         $query->andWhere('lm.status = :lessonModuleStatus');
  2117.         $query->setParameter('lessonStatus'LessonEnum::PUBLISHED);
  2118.         $query->setParameter('lessonModuleStatus'LessonModuleEnum::PUBLISHED);
  2119.         
  2120.         $query->andWhere('l.deleted = 0');
  2121.         $query->andWhere('l.course = :courseId');
  2122.         $query->setParameter('courseId'$course->getId());
  2123.         $query->addOrderBy('lm.order''ASC');
  2124.         $query->addOrderBy('lm.id''ASC');
  2125.         $query->addOrderBy('l.order''ASC');
  2126.         $query->addOrderBy('l.id''ASC');
  2127.         return $query->getQuery()->execute();
  2128.     }
  2129.     public function restore(Lesson $lesson$typeItem$key)
  2130.     {
  2131.         $lessonId $lesson->getId();
  2132.         $dateNow date('Y-m-d H:i:s');
  2133.         $lastOrder $this->count(
  2134.             [ 
  2135.                 "deleted" => LessonEnum::ITEM_NO_DELETED
  2136.                 "lessonModule" => $lesson->getLessonModule()->getId() 
  2137.             ]
  2138.         ) + ($key 1);
  2139.         $lesson->setOrder($lastOrder);
  2140.         $courseRepository =  $this->em->getRepository(Course::class);
  2141.         $lesson->setUserDelete($this->getUser());
  2142.         $lesson->setDateDelete($dateNow);
  2143.         $lesson->restore();
  2144.         $deleted LessonEnum::ITEM_NO_DELETED;
  2145.         $typeDelete LessonEnum::CASCADE;
  2146.         $this->em->getRepository(Exam::class)->restoreByLesson(
  2147.             $lessonId
  2148.             $deleted
  2149.             $typeDelete
  2150.             $this->getUser(), 
  2151.             $dateNow
  2152.         );
  2153.         $this->em->getRepository(ExamUser::class)->restoreByLesson(
  2154.             $lessonId
  2155.             $deleted
  2156.             $typeDelete
  2157.             $this->getUser(), 
  2158.             $dateNow
  2159.         );
  2160.         $this->em->getRepository(LessonSupport::class)->restoreByLesson(
  2161.             $lessonId
  2162.             $deleted
  2163.             $typeDelete
  2164.             $this->getUser(), 
  2165.             $dateNow
  2166.         );
  2167.         $this->em->getRepository(LessonXLibrary::class)->restoreByLesson(
  2168.             $lessonId
  2169.             $deleted
  2170.             $typeDelete
  2171.             $this->getUser(), 
  2172.             $dateNow
  2173.         );
  2174.         $this->em->getRepository(Trash::class)->deleteTrash($lessonId$typeItem);
  2175.     }
  2176.     public function delete(Lesson $lesson$typeItem$permission$isTrash)
  2177.     {
  2178.         $lessonId $lesson->getId();
  2179.         $dateNow date('Y-m-d H:i:s');
  2180.         $typeDelete LessonEnum::CASCADE;
  2181.         $notificationService $this->generalService->getService('NotificationService');
  2182.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  2183.         $lessonXLibrarys $this->em->getRepository(LessonXLibrary::class)->findBy([
  2184.             "lesson" => $lesson->getId(),
  2185.         ]);
  2186.         $libraryRepository $this->em->getRepository(Library::class);
  2187.         $libraryModule $this->configuration->checkModuleIsAbleOnPlan('libraryModule');
  2188.         if($isTrash == LessonEnum::YES){
  2189.             $permission $userPermissionUtil->getPermission("trash""delete");
  2190.         }
  2191.         $isLessonTeacher $this->isLessonTeacher($lesson$this->getUser());
  2192.         if($isLessonTeacher || $userPermissionUtil->isHigh($permission)){
  2193.             $lesson->setUserDelete($this->getUser());
  2194.             $lesson->setDateDelete($dateNow);
  2195.             $lesson->individual();
  2196.             
  2197.             if($lesson->isOnTrash() || $lesson->isDeleted()){
  2198.                 
  2199.                 $lesson->delete();
  2200.                 $deleted LessonEnum::ITEM_DELETED;
  2201.                 $this->em->getRepository(Trash::class)->deleteTrash($lessonId$typeItem);
  2202.                 $this->em->flush();
  2203.                 foreach ($lessonXLibrarys as $key => $lessonXLibrary) {
  2204.                     $library $lessonXLibrary->getLibrary();
  2205.                     if(!$libraryModule && $library){
  2206.                         $library->cascade();
  2207.                         $libraryRepository->deleteContent($library);
  2208.                     }
  2209.                     $lessonXLibrary->delete();
  2210.                 }
  2211.                 $library $lesson->getLibrary();
  2212.                 if(!$libraryModule && $library){
  2213.                     $library->cascade();
  2214.                     $libraryRepository->deleteContent($library);
  2215.                 }
  2216.             }
  2217.             if(!$lesson->isOnTrash() && !$lesson->isDeleted()){
  2218.                 $order $lesson->getOrder();
  2219.                 $this->refreshOrder(
  2220.                     $lesson->getCourse()->getId(), 
  2221.                     $lesson->getLessonModule()->getId(),
  2222.                     $order,
  2223.                     null,
  2224.                     true
  2225.                 );
  2226.                 $notificationService->delete(
  2227.                     NotificationEnum::ORIGIN_LESSON_SUPPORT_LIKE
  2228.                     $lessonId
  2229.                 );
  2230.                 $notificationService->delete(
  2231.                     NotificationEnum::ORIGIN_LESSON_SUPPORT_ANSWER_LIKE
  2232.                     $lessonId
  2233.                 );
  2234.                 $notificationService->delete(
  2235.                     NotificationEnum::ORIGIN_LESSON_SUPPORT_NEW
  2236.                     $lessonId
  2237.                 );
  2238.                 $notificationService->delete(
  2239.                     NotificationEnum::ORIGIN_LESSON_SUPPORT_ANSWER_NEW
  2240.                     $lessonId
  2241.                 );
  2242.                 $notificationService->delete(
  2243.                     NotificationEnum::ORIGIN_LESSON_NEW
  2244.                     $lessonId
  2245.                 );
  2246.                 $notificationService->delete(
  2247.                     NotificationEnum::ORIGIN_LESSON_CHANGE
  2248.                     $lessonId
  2249.                 );
  2250.                 $lesson->trash();
  2251.                 $deleted LessonEnum::ITEM_ON_TRASH;
  2252.                 $this->em->getRepository(Trash::class)->insertTrash(
  2253.                     $lesson
  2254.                     $typeItem
  2255.                     "Aula: {$lesson->getTitle()} | Prof. {$lesson->getUser()->getName()}"
  2256.                 );
  2257.             }
  2258.         }
  2259.         
  2260.         $this->em->getRepository(Exam::class)->deleteByLesson(
  2261.             $lessonId
  2262.             $deleted
  2263.             $typeDelete
  2264.             $this->getUser(), 
  2265.             $dateNow
  2266.         );
  2267.         $this->em->getRepository(ExamUser::class)->deleteByLesson(
  2268.             $lessonId
  2269.             $deleted
  2270.             $typeDelete
  2271.             $this->getUser(), 
  2272.             $dateNow
  2273.         );
  2274.         $this->em->getRepository(LessonSupport::class)->deleteByLesson(
  2275.             $lessonId
  2276.             $deleted
  2277.             $typeDelete
  2278.             $this->getUser(), 
  2279.             $dateNow
  2280.         );
  2281.         $this->em->getRepository(LessonXLibrary::class)->deleteByLesson(
  2282.             $lessonId
  2283.             $deleted
  2284.             $typeDelete
  2285.             $this->getUser(), 
  2286.             $dateNow
  2287.         );
  2288.     }
  2289.     public function restoreByCourse($courseId$deleted$typeDelete){
  2290.         $typeItem TrashEnum::LESSON;
  2291.         $lessons $this->em->getRepository(Lesson::class)->findBy([
  2292.             "course" => $courseId,
  2293.             "deleted" => ($deleted),
  2294.             "typeDelete" => $typeDelete
  2295.         ]);
  2296.         foreach ($lessons as $key => $lesson) {
  2297.             $this->restore($lesson$typeItem$key);
  2298.         }
  2299.     }
  2300.     public function deleteByCourse($courseId$deleted){
  2301.         $typeItem TrashEnum::LESSON;
  2302.         $isTrash LessonEnum::NO;
  2303.         if($deleted == LessonEnum::ITEM_ON_TRASH){
  2304.             $isTrash LessonEnum::YES;
  2305.         }
  2306.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  2307.         $permission $userPermissionUtil->getPermission(
  2308.             "course"
  2309.             "lesson"
  2310.             "delete"
  2311.         );
  2312.         $lessons $this->em->getRepository(Lesson::class)->findBy([
  2313.             "course" => $courseId,
  2314.             "deleted" => ($deleted 1)
  2315.         ]);
  2316.         foreach ($lessons as $key => $lesson) {
  2317.             $this->delete($lesson$typeItem$permission$isTrash);
  2318.             $lesson->cascade();
  2319.         }
  2320.     }
  2321.     public function restoreByLessonModule($lessonModuleId$deleted$typeDelete){
  2322.         $typeItem TrashEnum::LESSON;
  2323.         $lessons $this->em->getRepository(Lesson::class)->findBy([
  2324.             "lessonModule" => $lessonModuleId,
  2325.             "deleted" => ($deleted),
  2326.             "typeDelete" => $typeDelete
  2327.         ]);
  2328.         foreach ($lessons as $key => $lesson) {
  2329.             $this->restore($lesson$typeItem$key);
  2330.         }
  2331.     }
  2332.     public function deleteByLessonModule($lessonModuleId$deleted){
  2333.         $typeItem TrashEnum::LESSON;
  2334.         $isTrash LessonEnum::NO;
  2335.         if($deleted == LessonEnum::ITEM_ON_TRASH){
  2336.             $isTrash LessonEnum::YES;
  2337.         }
  2338.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  2339.         $permission $userPermissionUtil->getPermission(
  2340.             "course"
  2341.             "lesson"
  2342.             "delete"
  2343.         );
  2344.         $lessons $this->em->getRepository(Lesson::class)->findBy([
  2345.             "lessonModule" => $lessonModuleId,
  2346.             "deleted" => ($deleted 1)
  2347.         ]);
  2348.         foreach ($lessons as $key => $lesson) {
  2349.             $this->delete($lesson$typeItem$permission$isTrash);
  2350.             $lesson->cascade();
  2351.         }
  2352.     }
  2353.     public function deleteTrashCron()
  2354.     {
  2355.         $sql "UPDATE EADPlataforma:Lesson AS l SET l.deleted = 2 
  2356.                 WHERE l.dateDelete <= :date AND l.deleted = 1 ";
  2357.         $query $this->em->createQuery($sql);
  2358.         $query->setParameter('date'date('Y-m-d H:i:s'strtotime('-90 days')));
  2359.         $query->execute();
  2360.     }
  2361. }