src/Nolimit/Task/Controller/TaskController.php line 112

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Nolimit\Task\Controller;
  4. use App\Entity\Project;
  5. use App\Entity\ProjectStatus;
  6. use App\Entity\ProjectType;
  7. use App\Entity\Task;
  8. use App\Entity\TaskStatus;
  9. use App\Entity\TaskType;
  10. use App\Entity\User;
  11. use App\Nolimit\Task\Manager\TaskManager;
  12. use App\Nolimit\Task\Persister\TaskLogPersister;
  13. use App\Nolimit\Task\Persister\TaskPersister;
  14. use App\Nolimit\Task\Provider\TaskDatatableProvider;
  15. use App\Repository\ProjectRepository;
  16. use App\Repository\ProjectTypeRepository;
  17. use App\Repository\TaskLogRepository;
  18. use App\Repository\TaskRepository;
  19. use App\Repository\TaskStatusRepository;
  20. use App\Repository\TaskTypeRepository;
  21. use App\Repository\UserRepository;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Sonata\AdminBundle\Controller\CRUDController;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  29. use Symfony\Contracts\Translation\TranslatorInterface;
  30. class TaskController extends CRUDController{
  31.     private EntityManagerInterface $entity;
  32.     private TaskDatatableProvider $datatableProvider;
  33.     private TranslatorInterface $translator;
  34.     private TaskManager $taskManager;
  35.     private TaskLogRepository $taskLogRepository;
  36.     private TaskRepository $taskRepository;
  37.     private TaskLogPersister $taskLogPersister;
  38.     private TaskPersister $taskPersister;
  39.     private TaskDatatableProvider $taskDatatableProvider;
  40.     private ProjectRepository $projectRepository;
  41.     private ProjectTypeRepository $projectTypeRepository;
  42.     private TaskTypeRepository $taskTypeRepository;
  43.     private TaskStatusRepository $taskStatusRepository;
  44.     private UserRepository $userRepository;
  45.     /**
  46.      * @var TokenStorageInterface
  47.      */
  48.     private $tokenStorage;
  49.     public function __construct(EntityManagerInterface $entity,
  50.                                 TaskDatatableProvider $datatableProvider,
  51.                                 TranslatorInterface $translator,
  52.                                 TaskManager $taskManager,TaskLogRepository $taskLogRepository,TaskRepository $taskRepository,TaskLogPersister $taskLogPersister,TaskPersister $taskPersister,TaskDatatableProvider $taskDatatableProvider,ProjectRepository $projectRepository,ProjectTypeRepository $projectTypeRepository,TaskTypeRepository $taskTypeRepository,TaskStatusRepository $taskStatusRepository,UserRepository $userRepository,TokenStorageInterface $tokenStorage)
  53.     {
  54.         $this->entity $entity;
  55.         $this->datatableProvider $datatableProvider;
  56.         $this->translator $translator;
  57.         $this->taskManager $taskManager;
  58.         $this->taskLogRepository $taskLogRepository;
  59.         $this->taskRepository $taskRepository;
  60.         $this->taskLogPersister $taskLogPersister;
  61.         $this->taskPersister $taskPersister;
  62.         $this->taskDatatableProvider $taskDatatableProvider;
  63.         $this->projectRepository $projectRepository;
  64.         $this->projectTypeRepository $projectTypeRepository;
  65.         $this->taskTypeRepository $taskTypeRepository;
  66.         $this->taskStatusRepository $taskStatusRepository;
  67.         $this->userRepository $userRepository;
  68.         $this->tokenStorage $tokenStorage;
  69.     }
  70.     public function listAction(Request $request): Response
  71.     {
  72. //        $notActiveProjetStatu=[ProjectStatus::PROJECT_STATUS_BEFEJEZETT, ProjectStatus::PROJECT_STATUS_FELFUGESZTETT, ProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
  73. //        $projects=$this->projectRepository->getProjectByStatusNotIn($notActiveProjetStatu);
  74.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  75.         $projects=$this->projectRepository->findAll();
  76.         $projectTypes=$this->projectTypeRepository->findAll();
  77.         $taskTypes=$this->taskTypeRepository->findAll();
  78.         $taskStatus=$this->taskStatusRepository->findAll();
  79.         $user=$this->tokenStorage->getToken()->getUser();
  80.         $user_id=$user->getId();
  81.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$user->getRoles());
  82.         $selectedStatus $isSuperAdmin
  83.             ? [TaskStatus::TASK_STATUS_LETREHOZOTTTaskStatus::TASK_STATUS_FEJLESZTESALATTTaskStatus::TASK_STATUS_BEFEJEZETT]
  84.             : [TaskStatus::TASK_STATUS_LETREHOZOTTTaskStatus::TASK_STATUS_FEJLESZTESALATT];
  85.         $users=$this->userRepository->findAll();
  86.         return $this->renderWithExtraParams('/task/task_view.html.twig', array(
  87.             'projects'=>$projects,
  88.             'projectTypes'=>$projectTypes,
  89.             'taskTypes'=>$taskTypes,
  90.             'taskStatus'=>$taskStatus,
  91.             'selectedStatus'=>$selectedStatus,
  92.             'user_id'=>$user_id,
  93.             'current_user_id'=>$user_id,
  94.             'is_super_admin'=>$isSuperAdmin,
  95.             'users'=>$users
  96.         ));
  97.     }
  98.     /**
  99.      * @Route("/admin/app/task/task_list", name="task_list", methods={"POST"} )
  100.      */
  101.     public function taskListAction()
  102.     {
  103.         $user $this->tokenStorage->getToken()->getUser();
  104.         $user_id $user->getId();
  105.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$user->getRoles());
  106.         $selectedStatus $isSuperAdmin
  107.             ? [TaskStatus::TASK_STATUS_LETREHOZOTTTaskStatus::TASK_STATUS_FEJLESZTESALATT,  TaskStatus::TASK_STATUS_BEFEJEZETT]
  108.             : [TaskStatus::TASK_STATUS_LETREHOZOTTTaskStatus::TASK_STATUS_FEJLESZTESALATT];
  109.         $adata['data'] = $this->datatableProvider->datatableRow($selectedStatus$user_id);
  110.         return $this->json($adata);
  111.     }
  112.     /**
  113.      * @Route("/admin/app/apv/task_filtered", name="task_filtered", methods={"POST"} )
  114.      */
  115.     public function taskFilteredAction(Request $request): Response
  116.     {
  117.         $adata['adata'] = $this->taskDatatableProvider->getFilteredData($request);
  118.         return $this->json($adata);
  119.     }
  120.     /**
  121.      * @Route("/admin/app/task/task_new", name="task_new", methods={"POST"} )
  122.      */
  123.     public function taskNewAction(Request $request): Response
  124.     {
  125.         if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) {
  126.             // AJAX-kérés esetén 401-es válasz küldése
  127.             if ($request->isXmlHttpRequest()) {
  128.                 return new JsonResponse(['error' => 'Unauthorized'], 401);
  129.             }
  130.             // Nem AJAX-kérés esetén hozzáférés megtagadása
  131.             throw new AccessDeniedException('Hozzáférés megtagadva');
  132.         }
  133.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  134.         $currentUser $this->tokenStorage->getToken()->getUser();
  135.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$currentUser->getRoles());
  136.         $project $this->projectRepository->getProjectsForTaskAdd($isSuperAdmin);
  137.         $user $this->entity->getRepository(User::class)->findAll();
  138.         $taskType $this->entity->getRepository(TaskType::class)->findAll();
  139.         $taskStatus $this->entity->getRepository(TaskStatus::class)->findAll();
  140.         $lastWorkedDay $this->taskManager->getLastWorkedDay();
  141.         $defaultProject = !empty($project) ? reset($project) : null;
  142.         $nextOrderTask $defaultProject $this->taskRepository->getNextOrderTaskByProjectId($defaultProject->getId()) : 1;
  143.         return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
  144.             'project'=>$project,
  145.             'user'=>$user,
  146.             'taskType'=>$taskType,
  147.             'title'=>$this->translator->trans('New task'),
  148.             'edited'=>false,
  149.             'lastWorkedDay'=>$lastWorkedDay,
  150.             'taskStatus'=>$taskStatus,
  151.             'nextOrderTask'=>$nextOrderTask
  152.         ));
  153.     }
  154.     /**
  155.      * @Route("/admin/app/task/task_edit", name="task_edit", methods={"POST"} )
  156.      */
  157.     public function taskEditAction(Request $request): Response
  158.     {
  159.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  160.         $id $request->get('id');
  161.         $task $this->entity->getRepository(Task::class)->find($id);
  162.         
  163.         // Ellenőrzés: Ha befejezett task, karbantartási projekt és van tranche_id, csak super admin módosíthatja
  164.         $currentUser $this->tokenStorage->getToken()->getUser();
  165.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$currentUser->getRoles());
  166.         
  167.         if ($task->getTaskStatus()->getId() == TaskStatus::TASK_STATUS_BEFEJEZETT &&
  168.             in_array($task->getProject()->getProjectType()->getId(), [ProjectType::PROJECT_TYPE_KARBANTARTASProjectType::PROJECT_TYPE_HOSTING]) &&
  169.             $task->getTranche() !== null &&
  170.             !$isSuperAdmin) {
  171.             return new JsonResponse(['error' => 'Ez a feladat nem módosítható. Csak Super Admin módosíthatja a lezárt karbantartási vagy hosting feladatokat, amelyekhez tartozik tranche.'], 403);
  172.         }
  173.         // Átadott vagy befejezett projekt + befejezett feladat esetén csak super admin módosíthat
  174.         if ($task->getTaskStatus()->getId() == TaskStatus::TASK_STATUS_BEFEJEZETT &&
  175.             $task->getProject()->getStatus() &&
  176.             in_array($task->getProject()->getStatus()->getId(), [ProjectStatus::PROJECT_STATUS_ATADOTTProjectStatus::PROJECT_STATUS_BEFEJEZETT]) &&
  177.             !$isSuperAdmin) {
  178.             return new JsonResponse(['error' => 'Ez a feladat nem módosítható, mert a projekt átadott vagy befejezett és a feladat be van fejezve. Csak Super Admin módosíthatja.'], 403);
  179.         }
  180.         
  181.         $project $this->projectRepository->getProjectsForTaskAdd($isSuperAdmin);
  182.         // Szerkesztéskor a feladat jelenlegi projektje mindig szerepeljen a listában (ha nem Super Admin)
  183.         $currentProject $task->getProject();
  184.         if ($currentProject && !in_array($currentProject$projecttrue)) {
  185.             $project array_merge([$currentProject], $project);
  186.         }
  187.         $taskStatus $this->entity->getRepository(TaskStatus::class)->findAll();
  188.         $user $this->entity->getRepository(User::class)->findAll();
  189.         $taskType $this->entity->getRepository(TaskType::class)->findAll();
  190.         return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
  191.             'project'=>$project,
  192.             'user'=>$user,
  193.             'task'=>$task,
  194.             'title'=>$this->translator->trans('Edit task'),
  195.             'taskStatus'=>$taskStatus,
  196.             'taskType'=>$taskType,
  197.             'edited'=>true
  198.         ));
  199.     }
  200.     /**
  201.      * @Route("/admin/app/task/task_save", name="task_save", methods={"POST"} )
  202.      */
  203.     public function taskSaveAction(Request $request): Response
  204.     {
  205.         $task $this->taskPersister->insertUpdateTask($request);
  206.         $data[] = $this->taskDatatableProvider->getRow($task);
  207.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  208.     }
  209.     /**
  210.      * @Route("/admin/app/task/task_next_order", name="task_next_order", methods={"POST"} )
  211.      */
  212.     public function taskNextOrderAction(Request $request): JsonResponse
  213.     {
  214.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  215.         $projectId = (int) $request->get('projectId');
  216.         if ($projectId <= 0) {
  217.             return new JsonResponse(['nextOrderTask' => 1]);
  218.         }
  219.         return new JsonResponse([
  220.             'nextOrderTask' => $this->taskRepository->getNextOrderTaskByProjectId($projectId),
  221.         ]);
  222.     }
  223.     /**
  224.      * @Route("/admin/app/task/task_new_log", name="task_new_log", methods={"POST"} )
  225.      */
  226.     public function taskNewLogAction(Request $request): Response
  227.     {
  228.         $id $request->get('id');
  229.         $task $this->entity->getRepository(Task::class)->find($id);
  230.         $lastWorkedDay $this->taskManager->getLastWorkedDay();
  231.         return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
  232.             'task'=>$task,
  233.             'title'=>$this->translator->trans('New log'),
  234.             'edited'=>false,
  235.             'lastWorkedDay'=>$lastWorkedDay
  236.         ));
  237.     }
  238.     /**
  239.      * @Route("/admin/app/task/task_edit_log", name="task_edit_log", methods={"POST"} )
  240.      */
  241.     public function taskEditLogAction(Request $request): Response
  242.     {
  243.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  244.         $id = (int)$request->get('id');
  245.         $taskLog $this->taskLogRepository->find($id);
  246.         if (!$taskLog) {
  247.             return new JsonResponse(['error' => 'A log nem található.'], 404);
  248.         }
  249.         $currentUser $this->tokenStorage->getToken()->getUser();
  250.         $isSuperAdmin in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles());
  251.         if (!$isSuperAdmin && $taskLog->getUser()->getId() !== $currentUser->getId()) {
  252.             return new JsonResponse(['error' => 'Nincs jogosultsága a log módosításához.'], 403);
  253.         }
  254.         return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
  255.             'task'=>$taskLog->getTask(),
  256.             'title'=>$this->translator->trans('Edit log'),
  257.             'taskLog'=>$taskLog,
  258.             'workedHourMin'=>$this->taskManager->convertMinInHourMin($taskLog->getWorkedMinutes()),
  259.             'descriptionValue'=>$this->taskDatatableProvider->sanitizeTextForDatatable($taskLog->getDescription()),
  260.             'edited'=>true
  261.         ));
  262.     }
  263.     /**
  264.      * @Route("/admin/app/task/task_save_log", name="task_save_log", methods={"POST"} )
  265.      */
  266.     public function taskSaveLogAction(Request $request): Response
  267.     {
  268.         $this->taskLogPersister->insertUpdateTaskLog($request);
  269.         $task $this->taskRepository->find($request->get('taskId'));
  270.         $data[] = $this->datatableProvider->getRow($task);
  271.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  272.     }
  273.     /**
  274.      * @Route("/admin/app/task/task_delete_log", name="task_delete_log", methods={"POST"} )
  275.      */
  276.     public function taskDeleteLogAction(Request $request): Response
  277.     {
  278.         $logId = (int)$request->get('logId');
  279.         $taskId = (int)$request->get('taskId');
  280.         $taskLog $this->taskLogRepository->find($logId);
  281.         $this->entity->remove($taskLog);
  282.         $this->entity->flush();
  283.         $task $this->taskRepository->find($taskId);
  284.         $data[] = $this->taskDatatableProvider->getRow($task);
  285.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  286.     }
  287.     /**
  288.      * @Route("/admin/app/task/task_move_log", name="task_move_log", methods={"POST"} )
  289.      */
  290.     public function taskMoveLogAction(Request $request): Response
  291.     {
  292.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  293.         $currentUser $this->tokenStorage->getToken()->getUser();
  294.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  295.             return new JsonResponse(['error' => 'Csak Super Admin helyezheti át a logot.'], 403);
  296.         }
  297.         $logId = (int)$request->get('logId');
  298.         $taskLog $this->taskLogRepository->find($logId);
  299.         if (!$taskLog) {
  300.             return new JsonResponse(['error' => 'A log nem található.'], 404);
  301.         }
  302.         $task $taskLog->getTask();
  303.         $projects $this->projectRepository->findBy([], ['name' => 'ASC']);
  304.         $taskItems $this->formatTasksForSelect(
  305.             $task->getProject()->getId(),
  306.             $task->getId()
  307.         );
  308.         return $this->renderWithExtraParams('/task/task_move_log.html.twig', [
  309.             'taskLog' => $taskLog,
  310.             'task' => $task,
  311.             'projects' => $projects,
  312.             'tasks' => $taskItems,
  313.             'title' => $this->translator->trans('Move log'),
  314.         ]);
  315.     }
  316.     /**
  317.      * @Route("/admin/app/task/task_move_log_tasks", name="task_move_log_tasks", methods={"POST"} )
  318.      */
  319.     public function taskMoveLogTasksAction(Request $request): JsonResponse
  320.     {
  321.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  322.         $currentUser $this->tokenStorage->getToken()->getUser();
  323.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  324.             return new JsonResponse(['error' => 'Csak Super Admin.'], 403);
  325.         }
  326.         $projectId = (int)$request->get('project_id');
  327.         $sourceTaskId = (int)$request->get('source_task_id');
  328.         return new JsonResponse([
  329.             'tasks' => $this->formatTasksForSelect($projectId$sourceTaskId),
  330.         ]);
  331.     }
  332.     /**
  333.      * @Route("/admin/app/task/task_move_log_save", name="task_move_log_save", methods={"POST"} )
  334.      */
  335.     public function taskMoveLogSaveAction(Request $request): JsonResponse
  336.     {
  337.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  338.         $currentUser $this->tokenStorage->getToken()->getUser();
  339.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  340.             return new JsonResponse(['error' => 'Csak Super Admin helyezheti át a logot.'], 403);
  341.         }
  342.         try {
  343.             $result $this->taskLogPersister->moveTaskLog($request);
  344.             $rows = [];
  345.             $taskIds = [];
  346.             foreach ([$result['sourceTask'], $result['targetTask']] as $t) {
  347.                 $id $t->getId();
  348.                 if (!in_array($id$taskIdstrue)) {
  349.                     $taskIds[] = $id;
  350.                     $rows[] = $this->taskDatatableProvider->getRow($t);
  351.                 }
  352.             }
  353.             return new JsonResponse([
  354.                 'msg' => true,
  355.                 'datatableRows' => $rows,
  356.                 'sourceTaskId' => $result['sourceTask']->getId(),
  357.             ]);
  358.         } catch (\Exception $e) {
  359.             return new JsonResponse(['error' => $e->getMessage()], 400);
  360.         }
  361.     }
  362.     /**
  363.      * @Route("/admin/app/task/task_delete", name="task_delete", methods={"POST"} )
  364.      */
  365.     public function taskDeleteAction(Request $request): Response
  366.     {
  367.         $id = (int)$request->get('id');
  368.         $task $this->taskRepository->find($id);
  369.         $this->entity->remove($task);
  370.         $this->entity->flush();
  371.         return new JsonResponse(array('msg' => true),  200);
  372.     }
  373.     private function formatTasksForSelect(int $projectIdint $excludeTaskId): array
  374.     {
  375.         $items = [];
  376.         foreach ($this->taskRepository->getTasksByProjectId($projectId) as $t) {
  377.             if ($t->getId() === $excludeTaskId) {
  378.                 continue;
  379.             }
  380.             $items[] = ['id' => $t->getId(), 'name' => strip_tags($t->getName())];
  381.         }
  382.         return $items;
  383.     }
  384. }