src/EventSubscriber/Ticket/TicketPostWriteSubscriber.php line 71

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: MEDINA
  5.  * Date: 11/04/2019
  6.  * Time: 01:27 AM
  7.  */
  8. namespace App\EventSubscriber\Ticket;
  9. use App\Interfaces\CustomFieldServiceInterface;
  10. use App\Services\CustomField\EntityWithCustomFieldService;
  11. use Datetime;
  12. use DateTimeZone;
  13. use App\MessageHandler\ScheduledTask;
  14. use App\Services\LogService;
  15. use Doctrine\ORM\EntityManager;
  16. use Symfony\Component\Messenger\Stamp\DelayStamp;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use Symfony\Component\HttpKernel\Event\ViewEvent;
  20. use Symfony\Component\DependencyInjection\ContainerInterface;
  21. use Symfony\Component\Messenger\MessageBusInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpKernel\KernelEvents;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. use ApiPlatform\Core\EventListener\EventPriorities;
  26. use App\Repository\App\MediaObjectRepository;
  27. use App\MessageHandler\Message;
  28. use App\Services\UtilsService;
  29. use App\Entity\App\Ticket\Ticket;
  30. use App\Entity\Chat\Chat;
  31. class TicketPostWriteSubscriber implements EventSubscriberInterface
  32. {
  33.     protected $serviceContainer;
  34.     private $entityManager;
  35.     private $mediaObjectRepository;
  36.     private $utilsService;
  37.     private $messageBus;
  38.     private $translator;
  39.     private $logService;
  40.     private $customFieldService;
  41.     public function __construct(
  42.         MediaObjectRepository $mediaObjectRepository,
  43.         ContainerInterface $serviceContainer,
  44.         UtilsService $utilsService,
  45.         EntityManagerInterface $entityManager,
  46.         MessageBusInterface $messageBus,
  47.         TranslatorInterface $translator,
  48.         LogService $logService,
  49.         CustomFieldServiceInterface $customFieldService
  50.     ) {
  51.         $this->mediaObjectRepository $mediaObjectRepository;
  52.         $this->entityManager $entityManager;
  53.         $this->serviceContainer $serviceContainer;
  54.         $this->utilsService $utilsService;
  55.         $this->messageBus $messageBus;
  56.         $this->translator $translator;
  57.         $this->logService $logService;
  58.         $this->customFieldService $customFieldService;
  59.     }
  60.     /**
  61.      * @param ViewEvent $event
  62.      * @throws \Doctrine\Common\Persistence\Mapping\MappingException
  63.      * @throws \Doctrine\ORM\NonUniqueResultException
  64.      * @throws \Exception
  65.      */
  66.     public function onKernelView(ViewEvent $event)
  67.     {
  68.         $ticket $event->getControllerResult();
  69.         if(!($ticket instanceof Ticket)) return;
  70.         $request $event->getRequest();
  71.         $method $request->getMethod();
  72.         $entityWithCustomFieldService = new EntityWithCustomFieldService($ticket$this->customFieldService);
  73.         if($entityWithCustomFieldService->areCustomFieldsRequiredOnResponse($request)){
  74.             $entityWithCustomFieldService->loadAndSetCustomFields();
  75.         }
  76.         if (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method)
  77.             return;
  78.         $content $request->getContent();
  79.         $params json_decode($contenttrue);
  80.         if (!$this->entityManager->isOpen()) {
  81.             $this->entityManager EntityManager::create(
  82.                 $this->entityManager->getConnection(),
  83.                 $this->entityManager->getConfiguration()
  84.             );
  85.         }
  86.         if (isset($params['mediaContent']) && is_array($params['mediaContent'])) {
  87.             if(false == $this->entityManager->getConnection()->ping()){
  88.                 $this->entityManager->getConnection()->close();
  89.                 $this->entityManager->getConnection()->connect();
  90.             }
  91.             $getMediaObjects $this->mediaObjectRepository->findBy(['ticket' => $ticket->getId()]);
  92.             foreach ($getMediaObjects as $media) {
  93.                 if (!in_array($media->getId(), $params['mediaContent'])){
  94.                     $this->entityManager->remove($media);
  95.                 }
  96.             }
  97.             foreach ($params['mediaContent'] as $mediaId) {
  98.                 $mediaObject $this->mediaObjectRepository->find($mediaId);
  99.                 $mediaObject->setTicket($ticket);
  100.                 $this->entityManager->persist($mediaObject);
  101.             }
  102.             $this->entityManager->flush();
  103.         }
  104.         if (Request::METHOD_POST === $method) {
  105.             $identify $this->utilsService->generateIdentify($ticket);
  106.             $ticket->setIdentify($identify);
  107.             if(is_null($ticket->getPosition())) {
  108.                 $ticket->setPosition($ticket->getId() * -1);
  109.             }
  110.             $this->entityManager->persist($ticket);
  111.             /**
  112.              * Crea nueva tarea
  113.             if ($ticket->getType()->getStage() == Ticket::STAGE_WORK_ORDER) {
  114.                 $task = new Task();
  115.                 $task->setTicket($ticket);
  116.                 $task->setTitle($ticket->getTitle());
  117.                 $task->setDescription($ticket->getDescription());
  118.                 $task->setLocation($ticket->getLocation());
  119.                 $task->setCategory($ticket->getCategory());
  120.                 $task->setDateEnd($ticket->getDateExpiration());
  121.                 $task->setState(TaskStatusLog::STATUS_TASK_IN_PROCESS);
  122.                 $identify = $this->utilsService->generateIdentify($task);
  123.                 if ($identify > 1) {
  124.                     $identify++;
  125.                 }
  126.                 $task->setIdentify($identify);
  127.                 $chat = new Chat();
  128.                 $chat->setType(Chat::TYPE_TASK);
  129.                 $task->setChat($chat);
  130.                 $this->entityManager->persist($chat);
  131.                 $this->entityManager->persist($task);
  132.             } **/
  133.             $this->entityManager->flush();
  134.         }
  135.         if (!$ticket->getChat()) {
  136.             $chat = new Chat();
  137.             $chat->setType(Chat::TYPE_TICKET);
  138.             $this->entityManager->persist($chat);
  139.             $ticket->setChat($chat);
  140.             $this->entityManager->persist($ticket);
  141.             $this->entityManager->flush();
  142.         }
  143.         $data['ticket_id'] = $ticket->getId();
  144.         if (Request::METHOD_POST === $method && in_array($ticket->getType()->getName(), ['incidence''request'])) {
  145.             $this->messageBus->dispatch(new Message(Message::NEW_REQUEST$data));
  146.         }
  147.         if (Request::METHOD_POST === $method && $ticket->getType()->getName() === 'work_order') {
  148.             $this->messageBus->dispatch(new Message(Message::NEW_WORK_ORDER$data));
  149.         }
  150.         if (Request::METHOD_POST === $method && $ticket->getType()->getName() === 'scheduled_task') {
  151.             $today = (new DateTime('now'))->setTimezone(new DateTimeZone('UTC'));
  152.             if ($ticket->getReminderHour()) { //TODO: aun en proceso
  153.                 $isClone false;
  154.                 $dateStart $today;
  155.                 $timeEnd = (new DateTime('now +1 hour'))->setTimezone(new DateTimeZone('UTC'));
  156.                 $dayToday strtolower($dateStart->format('l'));
  157.                 $dayOfMonth $dateStart->format('j');
  158.                 if (in_array($dayOfMonth, [29,30,31])) {
  159.                     $dayOfMonth 0;
  160.                 }
  161.                 $dayOfYear $dateStart->format('m-d');
  162.                 $timeEnd $timeEnd->format('H').':00';
  163.                 if ($timeEnd === '00:00') {
  164.                     $timeEnd '24:00';
  165.                 }
  166.                 if (
  167.                     $ticket->getReminderHour()->format('H:i') > $dateStart->format('H:i') &&
  168.                     $ticket->getReminderHour()->format('H:i') < $timeEnd
  169.                 ) {
  170.                     if (is_null($ticket->getRepeat()) || !$ticket->getRepeat()) {
  171.                         if (
  172.                             $ticket->getReminderDate() &&
  173.                             $ticket->getReminderDate()->format('Y-m-d') === $dateStart->format('Y-m-d')
  174.                         ) {
  175.                             $isClone true;
  176.                         }
  177.                     } else {
  178.                         if ($ticket->getFrequency() === 'week' && in_array($dayToday$ticket->getFrequencyWeek())) {
  179.                             $isClone true;
  180.                             if ($ticket->getReminderDate() &&
  181.                                 $ticket->getReminderDate()->format('Y-m-d')  === $dateStart->format('Y-m-d'))
  182.                             {
  183.                                 $isClone false;
  184.                             }
  185.                         }
  186.                         if ($ticket->getFrequency() === 'month' && $ticket->getFrequencyDayMonth() === $dayOfMonth) {
  187.                             $isClone true;
  188.                         }
  189.                         if ($ticket->getFrequency() === 'year' && $ticket->getCreatedAt()->format('m-d') === $dayOfYear) {
  190.                             $isClone true;
  191.                         }
  192.                     }
  193.                 }
  194.                 if ($isClone) {
  195.                     $hour $ticket->getReminderHour()->format('H');
  196.                     $minutes $ticket->getReminderHour()->format('i');
  197.                     $datetime1 = new DateTime($today->format('Y-m-d H:i'));
  198.                     $datetime2 = new DateTime($today->setTime($hour$minutes0)->format('Y-m-d H:i'));
  199.                     $interval $datetime1->diff($datetime2);
  200.                     $seconds 0;
  201.                     if ($interval->0) {
  202.                         $seconds $interval->60 1000;
  203.                     }
  204.                     $this->messageBus->dispatch(new ScheduledTaskScheduledTask::TICKET_CLONE$data), [
  205.                         new DelayStamp($seconds)
  206.                     ]);
  207.                 }
  208.             }
  209.             elseif (is_null($ticket->getReminderHour()) &&
  210.                 $ticket->getReminderDate()->format('Y-m-d') === $today->format('Y-m-d')
  211.             ) {
  212.                 $dataClone['today'] = $today->format('Y-m-d');
  213.                 $dataClone['ticket_id'] = $ticket->getId();
  214.                 $dataClone['cloneToday'] = true;
  215.                 $isClone false;
  216.                 if (!$ticket->getRepeat() || is_null($ticket->getRepeat())) {
  217.                     $isClone true;
  218.                 } elseif ($ticket->getRepeat()) {
  219.                     if ($ticket->getFrequency() === 'week') {
  220.                         $dayToday strtolower($today->format('l'));
  221.                         if (in_array($dayToday$ticket->getFrequencyWeek())) {
  222.                             $isClone true;
  223.                         }
  224.                     }
  225.                     if ($ticket->getFrequency() === 'month') {
  226.                         $dayOfMonth = (integer)$today->format('j');
  227.                         if (in_array($dayOfMonth, [29,30,31])) {
  228.                             $dayOfMonth 0;
  229.                         }
  230.                         if ((integer)$ticket->getFrequencyDayMonth() === $dayOfMonth) {
  231.                             $isClone true;
  232.                         }
  233.                     }
  234.                     if ($ticket->getFrequency() === 'year') {
  235.                         if ($ticket->getReminderDate()->format('m-d') === $today->format('m-d')) {
  236.                             $isClone true;
  237.                         }
  238.                     }
  239.                 }
  240.                 if ($isClone) {
  241.                     $this->messageBus->dispatch(
  242.                         new ScheduledTask(ScheduledTask::TICKET_CLONE$dataClone)
  243.                     );
  244.                 }
  245.             }
  246.         }
  247.         //$this->entityManager->clear();
  248.     }
  249.     public static function getSubscribedEvents()
  250.     {
  251.         return [
  252.             KernelEvents::VIEW => ['onKernelView'EventPriorities::POST_WRITE]
  253.         ];
  254.     }
  255. }