<?php
declare(strict_types=1);
namespace App\Nolimit\Task\Controller;
use App\Entity\Project;
use App\Entity\ProjectStatus;
use App\Entity\Task;
use App\Entity\TaskStatus;
use App\Entity\TaskType;
use App\Entity\User;
use App\Nolimit\Task\Manager\TaskManager;
use App\Nolimit\Task\Persister\TaskLogPersister;
use App\Nolimit\Task\Persister\TaskPersister;
use App\Nolimit\Task\Provider\TaskDatatableProvider;
use App\Repository\ProjectRepository;
use App\Repository\TaskLogRepository;
use App\Repository\TaskRepository;
use App\Repository\TaskStatusRepository;
use App\Repository\TaskTypeRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class TaskController extends CRUDController{
private EntityManagerInterface $entity;
private TaskDatatableProvider $datatableProvider;
private TranslatorInterface $translator;
private TaskManager $taskManager;
private TaskLogRepository $taskLogRepository;
private TaskRepository $taskRepository;
private TaskLogPersister $taskLogPersister;
private TaskPersister $taskPersister;
private TaskDatatableProvider $taskDatatableProvider;
private ProjectRepository $projectRepository;
private TaskTypeRepository $taskTypeRepository;
private TaskStatusRepository $taskStatusRepository;
private UserRepository $userRepository;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
public function __construct(EntityManagerInterface $entity,
TaskDatatableProvider $datatableProvider,
TranslatorInterface $translator,
TaskManager $taskManager,TaskLogRepository $taskLogRepository,TaskRepository $taskRepository,TaskLogPersister $taskLogPersister,TaskPersister $taskPersister,TaskDatatableProvider $taskDatatableProvider,ProjectRepository $projectRepository,TaskTypeRepository $taskTypeRepository,TaskStatusRepository $taskStatusRepository,UserRepository $userRepository,TokenStorageInterface $tokenStorage)
{
$this->entity = $entity;
$this->datatableProvider = $datatableProvider;
$this->translator = $translator;
$this->taskManager = $taskManager;
$this->taskLogRepository = $taskLogRepository;
$this->taskRepository = $taskRepository;
$this->taskLogPersister = $taskLogPersister;
$this->taskPersister = $taskPersister;
$this->taskDatatableProvider = $taskDatatableProvider;
$this->projectRepository = $projectRepository;
$this->taskTypeRepository = $taskTypeRepository;
$this->taskStatusRepository = $taskStatusRepository;
$this->userRepository = $userRepository;
$this->tokenStorage = $tokenStorage;
}
public function listAction(Request $request): Response
{
// $notActiveProjetStatu=[ProjectStatus::PROJECT_STATUS_BEFEJEZETT, ProjectStatus::PROJECT_STATUS_FELFUGESZTETT, ProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
// $projects=$this->projectRepository->getProjectByStatusNotIn($notActiveProjetStatu);
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$projects=$this->projectRepository->findAll();
$taskTypes=$this->taskTypeRepository->findAll();
$taskStatus=$this->taskStatusRepository->findAll();
$selectedStatus=array(TaskStatus::TASK_STATUS_LETREHOZOTT,TaskStatus::TASK_STATUS_FEJLESZTESALATT);
$user_id=$this->tokenStorage->getToken()->getUser()->getId();
$users=$this->userRepository->findAll();
return $this->renderWithExtraParams('/task/task_view.html.twig', array(
'projects'=>$projects,
'taskTypes'=>$taskTypes,
'taskStatus'=>$taskStatus,
'selectedStatus'=>$selectedStatus,
'user_id'=>$user_id,
'users'=>$users
));
}
/**
* @Route("/admin/app/task/task_list", name="task_list", methods={"POST"} )
*/
public function taskListAction()
{
$user=$this->tokenStorage->getToken()->getUser();
$user_id=$user->getId();
$selectedStatus=[TaskStatus::TASK_STATUS_LETREHOZOTT,TaskStatus::TASK_STATUS_FEJLESZTESALATT];
$adata['data'] =$this->datatableProvider->datatableRow($selectedStatus,$user_id);
return $this->json($adata);
}
/**
* @Route("/admin/app/apv/task_filtered", name="task_filtered", methods={"POST"} )
*/
public function taskFilteredAction(Request $request): Response
{
$adata['adata'] = $this->taskDatatableProvider->getFilteredData($request);
return $this->json($adata);
}
/**
* @Route("/admin/app/task/task_new", name="task_new", methods={"POST"} )
*/
public function taskNewAction(Request $request): Response
{
if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) {
// AJAX-kérés esetén 401-es válasz küldése
if ($request->isXmlHttpRequest()) {
return new JsonResponse(['error' => 'Unauthorized'], 401);
}
// Nem AJAX-kérés esetén hozzáférés megtagadása
throw new AccessDeniedException('Hozzáférés megtagadva');
}
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$projectStatus = [ProjectStatus::PROJECT_STATUS_BEFEJEZETT,ProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
$project = $this->entity->getRepository(Project::class)->getProjectByStatusNotIn($projectStatus);
$user = $this->entity->getRepository(User::class)->findAll();
$taskType = $this->entity->getRepository(TaskType::class)->findAll();
$taskStatus = $this->entity->getRepository(TaskStatus::class)->findAll();
$lastWorkedDay = $this->taskManager->getLastWorkedDay();
return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
'project'=>$project,
'user'=>$user,
'taskType'=>$taskType,
'title'=>$this->translator->trans('New task'),
'edited'=>false,
'lastWorkedDay'=>$lastWorkedDay,
'taskStatus'=>$taskStatus
));
}
/**
* @Route("/admin/app/task/task_edit", name="task_edit", methods={"POST"} )
*/
public function taskEditAction(Request $request): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$id = $request->get('id');
$task = $this->entity->getRepository(Task::class)->find($id);
$projectStatus = [ProjectStatus::PROJECT_STATUS_BEFEJEZETT,ProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
$project = $this->entity->getRepository(Project::class)->getProjectByStatusNotIn($projectStatus);
$taskStatus = $this->entity->getRepository(TaskStatus::class)->findAll();
$user = $this->entity->getRepository(User::class)->findAll();
$taskType = $this->entity->getRepository(TaskType::class)->findAll();
return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
'project'=>$project,
'user'=>$user,
'task'=>$task,
'title'=>$this->translator->trans('Edit task'),
'taskStatus'=>$taskStatus,
'taskType'=>$taskType,
'edited'=>true
));
}
/**
* @Route("/admin/app/task/task_save", name="task_save", methods={"POST"} )
*/
public function taskSaveAction(Request $request): Response
{
$task = $this->taskPersister->insertUpdateTask($request);
$data[] = $this->taskDatatableProvider->getRow($task);
return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]), 200);
}
/**
* @Route("/admin/app/task/task_new_log", name="task_new_log", methods={"POST"} )
*/
public function taskNewLogAction(Request $request): Response
{
$id = $request->get('id');
$task = $this->entity->getRepository(Task::class)->find($id);
$lastWorkedDay = $this->taskManager->getLastWorkedDay();
return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
'task'=>$task,
'title'=>$this->translator->trans('New log'),
'edited'=>false,
'lastWorkedDay'=>$lastWorkedDay
));
}
/**
* @Route("/admin/app/task/task_edit_log", name="task_edit_log", methods={"POST"} )
*/
public function taskEditLogAction(Request $request): Response
{
$id = $request->get('id');
$taskLog = $this->taskLogRepository->find($id);
return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
'task'=>$taskLog->getTask(),
'title'=>$this->translator->trans('Edit log'),
'taskLog'=>$taskLog,
'workedHourMin'=>$this->taskManager->convertMinInHourMin($taskLog->getWorkedMinutes()),
'edited'=>true
));
}
/**
* @Route("/admin/app/task/task_save_log", name="task_save_log", methods={"POST"} )
*/
public function taskSaveLogAction(Request $request): Response
{
$this->taskLogPersister->insertUpdateTaskLog($request);
$task = $this->taskRepository->find($request->get('taskId'));
$data[] = $this->datatableProvider->getRow($task);
return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]), 200);
}
/**
* @Route("/admin/app/task/task_delete_log", name="task_delete_log", methods={"POST"} )
*/
public function taskDeleteLogAction(Request $request): Response
{
$logId = (int)$request->get('logId');
$taskId = (int)$request->get('taskId');
$taskLog = $this->taskLogRepository->find($logId);
$this->entity->remove($taskLog);
$this->entity->flush();
$task = $this->taskRepository->find($taskId);
$data[] = $this->taskDatatableProvider->getRow($task);
return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]), 200);
}
/**
* @Route("/admin/app/task/task_delete", name="task_delete", methods={"POST"} )
*/
public function taskDeleteAction(Request $request): Response
{
$id = (int)$request->get('id');
$task = $this->taskRepository->find($id);
$this->entity->remove($task);
$this->entity->flush();
return new JsonResponse(array('msg' => true), 200);
}
}