<?php
namespace EADPlataforma\Repository;
use EADPlataforma\Entity\Course;
use EADPlataforma\Entity\Group;
use EADPlataforma\Entity\Enrollment;
use EADPlataforma\Entity\User;
use EADPlataforma\Entity\Trash;
use EADPlataforma\Enum\GroupEnum;
use EADPlataforma\Enum\EnrollmentEnum;
use EADPlataforma\Enum\TrashEnum;
/**
* @method Group|null find($id, $lockMode = null, $lockVersion = null)
* @method Group|null findOneBy(array $criteria, array $orderBy = null)
* @method Group[] findAll()
* @method Group[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class GroupRepository extends AbstractRepository
{
public function getEntityClass(){
return Group::class;
}
public function getConnectionName(){
return "school";
}
public function findItems()
{
return $this->createQueryBuilder('g')->getQuery()->getResult();
}
public function countGroup()
{
$query = $this->createQueryBuilder('g');
$query->select("COUNT(g.id) AS total");
$query->andWhere('g.deleted = :deleted');
$query->setParameter('deleted', GroupEnum::ITEM_NO_DELETED);
$result = (object)$query->getQuery()->getOneOrNullResult();
return $result->total;
}
public function insertGroup($data): array
{
$typeDateAccess = $data['typeDateAccess'] ?? GroupEnum::TYPE_DATE_DEFAULT;
$typeDateSupport = $data['typeDateSupport'] ?? GroupEnum::TYPE_DATE_DEFAULT;
$dateAccessConclusion = $data["dateAccessConclusion"] ?? null;
$dateAccessDays = $data["dateAccessDays"] ?? null;
$dateSupportConclusion = $data["dateSupportConclusion"] ?? null;
$dateSupportDays = $data["dateSupportDays"] ?? null;
$group = new Group;
$group->setName($data["name"]);
$group->setTypeDateAccess($typeDateAccess);
$group->setDateAccessConclusion($dateAccessConclusion);
$group->setDateAccessDays($dateAccessDays);
$group->setTypeDateSupport($typeDateSupport);
$group->setDateSupportConclusion($dateSupportConclusion);
$group->setDateSupportDays($dateSupportDays);
$group->setUserManager($data['user']);
$this->em->persist($group);
$this->em->flush();
$data = $group->toReturn();
$this->getLogService()->logInsert("group", $group->getId(), $data);
return $data;
}
public function enrollOneUser(Group $group, User $user, ?array $courses = [])
{
$enrollmentService = $this->generalService->getService('EnrollmentService');
$enrollmentService->enrollUserInGroup($group, [ $user ], $courses);
}
public function enrollUsers(Group $group, ?array $users = [], ?array $courses = [])
{
$enrollmentService = $this->generalService->getService('EnrollmentService');
$enrollmentService->enrollUserInGroup($group, $users, $courses);
}
public function restore(Group $group, $typeItem)
{
$itemId = $group->getId();
$group->setUserDelete($this->getUser());
$group->setDateDelete(date('Y-m-d H:i:s'));
$group->restore();
$this->em->getRepository(Trash::class)->deleteTrash($itemId, $typeItem);
}
public function delete(Group $group, $typeItem, $permission, $isTrash, $removeEnrollment)
{
$userPermissionUtil = $this->generalService->getUtil('UserPermissionUtil');
if(!$group->isOnTrash() && !$group->isDeleted()){
if(
$userPermissionUtil->isMiddle($permission) &&
$group->getUserManager()->getId() != $this->getUser()->getId()
){
return;
}
}
if($removeEnrollment == GroupEnum::YES){
$enrollments = $this->em->getRepository(Enrollment::class)->getEnrollmentsByGroup(
$group->getId()
);
foreach ($enrollments as $key => $enrollment) {
$enrollment->setUserDelete($this->getUser());
$enrollment->setDateDelete(date('Y-m-d H:i:s'));
$enrollment->trash();
$enrollment->cascade();
$this->em->getRepository(Trash::class)->insertTrash(
$enrollment,
TrashEnum::ENROLLMENT,
"Aluno: {$enrollment->getUser()->getName()} | Curso: {$enrollment->getCourse()->getTitle()}"
);
}
}
$group->setUserDelete($this->getUser());
$group->setDateDelete(date('Y-m-d H:i:s'));
$group->individual();
if($group->isOnTrash() || $group->isDeleted()){
$group->delete();
$itemId = $group->getId();
$this->em->getRepository(Trash::class)->deleteTrash($itemId, $typeItem);
}
if(!$group->isOnTrash() && !$group->isDeleted()){
$group->trash();
$this->em->getRepository(Trash::class)->insertTrash(
$group,
$typeItem,
$group->getName()
);
}
$this->em->flush();
}
public function deleteTrashCron()
{
$sql = "UPDATE EADPlataforma:Group AS g SET g.deleted = 2
WHERE g.dateDelete <= :date AND g.deleted = 1 ";
$query = $this->em->createQuery($sql);
$query->setParameter('date', date('Y-m-d H:i:s', strtotime('-90 days')));
$query->execute();
}
public function searchGroup($groupId): ?Group
{
return $this->findOneBy([
"id" => $groupId,
"deleted" => GroupEnum::ITEM_NO_DELETED
]);
}
public function updateGroup(Group $group, $data): array
{
$typeDateAccess = $data['typeDateAccess'] ?? GroupEnum::TYPE_DATE_DEFAULT;
$typeDateSupport = $data['typeDateSupport'] ?? GroupEnum::TYPE_DATE_DEFAULT;
$dateAccessConclusion = $data["dateAccessConclusion"] ?? null;
$dateAccessDays = $data["dateAccessDays"] ?? null;
$dateSupportConclusion = $data["dateSupportConclusion"] ?? null;
$dateSupportDays = $data["dateSupportDays"] ?? null;
$group->setName($data["name"]);
$group->setTypeDateAccess($typeDateAccess);
$group->setStatus($data["status"]);
$group->setTypeDateAccess((int)$data["typeDateAccess"]);
$group->setDateAccessConclusion($dateAccessConclusion);
$group->setDateAccessDays($dateAccessDays);
$group->setTypeDateSupport($typeDateSupport);
$group->setDateSupportConclusion($dateSupportConclusion);
$group->setDateSupportDays($dateSupportDays);
$group->setUserManager($data['user']);
$this->em->flush();
$data = $group->toReturn();
$this->getLogService()->logUpdate("group", $group->getId(), $data);
return $data;
}
public function getGroupPaginate(
$orderParam,
$status,
$searchText,
$limit,
$offset,
$filterDelete,
$userManager
)
{
$filter = [];
$userClass = User::class;
$order = [ "g.id" => "DESC" ];
$columns = [
"g.id",
"g.name",
"g.status",
"DATE_FORMAT(g.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"um.name AS userManager",
"um.id AS userManagerId",
"ud.name AS userDelete",
];
$joins = [
"$userClass AS um" => ["LEFT", "um.id = g.userManager"],
"$userClass AS ud" => ["LEFT", "ud.id = g.userDelete"]
];
if(!empty($order)){
$order = json_decode($orderParam, true);
}
if(!empty($userManager)){
$filter["g.userManager"] = $userManager;
}
if(!is_null($status)){
$filter["g.status"] = $status;
}
return $this->paginate(
"g",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
}
public function cloneGroup(Group $group): array
{
$newGroup = clone $group;
$newGroup->setName("{$newGroup->getName()} - COPY ");
$newGroup->removeAllUser();
$this->em->persist($newGroup);
$this->em->flush();
$return = $newGroup->toReturn();
$this->getLogService()->logInsert("group", $newGroup->getId(), $return);
return $return;
}
public function getGroupName(Group $group): ?string
{
return $group->getName();
}
public function addGroupUser(Group $group, $user): Group
{
$group->addUser($user);
$this->getLogService()->logInsert("group_x_user", $group->getId(), $user);
return $group;
}
public function removeGroupUser($group, $user, $groupId, $userId): void
{
$group->removeUser($user);
$this->getLogService()->logDelete("group_x_user", $groupId, [ "user" => $userId ]);
$this->em->flush();
}
public function addGroupCourses($group, $courses)
{
foreach ($courses as $course) {
$group->addCourse($course);
}
$this->getLogService()->logInsert("group_x_course", $group->getId(), $courses);
$this->em->flush();
}
public function getGroupReturn($groupId)
{
$group = $this->findOneBy([
"id" => $groupId,
"deleted" => GroupEnum::ITEM_NO_DELETED
]);
return empty($group) ? false : $group->toReturn();
}
public function getGroupsIdAndName(): array
{
$groups = $this->findBy([
"deleted" => GroupEnum::ITEM_NO_DELETED
]);
$data = [];
foreach ($groups as $group) {
$item = (object)[
"id" => $group->getId(),
"title" => $group->getName(),
];
$data[] = $item;
}
return $data;
}
public function removeGroupCourse(Group $group, Course $course): void
{
$group->removeCourse($course);
$this->em->flush();
$this->getLogService()->logDelete(
"group_x_course",
$group->getId(),
["course" => $course->getId()]
);
}
}