src/Controller/Admin/CourseController.php line 988

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Controller\Admin;
  3. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use EADPlataforma\Entity\Course;
  7. use EADPlataforma\Entity\CourseTeam;
  8. use EADPlataforma\Entity\Category;
  9. use EADPlataforma\Entity\Product;
  10. use EADPlataforma\Entity\ProductOffer;
  11. use EADPlataforma\Entity\ProductTeam;
  12. use EADPlataforma\Entity\Lesson;
  13. use EADPlataforma\Entity\CourseCertificateTemplate;
  14. use EADPlataforma\Entity\Enrollment;
  15. use EADPlataforma\Entity\Exam;
  16. use EADPlataforma\Entity\User;
  17. use EADPlataforma\Entity\UserSubscription;
  18. use EADPlataforma\Enum\CourseEnum;
  19. use EADPlataforma\Enum\CourseTeamEnum;
  20. use EADPlataforma\Enum\ProductEnum;
  21. use EADPlataforma\Enum\EnrollmentEnum;
  22. use EADPlataforma\Enum\ExamEnum;
  23. use EADPlataforma\Enum\ErrorEnum;
  24. use EADPlataforma\Util\StringUtil;
  25. /**
  26.  * @Route(
  27.  *      path          = "/admin/course",
  28.  *      schemes         = {"http|https"}
  29.  * )
  30.  * @Cache(
  31.  *      maxage          = "0",
  32.  *      smaxage         = "0",
  33.  *      expires         = "now",
  34.  *      public          = false
  35.  * )
  36.  */
  37. class CourseController extends AbstractController {
  38.     public function getEntityClass(){
  39.         return Course::class;
  40.     }
  41.     /**
  42.      * @Route(
  43.      *      path          = "/list/paginate/",
  44.      *      methods       = {"GET"},
  45.      * )
  46.      */
  47.     public function getCoursePaginate(Request $request) {
  48.         $permission $this->userPermissionUtil->getPermission("course""see");
  49.         if($this->userPermissionUtil->isLow($permission)){
  50.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  51.         }
  52.         $this->requestUtil->setRequest($request)->setData();
  53.         $userClass User::class;
  54.         $categoryClass Category::class;
  55.         $courseTeamClass CourseTeam::class;
  56.         $productClass Product::class;
  57.         $enrollmentClass Enrollment::class;
  58.         $userOnId $this->user->getId();
  59.         $columns = [
  60.             "c.id"
  61.             "c.title",
  62.             "c.order",
  63.             "c.status",
  64.             "c.free",
  65.             "c.workload",
  66.             "cc.id AS categoryId",
  67.             "cc.category",
  68.             "u.name"
  69.             "u.photo",
  70.             "u.email",
  71.             "u.id AS userId",
  72.         ];
  73.         $columnNotUseInFilter = [
  74.             "(CASE WHEN c.id IN ( 
  75.                 SELECT
  76.                    IDENTITY(ct.course)
  77.                 FROM {$courseTeamClass} AS ct 
  78.                 WHERE ct.deleted = 0 
  79.                 AND ct.user = {$userOnId}
  80.             ) THEN 1 ELSE 0 END ) AS isInTeam "
  81.         ];
  82.         $joins = [
  83.             "{$userClass} AS u" => "u.id = c.user",
  84.             "{$categoryClass} AS cc" => "cc.id = c.category "
  85.         ];
  86.         $productId = (int)$this->requestUtil->getField('product');
  87.         if($productId 0){
  88.             $joins["{$productClass} AS p"] = " c MEMBER OF p.course 
  89.                                                AND p.deleted = 0 
  90.                                                AND p.id = {$productId} ";
  91.         }
  92.         $productIdNotInclude = (int)$this->requestUtil->getField('productNotInclude');
  93.         if($productIdNotInclude 0){
  94.             $joins["{$productClass} AS p"] = " c NOT MEMBER OF p.course 
  95.                                                AND p.deleted = 0 
  96.                                                AND p.id = {$productIdNotInclude} ";
  97.         }
  98.         $onlyCertificate = (int)$this->requestUtil->getField('onlyCertificate');
  99.         $categoryId = (int)$this->requestUtil->getField('category');
  100.         $status $this->requestUtil->getField('status');
  101.         $userId = (int)$this->requestUtil->getField('user');
  102.         $enrollment = (int)$this->requestUtil->getField('enrollment');
  103.         $orderParam $this->requestUtil->getField('order');
  104.         $searchText $this->requestUtil->getField('searchText');
  105.         $limit $this->requestUtil->getField('limit');
  106.         $offset $this->requestUtil->getField('offset');
  107.         $free $this->requestUtil->getField('free');
  108.         $filter = [];
  109.         $filterDelete $this->requestUtil->getDeletedParam();
  110.         $filter["whereText"] = " c.id > 0 ";
  111.         if($this->userPermissionUtil->isMiddle($permission)){
  112.             $filter["whereText"] .= " AND c.id IN ( 
  113.                                         SELECT
  114.                                            IDENTITY(cTeam.course)
  115.                                         FROM {$courseTeamClass} AS cTeam 
  116.                                         WHERE cTeam.deleted = 0 
  117.                                         AND cTeam.user = {$userOnId}
  118.                                     ) ";
  119.         }
  120.         if($enrollment == CourseEnum::YES){
  121.             $filter["whereText"] .= " AND c.id IN ( 
  122.                                         SELECT
  123.                                            IDENTITY(e.course)
  124.                                         FROM {$enrollmentClass} AS e 
  125.                                         WHERE e.deleted = 0
  126.                                     ) ";
  127.         }
  128.         
  129.         if(!empty($onlyCertificate)){
  130.             $filter["whereText"] .= " AND c.courseCertificateTemplate IS NOT NULL ";
  131.         }
  132.         if($categoryId 0){
  133.             $filter["c.category"] = $categoryId;
  134.         }
  135.         if (!is_null($free)) {
  136.             $filter["c.free"] = $free;
  137.         }
  138.         if(!is_null($status)){
  139.             if($status == CourseEnum::FREE){
  140.                 
  141.                 $yes CourseEnum::YES;
  142.                 $statusPubli CourseEnum::PUBLISHED;
  143.                 $filter["whereText"] .= 
  144.                     AND c.free = {$yes} AND c.status = {$statusPubli} 
  145.                 ";
  146.             }else if($status == CourseEnum::PUBLISHED){
  147.                 $no CourseEnum::NO;
  148.                 $filter["whereText"] .= 
  149.                     AND c.free = {$no} AND c.status = {$status} 
  150.                 ";
  151.                 
  152.             }else{
  153.                 $filter["c.status"] = $status;
  154.             }
  155.         }
  156.         if($userId 0){
  157.             $filter["c.user"] = $userId;
  158.         }
  159.         $order = ["c.order" => "ASC"];
  160.         if(!empty($orderParam)){
  161.             $order json_decode($orderParamtrue);
  162.         }
  163.         $data $this->repository->paginate(
  164.             "c"
  165.             $searchText
  166.             $columns
  167.             $joins
  168.             $filter
  169.             $order
  170.             $limit
  171.             $offset
  172.             $filterDelete,
  173.             false,
  174.             $columnNotUseInFilter
  175.         );
  176.         $examRepository $this->em->getRepository(Exam::class);
  177.         foreach ($data["rows"] as $key => $item) {
  178.             $item = (object)$item;
  179.             $item->title StringUtil::fromUnicode($item->title);
  180.             if($item->status == CourseEnum::PUBLISHED && $item->free == CourseEnum::YES){
  181.                 $item->status CourseEnum::FREE;
  182.             }
  183.             /*$item->hasQuiz = $examRepository->count([
  184.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  185.                 "type" => ExamEnum::QUIZ,
  186.                 "course" => $item->id,
  187.             ]);*/
  188.             $item->hasExam $examRepository->count([
  189.                 "deleted" => ExamEnum::ITEM_NO_DELETED,
  190.                 "type" => ExamEnum::COURSE,
  191.                 "status" => ExamEnum::PUBLISHED,
  192.                 "course" => $item->id,
  193.             ]);
  194.             $data["rows"][$key] = $item;
  195.         }
  196.         return $this->eadResponse($data);
  197.     }
  198.     /**
  199.      * @Route(
  200.      *      path          = "/list/paginate/all",
  201.      *      methods       = {"GET"},
  202.      * )
  203.      */
  204.     public function getCoursePaginateAll(Request $request) {
  205.         $permission $this->userPermissionUtil->getPermission("course""see");
  206.         $this->requestUtil->setRequest($request)->setData();
  207.         $columns = [
  208.             "c.id"
  209.             "c.title",
  210.             "c.order",
  211.             "c.status",
  212.             "c.free",
  213.             "c.workload",
  214.             "cc.id AS categoryId",
  215.             "cc.category",
  216.             "u.name"
  217.             "u.photo",
  218.             "u.email",
  219.             "u.id AS userId",
  220.             "DATE_FORMAT(c.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  221.             "ud.name AS userDelete"
  222.         ];
  223.         $userClass User::class;
  224.         $categoryClass Category::class;
  225.         $courseTeamClass CourseTeam::class;
  226.         $productClass Product::class;
  227.         $joins = [
  228.             "{$userClass} AS u" => "u.id = c.user",
  229.             "{$categoryClass} AS cc" => "cc.id = c.category",
  230.             "{$userClass} AS ud" => ["LEFT""ud.id = c.userDelete "]
  231.         ];
  232.         $productId = (int)$this->requestUtil->getField('product');
  233.         if($productId 0){
  234.             $joins["{$productClass} AS p"] = " c MEMBER OF p.course 
  235.                                                AND p.deleted = 0 
  236.                                                AND p.id = {$productId} ";
  237.         }
  238.         $productIdNotInclude = (int)$this->requestUtil->getField('productNotInclude');
  239.         if($productIdNotInclude 0){
  240.             $joins["{$productClass} AS p"] = " c NOT MEMBER OF p.course 
  241.                                                AND p.deleted = 0 
  242.                                                AND p.id = {$productIdNotInclude} ";
  243.         }
  244.         $onlyCertificate = (int)$this->requestUtil->getField('onlyCertificate');
  245.         $categoryId = (int)$this->requestUtil->getField('category');
  246.         $status $this->requestUtil->getField('status');
  247.         $userId = (int)$this->requestUtil->getField('user');
  248.         $certificate $this->requestUtil->getField('certificate');
  249.         $productType = (int)$this->requestUtil->getField('productType');
  250.         $orderParam $this->requestUtil->getField('order');
  251.         $searchText $this->requestUtil->getField('searchText');
  252.         $limit $this->requestUtil->getField('limit');
  253.         $offset $this->requestUtil->getField('offset');
  254.         $filter = [];
  255.         $filterDelete $this->requestUtil->getDeletedParam();
  256.         $filter["whereText"] = " c.id > 0 ";
  257.         if($this->userPermissionUtil->isMiddle($permission)){
  258.             $userOnId $this->user->getId();
  259.             $filter["whereText"] .= " AND c.id IN ( 
  260.                                         SELECT
  261.                                            IDENTITY(ct.course)
  262.                                         FROM {$courseTeamClass} AS ct 
  263.                                         WHERE ct.deleted = 0 
  264.                                         AND ct.user = {$userOnId}
  265.                                     ) ";
  266.         }
  267.         if(!empty($onlyCertificate)){
  268.             $filter["whereText"] .= " c.courseCertificateTemplate IS NOT NULL ";
  269.         }
  270.         
  271.         if($categoryId 0){
  272.             $filter["c.category"] = $categoryId;
  273.         }
  274.         if(!is_null($status)){
  275.             $filter["c.status"] = $status;
  276.         }
  277.         if($certificate == CourseEnum::YES){
  278.             $filter["c.certificate"] = CourseEnum::YES;
  279.         }
  280.         if($productType == ProductEnum::CERTIFICATE){
  281.             $no ProductEnum::NO;
  282.             $filter["whereText"] .= " AND {$no} = (
  283.                                         SELECT
  284.                                            COUNT(pCert.id)
  285.                                         FROM {$productClass} AS pCert 
  286.                                         WHERE pCert.deleted = 0 
  287.                                         AND c MEMBER OF pCert.course 
  288.                                     ) ";
  289.         }
  290.         if($userId 0){
  291.             $filter["c.user"] = $userId;
  292.         }
  293.         $order = ["c.order" => "ASC"];
  294.         if(!empty($orderParam)){
  295.             $order json_decode($orderParamtrue);
  296.         }
  297.         $data $this->repository->paginate(
  298.             "c"
  299.             $searchText
  300.             $columns
  301.             $joins
  302.             $filter
  303.             $order
  304.             $limit
  305.             $offset
  306.             $filterDelete
  307.         );
  308.         foreach ($data["rows"] as $key => $item) {
  309.             $item = (object)$item;
  310.             $item->title StringUtil::fromUnicode($item->title);
  311.             $data["rows"][$key] = $item;
  312.         }
  313.         return $this->eadResponse($data);
  314.     }
  315.     /**
  316.      * @Route(
  317.      *      path          = "/index/{id}",
  318.      *      methods       = {"GET"},
  319.      *      requirements  = { "id" = "\d+" }
  320.      * )
  321.      */
  322.     public function getCourseIndex(Request $request) {
  323.         
  324.         $courseId $request->get('id');
  325.         $course $this->repository->findOneBy([
  326.             "id" => $courseId,
  327.             "deleted" => CourseEnum::ITEM_NO_DELETED
  328.         ]);
  329.         
  330.         if(!$course){
  331.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  332.         }
  333.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  334.             $course
  335.             $this->user
  336.         );
  337.         $enrollmentRepository $this->em->getRepository(Enrollment::class);
  338.         $enrollment $enrollmentRepository->findOneBy([
  339.             "user" => $this->user->getId(),
  340.             "course" => (int)$request->get('id'),
  341.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED,
  342.         ], [ "id" => "DESC" ]);
  343.         $permission $this->userPermissionUtil->getPermission("course""see");
  344.         
  345.         if(!$enrollment){
  346.             if($course->getFree() == CourseEnum::NO){
  347.                 if($this->userPermissionUtil->isLow($permission)){
  348.                     return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  349.                 }
  350.                 if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  351.                     return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  352.                 }
  353.             }
  354.             $enrollmentService $this->generalService->getService('EnrollmentService');
  355.             $info $enrollmentService->enrollUser($this->user$course);
  356.             
  357.             if(!$info->errors){
  358.                 $enrollment $info->enrollment;
  359.             }else{
  360.                 return $this->eadResponse($info->errorsErrorEnum::FIELD_EMPTY);
  361.             }
  362.         }
  363.         if($this->userPermissionUtil->isLow($permission) && !$isInTeam){
  364.             if(!$enrollment){
  365.                 return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  366.             }
  367.             if($course->getStatus() == CourseEnum::DRAFT){
  368.                 return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  369.             }
  370.         }
  371.         if(!$enrollment){
  372.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  373.         }
  374.         $courseIndex $enrollmentRepository->getCourseIndexByEnrollment($enrollmenttrue);
  375.         $clientImage $this->fileService->getFilePathComplete(
  376.             $this->configuration->get('logo'), 
  377.             CourseEnum::PATH_OTHERS,
  378.             true,
  379.             true,
  380.             'logo-lesson'
  381.         );
  382.         $clientLessonImage $this->fileService->getFilePathComplete(
  383.             $this->configuration->get('logo_lesson'), 
  384.             CourseEnum::PATH_OTHERS,
  385.             true,
  386.             true,
  387.             'logo-lesson'
  388.         );
  389.         $productOfferRepository $this->em->getRepository(ProductOffer::class);
  390.         $productOffersCertificate $productOfferRepository->getProductOffersByCourse(
  391.             $course
  392.             ProductEnum::CERTIFICATE
  393.         );
  394.         foreach ($productOffersCertificate as $key => $productOffer) {
  395.             $productOffersCertificate[$key] = $productOffer->toReturnClean();
  396.             $productOffersCertificate[$key]->type ProductEnum::CERTIFICATE;
  397.         }
  398.         $productOffersPeriodSupport $productOfferRepository->getProductOffersByCourse(
  399.             $course
  400.             ProductEnum::PERIOD_SUPORT
  401.         );
  402.         foreach ($productOffersPeriodSupport as $key => $productOffer) {
  403.             $productOffersPeriodSupport[$key] = $productOffer->toReturnClean();
  404.             $productOffersPeriodSupport[$key]->type ProductEnum::PERIOD_SUPORT;
  405.         }
  406.         $productOffersPeriod $productOfferRepository->getProductOffersByCourse(
  407.             $course
  408.             ProductEnum::PERIOD
  409.         );
  410.         foreach ($productOffersPeriod as $key => $productOffer) {
  411.             $productOffersPeriod[$key] = $productOffer->toReturnClean();
  412.             $productOffersPeriod[$key]->type ProductEnum::PERIOD;
  413.         }
  414.         $productOffersSupport $productOfferRepository->getProductOffersByCourse(
  415.             $course
  416.             ProductEnum::SUPPORT
  417.         );
  418.         foreach ($productOffersSupport as $key => $productOffer) {
  419.             $productOffersSupport[$key] = $productOffer->toReturnClean();
  420.             $productOffersSupport[$key]->type ProductEnum::SUPPORT;
  421.         }
  422.         $user $enrollment->getUser();
  423.         $drmFontColor $this->configuration->get("drm_font_color_video");
  424.         if(empty($drmFontColor)){
  425.             $drmFontColor $this->configuration->get("primary_color_video");
  426.         }
  427.         if(empty($drmFontColor)){
  428.             $drmFontColor "#08EC6C";
  429.         }
  430.         $drmFontSize $this->configuration->get("drm_font_size_video");
  431.         if(empty($drmFontSize)){
  432.             $drmFontSize 12;
  433.         }
  434.         $drmVideo CourseEnum::NO;
  435.         $drmShowIdVideo CourseEnum::NO;
  436.         $drmShowIpVideo CourseEnum::NO;
  437.         $drmShowDocumentVideo CourseEnum::NO;
  438.         if($this->configuration->checkModuleIsAbleOnPlan('lessonControlFunction')){
  439.             $drmVideo $this->configuration->get("drm_video");
  440.             $drmShowIdVideo $this->configuration->get("drm_show_user_id_video");
  441.             $drmShowIpVideo $this->configuration->get("drm_show_user_ip_video");
  442.             $drmShowDocumentVideo $this->configuration->get(
  443.                 "drm_show_user_document_video"
  444.             );
  445.         }
  446.         $data = [
  447.             "productOffersCertificate" => $productOffersCertificate,
  448.             "productOffersPeriod" => array_merge(
  449.                 $productOffersPeriodSupport
  450.                 $productOffersPeriod
  451.             ),
  452.             "productOffersSupport" => array_merge(
  453.                 $productOffersPeriodSupport
  454.                 $productOffersSupport
  455.             ),
  456.             "canAccessAdm" => $this->userPermissionUtil->canAccessAdm(),
  457.             "courseIndex" => $courseIndex,
  458.             "clientImage" => $clientImage,
  459.             "clientLessonImage" => $clientLessonImage,
  460.             "clientBrand" => $this->client->getBrand(),
  461.             "drmAllowCopyPdf" => $this->configuration->get("drm_allow_copy_pdf"),
  462.             "drmAllowPrintPdf" => $this->configuration->get("drm_allow_print_pdf"),
  463.             "drmAllowDownloadPdf" => $this->configuration->get("drm_allow_download_pdf"),
  464.             "drmFontColor" => $drmFontColor,
  465.             "drmFontSize" => $drmFontSize,
  466.             "drmVideo" => $drmVideo,
  467.             "drmShowIdVideo" => $drmShowIdVideo,
  468.             "drmShowIpVideo" => $drmShowIpVideo,
  469.             "drmShowDocumentVideo" => $drmShowDocumentVideo,
  470.             "date" => date('Y-m-d H:i:s'),
  471.             "user" => (object)[
  472.                 "id" => $user->getId(),
  473.                 "ip" => $request->getClientIp(),
  474.                 "name" => $user->getName(),
  475.                 "document" => $user->getDocument(),
  476.                 "username" => $user->getUsername(),
  477.                 "photo" => $user->getPhoto(true),
  478.                 "permissionName" => (
  479.                     $user->getUserProfile() ? 
  480.                     $user->getUserProfile()->getName() 
  481.                     : null
  482.                 ),
  483.             ],
  484.         ];
  485.         return $this->eadResponse($data);
  486.     }
  487.     /**
  488.      * @Route(
  489.      *      path          = "/progress/{id}",
  490.      *      methods       = {"GET"},
  491.      *      requirements  = { "id" = "\d+" }
  492.      * )
  493.      */
  494.     public function getCourseProgress(Request $request) {
  495.         
  496.         $courseId $request->get('id');
  497.         $course $this->repository->findOneBy([
  498.             "id" => $courseId,
  499.             "deleted" => CourseEnum::ITEM_NO_DELETED
  500.         ]);
  501.         
  502.         if(!$course){
  503.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  504.         }
  505.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  506.             $course
  507.             $this->user
  508.         );
  509.         $enrollmentRepository $this->em->getRepository(Enrollment::class);
  510.         $enrollment $enrollmentRepository->findOneBy([
  511.             "user" => $this->user->getId(),
  512.             "course" => (int)$request->get('id'),
  513.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED,
  514.         ]);
  515.         $permission $this->userPermissionUtil->getPermission("course""see");
  516.         
  517.         if(!$enrollment){
  518.             if($course->getFree() == CourseEnum::NO){
  519.                 if($this->userPermissionUtil->isLow($permission)){
  520.                     return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  521.                 }
  522.                 if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  523.                     return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  524.                 }
  525.             }
  526.             $enrollmentService $this->generalService->getService('EnrollmentService');
  527.             $info $enrollmentService->enrollUser($this->user$course);
  528.             
  529.             if(!$info->errors){
  530.                 $enrollment $info->enrollment;
  531.             }
  532.         }
  533.         if($this->userPermissionUtil->isLow($permission) && !$isInTeam){
  534.             if($course->getStatus() == CourseEnum::DRAFT){
  535.                 return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  536.             }
  537.         }
  538.         $certificate $enrollmentRepository->checkAndIssueCertificate($enrollment);
  539.         $courseHasCertificate = ($course->getCertificate() == CourseEnum::YES);
  540.         $certificateSale false;
  541.         $linkPdf null;
  542.         $linkBuy null;
  543.         if($courseHasCertificate){
  544.             if(!$certificate && $enrollment->getCertificate() == EnrollmentEnum::NO){
  545.                 $productOfferRepository $this->em->getRepository(ProductOffer::class);
  546.                 $certificateOffer $productOfferRepository->getProductOfferCertificateByCourse(
  547.                     $course
  548.                 );
  549.                 if($certificateOffer){
  550.                     $certificateSale true;
  551.                     $linkBuy $this->generalService->generateUrl("cartAdd", [
  552.                         "poID" => $certificateOffer->getId(),
  553.                         "courseId" => $course->getId(),
  554.                     ]);
  555.                 }
  556.             }
  557.         }
  558.         if($certificate){
  559.             $linkPdf $this->generalService->generateUrl("viewCertificate", [
  560.                 "code" => $certificate->getCode(),
  561.                 "date" => $certificate->getDateIssue('Y-m-d'),
  562.             ]);
  563.         }
  564.         return $this->eadResponse([
  565.             "progress" => $enrollment->getProgress(),
  566.             "courseHasCertificate" => $courseHasCertificate,
  567.             "certificateIssue" => ($certificate true false),
  568.             "certificateLink" => $linkPdf,
  569.             "certificateSale" => $certificateSale,
  570.             "certificateLinkBuy" => $linkBuy,
  571.         ]);
  572.     }
  573.     /**
  574.      * @Route(
  575.      *      path          = "/content/{id}",
  576.      *      methods       = {"GET"},
  577.      *      requirements  = { "id" = "\d+" }
  578.      * )
  579.      */
  580.     public function getCourseContent(Request $request) {
  581.         
  582.         $courseId $request->get('id');
  583.         $course $this->repository->findOneBy([
  584.             "id" => $courseId,
  585.             "deleted" => CourseEnum::ITEM_NO_DELETED
  586.         ]);
  587.         
  588.         if (!$course) {
  589.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  590.         }
  591.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  592.             $course
  593.             $this->user
  594.         );
  595.         $permission $this->userPermissionUtil->getPermission("course""see");
  596.         if($this->userPermissionUtil->isLow($permission) && !$isInTeam){
  597.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  598.         }
  599.         $data $this->repository->getCourseContent($course);
  600.         return $this->eadResponse($data);
  601.     }
  602.     
  603.     /**
  604.      * @Route(
  605.      *      path          = "/check/user/{id}",
  606.      *      methods       = {"GET"},
  607.      *      requirements  = { "id" = "\d+" }
  608.      * )
  609.      */
  610.     public function checkIsInCourseTeam(Request $request){
  611.         $courseId $request->get('id');
  612.         $course $this->repository->findOneBy([
  613.             "id" => $courseId
  614.         ]);
  615.         
  616.         if (!$course) {
  617.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  618.         }
  619.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  620.             $course
  621.             $this->user
  622.         );
  623.         return $this->eadResponse([ "is" => ( $isInTeam ) ]);
  624.     }
  625.     /**
  626.      * @Route(
  627.      *      path          = "/detail/{id}",
  628.      *      methods       = {"GET"},
  629.      *      requirements  = { "id" = "\d+" }
  630.      * )
  631.      */
  632.     public function getCourse(Request $request) {
  633.         $permission $this->userPermissionUtil->getPermission("course""see");
  634.         if($this->userPermissionUtil->isLow($permission)){
  635.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  636.         }
  637.         $courseId $request->get('id');
  638.         $course $this->repository->findOneBy([
  639.             "id" => $courseId,
  640.             "deleted" => CourseEnum::ITEM_NO_DELETED
  641.         ]);
  642.         
  643.         if (!$course) {
  644.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  645.         }
  646.         $courseTeamRepository $this->em->getRepository(CourseTeam::class);
  647.         $isInTeam $courseTeamRepository->userExistInCourseTeam(
  648.             $course
  649.             $this->user
  650.         );
  651.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  652.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  653.         }
  654.         $courseTeam $courseTeamRepository->findOneBy([
  655.             "course" => $course->getId(),
  656.             "user" => $course->getUser()->getId(),
  657.             "deleted" => CourseTeamEnum::ITEM_NO_DELETED
  658.         ]);
  659.         
  660.         $data $course->toReturn();
  661.         $numberOfPublishCourses $this->repository->count([
  662.             "deleted" => CourseEnum::ITEM_NO_DELETED,
  663.             "status" => CourseEnum::PUBLISHED
  664.         ]);
  665.         $data['numberOfPublishCourses'] = $numberOfPublishCourses;
  666.         
  667.         $data['courseTeam'] = ($courseTeam $courseTeam->getId() : null);
  668.         $data['isInTeam'] = $isInTeam;
  669.         $data['urlCourseIndex'] = $this->generalService->generateUrl('courseIndex', [ 
  670.             'id' => $courseId 
  671.         ]);
  672.         return $this->eadResponse($data);
  673.     }
  674.     /**
  675.      * @Route(
  676.      *      path          = "/register",
  677.      *      methods       = {"POST"},
  678.      * )
  679.      */
  680.     public function registerCourse(Request $request) {
  681.         $permission $this->userPermissionUtil->getPermission("course""create");
  682.         if($this->userPermissionUtil->isLow($permission)){
  683.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  684.         }
  685.         $this->requestUtil->setRequest($request)->setData();
  686.         $filePhoto $this->requestUtil->getFile('photo');
  687.         $fileCover $this->requestUtil->getFile('cover');
  688.         
  689.         $course = new Course();
  690.         if($this->requestUtil->issetField('order')){
  691.             $course->setOrder((int)$this->requestUtil->getField("order"));
  692.         }
  693.         
  694.         if($this->requestUtil->issetField('title')){
  695.             $course->setTitle($this->requestUtil->getField("title"));
  696.         }
  697.         
  698.         if($this->requestUtil->issetField('certificate')){
  699.             $course->setCertificate((int)$this->requestUtil->getField("certificate"));
  700.         }
  701.         if($this->requestUtil->issetField('certificatePeriod')){
  702.             $course->setCertificatePeriod(
  703.                 (int)$this->requestUtil->getField("certificatePeriod")
  704.             );
  705.         }
  706.         if($this->requestUtil->issetField('configPeriodMinConclusion')){
  707.             $course->setConfigPeriodMinConclusion(
  708.                 (int)$this->requestUtil->getField("configPeriodMinConclusion")
  709.             );
  710.         }
  711.         if($this->requestUtil->issetField('certificateAverage')){
  712.             $course->setCertificateAverage(
  713.                 (float)$this->requestUtil->getField("certificateAverage")
  714.             );
  715.         }
  716.         
  717.         if($this->requestUtil->issetField('dateRelease')){
  718.             $course->setDateRelease($this->requestUtil->getField("dateRelease"));
  719.         }
  720.         if($this->requestUtil->issetField('support')){
  721.             $course->setSupport((int)$this->requestUtil->getField("support"));
  722.         }
  723.         if($this->requestUtil->issetField('supportPeriod')){
  724.             $course->setSupportPeriod($this->requestUtil->getField("supportPeriod"));
  725.         }
  726.         if($this->requestUtil->issetField('lifetimeSupport')){
  727.             $course->setLifetimeSupport((int)$this->requestUtil->getField("lifetimeSupport"));
  728.         }
  729.         
  730.         if($this->requestUtil->issetField('workload')){
  731.             $course->setWorkload($this->requestUtil->getField("workload"));
  732.         }
  733.         $course->setStatus(CourseEnum::DRAFT);
  734.         if($this->requestUtil->issetField('free')){
  735.             $course->setFree((int)$this->requestUtil->getField("free"));
  736.         }
  737.         if($this->requestUtil->issetField('accessPeriod')){
  738.             $course->setAccessPeriod($this->requestUtil->getField("accessPeriod"));
  739.         }
  740.         if($this->requestUtil->issetField('lifetimePeriod')){
  741.             $course->setLifetimePeriod((int)$this->requestUtil->getField("lifetimePeriod"));
  742.         }
  743.         
  744.         if($this->requestUtil->issetField('courseCertificateTemplate')){
  745.             $courseCertificateTemplateId = (int)$this->requestUtil->getField(
  746.                 'courseCertificateTemplate'
  747.             );
  748.             $templateRepository $this->em->getRepository(CourseCertificateTemplate::class);
  749.             $certificateTemplate $templateRepository->findOneBy([
  750.                 "id" => $courseCertificateTemplateId,
  751.                 "deleted" => CourseEnum::ITEM_NO_DELETED
  752.             ]);
  753.             
  754.             if($certificateTemplate){
  755.                 $course->setCourseCertificateTemplate($certificateTemplate);
  756.             }
  757.         }
  758.         
  759.         if($this->requestUtil->issetField('courseCategory')){
  760.             $categoryId = (int)$this->requestUtil->getField('courseCategory');
  761.             if($categoryId 0){
  762.                 $category $this->em->getRepository(Category::class)->findOneBy([
  763.                     "id" => $categoryId,
  764.                     "deleted" => CourseEnum::ITEM_NO_DELETED
  765.                 ]);
  766.                 
  767.                 if($category){
  768.                     $course->setCategory($category);
  769.                 }
  770.             }
  771.         }
  772.         if($this->requestUtil->issetField('user')){ //set User in Course
  773.             $userId $this->requestUtil->getField('user');
  774.             if($userId && $this->userPermissionUtil->isHigh($permission)){
  775.                 $user $this->em->getRepository(User::class)->findOneBy([
  776.                     "id" => $userId,
  777.                     "deleted" => CourseEnum::ITEM_NO_DELETED
  778.                 ]);
  779.                 
  780.                 if($user){
  781.                     $course->setUser($user);
  782.                 }
  783.             }else if($userId == $this->user->getId()){
  784.                 $course->setUser($this->user);
  785.             }
  786.         }else{
  787.             $course->setUser($this->user);
  788.         }
  789.         
  790.         //Define Course order 
  791.         $order $course->getOrder();
  792.         $lastOrder $this->repository->count([ 
  793.             "deleted" => CourseEnum::ITEM_NO_DELETED 
  794.         ]) + 1;
  795.             
  796.         if(empty($order) || ($order $lastOrder)){
  797.             $course->setOrder($lastOrder);
  798.             $order $lastOrder;
  799.         }
  800.         
  801.         if($course->getStatus() == CourseEnum::DRAFT){
  802.             $course->setOrder($lastOrder);
  803.             $order $lastOrder;
  804.         }
  805.         
  806.         $errors $this->validateEntity($course);
  807.         if($errors){
  808.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  809.         }
  810.             
  811.         if($filePhoto){
  812.             $filePhoto $this->fileService->setFile($filePhoto);
  813.             if($filePhoto){
  814.                 $this->fileService->moveFile(CourseEnum::PATH_STORE);
  815.                 $course->setPhoto($this->fileService->getFileName());
  816.             }
  817.         }
  818.         if($fileCover){
  819.             $fileCover $this->fileService->setFile($fileCover);
  820.             if($fileCover){
  821.                 $this->fileService->moveFile(CourseEnum::PATH_COVERS);
  822.                 $course->setCover($this->fileService->getFileName());
  823.             }
  824.         }
  825.         //Update all register to understand the new order
  826.         $this->repository->refreshOrder(null$order);
  827.         $courseTeam = new CourseTeam();
  828.         $courseTeam->setCourse($course);
  829.         $courseTeam->setUser($course->getUser());
  830.         $this->em->persist($course);
  831.         $this->em->persist($courseTeam);
  832.         
  833.         $this->em->flush();
  834.         
  835.         $data $course->toReturn();
  836.         
  837.         $this->userLogService->logInsert("course"$course->getId(), $data);
  838.         
  839.         return $this->eadResponse($data);
  840.     }
  841.     /**
  842.      * @Route(
  843.      *      path          = "/edit/{id}",
  844.      *      methods       = {"POST"},
  845.      *      requirements  = { "id" = "\d+" }
  846.      * )
  847.      */
  848.     public function editCourse(Request $request) {
  849.         $permission $this->userPermissionUtil->getPermission("course""edit");
  850.         if($this->userPermissionUtil->isLow($permission)){
  851.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  852.         }
  853.         $this->requestUtil->setRequest($request)->setData();
  854.         $courseId $request->get('id');
  855.         $course $this->repository->findOneBy([
  856.             "id" => $courseId,
  857.             "deleted" => CourseEnum::ITEM_NO_DELETED
  858.         ]);
  859.         if (!$course) {
  860.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  861.         }
  862.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  863.             $course
  864.             $this->user
  865.         );
  866.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  867.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  868.         }
  869.         $filePhoto $this->requestUtil->getFile('photo');
  870.         $fileCover $this->requestUtil->getFile('cover');
  871.         $oldOrder $course->getOrder();
  872.         if($this->requestUtil->issetField('order')){
  873.             $course->setOrder((int)$this->requestUtil->getField("order"));
  874.         }
  875.         
  876.         if($this->requestUtil->issetField('title')){
  877.             $course->setTitle($this->requestUtil->getField("title"));
  878.         }
  879.         
  880.         if($this->requestUtil->issetField('certificatePeriod')){
  881.             $course->setCertificatePeriod((int)$this->requestUtil->getField("certificatePeriod"));
  882.         }
  883.         if($this->requestUtil->issetField('configPeriodMinConclusion')){
  884.             $course->setConfigPeriodMinConclusion(
  885.                 (int)$this->requestUtil->getField("configPeriodMinConclusion")
  886.             );
  887.         }
  888.         
  889.         if($this->requestUtil->issetField('certificate')){
  890.             $course->setCertificate((int)$this->requestUtil->getField("certificate"));
  891.         }
  892.         
  893.         if($this->requestUtil->issetField('certificateAverage')){
  894.             $course->setCertificateAverage(
  895.                 (float)$this->requestUtil->getField("certificateAverage")
  896.             );
  897.         }
  898.         
  899.         if($this->requestUtil->issetField('dateRelease')){
  900.             $course->setDateRelease($this->requestUtil->getField("dateRelease"));
  901.         }
  902.         if($this->requestUtil->issetField('support')){
  903.             $course->setSupport((int)$this->requestUtil->getField("support"));
  904.         }
  905.         if($this->requestUtil->issetField('supportPeriod')){
  906.             $course->setSupportPeriod($this->requestUtil->getField("supportPeriod"));
  907.         }
  908.         if($this->requestUtil->issetField('lifetimeSupport')){
  909.             $course->setLifetimeSupport((int)$this->requestUtil->getField("lifetimeSupport"));
  910.         }
  911.         
  912.         if($this->requestUtil->issetField('workload')){
  913.             $course->setWorkload($this->requestUtil->getField("workload"));
  914.         }
  915.         $oldStatus $course->getStatus();
  916.         if($this->requestUtil->issetField('status')){
  917.             $course->setStatus((int)$this->requestUtil->getField("status"));
  918.         }
  919.         if($this->requestUtil->issetField('free')){
  920.             $course->setFree((int)$this->requestUtil->getField("free"));
  921.         }
  922.         if($this->requestUtil->issetField('accessPeriod')){
  923.             $course->setAccessPeriod($this->requestUtil->getField("accessPeriod"));
  924.         }
  925.         if($this->requestUtil->issetField('lifetimePeriod')){
  926.             $course->setLifetimePeriod((int)$this->requestUtil->getField("lifetimePeriod"));
  927.         }
  928.         
  929.         if($this->requestUtil->issetField('courseCertificateTemplate')){
  930.             $courseCertificateTemplateId = (int)$this->requestUtil->getField(
  931.                 'courseCertificateTemplate'
  932.             );
  933.             $templateRepository $this->em->getRepository(CourseCertificateTemplate::class);
  934.             $certificateTemplate $templateRepository->findOneBy([
  935.                 "id" => $courseCertificateTemplateId,
  936.                 "deleted" => CourseEnum::ITEM_NO_DELETED
  937.             ]);
  938.             
  939.             if($certificateTemplate){
  940.                 $course->setCourseCertificateTemplate($certificateTemplate);
  941.             }
  942.         }
  943.         
  944.         if($this->requestUtil->issetField('courseCategory')){
  945.             $categoryId = (int)$this->requestUtil->getField('courseCategory');
  946.             $category $this->em->getRepository(Category::class)->findOneBy([
  947.                 "id" => $categoryId,
  948.                 "deleted" => CourseEnum::ITEM_NO_DELETED
  949.             ]);
  950.             
  951.             if($category){
  952.                 $course->setCategory($category);
  953.             }
  954.         }
  955.         if($this->requestUtil->issetField('courseTeam')){
  956.             $courseTeamId $this->requestUtil->getField('courseTeam');
  957.             if($courseTeamId && $this->userPermissionUtil->isHigh($permission)){
  958.                 $courseTeam $this->em->getRepository(CourseTeam::class)->findOneBy([
  959.                     "id" => $courseTeamId,
  960.                     "course" => $course->getId(),
  961.                     "deleted" => CourseTeamEnum::ITEM_NO_DELETED
  962.                 ]);
  963.                 
  964.                 if($courseTeam){
  965.                     $course->setUser($courseTeam->getUser());
  966.                 }
  967.             }
  968.         }
  969.         $lastOrder $this->repository->count([ "deleted" => CourseEnum::ITEM_NO_DELETED ]);
  970.         $newOrder $course->getOrder();
  971.         
  972.         if(empty($newOrder) || $newOrder $lastOrder){
  973.             $course->setOrder($lastOrder);
  974.             $newOrder $lastOrder;
  975.         }
  976.         if($course->getStatus() == CourseEnum::DRAFT){
  977.             $course->setOrder($lastOrder);
  978.             $newOrder $lastOrder;
  979.         }
  980.         if($filePhoto){
  981.             $filePhoto $this->fileService->setFile($filePhoto);
  982.             if($filePhoto){
  983.                 $this->fileService->moveFile(CourseEnum::PATH_STORE);
  984.                 $course->setPhoto($this->fileService->getFileName());
  985.             }
  986.         }
  987.         if($fileCover){
  988.             $fileCover $this->fileService->setFile($fileCover);
  989.             if($fileCover){
  990.                 $this->fileService->moveFile(CourseEnum::PATH_COVERS);
  991.                 $course->setCover($this->fileService->getFileName());
  992.             }
  993.         }
  994.         $errors $this->validateEntity($course);
  995.         if($errors){
  996.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  997.         }
  998.         if(!$this->configuration->checkModuleIsAbleOnPlan('unlimitedCourseFunction')){
  999.             $publishCourses $this->repository->count([
  1000.                 "deleted" => CourseEnum::ITEM_NO_DELETED,
  1001.                 "status" => CourseEnum::PUBLISHED
  1002.             ]);
  1003.             if(
  1004.                 !empty($publishCourses) && 
  1005.                 $course->getStatus() == CourseEnum::PUBLISHED &&
  1006.                 $oldStatus != $course->getStatus()
  1007.             ){
  1008.                 return $this->eadResponse([ "status" ], ErrorEnum::FIELD_EMPTY);
  1009.             }
  1010.         }
  1011.         $course->setDateUpdate(date('Y-m-d H:i:s'));
  1012.         if($oldOrder != $newOrder){
  1013.             $this->repository->refreshOrder($oldOrder$newOrder);
  1014.         }
  1015.         $this->em->flush();
  1016.         $products $course->getProduct();
  1017.         foreach ($products as $key => $product) {
  1018.             $this->repository->getAllCourseTimeByProduct($producttrue);
  1019.         }
  1020.         $data $course->toReturn();
  1021.         $this->userLogService->logUpdate("course"$course->getId(), $data);
  1022.         return $this->eadResponse($data);
  1023.     }
  1024.     /**
  1025.      * @Route(
  1026.      *      path          = "/edit/lesson/control/{id}",
  1027.      *      methods       = {"PUT"},
  1028.      *      requirements  = { "id" = "\d+" }
  1029.      * )
  1030.      */
  1031.     public function editCourseLessonControl(Request $request) {
  1032.         
  1033.         $permission $this->userPermissionUtil->getPermission(
  1034.             "course"
  1035.             "lesson"
  1036.             "access_control"
  1037.         );
  1038.         if($this->userPermissionUtil->isLow($permission)){
  1039.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1040.         }
  1041.         if(!$this->configuration->checkModuleIsAbleOnPlan('lessonControlFunction')){
  1042.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  1043.         }
  1044.        
  1045.         $this->requestUtil->setRequest($request)->setData();
  1046.         $courseId $request->get('id');
  1047.         $course $this->repository->findOneBy([
  1048.             "id" => $courseId,
  1049.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1050.         ]);
  1051.         if (!$course) {
  1052.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1053.         }
  1054.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1055.             $course
  1056.             $this->user
  1057.         );
  1058.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1059.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1060.         }
  1061.         if($this->requestUtil->issetField('controlLessonRequirement')){
  1062.             $course->setControlLessonRequirement(
  1063.                 (int)$this->requestUtil->getField("controlLessonRequirement")
  1064.             );
  1065.         }
  1066.         if($this->requestUtil->issetField('controlLessonReleaseType')){
  1067.             $course->setControlLessonReleaseType(
  1068.                 (int)$this->requestUtil->getField("controlLessonReleaseType")
  1069.             );
  1070.         }
  1071.         if($this->requestUtil->issetField('controlLessonAfterType')){
  1072.             $course->setControlLessonAfterType(
  1073.                 (int)$this->requestUtil->getField("controlLessonAfterType")
  1074.             );
  1075.         }
  1076.         if($this->requestUtil->issetField('controlLessonDateRelease')){
  1077.             $course->setControlLessonDateRelease(
  1078.                 $this->requestUtil->getField("controlLessonDateRelease")
  1079.             );
  1080.         }
  1081.         if($this->requestUtil->issetField('controlLessonReleasePeriod')){
  1082.             $course->setControlLessonReleasePeriod(
  1083.                 (int)$this->requestUtil->getField("controlLessonReleasePeriod")
  1084.             );
  1085.         }
  1086.         if($this->requestUtil->issetField('controlLessonClosePeriod')){
  1087.             $course->setControlLessonClosePeriod(
  1088.                 (int)$this->requestUtil->getField("controlLessonClosePeriod")
  1089.             );
  1090.         }
  1091.         if($this->requestUtil->issetField('controlLessonTime')){
  1092.             $course->setControlLessonTime(
  1093.                 (int)$this->requestUtil->getField("controlLessonTime")
  1094.             );
  1095.         }
  1096.         if($this->requestUtil->issetField('controlLessonTimeStay')){
  1097.             $course->setControlLessonTimeStay(
  1098.                 $this->requestUtil->getField("controlLessonTimeStay")
  1099.             );
  1100.         }
  1101.         if($this->requestUtil->issetField('controlLessonViewLimit')){
  1102.             $course->setControlLessonViewLimit(
  1103.                 (int)$this->requestUtil->getField("controlLessonViewLimit")
  1104.             );
  1105.         }
  1106.         if($this->requestUtil->issetField('controlLessonViewNumber')){
  1107.             $course->setControlLessonViewNumber(
  1108.                 (int)$this->requestUtil->getField("controlLessonViewNumber")
  1109.             );
  1110.         }
  1111.         if($this->requestUtil->issetField('controlLessonShowDocument')){
  1112.             $course->setControlLessonShowDocument(
  1113.                 (int)$this->requestUtil->getField("controlLessonShowDocument")
  1114.             );
  1115.         }
  1116.         if($this->requestUtil->issetField('controlLessonApply')){
  1117.             $course->setControlLessonApply(
  1118.                 (int)$this->requestUtil->getField("controlLessonApply")
  1119.             );
  1120.         }
  1121.         if($course->getControlLessonTimeStay() == "00:00:00"){
  1122.             $course->setControlLessonTimeStay(null);
  1123.         }
  1124.       
  1125.         $groupsValidation = [];
  1126.         if($course->getControlLessonReleaseType() == CourseEnum::LESSON_FIXED_DATE){
  1127.             $groupsValidation[] = "controlReleaseTypeFixed";
  1128.         }else if($course->getControlLessonReleaseType() == CourseEnum::LESSON_FLEXIBLE_DATE){
  1129.             $groupsValidation[] = "controlReleaseTypeFlex";
  1130.         }
  1131.         if($course->getControlLessonViewLimit() == CourseEnum::YES){
  1132.             $groupsValidation[] = "limitedView";
  1133.         }
  1134.         
  1135.         $errors $this->validateEntity($course$groupsValidation);
  1136.         if($errors){
  1137.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  1138.         }
  1139.         $course->setDateUpdate(date('Y-m-d H:i:s'));
  1140.         $this->em->flush();
  1141.         if($course->getControlLessonApply() != CourseEnum::ONLY_NEW_LESSONS){
  1142.             $this->repository->applyCourseLessonConfigAll($course);
  1143.         }
  1144.         $data $course->toReturn();
  1145.         $this->userLogService->logUpdate("course"$course->getId(), $data);
  1146.         return $this->eadResponse($data);
  1147.     }
  1148.     /**
  1149.      * @Route(
  1150.      *      path          = "/edit/many/status",
  1151.      *      methods       = {"PUT"}
  1152.      * )
  1153.      */
  1154.     public function editManyStatusCourse(Request $request) {
  1155.         $permission $this->userPermissionUtil->getPermission("course""edit");
  1156.         if($this->userPermissionUtil->isLow($permission)){
  1157.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1158.         }
  1159.         if(!$this->configuration->checkModuleIsAbleOnPlan('unlimitedCourseFunction')){
  1160.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  1161.         }
  1162.         
  1163.         $this->requestUtil->setRequest($request)->setData();
  1164.         $courseId $this->requestUtil->getField('courses');
  1165.         if(empty($courseId)){
  1166.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  1167.         };
  1168.         $courseId json_decode($courseId);
  1169.         foreach ($courseId as $key => $id) {
  1170.             $course $this->repository->findOneBy([
  1171.                 "id" => $id,
  1172.                 "deleted" => CourseEnum::ITEM_NO_DELETED
  1173.             ]);
  1174.         
  1175.             if($course) {
  1176.                 if($this->requestUtil->issetField('status')){
  1177.                     $course->setStatus((int)$this->requestUtil->getField('status'));
  1178.                 }
  1179.                 $errors $this->validateEntity($course);
  1180.                 if(!$errors){
  1181.                     $this->em->flush();
  1182.                     $products $course->getProduct();
  1183.                     foreach ($products as $key => $product) {
  1184.                         $this->repository->getAllCourseTimeByProduct($producttrue);
  1185.                     }
  1186.                 
  1187.                     $data $course->toReturn();
  1188.                     $this->userLogService->logUpdate(
  1189.                         "course"
  1190.                         $course->getId(), 
  1191.                         $data
  1192.                     );
  1193.                 }
  1194.             }
  1195.         }
  1196.         return $this->eadResponse([ "message" => "Success" ]);
  1197.     }
  1198.     /**
  1199.      * @Route(
  1200.      *      path          = "/add/product/{id}",
  1201.      *      methods       = {"POST"},
  1202.      *      requirements  = { "id" = "\d+" }
  1203.      * )
  1204.      */
  1205.     public function addProduct(Request $request) {
  1206.         $permission $this->userPermissionUtil->getPermission(
  1207.             "product"
  1208.             "product_course"
  1209.             "add"
  1210.         );
  1211.         if($this->userPermissionUtil->isLow($permission)){
  1212.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1213.         }
  1214.         $this->requestUtil->setRequest($request)->setData();
  1215.         $courseId $request->get('id');
  1216.         $course $this->repository->findOneBy([
  1217.             "id" => $courseId,
  1218.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1219.         ]);
  1220.         if (!$course){
  1221.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1222.         }
  1223.         $products $this->requestUtil->getField('products');
  1224.         if(empty($products)){
  1225.             return $this->eadResponse([ "products" ], ErrorEnum::FIELD_EMPTY);
  1226.         }
  1227.         $products json_decode($products);
  1228.         if(!is_array($products)){
  1229.             return $this->eadResponse([ "products" ], ErrorEnum::FIELD_EMPTY);
  1230.         }
  1231.         if(is_array($products)){
  1232.             $productRepository $this->em->getRepository(Product::class);
  1233.             foreach ($products as $key => $productId) {
  1234.                 $product $productRepository->findOneBy([
  1235.                     "id" => $productId,
  1236.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  1237.                 ]);
  1238.                 if($product){
  1239.                     $isInTeam $this->em->getRepository(ProductTeam::class)->userExistInProductTeam(
  1240.                         $product$this->user
  1241.                     );
  1242.                     if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1243.                         continue;
  1244.                     }
  1245.                     if($product->getType() == ProductEnum::COURSE){
  1246.                         if(count($product->getCourse()) > 0){
  1247.                             continue;
  1248.                         }
  1249.                     }
  1250.                     $product->addCourse($course);
  1251.                     if($product->getType() == ProductEnum::SUBSCRIPTION){
  1252.                         $this->em->getRepository(UserSubscription::class)->enrollUsers(
  1253.                             $product,
  1254.                             [ $course ]
  1255.                         );
  1256.                     }
  1257.                     $data = [
  1258.                         'courses' => [ $course->getId() ],
  1259.                     ];
  1260.                     
  1261.                     $this->userLogService->logInsert(
  1262.                         "product_x_course"
  1263.                         $product->getId(), 
  1264.                         $data
  1265.                     );
  1266.                 }
  1267.             }
  1268.             
  1269.             $this->em->flush();
  1270.         }
  1271.         $products $course->getProduct();
  1272.         foreach ($products as $key => $product) {
  1273.             $this->repository->getAllCourseTimeByProduct($producttrue);
  1274.         }
  1275.         return $this->eadResponse([ "message" => "Success" ]);
  1276.     }
  1277.     /**
  1278.      * @Route(
  1279.      *      path          = "/remove/product/many/{courseId}",
  1280.      *      methods       = {"DELETE"},
  1281.      *      requirements  = { "courseId" = "\d+" }
  1282.      * )
  1283.      */
  1284.     public function removeManyProduct(Request $request) {
  1285.         $permission $this->userPermissionUtil->getPermission(
  1286.             "product"
  1287.             "product_course"
  1288.             "remove"
  1289.         );
  1290.         if($this->userPermissionUtil->isLow($permission)){
  1291.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1292.         }
  1293.         $courseId $request->get('courseId');
  1294.         $course $this->repository->findOneBy([
  1295.             "id" => $courseId,
  1296.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1297.         ]);
  1298.         if (!$course) {
  1299.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1300.         }
  1301.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1302.             $course
  1303.             $this->user
  1304.         );
  1305.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1306.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1307.         }
  1308.         $this->requestUtil->setRequest($request)->setData();
  1309.         $all = (int)$this->requestUtil->getField('all');
  1310.         $products json_decode($this->requestUtil->getField('products'));
  1311.         if(empty($all)){
  1312.             if(empty($products) || !is_array($products)){
  1313.                 return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1314.             }
  1315.         }
  1316.         $productRepository $this->em->getRepository(Product::class);
  1317.         if($all == CourseEnum::YES){
  1318.             $course->removeAllProduct();
  1319.         }else{
  1320.             foreach ($products as $key => $productId) {
  1321.                 $product $productRepository->findOneBy([
  1322.                     "id" => $productId,
  1323.                     "deleted" => ProductEnum::ITEM_NO_DELETED
  1324.                 ]);
  1325.                 if ($product) {
  1326.                     $course->removeProduct($product);
  1327.                 }
  1328.             }
  1329.         }
  1330.         $this->em->flush();
  1331.         $products $course->getProduct();
  1332.         foreach ($products as $key => $product) {
  1333.             $this->repository->getAllCourseTimeByProduct($producttrue);
  1334.         }
  1335.         $this->userLogService->logDeleteMany(
  1336.             "course_x_product",
  1337.             $course->getId(),
  1338.             [
  1339.                 "all" => $all,
  1340.                 "products" => $products
  1341.             ]
  1342.         );
  1343.         return $this->eadResponse([ "message" => "Success" ]);
  1344.     }
  1345.     /**
  1346.      * @Route(
  1347.      *      path          = "/copy/{id}",
  1348.      *      methods       = {"COPY"},
  1349.      *      requirements  = { "id" = "\d+"}
  1350.      * )
  1351.      */
  1352.     public function copyCourse(Request $request) {
  1353.         if(!$this->configuration->checkModuleIsAbleOnPlan('copyFunction')){
  1354.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  1355.         }
  1356.         $permission $this->userPermissionUtil->getPermission("course""copy");
  1357.         if($this->userPermissionUtil->isLow($permission)){
  1358.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1359.         }
  1360.         $courseId $request->get('id');
  1361.         $course $this->repository->findOneBy([
  1362.             "id" => $courseId,
  1363.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1364.         ]);
  1365.         if(!$course){
  1366.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1367.         }
  1368.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1369.             $course
  1370.             $this->user
  1371.         );
  1372.         
  1373.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1374.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1375.         }
  1376.         
  1377.         $newCourse $this->repository->copyCourse($course);
  1378.         $data $newCourse->toReturn();
  1379.         $this->userLogService->logInsert("course"$newCourse->getId(), $data);
  1380.         
  1381.         return $this->eadResponse($data);
  1382.     }
  1383.     /**
  1384.      * @Route(
  1385.      *      path          = "/delete/cover/{id}",
  1386.      *      methods       = {"DELETE"},
  1387.      *      requirements  = { "id" = "\d+" }
  1388.      * )
  1389.      */
  1390.     public function deleteCourseCover(Request $request) {
  1391.         $permission $this->userPermissionUtil->getPermission("course""edit");
  1392.         if($this->userPermissionUtil->isLow($permission)){
  1393.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1394.         }
  1395.         $courseId $request->get('id');
  1396.         $course $this->repository->findOneBy([
  1397.             "id" => $courseId,
  1398.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1399.         ]);
  1400.         
  1401.         if (!$course) {
  1402.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1403.         }
  1404.         
  1405.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1406.             $course
  1407.             $this->user
  1408.         );
  1409.         
  1410.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1411.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1412.         }
  1413.         if($course->getCover()){
  1414.             $pathComplete $this->fileService->getFilePathComplete(
  1415.                 $course->getCover(), 
  1416.                 CourseEnum::PATH_COVERS
  1417.             );
  1418.             $this->fileService->setFile($pathComplete);
  1419.             $this->fileService->deleteFile();
  1420.             $course->setCover(null);
  1421.         }
  1422.         $this->em->flush();
  1423.         $data $course->toReturn();
  1424.         $this->userLogService->logUpdate("course"$course->getId(), $data);
  1425.         return $this->eadResponse($data);
  1426.     }
  1427.     /**
  1428.      * @Route(
  1429.      *      path          = "/delete/photo/{id}",
  1430.      *      methods       = {"DELETE"},
  1431.      *      requirements  = { "id" = "\d+" }
  1432.      * )
  1433.      */
  1434.     public function deleteCoursePhoto(Request $request) {
  1435.         $permission $this->userPermissionUtil->getPermission("course""edit");
  1436.         if($this->userPermissionUtil->isLow($permission)){
  1437.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1438.         }
  1439.         $courseId $request->get('id');
  1440.         $course $this->repository->findOneBy([
  1441.             "id" => $courseId,
  1442.             "deleted" => CourseEnum::ITEM_NO_DELETED
  1443.         ]);
  1444.         
  1445.         if (!$course) {
  1446.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  1447.         }
  1448.         
  1449.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  1450.             $course
  1451.             $this->user
  1452.         );
  1453.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  1454.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  1455.         }
  1456.         
  1457.         if($course->getPhoto()){
  1458.             $pathComplete $this->fileService->getFilePathComplete(
  1459.                 $course->getPhoto(), 
  1460.                 CourseEnum::PATH_STORE
  1461.             );
  1462.             $this->fileService->setFile($pathComplete);
  1463.             $this->fileService->deleteFile();
  1464.             $course->setPhoto(null);
  1465.         }
  1466.         $this->em->flush();
  1467.         $data $course->toReturn();
  1468.         $this->userLogService->logUpdate("course"$course->getId(), $data);
  1469.         return $this->eadResponse($data);
  1470.     }
  1471. }