src/Controller/Admin/EnrollmentController.php line 47

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\Enrollment;
  7. use EADPlataforma\Entity\LessonLogOrigin;
  8. use EADPlataforma\Entity\Group;
  9. use EADPlataforma\Entity\User;
  10. use EADPlataforma\Entity\Course;
  11. use EADPlataforma\Entity\CourseTeam;
  12. use EADPlataforma\Entity\CourseCertificate;
  13. use EADPlataforma\Entity\Lesson;
  14. use EADPlataforma\Entity\Product;
  15. use EADPlataforma\Entity\LessonModule;
  16. use EADPlataforma\Enum\EnrollmentEnum;
  17. use EADPlataforma\Enum\CourseEnum;
  18. use EADPlataforma\Enum\ErrorEnum;
  19. use EADPlataforma\Util\StringUtil;
  20. /**
  21.  * @Route(
  22.  *      path          = "/admin/enrollment",
  23.  *      schemes         = {"http|https"}
  24.  * )
  25.  * @Cache(
  26.  *      maxage          = "0",
  27.  *      smaxage         = "0",
  28.  *      expires         = "now",
  29.  *      public          = false
  30.  * )
  31.  */
  32. class EnrollmentController extends AbstractController {
  33.     public function getEntityClass(){
  34.         return Enrollment::class;
  35.     }
  36.     /**
  37.      * @Route(
  38.      *      path          = "/list/paginate",
  39.      *      methods       = {"GET"},
  40.      * )
  41.      */
  42.     public function getEnrollmentPaginate(Request $request) {
  43.         $permission $this->userPermissionUtil->getPermission("course""enrollment""see");
  44.         $permission2 $this->userPermissionUtil->getPermission(
  45.             "user",
  46.             "group",
  47.             "enrollment",
  48.             "see"
  49.         );
  50.         if(
  51.             $this->userPermissionUtil->isLow($permission) && 
  52.             $this->userPermissionUtil->isLow($permission2)
  53.         ){
  54.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  55.         }
  56.         $this->requestUtil->setRequest($request)->setData();
  57.         $columns = [
  58.             "e.id"
  59.             "e.status",
  60.             "e.origin",
  61.             "DATE_FORMAT(e.dateRegister, '%Y-%m-%d %H:%i:%s') AS dateRegister",
  62.             "DATE_FORMAT(e.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
  63.             "DATE_FORMAT(e.datePeriod, '%Y-%m-%d %H:%i:%s') AS datePeriod",
  64.             "DATE_FORMAT(e.dateSupport, '%Y-%m-%d %H:%i:%s') AS dateSupport",
  65.             "c.id AS courseId",
  66.             "c.title",
  67.             "c.status AS courseStatus",
  68.             "u.name"
  69.             "u.photo",
  70.             "u.email",
  71.             "u.id AS userId",
  72.             "DATE_FORMAT(e.dateLastAccess, '%Y-%m-%d %H:%i:%s') AS dateLastAccess",
  73.             "e.lessonNumberComplete",
  74.             "e.lessonNumberViews",
  75.             "e.supportNumberRequest",
  76.             "ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2) AS progress",
  77.             "DATE_FORMAT(e.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  78.             "ud.name AS userDelete",
  79.             "e.couponKey",
  80.         ];
  81.         $userClass User::class;
  82.         $courseClass Course::class;
  83.         $courseTeamClass CourseTeam::class;
  84.         $groupClass Group::class;
  85.         $productClass Product::class;
  86.         $joins = [
  87.             "{$userClass} AS u" => "u.id = e.user AND u.deleted = 0",
  88.             "{$courseClass} AS c" => "c.id = e.course AND c.deleted = 0",
  89.             "{$userClass} AS ud" => ["LEFT""ud.id = e.userDelete"]
  90.         ];
  91.         $userId = (int)$this->requestUtil->getField('user');
  92.         $users $this->requestUtil->getField('users');
  93.         $groupId = (int)$this->requestUtil->getField('group');
  94.         $status $this->requestUtil->getField('status');
  95.         $courseId = (int)$this->requestUtil->getField('course');
  96.         $productId = (int)$this->requestUtil->getField('product');
  97.         $origin = (int)$this->requestUtil->getField('origin');
  98.         $applyTo = (int)$this->requestUtil->getField('applyTo');
  99.         $usersFilter = !empty($userId) ? [ $userId ] : [];
  100.         if(!empty($users)){
  101.             $usersFilter json_decode($users);
  102.         }
  103.         
  104.         $orderParam $this->requestUtil->getField('order');
  105.         $searchText $this->requestUtil->getField('searchText');
  106.         $limit $this->requestUtil->getField('limit');
  107.         $offset $this->requestUtil->getField('offset');
  108.         $dateStart $this->requestUtil->getField('dateStart');
  109.         $dateEnd $this->requestUtil->getField('dateEnd');
  110.         $filter = [];
  111.         $filterDelete $this->requestUtil->getDeletedParam();
  112.         $filter["whereText"] = " e.id > 0 ";
  113.         if($groupId 0){
  114.             $joins["{$groupClass} AS g"] = "
  115.                 e.course MEMBER OF g.course AND e.user MEMBER OF g.user
  116.             ";
  117.             $filter["g.id"] = $groupId;
  118.             if($this->userPermissionUtil->isMiddle($permission2)){
  119.                 $userOnId $this->user->getId();
  120.                 $filter["whereText"] .= " AND c.id IN ( 
  121.                                             SELECT
  122.                                                IDENTITY(cteam.course)
  123.                                             FROM {$courseTeamClass} AS cteam 
  124.                                             WHERE cteam.deleted = 0 
  125.                                             AND cteam.user = {$userOnId}
  126.                                         ) ";
  127.             }
  128.         }else if($this->userPermissionUtil->isMiddle($permission)){
  129.             $userOnId $this->user->getId();
  130.             $filter["whereText"] .= " AND c.id IN ( 
  131.                                         SELECT
  132.                                            IDENTITY(cteam.course)
  133.                                         FROM {$courseTeamClass} AS cteam 
  134.                                         WHERE cteam.deleted = 0 
  135.                                         AND cteam.user = {$userOnId}
  136.                                     ) ";
  137.         }
  138.         if($productId 0){
  139.             $joins["{$productClass} AS p"] = "e.course MEMBER OF p.course";
  140.             $filter["p.id"] = $productId;
  141.         }
  142.         if(!empty($usersFilter) && is_array($usersFilter)){
  143.             $usersFilter implode(','$usersFilter);
  144.             $filter["whereText"] .= " AND e.user IN ({$usersFilter}) ";
  145.         }
  146.         if($courseId 0){
  147.             $filter["e.course"] = $courseId;
  148.         }
  149.         if(!empty($origin)){
  150.             $filter["e.origin"] = $origin;
  151.         }
  152.         if(!empty($applyTo)){
  153.             $today date('Y-m-d H:i:s');
  154.             switch ($applyTo) {
  155.                 case EnrollmentEnum::APPLY_TO_EXPIRED:
  156.                     $filter["e.datePeriod"] = [ ' < '$today ];
  157.                     break;
  158.                 case EnrollmentEnum::APPLY_TO_VALID_PERIOD:
  159.                     $filter["e.datePeriod"] = [ ' >= '$today ];
  160.                     break;
  161.                 case EnrollmentEnum::APPLY_TO_SUPPORT_EXPIRED:
  162.                     $filter["e.dateSupport"] = [ ' < '$today ];
  163.                     break;
  164.                 case EnrollmentEnum::APPLY_TO_CANCELED:
  165.                     $filter["e.status"] = EnrollmentEnum::STATUS_CANCELED;
  166.                     break;
  167.             }
  168.         }
  169.         if(!empty($status)){
  170.             if($status == EnrollmentEnum::STATUS_EXPIRED){
  171.                 $filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
  172.                 $filter["e.datePeriod"] = [ "<"date("Y-m-d H:i:s") ];
  173.             }else if($status == EnrollmentEnum::STATUS_ACTIVE){
  174.                 $filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
  175.                 $filter["e.datePeriod"] = [ ">="date("Y-m-d H:i:s") ];
  176.             }else{
  177.                 $filter["e.status"] = $status;
  178.             }
  179.         }
  180.         if(!empty($dateStart) && !empty($dateEnd)){
  181.             $filter["whereText"] .= "
  182.                 AND DATE_FORMAT(e.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
  183.             ";
  184.         }
  185.         $order = [ "e.id" => "DESC" ];
  186.         if(!empty($orderParam)){
  187.             $order json_decode($orderParamtrue);
  188.         }
  189.         if(isset($order["progress"])){
  190.             $order["ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2)"] = $order["progress"];
  191.             unset($order["progress"]);
  192.         }
  193.         $data $this->repository->paginate(
  194.             "e"
  195.             $searchText
  196.             $columns
  197.             $joins
  198.             $filter
  199.             $order
  200.             $limit
  201.             $offset
  202.             $filterDelete
  203.         );
  204.         
  205.         foreach ($data['rows'] as $key => $enrollment) {
  206.             $enrollment = (object)$enrollment;
  207.             $enrollment->title StringUtil::fromUnicode($enrollment->title);
  208.             if($enrollment->status == EnrollmentEnum::STATUS_ACTIVE){
  209.                 if(strtotime($enrollment->datePeriod) < time()){
  210.                     $enrollment->status EnrollmentEnum::STATUS_EXPIRED;
  211.                 }
  212.             }
  213.             $enrollment->accessLifetimePeriod EnrollmentEnum::NO;
  214.             if($enrollment->datePeriod == "9999-09-09 00:00:00"){
  215.                 $enrollment->accessLifetimePeriod EnrollmentEnum::YES;
  216.             }
  217.             $enrollment->supportLifetimePeriod EnrollmentEnum::NO;
  218.             if($enrollment->dateSupport == "9999-09-09 00:00:00"){
  219.                 $enrollment->supportLifetimePeriod EnrollmentEnum::YES;
  220.             }
  221.             $data['rows'][$key] = $enrollment;
  222.         }
  223.         return $this->eadResponse($data);
  224.     }
  225.     /**
  226.      * @Route(
  227.      *      path          = "/user/list/paginate",
  228.      *      methods       = {"GET"},
  229.      * )
  230.      */
  231.     public function getUserEnrollmentPaginate(Request $request) {
  232.         if(!$this->user){
  233.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  234.         }
  235.         $this->requestUtil->setRequest($request)->setData();
  236.         $columns = [
  237.             "e.id"
  238.             "e.status",
  239.             "e.origin",
  240.             "DATE_FORMAT(e.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
  241.             "DATE_FORMAT(e.datePeriod, '%Y-%m-%d %H:%i:%s') AS datePeriod",
  242.             "DATE_FORMAT(e.dateSupport, '%Y-%m-%d %H:%i:%s') AS dateSupport",
  243.             "c.id AS courseId",
  244.             "c.title",
  245.             "c.status AS courseStatus",
  246.             "u.name"
  247.             "u.photo",
  248.             "u.email",
  249.             "u.id AS userId",
  250.             "DATE_FORMAT(e.dateLastAccess, '%Y-%m-%d %H:%i:%s') AS dateLastAccess",
  251.             "e.lessonNumberComplete",
  252.             "e.lessonNumberViews",
  253.             "e.supportNumberRequest",
  254.             "ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2) AS progress",
  255.             "DATE_FORMAT(e.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  256.             "ud.name AS userDelete",
  257.             "e.couponKey",
  258.         ];
  259.         $userClass User::class;
  260.         $courseClass Course::class;
  261.         $joins = [
  262.             "{$userClass} AS u" => "u.id = e.user AND u.deleted = 0",
  263.             "{$courseClass} AS c" => "c.id = e.course AND c.deleted = 0",
  264.             "{$userClass} AS ud" => ["LEFT""ud.id = e.userDelete"]
  265.         ];
  266.         $userId $this->user->getId();
  267.         $status $this->requestUtil->getField('status');
  268.         $courseId = (int)$this->requestUtil->getField('course');
  269.         $origin = (int)$this->requestUtil->getField('origin');
  270.         $orderParam $this->requestUtil->getField('order');
  271.         $searchText $this->requestUtil->getField('searchText');
  272.         $limit $this->requestUtil->getField('limit');
  273.         $offset $this->requestUtil->getField('offset');
  274.         $dateStart $this->requestUtil->getField('dateStart');
  275.         $dateEnd $this->requestUtil->getField('dateEnd');
  276.         $filter = [];
  277.         $filterDelete $this->requestUtil->getDeletedParam();
  278.         $filter = [ 
  279.             "e.user" => $userId,
  280.             "c.status" => CourseEnum::PUBLISHED    
  281.         ];
  282.         if($courseId 0){
  283.             $filter["e.course"] = $courseId;
  284.         }
  285.         if(!empty($origin)){
  286.             $filter["e.origin"] = $origin;
  287.         }
  288.         if(!empty($status)){
  289.             if($status == EnrollmentEnum::STATUS_EXPIRED){
  290.                 $filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
  291.                 $filter["e.datePeriod"] = [ "<"date("Y-m-d H:i:s") ];
  292.             }else if($status == EnrollmentEnum::STATUS_ACTIVE){
  293.                 $filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
  294.                 $filter["e.datePeriod"] = [ ">="date("Y-m-d H:i:s") ];
  295.             }else{
  296.                 $filter["e.status"] = $status;
  297.             }
  298.         }
  299.         if(!empty($dateStart) && !empty($dateEnd)){
  300.             $filter["whereText"] = "
  301.                 DATE_FORMAT(e.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
  302.             ";
  303.         }
  304.         $order = [ "e.id" => "DESC" ];
  305.         if(!empty($orderParam)){
  306.             $order json_decode($orderParamtrue);
  307.         }
  308.         $data $this->repository->paginate(
  309.             "e"
  310.             $searchText
  311.             $columns
  312.             $joins
  313.             $filter
  314.             $order
  315.             $limit
  316.             $offset
  317.             $filterDelete
  318.         );
  319.         foreach ($data['rows'] as $key => $enrollment) {
  320.             $enrollment = (object)$enrollment;
  321.             $enrollment->title StringUtil::fromUnicode($enrollment->title);
  322.             if($enrollment->status == EnrollmentEnum::STATUS_ACTIVE){
  323.                 if(strtotime($enrollment->datePeriod) < time()){
  324.                     $enrollment->status EnrollmentEnum::STATUS_EXPIRED;
  325.                 }
  326.             }
  327.             $enrollment->statusText $this->repository->getStringStatus(
  328.                 $enrollment->status
  329.             );
  330.             $enrollment->accessLifetimePeriod EnrollmentEnum::NO;
  331.             if($enrollment->datePeriod == "9999-09-09 00:00:00"){
  332.                 $enrollment->accessLifetimePeriod EnrollmentEnum::YES;
  333.             }
  334.             $enrollment->supportLifetimePeriod EnrollmentEnum::NO;
  335.             if($enrollment->dateSupport == "9999-09-09 00:00:00"){
  336.                 $enrollment->supportLifetimePeriod EnrollmentEnum::YES;
  337.             }
  338.             $data['rows'][$key] = $enrollment;
  339.         }
  340.         return $this->eadResponse($data);
  341.     }
  342.     /**
  343.      * @Route(
  344.      *      path          = "/new/number",
  345.      *      methods       = {"GET"},
  346.      * )
  347.      */
  348.     public function getEnrollmentNewNumber(Request $request) {
  349.         $permission $this->userPermissionUtil->getPermission("dashboard""see");
  350.         if($this->userPermissionUtil->isLow($permission)){
  351.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  352.         }
  353.         $period $request->get('period');
  354.         $dateStart $request->get('dateStart');
  355.         $dateEnd $request->get('dateEnd');
  356.         if($period == EnrollmentEnum::FILTER_PERIOD_All){
  357.             return $this->eadResponse(nullErrorEnum::ACTION_INVALID);
  358.         }
  359.         $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  360.         $dates $dateTimeUtil->periodDate($period$dateStart$dateEnd);
  361.         $dateStart $dates->dateStart;
  362.         $dateEnd $dates->dateEnd;
  363.         $numberTotal $this->repository->getEnrollmentNumber($dateStart$dateEnd);
  364.         return $this->eadResponse([ "total" => $numberTotal ]);
  365.     }
  366.     /**
  367.      * @Route(
  368.      *      path          = "/detail/{id}",
  369.      *      methods       = {"GET"},
  370.      *      requirements  = { "id" = "\d+" }
  371.      * )
  372.      */
  373.     public function getEnrollment(Request $request) {
  374.         $permission $this->userPermissionUtil->getPermission(
  375.             "course",
  376.             "enrollment",
  377.             "see"
  378.         );
  379.         if($this->userPermissionUtil->isLow($permission)){
  380.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  381.         }
  382.         $enrollmentId $request->get('id');
  383.         $enrollment $this->repository->findOneBy([
  384.             "id" => $enrollmentId,
  385.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  386.         ]);
  387.         
  388.         if (!$enrollment) {
  389.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  390.         }
  391.         
  392.         $course $enrollment->getCourse();
  393.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  394.             $course
  395.             $this->user
  396.         );
  397.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  398.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  399.         }
  400.         $user $enrollment->getUser();
  401.         $lessonLogRepository $this->em->getRepository(LessonLogOrigin::class);
  402.         $lessonsNumberComplete $lessonLogRepository->countLessonLogCompleteByUser(
  403.             $course,
  404.             $user
  405.         );
  406.         $enrollment->setLessonNumberComplete((int)$lessonsNumberComplete);
  407.         $this->em->flush();
  408.         $certificate $this->em->getRepository(CourseCertificate::class)->findOneByEAD([
  409.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED,
  410.             "course" => $course->getId(),
  411.             "user" => $user->getId(),
  412.         ]);
  413.         $certificateId null;
  414.         if($certificate){
  415.             $certificateId $certificate->getId();
  416.         }
  417.         $enrollment $this->repository->updateDataAccessLog($enrollmentfalse);
  418.         $dataEnrollment $enrollment->toReturn();
  419.         $dataEnrollment["certificateId"] = $certificateId;
  420.         $dataEnrollment["accessLifetimePeriod"] = EnrollmentEnum::NO;
  421.         if($enrollment->getDatePeriod() == "9999-09-09 00:00:00"){
  422.             $dataEnrollment["accessLifetimePeriod"] = EnrollmentEnum::YES;
  423.         }
  424.         $dataEnrollment["supportLifetimePeriod"] = EnrollmentEnum::NO;
  425.         if($enrollment->getDateSupport() == "9999-09-09 00:00:00"){
  426.             $dataEnrollment["supportLifetimePeriod"] = EnrollmentEnum::YES;
  427.         }
  428.         
  429.         $lessonRepository $this->em->getRepository(Lesson::class);        
  430.         $dataEnrollment["numberLesson"] = $lessonRepository->countCourseLessons(
  431.             $course
  432.             $user->getId()
  433.         );
  434.         $data = [
  435.             "enrollment" => $dataEnrollment,
  436.             "user" => $user->toReturn(),
  437.             "course" => $course->toReturn(),
  438.         ];
  439.         return $this->eadResponse($data);
  440.     }
  441.     /**
  442.      * @Route(
  443.      *      path          = "/history/{id}",
  444.      *      methods       = {"GET"},
  445.      *      requirements  = { "id" = "\d+" }
  446.      * )
  447.      */
  448.     public function getEnrollmentHistory(Request $request){
  449.         $permission $this->userPermissionUtil->getPermission(
  450.             "course"
  451.             "enrollment"
  452.             "see"
  453.         );
  454.         if($this->userPermissionUtil->isLow($permission)){
  455.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  456.         }
  457.         $enrollmentId $request->get('id');
  458.         $enrollment $this->repository->findOneBy([
  459.             "id" => $enrollmentId,
  460.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  461.         ]);
  462.         
  463.         if (!$enrollment) {
  464.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  465.         }
  466.         $course $enrollment->getCourse();
  467.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  468.             $course
  469.             $this->user
  470.         );
  471.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  472.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  473.         }
  474.         $history $this->repository->getHistoryByEnrollment($enrollment);
  475.         $course $enrollment->getCourse();
  476.         $userId $enrollment->getUser()->getId();
  477.         $lessonRepository $this->em->getRepository(Lesson::class);
  478.         $data = (object)[
  479.             "history" => $history,
  480.             "lessonNumberViews" => $enrollment->getLessonNumberViews(),
  481.             "lessonTimeWatch" => $enrollment->getLessonTimeWatch(),
  482.             "supportNumberRequest" => $enrollment->getSupportNumberRequest(),
  483.             "numberLesson" => $lessonRepository->countCourseLessons($course$userIdnulltrue),
  484.             "lessonNumberComplete" => $enrollment->getLessonNumberComplete(),
  485.         ];
  486.         return $this->eadResponse($datafalsefalse);
  487.     }
  488.     /**
  489.      * @Route(
  490.      *      path          = "/history/download/{id}",
  491.      *      methods       = {"GET"},
  492.      *      requirements  = { "id" = "\d+" }
  493.      * )
  494.      */
  495.     public function downloadEnrollmentHistory(Request $request){
  496.         $permission $this->userPermissionUtil->getPermission(
  497.             "course"
  498.             "enrollment"
  499.             "see"
  500.         );
  501.         if($this->userPermissionUtil->isLow($permission)){
  502.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  503.         }
  504.         $enrollmentId $request->get('id');
  505.         $enrollment $this->repository->findOneBy([
  506.             "id" => $enrollmentId,
  507.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  508.         ]);
  509.         
  510.         if (!$enrollment) {
  511.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  512.         }
  513.         $course $enrollment->getCourse();
  514.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  515.             $course
  516.             $this->user
  517.         );
  518.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  519.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  520.         }
  521.         $historyPdf $this->repository->generateCertificate($enrollmenttrue);
  522.         return $historyPdf;
  523.     }
  524.     
  525.     /**
  526.      * @Route(
  527.      *      path          = "/register",
  528.      *      methods       = {"POST"},
  529.      * )
  530.      */
  531.     public function registerEnrollment(Request $request) {
  532.         $permission $this->userPermissionUtil->getPermission(
  533.             "course"
  534.             "enrollment"
  535.             "create"
  536.         );
  537.         if($this->userPermissionUtil->isLow($permission)){
  538.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  539.         }
  540.         $this->requestUtil->setRequest($request)->setData();
  541.         //set User in Enrollment
  542.         $users = [];
  543.         if($this->requestUtil->issetField('user')){
  544.             $users explode(','$this->requestUtil->getField('user'));
  545.         }
  546.         $periodType $this->requestUtil->getField('periodType');
  547.         $periodDate $this->requestUtil->getField('periodDate');
  548.         $supportType $this->requestUtil->getField('supportType');
  549.         $supportDate $this->requestUtil->getField('supportDate');
  550.         //set Course in Enrollment
  551.         $courseId $this->requestUtil->getField('course');
  552.         $courseRepository $this->em->getRepository(Course::class);
  553.         $course $courseRepository->findOneBy([
  554.             "id" => $courseId,
  555.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  556.         ]);
  557.         if($course){
  558.             $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  559.                 $course
  560.                 $this->user
  561.             );
  562.             if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  563.                 return $this->eadResponse(nullErrorEnum::PERMISSION);
  564.             }
  565.         }
  566.       
  567.         $enrollmentService $this->generalService->getService('EnrollmentService');
  568.         $enrollmentService->setEmail(true);
  569.         
  570.         if($periodType == EnrollmentEnum::ENROLL_CHANGE){
  571.             $enrollmentService->setAccessDate($periodDate);
  572.         }
  573.         if($supportType == EnrollmentEnum::ENROLL_CHANGE){
  574.             $enrollmentService->setSupportDate($supportDate);
  575.         }
  576.         $userRepository $this->em->getRepository(User::class);
  577.         foreach ($users as $key => $userId) {
  578.             $user $userRepository->findOneBy([
  579.                 "id" => (int)$userId,
  580.                 "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  581.             ]);
  582.             
  583.             if($user){
  584.                 $data $enrollmentService->enrollUser($user$coursetrue);
  585.             
  586.                 if($data->errors){
  587.                     return $this->eadResponse($data->errorsErrorEnum::FIELD_EMPTY);
  588.                 }
  589.                 $enrollment $data->enrollment;
  590.                 $data $enrollment->toReturn();
  591.                 $this->userLogService->logInsert("enrollment"$enrollment->getId(), $data);
  592.             }
  593.         }
  594.         return $this->eadResponse([ "message" => "Success" ]);
  595.     }
  596.     /**
  597.      * @Route(
  598.      *      path          = "/edit/{id}",
  599.      *      methods       = {"PUT"},
  600.      *      requirements  = { "id" = "\d+" }
  601.      * )
  602.      */
  603.     public function editEnrollment(Request $request) {
  604.         $permission $this->userPermissionUtil->getPermission(
  605.             "course"
  606.             "enrollment"
  607.             "edit"
  608.         );
  609.         if($this->userPermissionUtil->isLow($permission)){
  610.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  611.         }
  612.         $this->requestUtil->setRequest($request)->setData();
  613.         $enrollmentId $request->get('id');
  614.         $enrollment $this->repository->findOneBy([
  615.             "id" => $enrollmentId,
  616.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED
  617.         ]);
  618.         if (!$enrollment) {
  619.             return $this->eadResponse(nullErrorEnum::NOT_FOUND);
  620.         }
  621.         $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  622.             $enrollment->getCourse(), 
  623.             $this->user
  624.         );
  625.         if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
  626.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  627.         }
  628.         if($this->requestUtil->issetField('status')){
  629.             $enrollment->setStatus($this->requestUtil->getField('status'));
  630.         }
  631.         if($this->requestUtil->issetField('certificate')){
  632.             $enrollment->setCertificate($this->requestUtil->getField('certificate'));
  633.         }
  634.         if($this->requestUtil->issetField('dateRegister')){
  635.             $enrollment->setDateRegister($this->requestUtil->getField('dateRegister'));
  636.         }
  637.         //if($this->requestUtil->issetField('dateStart')){
  638.         //    $enrollment->setDateStart($this->requestUtil->getField('dateStart'));
  639.         //}
  640.         $accessLifetimePeriod = (int)$this->requestUtil->getField('accessLifetimePeriod');
  641.         $datePeriod $this->requestUtil->getField('datePeriod');
  642.         if($accessLifetimePeriod == EnrollmentEnum::YES){
  643.             $datePeriod "9999-09-09 00:00:00";
  644.             $enrollment->setDatePeriod($datePeriod);
  645.         }elseif($this->requestUtil->issetField('datePeriod')){
  646.             $enrollment->setDatePeriod($datePeriod);
  647.         }
  648.         $supportLifetimePeriod = (int)$this->requestUtil->getField('supportLifetimePeriod');
  649.         $dateSupport $this->requestUtil->getField('dateSupport');
  650.         if($supportLifetimePeriod == EnrollmentEnum::YES){
  651.             $dateSupport "9999-09-09 00:00:00";
  652.             $enrollment->setDateSupport($dateSupport);
  653.         }elseif($this->requestUtil->issetField('dateSupport')){
  654.             $enrollment->setDateSupport($dateSupport);
  655.         }
  656.         
  657.         $errors $this->validateEntity($enrollment);
  658.         if($errors){
  659.             return $this->eadResponse($errorsErrorEnum::FIELD_EMPTY);
  660.         }
  661.         $this->em->flush();
  662.         $this->repository->sendWebhook($enrollment);
  663.         $return $enrollment->toReturn();
  664.         $this->userLogService->logUpdate("enrollment"$enrollment->getId(), $return);
  665.         return $this->eadResponse($return);
  666.     }
  667.     /**
  668.      * @Route(
  669.      *      path          = "/edit/many",
  670.      *      methods       = {"PUT"},
  671.      * )
  672.      */
  673.     public function editManyEnrollment(Request $request) {
  674.         $this->requestUtil->setRequest($request)->setData();
  675.         
  676.         $userId = (int)$this->requestUtil->getField('user');
  677.         $users $this->requestUtil->getField('users');
  678.         $courseId = (int)$this->requestUtil->getField('course');
  679.         $groupId = (int)$this->requestUtil->getField('group');
  680.         $productId = (int)$this->requestUtil->getField('product');
  681.         $status $this->requestUtil->getField('status');
  682.         $access $this->requestUtil->getField('access');
  683.         $dateAccess $this->requestUtil->getField('dateAccess');
  684.         $accessLifetimePeriod = (int)$this->requestUtil->getField('accessLifetimePeriod');
  685.         
  686.         $support $this->requestUtil->getField('support');
  687.         $dateSupport $this->requestUtil->getField('dateSupport');
  688.         $supportLifetimePeriod = (int)$this->requestUtil->getField('supportLifetimePeriod');
  689.         $certificate $this->requestUtil->getField('certificate');
  690.         $applyTo $this->requestUtil->getField('applyTo');
  691.         if(
  692.             $access == EnrollmentEnum::ENROLL_NO_CHANGE && 
  693.             $support == EnrollmentEnum::ENROLL_NO_CHANGE && 
  694.             $certificate == EnrollmentEnum::ENROLL_NO_CHANGE
  695.        ){
  696.             return $this->eadResponse([ "message" => "No changes made" ]); 
  697.         }
  698.         $permission $this->userPermissionUtil->getPermission(
  699.             "course"
  700.             "enrollment"
  701.             "edit_many"
  702.         );
  703.         if($groupId 0){
  704.             $permission $this->userPermissionUtil->getPermission(
  705.                 "user""group""enrollment""edit_many"
  706.             );
  707.         }
  708.         if($this->userPermissionUtil->isLow($permission)){
  709.             return $this->eadResponse(nullErrorEnum::PERMISSION);
  710.         }
  711.         
  712.         $teacherId null;
  713.         if($this->userPermissionUtil->isMiddle($permission)){
  714.             $teacherId $this->user->getId();
  715.         }
  716.         $usersFilter = !empty($userId) ? [ $userId ] : [];
  717.         if(!empty($users)){
  718.             $usersFilter json_decode($users);
  719.         }
  720.         $enrollments $this->repository->getEnrollmentsToEditMany(
  721.             $usersFilter
  722.             $courseId
  723.             $groupId
  724.             $productId
  725.             $teacherId
  726.             $applyTo
  727.         );
  728.         $dataLog = [];
  729.         foreach ($enrollments as $key => $enrollment) {
  730.             if(!is_null($status)){
  731.                 $enrollment->setStatus($status);
  732.             }
  733.             if($access == EnrollmentEnum::ENROLL_ORIGINAL){
  734.                 $lifetimePeriod $enrollment->getCourse()->getLifetimePeriod();
  735.                 if($lifetimePeriod == CourseEnum::YES){
  736.                     $datePeriod "9999-09-09 00:00:00";
  737.                 }else{
  738.                     $accessPeriod $enrollment->getCourse()->getAccessPeriod();
  739.                     $dateRegister $enrollment->getDateRegister();
  740.         
  741.                     $datePeriod strtotime("+ {$accessPeriod} day"strtotime($dateRegister));
  742.                     $datePeriod date('Y-m-d H:i:s'$datePeriod);
  743.                 }
  744.                     
  745.                 $enrollment->setDatePeriod($datePeriod);
  746.             }elseif($access == EnrollmentEnum::ENROLL_CHANGE){
  747.                 if(!empty($dateAccess)){
  748.                     $enrollment->setDatePeriod($dateAccess);
  749.                 }
  750.             }elseif($access == EnrollmentEnum::ENROLL_LIFETIME){
  751.                 if($accessLifetimePeriod == EnrollmentEnum::YES){
  752.                     $dateAccess "9999-09-09 00:00:00";
  753.                     $enrollment->setDatePeriod($dateAccess);
  754.                 }
  755.             }
  756.     
  757.             if($support == EnrollmentEnum::ENROLL_ORIGINAL){
  758.                 $supportCourse $enrollment->getCourse()->getSupport();
  759.                 if($supportCourse == CourseEnum::YES){
  760.                     $lifetimeSupport $enrollment->getCourse()->getLifetimeSupport();
  761.                     if($lifetimeSupport == CourseEnum::YES){
  762.                         $dateSupport "9999-09-09 00:00:00";
  763.                     }else{
  764.                         $supportPeriod $enrollment->getCourse()->getSupportPeriod();
  765.                         $dateRegister $enrollment->getDateRegister();
  766.             
  767.                         $dateSupport strtotime("+ {$supportPeriod} day"strtotime($dateRegister));
  768.                         $dateSupport date('Y-m-d H:i:s'$dateSupport);
  769.                     }
  770.                 }else{
  771.                     $dateSupport "0000-00-00 00:00:00";
  772.                 }
  773.                 
  774.                 $enrollment->setDateSupport($dateSupport);
  775.             }elseif($support == EnrollmentEnum::ENROLL_CHANGE){
  776.                 if(!empty($dateSupport)){
  777.                     $enrollment->setDateSupport($dateSupport);
  778.                 }
  779.             }elseif($support == EnrollmentEnum::ENROLL_LIFETIME){
  780.                 if($supportLifetimePeriod == EnrollmentEnum::YES){
  781.                     $dateSupport "9999-09-09 00:00:00";
  782.                     $enrollment->setDateSupport($dateSupport);
  783.                 }
  784.             }
  785.             if($certificate == EnrollmentEnum::ENROLL_CHANGE){
  786.                 $enrollment->setCertificate(EnrollmentEnum::YES);
  787.             }elseif($certificate == EnrollmentEnum::ENROLL_ORIGINAL){
  788.                 $enrollment->setCertificate(EnrollmentEnum::NO);
  789.             }
  790.             $this->repository->sendWebhook($enrollment);
  791.             $dataLog[] = $enrollment->getId();
  792.         }
  793.         $this->em->flush();
  794.         
  795.         $this->userLogService->logUpdateMany("enrollment"null$dataLog);
  796.         return $this->eadResponse([ "message" => "Success" ]);
  797.     }
  798. }