src/Admin/Modules/CRM/Controller/TaskController.php line 48

  1. <?php
  2. namespace App\Admin\Modules\CRM\Controller;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Knp\Component\Pager\PaginatorInterface;
  8. use App\Admin\Modules\Contract\Entity\ContractClient;
  9. use App\Admin\Modules\CRM\Service\UserRepositoryService;
  10. use App\Admin\Modules\CRM\Service\TaskService;
  11. use App\Admin\Modules\CRM\Entity\CRMTask;
  12. use App\Admin\Modules\CRM\Form\TaskSearchFilterType;
  13. use App\Admin\Modules\CRM\Form\TaskType;
  14. use App\Admin\Modules\CRM\Form\TaskDurationPopupType;
  15. use App\Admin\Modules\CRM\Form\TaskNoteType;
  16. class TaskController extends BaseController
  17. {
  18.     private const PAGE_SIZE 15;
  19.     private $_paginator;
  20.     private $_doctrine;
  21.     private $_userRepositoryService;
  22.     private $_taskService;
  23.     public function __construct(
  24.             PaginatorInterface $paginator,
  25.             ManagerRegistry $doctrine,
  26.             UserRepositoryService $userRepositoryService,
  27.             TaskService $taskService)
  28.     {
  29.         $this->_paginator $paginator;
  30.         $this->_doctrine $doctrine;
  31.         $this->_userRepositoryService $userRepositoryService;
  32.         $this->_taskService $taskService;
  33.     }
  34.     public function beforeAction()
  35.     {
  36.         $url $this->generateUrl('admin_crm_task_list');
  37.         
  38.         $this->addBreadcrumb('CRM'$url);
  39.         $this->addBreadcrumb('Lista zadań'$url);
  40.     }
  41.     
  42.     public function list(Request $request)
  43.     {
  44.         $filterForm $this->createForm(TaskSearchFilterType::class);
  45.         $filterForm->handleRequest($request);
  46.        
  47.         if (!$filterForm->isSubmitted() || $filterForm->isValid())
  48.         {
  49.             $filter $filterForm->getData();
  50.             $filter->join['t.client'] = 'client';
  51.             $filter->leftJoin['t.group'] = '_group';
  52.             
  53.             $query $this->_doctrine->getRepository(CRMTask::class)->getSearchQuery($filter);
  54.             if ($query)
  55.             {
  56.                 $pagination $this->_paginator->paginate(
  57.                     $query,
  58.                     $request->query->getInt('page'1),
  59.                     self::PAGE_SIZE,
  60.                     array('defaultSortFieldName' => 't.date''defaultSortDirection' => 'asc')
  61.                 );
  62.                 
  63.                 $tasks = array();
  64.                 
  65.                 foreach($pagination as $task)
  66.                     $tasks[] = $this->_taskService->getDetails($task, ['include' => ['client_data']]);
  67.             }
  68.         }
  69.         return $this->render('Admin/Modules/CRM/Templates/Task/list.html.twig', [
  70.             'filterForm' => $filterForm->createView(),
  71.             'pagination' => $pagination ?? null,
  72.             'tasks' => $tasks ?? null
  73.         ]);
  74.     }
  75.     public function listUpdateTaskItemAjax(Request $request$id$viewType)
  76.     {
  77.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  78.   
  79.         if (!$task)
  80.             $this->throwHttpError400();
  81.         switch($viewType)
  82.         {
  83.             case TaskSearchFilterType::VIEW_TYPE_LIST:
  84.                 $view 'listViewListTaskItem.html.twig';
  85.                 break;
  86.             case TaskSearchFilterType::VIEW_TYPE_TILED:
  87.                 $view 'listViewTiledTaskItem.html.twig';
  88.                 break;
  89.             default:
  90.                 $this->throwHttpError400();
  91.         }
  92.         return $this->render('Admin/Modules/CRM/Templates/Task/partials/' $view, array(
  93.             'data' => $this->_taskService->getDetails($task, ['include' => ['client_data']]),
  94.             'requestUri' => $request->query->get('requestUri')
  95.         ));
  96.     }
  97.     public function listTodayTasksWidget(Request $request)
  98.     {
  99.         return $this->render('Admin/Modules/CRM/Templates/Task/partials/listTodayTasksWidget.html.twig', array(
  100.             'data' => $this->_taskService->getTaskListTodayTasksWidgetData(),
  101.             'requestUri' => $request->getRequestUri()
  102.         ));
  103.     }
  104.     public function details(Request $request$id)
  105.     {
  106.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  107.         
  108.         if (!$task)
  109.             throw $this->createNotFoundException();
  110.         $this->addBreadcrumb('Karta zadania'$request->getRequestUri());
  111.         return $this->render('Admin/Modules/CRM/Templates/Task/details.html.twig', array(
  112.             'data' => $this->_taskService->getDetails($task, ['include' => ['client_data''files']]),
  113.             'returnUrl' => $this->getReturnUrl($this->generateUrl('admin_crm_task_list'))
  114.         ));
  115.     }
  116.     public function detailsActivitiesWidget(Request $requestCRMTask $task null$id null$activityId null$isDone null)
  117.     {
  118.         if ($id)
  119.             $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  120.   
  121.         if (!$task)
  122.             $this->throwHttpError400();
  123.         if (!count($task->getActivities()))
  124.             return new Response();
  125.         if ($activityId)
  126.         {
  127.             $activityIds explode(','$activityId);
  128.             
  129.             foreach($activityIds as $id)
  130.             {
  131.                 $activity null;
  132.                 foreach($task->getActivities() as $_activity)
  133.                 {
  134.                     if ($_activity->getId() == $id)
  135.                     {
  136.                         $activity $_activity;
  137.                         break;
  138.                     }
  139.                 }
  140.                 if (!$activity)
  141.                     $this->throwHttpError400();
  142.                 if (!$this->_taskService->setActivityDone($activity, (bool)(int)$isDone))
  143.                     $this->throwHttpError400();
  144.             }
  145.         }
  146.         $doneActivityCount 0;
  147.         foreach($task->getActivities() as $activity)
  148.         {
  149.             if ($activity->getDoneAt())
  150.                 $doneActivityCount++;
  151.         }
  152.                 
  153.         return $this->render('Admin/Modules/CRM/Templates/Task/partials/detailsActivitiesWidget.html.twig', array(
  154.             'task' => $task,
  155.             'doneActivityCount' => $doneActivityCount,
  156.             'canEdit' => !$task->getArchivedAt() && $task->getStatus() == CRMTask::STATUS_IN_PROGRESS
  157.         ));
  158.     }
  159.     public function detailsNotesWidget(Request $requestCRMTask $task null$id null)
  160.     {
  161.         if ($id)
  162.             $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  163.   
  164.         if (!$task)
  165.             $this->throwHttpError400();
  166.         
  167.         if (!$task->getArchivedAt())
  168.         {
  169.             $form $this->createForm(TaskNoteType::class);
  170.             $form->handleRequest($request);
  171.             if ($form->isSubmitted() && $form->isValid())
  172.             {
  173.                 $this->_taskService->addNote($form$task);
  174.                 $form $this->createForm(TaskNoteType::class);
  175.             }
  176.         }
  177.         return $this->render('Admin/Modules/CRM/Templates/Task/partials/detailsNotesWidget.html.twig', array(
  178.             'task' => $task,
  179.             'form' => isset($form) ? $form->createView() : null
  180.         ));
  181.     }
  182.     public function add(Request $request$userId)
  183.     {
  184.         if ($userId)
  185.         {
  186.             $user $this->_userRepositoryService->find($userId);
  187.             if (!$user)
  188.                 $this->throwHttpError400();
  189.         }
  190.         if ($request->query->get('clientId'))
  191.         {
  192.             $client $this->_doctrine->getRepository(ContractClient::class)->find($request->query->get('clientId'));
  193.             if (!$client)
  194.                 $this->throwHttpError400();
  195.         }
  196.         $returnUrl $this->getReturnUrl($this->generateUrl('admin_crm_task_list'));
  197.         $form $this->createForm(TaskType::class, null, ['user' => $user ?? null'client' => $client ?? null]);
  198.         $form->handleRequest($request);
  199.         if ($form->isSubmitted())
  200.         {
  201.             if ($form->isValid())
  202.             {
  203.                 $this->_taskService->add($form);
  204.                 
  205.                 $this->addFlash('success''Zadanie zostało dodane.');
  206.     
  207.                 return $this->redirect($returnUrl);
  208.             }
  209.             else
  210.                 $this->addFlash('error''Popraw wszystkie błędy.');
  211.         }
  212.         
  213.         $this->addBreadcrumb('Nowe zadanie'$request->getRequestUri());
  214.         return $this->render('Admin/Modules/CRM/Templates/Task/edit.html.twig', array(
  215.             'formType' => $form->getConfig()->getType()->getInnerType(),
  216.             'form' => $form->createView(),
  217.             'returnUrl' => $returnUrl
  218.         ));
  219.     }
  220.     public function edit(Request $request$id)
  221.     {
  222.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  223.         
  224.         if (!$task || $task->getArchivedAt())
  225.             throw $this->createNotFoundException();        
  226.         
  227.         $returnUrl $this->getReturnUrl($this->generateUrl('admin_crm_task_list'));
  228.         $form $this->createForm(TaskType::class, $task);
  229.         $form->handleRequest($request);
  230.         if ($form->isSubmitted())
  231.         {
  232.             if ($form->isValid())
  233.             {
  234.                 $this->_taskService->save($form);
  235.             
  236.                 $this->addFlash('success''Zadanie zostało zapisane.');
  237.     
  238.                 return $this->redirect($returnUrl);
  239.             }
  240.             else
  241.                 $this->addFlash('error''Popraw wszystkie błędy.');
  242.         }
  243.         
  244.         $this->addBreadcrumb('Edycja zadania'$request->getRequestUri());
  245.         return $this->render('Admin/Modules/CRM/Templates/Task/edit.html.twig', array(
  246.             'formType' => $form->getConfig()->getType()->getInnerType(),
  247.             'form' => $form->createView(),
  248.             'returnUrl' => $returnUrl
  249.         ));
  250.     }    
  251.     public function updateFormAjax(Request $request$id)
  252.     {
  253.         if ($id)
  254.         {
  255.             $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  256.             if (!$task)
  257.                 $this->throwHttpError400();
  258.         }
  259.         $form $this->createForm(TaskType::class, $task ?? null, ['validation_groups' => false]);
  260.         $form->handleRequest($request);
  261.         return new JsonResponse(array(
  262.             'html' => $this->renderView('Admin/Modules/CRM/Templates/Task/partials/form.html.twig', array(
  263.                 'formType' => $form->getConfig()->getType()->getInnerType(),
  264.                 'form' => $form->createView(),
  265.                 'returnUrl' => $this->getReturnUrl($this->generateUrl('admin_crm_task_list'))
  266.             ))
  267.         ));
  268.     }
  269.     public function moveToArchive($id)
  270.     {
  271.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  272.         
  273.         if (!$task || $task->getArchivedAt())
  274.             throw $this->createNotFoundException();
  275.         $this->_taskService->archive($task);
  276.         $this->addFlash('success''Zadanie zostało zarchiwizowane.');
  277.         return $this->redirect($this->getReturnUrl($this->generateUrl('admin_crm_task_list')));
  278.     }
  279.     
  280.     public function delete($id)
  281.     {
  282.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  283.         
  284.         if (!$task || !$task->getArchivedAt())
  285.             throw $this->createNotFoundException();
  286.         $this->_taskService->delete($task);
  287.         $this->addFlash('success''Zadanie zostało usunięte.');
  288.         return $this->redirect($this->getReturnUrl($this->generateUrl('admin_crm_task_list')));
  289.     }
  290.     
  291.     public function setStatus(Request $request$id$status)
  292.     {
  293.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  294.         
  295.         if (!$task || $task->getArchivedAt())
  296.             throw $this->createNotFoundException();
  297.         $prevStatus $task->getStatus();
  298.         $this->_taskService->setStatus($task$status);
  299.         if ($request->isXmlHttpRequest())
  300.             return new Response();
  301.         else
  302.         {
  303.             switch($status)
  304.             {
  305.                 case CRMTask::STATUS_IN_PROGRESS:
  306.                     $message $prevStatus == CRMTask::STATUS_NEW 'Zadanie zostało rozpoczęte.' 'Zadanie zostało wznowione.';
  307.                     break;
  308.                 case CRMTask::STATUS_DONE:
  309.                     $message 'Zadanie zostało zakończone.';
  310.                     break;
  311.                 default:
  312.                     $message 'Status zadania został zmieniony.';
  313.             }
  314.             $this->addFlash('success'$message);
  315.             return $this->returnToPreviousPage();
  316.         }
  317.     }
  318.     public function setDurationPopupAjax(Request $request$id)
  319.     {
  320.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  321.         
  322.         if (!$task || $task->getArchivedAt())
  323.             $this->throwHttpError400();
  324.         
  325.         $form $this->createForm(TaskDurationPopupType::class, $task);
  326.         $form->handleRequest($request);
  327.         if ($form->isSubmitted() && $form->isValid())
  328.         {
  329.             $this->_taskService->saveDuration($form);
  330.             $status true;
  331.         }
  332.         
  333.         return new JsonResponse(array(
  334.             'html' => $this->renderView('Admin/Modules/CRM/Templates/Task/setDurationPopup.html.twig', [
  335.                 'form' => $form->createView(),
  336.                 'status' => $status ?? false
  337.             ])
  338.         ));
  339.     }    
  340.     public function addNotePopupAjax(Request $request$id)
  341.     {
  342.         $task $this->_doctrine->getRepository(CRMTask::class)->find($id);
  343.         
  344.         if (!$task || $task->getArchivedAt())
  345.             $this->throwHttpError400();
  346.         
  347.         $form $this->createForm(TaskNoteType::class);
  348.         $form->handleRequest($request);
  349.         if ($form->isSubmitted() && $form->isValid())
  350.         {
  351.             $this->_taskService->addNote($form$task);
  352.             return new JsonResponse(array('status' => 'close'));
  353.         }
  354.         
  355.         return new JsonResponse(array(
  356.             'html' => $this->renderView('Admin/Modules/CRM/Templates/Task/addNotePopup.html.twig', [
  357.                 'form' => $form->createView()
  358.             ])
  359.         ));
  360.     }    
  361. }