<?php
namespace EADPlataforma\Controller\Admin;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\LessonLogOrigin;
use EADPlataforma\Entity\Group;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\Course;
use EADPlataforma\Entity\CourseTeam;
use EADPlataforma\Entity\CourseCertificate;
use EADPlataforma\Entity\Lesson;
use EADPlataforma\Entity\Product;
use EADPlataforma\Entity\LessonModule;
use EADPlataforma\Enum\EnrollmentEnum;
use EADPlataforma\Enum\CourseEnum;
use EADPlataforma\Enum\ErrorEnum;
use EADPlataforma\Util\StringUtil;
/**
* @Route(
* path = "/admin/enrollment",
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class EnrollmentController extends AbstractController {
public function getEntityClass(){
return Enrollment::class;
}
/**
* @Route(
* path = "/list/paginate",
* methods = {"GET"},
* )
*/
public function getEnrollmentPaginate(Request $request) {
$permission = $this->userPermissionUtil->getPermission("course", "enrollment", "see");
$permission2 = $this->userPermissionUtil->getPermission(
"user",
"group",
"enrollment",
"see"
);
if(
$this->userPermissionUtil->isLow($permission) &&
$this->userPermissionUtil->isLow($permission2)
){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"e.id",
"e.status",
"e.origin",
"DATE_FORMAT(e.dateRegister, '%Y-%m-%d %H:%i:%s') AS dateRegister",
"DATE_FORMAT(e.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
"DATE_FORMAT(e.datePeriod, '%Y-%m-%d %H:%i:%s') AS datePeriod",
"DATE_FORMAT(e.dateSupport, '%Y-%m-%d %H:%i:%s') AS dateSupport",
"c.id AS courseId",
"c.title",
"c.status AS courseStatus",
"u.name",
"u.photo",
"u.email",
"u.id AS userId",
"DATE_FORMAT(e.dateLastAccess, '%Y-%m-%d %H:%i:%s') AS dateLastAccess",
"e.lessonNumberComplete",
"e.lessonNumberViews",
"e.supportNumberRequest",
"ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2) AS progress",
"DATE_FORMAT(e.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"ud.name AS userDelete",
"e.couponKey",
];
$userClass = User::class;
$courseClass = Course::class;
$courseTeamClass = CourseTeam::class;
$groupClass = Group::class;
$productClass = Product::class;
$joins = [
"{$userClass} AS u" => "u.id = e.user AND u.deleted = 0",
"{$courseClass} AS c" => "c.id = e.course AND c.deleted = 0",
"{$userClass} AS ud" => ["LEFT", "ud.id = e.userDelete"]
];
$userId = (int)$this->requestUtil->getField('user');
$users = $this->requestUtil->getField('users');
$groupId = (int)$this->requestUtil->getField('group');
$status = $this->requestUtil->getField('status');
$courseId = (int)$this->requestUtil->getField('course');
$productId = (int)$this->requestUtil->getField('product');
$origin = (int)$this->requestUtil->getField('origin');
$applyTo = (int)$this->requestUtil->getField('applyTo');
$usersFilter = !empty($userId) ? [ $userId ] : [];
if(!empty($users)){
$usersFilter = json_decode($users);
}
$orderParam = $this->requestUtil->getField('order');
$searchText = $this->requestUtil->getField('searchText');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$dateStart = $this->requestUtil->getField('dateStart');
$dateEnd = $this->requestUtil->getField('dateEnd');
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
$filter["whereText"] = " e.id > 0 ";
if($groupId > 0){
$joins["{$groupClass} AS g"] = "
e.course MEMBER OF g.course AND e.user MEMBER OF g.user
";
$filter["g.id"] = $groupId;
if($this->userPermissionUtil->isMiddle($permission2)){
$userOnId = $this->user->getId();
$filter["whereText"] .= " AND c.id IN (
SELECT
IDENTITY(cteam.course)
FROM {$courseTeamClass} AS cteam
WHERE cteam.deleted = 0
AND cteam.user = {$userOnId}
) ";
}
}else if($this->userPermissionUtil->isMiddle($permission)){
$userOnId = $this->user->getId();
$filter["whereText"] .= " AND c.id IN (
SELECT
IDENTITY(cteam.course)
FROM {$courseTeamClass} AS cteam
WHERE cteam.deleted = 0
AND cteam.user = {$userOnId}
) ";
}
if($productId > 0){
$joins["{$productClass} AS p"] = "e.course MEMBER OF p.course";
$filter["p.id"] = $productId;
}
if(!empty($usersFilter) && is_array($usersFilter)){
$usersFilter = implode(',', $usersFilter);
$filter["whereText"] .= " AND e.user IN ({$usersFilter}) ";
}
if($courseId > 0){
$filter["e.course"] = $courseId;
}
if(!empty($origin)){
$filter["e.origin"] = $origin;
}
if(!empty($applyTo)){
$today = date('Y-m-d H:i:s');
switch ($applyTo) {
case EnrollmentEnum::APPLY_TO_EXPIRED:
$filter["e.datePeriod"] = [ ' < ', $today ];
break;
case EnrollmentEnum::APPLY_TO_VALID_PERIOD:
$filter["e.datePeriod"] = [ ' >= ', $today ];
break;
case EnrollmentEnum::APPLY_TO_SUPPORT_EXPIRED:
$filter["e.dateSupport"] = [ ' < ', $today ];
break;
case EnrollmentEnum::APPLY_TO_CANCELED:
$filter["e.status"] = EnrollmentEnum::STATUS_CANCELED;
break;
}
}
if(!empty($status)){
if($status == EnrollmentEnum::STATUS_EXPIRED){
$filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
$filter["e.datePeriod"] = [ "<", date("Y-m-d H:i:s") ];
}else if($status == EnrollmentEnum::STATUS_ACTIVE){
$filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
$filter["e.datePeriod"] = [ ">=", date("Y-m-d H:i:s") ];
}else{
$filter["e.status"] = $status;
}
}
if(!empty($dateStart) && !empty($dateEnd)){
$filter["whereText"] .= "
AND DATE_FORMAT(e.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
";
}
$order = [ "e.id" => "DESC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
if(isset($order["progress"])){
$order["ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2)"] = $order["progress"];
unset($order["progress"]);
}
$data = $this->repository->paginate(
"e",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
foreach ($data['rows'] as $key => $enrollment) {
$enrollment = (object)$enrollment;
$enrollment->title = StringUtil::fromUnicode($enrollment->title);
if($enrollment->status == EnrollmentEnum::STATUS_ACTIVE){
if(strtotime($enrollment->datePeriod) < time()){
$enrollment->status = EnrollmentEnum::STATUS_EXPIRED;
}
}
$enrollment->accessLifetimePeriod = EnrollmentEnum::NO;
if($enrollment->datePeriod == "9999-09-09 00:00:00"){
$enrollment->accessLifetimePeriod = EnrollmentEnum::YES;
}
$enrollment->supportLifetimePeriod = EnrollmentEnum::NO;
if($enrollment->dateSupport == "9999-09-09 00:00:00"){
$enrollment->supportLifetimePeriod = EnrollmentEnum::YES;
}
$data['rows'][$key] = $enrollment;
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/user/list/paginate",
* methods = {"GET"},
* )
*/
public function getUserEnrollmentPaginate(Request $request) {
if(!$this->user){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"e.id",
"e.status",
"e.origin",
"DATE_FORMAT(e.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart",
"DATE_FORMAT(e.datePeriod, '%Y-%m-%d %H:%i:%s') AS datePeriod",
"DATE_FORMAT(e.dateSupport, '%Y-%m-%d %H:%i:%s') AS dateSupport",
"c.id AS courseId",
"c.title",
"c.status AS courseStatus",
"u.name",
"u.photo",
"u.email",
"u.id AS userId",
"DATE_FORMAT(e.dateLastAccess, '%Y-%m-%d %H:%i:%s') AS dateLastAccess",
"e.lessonNumberComplete",
"e.lessonNumberViews",
"e.supportNumberRequest",
"ROUND(e.lessonNumberComplete * 100 /c.numberLesson, 2) AS progress",
"DATE_FORMAT(e.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"ud.name AS userDelete",
"e.couponKey",
];
$userClass = User::class;
$courseClass = Course::class;
$joins = [
"{$userClass} AS u" => "u.id = e.user AND u.deleted = 0",
"{$courseClass} AS c" => "c.id = e.course AND c.deleted = 0",
"{$userClass} AS ud" => ["LEFT", "ud.id = e.userDelete"]
];
$userId = $this->user->getId();
$status = $this->requestUtil->getField('status');
$courseId = (int)$this->requestUtil->getField('course');
$origin = (int)$this->requestUtil->getField('origin');
$orderParam = $this->requestUtil->getField('order');
$searchText = $this->requestUtil->getField('searchText');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$dateStart = $this->requestUtil->getField('dateStart');
$dateEnd = $this->requestUtil->getField('dateEnd');
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
$filter = [
"e.user" => $userId,
"c.status" => CourseEnum::PUBLISHED
];
if($courseId > 0){
$filter["e.course"] = $courseId;
}
if(!empty($origin)){
$filter["e.origin"] = $origin;
}
if(!empty($status)){
if($status == EnrollmentEnum::STATUS_EXPIRED){
$filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
$filter["e.datePeriod"] = [ "<", date("Y-m-d H:i:s") ];
}else if($status == EnrollmentEnum::STATUS_ACTIVE){
$filter["e.status"] = EnrollmentEnum::STATUS_ACTIVE;
$filter["e.datePeriod"] = [ ">=", date("Y-m-d H:i:s") ];
}else{
$filter["e.status"] = $status;
}
}
if(!empty($dateStart) && !empty($dateEnd)){
$filter["whereText"] = "
DATE_FORMAT(e.dateRegister, '%Y-%m-%d') BETWEEN '{$dateStart}' AND '{$dateEnd}'
";
}
$order = [ "e.id" => "DESC" ];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"e",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
foreach ($data['rows'] as $key => $enrollment) {
$enrollment = (object)$enrollment;
$enrollment->title = StringUtil::fromUnicode($enrollment->title);
if($enrollment->status == EnrollmentEnum::STATUS_ACTIVE){
if(strtotime($enrollment->datePeriod) < time()){
$enrollment->status = EnrollmentEnum::STATUS_EXPIRED;
}
}
$enrollment->statusText = $this->repository->getStringStatus(
$enrollment->status
);
$enrollment->accessLifetimePeriod = EnrollmentEnum::NO;
if($enrollment->datePeriod == "9999-09-09 00:00:00"){
$enrollment->accessLifetimePeriod = EnrollmentEnum::YES;
}
$enrollment->supportLifetimePeriod = EnrollmentEnum::NO;
if($enrollment->dateSupport == "9999-09-09 00:00:00"){
$enrollment->supportLifetimePeriod = EnrollmentEnum::YES;
}
$data['rows'][$key] = $enrollment;
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/new/number",
* methods = {"GET"},
* )
*/
public function getEnrollmentNewNumber(Request $request) {
$permission = $this->userPermissionUtil->getPermission("dashboard", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$period = $request->get('period');
$dateStart = $request->get('dateStart');
$dateEnd = $request->get('dateEnd');
if($period == EnrollmentEnum::FILTER_PERIOD_All){
return $this->eadResponse(null, ErrorEnum::ACTION_INVALID);
}
$dateTimeUtil = $this->generalService->getUtil('DateTimeUtil');
$dates = $dateTimeUtil->periodDate($period, $dateStart, $dateEnd);
$dateStart = $dates->dateStart;
$dateEnd = $dates->dateEnd;
$numberTotal = $this->repository->getEnrollmentNumber($dateStart, $dateEnd);
return $this->eadResponse([ "total" => $numberTotal ]);
}
/**
* @Route(
* path = "/detail/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function getEnrollment(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"see"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$enrollmentId = $request->get('id');
$enrollment = $this->repository->findOneBy([
"id" => $enrollmentId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if (!$enrollment) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$course = $enrollment->getCourse();
$isInTeam = $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
$course,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$user = $enrollment->getUser();
$lessonLogRepository = $this->em->getRepository(LessonLogOrigin::class);
$lessonsNumberComplete = $lessonLogRepository->countLessonLogCompleteByUser(
$course,
$user
);
$enrollment->setLessonNumberComplete((int)$lessonsNumberComplete);
$this->em->flush();
$certificate = $this->em->getRepository(CourseCertificate::class)->findOneByEAD([
"deleted" => EnrollmentEnum::ITEM_NO_DELETED,
"course" => $course->getId(),
"user" => $user->getId(),
]);
$certificateId = null;
if($certificate){
$certificateId = $certificate->getId();
}
$enrollment = $this->repository->updateDataAccessLog($enrollment, false);
$dataEnrollment = $enrollment->toReturn();
$dataEnrollment["certificateId"] = $certificateId;
$dataEnrollment["accessLifetimePeriod"] = EnrollmentEnum::NO;
if($enrollment->getDatePeriod() == "9999-09-09 00:00:00"){
$dataEnrollment["accessLifetimePeriod"] = EnrollmentEnum::YES;
}
$dataEnrollment["supportLifetimePeriod"] = EnrollmentEnum::NO;
if($enrollment->getDateSupport() == "9999-09-09 00:00:00"){
$dataEnrollment["supportLifetimePeriod"] = EnrollmentEnum::YES;
}
$lessonRepository = $this->em->getRepository(Lesson::class);
$dataEnrollment["numberLesson"] = $lessonRepository->countCourseLessons(
$course,
$user->getId()
);
$data = [
"enrollment" => $dataEnrollment,
"user" => $user->toReturn(),
"course" => $course->toReturn(),
];
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/history/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function getEnrollmentHistory(Request $request){
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"see"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$enrollmentId = $request->get('id');
$enrollment = $this->repository->findOneBy([
"id" => $enrollmentId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if (!$enrollment) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$course = $enrollment->getCourse();
$isInTeam = $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
$course,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$history = $this->repository->getHistoryByEnrollment($enrollment);
$course = $enrollment->getCourse();
$userId = $enrollment->getUser()->getId();
$lessonRepository = $this->em->getRepository(Lesson::class);
$data = (object)[
"history" => $history,
"lessonNumberViews" => $enrollment->getLessonNumberViews(),
"lessonTimeWatch" => $enrollment->getLessonTimeWatch(),
"supportNumberRequest" => $enrollment->getSupportNumberRequest(),
"numberLesson" => $lessonRepository->countCourseLessons($course, $userId, null, true),
"lessonNumberComplete" => $enrollment->getLessonNumberComplete(),
];
return $this->eadResponse($data, false, false);
}
/**
* @Route(
* path = "/history/download/{id}",
* methods = {"GET"},
* requirements = { "id" = "\d+" }
* )
*/
public function downloadEnrollmentHistory(Request $request){
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"see"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$enrollmentId = $request->get('id');
$enrollment = $this->repository->findOneBy([
"id" => $enrollmentId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if (!$enrollment) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$course = $enrollment->getCourse();
$isInTeam = $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
$course,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$historyPdf = $this->repository->generateCertificate($enrollment, true);
return $historyPdf;
}
/**
* @Route(
* path = "/register",
* methods = {"POST"},
* )
*/
public function registerEnrollment(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"create"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
//set User in Enrollment
$users = [];
if($this->requestUtil->issetField('user')){
$users = explode(',', $this->requestUtil->getField('user'));
}
$periodType = $this->requestUtil->getField('periodType');
$periodDate = $this->requestUtil->getField('periodDate');
$supportType = $this->requestUtil->getField('supportType');
$supportDate = $this->requestUtil->getField('supportDate');
//set Course in Enrollment
$courseId = $this->requestUtil->getField('course');
$courseRepository = $this->em->getRepository(Course::class);
$course = $courseRepository->findOneBy([
"id" => $courseId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if($course){
$isInTeam = $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
$course,
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
}
$enrollmentService = $this->generalService->getService('EnrollmentService');
$enrollmentService->setEmail(true);
if($periodType == EnrollmentEnum::ENROLL_CHANGE){
$enrollmentService->setAccessDate($periodDate);
}
if($supportType == EnrollmentEnum::ENROLL_CHANGE){
$enrollmentService->setSupportDate($supportDate);
}
$userRepository = $this->em->getRepository(User::class);
foreach ($users as $key => $userId) {
$user = $userRepository->findOneBy([
"id" => (int)$userId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if($user){
$data = $enrollmentService->enrollUser($user, $course, true);
if($data->errors){
return $this->eadResponse($data->errors, ErrorEnum::FIELD_EMPTY);
}
$enrollment = $data->enrollment;
$data = $enrollment->toReturn();
$this->userLogService->logInsert("enrollment", $enrollment->getId(), $data);
}
}
return $this->eadResponse([ "message" => "Success" ]);
}
/**
* @Route(
* path = "/edit/{id}",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editEnrollment(Request $request) {
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"edit"
);
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$enrollmentId = $request->get('id');
$enrollment = $this->repository->findOneBy([
"id" => $enrollmentId,
"deleted" => EnrollmentEnum::ITEM_NO_DELETED
]);
if (!$enrollment) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
$enrollment->getCourse(),
$this->user
);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
if($this->requestUtil->issetField('status')){
$enrollment->setStatus($this->requestUtil->getField('status'));
}
if($this->requestUtil->issetField('certificate')){
$enrollment->setCertificate($this->requestUtil->getField('certificate'));
}
if($this->requestUtil->issetField('dateRegister')){
$enrollment->setDateRegister($this->requestUtil->getField('dateRegister'));
}
//if($this->requestUtil->issetField('dateStart')){
// $enrollment->setDateStart($this->requestUtil->getField('dateStart'));
//}
$accessLifetimePeriod = (int)$this->requestUtil->getField('accessLifetimePeriod');
$datePeriod = $this->requestUtil->getField('datePeriod');
if($accessLifetimePeriod == EnrollmentEnum::YES){
$datePeriod = "9999-09-09 00:00:00";
$enrollment->setDatePeriod($datePeriod);
}elseif($this->requestUtil->issetField('datePeriod')){
$enrollment->setDatePeriod($datePeriod);
}
$supportLifetimePeriod = (int)$this->requestUtil->getField('supportLifetimePeriod');
$dateSupport = $this->requestUtil->getField('dateSupport');
if($supportLifetimePeriod == EnrollmentEnum::YES){
$dateSupport = "9999-09-09 00:00:00";
$enrollment->setDateSupport($dateSupport);
}elseif($this->requestUtil->issetField('dateSupport')){
$enrollment->setDateSupport($dateSupport);
}
$errors = $this->validateEntity($enrollment);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->flush();
$this->repository->sendWebhook($enrollment);
$return = $enrollment->toReturn();
$this->userLogService->logUpdate("enrollment", $enrollment->getId(), $return);
return $this->eadResponse($return);
}
/**
* @Route(
* path = "/edit/many",
* methods = {"PUT"},
* )
*/
public function editManyEnrollment(Request $request) {
$this->requestUtil->setRequest($request)->setData();
$userId = (int)$this->requestUtil->getField('user');
$users = $this->requestUtil->getField('users');
$courseId = (int)$this->requestUtil->getField('course');
$groupId = (int)$this->requestUtil->getField('group');
$productId = (int)$this->requestUtil->getField('product');
$status = $this->requestUtil->getField('status');
$access = $this->requestUtil->getField('access');
$dateAccess = $this->requestUtil->getField('dateAccess');
$accessLifetimePeriod = (int)$this->requestUtil->getField('accessLifetimePeriod');
$support = $this->requestUtil->getField('support');
$dateSupport = $this->requestUtil->getField('dateSupport');
$supportLifetimePeriod = (int)$this->requestUtil->getField('supportLifetimePeriod');
$certificate = $this->requestUtil->getField('certificate');
$applyTo = $this->requestUtil->getField('applyTo');
if(
$access == EnrollmentEnum::ENROLL_NO_CHANGE &&
$support == EnrollmentEnum::ENROLL_NO_CHANGE &&
$certificate == EnrollmentEnum::ENROLL_NO_CHANGE
){
return $this->eadResponse([ "message" => "No changes made" ]);
}
$permission = $this->userPermissionUtil->getPermission(
"course",
"enrollment",
"edit_many"
);
if($groupId > 0){
$permission = $this->userPermissionUtil->getPermission(
"user", "group", "enrollment", "edit_many"
);
}
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$teacherId = null;
if($this->userPermissionUtil->isMiddle($permission)){
$teacherId = $this->user->getId();
}
$usersFilter = !empty($userId) ? [ $userId ] : [];
if(!empty($users)){
$usersFilter = json_decode($users);
}
$enrollments = $this->repository->getEnrollmentsToEditMany(
$usersFilter,
$courseId,
$groupId,
$productId,
$teacherId,
$applyTo
);
$dataLog = [];
foreach ($enrollments as $key => $enrollment) {
if(!is_null($status)){
$enrollment->setStatus($status);
}
if($access == EnrollmentEnum::ENROLL_ORIGINAL){
$lifetimePeriod = $enrollment->getCourse()->getLifetimePeriod();
if($lifetimePeriod == CourseEnum::YES){
$datePeriod = "9999-09-09 00:00:00";
}else{
$accessPeriod = $enrollment->getCourse()->getAccessPeriod();
$dateRegister = $enrollment->getDateRegister();
$datePeriod = strtotime("+ {$accessPeriod} day", strtotime($dateRegister));
$datePeriod = date('Y-m-d H:i:s', $datePeriod);
}
$enrollment->setDatePeriod($datePeriod);
}elseif($access == EnrollmentEnum::ENROLL_CHANGE){
if(!empty($dateAccess)){
$enrollment->setDatePeriod($dateAccess);
}
}elseif($access == EnrollmentEnum::ENROLL_LIFETIME){
if($accessLifetimePeriod == EnrollmentEnum::YES){
$dateAccess = "9999-09-09 00:00:00";
$enrollment->setDatePeriod($dateAccess);
}
}
if($support == EnrollmentEnum::ENROLL_ORIGINAL){
$supportCourse = $enrollment->getCourse()->getSupport();
if($supportCourse == CourseEnum::YES){
$lifetimeSupport = $enrollment->getCourse()->getLifetimeSupport();
if($lifetimeSupport == CourseEnum::YES){
$dateSupport = "9999-09-09 00:00:00";
}else{
$supportPeriod = $enrollment->getCourse()->getSupportPeriod();
$dateRegister = $enrollment->getDateRegister();
$dateSupport = strtotime("+ {$supportPeriod} day", strtotime($dateRegister));
$dateSupport = date('Y-m-d H:i:s', $dateSupport);
}
}else{
$dateSupport = "0000-00-00 00:00:00";
}
$enrollment->setDateSupport($dateSupport);
}elseif($support == EnrollmentEnum::ENROLL_CHANGE){
if(!empty($dateSupport)){
$enrollment->setDateSupport($dateSupport);
}
}elseif($support == EnrollmentEnum::ENROLL_LIFETIME){
if($supportLifetimePeriod == EnrollmentEnum::YES){
$dateSupport = "9999-09-09 00:00:00";
$enrollment->setDateSupport($dateSupport);
}
}
if($certificate == EnrollmentEnum::ENROLL_CHANGE){
$enrollment->setCertificate(EnrollmentEnum::YES);
}elseif($certificate == EnrollmentEnum::ENROLL_ORIGINAL){
$enrollment->setCertificate(EnrollmentEnum::NO);
}
$this->repository->sendWebhook($enrollment);
$dataLog[] = $enrollment->getId();
}
$this->em->flush();
$this->userLogService->logUpdateMany("enrollment", null, $dataLog);
return $this->eadResponse([ "message" => "Success" ]);
}
}