src/EventSubscriber/Task/TaskPostValidateSubscriber.php line 95

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: SUSAN MEDINA
  5.  * Date: 21/03/2019
  6.  * Time: 12:34 PM
  7.  */
  8. namespace App\EventSubscriber\Task;
  9. use ApiPlatform\Core\EventListener\EventPriorities;
  10. use App\Entity\App\Task\TaskStatusLog;
  11. use App\Entity\App\Task\WorkerBudget;
  12. use App\Entity\App\Ticket\Ticket;
  13. use App\Entity\App\User;
  14. use App\Services\VendorService;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpKernel\Event\ViewEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. use Symfony\Component\Validator\Validator\ValidatorInterface;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\Form\FormFactoryInterface;
  23. use Symfony\Contracts\Translation\TranslatorInterface;
  24. use App\Exception\InvalidArgumentException;
  25. use App\Exception\NotFoundException;
  26. use App\Repository\App\MaintenanceElementRepository;
  27. use App\Repository\App\VendorStaffRepository;
  28. use App\Repository\App\MediaObjectRepository;
  29. use App\Repository\App\ResourceRepository;
  30. use App\Repository\App\RoleRepository;
  31. use App\Repository\App\ScheduleRepository;
  32. use App\Repository\App\Task\WorkerBudgetRepository;
  33. use App\Entity\App\Task\Task;
  34. use App\Entity\App\Role;
  35. use App\Entity\App\VendorStaff;
  36. use App\Entity\App\MediaObject;
  37. use App\Entity\App\ResourceAndTool;
  38. use App\Entity\App\Category;
  39. use App\Services\UtilsService;
  40. class TaskPostValidateSubscriber implements EventSubscriberInterface
  41. {
  42.     private $translator;
  43.     private $tokenStorage;
  44.     private $factory;
  45.     private $validator;
  46.     private $request;
  47.     private $roleRepository;
  48.     private $vendorStaffRepository;
  49.     private $mediaObjectRepository;
  50.     private $elementRepository;
  51.     private $resourceRepository;
  52.     private $scheduleRepository;
  53.     private $workerBudgetRepository;
  54.     private $utilsService;
  55.     private $vendorService;
  56.     private $locale;
  57.     public function __construct(
  58.         TranslatorInterface $translator,
  59.         FormFactoryInterface $factory,
  60.         ValidatorInterface $validator,
  61.         RoleRepository $roleRepository,
  62.         VendorStaffRepository $vendorStaffRepository,
  63.         MediaObjectRepository $mediaObjectRepository,
  64.         MaintenanceElementRepository $elementRepository,
  65.         WorkerBudgetRepository $workerBudgetRepository,
  66.         ResourceRepository $resourceRepository,
  67.         ScheduleRepository $scheduleRepository,
  68.         TokenStorageInterface $tokenStorage,
  69.         UtilsService $utilsService,
  70.         VendorService $vendorService
  71.     ){
  72.         $this->translator $translator;
  73.         $this->tokenStorage $tokenStorage;
  74.         $this->factory $factory;
  75.         $this->validator $validator;
  76.         $this->roleRepository $roleRepository;
  77.         $this->vendorStaffRepository $vendorStaffRepository;
  78.         $this->mediaObjectRepository $mediaObjectRepository;
  79.         $this->elementRepository $elementRepository;
  80.         $this->resourceRepository $resourceRepository;
  81.         $this->scheduleRepository $scheduleRepository;
  82.         $this->workerBudgetRepository $workerBudgetRepository;
  83.         $this->utilsService $utilsService;
  84.         $this->vendorService $vendorService;
  85.     }
  86.     /**
  87.      * @param ViewEvent $event
  88.      * @throws \Exception
  89.      */
  90.     public function onKernelView(ViewEvent $event)
  91.     {
  92.         if ($this->utilsService->isAPublicRequest($event)) {
  93.             return;
  94.         }
  95.         $task $event->getControllerResult();
  96.         $this->request $event->getRequest();
  97.         $method $this->request->getMethod();
  98.         $this->locale $this->request->getLocale();
  99.         if (!($task instanceof Task) ||
  100.             (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method)
  101.         ) {
  102.             return;
  103.         }
  104.         $content $this->request->getContent();
  105.         $params json_decode($contenttrue);
  106.         $this->validateRequiredFields($task$params$event$method);
  107.         return;
  108.     }
  109.     /**
  110.      * @param Task $task
  111.      * @param array $params
  112.      * @param ViewEvent $event
  113.      * @param string $method
  114.      * @throws InvalidArgumentException
  115.      * @throws NotFoundException
  116.      */
  117.     protected function validateRequiredFields(Task $task, array $paramsViewEvent $eventstring $method)
  118.     {
  119.         $ticket $task->getTicket();
  120.         $vendor $ticket->getVendor();
  121.         $locale $this->locale;
  122.         if ($task->getCategory() && $task->getCategory()->getVendor() !== $vendor) {
  123.             $this->response(
  124.                 $event,
  125.                 $this->translator->trans('vendor.validate.does_not_belongs',
  126.                 [
  127.                     '%entity%' => $this->translator->trans('category.title', [], null$locale),
  128.                     '%vendorName%' => $vendor->getName()
  129.                 ]
  130.             ));
  131.         }
  132.         if ($task->getCategory() && $task->getCategory()->getType() !== Category::TYPE_TASK) {
  133.             $this->response(
  134.                 $event,
  135.                 $this->translator->trans(
  136.                     'category.validate.type_not_allowed',
  137.                     [
  138.                         '%type%' => $task->getCategory()->getType(),
  139.                         '%typeAllowed%' => Category::TYPE_TASK
  140.                     ],
  141.                     null,
  142.                     $locale
  143.                 )
  144.             );
  145.         }
  146.         if ($task->getLocation() && $task->getLocation()->getVendor() !== $vendor) {
  147.             $this->response(
  148.                 $event,
  149.                 $this->translator->trans(
  150.                     'vendor.validate.does_not_belongs',
  151.                     [
  152.                         '%entity%' => $this->translator->trans('location.title'),
  153.                         '%vendorName%' => $vendor->getName()
  154.                     ],
  155.                     null,
  156.                     $locale
  157.                 )
  158.             );
  159.         }
  160.         if ($task->getDateStart() && $task->getDateEnd()) {
  161.             $dateStart $task->getDateStart()->format('Y-m-d');
  162.             $dateEnd $task->getDateEnd()->format('Y-m-d');
  163.             if ($dateStart $dateEnd) {
  164.                 $this->response(
  165.                     $event,
  166.                     $this->translator->trans(
  167.                         'general.validate.date_must_be_greater',
  168.                         [
  169.                             '%field%' => 'dateEnd',
  170.                             '%dateCompare%' => 'dateStart'
  171.                         ],
  172.                         null,
  173.                         $locale
  174.                     )
  175.                 );
  176.             }
  177.         }
  178.         $authorizationManager false;
  179.         $userCurrent $this->tokenStorage->getToken()->getUser();
  180.         if($userCurrent instanceof User) {
  181.             $locale $userCurrent->getLocale();
  182.             $vendor $task->getTicket()->getVendor();
  183.             if ($this->vendorService->isUserRoleInToVendor(
  184.                 $vendor,
  185.                 $userCurrent,
  186.                 [Role::ROLE_ADMINRole::ROLE_TASKMASTER]
  187.             )) {
  188.                 $authorizationManager true;
  189.             }
  190.         }
  191.         if ($authorizationManager && isset($params['workerBudgets']) && is_array($params['workerBudgets'])) {
  192.             $roleOperator $this->roleRepository->findOneBy(['name' => Role::ROLE_OPERATOR]);
  193.             if ($method === Request::METHOD_PUT) {
  194.                 $getWorkerBudgets $this->workerBudgetRepository->findByTask($task);
  195.             } else {
  196.                 $getWorkerBudgets = [];
  197.             }
  198.             $workerBudgetArray = [];
  199.             foreach ($params['workerBudgets'] as &$wb) {
  200.                 if (isset($wb['role']) && $wb['role'] === $roleOperator->getId()) {
  201.                     $workerBudgetArray[] = [
  202.                         'role' => $wb['role'],
  203.                         'vendorStaff' => $wb['vendorStaff']
  204.                     ];
  205.                 }
  206.             }
  207.             foreach ($getWorkerBudgets as $workerBudget) {
  208.                 if ($workerBudget instanceof WorkerBudget) {
  209.                     $workerBudgetFormat = [
  210.                         'role' => $workerBudget->getRole()->getId(),
  211.                         'vendorStaff' => $workerBudget->getVendorStaff()->getId()
  212.                     ];
  213.                     if ($workerBudget->getRole() === $roleOperator &&
  214.                         !in_array($workerBudgetFormat$workerBudgetArray)
  215.                     ) {
  216.                         if ($ticket->getType()->getStage() === Ticket::STAGE_WORK_ORDER &&
  217.                             $workerBudget->getTaskStatusLogs()->last() &&
  218.                             !in_array(
  219.                                 $workerBudget->getTaskStatusLogs()->last()->getState(),
  220.                                 [
  221.                                     TaskStatusLog::STATUS_TASK_IN_PROCESS,
  222.                                     TaskStatusLog::STATUS_TASK_CANCELLED
  223.                                 ]
  224.                             )) {
  225.                             $this->response(
  226.                                 $event,
  227.                                 $this->translator->trans(
  228.                                     'operator has already started their task',
  229.                                     [
  230.                                         '%user%' => $workerBudget->getVendorStaff()->getUser()->getFullName()
  231.                                     ],
  232.                                     null,
  233.                                     $locale
  234.                                 )
  235.                             );
  236.                         }
  237.                     }
  238.                 }
  239.             }
  240.             foreach ($params['workerBudgets'] as $workerBudgetRequest) {
  241.                 if (isset($workerBudgetRequest['role'])) {
  242.                     $role $this->roleRepository->find($workerBudgetRequest['role']);
  243.                     if (!$role instanceof Role) {
  244.                         $this->response(
  245.                             $event,
  246.                             $this->translator->trans(
  247.                                 'general.validate.not_exists',
  248.                                 [
  249.                                     '%entityName%' => $this->translator->trans('role.title', [], null$locale),
  250.                                     '%entityId%' => $workerBudgetRequest['role']
  251.                                 ],
  252.                                 null,
  253.                                 $locale
  254.                             ),
  255.                             Response::HTTP_NOT_FOUND
  256.                         );
  257.                     }
  258.                     $vendorStaff $this->vendorStaffRepository->find($workerBudgetRequest['vendorStaff']);
  259.                     if (!$vendorStaff instanceof VendorStaff) {
  260.                         throw new NotFoundException(
  261.                             $this->translator->trans(
  262.                                 'general.validate.not_exists',
  263.                                 [
  264.                                     '%entityName%' => 'vendorStaff',
  265.                                     '%entityId%' => $workerBudgetRequest['vendorStaff']
  266.                                 ]
  267.                             )
  268.                         );
  269.                     }
  270.                     if ($vendorStaff->getVendor() !== $vendor) {
  271.                         throw new InvalidArgumentException(
  272.                             $this->translator->trans(
  273.                                 'vendor.validate.does_not_belongs',
  274.                                 [
  275.                                     '%entity%' => 'vendorStaff '.$vendorStaff->getId(),
  276.                                     '%vendorName%' => $vendor->getName()
  277.                                 ]
  278.                             )
  279.                         );
  280.                     }
  281.                     if (!in_array($role$vendorStaff->getRoles())) {
  282.                         throw new InvalidArgumentException(
  283.                             $this->translator->trans(
  284.                                 'user with vendorStaff, has not been assigned the role',
  285.                                 [
  286.                                     '%user%' => $vendorStaff->getUser()->getFullName(),
  287.                                     '%vendorStaff%' => $workerBudgetRequest['vendorStaff'],
  288.                                     '%role%' => $this->translator->trans($role->getName())
  289.                                 ]
  290.                             )
  291.                         );
  292.                     }
  293.                 }
  294.             }
  295.         }
  296.         if($authorizationManager && isset($params['mediaContent']) &&
  297.             is_array($params['mediaContent']) &&
  298.             count($params['mediaContent']) > 0
  299.         ){
  300.             foreach ($task->getMediaContent() as $mediaId){
  301.                 $media $this->mediaObjectRepository->find($mediaId);
  302.                 if (!$media instanceof MediaObject) {
  303.                     $this->response(
  304.                         $event,
  305.                         $this->translator->trans(
  306.                             'general.validate.not_exists',
  307.                             [
  308.                                 '%entityName%' => $this->translator->trans('mediaObject.name'),
  309.                                 '%entityId%' => $mediaId
  310.                             ]
  311.                         ),
  312.                         Response::HTTP_NOT_FOUND
  313.                     );
  314.                 }
  315.                 if ($media->getTask() !== null && $media->getTask() !== $task) {
  316.                     $this->response(
  317.                         $event,
  318.                         $this->translator->trans(
  319.                             'mediaObject.validate.does_not_belongs',
  320.                             [
  321.                                 '%mediaId%' => $mediaId,
  322.                                 '%entity%' => $this->translator->trans('task.name')
  323.                             ],
  324.                             null,
  325.                             $locale
  326.                         )
  327.                     );
  328.                 }
  329.                 if ($media->getType() !== MediaObject::TYPE_TASK) {
  330.                     $this->response(
  331.                         $event,
  332.                         $this->translator->trans(
  333.                             'mediaObject.validate.type_not_allowed',
  334.                             [
  335.                                 '%mediaId%' => $mediaId,
  336.                                 '%mediaType%' => $media->getType(),
  337.                                 '%mediaTypeAvailable%' => MediaObject::TYPE_TASK
  338.                             ],
  339.                             null,
  340.                             $locale
  341.                         )
  342.                     );
  343.                 }
  344.             }
  345.         }
  346.         if(isset($params['maintenanceElements']) &&
  347.             is_array($params['maintenanceElements']) &&
  348.             count($params['maintenanceElements']) > 0
  349.         ){
  350.             foreach ($params['maintenanceElements'] as $field) {
  351.                 if (isset($field['id'])) {
  352.                     $maintenanceElement $this->elementRepository->find($field['id']);
  353.                     if ($maintenanceElement->getVendor() !== $vendor) {
  354.                         $this->response(
  355.                             $event,
  356.                             $this->translator->trans(
  357.                                 'vendor.validate.does_not_belongs',
  358.                                 [
  359.                                     '%entity%' => $this->translator->trans('maintenanceElement.title'),
  360.                                     '%vendorName%' => $vendor->getName()
  361.                                 ],
  362.                                 null,
  363.                                 $locale
  364.                             )
  365.                         );
  366.                     }
  367.                 }
  368.             }
  369.         }
  370.         if(isset($params['resources']) &&
  371.             is_array($params['resources']) &&
  372.             count($params['resources']) > 0
  373.         ){
  374.             foreach ($params['resources'] as $field) {
  375.                 if (isset($field['id'])) {
  376.                     $resource $this->resourceRepository->find($field['id']);
  377.                     if (!$resource instanceof ResourceAndTool) {
  378.                         $this->response(
  379.                             $event,
  380.                             $this->translator->trans('general.validate.not_exists',
  381.                                 [
  382.                                     '%entityName%' => $this->translator->trans('resource.title'),
  383.                                     '%entityId%' => $field['id']
  384.                                 ],
  385.                                 null,
  386.                                 $locale
  387.                             ),
  388.                             Response::HTTP_NOT_FOUND
  389.                         );
  390.                     }
  391.                     if ($resource->getVendor() !== $vendor) {
  392.                         $this->response(
  393.                             $event,
  394.                             $this->translator->trans('vendor.validate.does_not_belongs',
  395.                                 [
  396.                                     '%entity%' => $this->translator->trans('resource.title'),
  397.                                     '%vendorName%' => $vendor->getName()
  398.                                 ],
  399.                                 null,
  400.                                 $locale
  401.                             )
  402.                         );
  403.                     }
  404.                 }
  405.                 if (!isset($field['quantity'])) {
  406.                     $this->response(
  407.                         $event,
  408.                         $this->translator->trans(
  409.                             'field required in entity',
  410.                             [
  411.                                 '%field%' => 'quantity',
  412.                                 '%entityId%' => $field['id'],
  413.                                 '%entity%' => 'resources'
  414.                             ],
  415.                             null,
  416.                             $locale
  417.                         )
  418.                     );
  419.                 }
  420.                 if (!is_numeric($field['quantity'])) {
  421.                     $this->response(
  422.                         $event,
  423.                         $this->translator->trans(
  424.                             'field is numeric in entity',
  425.                             [
  426.                                 '%field%' => 'quantity',
  427.                                 '%entityId%' => $field['id'],
  428.                                 '%entity%' => 'resources'
  429.                             ],
  430.                             null,
  431.                             $locale
  432.                         )
  433.                     );
  434.                 }
  435.             }
  436.         }
  437.     }
  438.     /**
  439.      * @param ViewEvent $event
  440.      * @param $message
  441.      * @param int $code
  442.      */
  443.     protected function response(ViewEvent $event$message$code Response::HTTP_NOT_ACCEPTABLE)
  444.     {
  445.         $response = new Response();
  446.         $response->setContent(json_encode(['detail' => $message]));
  447.         $response->setStatusCode($code);
  448.         $event->setResponse($response);
  449.         return;
  450.     }
  451.     public static function getSubscribedEvents()
  452.     {
  453.         return [
  454.             KernelEvents::VIEW => ['onKernelView'EventPriorities::POST_VALIDATE]
  455.         ];
  456.     }
  457. }