src/Repository/EnrollmentRepository.php line 1009

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Repository;
  3. use EADPlataforma\Entity\Enrollment;
  4. use EADPlataforma\Entity\Course;
  5. use EADPlataforma\Entity\Library;
  6. use EADPlataforma\Entity\Lesson;
  7. use EADPlataforma\Entity\LessonLog;
  8. use EADPlataforma\Entity\LessonLogOrigin;
  9. use EADPlataforma\Entity\LessonModule;
  10. use EADPlataforma\Entity\LessonSupport;
  11. use EADPlataforma\Entity\LessonAnnotation;
  12. use EADPlataforma\Entity\Exam;
  13. use EADPlataforma\Entity\ExamUser;
  14. use EADPlataforma\Entity\CourseTeam;
  15. use EADPlataforma\Entity\CourseTestimonial;
  16. use EADPlataforma\Entity\CourseCertificate;
  17. use EADPlataforma\Entity\UserSubscription;
  18. use EADPlataforma\Entity\Product;
  19. use EADPlataforma\Entity\ProductOffer;
  20. use EADPlataforma\Entity\User;
  21. use EADPlataforma\Entity\Trash;
  22. use EADPlataforma\Enum\ExamEnum;
  23. use EADPlataforma\Enum\CourseEnum;
  24. use EADPlataforma\Enum\CourseTestimonialEnum;
  25. use EADPlataforma\Enum\CourseCertificateEnum;
  26. use EADPlataforma\Enum\ExamUserEnum;
  27. use EADPlataforma\Enum\GroupEnum;
  28. use EADPlataforma\Enum\LessonEnum;
  29. use EADPlataforma\Enum\EnrollmentEnum;
  30. use EADPlataforma\Enum\UserSubscriptionEnum;
  31. use EADPlataforma\Enum\LessonAnnotationEnum;
  32. use EADPlataforma\Enum\LessonSupportEnum;
  33. use EADPlataforma\Enum\ProductEnum;
  34. use EADPlataforma\Enum\NotificationEnum;
  35. use EADPlataforma\Enum\UserEnum;
  36. use EADPlataforma\Enum\TagsMarketingEnum;
  37. use EADPlataforma\Enum\WebhookEnum;
  38. /**
  39.  * @method Enrollment|null find($id, $lockMode = null, $lockVersion = null)
  40.  * @method Enrollment|null findOneBy(array $criteria, array $orderBy = null)
  41.  * @method Enrollment[]    findAll()
  42.  * @method Enrollment[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  43.  */
  44. class EnrollmentRepository extends AbstractRepository
  45. {
  46.     public function getEntityClass(){
  47.         return Enrollment::class;
  48.     }
  49.     public function getConnectionName(){
  50.         return "school";
  51.     }
  52.     public function findItems()
  53.     {
  54.         return $this->createQueryBuilder('e')->getQuery()->getResult();
  55.     }
  56.     public function getStringStatus($status){
  57.         $string '';
  58.         switch ($status) {
  59.             case EnrollmentEnum::STATUS_ACTIVE:
  60.                 $string $this->configuration->getLanguage('active''enrollments');
  61.                 break;
  62.             case EnrollmentEnum::STATUS_EXPIRED:
  63.                 $string $this->configuration->getLanguage('expired''enrollments');    
  64.                 break;
  65.             case EnrollmentEnum::STATUS_SUSPENDED:
  66.                 $string $this->configuration->getLanguage('suspended''enrollments'); 
  67.                 break;
  68.             case EnrollmentEnum::STATUS_CANCELED:
  69.                 $string $this->configuration->getLanguage('canceled''enrollments'); 
  70.                 break;
  71.         }
  72.         return $string;
  73.     }
  74.     public function getOriginString($origin){
  75.         $string '';
  76.         switch ($origin) {
  77.             case EnrollmentEnum::ORIGIN_FREE:
  78.                 $string $this->configuration->getLanguage('free''enrollments');
  79.             break;
  80.             case EnrollmentEnum::ORIGIN_SALE:
  81.                 $string $this->configuration->getLanguage('sale''enrollments');    
  82.             break;
  83.             case EnrollmentEnum::ORIGIN_SUBSCRIPTION:
  84.                 $string $this->configuration->getLanguage('subscription''enrollments'); 
  85.             break;
  86.             case EnrollmentEnum::ORIGIN_GROUP:
  87.                 $string $this->configuration->getLanguage('group''enrollments'); 
  88.             break;
  89.             case EnrollmentEnum::ORIGIN_COUPOM:
  90.                 $string $this->configuration->getLanguage('coupom''enrollments'); 
  91.             break;
  92.             case EnrollmentEnum::ORIGIN_API:
  93.                 $string 'API'
  94.             break;
  95.             case EnrollmentEnum::ORIGIN_CHARGE:
  96.                 $string $this->configuration->getLanguage('charge''enrollments'); 
  97.             break;
  98.         }
  99.         return $string;
  100.     }
  101.     public function getEnrollmentOrigins(){
  102.         $data = [
  103.             (object)[
  104.                 "id" => EnrollmentEnum::ORIGIN_FREE,
  105.                 "title" => $this->configuration->getLanguage('free''enrollments'),
  106.                 "selected" => EnrollmentEnum::NO,
  107.             ],
  108.             (object)[
  109.                 "id" => EnrollmentEnum::ORIGIN_SALE,
  110.                 "title" => $this->configuration->getLanguage('sale''enrollments'),
  111.                 "selected" => EnrollmentEnum::NO,
  112.             ],
  113.             (object)[
  114.                 "id" => EnrollmentEnum::ORIGIN_SUBSCRIPTION,
  115.                 "title" => $this->configuration->getLanguage('subscription''enrollments'),
  116.                 "selected" => EnrollmentEnum::NO,
  117.             ],
  118.             (object)[
  119.                 "id" => EnrollmentEnum::ORIGIN_GROUP,
  120.                 "title" => $this->configuration->getLanguage('group''enrollments'),
  121.                 "selected" => EnrollmentEnum::NO,
  122.             ],
  123.             (object)[
  124.                 "id" => EnrollmentEnum::ORIGIN_COUPOM,
  125.                 "title" => $this->configuration->getLanguage('coupom''enrollments'),
  126.                 "selected" => EnrollmentEnum::NO,
  127.             ],
  128.             (object)[
  129.                 "id" => EnrollmentEnum::ORIGIN_API,
  130.                 "title" => "API",
  131.                 "selected" => EnrollmentEnum::NO,
  132.             ],
  133.             (object)[
  134.                 "id" => EnrollmentEnum::ORIGIN_CHARGE,
  135.                 "title" => $this->configuration->getLanguage('charge''enrollments'),
  136.                 "selected" => EnrollmentEnum::NO,
  137.             ],
  138.         ];
  139.         return $data;
  140.     }
  141.     public function sendWebhook(Enrollment $enrollment)
  142.     {
  143.         $user $enrollment->getUser();
  144.         $course $enrollment->getCourse();
  145.         $userWebhook $this->em->getRepository(User::class)->getToWebhook($user);
  146.         $dataObj = (object)[
  147.             "user" => $userWebhook,
  148.             "course" => (object)[
  149.                 "id" => (string)$course->getId(),
  150.                 "name" => $course->getTitle(),
  151.                 "workload" => $course->getWorkload(),
  152.             ],
  153.             "enrollment" => $enrollment->toWebhook(),
  154.         ];
  155.         if ($enrollment->getGroup()) {
  156.             $dataObj->group = (object)[
  157.                 "id" => (string)$enrollment->getGroup()->getId(),
  158.                 "name" => $enrollment->getGroup()->getName(),
  159.             ];
  160.         };
  161.         $webhookService $this->generalService->getService('WebhookService');
  162.         $webhookService->addItemList(WebhookEnum::ENROLLMENT$dataObj);
  163.         return;
  164.     }
  165.     public function getPublicEnrollments(
  166.         $userId
  167.         bool $onlyStarted false
  168.         $notCompleted false
  169.     )
  170.     {
  171.         $query $this->createQueryBuilder('e');
  172.         $query->innerJoin(
  173.             'EADPlataforma:Course''c''WITH''e.course = c AND c.deleted = 0'
  174.         );
  175.         $query->andWhere('e.user = :userId');
  176.         $query->andWhere('e.deleted = 0');
  177.         $query->setParameter('userId'$userId);
  178.         if($onlyStarted){
  179.             $query->andWhere('e.lessonNumberComplete != 0');
  180.         }
  181.         $query->addOrderBy('e.id''DESC');
  182.         $data $query->getQuery()->execute();
  183.         if($notCompleted){
  184.             $dataNotCompleted = [];
  185.             foreach ($data as $key => $enrollment) {
  186.                 if($enrollment->getProgress() < 100){
  187.                     $dataNotCompleted[] = $enrollment;
  188.                 }
  189.             }
  190.             $data $dataNotCompleted;
  191.         }
  192.         return $data;
  193.     }
  194.     
  195.     public function getResumeEnrollment(
  196.         int $userId
  197.         ?array $situation = [], 
  198.         ?int $status null,
  199.         ?string $searchText null
  200.         ?string $categories null
  201.         ?int $offset 0
  202.         ?int $limit 10
  203.     )
  204.     {
  205.         $query $this->createQueryBuilder('e');
  206.         $query->innerJoin(
  207.             'EADPlataforma:Course'
  208.             'c'
  209.             'WITH'
  210.             'e.course = c 
  211.             AND c.deleted = :courseDeleted 
  212.             AND c.status = :courseStatus
  213.             AND c.dateRelease <= :now'
  214.         );
  215.         $query->andWhere('e.user = :userId');
  216.         $query->andWhere('e.deleted = 0');
  217.         
  218.         $situationWhere = [];
  219.         if(in_array(EnrollmentEnum::SITUATION_STARTED$situation)){
  220.             $situationWhere[] = '
  221.                 (
  222.                     (e.lessonNumberComplete * 100)/c.numberLesson < 100
  223.                     AND (e.lessonNumberComplete * 100)/c.numberLesson > 0
  224.                 )';
  225.         }
  226.         if(in_array(EnrollmentEnum::SITUATION_NOT_STARTED$situation)){
  227.             $situationWhere[] = '(
  228.                 c.numberLesson = 0 
  229.                 OR (e.lessonNumberComplete * 100)/c.numberLesson <= 0
  230.             )';
  231.         }
  232.         if(in_array(EnrollmentEnum::SITUATION_COMPLETED$situation)){
  233.             $situationWhere[] = '((e.lessonNumberComplete * 100)/c.numberLesson >= 100)';
  234.         }
  235.         $situationWhereString "";
  236.         foreach ($situationWhere as $key => $value) {
  237.             $situationWhereString .= (empty($situationWhereString) ? $value " OR {$value} " );
  238.         }
  239.         if(!empty($situationWhereString)){
  240.             $query->andWhere("({$situationWhereString})");
  241.         }
  242.         
  243.         if(!empty($searchText)){
  244.             $query->andWhere('c.title LIKE :searchText');
  245.             $query->setParameter('searchText''%'.$searchText.'%');
  246.         }
  247.         if(!empty($categories)){
  248.             $query->andWhere('c.category IN (:categories) ');
  249.             $query->setParameter('categories'$categories);
  250.         }
  251.         if(!empty($status)){
  252.             $query->andWhere('e.status = :status');
  253.             $query->andWhere('e.datePeriod >= :now');
  254.     
  255.             $query->setParameter('status'$status);
  256.             $query->setParameter('now'date("Y-m-d H:i:s"));
  257.         }else{
  258.             $query->andWhere('e.status = :status');
  259.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  260.             $courseRepository $this->em->getRepository(Course::class);
  261.             
  262.             $subQuery $courseRepository->createQueryBuilder('c1');
  263.             $subQuery->select('c1.id');
  264.             $subQuery->innerJoin(
  265.                 'EADPlataforma:Product'
  266.                 'p'
  267.                 'WITH'
  268.                 'c1 MEMBER OF p.course'
  269.             );
  270.             $subQuery->andWhere('p.deleted = :productDeleted ');
  271.             $subQuery->andWhere('p.status = :productStatus');
  272.             $subQuery->andWhere('(
  273.                 p.type = :productTypePeriod OR p.type = :productTypePeriodSupport
  274.             )');
  275.             $subQuery->andWhere('c1.deleted = :c1Deleted');
  276.             $subQuery->andWhere('c1.status = :c1Status');
  277.             $query->setParameter('c1Deleted'CourseEnum::ITEM_NO_DELETED);
  278.             $query->setParameter('c1Status'CourseEnum::PUBLISHED);
  279.             $query->setParameter('productDeleted'ProductEnum::ITEM_NO_DELETED);
  280.             $query->setParameter('productStatus'ProductEnum::PUBLISHED);
  281.             $query->setParameter('productTypePeriod'ProductEnum::PERIOD);
  282.             $query->setParameter('productTypePeriodSupport'ProductEnum::PERIOD_SUPORT);
  283.             $subQuery $subQuery->getDQL();
  284.             $exp $query->expr()->in('e.course'$subQuery);
  285.             $query->andWhere("(e.datePeriod >= :now OR {$exp})");
  286.             $query->setParameter('now'date("Y-m-d H:i:s"));
  287.         }
  288.         $query->setParameter('userId'$userId);
  289.         $query->setParameter('courseStatus'CourseEnum::PUBLISHED);
  290.         $query->setParameter('courseDeleted'CourseEnum::ITEM_NO_DELETED);
  291.         $query->setFirstResult($offset);
  292.         if($limit != 0){
  293.             $query->setMaxResults($limit);
  294.         }
  295.         $query->addOrderBy('e.dateLastAccess''DESC');
  296.         
  297.         $data $query->getQuery()->execute();
  298.         return $data;
  299.     }
  300.     
  301.     public function countResumeEnrollment(int $userId, ?array $situation = [], 
  302.                                           ?int $status null, ?string $searchText null
  303.                                           ?string $categories null)
  304.     {
  305.         $query $this->createQueryBuilder('e');
  306.         $query->select("count(e.id) AS total");
  307.         $query->innerJoin(
  308.             'EADPlataforma:Course'
  309.             'c'
  310.             'WITH'
  311.             'e.course = c 
  312.             AND c.deleted = 0 
  313.             AND c.status = :courseStatus
  314.             AND c.dateRelease <= :now'
  315.         );
  316.         $query->andWhere('e.user = :userId');
  317.         $query->andWhere('e.deleted = 0');
  318.         
  319.         $situationWhere = [];
  320.         if(in_array(EnrollmentEnum::SITUATION_STARTED$situation)){
  321.             $situationWhere[] = '
  322.                 (
  323.                     (e.lessonNumberComplete * 100)/c.numberLesson < 100
  324.                     AND (e.lessonNumberComplete * 100)/c.numberLesson > 0
  325.                 )';
  326.         }
  327.         if(in_array(EnrollmentEnum::SITUATION_NOT_STARTED$situation)){
  328.             $situationWhere[] = '((e.lessonNumberComplete * 100)/c.numberLesson <= 0)';
  329.         }
  330.         if(in_array(EnrollmentEnum::SITUATION_COMPLETED$situation)){
  331.             $situationWhere[] = '((e.lessonNumberComplete * 100)/c.numberLesson >= 100)';
  332.         }
  333.         $situationWhereString "";
  334.         foreach ($situationWhere as $key => $value) {
  335.             $situationWhereString .= (empty($situationWhereString) ? $value " OR {$value} " );
  336.         }
  337.         if(!empty($situationWhereString)){
  338.             $query->andWhere("({$situationWhereString})");
  339.         }
  340.         if(!empty($searchText)){
  341.             $query->andWhere('c.title LIKE :searchText');
  342.             $query->setParameter('searchText''%'.$searchText.'%');
  343.         }
  344.         if(!empty($categories)){
  345.             $query->andWhere('c.category IN (:categories) ');
  346.             $query->setParameter('categories'$categories);
  347.         }
  348.         if(!empty($status)){
  349.             $query->andWhere('e.status = :status');
  350.             $query->andWhere('e.datePeriod >= :now');
  351.     
  352.             $query->setParameter('status'$status);
  353.             $query->setParameter('now'date("Y-m-d H:i:s"));
  354.         }else{
  355.             $query->andWhere('e.status = :status');
  356.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  357.             $courseRepository $this->em->getRepository(Course::class);
  358.             
  359.             $subQuery $courseRepository->createQueryBuilder('c1');
  360.             $subQuery->select('c1.id');
  361.             $subQuery->innerJoin(
  362.                 'EADPlataforma:Product'
  363.                 'p'
  364.                 'WITH'
  365.                 'c1 MEMBER OF p.course'
  366.             );
  367.             $subQuery->andWhere('p.deleted = :productDeleted ');
  368.             $subQuery->andWhere('p.status = :productStatus');
  369.             $subQuery->andWhere('(
  370.                 p.type = :productTypePeriod OR p.type = :productTypePeriodSupport
  371.             )');
  372.             $subQuery->andWhere('c1.deleted = :c1Deleted');
  373.             $subQuery->andWhere('c1.status = :c1Status');
  374.             $query->setParameter('c1Deleted'CourseEnum::ITEM_NO_DELETED);
  375.             $query->setParameter('c1Status'CourseEnum::PUBLISHED);
  376.             $query->setParameter('productDeleted'ProductEnum::ITEM_NO_DELETED);
  377.             $query->setParameter('productStatus'ProductEnum::PUBLISHED);
  378.             $query->setParameter('productTypePeriod'ProductEnum::PERIOD);
  379.             $query->setParameter('productTypePeriodSupport'ProductEnum::PERIOD_SUPORT);
  380.             $subQuery $subQuery->getDQL();
  381.             $exp $query->expr()->in('e.course'$subQuery);
  382.             $query->andWhere("(e.datePeriod >= :now OR {$exp})");
  383.             $query->setParameter('now'date("Y-m-d H:i:s"));
  384.         }
  385.         $query->setParameter('userId'$userId);
  386.         $query->setParameter('courseStatus'CourseEnum::PUBLISHED);
  387.         $query->addOrderBy('e.dateLastAccess''DESC');
  388.         $result = (object)$query->getQuery()->getOneOrNullResult();
  389.         return $result->total;
  390.     }
  391.     public function countUserEnrollment(int $userId, ?bool $all false)
  392.     {
  393.         $query $this->createQueryBuilder('e');
  394.         $query->select("count(e.id) AS total");
  395.         $query->innerJoin(
  396.             'EADPlataforma:Course'
  397.             'c'
  398.             'WITH',
  399.             'e.course = c 
  400.             AND c.deleted = 0 
  401.             AND c.status = :courseStatus'
  402.         );
  403.         $query->andWhere('e.user = :userId');
  404.         $query->andWhere('e.deleted = 0');
  405.         if($all){
  406.             $query->andWhere('e.status = :status');
  407.             $query->andWhere('e.datePeriod >= :now');
  408.             $query->andWhere('c.dateRelease <= :now');
  409.         
  410.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  411.             $query->setParameter('now'date("Y-m-d H:i:s"));
  412.         }   
  413.         $query->setParameter('userId'$userId);
  414.         $query->setParameter('courseStatus'CourseEnum::PUBLISHED);
  415.         $result = (object)$query->getQuery()->getOneOrNullResult();
  416.         return $result->total;
  417.     }
  418.     public function getEnrollmentNumber(
  419.         ?string $dateStart null
  420.         ?string $dateEnd null
  421.         ?int $userId null
  422.         ?int $status null
  423.     )
  424.     {
  425.         $query $this->createQueryBuilder('e');
  426.         $query->select("COUNT(0) AS total");
  427.         $query->andWhere('e.deleted = :deleted');
  428.         if($userId 0){
  429.             $subQuery $this->createQueryBuilder('course_team');
  430.             $subQuery->select('IDENTITY(ct.course)');
  431.             $subQuery->from('EADPlataforma:CourseTeam''ct');
  432.             $subQuery->andWhere('ct.user = :userId');
  433.             $subQuery $subQuery->getDQL();
  434.             $query->andWhere($query->expr()->in('e.course'$subQuery));
  435.             $query->setParameter('userId'$userId);
  436.         }
  437.         if(!is_null($dateStart) && !is_null($dateEnd)){
  438.             $query->andWhere('DATE(e.dateRegister) BETWEEN :dateStart AND :dateEnd');
  439.             $query->setParameter('dateStart'$dateStart);
  440.             $query->setParameter('dateEnd'$dateEnd);
  441.         }
  442.         if(!empty($status)){
  443.             $query->andWhere('e.status = :status');
  444.             $query->setParameter('status'$status);
  445.         }
  446.         $query->setParameter('deleted'EnrollmentEnum::ITEM_NO_DELETED);
  447.         $query->setMaxResults(1);
  448.         $result = (object)$query->getQuery()->getOneOrNullResult();
  449.         return $result->total;
  450.     }
  451.     public function checkFinishCourseByEnrollment(Enrollment $enrollment)
  452.     {
  453.         if($enrollment->getProgress() < 100 || !empty($enrollment->getDateConclusion())){
  454.             return;
  455.         }
  456.         $user $enrollment->getUser();
  457.         $course $enrollment->getCourse();
  458.         if($course->getStatus() == CourseEnum::DRAFT){
  459.             return;
  460.         }
  461.         $marketingService $this->generalService->getService(
  462.             'Marketing\\MarketingService'
  463.         );
  464.         if(
  465.             $this->configuration->isModuleActive("exam_module") && 
  466.             $this->configuration->checkModuleIsAbleOnPlan("examFunction")
  467.         ){
  468.             $examRepository $this->em->getRepository(Exam::class);
  469.             $examUserRepository $this->em->getRepository(ExamUser::class);
  470.             $numberExamConfig $examRepository->countValidExamByCourse($course->getId());
  471.             $numberExamUserConfig $examUserRepository->countValidExamUserByCourse(
  472.                 $course->getId(),
  473.                 $user->getId()
  474.             );
  475.             if(empty($numberExamConfig)){
  476.                 $enrollment->setDateConclusion(date('Y-m-d H:i:s'));
  477.                 $marketingService->setTag(TagsMarketingEnum::TAG_FINISH_COURSE);
  478.                 $marketingService->setTextComplement($course->getTitle());
  479.                 $marketingService->setUser($this->getUser());
  480.                 $marketingService->send();
  481.             }else if($numberExamConfig == $numberExamUserConfig){
  482.                 $finalAverage $examUserRepository->getFinalAvarege(
  483.                     $user->getId(), 
  484.                     $course->getId()
  485.                 );
  486.                 $certificateAverage $course->getCertificateAverage();
  487.                 if($finalAverage >= $certificateAverage){
  488.                     $enrollment->setDateConclusion(date('Y-m-d H:i:s'));
  489.                     $marketingService->setTag(TagsMarketingEnum::TAG_FINISH_COURSE);
  490.                     $marketingService->setTextComplement($course->getTitle());
  491.                     $marketingService->setUser($this->getUser());
  492.                     $marketingService->send();
  493.                 }
  494.             }
  495.         }else{
  496.             $enrollment->setDateConclusion(date('Y-m-d H:i:s'));
  497.             $marketingService->setTag(TagsMarketingEnum::TAG_FINISH_COURSE);
  498.             $marketingService->setTextComplement($course->getTitle());
  499.             $marketingService->setUser($this->getUser());
  500.             $marketingService->send();
  501.         }
  502.         $this->em->flush();
  503.         return;
  504.     }
  505.     public function checkAndIssueCertificate(Enrollment $enrollment)
  506.     {
  507.         if(!$this->configuration->isModuleActive("course_certificate_module")){
  508.             return;
  509.         }
  510.         if(!$this->configuration->checkModuleIsAbleOnPlan("certificateFunction")){
  511.             return;
  512.         }
  513.         if($enrollment->getCertificate() == EnrollmentEnum::NO){
  514.             return;
  515.         }
  516.         if($enrollment->getProgress() < 100){
  517.             return;
  518.         }
  519.         $user $enrollment->getUser();
  520.         $course $enrollment->getCourse();
  521.         if($course->getStatus() == CourseEnum::DRAFT){
  522.             return;
  523.         }
  524.         $courseCertificateTemplate $course->getCourseCertificateTemplate();
  525.         if(!$courseCertificateTemplate){
  526.             return;
  527.         }
  528.         $courseCertificateRepository $this->em->getRepository(CourseCertificate::class);
  529.         $certificate $courseCertificateRepository->findOneBy([
  530.             "course" => $enrollment->getCourse()->getId(),
  531.             "user" => $enrollment->getUser()->getId(),
  532.             "deleted" => CourseCertificateEnum::ITEM_NO_DELETED
  533.         ]);
  534.         if($certificate){
  535.             return $certificate;
  536.         }
  537.         $finalAverage 10;
  538.         $create false;
  539.         if(
  540.             $this->configuration->isModuleActive("exam_module") && 
  541.             $this->configuration->checkModuleIsAbleOnPlan("examFunction")
  542.         ){
  543.             $examRepository $this->em->getRepository(Exam::class);
  544.             $examUserRepository $this->em->getRepository(ExamUser::class);
  545.             $numberExamConfig $examRepository->countValidExamByCourse($course->getId());
  546.             $numberExamUserConfig $examUserRepository->countValidExamUserByCourse(
  547.                 $course->getId(),
  548.                 $user->getId()
  549.             );
  550.             if(empty($numberExamConfig)){
  551.                 $create true;
  552.             }else if($numberExamConfig == $numberExamUserConfig){
  553.                 $finalAverage $examUserRepository->getFinalAvarege(
  554.                     $user->getId(), 
  555.                     $course->getId()
  556.                 );
  557.                 $certificateAverage $course->getCertificateAverage();
  558.                 if($finalAverage >= $certificateAverage){
  559.                     $create true;
  560.                 }
  561.             }
  562.         }else{
  563.             $create true;
  564.         }
  565.         if($create){
  566.             $info $courseCertificateRepository->createCertificate(
  567.                 $enrollment,
  568.                 $courseCertificateTemplate,
  569.                 $finalAverage
  570.             );
  571.             $certificate $info->courseCertificate;
  572.         }
  573.         $this->em->flush();
  574.         return $certificate;
  575.     }
  576.     public function getCourseIndexByEnrollmentNew(Enrollment $enrollment)
  577.     {   
  578.         $enrollment $this->updateDataAccessLog($enrollment);
  579.         $certificate $this->checkAndIssueCertificate($enrollment);
  580.         $this->checkFinishCourseByEnrollment($enrollment);
  581.         $addExams true;
  582.         if(
  583.             !$this->configuration->isModuleActive("exam_module") || 
  584.             !$this->configuration->checkModuleIsAbleOnPlan("examFunction")
  585.         ){
  586.             $addExams false;
  587.         }
  588.         $course $enrollment->getCourse();
  589.         $user $enrollment->getUser();
  590.         $lessonRepository $this->em->getRepository(Lesson::class);
  591.         $logOriginRepository $this->em->getRepository(LessonLogOrigin::class);
  592.         $courseRepository $this->em->getRepository(Course::class);
  593.         $isStudent $courseRepository->isStudent($course);
  594.         $lessonModules $this->getModulesByEnrollment($enrollment);
  595.         $courseTestimonialRepository $this->em->getRepository(CourseTestimonial::class);
  596.         $courseTestimonial $courseTestimonialRepository->findOneBy([
  597.             "user" => $user->getId(),
  598.             "course" => $course->getId(),
  599.             "deleted" => CourseTestimonialEnum::ITEM_NO_DELETED
  600.         ]);
  601.         $testimonial null;
  602.         if($courseTestimonial){
  603.             $testimonial = (object)[
  604.                 "id" => $courseTestimonial->getId(),
  605.                 "score" => $courseTestimonial->getScore(),
  606.                 "testimonial" => $courseTestimonial->getTestimonial(),
  607.             ];
  608.         }
  609.         $certificateLink null;
  610.         if($certificate){
  611.             $certificateLink $this->generalService->generateUrl("viewCertificate", [
  612.                 "code" => $certificate->getNewCode() ?? $certificate->getCode(),
  613.                 "date" => $certificate->getDateEnd('Y-m-d'),
  614.             ]);
  615.         }
  616.         $allowCertificate true;
  617.         if($enrollment->getCertificate() == EnrollmentEnum::NO){
  618.             $poRepository $this->em->getRepository(ProductOffer::class);
  619.             $certificateOffer $poRepository->getProductOfferCertificateByCourse(
  620.                 $course
  621.             );
  622.             $allowCertificate = ($certificateOffer true false);
  623.         }
  624.         $allowSupport = ($course->getSupport() == CourseEnum::YES);
  625.         $dateSupport $enrollment->getDateSupport();
  626.         $date date('Y-m-d H:i:s');
  627.         $data = (object)[
  628.             "id" => $course->getId(),
  629.             "status" => $course->getStatus(),
  630.             "title" => $course->getTitle(),
  631.             "allowSupport" => $allowSupport,
  632.             "supportDate" => ($allowSupport $dateSupport null),
  633.             "supportExpired" => ($allowSupport && $dateSupport $date false true),
  634.             "exam" => null,
  635.             "testimonial" => $testimonial,
  636.             "modules" => $lessonModules,
  637.             "lessonCompleted" => (int)$logOriginRepository->countLessonLogCompleteByUser(
  638.                 $course,
  639.                 $user
  640.             ),
  641.             "lessonTotal" => (int)$lessonRepository->countCourseLessons($course$user->getId()),
  642.             "allowCertificate" => $allowCertificate,
  643.             "certificateLink" => $certificateLink,
  644.         ];
  645.         if($addExams){
  646.             $examRepository $this->em->getRepository(Exam::class);
  647.             $data->exam $examRepository->getExamToIndexNew(ExamEnum::COURSE$course);
  648.         }
  649.         return $data;
  650.     }
  651.     public function getCourseIndexByEnrollment(Enrollment $enrollment$addExams false)
  652.     {   
  653.         $enrollment $this->updateDataAccessLog($enrollment);
  654.         $this->checkAndIssueCertificate($enrollment);
  655.         $this->checkFinishCourseByEnrollment($enrollment);
  656.         $addExamsLimited $addExams;
  657.         if($addExams){
  658.             if(
  659.                 !$this->configuration->isModuleActive("exam_module") || 
  660.                 !$this->configuration->checkModuleIsAbleOnPlan("examFunction")
  661.             ){
  662.                 $addExams false;
  663.                 $addExamsLimited false;
  664.             }else{
  665.                 $addExamsLimited $this->configuration->checkModuleIsAbleOnPlan(
  666.                     "unlimitedExamFunction"
  667.                 );
  668.             }
  669.         }
  670.         $certificate $this->checkAndIssueCertificate($enrollment);
  671.         $course $enrollment->getCourse();
  672.         $courseCoord $course->getUser();
  673.         $courseRepository $this->em->getRepository(Course::class);
  674.         $isStudent $courseRepository->isStudent($course);
  675.         $lessonModules $this->getHistoryByEnrollment(
  676.             $enrollment
  677.             $addExamsLimited
  678.             $isStudent
  679.         );
  680.         $today date('Y-m-d H-i-s');
  681.         $courseTestimonialRepository $this->em->getRepository(CourseTestimonial::class);
  682.         $courseTestimonial $courseTestimonialRepository->findOneBy([
  683.             "user" => $enrollment->getUser()->getId(),
  684.             "course" => $course->getId(),
  685.             "deleted" => CourseTestimonialEnum::ITEM_NO_DELETED
  686.         ]);
  687.         $timeToday strtotime(date('Y-m-d H:i:s'));
  688.         $courseDateRelease strtotime($course->getDateRelease());
  689.         $courseHasRelease = !($courseDateRelease >= $timeToday);
  690.         $courseHasCertificate = ($course->getCertificate() == CourseEnum::YES);
  691.         $certificateSale false;
  692.         $linkPdf null;
  693.         $linkBuy null;
  694.         if($courseHasCertificate){
  695.             if(!$certificate && $enrollment->getCertificate() == EnrollmentEnum::NO){
  696.                 $poRepository $this->em->getRepository(ProductOffer::class);
  697.                 $certificateOffer $poRepository->getProductOfferCertificateByCourse(
  698.                     $course
  699.                 );
  700.                 if($certificateOffer){
  701.                     $certificateSale true;
  702.                     $linkBuy $this->generalService->generateUrl("cartAdd", [
  703.                         "poID" => $certificateOffer->getId(),
  704.                         "courseId" => $course->getId(),
  705.                     ]);
  706.                 }
  707.             }
  708.         }
  709.         if($certificate){
  710.             $linkPdf $this->generalService->generateUrl("viewCertificate", [
  711.                 "code" => $certificate->getCode(),
  712.                 "date" => $certificate->getDateEnd('Y-m-d'),
  713.             ]);
  714.         }
  715.         $accessExpired CourseEnum::NO;
  716.         if(strtotime($enrollment->getDatePeriod()) < time()){
  717.             $accessExpired CourseEnum::YES;
  718.         }
  719.         $lessonSupport $course->getSupport();
  720.         $supportExpired CourseEnum::NO;
  721.         //check user has active support
  722.         if($lessonSupport == CourseEnum::YES && $isStudent){
  723.             $userDateSupport $enrollment->getDateSupport();
  724.             $userDateSupport strtotime($userDateSupport);
  725.             if($timeToday $userDateSupport){
  726.                 $supportExpired CourseEnum::YES;
  727.             }
  728.         }
  729.         $data = (object)[
  730.             "id" => $course->getId(),
  731.             "status" => $course->getStatus(),
  732.             "courseTitle" => $course->getTitle(),
  733.             "courseTime" => $course->getWorkload(),
  734.             "courseDateRelease" => $course->getDateRelease(),
  735.             "courseHasRelease" => $courseHasRelease,
  736.             "courseHasCertificate" => $courseHasCertificate,
  737.             "courseAllowSupport" => $course->getSupport(),
  738.             "coorName" => $courseCoord->getName(),
  739.             "coorPhoto" => $courseCoord->getPhoto(),
  740.             "coorUsername" => $courseCoord->getUsername(),
  741.             "courseExam" => null,
  742.             "courseLesstonTotal" => $course->getNumberLesson(),
  743.             "enrollmentPercent" => $enrollment->getProgress(),
  744.             "enrollmentLessonView" => $enrollment->getLessonNumberComplete(),
  745.             "enrollmentDatePeriod" => $enrollment->getDatePeriod(),
  746.             "enrollmentAllowAccess" => ($enrollment->getDatePeriod() >= $today),
  747.             "enrollmentDateSupport" => $enrollment->getDateSupport(),
  748.             "enrollmentAllowSupport" => ($enrollment->getDateSupport() >= $today),
  749.             "courseTestimonial" => (
  750.                 $courseTestimonial $courseTestimonial->toReturn() : null
  751.             ),
  752.             "lessonModules" => $lessonModules,
  753.             "certificateIssue" => ($certificate true false),
  754.             "certificateLink" => $linkPdf,
  755.             "certificateSale" => $certificateSale,
  756.             "certificateLinkBuy" => $linkBuy,
  757.             "isStudent" => $isStudent,
  758.             "accessExpired" => $accessExpired,
  759.             "supportExpired" => $supportExpired,
  760.             "lessonSupport" => $lessonSupport,
  761.         ];
  762.         if($addExams){
  763.             $examRepository $this->em->getRepository(Exam::class);
  764.             $data->courseExam $examRepository->getExamToIndex(ExamEnum::COURSE$course);
  765.         }
  766.         return $data;
  767.     }
  768.     public function getModulesByEnrollmentNew(
  769.         Enrollment $enrollment
  770.         ?bool $isStudent true
  771.         ?string $searchText null
  772.     )
  773.     {
  774.         $addExams false;
  775.         if(
  776.             $this->configuration->isModuleActive("exam_module") &&
  777.             $this->configuration->checkModuleIsAbleOnPlan("examFunction") &&
  778.             $this->configuration->checkModuleIsAbleOnPlan("unlimitedExamFunction")
  779.         ){
  780.             $addExams true;
  781.         }
  782.         $course $enrollment->getCourse();
  783.         $user $enrollment->getUser();
  784.         $data = [];
  785.         $logOriginRepository $this->em->getRepository(LessonLogOrigin::class);
  786.         $lessonRepository $this->em->getRepository(Lesson::class);
  787.         $examRepository $this->em->getRepository(Exam::class);
  788.         $lessonModuleRepository $this->em->getRepository(LessonModule::class);
  789.         $lessonModules $lessonModuleRepository->getCourseLessonModules($course);
  790.         foreach ($lessonModules as $keyModule => $lessonModule) {
  791.             $lessonsSearch $this->getHistoryByEnrollmentModuleNew(
  792.                 $enrollment,
  793.                 $lessonModule,
  794.                 $addExams,
  795.                 $isStudent,
  796.                 $searchText
  797.             );
  798.             if(!empty($lessonsSearch)){
  799.                 $lessonModuleObj = (object)[
  800.                     "id" => $lessonModule->getId(),
  801.                     "title" => $lessonModule->getTitle(),
  802.                     "description" => $lessonModule->getDescription(),
  803.                     "status" => $lessonModule->getStatus(),
  804.                     "lessonCompleted" => (int)$logOriginRepository->countLessonLogCompleteByUser(
  805.                         $course,
  806.                         $user,
  807.                         $lessonModule
  808.                     ),
  809.                     "lessonTotal" => (int)$lessonRepository->countCourseLessons(
  810.                         $course,
  811.                         $user->getId(),
  812.                         $lessonModule
  813.                     ),
  814.                     "exam" => null,
  815.                     "lessons" => $lessonsSearch,
  816.                 ];
  817.                 if($addExams){
  818.                     $lessonModuleObj->exam $examRepository->getExamToIndexNew(
  819.                         ExamEnum::MODULE
  820.                         $course,
  821.                         $lessonModule
  822.                     );
  823.                 }
  824.                 
  825.                 $data[] = $lessonModuleObj;
  826.             }
  827.         }
  828.         return $data;
  829.     }
  830.     public function getModuleIndexByEnrollmentNew(
  831.         Enrollment $enrollment
  832.         LessonModule $lessonModule,
  833.         ?bool $isStudent true
  834.     )
  835.     {
  836.         $addExams false;
  837.         if(
  838.             $this->configuration->isModuleActive("exam_module") &&
  839.             $this->configuration->checkModuleIsAbleOnPlan("examFunction") &&
  840.             $this->configuration->checkModuleIsAbleOnPlan("unlimitedExamFunction")
  841.         ){
  842.             $addExams true;
  843.         }
  844.         $course $enrollment->getCourse();
  845.         $data = (object)[
  846.             "id" => $lessonModule->getId(),
  847.             "title" => $lessonModule->getTitle(),
  848.             "description" => $lessonModule->getDescription(),
  849.             "status" => $lessonModule->getStatus(),
  850.             "exam" => null,
  851.             "lessons" => $this->getHistoryByEnrollmentModuleNew(
  852.                 $enrollment,
  853.                 $lessonModule,
  854.                 $addExams,
  855.                 $isStudent
  856.             ),
  857.         ];
  858.         if($addExams){
  859.             $examRepository $this->em->getRepository(Exam::class);
  860.             $data->exam $examRepository->getExamToIndexNew(
  861.                 ExamEnum::MODULE
  862.                 $course,
  863.                 $lessonModule
  864.             );
  865.         }
  866.         return $data;
  867.     }
  868.     public function getModulesByEnrollment(Enrollment $enrollment)
  869.     {
  870.         $lessonModuleRepository $this->em->getRepository(LessonModule::class);
  871.         $lessonRepository $this->em->getRepository(Lesson::class);
  872.         $logOriginRepository $this->em->getRepository(LessonLogOrigin::class);
  873.         $examRepository $this->em->getRepository(Exam::class);
  874.         
  875.         $course $enrollment->getCourse();
  876.         $user $enrollment->getUser();
  877.         $data = [];
  878.         $lessonModules $lessonModuleRepository->getCourseLessonModules($course);
  879.         foreach ($lessonModules as $keyModule => $lessonModule) {
  880.             $lessonModuleObj = (object)[
  881.                 "id" => $lessonModule->getId(),
  882.                 "title" => $lessonModule->getTitle(),
  883.                 "description" => $lessonModule->getDescription(),
  884.                 "status" => $lessonModule->getStatus(),
  885.                 "lessonCompleted" => (int)$logOriginRepository->countLessonLogCompleteByUser(
  886.                     $course,
  887.                     $user,
  888.                     $lessonModule
  889.                 ),
  890.                 "lessonTotal" => (int)$lessonRepository->countCourseLessons(
  891.                     $course,
  892.                     $user->getId(),
  893.                     $lessonModule
  894.                 ),
  895.             ];
  896.             if($lessonModuleObj->lessonCompleted $lessonModuleObj->lessonTotal){
  897.                 $lessonModuleObj->lessonCompleted $lessonModuleObj->lessonTotal;
  898.             }
  899.             
  900.             $data[] = $lessonModuleObj;
  901.         }
  902.         return $data;
  903.     }
  904.     public function getHistoryByEnrollment(
  905.         Enrollment $enrollment
  906.         ?bool $addExams false
  907.         ?bool $isStudent true
  908.     )
  909.     {
  910.         $lessonModuleRepository $this->em->getRepository(LessonModule::class);
  911.         $lessonRepository $this->em->getRepository(Lesson::class);
  912.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  913.         $lessonSupportRepository $this->em->getRepository(LessonSupport::class);
  914.         $lessonAnnotationRepository $this->em->getRepository(LessonAnnotation::class);
  915.         $examRepository $this->em->getRepository(Exam::class);
  916.         
  917.         $stringUtil $this->generalService->getUtil('StringUtil');
  918.         $course $enrollment->getCourse();
  919.         $user $enrollment->getUser();
  920.         $data = [];
  921.         $lessonModules $lessonModuleRepository->getCourseLessonModules($course);
  922.         $lessons $lessonRepository->getCourseLessons($course);
  923.         $auxLogs = [];
  924.         $lessonLogs $lessonLogRepository->findBy(
  925.             [
  926.               "user" => $user->getId(),
  927.               "course" => $course->getId(),
  928.             ],
  929.            null
  930.            null
  931.            null
  932.            [ $course->getId(), "{$user->getId()}#" ]
  933.         );
  934.         foreach ($lessonLogs as $key => $log) {
  935.             $auxLogs[$log->getLesson()->getId()] = $log;
  936.         }
  937.         $examModule $this->configuration->isModuleActive("exam_module");
  938.         $blockNextLesson false;
  939.         $lessonIdBefore null;
  940.         foreach ($lessonModules as $keyModule => $lessonModule) {
  941.             $lessonModuleObj = (object)[
  942.                 "id" => $lessonModule->getId(),
  943.                 "courseId" => $course->getId(),
  944.                 "title" => $lessonModule->getTitle(),
  945.                 "order" => $lessonModule->getOrder(),
  946.                 "status" => $lessonModule->getStatus(),
  947.                 "controlRequirement" => $lessonModule->getControlRequirement(),
  948.                 "controlReleaseType" => $lessonModule->getControlReleaseType(),
  949.                 "controlReleaseAfterType" => $lessonModule->getControlReleaseAfterType(),
  950.                 "controlDateRelease" => $lessonModule->getControlDateRelease(),
  951.                 "controlReleasePeriod" => $lessonModule->getControlReleasePeriod(),
  952.                 "controlClosePeriod" => $lessonModule->getControlClosePeriod(),
  953.                 "moduleIsAccessible" => false,
  954.                 "lessonCompleted" => 0,
  955.                 "lessonTotal" => 0,
  956.                 "exam" => null,
  957.                 "lessons" => [],
  958.             ];
  959.             if($addExams){
  960.                 $lessonModuleObj->exam $examRepository->getExamToIndex(
  961.                     ExamEnum::MODULE$course$lessonModule
  962.                 );
  963.             }
  964.             foreach ($lessons as $keyLesson => $lesson) {
  965.                 if($lessonModuleObj->id == $lesson->getLessonModule()->getId()){
  966.                     if($lesson->getStatus() == LessonEnum::PUBLISHED){
  967.                         $lessonModuleObj->lessonTotal $lessonModuleObj->lessonTotal 1;
  968.                     }
  969.                     $lessonLog = ( 
  970.                         isset($auxLogs[$lesson->getId()]) ?
  971.                         $auxLogs[$lesson->getId()] :
  972.                         null
  973.                     );
  974.                     $lessonIsAccessible $lessonRepository->checkLessonIsAccessibleToUser(
  975.                         $lesson,
  976.                         $enrollment,
  977.                         $lessonLog,
  978.                         $isStudent,
  979.                         $lessonIdBefore,
  980.                         $blockNextLesson
  981.                     );
  982.                     if(
  983.                         !$lessonIsAccessible->isAccessible && 
  984.                         $lesson->getControlRequirement() == LessonEnum::YES
  985.                     ){
  986.                         $blockNextLesson true;
  987.                     }
  988.                     if(empty($lessonModuleObj->lessons)){
  989.                         $lessonModuleObj->moduleIsAccessible $lessonIsAccessible->isAccessible;
  990.                     }
  991.                     $dateReleaseAccess $lessonRepository->getLessonDateReleaseAccess(
  992.                         $lesson,
  993.                         $enrollment,
  994.                         $isStudent,
  995.                         $lessonIdBefore
  996.                     );
  997.                     $lessonIdBefore $lesson->getId();
  998.                     $contentPagesNumber null;
  999.                     $contentDuration null;
  1000.                     $contentType null;
  1001.                     $library $lesson->getLibrary();
  1002.                     if($library){
  1003.                         $contentPagesNumber $library->getPagesNumber();
  1004.                         $contentDuration $library->getDuration();
  1005.                         $contentType $library->getType();
  1006.                     }
  1007.                     $lessonObj = (object)[
  1008.                         "id" => $lesson->getId(),
  1009.                         "courseId" => $course->getId(),
  1010.                         "lessonModuleId" => $lessonModuleObj->id,
  1011.                         "title" => $lesson->getTitle(),
  1012.                         "order" => $lesson->getOrder(),
  1013.                         "status" => $lesson->getStatus(),
  1014.                         "lessonIsAccessible" => $lessonIsAccessible->isAccessible,
  1015.                         "dateReleaseAccess" => $dateReleaseAccess,
  1016.                         "exam" => null,
  1017.                         "quiz" => null,
  1018.                         "timeWatch" => null,
  1019.                         "numberAccess" => null,
  1020.                         "numberSupport" => null,
  1021.                         "dateLastAccess" => null,
  1022.                         "dateConclusion" => null,
  1023.                         "contentPagesNumber" => $contentPagesNumber,
  1024.                         "contentDuration" => $contentDuration,
  1025.                         "contentType" => $contentType,
  1026.                         "allowCheck" => EnrollmentEnum::YES,
  1027.                         "controlRequirement" => $lesson->getControlRequirement(),
  1028.                         "controlReleaseType" => $lesson->getControlReleaseType(),
  1029.                         "controlReleaseAfterType" => $lesson->getControlReleaseAfterType(),
  1030.                         "controlDateRelease" => $lesson->getControlDateRelease(),
  1031.                         "controlReleasePeriod" => $lesson->getControlReleasePeriod(),
  1032.                         "controlClosePeriod" => $lesson->getControlClosePeriod(),
  1033.                         "controlTime" => (
  1034.                             $lesson->getControlRequirement() ? 
  1035.                             $lesson->getControlTime() : 
  1036.                             LessonEnum::NO
  1037.                         ),
  1038.                         "controlTimeStay" => $lesson->getControlTimeStay(),
  1039.                         "controlViewLimit" => $lesson->getControlViewLimit(),
  1040.                         "controlViewNumber" => $lesson->getControlViewNumber(),
  1041.                         "controlPauseNumber" => $lesson->getControlPauseNumber(),
  1042.                     ];
  1043.                     if($lesson->getControlRequirement() == LessonEnum::YES){
  1044.                         $lessonObj->allowCheck LessonEnum::NO;
  1045.                     }
  1046.                     if(
  1047.                         !empty($lesson->getControlTimeStay()) && 
  1048.                         $lesson->getControlTimeStay() != '00:00:00'
  1049.                     ){
  1050.                         $lessonObj->allowCheck LessonEnum::NO;
  1051.                     }
  1052.                     if($addExams){
  1053.                         $lessonObj->exam $examRepository->getExamToIndex(
  1054.                             ExamEnum::LESSON
  1055.                             $course
  1056.                             $lessonModule
  1057.                             $lesson
  1058.                         );
  1059.                     }
  1060.                     $lessonObj->quiz $examRepository->getExamToIndex(
  1061.                         ExamEnum::QUIZ,
  1062.                         $course,
  1063.                         $lessonModule,
  1064.                         $lesson
  1065.                     );
  1066.                     $lessonObj->numberSupport $lessonSupportRepository->count([
  1067.                         "user" => $user->getId(),
  1068.                         "lesson" => $lesson->getId(),
  1069.                         "lessonSupport" => null,
  1070.                     ]);
  1071.                     $lessonObj->supports = [];
  1072.                     if(!empty($lessonObj->numberSupport)){
  1073.                         $supports $lessonSupportRepository->findBy([
  1074.                             "user" => $user->getId(),
  1075.                             "lesson" => $lesson->getId(),
  1076.                             "lessonSupport" => null,
  1077.                             "deleted" => LessonSupportEnum::ITEM_NO_DELETED
  1078.                         ]);
  1079.                         foreach ($supports  as $key => $support) {
  1080.                             $txt strip_tags(html_entity_decode($support->getSupport()));
  1081.                             $txt str_replace("\xc2\xa0"''$txt);
  1082.                             
  1083.                             $lessonObj->supports[] = (object)[
  1084.                                 "id" => $support->getId(),
  1085.                                 "date" => $support->getDate(),
  1086.                                 "support" => $stringUtil->shortTextCleanNew($txt),
  1087.                             ];
  1088.                         }
  1089.                     }
  1090.                     $lessonObj->notes = [];
  1091.                     $lessonNotes $lessonAnnotationRepository->findBy([
  1092.                         "user" => $user->getId(),
  1093.                         "lesson" => $lesson->getId(),
  1094.                         "deleted" => LessonAnnotationEnum::ITEM_NO_DELETED
  1095.                     ], [ "id" => "DESC" ]);
  1096.                     if(!empty($lessonNotes)){
  1097.                         foreach ($lessonNotes  as $key => $note) {
  1098.                             $lessonObj->notes[] = (object)[
  1099.                                 "id" => $note->getId(),
  1100.                                 "date" => $note->getDate(),
  1101.                                 "time" => $note->getTime(),
  1102.                                 "note" => $note->getAnnotation(),
  1103.                                 "options" => $note->getOptions()
  1104.                             ];
  1105.                         }
  1106.                     }
  1107.                     if($lessonLog){
  1108.                         if($lessonLog->getComplete() == LessonEnum::YES){
  1109.                             $lessonModuleObj->lessonCompleted $lessonModuleObj->lessonCompleted 1;
  1110.                         }
  1111.                         $lessonObj->complete $lessonLog->getComplete();
  1112.                         $lessonObj->favorite $lessonLog->getFavorite();
  1113.                         $lessonObj->timeWatch $lessonLog->getTimeWatch();
  1114.                         $lessonObj->numberAccess $lessonLog->getNumberAccess();
  1115.                         $lessonObj->dateLastAccess $lessonLog->getDateAccess();
  1116.                         $lessonObj->dateConclusion $lessonLog->getDateConclusion();
  1117.                         if(!empty($lessonObj->dateConclusion)){
  1118.                             $lessonObj->allowCheck LessonEnum::YES;
  1119.                         }
  1120.                     }
  1121.                     $lessonModuleObj->lessons[] = $lessonObj;
  1122.                 }
  1123.             }
  1124.             if($lessonModuleObj->lessonCompleted $lessonModuleObj->lessonTotal){
  1125.                 $lessonModuleObj->lessonCompleted $lessonModuleObj->lessonTotal;
  1126.             }
  1127.             $data[] = $lessonModuleObj;
  1128.         }
  1129.         return $data;
  1130.     }
  1131.     public function getHistoryByEnrollmentModuleNew(
  1132.         Enrollment $enrollment
  1133.         LessonModule $lessonModule,
  1134.         ?bool $addExams false
  1135.         ?bool $isStudent true,
  1136.         ?string $searchText null
  1137.     )
  1138.     {
  1139.         $lessonRepository $this->em->getRepository(Lesson::class);
  1140.         $libraryRepository $this->em->getRepository(Library::class);
  1141.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  1142.         $examRepository $this->em->getRepository(Exam::class);
  1143.         
  1144.         $stringUtil $this->generalService->getUtil('StringUtil');
  1145.         $course $enrollment->getCourse();
  1146.         $user $enrollment->getUser();
  1147.         $data = [];
  1148.         $lessons $lessonRepository->getCourseLessons(
  1149.             $course
  1150.             $lessonModule
  1151.             null
  1152.             $searchText
  1153.         );
  1154.         $blockNextLesson false;
  1155.         $lessonIdBefore null;
  1156.         $timeUtil $this->generalService->getUtil('DateTimeUtil');
  1157.         
  1158.         foreach ($lessons as $keyLesson => $lesson) {
  1159.             $logId "{$course->getId()}#{$user->getId()}#{$lesson->getId()}";
  1160.             $lessonLog $lessonLogRepository->find($logId);
  1161.             $lessonIsAccessible $lessonRepository->checkLessonIsAccessibleToUser(
  1162.                 $lesson,
  1163.                 $enrollment,
  1164.                 $lessonLog,
  1165.                 $isStudent,
  1166.                 $lessonIdBefore,
  1167.                 $blockNextLesson
  1168.             );
  1169.             if($lessonIsAccessible->isAccessPeriodExpired){
  1170.                 continue;
  1171.             }
  1172.             if(
  1173.                 !$lessonIsAccessible->isAccessible && 
  1174.                 $lesson->getControlRequirement() == LessonEnum::YES
  1175.             ){
  1176.                 $blockNextLesson true;
  1177.             }
  1178.             /*$dateReleaseAccess = $lessonRepository->getLessonDateReleaseAccess(
  1179.                 $lesson,
  1180.                 $enrollment,
  1181.                 $isStudent,
  1182.                 $lessonIdBefore
  1183.             );*/
  1184.             $lessonIdBefore $lesson->getId();
  1185.             $contentPagesNumber null;
  1186.             $contentDuration null;
  1187.             $contentType null;
  1188.             $contentThumb null;
  1189.             $library $lesson->getLibrary();
  1190.             if($library){
  1191.                 $contentPagesNumber $library->getPagesNumber();
  1192.                 $contentDuration $library->getDuration();
  1193.                 $contentType $library->getType();
  1194.                 $contentThumb $libraryRepository->getCover($library);
  1195.             }
  1196.             $lessonObj = (object)[
  1197.                 "id" => $lesson->getId(),
  1198.                 "title" => $lesson->getTitle(),
  1199.                 "status" => $lesson->getStatus(),
  1200.                 "required" => $lesson->getControlRequirement(),
  1201.                 "lessonIsAccessible" => $lessonIsAccessible->isAccessible,
  1202.                 "acessMessage" => $lessonIsAccessible->message,
  1203.                 "contentPagesNumber" => $contentPagesNumber,
  1204.                 "contentDuration" => (
  1205.                     $contentDuration $timeUtil->timeToSec($contentDuration) : null
  1206.                 ),
  1207.                 "contentType" => $contentType,
  1208.                 "contentThumb" => $contentThumb,
  1209.                 "exam" => null,
  1210.                 "quiz" => null,
  1211.                 "allowCheck" => EnrollmentEnum::YES,
  1212.                 "completed" => LessonEnum::NO,
  1213.             ];
  1214.             if($lessonLog && $lessonLog->getComplete() == LessonEnum::YES){
  1215.                 $lessonObj->completed $lessonLog->getViewed();
  1216.             }
  1217.             if($lesson->getControlRequirement() == LessonEnum::YES){
  1218.                 $lessonObj->allowCheck LessonEnum::NO;
  1219.             }
  1220.             if(
  1221.                 !empty($lesson->getControlTimeStay()) && 
  1222.                 $lesson->getControlTimeStay() != '00:00:00'
  1223.             ){
  1224.                 $lessonObj->allowCheck LessonEnum::NO;
  1225.             }
  1226.             if($addExams){
  1227.                 $lessonObj->exam $examRepository->getExamToIndexNew(
  1228.                     ExamEnum::LESSON
  1229.                     $course
  1230.                     $lessonModule
  1231.                     $lesson
  1232.                 );
  1233.             }
  1234.             $lessonObj->quiz $examRepository->getExamToIndexNew(
  1235.                 ExamEnum::QUIZ,
  1236.                 $course,
  1237.                 $lessonModule,
  1238.                 $lesson
  1239.             );
  1240.             
  1241.             $data[] = $lessonObj;
  1242.         }
  1243.         return $data;
  1244.     }
  1245.     public function getExpiredEnrollmentsByDate($date)
  1246.     {
  1247.         $query $this->createQueryBuilder('e');
  1248.         $query->andWhere('e.deleted = 0');
  1249.         $query->andWhere('e.datePeriod = :date');
  1250.         $query->setParameter('date'$date);
  1251.         $query->andWhere('e.status = :status');
  1252.         $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1253.         return $query->getQuery()->execute();
  1254.     }
  1255.     public function isValidEnrollmentByUser($userId$courseId)
  1256.     {
  1257.         $query $this->createQueryBuilder('e');
  1258.         
  1259.         $query->innerJoin(
  1260.             'EADPlataforma:Course''c'
  1261.             'WITH''e.course = c AND c.deleted = :deletedCourse'
  1262.         );
  1263.         $query->andWhere('e.deleted = :deleted');
  1264.         $query->andWhere('e.user = :userId');
  1265.         $query->andWhere('e.course = :courseId');
  1266.         if($userId != EnrollmentEnum::YES){
  1267.             $query->andWhere('e.status = :status');
  1268.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1269.             $query->andWhere('e.datePeriod >= :now');
  1270.             $query->setParameter('now'date('Y-m-d H:i:s'));
  1271.         }
  1272.         $query->setParameter('deletedCourse'CourseEnum::ITEM_NO_DELETED);
  1273.         $query->setParameter('deleted'EnrollmentEnum::ITEM_NO_DELETED);
  1274.         $query->setParameter('userId'$userId);
  1275.         $query->setParameter('courseId'$courseId);
  1276.         $query->select('COUNT(0) AS total');
  1277.         $result = (object)$query->getQuery()->getOneOrNullResult();
  1278.         return ($result->total 0);
  1279.     }
  1280.     public function isEnrollment($userId$courseId)
  1281.     {
  1282.         $query $this->createQueryBuilder('e');
  1283.         $query->innerJoin(
  1284.             'EADPlataforma:Course''c'
  1285.             'WITH''e.course = c AND c.deleted = :deletedCourse'
  1286.         );
  1287.         $query->andWhere('e.deleted = :deleted');
  1288.         $query->andWhere('e.user = :userId');
  1289.         $query->andWhere('e.course = :courseId');
  1290.         $query->andWhere('e.status = :status');
  1291.         $query->setParameter('deletedCourse'CourseEnum::ITEM_NO_DELETED);
  1292.         $query->setParameter('deleted'EnrollmentEnum::ITEM_NO_DELETED);
  1293.         $query->setParameter('userId'$userId);
  1294.         $query->setParameter('courseId'$courseId);
  1295.         $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1296.         $query->select('COUNT(0) AS total');
  1297.         $result = (object)$query->getQuery()->getOneOrNullResult();
  1298.         return ($result->total 0);
  1299.     }
  1300.     public function countEnrollmentsByCourse(int $courseId, ?int $status null
  1301.                                              ?int $startType null)
  1302.     {
  1303.         $query $this->createQueryBuilder('e');
  1304.         $query->select("count(e.id) AS total");
  1305.         $query->andWhere('e.deleted = 0');
  1306.         $query->andWhere('e.course = :courseId');
  1307.         $query->setParameter('courseId'$courseId);
  1308.         if(!empty($status)){
  1309.             if($status == EnrollmentEnum::STATUS_EXPIRED){
  1310.                 $query->andWhere('e.status = :status');
  1311.                 $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1312.                 $query->andWhere('e.datePeriod <= :now');
  1313.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1314.             }else if($status == EnrollmentEnum::STATUS_ACTIVE){
  1315.                 $query->andWhere('e.status = :status');
  1316.                 $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1317.                 $query->andWhere('e.datePeriod >= :now');
  1318.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1319.             }else{
  1320.                 $query->andWhere('e.status = :status');
  1321.                 $query->setParameter('status'$status);
  1322.             }
  1323.         }
  1324.         if($startType == EnrollmentEnum::SITUATION_STARTED){
  1325.             $query->andWhere('e.dateStart IS NOT NULL');
  1326.         }else if($startType == EnrollmentEnum::SITUATION_NOT_STARTED){
  1327.             $query->andWhere('e.dateStart IS NULL');
  1328.         }
  1329.         $result = (object)$query->getQuery()->getOneOrNullResult();
  1330.         return $result->total;
  1331.     }
  1332.     public function getEnrollmentsByCourse(int $courseId, ?int $status null
  1333.                                            $startType null)
  1334.     {
  1335.         $query $this->createQueryBuilder('e');
  1336.         $query->andWhere('e.deleted = 0');
  1337.         $query->andWhere('e.course = :courseId');
  1338.         $query->setParameter('courseId'$courseId);
  1339.         if(!empty($status)){
  1340.             if($status == EnrollmentEnum::STATUS_EXPIRED){
  1341.                 $query->andWhere('e.status = :status');
  1342.                 $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1343.                 $query->andWhere('e.datePeriod <= :now');
  1344.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1345.             }else if($status == EnrollmentEnum::STATUS_ACTIVE){
  1346.                 $query->andWhere('e.status = :status');
  1347.                 $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1348.                 $query->andWhere('e.datePeriod >= :now');
  1349.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1350.             }else{
  1351.                 $query->andWhere('e.status = :status');
  1352.                 $query->setParameter('status'$status);
  1353.             }
  1354.         }
  1355.         if($startType == EnrollmentEnum::SITUATION_STARTED){
  1356.             $query->andWhere('e.dateStart IS NOT NULL');
  1357.         }else if($startType == EnrollmentEnum::SITUATION_NOT_STARTED){
  1358.             $query->andWhere('e.dateStart IS NULL');
  1359.         }
  1360.         return $query->getQuery()->execute();
  1361.     }
  1362.     public function getEnrollmentsByGroup(int $groupId, ?int $status null, ?int $userId null
  1363.                                           ?int $courseId null)
  1364.     {
  1365.         $query $this->createQueryBuilder('e');
  1366.         $query->innerJoin(
  1367.             'EADPlataforma:Group''g''WITH'
  1368.             'e.course MEMBER OF g.course AND e.user MEMBER OF g.user'
  1369.         );
  1370.         $query->andWhere('e.deleted = :deleted');
  1371.         $query->andWhere('g.id = :groupId');
  1372.         $query->setParameter('groupId'$groupId);
  1373.         $query->setParameter('deleted'EnrollmentEnum::ITEM_NO_DELETED);
  1374.         if(!empty($status)){
  1375.             if($status == EnrollmentEnum::STATUS_EXPIRED){
  1376.                 $query->andWhere('e.datePeriod < :now');
  1377.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1378.                 $query->andWhere('e.status = :status');
  1379.                 $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1380.             }else{
  1381.                 $query->andWhere('e.status = :status');
  1382.                 $query->setParameter('status'$status);
  1383.             }
  1384.         }
  1385.         if($userId 0){
  1386.             $query->andWhere('e.user = :userId');
  1387.             $query->setParameter('userId'$userId);
  1388.         }
  1389.         if($courseId 0){
  1390.             $query->andWhere('e.course = :courseId');
  1391.             $query->setParameter('courseId'$courseId);
  1392.         }
  1393.         
  1394.         return $query->getQuery()->execute();
  1395.     }
  1396.     public function getEnrollmentsToEditMany(
  1397.         ?array $users null
  1398.         $courseId null
  1399.         $groupId null
  1400.         $productId null
  1401.         $teacherId null
  1402.         $applyTo null
  1403.     )
  1404.     {
  1405.         $query $this->createQueryBuilder('e');
  1406.         $query->andWhere('e.deleted = 0');
  1407.         if(!empty($users) && is_array($users)){
  1408.             $users implode(','$users);
  1409.             $query->andWhere("e.user IN ({$users})");
  1410.         }
  1411.         if($courseId 0){
  1412.             $query->andWhere('e.course = :courseId')->setParameter('courseId'$courseId);
  1413.         }
  1414.         if($groupId 0){
  1415.             $query->innerJoin(
  1416.                 'EADPlataforma:Group''g''WITH'
  1417.                 'e.course MEMBER OF g.course AND e.user MEMBER OF g.user'
  1418.             );
  1419.             $query->andWhere('g.id = :groupId');
  1420.             $query->setParameter('groupId'$groupId);
  1421.         }
  1422.         if($productId 0){
  1423.             $query->innerJoin(
  1424.                 'EADPlataforma:Product''p''WITH''e.course MEMBER OF p.course '
  1425.             );
  1426.             $query->andWhere('p.id = :productId');
  1427.             $query->setParameter('productId'$productId);
  1428.         }
  1429.         if($teacherId 0){
  1430.             $subQuery $this->createQueryBuilder('course_team');
  1431.             $subQuery->select('IDENTITY(ct.course)');
  1432.             $subQuery->from('EADPlataforma:CourseTeam''ct');
  1433.             $subQuery->andWhere('ct.user = :teacherId');
  1434.             $subQuery $subQuery->getDQL();
  1435.             $query->andWhere($query->expr()->in('e.course'$subQuery));
  1436.             $query->setParameter('teacherId'$teacherId);
  1437.         }
  1438.         if(empty($applyTo)){
  1439.             $apply EnrollmentEnum::APPLY_TO_ALL;
  1440.         }
  1441.         switch ($applyTo) {
  1442.             case EnrollmentEnum::APPLY_TO_EXPIRED
  1443.                 $query->andWhere('e.datePeriod < :now');
  1444.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1445.                 break;
  1446.             case EnrollmentEnum::APPLY_TO_VALID_PERIOD
  1447.                 $query->andWhere('e.datePeriod >= :now');
  1448.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1449.                 break;
  1450.             case EnrollmentEnum::APPLY_TO_SUPPORT_EXPIRED
  1451.                 $query->andWhere('e.dateSupport < :now');
  1452.                 $query->setParameter('now'date('Y-m-d H:i:s'));
  1453.                 break;
  1454.             case EnrollmentEnum::APPLY_TO_CANCELED
  1455.                 $query->andWhere('e.status = :statusCanceled');
  1456.                 $query->setParameter('statusCanceled'EnrollmentEnum::STATUS_CANCELED);
  1457.                 break;
  1458.         }
  1459.         return $query->getQuery()->execute();
  1460.     }
  1461.     public function getEnrollmentsByUserSubscription(UserSubscription $userSubscription)
  1462.     {
  1463.         $query $this->createQueryBuilder('e');
  1464.         $query->innerJoin(
  1465.             'EADPlataforma:UserSubscription''us''WITH''e.user = us.user'
  1466.         );
  1467.         $query->innerJoin(
  1468.             'EADPlataforma:Product''p''WITH''e.course MEMBER OF p.course '
  1469.         );
  1470.         $query->andWhere('e.deleted = 0');
  1471.         $query->andWhere('us.id = :userSubscriptionId');
  1472.         $query->andWhere('p.id = :productId');
  1473.         $query->andWhere('e.user = :userId');
  1474.         $query->setParameter('userSubscriptionId'$userSubscription->getId());
  1475.         $query->setParameter('productId'$userSubscription->getProduct()->getId());
  1476.         $query->setParameter('userId'$userSubscription->getUser()->getId());
  1477.         return $query->getQuery()->execute();
  1478.     }
  1479.     public function notify(Enrollment $enrollment)
  1480.     {
  1481.         //send email
  1482.         $emailService $this->generalService->getService('EmailService');
  1483.         $client $this->configuration->getClient();
  1484.         $user $enrollment->getUser();
  1485.         if(!$emailService->checkUserToSend($user)){
  1486.             return;
  1487.         }
  1488.         $emailService->setToEmail($user->getEmail());
  1489.         $emailService->setToName($user->getName());
  1490.         
  1491.         $subText1 $this->configuration->getLanguage('enrollment.subject1''email');
  1492.         $subText2 $this->configuration->getLanguage('enrollment.subject2''email');
  1493.         $subject $subText1 $enrollment->getCourse()->getTitle() . $subText2;
  1494.         $emailService->setSubject($subject);
  1495.         
  1496.         $domain $client->getDomainPrimary();
  1497.         $emailService->setData([
  1498.             "userName" => $user->getName(),
  1499.             "courseTitle" => $enrollment->getCourse()->getTitle(),
  1500.             "btnLink" => "https://{$domain}/enrollment/{$enrollment->getId()}",
  1501.         ]);
  1502.         $emailService->setTemplateBody("enrollment");
  1503.         $emailService->send();
  1504.         //notify user
  1505.         $notificationService $this->generalService->getService('NotificationService');
  1506.         $notificationService->create(
  1507.             $enrollment->getCourse()->getUser(),
  1508.             $user,
  1509.             NotificationEnum::ORIGIN_ENROLLMENT_NEW,
  1510.             $enrollment->getId()
  1511.         );
  1512.     }
  1513.     public function generateCertificate(Enrollment $enrollment
  1514.                                         bool $download false){
  1515.         $pdfService $this->generalService->getService('PdfService');
  1516.                                             
  1517.         $user $enrollment->getUser();
  1518.         $course $enrollment->getCourse();
  1519.         $examUserRepository $this->em->getRepository(ExamUser::class);
  1520.         $userExams $examUserRepository->getStudentReportCard($user->getId(), $course->getId());
  1521.         $finalAvarage $examUserRepository->getFinalAvarege($user->getId(), $course->getId());
  1522.         $history $this->getHistoryByEnrollment($enrollment);
  1523.         $data = [
  1524.             "enrollmentUserPhoto" => $user->getPhoto(),
  1525.             "enrollmentUserName" => mb_strtoupper($user->getName()),
  1526.             "enrollmentCourseTitle" => $course->getTitle(),
  1527.             "enrollmentDateStart" => $enrollment->getDateStart(),
  1528.             "enrollmentLastAccess" => $enrollment->getDateLastAccess(),
  1529.             "courseProgress" => $enrollment->getProgress(),
  1530.             "userExams" => $userExams,
  1531.             "finalAvarage" => $finalAvarage,
  1532.             "dataAccessLesson" => $enrollment->getLessonNumberComplete(),
  1533.             "dataAccessLessonTotal" => $enrollment->getNumberLesson(),
  1534.             "dataAccessPreview" => $enrollment->getLessonNumberViews(),
  1535.             "dataAccessSopportRequests" => $enrollment->getSupportNumberRequest(),
  1536.             "dataAccessTimeCourse" => $enrollment->getLessonTimeWatch(),
  1537.             "history" => $history
  1538.         ];
  1539.         $pdfService->setFileName("historico_do_aluno");
  1540.         $pdfService->setTemplateBody("enrollment_history");
  1541.         $pdfService->setData($data);
  1542.         return $pdfService->generate(false$download);
  1543.     }
  1544.     public function export($courseId null$userId null$groupId null
  1545.                            $teacherId null$status null$dateStart null
  1546.                            $dateEnd null)
  1547.     {
  1548.         $query $this->createQueryBuilder('e');
  1549.         $query->select("
  1550.             e.id,
  1551.             e.status,
  1552.             e.lessonNumberComplete,
  1553.             DATE_FORMAT(e.dateRegister, '%Y-%m-%d %H:%i:%s') AS dateRegister,
  1554.             DATE_FORMAT(e.dateConclusion, '%Y-%m-%d %H:%i:%s') AS dateConclusion,
  1555.             DATE_FORMAT(e.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart,
  1556.             DATE_FORMAT(e.dateSupport, '%Y-%m-%d %H:%i:%s') AS dateSupport,
  1557.             DATE_FORMAT(e.datePeriod, '%Y-%m-%d %H:%i:%s') AS datePeriod,
  1558.             DATE_FORMAT(e.dateLastAccess, '%Y-%m-%d %H:%i:%s') AS dateLastAccess,
  1559.             e.lessonNumberViews AS lessonNumberViews,
  1560.             e.supportNumberRequest AS supportNumberRequest,
  1561.             e.couponKey AS couponKey,
  1562.             e.certificate AS certificate,
  1563.             e.origin,
  1564.             e.finalAverage,
  1565.             
  1566.             u.id AS userId,
  1567.             u.status AS userStatus,
  1568.             u.name AS userName,
  1569.             u.email AS userEmail,
  1570.             u.document AS userDocument,
  1571.             DATE_FORMAT(u.birthDate, '%Y-%m-%d') AS userBirthDate,
  1572.             u.phone AS userPhone,
  1573.             u.address AS userAddress,
  1574.             u.addressNumber AS userAddressNumber,
  1575.             u.addressComplement AS userAddressComplement,
  1576.             u.addressNeighborhood AS userAddressNeighborhood,
  1577.             u.zipCode AS userZipCode,
  1578.             u.occupation AS userOccupation,
  1579.             u.notes AS userNotes,
  1580.             u.custom AS userCustom,
  1581.             DATE_FORMAT(u.dateRegister, '%Y-%m-%d %H:%i:%s') AS userDateRegister,
  1582.             u.acceptTerms AS userAcceptTerms,
  1583.             u.customField AS userCustomField,
  1584.             ct.name AS cityName,
  1585.             st.name AS stateName,
  1586.             cty.name AS countryName,
  1587.             c.title,
  1588.             c.numberLesson,
  1589.             c.certificateAverage,
  1590.             ca.category,
  1591.             g.name AS groupName
  1592.         ");
  1593.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = e.course');
  1594.         $query->innerJoin('EADPlataforma:Category''ca''WITH''ca.id = c.category');
  1595.         $query->innerJoin('EADPlataforma:User''u''WITH''u.id = e.user');
  1596.         $query->leftJoin('EADPlataforma:City''ct''WITH''ct.id = u.city');
  1597.         $query->leftJoin('EADPlataforma:State''st''WITH''st.id = u.state');
  1598.         $query->leftJoin('EADPlataforma:Country''cty''WITH''cty.id = u.country');
  1599.         
  1600.         $query->andWhere('e.deleted = :deleted');
  1601.         $query->andWhere('u.deleted = :deleted');
  1602.         $query->andWhere('c.deleted = :deleted');
  1603.         $query->andWhere('u.id > 1');
  1604.         $query->andWhere('u.status != :userStatus');
  1605.         $query->setParameter('userStatus'UserEnum::INACTIVE);
  1606.         $query->setParameter('deleted'UserEnum::ITEM_NO_DELETED);
  1607.         if(!is_null($dateStart) && !is_null($dateEnd)){
  1608.             $query->andWhere('DATE(e.dateRegister) BETWEEN :dateStart AND :dateEnd');
  1609.             $query->setParameter('dateStart'$dateStart);
  1610.             $query->setParameter('dateEnd'$dateEnd);
  1611.         }
  1612.         if(!empty($courseId)){
  1613.             $query->andWhere('e.course = :course')->setParameter('course'$courseId);
  1614.         }
  1615.        
  1616.         if(!empty($groupId)){
  1617.             $query->innerJoin(
  1618.                 'EADPlataforma:Group''g''WITH'
  1619.                 'e.course MEMBER OF g.course AND e.user MEMBER OF g.user'
  1620.             );
  1621.             $query->andWhere('g.id = :groupId');
  1622.             $query->setParameter('groupId'$groupId);
  1623.         }else{
  1624.             $query->leftJoin(
  1625.                 'EADPlataforma:Group''g''WITH'
  1626.                 'e.course MEMBER OF g.course AND e.user MEMBER OF g.user'
  1627.             );
  1628.         }
  1629.         
  1630.         if(!empty($userId)){
  1631.             $query->andWhere('e.user = :user')->setParameter('user'$userId);
  1632.         }
  1633.         
  1634.         if(!empty($teacherId)){
  1635.             $subQuery $this->createQueryBuilder('course_team');
  1636.             $subQuery->select('IDENTITY(cteam.course)');
  1637.             $subQuery->from('EADPlataforma:CourseTeam''cteam');
  1638.             $subQuery->andWhere('cteam.user = :teacherId');
  1639.             $subQuery $subQuery->getDQL();
  1640.             $query->andWhere($query->expr()->in('e.course'$subQuery));
  1641.             $query->setParameter('teacherId'$teacherId);
  1642.         }
  1643.         if($status == EnrollmentEnum::STATUS_EXPIRED){
  1644.             $query->andWhere('e.datePeriod < :now');
  1645.             $query->setParameter('now'date('Y-m-d H:i:s'));
  1646.             $query->andWhere('e.status = :status');
  1647.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1648.         }else if($status == EnrollmentEnum::STATUS_ACTIVE){
  1649.             $query->andWhere('e.datePeriod >= :now');
  1650.             $query->setParameter('now'date('Y-m-d H:i:s'));
  1651.             $query->andWhere('e.status = :status');
  1652.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1653.         }else if(!empty($status)){
  1654.             $query->andWhere('e.status = :status');
  1655.             $query->setParameter('status'$status);
  1656.         }
  1657.         
  1658.         $data $query->getQuery()->execute();
  1659.         return $data;
  1660.     }
  1661.     public function getEnrollmentBeforeExpireByCourse(Course $coursestring $dateExpire)
  1662.     {
  1663.         $query $this->createQueryBuilder('e');
  1664.         $query->andWhere('e.deleted = 0');
  1665.         $query->andWhere('e.course = :course');
  1666.         $query->andWhere('DATE(e.datePeriod) = :datePeriod');
  1667.         $query->setParameter('course'$course->getId());
  1668.         $query->setParameter('datePeriod'$dateExpire);
  1669.         return $query->getQuery()->execute();
  1670.     }
  1671.     public function updateDataAccessLog(Enrollment $enrollment, ?bool $updateDate true){
  1672.         $course $enrollment->getCourse();
  1673.         $courseId $enrollment->getCourse()->getId();
  1674.         $userId $enrollment->getUser()->getId();
  1675.         $courseRepository $this->em->getRepository(Course::class);
  1676.         $lessonSupportRepository $this->em->getRepository(LessonSupport::class);
  1677.         $lessonLogRepository $this->emEadmin->getRepository(LessonLog::class);
  1678.         $lessonLogOriginRepository $this->em->getRepository(LessonLogOrigin::class);
  1679.         $isStudent $courseRepository->isStudent($course);
  1680.         $lessonsNumberComplete $lessonLogRepository->countLessonLogCompleteByUser(
  1681.             $course,
  1682.             $enrollment->getUser()
  1683.         );
  1684.         $lessonsDateLastAccess $lessonLogRepository->getLessonDateLastAccess(
  1685.             $courseId
  1686.             $userId
  1687.         );
  1688.         $lessonsNumberViews $lessonLogRepository->getLessonNumberViews(
  1689.             $courseId
  1690.             $userId
  1691.         );
  1692.         $lessonTimeWatch $lessonLogRepository->userLessonTimeWatch(
  1693.             $course
  1694.             $enrollment->getUser()
  1695.         );
  1696.         $supportNumberRequest $lessonSupportRepository->getSupportNumberRequestByEnrollment(
  1697.             $enrollment
  1698.         );
  1699.         $enrollment->setLessonTimeWatch(
  1700.             !empty($lessonTimeWatch) ? $lessonTimeWatch null
  1701.         );
  1702.         if($this->getUser()){
  1703.             if($this->getUser()->getId() == $userId && $updateDate){
  1704.                 if(empty($lessonsDateLastAccess)){
  1705.                     $lessonsDateLastAccess date('Y-m-d H:i:s');
  1706.                 }
  1707.                 $enrollment->setDateLastAccess(
  1708.                     !empty($lessonsDateLastAccess) ? $lessonsDateLastAccess null
  1709.                 );
  1710.                 if(empty($enrollment->getDateStart()) && !empty($lessonsDateLastAccess)){
  1711.                     if($isStudent){
  1712.                         //send mkt start course
  1713.                         $marketingService $this->generalService->getService(
  1714.                             'Marketing\\MarketingService'
  1715.                         );
  1716.             
  1717.                         $marketingService->setTag(TagsMarketingEnum::TAG_BEGIN_COURSE);
  1718.                         $marketingService->setTextComplement($course->getTitle());
  1719.                         $marketingService->setUser($this->getUser());
  1720.                         $marketingService->send();
  1721.                     }
  1722.                     $enrollment->setDateStart(date('Y-m-d H:i:s'));
  1723.                 }
  1724.             }
  1725.         }
  1726.         
  1727.         $enrollment->setLessonNumberComplete((int)$lessonsNumberComplete);
  1728.         $enrollment->setLessonNumberViews((int)$lessonsNumberViews);
  1729.         $enrollment->setSupportNumberRequest((int)$supportNumberRequest);
  1730.         $this->em->flush();
  1731.         return $enrollment;
  1732.     }
  1733.     public function getEnrollmentForPresence(Course $course, ?bool $active true
  1734.                                              ?int $user null, ?int $groupId null
  1735.                                              ?string $dateStart null
  1736.                                              ?string $dateEnd null)
  1737.     {
  1738.         $query $this->createQueryBuilder('e');
  1739.         $query->innerJoin('EADPlataforma:User''u''WITH''u.id = e.user');
  1740.         if($active){
  1741.             $query->andWhere('e.datePeriod >= :now');
  1742.             $query->setParameter('now'date('Y-m-d H:i:s'));
  1743.             $query->andWhere('e.status = :status');
  1744.             $query->setParameter('status'EnrollmentEnum::STATUS_ACTIVE);
  1745.         }
  1746.         if(!empty($user)){
  1747.             $query->andWhere('e.user = :user');
  1748.             $query->setParameter('user'$user);
  1749.         }
  1750.         if(!empty($groupId)){
  1751.             $query->innerJoin(
  1752.                 'EADPlataforma:Group''g''WITH'
  1753.                 'e.course MEMBER OF g.course AND e.user MEMBER OF g.user'
  1754.             );
  1755.             $query->andWhere('g.id = :groupId');
  1756.             $query->setParameter('groupId'$groupId);
  1757.         }
  1758.         if(!is_null($dateStart) && !is_null($dateEnd)){
  1759.             $query->andWhere('DATE(e.dateLastAccess) BETWEEN :dateStart AND :dateEnd');
  1760.             $query->setParameter('dateStart'$dateStart);
  1761.             $query->setParameter('dateEnd'$dateEnd);
  1762.         }
  1763.         $query->andWhere('u.status != :userStatus');
  1764.         $query->setParameter('userStatus'UserEnum::INACTIVE);
  1765.         
  1766.         $query->andWhere('e.deleted = 0');
  1767.         $query->andWhere('u.deleted = 0');
  1768.         $query->andWhere('u.id > 1');
  1769.         $query->andWhere('e.course = :course');
  1770.         $query->setParameter('course'$course->getId());
  1771.         return $query->getQuery()->execute();
  1772.     }
  1773.     public function restore(Enrollment $enrollment$typeItem)
  1774.     {
  1775.         $itemId $enrollment->getId();
  1776.         $dateNow date('Y-m-d H:i:s');
  1777.         $enrollment->setUserDelete($this->getUser());
  1778.         $enrollment->setDateDelete(date('Y-m-d H:i:s'));
  1779.         $enrollment->restore();
  1780.         $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  1781.         
  1782.         $examUserRepository $this->em->getRepository(ExamUser::class);
  1783.             $examUsers $examUserRepository->findBy([
  1784.                 "course" => $enrollment->getCourse()->getId(),
  1785.                 "user" => $enrollment->getUser()->getId(),
  1786.                 "deleted" => ExamUserEnum::ITEM_ON_TRASH
  1787.             ]);
  1788.             foreach ($examUsers as $examUser) {
  1789.                 $this->em->getRepository(ExamUser::class)->restoreByExamUser(
  1790.                     $examUser->getId(),
  1791.                     EnrollmentEnum::ITEM_NO_DELETED,
  1792.                     EnrollmentEnum::CASCADE
  1793.                     $this->getUser() ?? null
  1794.                     $dateNow
  1795.                 );           
  1796.             }
  1797.     }
  1798.     public function delete(Enrollment $enrollment$typeItem$permission$isTrash)
  1799.     {
  1800.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  1801.         if($isTrash == 1){
  1802.             $permission $userPermissionUtil->getPermission("trash""delete");
  1803.         }
  1804.         $isInTeam false;
  1805.         $course $enrollment->getCourse();
  1806.         $dateNow date('Y-m-d H:i:s');
  1807.         if($this->getUser()){
  1808.             $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1809.                 $course
  1810.                 $this->getUser()
  1811.             );
  1812.         }
  1813.         
  1814.         if($isInTeam || $userPermissionUtil->isHigh($permission)){
  1815.             $enrollment->setUserDelete($this->getUser());
  1816.             $enrollment->setDateDelete(date('Y-m-d H:i:s'));
  1817.             $enrollment->individual();
  1818.             if($enrollment->isOnTrash() || $enrollment->isDeleted()){
  1819.                 $enrollment->delete();
  1820.                 $itemId $enrollment->getId();
  1821.                 $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  1822.             }
  1823.             if(!$enrollment->isOnTrash() && !$enrollment->isDeleted()){
  1824.                 $enrollment->trash();
  1825.                 $this->em->getRepository(Trash::class)->insertTrash(
  1826.                     $enrollment
  1827.                     $typeItem
  1828.                     "Aluno: {$enrollment->getUser()->getName()} | Curso: {$enrollment->getCourse()->getTitle()}"
  1829.                 );
  1830.             }
  1831.             $examUserRepository $this->em->getRepository(ExamUser::class);
  1832.             $examUsers $examUserRepository->findBy([
  1833.                 "course" => $enrollment->getCourse()->getId(),
  1834.                 "user" => $enrollment->getUser()->getId(),
  1835.                 "deleted" => ExamUserEnum::ITEM_NO_DELETED
  1836.             ]);
  1837.             foreach ($examUsers as $examUser) {              
  1838.                 $this->em->getRepository(ExamUser::class)->deleteByExamUser(
  1839.                     $examUser->getId(),
  1840.                     EnrollmentEnum::ITEM_ON_TRASH
  1841.                     EnrollmentEnum::CASCADE
  1842.                     ($this->getUser() ? $this->getUser()->getId() : null),
  1843.                     $dateNow
  1844.                 );           
  1845.             }
  1846.         }
  1847.         $this->em->flush();
  1848.     }
  1849.     public function restoreByUser($userId$deleted$typeDelete$userDelete$dateNow){
  1850.         $sql "UPDATE EADPlataforma:Enrollment AS e 
  1851.                 SET e.deleted = :deleted, e.userDelete = :userDelete, 
  1852.                     e.dateDelete = :dateNow
  1853.                 WHERE e.deleted = (1 - :deleted)
  1854.                 AND e.typeDelete = :typeDelete
  1855.                 AND e.user = :userId";
  1856.         $query $this->em->createQuery($sql);
  1857.         $query->setParameter('userId'$userId);
  1858.         $query->setParameter('deleted'$deleted);
  1859.         $query->setParameter('typeDelete'$typeDelete);
  1860.         $query->setParameter('userDelete'$userDelete);
  1861.         $query->setParameter('dateNow'$dateNow);
  1862.         $query->execute();
  1863.         
  1864.         return true;
  1865.     }
  1866.     public function deleteByUser($userId$deleted$typeDelete$userDelete$dateNow){
  1867.         $sql "UPDATE EADPlataforma:Enrollment AS e 
  1868.                 SET e.deleted = :deleted, e.typeDelete = :typeDelete,
  1869.                     e.userDelete = :userDelete, e.dateDelete = :dateNow
  1870.                 WHERE e.deleted = (:deleted - 1)
  1871.                 AND e.user = :userId";
  1872.         $query $this->em->createQuery($sql);
  1873.         $query->setParameter('userId'$userId);
  1874.         $query->setParameter('deleted'$deleted);
  1875.         $query->setParameter('typeDelete'$typeDelete);
  1876.         $query->setParameter('userDelete'$userDelete);
  1877.         $query->setParameter('dateNow'$dateNow);
  1878.         $query->execute();
  1879.         
  1880.         return true;
  1881.     }
  1882.     public function restoreByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1883.         $sql "UPDATE EADPlataforma:Enrollment AS e 
  1884.                 SET e.deleted = :deleted, e.userDelete = :userDelete, 
  1885.                     e.dateDelete = :dateNow
  1886.                 WHERE e.deleted = (1 - :deleted)
  1887.                 AND e.typeDelete = :typeDelete
  1888.                 AND e.course = :courseId";
  1889.         $query $this->em->createQuery($sql);
  1890.         $query->setParameter('courseId'$courseId);
  1891.         $query->setParameter('deleted'$deleted);
  1892.         $query->setParameter('typeDelete'$typeDelete);
  1893.         $query->setParameter('userDelete'$userDelete);
  1894.         $query->setParameter('dateNow'$dateNow);
  1895.         $query->execute();
  1896.         
  1897.         return true;
  1898.     }
  1899.     public function deleteByCourse($courseId$deleted$typeDelete$userDelete$dateNow){
  1900.         $sql "UPDATE EADPlataforma:Enrollment AS e 
  1901.                 SET e.deleted = :deleted, e.typeDelete = :typeDelete,
  1902.                     e.userDelete = :userDelete, e.dateDelete = :dateNow
  1903.                 WHERE e.deleted = (:deleted - 1)
  1904.                 AND e.course = :courseId";
  1905.         $query $this->em->createQuery($sql);
  1906.         $query->setParameter('courseId'$courseId);
  1907.         $query->setParameter('deleted'$deleted);
  1908.         $query->setParameter('typeDelete'$typeDelete);
  1909.         $query->setParameter('userDelete'$userDelete);
  1910.         $query->setParameter('dateNow'$dateNow);
  1911.         $query->execute();
  1912.         
  1913.         return true;
  1914.     }
  1915.     public function deleteTrashCron()
  1916.     {
  1917.         $sql "UPDATE EADPlataforma:Enrollment AS e SET e.deleted = 2 
  1918.                 WHERE e.dateDelete <= :date AND e.deleted = 1 ";
  1919.         $query $this->em->createQuery($sql);
  1920.         $query->setParameter('date'date('Y-m-d H:i:s'strtotime('-90 days')));
  1921.         $query->execute();
  1922.     }
  1923.     public function bulkUpdateStatus(array $enrollmentsint $status): array
  1924.     {
  1925.         foreach ($enrollments as $enrollment) {
  1926.             $enrollment->setStatus($status);
  1927.         }
  1928.         $this->em->flush();
  1929.         return $enrollments;
  1930.     }
  1931.     public function updateEnrollmentsWithGroup(array $enrollments, array $data)
  1932.     {
  1933.         $dates $this->verifyDate($data);
  1934.         foreach ($enrollments as $enrollment) {
  1935.             $enrollment->setDatePeriod($dates['dateAccessConclusion']);
  1936.             $enrollment->setDateSupport($dates['dateSupportConclusion']);
  1937.         }
  1938.         $this->em->flush();
  1939.         return $enrollments;
  1940.     }
  1941.     public function verifyDate($data)
  1942.     {
  1943.         $dates = [];
  1944.         if($data["typeDateAccess"] == GroupEnum::TYPE_DATE_FIXED){
  1945.             $dateAccessConclusion $data["dateAccessConclusion"];
  1946.         }
  1947.         if($data["typeDateSupport"] == GroupEnum::TYPE_DATE_FIXED){
  1948.             $dateSupportConclusion $data["dateSupportConclusion"];
  1949.         }
  1950.         if($data["typeDateAccess"] == GroupEnum::TYPE_DATE_PERIOD){
  1951.             $period $data["dateAccessDays"];
  1952.             $dateNow date('Y-m-d H:i:s');
  1953.             $dateSupportConclusion date('Y-m-d H:i:s'strtotime("{$dateNow} + {$period} days"));
  1954.         }
  1955.         if($data["typeDateSupport"] == GroupEnum::TYPE_DATE_PERIOD){
  1956.             $period $data["dateSupportDays"];
  1957.             $dateNow date('Y-m-d H:i:s');
  1958.             $dateSupportConclusion date('Y-m-d H:i:s'strtotime("{$dateNow} + {$period} days"));           
  1959.         }
  1960.         $dates = [
  1961.             "dateAccessConclusion"  => $dateAccessConclusion,
  1962.             "dateSupportConclusion" => $dateSupportConclusion,
  1963.         ];
  1964.         return $dates;
  1965.     }
  1966.     public function getSituation(int $progress, ?float $certificateAverage, ?float $finalAverage)
  1967.     {
  1968.         $situation EnrollmentEnum::SITUATION_NOT_STARTED;
  1969.         if($progress >= 100){
  1970.             $situation EnrollmentEnum::SITUATION_COMPLETED;
  1971.         }else if($progress 0){
  1972.             $situation EnrollmentEnum::SITUATION_STARTED;
  1973.         }
  1974.         if(!empty($finalAverage) && $situation == EnrollmentEnum::SITUATION_COMPLETED){
  1975.             if($finalAverage >= $certificateAverage){
  1976.                 return $this->configuration->getLanguage('approved''enrollments');
  1977.             }else{
  1978.                 return $this->configuration->getLanguage('disapproved''enrollments');
  1979.             }
  1980.         }
  1981.         $situationLabels = [
  1982.             EnrollmentEnum::SITUATION_NOT_STARTED => "not_started",
  1983.             EnrollmentEnum::SITUATION_STARTED => "in_progress",
  1984.             EnrollmentEnum::SITUATION_COMPLETED => "completed",
  1985.         ];
  1986.         $index $situationLabels[$situation];
  1987.         return $this->configuration->getLanguage($index'enrollments');
  1988.     }
  1989. }