src/EventSubscriber/Task/TaskPostWriteSubscriber.php line 133

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: SUSAN MEDINA
  5.  * Date: 21/03/2019
  6.  * Time: 11:53 AM
  7.  */
  8. namespace App\EventSubscriber\Task;
  9. use App\Interfaces\CustomFieldServiceInterface;
  10. use App\Services\CustomField\EntityWithCustomFieldService;
  11. use App\Services\TimeSlot\TimeSlotHistoryService;
  12. use DateTime;
  13. use DateTimeZone;
  14. use App\Entity\App\MediaObject;
  15. use App\Entity\App\Ticket\Ticket;
  16. use App\MessageHandler\LogMessage;
  17. use App\MessageHandler\Message;
  18. use App\Services\ChatService;
  19. use App\Services\VendorService;
  20. use Doctrine\ORM\EntityManager;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. use Symfony\Component\Messenger\MessageBusInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use Symfony\Component\DependencyInjection\ContainerInterface;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\HttpKernel\Event\ViewEvent;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpKernel\KernelEvents;
  29. use Doctrine\ORM\EntityManagerInterface;
  30. use ApiPlatform\Core\EventListener\EventPriorities;
  31. use App\Repository\App\MaintenanceElementRepository;
  32. use App\Repository\App\Task\WorkerBudgetRepository;
  33. use App\Repository\App\Task\TaskConceptRepository;
  34. use App\Repository\App\Task\TaskResourceRepository;
  35. use App\Repository\App\VendorStaffRepository;
  36. use App\Repository\App\MediaObjectRepository;
  37. use App\Repository\App\ScheduleRepository;
  38. use App\Repository\App\UserRepository;
  39. use App\Repository\App\RoleRepository;
  40. use App\Repository\App\ResourceRepository;
  41. use App\Entity\App\Task\TaskResource;
  42. use App\Entity\App\Task\Task;
  43. use App\Entity\App\Task\TaskStatusLog;
  44. use App\Entity\App\Task\WorkerBudget;
  45. use App\Entity\App\Role;
  46. use App\Entity\Chat\Chat;
  47. use App\Entity\App\User;
  48. use App\Entity\Chat\ChatMessage;
  49. use App\Exception\NotFoundException;
  50. use App\Services\LogService;
  51. use App\Services\UtilsService;
  52. class TaskPostWriteSubscriber implements EventSubscriberInterface
  53. {
  54.     protected $serviceContainer;
  55.     private $tokenStorage;
  56.     private $entityManager;
  57.     private $userRepository;
  58.     private $vendorStaffRepository;
  59.     private $roleRepository;
  60.     private $workerBudgetRepository;
  61.     private $mediaObjectRepository;
  62.     private $scheduleRepository;
  63.     private $conceptRepository;
  64.     private $taskResourceRepository;
  65.     private $resourceRepository;
  66.     private $maintenanceRepository;
  67.     private $chatService;
  68.     private $utilsService;
  69.     private $logService;
  70.     private $vendorService;
  71.     private $messageBus;
  72.     private $translator;
  73.     private $timeSlotHistoryService;
  74.     private $customFieldService;
  75.     public function __construct(
  76.         ContainerInterface $serviceContainer,
  77.         TokenStorageInterface $tokenStorage,
  78.         UserRepository $userRepository,
  79.         VendorStaffRepository $vendorStaffRepository,
  80.         RoleRepository $roleRepository,
  81.         WorkerBudgetRepository $workerBudgetRepository,
  82.         MediaObjectRepository $mediaObjectRepository,
  83.         ScheduleRepository $scheduleRepository,
  84.         TaskConceptRepository $conceptRepository,
  85.         TaskResourceRepository $taskResourceRepository,
  86.         ResourceRepository $resourceRepository,
  87.         MaintenanceElementRepository $maintenanceRepository,
  88.         ChatService $chatService,
  89.         EntityManagerInterface $entityManager,
  90.         UtilsService $utilsService,
  91.         LogService $logService,
  92.         VendorService $vendorService,
  93.         MessageBusInterface $messageBus,
  94.         TranslatorInterface $translator,
  95.         TimeSlotHistoryService $timeSlotHistoryService,
  96.         CustomFieldServiceInterface $customFieldService
  97.     ) {
  98.         $this->serviceContainer $serviceContainer;
  99.         $this->tokenStorage $tokenStorage;
  100.         $this->userRepository $userRepository;
  101.         $this->vendorStaffRepository $vendorStaffRepository;
  102.         $this->roleRepository $roleRepository;
  103.         $this->workerBudgetRepository $workerBudgetRepository;
  104.         $this->entityManager $entityManager;
  105.         $this->mediaObjectRepository $mediaObjectRepository;
  106.         $this->scheduleRepository $scheduleRepository;
  107.         $this->conceptRepository $conceptRepository;
  108.         $this->taskResourceRepository $taskResourceRepository;
  109.         $this->resourceRepository $resourceRepository;
  110.         $this->maintenanceRepository $maintenanceRepository;
  111.         $this->chatService $chatService;
  112.         $this->utilsService $utilsService;
  113.         $this->logService $logService;
  114.         $this->vendorService $vendorService;
  115.         $this->messageBus $messageBus;
  116.         $this->translator $translator;
  117.         $this->timeSlotHistoryService $timeSlotHistoryService;
  118.         $this->customFieldService $customFieldService;
  119.     }
  120.     /**
  121.      * @param ViewEvent $event
  122.      * @throws NotFoundException
  123.      * @throws \Doctrine\Common\Persistence\Mapping\MappingException
  124.      * @throws \Doctrine\ORM\NonUniqueResultException
  125.      * @throws \Doctrine\ORM\ORMException
  126.      * @throws \Doctrine\ORM\OptimisticLockException
  127.      */
  128.     public function onKernelView(ViewEvent $event)
  129.     {
  130.         if ($this->utilsService->isAPublicRequest($event)) {
  131.             return;
  132.         }
  133.         $task $event->getControllerResult();
  134.         if(!($task instanceof Task)) return;
  135.         $request $event->getRequest();
  136.         $method $request->getMethod();
  137.         $entityWithCustomFieldService = new EntityWithCustomFieldService($task$this->customFieldService);
  138.         if($entityWithCustomFieldService->areCustomFieldsRequiredOnResponse($request)){
  139.             $entityWithCustomFieldService->loadAndSetCustomFields();
  140.         }
  141.         if (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method)
  142.             return;
  143.         $userCurrent $this->tokenStorage->getToken()->getUser();
  144.         if(!$userCurrent instanceof User)
  145.             throw new NotFoundException($this->translator->trans('User current not found'));
  146.         if (Request::METHOD_POST == $method) {
  147.             $state TaskStatusLog::STATUS_TASK_IN_PROCESS;
  148.             $task->setState($state);
  149.             $identify $this->utilsService->generateIdentify($task);
  150.             $task->setIdentify($identify);
  151.             $this->entityManager->persist($task);
  152.         }
  153.         $content $request->getContent();
  154.         $params json_decode($contenttrue);
  155.         $authorizationManager false;
  156.         $authorizationOperator false;
  157.         $vendor $task->getTicket()->getVendor();
  158.         if ($this->vendorService->isUserRoleInToVendor($vendor$userCurrent, [Role::ROLE_ADMINRole::ROLE_TASKMASTER])) {
  159.             $authorizationManager true;
  160.             $authorizationOperator true;
  161.         }
  162.         if (Request::METHOD_PUT === $method && !$authorizationManager) {
  163.             $role[] = $this->roleRepository->findOneBy(['name' => Role::ROLE_OPERATOR]);
  164.             //operator authorization to edit the task if it belongs to this
  165.             if ($this->workerBudgetRepository->findGroupByRoles($role$task$userCurrent->getId())) {
  166.                 $authorizationOperator true;
  167.             }
  168.         }
  169.         if ($authorizationManager) {
  170.             //WORKERBUDGET
  171.             if (isset($params['workerBudgets']) && is_array($params['workerBudgets'])) {
  172.                 $getWorkerBudgets $this->workerBudgetRepository->findBy(['task' => $task->getId(), "deletedAt" => null]);
  173.                 $workerBudgetArray = [];
  174.                 foreach ($params['workerBudgets'] as &$wb) {
  175.                     if (isset($wb['role']) && isset($wb['vendorStaff'])) {
  176.                         $workerBudgetArray[] = [
  177.                             'role' => $wb['role'],
  178.                             'vendorStaff' => $wb['vendorStaff']
  179.                         ];
  180.                         if (isset($wb['user'])) {
  181.                             unset($wb['user']);
  182.                         }
  183.                     }
  184.                 }
  185.                 foreach ($getWorkerBudgets as $workerBudget) {
  186.                     $workerBudgetFormat = [
  187.                         'role' => $workerBudget->getRole()->getId(),
  188.                         'vendorStaff' => $workerBudget->getVendorStaff()->getId()
  189.                     ];
  190.                     if (!in_array($workerBudgetFormat$workerBudgetArray)) {
  191.                         $userName '-';
  192.                         $userWorkerBudget $workerBudget->getVendorStaff()->getUser() ?? null;
  193.                         if ($userWorkerBudget instanceof User) {
  194.                             $userName $userWorkerBudget->getFullName();
  195.                         }
  196.                         //ToDo Refactizar para quitar el identifier de cementerios
  197.                         $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  198.                         $body = array(
  199.                             'message' => 'task.messages.delete_worker_budget',
  200.                             'parameters' => array(
  201.                                 '%userName%' => $userName,
  202.                                 '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify(),
  203.                                 '%title%' => ''
  204.                             ),
  205.                             'parametersTrans' => array(
  206.                                 '%roleTitle%' => 'role.list.title.'.$workerBudget->getRole()->getName()
  207.                             )
  208.                         );
  209.                         $this->sendNewMessage($task->getChat(), $body);
  210.                         if ($task->getTicket() instanceof Ticket &&
  211.                             $task->getTicket()->getChat() instanceof Chat
  212.                         ) {
  213.                             $this->sendNewMessage($task->getTicket()->getChat(), $body);
  214.                         }
  215.                         $this->entityManager->remove($workerBudget);
  216.                         $dataWorkerBudget = [];
  217.                         if ($userWorkerBudget && in_array($userWorkerBudget->getNotificationWorkerAssignedTask(), [1,2,3])) {
  218.                             $dataWorkerBudget['user_id'] = $userWorkerBudget->getId();
  219.                             $dataWorkerBudget['task_id'] = $task->getId();
  220.                             $message_body $body;
  221.                             $message_body['parameters']['%title%'] = $task->getTitle();
  222.                             $message_body['author'] = $userCurrent->getFullName();
  223.                             $dataWorkerBudget['message_body'] = json_encode($message_body);
  224.                             if ($userCurrent !== $userWorkerBudget) {
  225.                                 $this->messageBus->dispatch(
  226.                                     new Message(Message::WORKER_REMOVED_TASK$dataWorkerBudget)
  227.                                 );
  228.                             }
  229.                         }
  230.                     }
  231.                 }
  232.                 foreach ($params['workerBudgets'] as $workerBudgetRequest) {
  233.                     if (isset($workerBudgetRequest['role']) && isset($workerBudgetRequest['vendorStaff'])) {
  234.                         $role $this->roleRepository->find($workerBudgetRequest['role']);
  235.                         $vendorStaff $this->vendorStaffRepository->find($workerBudgetRequest['vendorStaff']);
  236.                         $workerBudget $this->workerBudgetRepository->findOneBy(
  237.                             [
  238.                                 'vendorStaff' => $vendorStaff,
  239.                                 'role' => $role,
  240.                                 'task' => $task
  241.                             ]
  242.                         );
  243.                         if ($workerBudget && !$workerBudget->isDeleted()) {
  244.                             $workerBudget->setEstimatedHours($workerBudgetRequest['estimatedHours']);
  245.                             if (isset($workerBudgetRequest['estimatedHours']) &&
  246.                                 is_numeric($workerBudgetRequest['estimatedHours'])
  247.                             ) {
  248.                                 $workerBudget->setEstimatedHours($workerBudgetRequest['estimatedHours']);
  249.                             }
  250.                             if (isset($workerBudgetRequest['realHours']) && $role->getName() === Role::ROLE_TASKMASTER) {
  251.                                 $workerBudget->setRealHours($workerBudgetRequest['realHours']);
  252.                             }
  253.                             if(!is_null($workerBudget->getDeletedAt())){
  254.                                 $workerBudget->setDeletedAt(null);
  255.                             }
  256.                         } else {
  257.                             //Creamos un workerBudget
  258.                             if(!is_null($workerBudget) && $workerBudget->isDeleted()){
  259.                                 $workerBudget->setDeletedAt(null);
  260.                             }else{
  261.                                 $workerBudget = new WorkerBudget();
  262.                                 $workerBudget->setTask($task);
  263.                                 $workerBudget->setRole($role);
  264.                                 $workerBudget->setVendorStaff($vendorStaff);
  265.                                 $workerBudget->setCostHour($vendorStaff->getCostPerHour());
  266.                             }
  267.                             if (isset($workerBudgetRequest['estimatedHours']) &&
  268.                                 is_numeric($workerBudgetRequest['estimatedHours'])
  269.                             ) {
  270.                                 $workerBudget->setEstimatedHours($workerBudgetRequest['estimatedHours']);
  271.                             } else {
  272.                                 $workerBudget->setEstimatedHours(0);
  273.                             }
  274.                             if (isset($workerBudgetRequest['realHours']) && $role->getName(
  275.                                 ) === Role::ROLE_TASKMASTER) {
  276.                                 $workerBudget->setRealHours($workerBudgetRequest['realHours']);
  277.                             }
  278.                             //state init of task by operator
  279.                             $this->entityManager->persist($workerBudget);
  280.                             //Creamos el estado inicial de la tarea esperando por ti
  281.                             $status = new TaskStatusLog();
  282.                             $status->setState(TaskStatusLog::STATUS_TASK_IN_PROCESS);
  283.                             $status->setWorkerBudget($workerBudget);
  284.                             $status->setDate(new DateTime('now'));
  285.                             $this->entityManager->persist($status);
  286.                             //Creamos la franja horaria para este workerBudget
  287.                             //Obtenemos la franja horaria del user
  288.                             $timeSlotUser $vendorStaff->getUser()->getTimeSlot();
  289.                             //Creamos el histórico de la franja horaria
  290.                             if (!is_null($timeSlotUser)) {
  291.                                 $defaultCost $timeSlotUser->getDefaultCost();
  292.                                 $extraHourPrice $timeSlotUser->getExtraHourlyPrice();
  293.                                 if (count($timeSlotUser->getTimeSlotItems()) > 0) {
  294.                                     foreach ($timeSlotUser->getTimeSlotItems() as $timeSlot) {
  295.                                         $timeSlotHistory $this->timeSlotHistoryService->createTimeSlotHistory($workerBudget,$timeSlot,$defaultCost,$extraHourPrice);
  296.                                         $this->entityManager->persist($timeSlotHistory);
  297.                                     }
  298.                                 } else {
  299.                                     $timeSlotHistory $this->timeSlotHistoryService->createTimeSlotHistory($workerBudget,null,$defaultCost,$extraHourPrice);
  300.                                     $this->entityManager->persist($timeSlotHistory);
  301.                                 }
  302.                             }
  303.                         }
  304.                     }
  305.                 }
  306.             }
  307.             $mediaContent = [];
  308.             if (isset($params['mediaContent']) && is_array($params['mediaContent'])) {
  309.                 foreach ($params['mediaContent'] as $mediaId) {
  310.                     $mediaObject $this->mediaObjectRepository->find($mediaId);
  311.                     if ($mediaObject instanceof MediaObject && $mediaObject->getType() === MediaObject::TYPE_TASK) {
  312.                         $mediaContent[] = $mediaId;
  313.                     }
  314.                 }
  315.             }
  316.             if (isset($params['mediaContent']) && is_array($mediaContent)) {
  317.                 $getMediaObjects $this->mediaObjectRepository->findBy(['task' => $task->getId()]);
  318.                 foreach ($getMediaObjects as $media) {
  319.                     if (!in_array($media->getId(), $mediaContent)) {
  320.                         $this->entityManager->remove($media);
  321.                     }
  322.                 }
  323.                 foreach ($mediaContent as $mediaId) {
  324.                     $mediaObject $this->mediaObjectRepository->find($mediaId);
  325.                     if ($mediaObject instanceof MediaObject && $mediaObject->getType() === MediaObject::TYPE_TASK) {
  326.                         $mediaObject->setTask($task);
  327.                         $this->entityManager->persist($mediaObject);
  328.                     }
  329.                 }
  330.             }
  331.         }
  332.         if ($authorizationOperator && isset($params['resources']) && is_array($params['resources'])) {
  333.             if (Request::METHOD_PUT === $method) {
  334.                 $getTaskResources $this->taskResourceRepository->findByTask($task);
  335.             } else {
  336.                 $getTaskResources = [];
  337.             }
  338.             // Se comprueba si está eliminado estoy añadiendo 1 recurso
  339.             foreach ($getTaskResources as $taskResource) {
  340.                 if (!$taskResource->isDeleted()) {
  341.                     $search array_search(
  342.                         $taskResource->getResource()->getId(),
  343.                         array_column($params['resources'], 'id')
  344.                     );
  345.                     if (!is_integer($search) && !$search) {
  346.                         //ToDo Refactizar para quitar el identifier de cementerios
  347.                         $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  348.                         $body = array(
  349.                             'message' => 'task.messages.delete_resource',
  350.                             'parameters' => array(
  351.                                 '%resourceName%' => $taskResource->getResource()->getName(),
  352.                                 '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify()
  353.                             ),
  354.                             'parametersTrans' => array()
  355.                         );
  356.                         $this->sendNewMessage($task->getChat(), $body);
  357.                         if ($task->getTicket() instanceof Ticket &&
  358.                             $task->getTicket()->getChat() instanceof Chat
  359.                         ) {
  360.                             $this->sendNewMessage($task->getTicket()->getChat(), $body);
  361.                         }
  362.                         $taskResource->setTask(null);
  363.                         $this->entityManager->remove($taskResource);
  364.                     }
  365.                 }
  366.             }
  367.             // Recorremos todos los recursos y los coincidentes los sobrescribimos y los nuevos se añaden
  368.             // esto actualiza el array cuando se modifican varios y se actualizan todos a la vez
  369.             foreach ($params['resources'] as $resource) {
  370.                 if (isset($resource['id']) && is_integer($resource['id'])) {
  371.                     $getResource $this->resourceRepository->find($resource['id']);
  372.                     if (!$getResource->isDeleted()) {
  373.                         $newTaskResource $this->taskResourceRepository->findOneByTaskAndResource($task$getResource);
  374.                         if (!$newTaskResource) {
  375.                             $newTaskResource = new TaskResource();
  376.                             $newTaskResource->setTask($task);
  377.                             $newTaskResource->setResource($getResource);
  378.                             $newTaskResource->setUseValue((float)$getResource->getUseValue());
  379.                         }
  380.                         $newTaskResource->setQuantity($resource['quantity']);
  381.                         $this->entityManager->persist($newTaskResource);
  382.                     }
  383.                 }
  384.             }
  385.         }
  386.         if (!$task->getChat()) {
  387.             $chat = new Chat();
  388.             $chat->setType(Chat::TYPE_TASK);
  389.             $this->entityManager->persist($chat);
  390.             $task->setChat($chat);
  391.             $this->entityManager->persist($task);
  392.         }
  393.         $this->entityManager->flush();
  394.         if (isset($task->oldMaintenanceElements)) {
  395.             foreach ($task->oldMaintenanceElements as $maintenanceElement) {
  396.                 if (isset($maintenanceElement['id'])) {
  397.                     $maintenanceElement $this->maintenanceRepository->find($maintenanceElement['id']);
  398.                     $search array_search($maintenanceElement$task->getMaintenanceElements()->toArray());
  399.                     if (!is_integer($search) && !$search) {
  400.                         $this->registerLog('remove'$maintenanceElement, ['task.maintenanceElement.delete' => $task->getId()]);
  401.                         //ToDo Refactizar para quitar el identifier de cementerios
  402.                         $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  403.                         $body = array(
  404.                             'message' => 'task.messages.delete_maintenance_element',
  405.                             'parameters' => array(
  406.                                 '%maintenanceElement%' => $maintenanceElement->getName(),
  407.                                 '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify()
  408.                             ),
  409.                             'parametersTrans' => array()
  410.                         );
  411.                         $this->sendNewMessage($task->getChat(), $body);
  412.                         if ($task->getTicket() instanceof Ticket &&
  413.                             $task->getTicket()->getChat() instanceof Chat
  414.                         ) {
  415.                             $this->sendNewMessage($task->getTicket()->getChat(), $body);
  416.                         }
  417.                     }
  418.                 }
  419.             }
  420.         }
  421.         foreach ($task->getMaintenanceElements() as $maintenanceElement) {
  422.             $search array_search(['id' => $maintenanceElement->getId()], $task->oldMaintenanceElements);
  423.             if (!is_integer($search) && !$search) {
  424.                 $this->registerLog('create'$maintenanceElement, ['task.maintenanceElement.create' => $task->getId()]);
  425.                 //ToDo Refactizar para quitar el identifier de cementerios
  426.                 $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  427.                 $body = array(
  428.                     'message' => 'task.messages.new_maintenance_element',
  429.                     'parameters' => array(
  430.                         '%maintenanceElement%' => $maintenanceElement->getName(),
  431.                         '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify()
  432.                     ),
  433.                     'parametersTrans' => array()
  434.                 );
  435.                 $this->sendNewMessage($task->getChat(), $body);
  436.                 if ($task->getTicket() instanceof Ticket &&
  437.                     $task->getTicket()->getChat() instanceof Chat
  438.                 ) {
  439.                     $this->sendNewMessage($task->getTicket()->getChat(), $body);
  440.                 }
  441.             }
  442.         }
  443.         if (isset($task->oldConcepts)) {
  444.             foreach ($task->oldConcepts as $concept) {
  445.                 if (isset($concept['id'])) {
  446.                     $conceptCost $this->conceptRepository->find($concept['id']);
  447.                     $search array_search($conceptCost$task->getConcepts()->toArray());
  448.                     if ($search === false) {
  449.                         //ToDo Refactizar para quitar el identifier de cementerios
  450.                         $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  451.                         $body = array(
  452.                             'message' => 'task.messages.delete_concept',
  453.                             'parameters' => array(
  454.                                 '%conceptName%' => $conceptCost->getName(),
  455.                                 '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify()
  456.                             ),
  457.                             'parametersTrans' => array()
  458.                         );
  459.                         $this->sendNewMessage($task->getChat(), $body);
  460.                         if ($task->getTicket() instanceof Ticket &&
  461.                             $task->getTicket()->getChat() instanceof Chat
  462.                         ) {
  463.                             $this->sendNewMessage($task->getTicket()->getChat(), $body);
  464.                         }
  465.                         //$this->entityManager->remove($concept);
  466.                     }
  467.                 }
  468.             }
  469.         }
  470.         if ($task->changeDateStart || $task->changeDateEnd) {
  471.             $data = ['dateStart' => $task->getDateStart(), 'dateEnd' => $task->getDateEnd()];
  472.             $this->registerLog('update'$task$data);
  473.             $vendorTimezone $task->getTicket()->getVendor()->getTimezone();
  474.             if (empty($vendorTimezone)) {$vendorTimezone 'UTC';}
  475.             $dateStart '-';
  476.             $dateEnd '-';
  477.             if (!is_null($task->getDateStart())) {
  478.                 $dateStart $task->getDateStart()
  479.                     ->setTimezone(new DateTimeZone($vendorTimezone))->format('d-m-Y');
  480.             }
  481.             if (!is_null($task->getDateEnd())) {
  482.                 $dateEnd $task->getDateEnd()
  483.                     ->setTimezone(new DateTimeZone($vendorTimezone))->format('d-m-Y');
  484.             }
  485.             //ToDo Refactizar para quitar el identifier de cementerios
  486.             $ticketIdentify $task->getTicket()->getType()->getStage() !== 'cemetery' $task->getTicket()->getIdentify() : $task->getTicket()->getTitle();
  487.             $body = array(
  488.                 'message' => 'task.messages.change_range_date',
  489.                 'parameters' => array(
  490.                     '%dateStart%' => $dateStart,
  491.                     '%dateEnd%' => $dateEnd,
  492.                     '%taskIdentify%' => $ticketIdentify.'-'.$task->getIdentify()
  493.                 ),
  494.                 'parametersTrans' => array()
  495.             );
  496.             $this->sendNewMessage($task->getChat(), $body);
  497.             if ($task->getTicket() instanceof Ticket &&
  498.                 $task->getTicket()->getChat() instanceof Chat
  499.             ) {
  500.                 $this->sendNewMessage($task->getTicket()->getChat(), $body);
  501.             }
  502.         }
  503.         if ($task->getTicket() instanceof Ticket) {
  504.             $ticket $task->getTicket();
  505.             $allTasks $ticket->getTasks();
  506.             $countWorkerBudgets 0;
  507.             $indicatorData $ticket->getIndicatorData();
  508.             if (!isset($indicatorData['performance.time']['dateOfAssignment'])) {
  509.                 $indicatorData['performance.time']['dateOfAssignment'] = null;
  510.             }
  511.             foreach ($allTasks as $task) {
  512.                 $countWorkerBudgets += $task->getWorkerBudgets()->count();
  513.             }
  514.             if ($countWorkerBudgets 0) {
  515.                 $indicatorData['performance.time']['dateOfAssignment'] = new DateTime('now');
  516.             } else {
  517.                 $indicatorData['performance.time']['dateOfAssignment'] = null;
  518.             }
  519.             $ticket->setIndicatorData($indicatorData);
  520.             $this->entityManager->persist($ticket);
  521.             $this->entityManager->flush();
  522.         }
  523.         //$this->entityManager->clear();
  524.     }
  525.     /**
  526.      * @param $chat
  527.      * @param $body
  528.      * @throws NotFoundException
  529.      */
  530.     protected function sendNewMessage($chat$body)
  531.     {
  532.         $newMessage = new ChatMessage();
  533.         $newMessage->setChat($chat);
  534.         $newMessage->setType('log');
  535.         $newMessage->setBody(json_encode($body));
  536.         $this->entityManager->persist($newMessage);
  537.         $this->entityManager->flush();
  538.         $userCurrent $this->tokenStorage->getToken()->getUser();
  539.         if(!$userCurrent instanceof User)
  540.             throw new NotFoundException($this->translator->trans('User current not found'));
  541.         $this->chatService->markMessagesAsReadByChatAndUser($chat$userCurrent);
  542.         $data['chatMessage_id'] = $newMessage->getId();
  543.         $this->messageBus->dispatch(new LogMessage(LogMessage::NEW_LOG_MESSAGE_IN_CHAT$data));
  544.     }
  545.     /**
  546.      * @param $action
  547.      * @param $entity
  548.      * @param array $data
  549.      * @throws \Doctrine\ORM\NonUniqueResultException
  550.      */
  551.     protected function registerLog($action$entity$data = [])
  552.     {
  553.         $this->logService->registerLog(
  554.             $action,
  555.             $entity,
  556.             $data
  557.         );
  558.     }
  559.     public static function getSubscribedEvents()
  560.     {
  561.         return [
  562.             KernelEvents::VIEW => ['onKernelView'EventPriorities::POST_WRITE]
  563.         ];
  564.     }
  565.     /*protected function loadScheduleMatrix(WorkerBudget $workerBudget)
  566.     {
  567.         $schedule = $workerBudget->getSchedule();
  568.         $standardPrice = $workerBudget->getCostHour();
  569.         $hours = array_fill(0,24, $standardPrice);
  570.         $scheduleMatrix = array_fill(0, 7, $hours);
  571.         $additionalSchedules = $workerBudget->getVendorStaff()->getSchedules();
  572.         foreach ($additionalSchedules as $additionalSchedule) {
  573.             $costHourDecision = $workerBudget->getCostHour() != $additionalSchedule->getHourCost() ;
  574.             $ifDecision = !is_null($schedule) ? $additionalSchedule !== $schedule  : $costHourDecision;
  575.             if (($ifDecision) && ($additionalSchedule->getType() == Schedule::TYPE_EXTRAORDINARY)) {
  576.                 $startDayOfWeek = date('N', strtotime($additionalSchedule->getStartDayWeek())) - 1;
  577.                 $endDayOfWeek = date('N', strtotime($additionalSchedule->getEndDayWeek())) -1;
  578.                 $hourTest= $additionalSchedule->getStartHourDay();
  579.                 $startHour = date('G', strtotime($additionalSchedule->getStartHourDay()));
  580.                 $endHour = date('G', strtotime($additionalSchedule->getEndHourDay()));
  581.                 $price = $additionalSchedule->getHourCost();
  582.                 for ($day = $startDayOfWeek; $day <= $endDayOfWeek; $day++) {
  583.                     for ($hour = $startHour; $hour <= $endHour; $hour++) {
  584.                         $scheduleMatrix[$day][$hour] = $price;
  585.                     }
  586.                 }
  587.             }
  588.         }
  589.         return $scheduleMatrix;
  590.     }*/
  591. }