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

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.         return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
  142.             'project'=>$project,
  143.             'user'=>$user,
  144.             'taskType'=>$taskType,
  145.             'title'=>$this->translator->trans('New task'),
  146.             'edited'=>false,
  147.             'lastWorkedDay'=>$lastWorkedDay,
  148.             'taskStatus'=>$taskStatus
  149.         ));
  150.     }
  151.     /**
  152.      * @Route("/admin/app/task/task_edit", name="task_edit", methods={"POST"} )
  153.      */
  154.     public function taskEditAction(Request $request): Response
  155.     {
  156.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  157.         $id $request->get('id');
  158.         $task $this->entity->getRepository(Task::class)->find($id);
  159.         
  160.         // Ellenőrzés: Ha befejezett task, karbantartási projekt és van tranche_id, csak super admin módosíthatja
  161.         $currentUser $this->tokenStorage->getToken()->getUser();
  162.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$currentUser->getRoles());
  163.         
  164.         if ($task->getTaskStatus()->getId() == TaskStatus::TASK_STATUS_BEFEJEZETT &&
  165.             in_array($task->getProject()->getProjectType()->getId(), [ProjectType::PROJECT_TYPE_KARBANTARTASProjectType::PROJECT_TYPE_HOSTING]) &&
  166.             $task->getTranche() !== null &&
  167.             !$isSuperAdmin) {
  168.             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);
  169.         }
  170.         // Átadott vagy befejezett projekt + befejezett feladat esetén csak super admin módosíthat
  171.         if ($task->getTaskStatus()->getId() == TaskStatus::TASK_STATUS_BEFEJEZETT &&
  172.             $task->getProject()->getStatus() &&
  173.             in_array($task->getProject()->getStatus()->getId(), [ProjectStatus::PROJECT_STATUS_ATADOTTProjectStatus::PROJECT_STATUS_BEFEJEZETT]) &&
  174.             !$isSuperAdmin) {
  175.             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);
  176.         }
  177.         
  178.         $project $this->projectRepository->getProjectsForTaskAdd($isSuperAdmin);
  179.         // Szerkesztéskor a feladat jelenlegi projektje mindig szerepeljen a listában (ha nem Super Admin)
  180.         $currentProject $task->getProject();
  181.         if ($currentProject && !in_array($currentProject$projecttrue)) {
  182.             $project array_merge([$currentProject], $project);
  183.         }
  184.         $taskStatus $this->entity->getRepository(TaskStatus::class)->findAll();
  185.         $user $this->entity->getRepository(User::class)->findAll();
  186.         $taskType $this->entity->getRepository(TaskType::class)->findAll();
  187.         return $this->renderWithExtraParams('/task/task_new_edit.html.twig', array(
  188.             'project'=>$project,
  189.             'user'=>$user,
  190.             'task'=>$task,
  191.             'title'=>$this->translator->trans('Edit task'),
  192.             'taskStatus'=>$taskStatus,
  193.             'taskType'=>$taskType,
  194.             'edited'=>true
  195.         ));
  196.     }
  197.     /**
  198.      * @Route("/admin/app/task/task_save", name="task_save", methods={"POST"} )
  199.      */
  200.     public function taskSaveAction(Request $request): Response
  201.     {
  202.         $task $this->taskPersister->insertUpdateTask($request);
  203.         $data[] = $this->taskDatatableProvider->getRow($task);
  204.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  205.     }
  206.     /**
  207.      * @Route("/admin/app/task/task_new_log", name="task_new_log", methods={"POST"} )
  208.      */
  209.     public function taskNewLogAction(Request $request): Response
  210.     {
  211.         $id $request->get('id');
  212.         $task $this->entity->getRepository(Task::class)->find($id);
  213.         $lastWorkedDay $this->taskManager->getLastWorkedDay();
  214.         return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
  215.             'task'=>$task,
  216.             'title'=>$this->translator->trans('New log'),
  217.             'edited'=>false,
  218.             'lastWorkedDay'=>$lastWorkedDay
  219.         ));
  220.     }
  221.     /**
  222.      * @Route("/admin/app/task/task_edit_log", name="task_edit_log", methods={"POST"} )
  223.      */
  224.     public function taskEditLogAction(Request $request): Response
  225.     {
  226.         $id $request->get('id');
  227.         $taskLog $this->taskLogRepository->find($id);
  228.         return $this->renderWithExtraParams('/task/task_new_edit_log.html.twig', array(
  229.             'task'=>$taskLog->getTask(),
  230.             'title'=>$this->translator->trans('Edit log'),
  231.             'taskLog'=>$taskLog,
  232.             'workedHourMin'=>$this->taskManager->convertMinInHourMin($taskLog->getWorkedMinutes()),
  233.             'edited'=>true
  234.         ));
  235.     }
  236.     /**
  237.      * @Route("/admin/app/task/task_save_log", name="task_save_log", methods={"POST"} )
  238.      */
  239.     public function taskSaveLogAction(Request $request): Response
  240.     {
  241.         $this->taskLogPersister->insertUpdateTaskLog($request);
  242.         $task $this->taskRepository->find($request->get('taskId'));
  243.         $data[] = $this->datatableProvider->getRow($task);
  244.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  245.     }
  246.     /**
  247.      * @Route("/admin/app/task/task_delete_log", name="task_delete_log", methods={"POST"} )
  248.      */
  249.     public function taskDeleteLogAction(Request $request): Response
  250.     {
  251.         $logId = (int)$request->get('logId');
  252.         $taskId = (int)$request->get('taskId');
  253.         $taskLog $this->taskLogRepository->find($logId);
  254.         $this->entity->remove($taskLog);
  255.         $this->entity->flush();
  256.         $task $this->taskRepository->find($taskId);
  257.         $data[] = $this->taskDatatableProvider->getRow($task);
  258.         return new JsonResponse(array('msg' => true,'datatableRow' =>$data[0]),  200);
  259.     }
  260.     /**
  261.      * @Route("/admin/app/task/task_move_log", name="task_move_log", methods={"POST"} )
  262.      */
  263.     public function taskMoveLogAction(Request $request): Response
  264.     {
  265.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  266.         $currentUser $this->tokenStorage->getToken()->getUser();
  267.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  268.             return new JsonResponse(['error' => 'Csak Super Admin helyezheti át a logot.'], 403);
  269.         }
  270.         $logId = (int)$request->get('logId');
  271.         $taskLog $this->taskLogRepository->find($logId);
  272.         if (!$taskLog) {
  273.             return new JsonResponse(['error' => 'A log nem található.'], 404);
  274.         }
  275.         $task $taskLog->getTask();
  276.         $projects $this->projectRepository->findBy([], ['name' => 'ASC']);
  277.         $taskItems $this->formatTasksForSelect(
  278.             $task->getProject()->getId(),
  279.             $task->getId()
  280.         );
  281.         return $this->renderWithExtraParams('/task/task_move_log.html.twig', [
  282.             'taskLog' => $taskLog,
  283.             'task' => $task,
  284.             'projects' => $projects,
  285.             'tasks' => $taskItems,
  286.             'title' => $this->translator->trans('Move log'),
  287.         ]);
  288.     }
  289.     /**
  290.      * @Route("/admin/app/task/task_move_log_tasks", name="task_move_log_tasks", methods={"POST"} )
  291.      */
  292.     public function taskMoveLogTasksAction(Request $request): JsonResponse
  293.     {
  294.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  295.         $currentUser $this->tokenStorage->getToken()->getUser();
  296.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  297.             return new JsonResponse(['error' => 'Csak Super Admin.'], 403);
  298.         }
  299.         $projectId = (int)$request->get('project_id');
  300.         $sourceTaskId = (int)$request->get('source_task_id');
  301.         return new JsonResponse([
  302.             'tasks' => $this->formatTasksForSelect($projectId$sourceTaskId),
  303.         ]);
  304.     }
  305.     /**
  306.      * @Route("/admin/app/task/task_move_log_save", name="task_move_log_save", methods={"POST"} )
  307.      */
  308.     public function taskMoveLogSaveAction(Request $request): JsonResponse
  309.     {
  310.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  311.         $currentUser $this->tokenStorage->getToken()->getUser();
  312.         if (!in_array('ROLE_SUPER_ADMIN'$currentUser->getRoles())) {
  313.             return new JsonResponse(['error' => 'Csak Super Admin helyezheti át a logot.'], 403);
  314.         }
  315.         try {
  316.             $result $this->taskLogPersister->moveTaskLog($request);
  317.             $rows = [];
  318.             $taskIds = [];
  319.             foreach ([$result['sourceTask'], $result['targetTask']] as $t) {
  320.                 $id $t->getId();
  321.                 if (!in_array($id$taskIdstrue)) {
  322.                     $taskIds[] = $id;
  323.                     $rows[] = $this->taskDatatableProvider->getRow($t);
  324.                 }
  325.             }
  326.             return new JsonResponse([
  327.                 'msg' => true,
  328.                 'datatableRows' => $rows,
  329.                 'sourceTaskId' => $result['sourceTask']->getId(),
  330.             ]);
  331.         } catch (\Exception $e) {
  332.             return new JsonResponse(['error' => $e->getMessage()], 400);
  333.         }
  334.     }
  335.     /**
  336.      * @Route("/admin/app/task/task_delete", name="task_delete", methods={"POST"} )
  337.      */
  338.     public function taskDeleteAction(Request $request): Response
  339.     {
  340.         $id = (int)$request->get('id');
  341.         $task $this->taskRepository->find($id);
  342.         $this->entity->remove($task);
  343.         $this->entity->flush();
  344.         return new JsonResponse(array('msg' => true),  200);
  345.     }
  346.     private function formatTasksForSelect(int $projectIdint $excludeTaskId): array
  347.     {
  348.         $items = [];
  349.         foreach ($this->taskRepository->getTasksByProjectId($projectId) as $t) {
  350.             if ($t->getId() === $excludeTaskId) {
  351.                 continue;
  352.             }
  353.             $items[] = ['id' => $t->getId(), 'name' => strip_tags($t->getName())];
  354.         }
  355.         return $items;
  356.     }
  357. }