src/Repository/LessonRepository.php line 585

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