src/EventSubscriber/Ticket/TicketPreWriteSubscriber.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Ticket;
  3. use App\Entity\App\CustomField;
  4. use App\Entity\App\Entity\Entity;
  5. use App\Entity\App\GlobalConfiguration;
  6. use App\Entity\App\Vendor;
  7. use App\Repository\App\CustomFieldsRepository;
  8. use App\Services\TicketService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpKernel\Event\ViewEvent;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use ApiPlatform\Core\EventListener\EventPriorities;
  18. use App\Repository\App\Ticket\TicketStateRepository;
  19. use App\Repository\App\Ticket\TicketTypeRepository;
  20. use App\Repository\App\RoleRepository;
  21. use App\Exception\AccessDeniedException;
  22. use App\Exception\NotFoundException;
  23. use App\Services\VendorService;
  24. use App\Services\UtilsService;
  25. use App\Entity\App\Ticket\Ticket;
  26. use App\Entity\App\Ticket\TicketState;
  27. use App\Entity\App\User;
  28. use App\Entity\App\Role;
  29. use App\Entity\Chat\Chat;
  30. class TicketPreWriteSubscriber implements EventSubscriberInterface
  31. {
  32.     private $translator;
  33.     private $tokenStorage;
  34.     private $authorizationChecker;
  35.     private $vendorService;
  36.     private $ticketStateRepository;
  37.     private $ticketTypeRepository;
  38.     private $ticketTypeRequest;
  39.     private $ticketTypeIncidence;
  40.     private $ticketTypeWorkOrder;
  41.     private $roleRepository;
  42.     private $utilsService;
  43.     private $entityManager;
  44.     private $ticketService;
  45.     private $customFieldRepository;
  46.     public function __construct(
  47.         TranslatorInterface $translator,
  48.         TokenStorageInterface $tokenStorage,
  49.         AuthorizationCheckerInterface $checker,
  50.         VendorService $vendorService,
  51.         TicketStateRepository $ticketStateRepository,
  52.         TicketTypeRepository $ticketTypeRepository,
  53.         RoleRepository $roleRepository,
  54.         UtilsService $utilsService,
  55.         TicketService $ticketService,
  56.         EntityManagerInterface $entityManager,
  57.         CustomFieldsRepository $customFieldsRepository
  58.     ) {
  59.         $this->translator $translator;
  60.         $this->tokenStorage $tokenStorage;
  61.         $this->authorizationChecker $checker;
  62.         $this->vendorService $vendorService;
  63.         $this->ticketStateRepository $ticketStateRepository;
  64.         $this->ticketTypeRepository $ticketTypeRepository;
  65.         $this->roleRepository $roleRepository;
  66.         $this->utilsService $utilsService;
  67.         $this->entityManager $entityManager;
  68.         $this->ticketService $ticketService;
  69.         $this->customFieldRepository $customFieldsRepository;
  70.     }
  71.     /**
  72.      * @param ViewEvent $event
  73.      * @throws AccessDeniedException
  74.      * @throws NotFoundException
  75.      * @throws \Exception
  76.      */
  77.     public function onKernelView(ViewEvent $event)
  78.     {
  79.         if ($this->utilsService->isAPublicRequest($event)) {
  80.             return;
  81.         }
  82.         $ticket $event->getControllerResult();
  83.         $request $event->getRequest();
  84.         $method $request->getMethod();
  85.         $userCurrent $this->tokenStorage->getToken()->getUser();
  86.         $vendorStaff $userCurrent $userCurrent->getVendorStaff()[0] : null;
  87.         $vendor is_null($vendorStaff) ? null $vendorStaff->getVendor();
  88.         if (!($ticket instanceof Ticket) || !($userCurrent instanceof User) || !($vendor instanceof Vendor) ||
  89.             (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method && Request::METHOD_DELETE !== $method)
  90.         )
  91.             return;
  92.         if(!($userCurrent instanceof User))
  93.             throw new NotFoundException($this->translator->trans('User current not found'));
  94.         $authorization false;
  95.         $controlAccess = [Role::ROLE_ADMINRole::ROLE_TASKMASTER];
  96.         $this->ticketTypeRequest $this->ticketTypeRepository->findOneBy(['name' => 'request']);
  97.         $this->ticketTypeIncidence $this->ticketTypeRepository->findOneBy(['name' => 'incidence']);
  98.         $this->ticketTypeWorkOrder $this->ticketTypeRepository->findOneBy(['name' => 'work_order']);
  99.         $ticketTypeScheduledTask $this->ticketTypeRepository->findOneBy(['name' => 'scheduled_task']);
  100.         $content $request->getContent();
  101.         $params json_decode($contenttrue);
  102.         if(Request::METHOD_POST === $method) {
  103.             if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  104.             {
  105.                 $ticket $this->addFieldsInCreate($ticket);
  106.                 $event->setControllerResult($ticket);
  107.                 return;
  108.             }
  109.             if ($ticket->getType() === $this->ticketTypeRequest or
  110.                 $ticket->getType() === $this->ticketTypeIncidence
  111.             ){
  112.                 $controlAccess = [Role::ROLE_ALL];
  113.                 $vendorStaff $this->vendorService->getVendorStaff(null$userCurrent$ticket->getVendor());
  114.                 if ($vendorStaff === null) {
  115.                     throw new AccessDeniedException(
  116.                         $this->translator->trans('Access denied. it does not belong to the vendor'),
  117.                         ['%vendor%' => $ticket->getVendor()->getName()]
  118.                     );
  119.                 }
  120.             }
  121.             if ($this->vendorService->isUserRoleInToVendor($ticket->getVendor(), $userCurrent$controlAccess)) {
  122.                 $authorization true;
  123.             }
  124.             if ($authorization) {
  125.                 $ticket $this->addFieldsInCreate($ticket);
  126.                 $ticket $this->setTimezoneDate($ticket);
  127.                 if ($ticket->getType() === $ticketTypeScheduledTask) {
  128.                     $this->ticketService->setNextReminderDate($ticket);
  129.                     $ticket $this->setFormatRepeat($ticketRequest::METHOD_POST);
  130.                 }
  131.                 //$ticket = $this->setNullObjectEmpty($ticket, $params);
  132.                 $event->setControllerResult($ticket);
  133.             }
  134.         }
  135.         if(Request::METHOD_PUT === $method) {
  136.             if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  137.                 return;
  138.             if ($this->vendorService->isUserRoleInToVendor($ticket->getVendor(), $userCurrent$controlAccess))
  139.                 $authorization true;
  140.             if (!$authorization && $ticket->getCreatedBy() === $userCurrent) {
  141.                 $authorization true;
  142.                 if ($ticket->getType() === $this->ticketTypeRequest or
  143.                     $ticket->getType() === $this->ticketTypeIncidence
  144.                 ) {
  145.                     $this->actionDeniedByState($ticketTicketState::STATE_ON_HOLD);
  146.                 }
  147.             }
  148.             if ($authorization) {
  149.                 $ticket $this->setTimezoneDate($ticket);
  150.                 //Depuramos los custom fields values según el template
  151.                 $customFields $this->customFieldRepository->findByVendorAndEntity($vendorEntity::Ticket);
  152.                 $customFieldIds = [];
  153.                 foreach ($customFields as $customField){
  154.                     foreach ($customField["properties"] as $properties){
  155.                         $customFieldIds[]=$properties["createdAt"];
  156.                     }
  157.                 }
  158.                 $customFieldValues =[];
  159.                 foreach ($params["customFieldValues"] as $customFieldValue){
  160.                     if(in_array($customFieldValue["propertyId"], $customFieldIds)){
  161.                         $customFieldValues[] = (object)$customFieldValue;
  162.                     }
  163.                 }
  164.                $ticket->setCustomFieldValues($customFieldValues);
  165.                 if ($ticket->getType() === $ticketTypeScheduledTask) {
  166.                     //ACtualizamos el NextReminderDate
  167.                     $this->ticketService->setNextReminderDate($ticket);
  168.                     $ticket $this->setFormatRepeat($ticketRequest::METHOD_PUT);
  169.                 }
  170.                 //$ticket = $this->setNullObjectEmpty($ticket, $params);
  171.                 $event->setControllerResult($ticket);
  172.             }
  173.         }
  174.         if(Request::METHOD_DELETE === $method) {
  175.             if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  176.                 return;
  177.             if ($this->vendorService->isUserRoleInToVendor($ticket->getVendor(), $userCurrent$controlAccess))
  178.                 $authorization true;
  179.             if (!$authorization && $ticket->getCreatedBy() === $userCurrent) {
  180.                 $authorization true;
  181.                 if ($ticket->getType() === $this->ticketTypeRequest or
  182.                     $ticket->getType() === $this->ticketTypeIncidence
  183.                 ) {
  184.                     $this->actionDeniedByState($ticketTicketState::STATE_ON_HOLD);
  185.                 }
  186.                 if ($ticket->getType() === $this->ticketTypeWorkOrder) {
  187.                     $this->actionDeniedByState($ticketTicketState::STATE_IN_PROCESS);
  188.                 }
  189.             }
  190.         }
  191.         if (!$authorization) {
  192.             $controlAccessTranslator = [];
  193.             foreach ($controlAccess as $roleName) {
  194.                 $controlAccessTranslator[] = $this->translator->trans($roleName);
  195.             }
  196.             throw new AccessDeniedException(
  197.                 $this->translator->trans('access_allowed_only_for') . (implode(', '$controlAccessTranslator))
  198.             );
  199.         }
  200.         return;
  201.     }
  202.     /**
  203.      * @param Ticket $ticket
  204.      * @param $state
  205.      * @throws AccessDeniedException
  206.      */
  207.     protected function actionDeniedByState(Ticket $ticket$state)
  208.     {
  209.         $state $this->ticketStateRepository->findOneBy(['name' => $state]);
  210.         if ($ticket->getState() !== $state) {
  211.             $message $this->translator->trans(
  212.                 'ticket.action.denied.by_state',
  213.                 [
  214.                     '%type%' => $this->translator->trans('ticket.type.'.$ticket->getType()->getName()),
  215.                     '%state%' => $this->translator->trans('ticket.state.'.$ticket->getState()->getName())
  216.                 ]
  217.             );
  218.             throw new AccessDeniedException($message);
  219.         }
  220.     }
  221.     /**
  222.      * @param Ticket $ticket
  223.      * @return Ticket
  224.      * @throws AccessDeniedException
  225.      */
  226.     protected function addFieldsInCreate(Ticket &$ticket)
  227.     {
  228.         $state null;
  229.         $stateName null;
  230.         if ($ticket->getType()->getStage() == Ticket::STAGE_REQUEST) {
  231.             $stateName TicketState::STATE_ON_HOLD;
  232.             $state $this->ticketStateRepository->findOneBy(['name' => TicketState::STATE_ON_HOLD]);
  233.         }
  234.         if ($ticket->getType()->getStage() == Ticket::STAGE_WORK_ORDER) {
  235.             $stateName TicketState::STATE_IN_PROCESS;
  236.             $state $this->ticketStateRepository->findOneBy(['name' => TicketState::STATE_IN_PROCESS]);
  237.         }
  238.         if (!$state instanceof TicketState) {
  239.             throw new AccessDeniedException($this->translator->trans('entity not found', [
  240.                 '%entity%' => $this->translator->trans('state'),
  241.                 '%entityId%' => $stateName
  242.             ]));
  243.         }
  244.         $ticket->setState($state);
  245.         $chat = new Chat();
  246.         $chat->setType(Chat::TYPE_TICKET);
  247.         $this->entityManager->persist($chat);
  248.         $ticket->setChat($chat);
  249.         /*
  250.                         $userCurrent = $this->tokenStorage->getToken()->getUser();
  251.                         if ($ticket->getType() === $this->ticketTypeRequest or
  252.                             $ticket->getType() === $this->ticketTypeIncidence
  253.                         ) {
  254.                             if ($userCurrent instanceof User) {
  255.                                 if ($this->vendorService->isUserRoleInToVendor(
  256.                                     $ticket->getVendor(),
  257.                                     $userCurrent,
  258.                                     [Role::ROLE_USER]
  259.                                 )) {
  260.                                     $incidence = $this->ticketTypeRepository->findOneBy(['name' => 'incidence']);
  261.                                     if ($incidence instanceof TicketType) {
  262.                                         $ticket->setType($incidence);
  263.                                     }
  264.                                 }
  265.                                 TODO: CUSTOMER
  266.                                 if ($this->vendorService->isUserRoleInToVendor(
  267.                                     $ticket->getVendor(),
  268.                                     $userCurrent,
  269.                                     [Role::ROLE_CUSTOMER]
  270.                                 )) {
  271.                                     $vendorStaff = $this->vendorService->findOrCreateVendorStaff($ticket->getVendor(), $userCurrent, false);
  272.                                     if ($vendorStaff->getCompany()) {
  273.                                         $ticket->setCompany($vendorStaff->getCompany());
  274.                                     }
  275.                     } else {
  276.                         throw new NotFoundException($this->translator->trans('entity_not_found', ['entity' => 'user']));
  277.                     }
  278.                 }
  279.                 */
  280.         return $ticket;
  281.     }
  282.     /**
  283.      * @param Ticket $ticket
  284.      * @param string $method
  285.      * @return Ticket
  286.      * @throws \Exception
  287.      */
  288.     protected function setFormatRepeat(Ticket &$ticketstring $method)
  289.     {
  290.         if($ticket->getRepeat()) {
  291.             if($ticket->getFrequency() === 'daily'){
  292.                 $ticket->setFrequencyWeek(null);
  293.                 $ticket->setFrequencyDayMonth(null);
  294.             }else
  295.             if ($ticket->getFrequency() === 'week') {
  296.                 $ticket->setFrequencyDayMonth(null);
  297.             }else
  298.             if ($ticket->getFrequency() === 'month') {
  299.                 $dayOfMonth null;
  300.                 if ($ticket->getReminderDate()) {
  301.                     $dayOfMonth $ticket->getReminderDate()->format('j');
  302.                     if (in_array($dayOfMonth, [293031])) {
  303.                         $dayOfMonth 0;
  304.                     }
  305.                 }
  306.                 $ticket->setFrequencyDayMonth($dayOfMonth);
  307.                 $ticket->setFrequencyWeek(null);
  308.             }else
  309.             if ($ticket->getFrequency() === 'year') {
  310.                 $ticket->setFrequencyWeek(null);
  311.                 $ticket->setFrequencyDayMonth(null);
  312.             }
  313.         } else {
  314.             $ticket->setFrequencyWeek(null);
  315.             $ticket->setFrequencyDayMonth(null);
  316.             $ticket->setFrequencyOffset(1);
  317.             $ticket->setFrequency("daily");
  318.         }
  319.         return $ticket;
  320.     }
  321.     /**
  322.      * @param Ticket $ticket
  323.      * @return Ticket
  324.      * @throws \Exception
  325.      */
  326.     protected function setTimezoneDate(Ticket &$ticket)
  327.     {
  328.         if ($ticket->getDateExpiration() && !is_null($ticket->getDateExpiration())) {
  329.             $date = new \DateTime();
  330.             $date->setTimestamp($ticket->getDateExpiration()->getTimestamp());
  331.             $date->setTimezone(new \DateTimeZone('UTC'));
  332.             $ticket->setDateExpiration($date);
  333.         }
  334.         if ($ticket->getReminderDate() && !is_null($ticket->getReminderDate())) {
  335.             $date = new \DateTime();
  336.             $date->setTimestamp($ticket->getReminderDate()->getTimestamp());
  337.             $date->setTimezone(new \DateTimeZone('UTC'));
  338.             $ticket->setReminderDate($date);
  339.             //throw new \Exception('fecha elegida en UTC '.$ticket->getReminderDate()->format('Y-m-d H:i:s') .'  Fecha del servidor en UTC '. date('Y-m-d H:i:s'));
  340.         }
  341.         if ($ticket->getReminderHour() && !is_null($ticket->getReminderHour())) {
  342.             $time = new \DateTime();
  343.             $time->setTimestamp($ticket->getReminderHour()->getTimestamp());
  344.             $time->setTimezone(new \DateTimeZone('UTC'));
  345.             $ticket->setReminderHour($time);
  346.         }
  347.         if ($ticket->getRepeatDateEnd() && !is_null($ticket->getRepeatDateEnd())) {
  348.             $date = new \DateTime();
  349.             $date->setTimestamp($ticket->getRepeatDateEnd()->getTimestamp());
  350.             $date->setTimezone(new \DateTimeZone('UTC'));
  351.             $ticket->setRepeatDateEnd($date);
  352.         }
  353.         return $ticket;
  354.     }
  355.     /**
  356.      * @param Ticket $ticket
  357.      * @param array $params
  358.      * @return Ticket
  359.      */
  360.     protected function setNullObjectEmpty(Ticket &$ticket, array $params)
  361.     {
  362.         if (empty($params['incidenceType'])) {
  363.             $ticket->setIncidenceType(null);
  364.         }
  365.         if (empty($params['location'])) {
  366.             $ticket->setLocation(null);
  367.         }
  368.         if (empty($params['category'])) {
  369.             $ticket->setCategory(null);
  370.         }
  371.         return $ticket;
  372.     }
  373.     public static function getSubscribedEvents()
  374.     {
  375.         return [
  376.             KernelEvents::VIEW => ['onKernelView'EventPriorities::PRE_WRITE]
  377.         ];
  378.     }
  379. }