<?php
/**
* Created by PhpStorm.
* User: MEDINA
* Date: 11/04/2019
* Time: 01:27 AM
*/
namespace App\EventSubscriber\Ticket;
use App\Interfaces\CustomFieldServiceInterface;
use App\Services\CustomField\EntityWithCustomFieldService;
use Datetime;
use DateTimeZone;
use App\MessageHandler\ScheduledTask;
use App\Services\LogService;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\KernelEvents;
use Doctrine\ORM\EntityManagerInterface;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Repository\App\MediaObjectRepository;
use App\MessageHandler\Message;
use App\Services\UtilsService;
use App\Entity\App\Ticket\Ticket;
use App\Entity\Chat\Chat;
class TicketPostWriteSubscriber implements EventSubscriberInterface
{
protected $serviceContainer;
private $entityManager;
private $mediaObjectRepository;
private $utilsService;
private $messageBus;
private $translator;
private $logService;
private $customFieldService;
public function __construct(
MediaObjectRepository $mediaObjectRepository,
ContainerInterface $serviceContainer,
UtilsService $utilsService,
EntityManagerInterface $entityManager,
MessageBusInterface $messageBus,
TranslatorInterface $translator,
LogService $logService,
CustomFieldServiceInterface $customFieldService
) {
$this->mediaObjectRepository = $mediaObjectRepository;
$this->entityManager = $entityManager;
$this->serviceContainer = $serviceContainer;
$this->utilsService = $utilsService;
$this->messageBus = $messageBus;
$this->translator = $translator;
$this->logService = $logService;
$this->customFieldService = $customFieldService;
}
/**
* @param ViewEvent $event
* @throws \Doctrine\Common\Persistence\Mapping\MappingException
* @throws \Doctrine\ORM\NonUniqueResultException
* @throws \Exception
*/
public function onKernelView(ViewEvent $event)
{
$ticket = $event->getControllerResult();
if(!($ticket instanceof Ticket)) return;
$request = $event->getRequest();
$method = $request->getMethod();
$entityWithCustomFieldService = new EntityWithCustomFieldService($ticket, $this->customFieldService);
if($entityWithCustomFieldService->areCustomFieldsRequiredOnResponse($request)){
$entityWithCustomFieldService->loadAndSetCustomFields();
}
if (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method)
return;
$content = $request->getContent();
$params = json_decode($content, true);
if (!$this->entityManager->isOpen()) {
$this->entityManager = EntityManager::create(
$this->entityManager->getConnection(),
$this->entityManager->getConfiguration()
);
}
if (isset($params['mediaContent']) && is_array($params['mediaContent'])) {
if(false == $this->entityManager->getConnection()->ping()){
$this->entityManager->getConnection()->close();
$this->entityManager->getConnection()->connect();
}
$getMediaObjects = $this->mediaObjectRepository->findBy(['ticket' => $ticket->getId()]);
foreach ($getMediaObjects as $media) {
if (!in_array($media->getId(), $params['mediaContent'])){
$this->entityManager->remove($media);
}
}
foreach ($params['mediaContent'] as $mediaId) {
$mediaObject = $this->mediaObjectRepository->find($mediaId);
$mediaObject->setTicket($ticket);
$this->entityManager->persist($mediaObject);
}
$this->entityManager->flush();
}
if (Request::METHOD_POST === $method) {
$identify = $this->utilsService->generateIdentify($ticket);
$ticket->setIdentify($identify);
if(is_null($ticket->getPosition())) {
$ticket->setPosition($ticket->getId() * -1);
}
$this->entityManager->persist($ticket);
/**
* Crea nueva tarea
if ($ticket->getType()->getStage() == Ticket::STAGE_WORK_ORDER) {
$task = new Task();
$task->setTicket($ticket);
$task->setTitle($ticket->getTitle());
$task->setDescription($ticket->getDescription());
$task->setLocation($ticket->getLocation());
$task->setCategory($ticket->getCategory());
$task->setDateEnd($ticket->getDateExpiration());
$task->setState(TaskStatusLog::STATUS_TASK_IN_PROCESS);
$identify = $this->utilsService->generateIdentify($task);
if ($identify > 1) {
$identify++;
}
$task->setIdentify($identify);
$chat = new Chat();
$chat->setType(Chat::TYPE_TASK);
$task->setChat($chat);
$this->entityManager->persist($chat);
$this->entityManager->persist($task);
} **/
$this->entityManager->flush();
}
if (!$ticket->getChat()) {
$chat = new Chat();
$chat->setType(Chat::TYPE_TICKET);
$this->entityManager->persist($chat);
$ticket->setChat($chat);
$this->entityManager->persist($ticket);
$this->entityManager->flush();
}
$data['ticket_id'] = $ticket->getId();
if (Request::METHOD_POST === $method && in_array($ticket->getType()->getName(), ['incidence', 'request'])) {
$this->messageBus->dispatch(new Message(Message::NEW_REQUEST, $data));
}
if (Request::METHOD_POST === $method && $ticket->getType()->getName() === 'work_order') {
$this->messageBus->dispatch(new Message(Message::NEW_WORK_ORDER, $data));
}
if (Request::METHOD_POST === $method && $ticket->getType()->getName() === 'scheduled_task') {
$today = (new DateTime('now'))->setTimezone(new DateTimeZone('UTC'));
if ($ticket->getReminderHour()) { //TODO: aun en proceso
$isClone = false;
$dateStart = $today;
$timeEnd = (new DateTime('now +1 hour'))->setTimezone(new DateTimeZone('UTC'));
$dayToday = strtolower($dateStart->format('l'));
$dayOfMonth = $dateStart->format('j');
if (in_array($dayOfMonth, [29,30,31])) {
$dayOfMonth = 0;
}
$dayOfYear = $dateStart->format('m-d');
$timeEnd = $timeEnd->format('H').':00';
if ($timeEnd === '00:00') {
$timeEnd = '24:00';
}
if (
$ticket->getReminderHour()->format('H:i') > $dateStart->format('H:i') &&
$ticket->getReminderHour()->format('H:i') < $timeEnd
) {
if (is_null($ticket->getRepeat()) || !$ticket->getRepeat()) {
if (
$ticket->getReminderDate() &&
$ticket->getReminderDate()->format('Y-m-d') === $dateStart->format('Y-m-d')
) {
$isClone = true;
}
} else {
if ($ticket->getFrequency() === 'week' && in_array($dayToday, $ticket->getFrequencyWeek())) {
$isClone = true;
if ($ticket->getReminderDate() &&
$ticket->getReminderDate()->format('Y-m-d') === $dateStart->format('Y-m-d'))
{
$isClone = false;
}
}
if ($ticket->getFrequency() === 'month' && $ticket->getFrequencyDayMonth() === $dayOfMonth) {
$isClone = true;
}
if ($ticket->getFrequency() === 'year' && $ticket->getCreatedAt()->format('m-d') === $dayOfYear) {
$isClone = true;
}
}
}
if ($isClone) {
$hour = $ticket->getReminderHour()->format('H');
$minutes = $ticket->getReminderHour()->format('i');
$datetime1 = new DateTime($today->format('Y-m-d H:i'));
$datetime2 = new DateTime($today->setTime($hour, $minutes, 0)->format('Y-m-d H:i'));
$interval = $datetime1->diff($datetime2);
$seconds = 0;
if ($interval->i > 0) {
$seconds = $interval->i * 60 * 1000;
}
$this->messageBus->dispatch(new ScheduledTask( ScheduledTask::TICKET_CLONE, $data), [
new DelayStamp($seconds)
]);
}
}
elseif (is_null($ticket->getReminderHour()) &&
$ticket->getReminderDate()->format('Y-m-d') === $today->format('Y-m-d')
) {
$dataClone['today'] = $today->format('Y-m-d');
$dataClone['ticket_id'] = $ticket->getId();
$dataClone['cloneToday'] = true;
$isClone = false;
if (!$ticket->getRepeat() || is_null($ticket->getRepeat())) {
$isClone = true;
} elseif ($ticket->getRepeat()) {
if ($ticket->getFrequency() === 'week') {
$dayToday = strtolower($today->format('l'));
if (in_array($dayToday, $ticket->getFrequencyWeek())) {
$isClone = true;
}
}
if ($ticket->getFrequency() === 'month') {
$dayOfMonth = (integer)$today->format('j');
if (in_array($dayOfMonth, [29,30,31])) {
$dayOfMonth = 0;
}
if ((integer)$ticket->getFrequencyDayMonth() === $dayOfMonth) {
$isClone = true;
}
}
if ($ticket->getFrequency() === 'year') {
if ($ticket->getReminderDate()->format('m-d') === $today->format('m-d')) {
$isClone = true;
}
}
}
if ($isClone) {
$this->messageBus->dispatch(
new ScheduledTask(ScheduledTask::TICKET_CLONE, $dataClone)
);
}
}
}
//$this->entityManager->clear();
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['onKernelView', EventPriorities::POST_WRITE]
];
}
}