vendor/uvdesk/core-framework/Services/TicketService.php line 157

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Services;
  3. use Doctrine\ORM\Query;
  4. use Symfony\Component\Yaml\Yaml;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  10. use Webkul\UVDesk\CoreFrameworkBundle\Entity\AgentActivity;
  11. use Webkul\UVDesk\MailboxBundle\Utils\Mailbox\Mailbox;
  12. use Symfony\Component\EventDispatcher\GenericEvent;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Thread;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Attachment;
  16. use Webkul\UVDesk\MailboxBundle\Utils\MailboxConfiguration;
  17. use Webkul\UVDesk\CoreFrameworkBundle\Utils\TokenGenerator;
  18. use Symfony\Component\DependencyInjection\ContainerInterface;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  21. use Webkul\UVDesk\CoreFrameworkBundle\Services\CustomFieldsService;
  22. use Webkul\UVDesk\CoreFrameworkBundle\Services\FileUploadService;
  23. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  24. use UVDesk\CommunityPackages\UVDesk\FormComponent\Entity;
  25. use Webkul\UVDesk\MailboxBundle\Utils\Imap\Configuration as ImapConfiguration;
  26. use Symfony\Component\Filesystem\Filesystem;
  27. class TicketService
  28. {
  29.     const PATH_TO_CONFIG '/config/packages/uvdesk_mailbox.yaml';
  30.     protected $container;
  31.     protected $requestStack;
  32.     protected $entityManager;
  33.     protected $fileUploadService;
  34.     protected $userService;
  35.     
  36.     public function __construct(
  37.         ContainerInterface $container
  38.         RequestStack $requestStack
  39.         EntityManagerInterface $entityManager
  40.         FileUploadService $fileUploadService,
  41.         CustomFieldsService $customFieldsService,
  42.         UserService $userService)
  43.     {
  44.         $this->container $container;
  45.         $this->requestStack $requestStack;
  46.         $this->entityManager $entityManager;
  47.         $this->fileUploadService $fileUploadService;
  48.         $this->customFieldsService $customFieldsService;
  49.         $this->userService $userService;
  50.     }
  51.     public function getAllMailboxes()
  52.     {
  53.         $collection array_map(function ($mailbox) {
  54.             return [
  55.                 'id' => $mailbox->getId(),
  56.                 'name' => $mailbox->getName(),
  57.                 'isEnabled' => $mailbox->getIsEnabled(),
  58.                 'email'     => $mailbox->getImapConfiguration()->getUsername(),
  59.             ];
  60.         }, $this->parseMailboxConfigurations()->getMailboxes());
  61.         return $collection;
  62.     }
  63.     public function parseMailboxConfigurations(bool $ignoreInvalidAttributes false
  64.     {
  65.         $path $this->getPathToConfigurationFile();
  66.         if (!file_exists($path)) {
  67.             throw new \Exception("File '$path' not found.");
  68.         }
  69.         // Read configurations from package config.
  70.         $mailboxConfiguration = new MailboxConfiguration();
  71.         $swiftmailerService $this->container->get('swiftmailer.service');
  72.         $swiftmailerConfigurations $swiftmailerService->parseSwiftMailerConfigurations();
  73.         foreach (Yaml::parse(file_get_contents($path))['uvdesk_mailbox']['mailboxes'] ?? [] as $id => $params) {
  74.             // Swiftmailer Configuration
  75.             $swiftmailerConfiguration null;
  76.             foreach ($swiftmailerConfigurations as $configuration) {
  77.                 if ($configuration->getId() == $params['smtp_server']['mailer_id']) {
  78.                     $swiftmailerConfiguration $configuration;
  79.                     break;
  80.                 }
  81.             }
  82.             // IMAP Configuration
  83.             ($imapConfiguration ImapConfiguration::guessTransportDefinition($params['imap_server']['host']))
  84.                 ->setUsername($params['imap_server']['username'])
  85.                 ->setPassword($params['imap_server']['password']);
  86.             // Mailbox Configuration
  87.             ($mailbox = new Mailbox($id))
  88.                 ->setName($params['name'])
  89.                 ->setIsEnabled($params['enabled'])
  90.                 ->setImapConfiguration($imapConfiguration);
  91.             
  92.             if (!empty($swiftmailerConfiguration)) {
  93.                 $mailbox->setSwiftMailerConfiguration($swiftmailerConfiguration);
  94.             } else if (!empty($params['smtp_server']['mailer_id']) && true === $ignoreInvalidAttributes) {
  95.                 $mailbox->setSwiftMailerConfiguration($swiftmailerService->createConfiguration('smtp'$params['smtp_server']['mailer_id']));
  96.             }
  97.             $mailboxConfiguration->addMailbox($mailbox);
  98.         }
  99.         return $mailboxConfiguration;
  100.     }
  101.     public function getPathToConfigurationFile()
  102.     {
  103.         return $this->container->get('kernel')->getProjectDir() . self::PATH_TO_CONFIG;
  104.     }
  105.     public function getRandomRefrenceId($email null)
  106.     {
  107.         $email = !empty($email) ? $email $this->container->getParameter('uvdesk.support_email.id');
  108.         $emailDomain substr($emailstrpos($email'@'));
  109.         return sprintf("<%s%s>"TokenGenerator::generateToken(20'0123456789abcdefghijklmnopqrstuvwxyz'), $emailDomain);
  110.     }
  111.     // @TODO: Refactor this out of this service. Use UserService::getSessionUser() instead.
  112.     public function getUser()
  113.     {
  114.         return $this->container->get('user.service')->getCurrentUser();
  115.     }
  116.     public function getDefaultType()
  117.     {
  118.         $typeCode $this->container->getParameter('uvdesk.default.ticket.type');
  119.         $ticketType $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findOneByCode($typeCode);
  120.         return !empty($ticketType) ? $ticketType null;
  121.     }
  122.     public function getDefaultStatus()
  123.     {
  124.         $statusCode $this->container->getParameter('uvdesk.default.ticket.status');
  125.         $ticketStatus $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneByCode($statusCode);
  126.         return !empty($ticketStatus) ? $ticketStatus null;
  127.     }
  128.     public function getDefaultPriority()
  129.     {
  130.         $priorityCode $this->container->getParameter('uvdesk.default.ticket.priority');
  131.         $ticketPriority $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->findOneByCode($priorityCode);
  132.         return !empty($ticketPriority) ? $ticketPriority null;
  133.     }
  134.     public function appendTwigSnippet($snippet '')
  135.     {
  136.         switch ($snippet) {
  137.             case 'createMemberTicket':
  138.                 return $this->getMemberCreateTicketSnippet();
  139.                 break;
  140.             default:
  141.                 break;
  142.         }
  143.         return '';
  144.     }
  145.     public function getMemberCreateTicketSnippet()
  146.     {   
  147.         $twigTemplatingEngine $this->container->get('twig');
  148.         $ticketTypeCollection $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findByIsActive(true);
  149.         
  150.         $isFolderExist  =  $this->userService->isfileExists('apps/uvdesk/form-component');
  151.         if ($isFolderExist) {
  152.             $headerCustomFields $this->customFieldsService->getCustomFieldsArray('user');
  153.         }
  154.         return $twigTemplatingEngine->render('@UVDeskCoreFramework/Snippets/createMemberTicket.html.twig', [
  155.             'ticketTypeCollection' => $ticketTypeCollection,
  156.             'headerCustomFields' => $headerCustomFields ?? null,
  157.         ]);
  158.     }
  159.     public function getCustomerCreateTicketCustomFieldSnippet()
  160.     {   
  161.         $isFolderExist  =  $this->userService->isfileExists('apps/uvdesk/form-component');
  162.         if ($isFolderExist) { 
  163.             $customFields $this->customFieldsService->getCustomFieldsArray('customer');
  164.         }
  165.         return $customFields ?? null;
  166.     }
  167.     public function createTicket(array $params = [])
  168.     {
  169.         $thread $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Thread')->findOneByMessageId($params['messageId']);
  170.         if (empty($thread)) {
  171.             $user $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->findOneByEmail($params['from']);
  172.             if (empty($user) || null == $user->getCustomerInstance()) {
  173.                 $role $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode($params['role']);
  174.                 if (empty($role)) {
  175.                     throw new \Exception("The requested role '" $params['role'] . "' does not exist.");
  176.                 }
  177.                 
  178.                 // Create User Instance
  179.                 $user $this->container->get('user.service')->createUserInstance($params['from'], $params['name'], $role, [
  180.                     'source' => strtolower($params['source']),
  181.                     'active' => true,
  182.                 ]);
  183.             }
  184.             $params['role'] = 4;
  185.             $params['mailboxEmail'] = current($params['replyTo']); 
  186.             $params['customer'] = $params['user'] = $user;
  187.             return $this->createTicketBase($params);
  188.         }
  189.         return;
  190.     }
  191.     public function createTicketBase(array $ticketData = [])
  192.     {
  193.         if ('email' == $ticketData['source']) {
  194.             try {
  195.                 if (array_key_exists('UVDeskMailboxBundle'$this->container->getParameter('kernel.bundles'))) {
  196.                     $mailbox $this->container->get('uvdesk.mailbox')->getMailboxByEmail($ticketData['mailboxEmail']);
  197.                     $ticketData['mailboxEmail'] = $mailbox['email'];
  198.                 }
  199.             } catch (\Exception $e) {
  200.                 // No mailbox found for this email. Skip ticket creation.
  201.                 return;
  202.             }
  203.         }
  204.         // Set Defaults
  205.         $ticketType = !empty($ticketData['type']) ? $ticketData['type'] : $this->getDefaultType();
  206.         $ticketStatus = !empty($ticketData['status']) ? $ticketData['status'] : $this->getDefaultStatus();
  207.         $ticketPriority = !empty($ticketData['priority']) ? $ticketData['priority'] : $this->getDefaultPriority();
  208.         $ticketMessageId 'email' == $ticketData['source'] ? (!empty($ticketData['messageId']) ? $ticketData['messageId'] : null) : $this->getRandomRefrenceId();
  209.         $ticketData['type'] = $ticketType;
  210.         $ticketData['status'] = $ticketStatus;
  211.         $ticketData['priority'] = $ticketPriority;
  212.         $ticketData['messageId'] = $ticketMessageId;
  213.         $ticketData['isTrashed'] = false;
  214.         $ticket = new Ticket();
  215.         foreach ($ticketData as $property => $value) {
  216.             $callable 'set' ucwords($property);
  217.             if (method_exists($ticket$callable)) {
  218.                 $ticket->$callable($value);
  219.             }
  220.         }
  221.         $this->entityManager->persist($ticket);
  222.         $this->entityManager->flush();
  223.         return $this->createThread($ticket$ticketData);
  224.     }
  225.     
  226.     public function createThread(Ticket $ticket, array $threadData)
  227.     {
  228.         $threadData['isLocked'] = 0;
  229.       
  230.         if ('forward' === $threadData['threadType']) {
  231.             $threadData['replyTo'] = $threadData['to'];
  232.         }
  233.         $collaboratorEmails array_merge(!empty($threadData['cccol']) ? $threadData['cccol'] : [], !empty($threadData['cc']) ? $threadData['cc'] : []);
  234.         if (!empty($collaboratorEmails)) {
  235.             $threadData['cc'] = $collaboratorEmails;
  236.         }
  237.    
  238.         $thread = new Thread();
  239.         $thread->setTicket($ticket);
  240.         $thread->setCreatedAt(new \DateTime());
  241.         $thread->setUpdatedAt(new \DateTime());
  242.         if ($threadData['threadType'] != "note") {
  243.             foreach ($threadData as $property => $value) {
  244.                 if (!empty($value)) {
  245.                     $callable 'set' ucwords($property);
  246.                     if (method_exists($thread$callable)) {
  247.                         $thread->$callable($value);
  248.                     }
  249.                 }
  250.             }
  251.         } else {
  252.             $this->setTicketNotePlaceholderValue($thread$threadData$ticket);
  253.         }
  254.         // Update ticket reference ids is thread message id is defined
  255.         if (null != $thread->getMessageId() && false === strpos($ticket->getReferenceIds(), $thread->getMessageId())) {
  256.             $updatedReferenceIds $ticket->getReferenceIds() . ' ' $thread->getMessageId();            
  257.             $ticket->setReferenceIds($updatedReferenceIds);
  258.             $this->entityManager->persist($ticket);
  259.         }
  260.         if ('reply' === $threadData['threadType']) {
  261.             if ('agent' === $threadData['createdBy']) {
  262.                 // Ticket has been updated by support agents, mark as agent replied | customer view pending
  263.                 $ticket->setIsCustomerViewed(false);
  264.                 $ticket->setIsReplied(true);
  265.                 $customerName $ticket->getCustomer()->getFirstName().' '.$ticket->getCustomer()->getLastName();
  266.                 $agentActivity = new AgentActivity();
  267.                 $agentActivity->setThreadType('reply');
  268.                 $agentActivity->setTicket($ticket);
  269.                 $agentActivity->setAgent($thread->getUser());
  270.                 $agentActivity->setCustomerName($customerName);
  271.                 $agentActivity->setAgentName('agent');
  272.                 $agentActivity->setCreatedAt(new \DateTime());
  273.                 $this->entityManager->persist($agentActivity);
  274.             } else {
  275.                 // Ticket has been updated by customer, mark as agent view | reply pending
  276.                 $ticket->setIsAgentViewed(false);
  277.                 $ticket->setIsReplied(false);
  278.             }
  279.             $this->entityManager->persist($ticket);
  280.         } else if ('create' === $threadData['threadType']) {
  281.             $ticket->setIsReplied(false);
  282.             $this->entityManager->persist($ticket);
  283.             $customerName $ticket->getCustomer()->getFirstName().' '.$ticket->getCustomer()->getLastName();
  284.             $agentActivity = new AgentActivity();
  285.             $agentActivity->setThreadType('create');
  286.             $agentActivity->setTicket($ticket);
  287.             $agentActivity->setAgent($thread->getUser());
  288.             $agentActivity->setCustomerName($customerName );
  289.             $agentActivity->setAgentName('agent');
  290.             $agentActivity->setCreatedAt(new \DateTime());
  291.             $this->entityManager->persist($agentActivity);
  292.         }
  293.         
  294.         $ticket->currentThread $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Thread')->getTicketCurrentThread($ticket);
  295.         
  296.         $this->entityManager->persist($thread);
  297.         $this->entityManager->flush();
  298.         
  299.         $ticket->createdThread $thread;
  300.         // Uploading Attachments
  301.         if (!empty($threadData['attachments'])) {
  302.             if ('email' == $threadData['source']) {
  303.                 $this->saveThreadEmailAttachments($thread$threadData['attachments']);
  304.             } else if (!empty($threadData['attachments'])) {
  305.                 $this->saveThreadAttachment($thread$threadData['attachments']);
  306.             }
  307.         }
  308.         return $thread;
  309.     }
  310.     public function setTicketNotePlaceholderValue($thread$threadData$ticket)
  311.     {
  312.         if (!empty($threadData)) {
  313.             foreach ($threadData as $property => $value) {
  314.                 if (!empty($value)) {
  315.                     $callable 'set' ucwords($property);
  316.                     if (method_exists($thread$callable)) {
  317.                         if($callable != "setMessage") {
  318.                             $thread->$callable($value);
  319.                         } else {
  320.                             $notesPlaceholders $this->getNotePlaceholderValues($ticket'customer');
  321.                             $content $value;
  322.                             foreach ($notesPlaceholders as $key => $val) {
  323.                                 if(strpos($value"{%$key%}") !== false){
  324.                                     $content strtr($value, ["{%$key%}" => $val"{% $key %}" => $val]);
  325.                                 }
  326.                             }
  327.                             
  328.                             $content stripslashes($content);
  329.                             $thread->$callable($content);
  330.                         }
  331.                     }
  332.                 }
  333.             }
  334.         }
  335.     }
  336.     public function saveThreadAttachment($thread, array $attachments)
  337.     {
  338.         $prefix 'threads/' $thread->getId();
  339.         $uploadManager $this->container->get('uvdesk.core.file_system.service')->getUploadManager();
  340.         foreach ($attachments as $attachment) {
  341.             $uploadedFileAttributes $uploadManager->uploadFile($attachment$prefix);
  342.             if (!empty($uploadedFileAttributes['path'])) {
  343.                 ($threadAttachment = new Attachment())
  344.                     ->setThread($thread)
  345.                     ->setName($uploadedFileAttributes['name'])
  346.                     ->setPath($uploadedFileAttributes['path'])
  347.                     ->setSize($uploadedFileAttributes['size'])
  348.                     ->setContentType($uploadedFileAttributes['content-type']);
  349.                 
  350.                 $this->entityManager->persist($threadAttachment);
  351.             }
  352.         }
  353.         $this->entityManager->flush();
  354.     }
  355.     public function saveThreadEmailAttachments($thread, array $attachments)
  356.     {
  357.         $prefix 'threads/' $thread->getId();
  358.         $uploadManager $this->container->get('uvdesk.core.file_system.service')->getUploadManager();
  359.         
  360.         // Upload thread attachments
  361.         foreach ($attachments as $attachment) {
  362.             $uploadedFileAttributes $uploadManager->uploadEmailAttachment($attachment$prefix);
  363.             
  364.             if (!empty($uploadedFileAttributes['path'])) {
  365.                 ($threadAttachment = new Attachment())
  366.                     ->setThread($thread)
  367.                     ->setName($uploadedFileAttributes['name'])
  368.                     ->setPath($uploadedFileAttributes['path'])
  369.                     ->setSize($uploadedFileAttributes['size'])
  370.                     ->setContentType($uploadedFileAttributes['content-type']);
  371.                 
  372.                 $this->entityManager->persist($threadAttachment);
  373.             }
  374.         }
  375.         $this->entityManager->flush();
  376.     }
  377.     public function getTypes()
  378.     {
  379.         static $types;
  380.         if (null !== $types)
  381.             return $types;
  382.         $qb $this->entityManager->createQueryBuilder();
  383.         $qb->select('tp.id','tp.code As name')->from('UVDeskCoreFrameworkBundle:TicketType''tp')
  384.                 ->andwhere('tp.isActive = 1')
  385.                 ->orderBy('tp.code''ASC');
  386.         return $types $qb->getQuery()->getArrayResult();
  387.     }
  388.     public function getStatus()
  389.     {
  390.         static $statuses;
  391.         if (null !== $statuses)
  392.             return $statuses;
  393.         $qb $this->entityManager->createQueryBuilder();
  394.         $qb->select('ts')->from('UVDeskCoreFrameworkBundle:TicketStatus''ts');
  395.         // $qb->orderBy('ts.sortOrder', Criteria::ASC);
  396.         return $statuses $qb->getQuery()->getArrayResult();
  397.     }
  398.     public function getTicketTotalThreads($ticketId)
  399.     {
  400.         $qb $this->entityManager->createQueryBuilder();
  401.         $qb->select('COUNT(th.id) as threadCount')->from('UVDeskCoreFrameworkBundle:Ticket''t')
  402.             ->leftJoin('t.threads''th')
  403.             ->andWhere('t.id = :ticketId')
  404.             ->andWhere('th.threadType = :threadType')
  405.             ->setParameter('threadType','reply')
  406.             ->setParameter('ticketId'$ticketId);
  407.         $qb $this->entityManager->createQueryBuilder();
  408.         $qb->select('COUNT(t.id) as threadCount')->from('UVDeskCoreFrameworkBundle:Thread''t')
  409.             ->andWhere('t.ticket = :ticketId')
  410.             ->andWhere('t.threadType = :threadType')
  411.             ->setParameter('threadType','reply')
  412.             ->setParameter('ticketId'$ticketId);
  413.         return $qb->getQuery()->getSingleScalarResult();
  414.     }
  415.     public function getTicketTags($request null)
  416.     {
  417.         $qb $this->entityManager->createQueryBuilder();
  418.         $qb->select('tg')->from('UVDeskCoreFrameworkBundle:Tag''tg');
  419.         if($request) {
  420.             $qb->andwhere("tg.name LIKE :tagName");
  421.             $qb->setParameter('tagName''%'.urldecode($request->query->get('query')).'%');
  422.             $qb->andwhere("tg.id NOT IN (:ids)");
  423.             $qb->setParameter('ids'explode(',',urldecode($request->query->get('not'))));
  424.         }
  425.         return $qb->getQuery()->getArrayResult();
  426.     }
  427.     
  428.     public function paginateMembersTicketCollection(Request $request)
  429.     {
  430.         $params $request->query->all();
  431.         $activeUser $this->container->get('user.service')->getSessionUser();
  432.         $activeUserTimeZone $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneBy(['code' => 'Knowledgebase']);
  433.         $agentTimeZone = !empty($activeUser->getTimezone()) ? $activeUser->getTimezone() : $activeUserTimeZone->getTimezone();
  434.         $agentTimeFormat = !empty($activeUser->getTimeformat()) ? $activeUser->getTimeformat() : $activeUserTimeZone->getTimeformat();
  435.         $ticketRepository $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  436.         $website $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneBy(['code' => 'helpdesk']);
  437.         $timeZone $website->getTimezone();
  438.         $timeFormat $website->getTimeformat();
  439.         $supportGroupReference $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->getUserSupportGroupReferences($activeUser);
  440.         $supportTeamReference  $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->getUserSupportTeamReferences($activeUser);
  441.         // Get base query
  442.         $baseQuery $ticketRepository->prepareBaseTicketQuery($activeUser$supportGroupReference$supportTeamReference$params);
  443.         $ticketTabs $ticketRepository->getTicketTabDetails($activeUser$supportGroupReference$supportTeamReference$params);
  444.         // Apply Pagination
  445.         $pageNumber = !empty($params['page']) ? (int) $params['page'] : 1;
  446.         $itemsLimit = !empty($params['limit']) ? (int) $params['limit'] : $ticketRepository::DEFAULT_PAGINATION_LIMIT;
  447.         if (isset($params['repliesLess']) || isset($params['repliesMore'])) {
  448.             $paginationOptions = ['wrap-queries' => true];
  449.             $paginationQuery $baseQuery->getQuery()
  450.                 ->setHydrationMode(Query::HYDRATE_ARRAY);
  451.         } else {
  452.             $paginationOptions = ['distinct' => true];
  453.             $paginationQuery $baseQuery->getQuery()
  454.                 ->setHydrationMode(Query::HYDRATE_ARRAY)
  455.                 ->setHint('knp_paginator.count', isset($params['status']) ? $ticketTabs[$params['status']] : $ticketTabs[1]);
  456.         }
  457.         $pagination $this->container->get('knp_paginator')->paginate($paginationQuery$pageNumber$itemsLimit$paginationOptions);
  458.         // Process Pagination Response
  459.         $ticketCollection = [];
  460.         $paginationParams $pagination->getParams();
  461.         $paginationData $pagination->getPaginationData();
  462.         $paginationParams['page'] = 'replacePage';
  463.         $paginationData['url'] = '#' $this->container->get('uvdesk.service')->buildPaginationQuery($paginationParams);
  464.         // $container->get('default.service')->buildSessionUrl('ticket',$queryParameters);
  465.         $ticketThreadCountQueryTemplate $this->entityManager->createQueryBuilder()
  466.             ->select('COUNT(thread.id) as threadCount')
  467.             ->from('UVDeskCoreFrameworkBundle:Ticket''ticket')
  468.             ->leftJoin('ticket.threads''thread')
  469.             ->where('ticket.id = :ticketId')
  470.             ->andWhere('thread.threadType = :threadType')->setParameter('threadType''reply');
  471.         
  472.         foreach ($pagination->getItems() as $ticketDetails) {
  473.             $ticket array_shift($ticketDetails);
  474.             $ticketThreadCountQuery = clone $ticketThreadCountQueryTemplate;
  475.             $ticketThreadCountQuery->setParameter('ticketId'$ticket['id']);
  476.             $totalTicketReplies = (int) $ticketThreadCountQuery->getQuery()->getSingleScalarResult();
  477.             $ticketHasAttachments false;
  478.             $dbTime $ticket['createdAt'];
  479.             
  480.             $formattedTime$this->fomatTimeByPreference($dbTime,$timeZone,$timeFormat,$agentTimeZone,$agentTimeFormat);
  481.             $currentDateTime  = new \DateTime('now');
  482.             if($this->getLastReply($ticket['id'])) {
  483.                 $lastRepliedTime 
  484.                 $this->time2string($currentDateTime->getTimeStamp() - $this->getLastReply($ticket['id'])['createdAt']->getTimeStamp());
  485.             } else {
  486.                 $lastRepliedTime 
  487.                 $this->time2string($currentDateTime->getTimeStamp() - $ticket['createdAt']->getTimeStamp());
  488.             }
  489.             $ticketResponse = [
  490.                 'id' => $ticket['id'],
  491.                 'subject' => $ticket['subject'],
  492.                 'isStarred' => $ticket['isStarred'],
  493.                 'isAgentView' => $ticket['isAgentViewed'],
  494.                 'isTrashed' => $ticket['isTrashed'],
  495.                 'source' => $ticket['source'],
  496.                 'group' => $ticketDetails['groupName'],
  497.                 'team' => $ticketDetails['teamName'],
  498.                 'priority' => $ticket['priority'],
  499.                 'type' => $ticketDetails['typeName'],
  500.                 'timestamp' => $formattedTime['dateTimeZone'],
  501.                 'formatedCreatedAt' => $formattedTime['dateTimeZone']->format($formattedTime['timeFormatString']),
  502.                 'totalThreads' => $totalTicketReplies,
  503.                 'agent' => null,
  504.                 'customer' => null,
  505.                 'hasAttachments' => $ticketHasAttachments,
  506.                 'lastReplyTime' => $lastRepliedTime
  507.             ];
  508.            
  509.             if (!empty($ticketDetails['agentId'])) {
  510.                 $ticketResponse['agent'] = [
  511.                     'id' => $ticketDetails['agentId'],
  512.                     'name' => $ticketDetails['agentName'],
  513.                     'smallThumbnail' => $ticketDetails['smallThumbnail'],
  514.                 ];
  515.             }
  516.             if (!empty($ticketDetails['customerId'])) {
  517.                 $ticketResponse['customer'] = [
  518.                     'id' => $ticketDetails['customerId'],
  519.                     'name' => $ticketDetails['customerName'],
  520.                     'email' => $ticketDetails['customerEmail'],
  521.                     'smallThumbnail' => $ticketDetails['customersmallThumbnail'],
  522.                 ];
  523.             }
  524.             array_push($ticketCollection$ticketResponse);
  525.         }
  526.          
  527.         return [
  528.             'tickets' => $ticketCollection,
  529.             'pagination' => $paginationData,
  530.             'tabs' => $ticketTabs,
  531.             'labels' => [
  532.                 'predefind' => $this->getPredefindLabelDetails($activeUser$supportGroupReference$supportTeamReference$params),
  533.                 'custom' => $this->getCustomLabelDetails($this->container),
  534.             ],
  535.           
  536.         ];
  537.     }
  538.     // Convert Timestamp to day/hour/min
  539.     Public function time2string($time) {
  540.         $d floor($time/86400);
  541.         $_d = ($d 10 '0' '').$d;
  542.         $h floor(($time-$d*86400)/3600);
  543.         $_h = ($h 10 '0' '').$h;
  544.         $m floor(($time-($d*86400+$h*3600))/60);
  545.         $_m = ($m 10 '0' '').$m;
  546.         $s $time-($d*86400+$h*3600+$m*60);
  547.         $_s = ($s 10 '0' '').$s;
  548.         $time_str "0 minutes";
  549.         if($_d != 00)
  550.             $time_str $_d." ".'days';
  551.         elseif($_h != 00)
  552.             $time_str $_h." ".'hours';
  553.         elseif($_m != 00)
  554.             $time_str $_m." ".'minutes';
  555.         return $time_str." "."ago";
  556.     }
  557.     public function getPredefindLabelDetails(User $currentUser, array $supportGroupIds = [], array $supportTeamIds = [], array $params = [])
  558.     {
  559.         $data = array();
  560.         $queryBuilder $this->entityManager->createQueryBuilder();
  561.         $ticketRepository $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  562.         $queryBuilder->select('COUNT(DISTINCT ticket.id) as ticketCount')->from('UVDeskCoreFrameworkBundle:Ticket''ticket');
  563.             
  564.         // // applyFilter according to permission
  565.         $queryBuilder->where('ticket.isTrashed != 1');
  566.         $userInstance $currentUser->getAgentInstance();
  567.         if (!empty($userInstance) &&  'ROLE_AGENT' == $userInstance->getSupportRole()->getCode() 
  568.         && $userInstance->getTicketAccesslevel() != 1) {
  569.             $supportGroupIds implode(','$supportGroupIds);
  570.             $supportTeamIds implode(','$supportTeamIds);
  571.             if ($userInstance->getTicketAccesslevel() == 4) {
  572.                 $queryBuilder->andwhere('ticket.agent = ' $currentUser->getId());
  573.             } elseif ($userInstance->getTicketAccesslevel() == 2) {
  574.                 $query '';
  575.                 if ($supportGroupIds){
  576.                     $query .= ' OR supportGroup.id IN('.$supportGroupIds.') ';
  577.                 }
  578.                 if ($supportTeamIds) {
  579.                     $query .= ' OR supportTeam.id IN('.$supportTeamIds.') ';
  580.                 }
  581.                 $queryBuilder->leftJoin('ticket.supportGroup''supportGroup')
  582.                             ->leftJoin('ticket.supportTeam''supportTeam')
  583.                             ->andwhere('( ticket.agent = ' $currentUser->getId().$query.')');
  584.                     
  585.             } elseif ($userInstance->getTicketAccesslevel() == 3) {
  586.                 $query '';
  587.                 if ($supportTeamIds) {
  588.                     $query .= ' OR supportTeam.id IN('.$supportTeamIds.') ';
  589.                 }
  590.                 $queryBuilder->leftJoin('ticket.supportGroup''supportGroup')
  591.                             ->leftJoin('ticket.supportTeam''supportTeam')
  592.                             ->andwhere('( ticket.agent = ' $currentUser->getId().$query')');
  593.             }
  594.         }
  595.         // for all tickets count
  596.         $data['all'] = $queryBuilder->getQuery()->getSingleScalarResult();
  597.         // for new tickets count
  598.         $newQb = clone $queryBuilder;
  599.         $newQb->andwhere('ticket.isNew = 1');
  600.         $data['new'] = $newQb->getQuery()->getSingleScalarResult();
  601.         // for unassigned tickets count
  602.         $unassignedQb = clone $queryBuilder;
  603.         $unassignedQb->andwhere("ticket.agent is NULL");
  604.         $data['unassigned'] = $unassignedQb->getQuery()->getSingleScalarResult();
  605.         // for unanswered ticket count
  606.         $unansweredQb = clone $queryBuilder;
  607.         $unansweredQb->andwhere('ticket.isReplied = 0');
  608.         $data['notreplied'] = $unansweredQb->getQuery()->getSingleScalarResult();
  609.         // for my tickets count
  610.         $mineQb = clone $queryBuilder;
  611.         $mineQb->andWhere("ticket.agent = :agentId")
  612.                 ->setParameter('agentId'$currentUser->getId());
  613.         $data['mine'] = $mineQb->getQuery()->getSingleScalarResult();
  614.         // for starred tickets count
  615.         $starredQb = clone $queryBuilder;
  616.         $starredQb->andwhere('ticket.isStarred = 1');
  617.         $data['starred'] = $starredQb->getQuery()->getSingleScalarResult();
  618.         // for trashed tickets count
  619.         $trashedQb = clone $queryBuilder;
  620.         $trashedQb->where('ticket.isTrashed = 1');
  621.         if ($currentUser->getRoles()[0] != 'ROLE_SUPER_ADMIN' && $userInstance->getTicketAccesslevel() != 1) {
  622.             $trashedQb->andwhere('ticket.agent = ' $currentUser->getId());
  623.         }
  624.         $data['trashed'] = $trashedQb->getQuery()->getSingleScalarResult();
  625.         return $data;
  626.     }
  627.     
  628.     public function paginateMembersTicketThreadCollection(Ticket $ticketRequest $request)
  629.     {
  630.         $params $request->query->all();
  631.         $entityManager $this->entityManager;
  632.         $activeUser $this->container->get('user.service')->getSessionUser();
  633.         $activeUserTimeZone $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneBy(['code' => 'Knowledgebase']);
  634.         $agentTimeZone = !empty($activeUser->getTimezone()) ? $activeUser->getTimezone() : $activeUserTimeZone->getTimezone();
  635.         $agentTimeFormat = !empty($activeUser->getTimeformat()) ? $activeUser->getTimeformat() : $activeUserTimeZone->getTimeformat();
  636.         
  637.         $threadRepository $entityManager->getRepository('UVDeskCoreFrameworkBundle:Thread');
  638.         $uvdeskFileSystemService $this->container->get('uvdesk.core.file_system.service');
  639.         // Get base query
  640.         $enableLockedThreads $this->container->get('user.service')->isAccessAuthorized('ROLE_AGENT_MANAGE_LOCK_AND_UNLOCK_THREAD');
  641.         $baseQuery $threadRepository->prepareBasePaginationRecentThreadsQuery($ticket$params$enableLockedThreads);
  642.         
  643.         // Apply Pagination
  644.         $paginationItemsQuery = clone $baseQuery;
  645.         $totalPaginationItems $paginationItemsQuery->select('COUNT(DISTINCT thread.id)')->getQuery()->getSingleScalarResult();
  646.         
  647.         $pageNumber = !empty($params['page']) ? (int) $params['page'] : 1;
  648.         $itemsLimit = !empty($params['limit']) ? (int) $params['limit'] : $threadRepository::DEFAULT_PAGINATION_LIMIT;
  649.         
  650.         $paginationOptions = ['distinct' => true];
  651.         $paginationQuery $baseQuery->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count', (int) $totalPaginationItems);
  652.         $pagination $this->container->get('knp_paginator')->paginate($paginationQuery$pageNumber$itemsLimit$paginationOptions);
  653.         // Process Pagination Response
  654.         $threadCollection = [];
  655.         $paginationParams $pagination->getParams();
  656.         $paginationData $pagination->getPaginationData();
  657.         $website $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneBy(['code' => 'helpdesk']);
  658.         $timeZone $website->getTimezone();
  659.         $timeFormat $website->getTimeformat();
  660.         if (!empty($params['threadRequestedId'])) {
  661.             $requestedThreadCollection $baseQuery
  662.                 ->andWhere('thread.id >= :threadRequestedId')->setParameter('threadRequestedId', (int) $params['threadRequestedId'])
  663.                 ->getQuery()->getArrayResult();
  664.             
  665.             $totalRequestedThreads count($requestedThreadCollection);
  666.             $paginationData['current'] = ceil($totalRequestedThreads $threadRepository::DEFAULT_PAGINATION_LIMIT);
  667.             if ($paginationData['current'] > 1) {
  668.                 $paginationData['firstItemNumber'] = 1;
  669.                 $paginationData['lastItemNumber'] = $totalRequestedThreads;
  670.                 $paginationData['next'] = ceil(($totalRequestedThreads 1) / $threadRepository::DEFAULT_PAGINATION_LIMIT);
  671.             }
  672.         }
  673.         $paginationParams['page'] = 'replacePage';
  674.         $paginationData['url'] = '#' $this->container->get('uvdesk.service')->buildPaginationQuery($paginationParams);
  675.         foreach ($pagination->getItems() as $threadDetails) {
  676.             $dbTime $threadDetails['createdAt'];
  677.             $formattedTime $this->fomatTimeByPreference($dbTime,$timeZone,$timeFormat,$agentTimeZone,$agentTimeFormat);
  678.             $threadResponse = [
  679.                 'id' => $threadDetails['id'],
  680.                 'user' => null,
  681.                 'fullname' => null,
  682.                 'reply' => html_entity_decode($threadDetails['message']),
  683.                 'source' => $threadDetails['source'],
  684.                 'threadType' => $threadDetails['threadType'],
  685.                 'userType' => $threadDetails['createdBy'],
  686.                 'timestamp' => $formattedTime['dateTimeZone'],
  687.                 'formatedCreatedAt' => $formattedTime['dateTimeZone']->format($formattedTime['timeFormatString']),
  688.                 'bookmark' => $threadDetails['isBookmarked'],
  689.                 'isLocked' => $threadDetails['isLocked'],
  690.                 'replyTo' => $threadDetails['replyTo'],
  691.                 'cc' => $threadDetails['cc'],
  692.                 'bcc' => $threadDetails['bcc'],
  693.                 'attachments' => $threadDetails['attachments'],
  694.             ];
  695.   
  696.             if (!empty($threadDetails['user'])) {
  697.                 $threadResponse['fullname'] = trim($threadDetails['user']['firstName'] . ' ' $threadDetails['user']['lastName']);
  698.                 $threadResponse['user'] = [
  699.                     'id' => $threadDetails['user']['id'],
  700.                     'smallThumbnail' => $threadDetails['user']['userInstance'][0]['profileImagePath'],
  701.                     'name' => $threadResponse['fullname'],
  702.                 ];
  703.             }
  704.             if (!empty($threadResponse['attachments'])) {
  705.                 $threadResponse['attachments'] = array_map(function ($attachment) use ($entityManager$uvdeskFileSystemService) {
  706.                     $attachmentReferenceObject $entityManager->getReference(Attachment::class, $attachment['id']);
  707.                     return $uvdeskFileSystemService->getFileTypeAssociations($attachmentReferenceObject);
  708.                 }, $threadResponse['attachments']);
  709.             }
  710.             array_push($threadCollection$threadResponse);
  711.         }
  712.         return [
  713.             'threads' => $threadCollection,
  714.             'pagination' => $paginationData,
  715.         ];
  716.     }
  717.     public function massXhrUpdate(Request $request)
  718.     {
  719.         $params $request->request->get('data');
  720.         foreach ($params['ids'] as $ticketId) {
  721.             $ticket $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($ticketId);
  722.             if (false == $this->isTicketAccessGranted($ticket)) {
  723.                 throw new \Exception('Access Denied'403);
  724.             }
  725.             
  726.             if (empty($ticket)) {
  727.                 continue;
  728.             }
  729.             switch ($params['actionType']) {
  730.                 case 'trashed':
  731.                     if (false == $ticket->getIsTrashed()) {
  732.                         $ticket->setIsTrashed(true);
  733.                         
  734.                         $this->entityManager->persist($ticket);
  735.                     }
  736.                     // Trigger ticket delete event
  737.                     $event = new GenericEvent(CoreWorkflowEvents\Ticket\Delete::getId(), [
  738.                         'entity' => $ticket,
  739.                     ]);
  740.                     $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  741.                     break;
  742.                 case 'delete':
  743.                     $threads $ticket->getThreads();
  744.                     $fileService = new Filesystem();
  745.                     if (count($threads) > 0) {
  746.                         foreach($threads as $thread) {
  747.                             if (!empty($thread)) {
  748.                                 $fileService->remove($this->container->getParameter('kernel.project_dir').'/public/assets/threads/'.$thread->getId());
  749.                             }
  750.                         }
  751.                     }
  752.                     $this->entityManager->remove($ticket);
  753.                     
  754.                     break;
  755.                 case 'restored':
  756.                     if (true == $ticket->getIsTrashed()) {
  757.                         $ticket->setIsTrashed(false);
  758.                         $this->entityManager->persist($ticket);
  759.                     }
  760.                     break;
  761.                 case 'agent':
  762.                     if ($ticket->getAgent() == null || $ticket->getAgent() && $ticket->getAgent()->getId() != $params['targetId']) {
  763.                         $agent $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->find($params['targetId']);
  764.                         $ticket->setAgent($agent);
  765.     
  766.                         $this->entityManager->persist($ticket);
  767.     
  768.                         // Trigger Agent Assign event
  769.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Agent::getId(), [
  770.                             'entity' => $ticket,
  771.                         ]);
  772.     
  773.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  774.                     }
  775.                     break;
  776.                 case 'status':
  777.                     if ($ticket->getStatus() == null || $ticket->getStatus() && $ticket->getStatus()->getId() != $params['targetId']) {
  778.                         $status $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketStatus')->findOneById($params['targetId']);
  779.                         $ticket->setStatus($status);
  780.                         $this->entityManager->persist($ticket);
  781.                         // Trigger ticket status event
  782.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Status::getId(), [
  783.                             'entity' => $ticket,
  784.                         ]);
  785.                         
  786.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  787.                     }
  788.                     
  789.                     break;
  790.                 case 'type':
  791.                     if ($ticket->getType() == null || $ticket->getType() && $ticket->getType()->getId() != $params['targetId']) {
  792.                         $type $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketType')->findOneById($params['targetId']);
  793.                         $ticket->setType($type);
  794.     
  795.                         $this->entityManager->persist($ticket);
  796.     
  797.                         // Trigger ticket type event
  798.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Type::getId(), [
  799.                             'entity' => $ticket,
  800.                         ]);
  801.     
  802.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  803.                     }
  804.                     break;
  805.                 case 'group':
  806.                     if ($ticket->getSupportGroup() == null || $ticket->getSupportGroup() && $ticket->getSupportGroup()->getId() != $params['targetId']) {
  807.                         $group $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportGroup')->find($params['targetId']);
  808.                         $ticket->setSupportGroup($group);
  809.     
  810.                         $this->entityManager->persist($ticket);
  811.     
  812.                         // Trigger Support group event
  813.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Group::getId(), [
  814.                             'entity' => $ticket,
  815.                         ]);
  816.     
  817.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  818.                     }
  819.                     break;
  820.                 case 'team':
  821.                     if ($ticket->getSupportTeam() == null || $ticket->getSupportTeam() && $ticket->getSupportTeam()->getId() != $params['targetId']){
  822.                         $team $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportTeam')->find($params['targetId']);
  823.                         $ticket->setSupportTeam($team);
  824.                         
  825.                         $this->entityManager->persist($ticket);
  826.         
  827.                         // Trigger team event
  828.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Team::getId(), [
  829.                             'entity' => $ticket,
  830.                         ]);
  831.         
  832.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  833.                     }
  834.                     break;
  835.                 case 'priority':
  836.                     if ($ticket->getPriority() == null || $ticket->getPriority() && $ticket->getPriority()->getId() != $params['targetId']) {
  837.                         
  838.                         $priority $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:TicketPriority')->find($params['targetId']);
  839.                         $ticket->setPriority($priority);
  840.     
  841.                         $this->entityManager->persist($ticket);
  842.     
  843.                         // Trigger ticket Priority event
  844.                         $event = new GenericEvent(CoreWorkflowEvents\Ticket\Priority::getId(), [
  845.                             'entity' => $ticket,
  846.                         ]);
  847.     
  848.                         $this->container->get('event_dispatcher')->dispatch($event'uvdesk.automation.workflow.execute');
  849.                     }
  850.                     break;
  851.                 case 'label':
  852.                     $label $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportLabel')->find($params['targetId']);
  853.                     
  854.                     if ($label && !$this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->isLabelAlreadyAdded($ticket$label)) {
  855.                         $ticket->addSupportLabel($label);
  856.                     }
  857.                     
  858.                     $this->entityManager->persist($ticket);
  859.                     break;
  860.                 default:
  861.                     break;
  862.             }
  863.         } 
  864.         $this->entityManager->flush();
  865.         return [
  866.             'alertClass' => 'success',
  867.             'alertMessage' => $this->trans('Tickets have been updated successfully'),
  868.         ];
  869.     }
  870.     
  871.     public function getNotePlaceholderValues($ticket$type "customer")
  872.     {
  873.         $variables = array();
  874.         $variables['ticket.id'] = $ticket->getId();
  875.         $variables['ticket.subject'] = $ticket->getSubject();
  876.         $variables['ticket.status'] = $ticket->getStatus()->getCode();
  877.         $variables['ticket.priority'] = $ticket->getPriority()->getCode();
  878.         if($ticket->getSupportGroup())
  879.             $variables['ticket.group'] = $ticket->getSupportGroup()->getName();
  880.         else
  881.             $variables['ticket.group'] = '';
  882.         $variables['ticket.team'] = ($ticket->getSupportTeam() ? $ticket->getSupportTeam()->getName() : '');
  883.         $customer $this->container->get('user.service')->getCustomerPartialDetailById($ticket->getCustomer()->getId());
  884.         $variables['ticket.customerName'] = $customer['name'];
  885.         $userService $this->container->get('user.service');
  886.       
  887.         $variables['ticket.agentName'] = '';
  888.         $variables['ticket.agentEmail'] = '';
  889.         if ($ticket->getAgent()) {
  890.             $agent $this->container->get('user.service')->getAgentDetailById($ticket->getAgent()->getId());
  891.             if($agent) {
  892.                 $variables['ticket.agentName'] = $agent['name'];
  893.                 $variables['ticket.agentEmail'] = $agent['email'];
  894.             }
  895.         }
  896.         $router $this->container->get('router');
  897.         if ($type == 'customer') {
  898.             $ticketListURL $router->generate('helpdesk_member_ticket_collection', [
  899.                 'id' => $ticket->getId(),
  900.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  901.         } else {
  902.             $ticketListURL $router->generate('helpdesk_customer_ticket_collection', [
  903.                 'id' => $ticket->getId(),
  904.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  905.         }
  906.         $variables['ticket.link'] = sprintf("<a href='%s'>#%s</a>"$ticketListURL$ticket->getId());
  907.         return $variables;
  908.     }
  909.     public function paginateMembersTicketTypeCollection(Request $request)
  910.     {
  911.         // Get base query
  912.         $params $request->query->all();
  913.         $ticketRepository $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  914.         $paginationQuery $ticketRepository->prepareBasePaginationTicketTypesQuery($params);
  915.         // Apply Pagination
  916.         $paginationOptions = ['distinct' => true];
  917.         $pageNumber = !empty($params['page']) ? (int) $params['page'] : 1;
  918.         $itemsLimit = !empty($params['limit']) ? (int) $params['limit'] : $ticketRepository::DEFAULT_PAGINATION_LIMIT;
  919.         $pagination $this->container->get('knp_paginator')->paginate($paginationQuery$pageNumber$itemsLimit$paginationOptions);
  920.         // Process Pagination Response
  921.         $paginationParams $pagination->getParams();
  922.         $paginationData $pagination->getPaginationData();
  923.         $paginationParams['page'] = 'replacePage';
  924.         $paginationData['url'] = '#' $this->container->get('uvdesk.service')->buildPaginationQuery($paginationParams);
  925.         return [
  926.             'types' => array_map(function ($ticketType) {
  927.                 return [
  928.                     'id' => $ticketType->getId(),
  929.                     'code' => strtoupper($ticketType->getCode()),
  930.                     'description' => $ticketType->getDescription(),
  931.                     'isActive' => $ticketType->getIsActive(),
  932.                 ];
  933.             }, $pagination->getItems()),
  934.             'pagination_data' => $paginationData,
  935.         ];
  936.     }
  937.     public function paginateMembersTagCollection(Request $request)
  938.     {
  939.         // Get base query
  940.         $params $request->query->all();
  941.         $ticketRepository $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket');
  942.         $baseQuery $ticketRepository->prepareBasePaginationTagsQuery($params);
  943.         // Apply Pagination
  944.         $paginationResultsQuery = clone $baseQuery;
  945.         $paginationResultsQuery->select('COUNT(supportTag.id)');
  946.         $paginationQuery $baseQuery->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count'count($paginationResultsQuery->getQuery()->getResult()));
  947.         $paginationOptions = ['distinct' => true];
  948.         $pageNumber = !empty($params['page']) ? (int) $params['page'] : 1;
  949.         $itemsLimit = !empty($params['limit']) ? (int) $params['limit'] : $ticketRepository::DEFAULT_PAGINATION_LIMIT;
  950.         $pagination $this->container->get('knp_paginator')->paginate($paginationQuery$pageNumber$itemsLimit$paginationOptions);
  951.         // Process Pagination Response
  952.         $paginationParams $pagination->getParams();
  953.         $paginationData $pagination->getPaginationData();
  954.         $paginationParams['page'] = 'replacePage';
  955.         $paginationData['url'] = '#' $this->container->get('uvdesk.service')->buildPaginationQuery($paginationParams);
  956.         if (in_array('UVDeskSupportCenterBundle'array_keys($this->container->getParameter('kernel.bundles')))) {
  957.             $articleRepository $this->entityManager->getRepository('UVDeskSupportCenterBundle:Article');
  958.             return [
  959.                 'tags' => array_map(function ($supportTag) use ($articleRepository) {
  960.                     return [
  961.                         'id' => $supportTag['id'],
  962.                         'name' => $supportTag['name'],
  963.                         'ticketCount' => $supportTag['totalTickets'],
  964.                         'articleCount' => $articleRepository->getTotalArticlesBySupportTag($supportTag['id']),
  965.                     ];
  966.                 }, $pagination->getItems()),
  967.                 'pagination_data' => $paginationData,
  968.             ];
  969.         } else {
  970.             return [
  971.                 'tags' => array_map(function ($supportTag) {
  972.                     return [
  973.                         'id' => $supportTag['id'],
  974.                         'name' => $supportTag['name'],
  975.                         'ticketCount' => $supportTag['totalTickets'],
  976.                     ];
  977.                 }, $pagination->getItems()),
  978.                 'pagination_data' => $paginationData,
  979.             ];
  980.         }
  981.     }
  982.     public function getTicketInitialThreadDetails(Ticket $ticket)
  983.     {
  984.         $initialThread $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Thread')->findOneBy([
  985.             'ticket' => $ticket,
  986.             'threadType' => 'create',
  987.         ]);
  988.         if (!empty($initialThread)) {
  989.             $author $initialThread->getUser();
  990.             $authorInstance 'agent' == $initialThread->getCreatedBy() ? $author->getAgentInstance() : $author->getCustomerInstance();
  991.         
  992.             $threadDetails = [
  993.                 'id' => $initialThread->getId(),
  994.                 'source' => $initialThread->getSource(),
  995.                 'messageId' => $initialThread->getMessageId(),
  996.                 'threadType' => $initialThread->getThreadType(),
  997.                 'createdBy' => $initialThread->getCreatedBy(),
  998.                 'message' => html_entity_decode($initialThread->getMessage()),
  999.                 'attachments' => $initialThread->getAttachments(),
  1000.                 'timestamp' => $initialThread->getCreatedAt()->getTimestamp(),
  1001.                 'createdAt' => $initialThread->getCreatedAt()->format('d-m-Y h:ia'),
  1002.                 'user' => $authorInstance->getPartialDetails(),
  1003.                 'cc' => is_array($initialThread->getCc()) ? implode(', '$initialThread->getCc()) : '',
  1004.             ];
  1005.             $attachments $threadDetails['attachments']->getValues();
  1006.             if (!empty($attachments)) {
  1007.                 $uvdeskFileSystemService $this->container->get('uvdesk.core.file_system.service');
  1008.                 $threadDetails['attachments'] = array_map(function ($attachment) use ($uvdeskFileSystemService) {
  1009.                     return $uvdeskFileSystemService->getFileTypeAssociations($attachment);
  1010.                 }, $attachments);
  1011.             }
  1012.         }
  1013.         return $threadDetails ?? null;
  1014.     }
  1015.     public function getCreateReply($ticketId$firewall 'member')
  1016.     {
  1017.         $qb $this->entityManager->createQueryBuilder();
  1018.         $qb->select("th,a,u.id as userId")->from('UVDeskCoreFrameworkBundle:Thread''th')
  1019.                 ->leftJoin('th.ticket','t')
  1020.                 ->leftJoin('th.attachments''a')
  1021.                 ->leftJoin('th.user','u')
  1022.                 ->andWhere('t.id = :ticketId')
  1023.                 ->andWhere('th.threadType = :threadType')
  1024.                 ->setParameter('threadType','create')
  1025.                 ->setParameter('ticketId',$ticketId)
  1026.                 ->orderBy('th.id''DESC')
  1027.                 ->getMaxResults(1);
  1028.         $threadResponse $qb->getQuery()->getArrayResult();
  1029.         if((!empty($threadResponse[0][0]))) {
  1030.             $threadDetails $threadResponse[0][0];
  1031.             $userService $this->container->get('user.service');
  1032.             
  1033.             if ($threadDetails['createdBy'] == 'agent') {
  1034.                 $threadDetails['user'] = $userService->getAgentDetailById($threadResponse[0]['userId']);
  1035.             } else {
  1036.                 $threadDetails['user'] = $userService->getCustomerPartialDetailById($threadResponse[0]['userId']);
  1037.             }
  1038.             
  1039.             $threadDetails['reply'] = html_entity_decode($threadDetails['message']);
  1040.             $threadDetails['formatedCreatedAt'] = $this->timeZoneConverter($threadDetails['createdAt']);    
  1041.             $threadDetails['timestamp'] = $userService->convertToDatetimeTimezoneTimestamp($threadDetails['createdAt']);
  1042.         
  1043.             if (!empty($threadDetails['attachments'])) {
  1044.                 $entityManager $this->entityManager;
  1045.                 $uvdeskFileSystemService $this->container->get('uvdesk.core.file_system.service');
  1046.                 $threadDetails['attachments'] = array_map(function ($attachment) use ($entityManager$uvdeskFileSystemService$firewall) {
  1047.                     $attachmentReferenceObject $entityManager->getReference(Attachment::class, $attachment['id']);
  1048.                     return $uvdeskFileSystemService->getFileTypeAssociations($attachmentReferenceObject$firewall);
  1049.                 }, $threadDetails['attachments']);
  1050.             }
  1051.         }
  1052.         
  1053.         return $threadDetails ?? null;
  1054.     }
  1055.     public function hasAttachments($ticketId) {
  1056.         $qb $this->entityManager->createQueryBuilder();
  1057.         $qb->select("DISTINCT COUNT(a.id) as attachmentCount")->from('UVDeskCoreFrameworkBundle:Thread''th')
  1058.                 ->leftJoin('th.ticket','t')
  1059.                 ->leftJoin('th.attachments','a')
  1060.                 ->andWhere('t.id = :ticketId')
  1061.                 ->setParameter('ticketId',$ticketId);
  1062.         return intval($qb->getQuery()->getSingleScalarResult());
  1063.     }
  1064.     public function getAgentDraftReply()
  1065.     {
  1066.         $signature $this->getUser()->getAgentInstance()->getSignature();
  1067.         
  1068.         return str_replace"\n"'<br/>'$signature);
  1069.     }
  1070.     public function trans($text)
  1071.     {
  1072.         return $this->container->get('translator')->trans($text);
  1073.     }
  1074.     public function getAllSources()
  1075.     {
  1076.         $sources = ['email' => 'Email''website' => 'Website'];
  1077.         return $sources;
  1078.     }
  1079.     public function getCustomLabelDetails($container)
  1080.     {
  1081.         $currentUser $container->get('user.service')->getCurrentUser();
  1082.         $qb $this->entityManager->createQueryBuilder();
  1083.         $qb->select('COUNT(DISTINCT t) as ticketCount,sl.id')->from("UVDeskCoreFrameworkBundle:Ticket"'t')
  1084.                 ->leftJoin('t.supportLabels','sl')
  1085.                 ->andwhere('sl.user = :userId')
  1086.                 ->setParameter('userId'$currentUser->getId())
  1087.                 ->groupBy('sl.id');
  1088.         $ticketCountResult $qb->getQuery()->getResult();
  1089.         $data = array();
  1090.         $qb $this->entityManager->createQueryBuilder();
  1091.         $qb->select('sl.id,sl.name,sl.colorCode')->from("UVDeskCoreFrameworkBundle:SupportLabel"'sl')
  1092.                 ->andwhere('sl.user = :userId')
  1093.                 ->setParameter('userId'$currentUser->getId());
  1094.         $labels $qb->getQuery()->getResult();
  1095.         foreach ($labels as $key => $label) {
  1096.             $labels[$key]['count'] = 0;
  1097.             foreach ($ticketCountResult as $ticketCount) {
  1098.                 if(($label['id'] == $ticketCount['id']))
  1099.                     $labels[$key]['count'] = $ticketCount['ticketCount'] ?: 0;
  1100.             }
  1101.         }
  1102.         return $labels;
  1103.     }
  1104.     public function getLabels($request null)
  1105.     {
  1106.         static $labels;
  1107.         if (null !== $labels)
  1108.             return $labels;
  1109.         $qb $this->entityManager->createQueryBuilder();
  1110.         $qb->select('sl')->from('UVDeskCoreFrameworkBundle:SupportLabel''sl')
  1111.             ->andwhere('sl.user = :userId')
  1112.             ->setParameter('userId'$this->getUser()->getId());
  1113.         if($request) {
  1114.             $qb->andwhere("sl.name LIKE :labelName");
  1115.             $qb->setParameter('labelName''%'.urldecode($request->query->get('query')).'%');
  1116.         }
  1117.         return $labels $qb->getQuery()->getArrayResult();
  1118.     }
  1119.     public function getTicketCollaborators($ticketId)
  1120.     {
  1121.         $qb $this->entityManager->createQueryBuilder();
  1122.         $qb->select("DISTINCT c.id, c.email, CONCAT(c.firstName,' ', c.lastName) AS name, userInstance.profileImagePath, userInstance.profileImagePath as smallThumbnail")->from('UVDeskCoreFrameworkBundle:Ticket''t')
  1123.                 ->leftJoin('t.collaborators''c')
  1124.                 ->leftJoin('c.userInstance''userInstance')
  1125.                 ->andwhere('t.id = :ticketId')
  1126.                 ->andwhere('userInstance.supportRole = :roles')
  1127.                 ->setParameter('ticketId'$ticketId)
  1128.                 ->setParameter('roles'4)
  1129.                 ->orderBy('name','ASC');
  1130.         return $qb->getQuery()->getArrayResult();
  1131.     }
  1132.     public function getTicketTagsById($ticketId)
  1133.     {
  1134.         $qb $this->entityManager->createQueryBuilder();
  1135.         $qb->select('tg')->from('UVDeskCoreFrameworkBundle:Tag''tg')
  1136.                 ->leftJoin('tg.tickets' ,'t')
  1137.                 ->andwhere('t.id = :ticketId')
  1138.                 ->setParameter('ticketId'$ticketId);
  1139.         return $qb->getQuery()->getArrayResult();
  1140.     }
  1141.     public function getTicketLabels($ticketId)
  1142.     {
  1143.         $qb $this->entityManager->createQueryBuilder();
  1144.         $qb->select('DISTINCT sl.id,sl.name,sl.colorCode')->from('UVDeskCoreFrameworkBundle:Ticket''t')
  1145.                 ->leftJoin('t.supportLabels','sl')
  1146.                 ->leftJoin('sl.user','slu')
  1147.                 ->andWhere('slu.id = :userId')
  1148.                 ->andWhere('t.id = :ticketId')
  1149.                 ->setParameter('userId'$this->getUser()->getId())
  1150.                 ->setParameter('ticketId'$ticketId);
  1151.         $result $qb->getQuery()->getResult();
  1152.         
  1153.         return $result $result : [];
  1154.     }
  1155.     public function getUserLabels()
  1156.     {
  1157.         $qb $this->entityManager->createQueryBuilder();
  1158.         $qb->select('sl')->from('UVDeskCoreFrameworkBundle:SupportLabel''sl')
  1159.                 ->leftJoin('sl.user','slu')
  1160.                 ->andWhere('slu.id = :userId')
  1161.                 ->setParameter('userId'$this->getUser()->getId());
  1162.         $result $qb->getQuery()->getResult();
  1163.         
  1164.         return $result $result : [];
  1165.     }
  1166.     public function getTicketLabelsAll($ticketId)
  1167.     {
  1168.         $qb $this->entityManager->createQueryBuilder();
  1169.         $qb->select('DISTINCT sl.id,sl.name,sl.colorCode')->from('UVDeskCoreFrameworkBundle:Ticket''t')
  1170.                 ->leftJoin('t.supportLabels','sl')
  1171.                 ->andWhere('t.id = :ticketId')
  1172.                 ->setParameter('ticketId'$ticketId);
  1173.         $result $qb->getQuery()->getResult();
  1174.         
  1175.         return $result $result : [];
  1176.     }
  1177.     public function getManualWorkflow()
  1178.     {
  1179.         $preparedResponseIds = [];
  1180.         $groupIds = [];
  1181.         $teamIds = []; 
  1182.         $userId $this->container->get('user.service')->getCurrentUser()->getAgentInstance()->getId();
  1183.         $preparedResponseRepo $this->entityManager->getRepository('UVDeskAutomationBundle:PreparedResponses')->findAll();
  1184.         foreach ($preparedResponseRepo as $pr) {
  1185.             if ($userId == $pr->getUser()->getId()) {
  1186.                 //Save the ids of the saved reply.
  1187.                 array_push($preparedResponseIds, (int)$pr->getId());
  1188.             }
  1189.         }
  1190.         // Get the ids of the Group(s) the current user is associated with.
  1191.         $query "select * from uv_user_support_groups where userInstanceId =".$userId;
  1192.         $connection $this->entityManager->getConnection();
  1193.         $stmt $connection->prepare($query);
  1194.         $stmt->execute();
  1195.         $result $stmt->fetchAll();
  1196.         foreach ($result as $row) {
  1197.             array_push($groupIds$row['supportGroupId']);
  1198.         }
  1199.         // Get all the saved reply's ids that is associated with the user's group(s).
  1200.         $query "select * from uv_prepared_response_support_groups";
  1201.         $stmt $connection->prepare($query);
  1202.         $stmt->execute();
  1203.         $result $stmt->fetchAll();
  1204.         foreach ($result as $row) {
  1205.             if (in_array($row['group_id'], $groupIds)) {
  1206.                 array_push($preparedResponseIds, (int) $row['savedReply_id']);
  1207.             }
  1208.         }
  1209.         // Get the ids of the Team(s) the current user is associated with.
  1210.         $query "select * from uv_user_support_teams";
  1211.         $connection $this->entityManager->getConnection();
  1212.         $stmt $connection->prepare($query);
  1213.         $stmt->execute();
  1214.         $result $stmt->fetchAll();
  1215.         foreach($result as $row) {
  1216.             if ($row['userInstanceId'] == $userId) {
  1217.                 array_push($teamIds$row['supportTeamId']);
  1218.             }
  1219.         }
  1220.         $query "select * from uv_prepared_response_support_teams";
  1221.         $stmt $connection->prepare($query);
  1222.         $stmt->execute();
  1223.         $result $stmt->fetchAll();
  1224.         foreach ($result as $row) {
  1225.             if (in_array($row['subgroup_id'], $teamIds)) {
  1226.                 array_push($preparedResponseIds, (int)$row['savedReply_id']);
  1227.             }
  1228.         }
  1229.         $qb $this->entityManager->createQueryBuilder();
  1230.         $qb->select('DISTINCT mw')
  1231.             ->from('UVDeskAutomationBundle:PreparedResponses''mw')
  1232.             ->where('mw.status = 1')
  1233.             ->andWhere('mw.id IN (:ids)')
  1234.             ->setParameter('ids'$preparedResponseIds);
  1235.         
  1236.         return $qb->getQuery()->getResult();
  1237.     }
  1238.     public function getSavedReplies()
  1239.     {   
  1240.         $savedReplyIds = [];
  1241.         $groupIds = [];
  1242.         $teamIds = []; 
  1243.         $userId $this->container->get('user.service')->getCurrentUser()->getAgentInstance()->getId();
  1244.         $savedReplyRepo $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SavedReplies')->findAll();
  1245.         foreach ($savedReplyRepo as $sr) {
  1246.             if ($userId == $sr->getUser()->getId()) {
  1247.                 //Save the ids of the saved reply.
  1248.                 array_push($savedReplyIds, (int)$sr->getId());
  1249.             }
  1250.         }
  1251.         // Get the ids of the Group(s) the current user is associated with.
  1252.         $query "select * from uv_user_support_groups where userInstanceId =".$userId;
  1253.         $connection $this->entityManager->getConnection();
  1254.         $stmt $connection->prepare($query);
  1255.         $stmt->execute();
  1256.         $result $stmt->fetchAll();
  1257.         foreach ($result as $row) {
  1258.             array_push($groupIds$row['supportGroupId']);
  1259.         }
  1260.         // Get all the saved reply's ids that is associated with the user's group(s).
  1261.         $query "select * from uv_saved_replies_groups";
  1262.         $stmt $connection->prepare($query);
  1263.         $stmt->execute();
  1264.         $result $stmt->fetchAll();
  1265.         foreach ($result as $row) {
  1266.             if (in_array($row['group_id'], $groupIds)) {
  1267.                 array_push($savedReplyIds, (int) $row['savedReply_id']);
  1268.             }
  1269.         }
  1270.         // Get the ids of the Team(s) the current user is associated with.
  1271.         $query "select * from uv_user_support_teams";
  1272.         $connection $this->entityManager->getConnection();
  1273.         $stmt $connection->prepare($query);
  1274.         $stmt->execute();
  1275.         $result $stmt->fetchAll();
  1276.         foreach($result as $row) {
  1277.             if ($row['userInstanceId'] == $userId) {
  1278.                 array_push($teamIds$row['supportTeamId']);
  1279.             }
  1280.         }
  1281.         $query "select * from uv_saved_replies_teams";
  1282.         $stmt $connection->prepare($query);
  1283.         $stmt->execute();
  1284.         $result $stmt->fetchAll();
  1285.         foreach ($result as $row) {
  1286.             if (in_array($row['subgroup_id'], $teamIds)) {
  1287.                 array_push($savedReplyIds, (int)$row['savedReply_id']);
  1288.             }
  1289.         }
  1290.         $qb $this->entityManager->createQueryBuilder();
  1291.         $qb->select('DISTINCT sr')
  1292.         ->from('UVDeskCoreFrameworkBundle:SavedReplies''sr')
  1293.         ->Where('sr.id IN (:ids)')
  1294.         ->setParameter('ids'$savedReplyIds);
  1295.         
  1296.         return $qb->getQuery()->getResult();
  1297.     }
  1298.     public function getPriorities()
  1299.     {
  1300.         static $priorities;
  1301.         if (null !== $priorities)
  1302.             return $priorities;
  1303.         $qb $this->entityManager->createQueryBuilder();
  1304.         $qb->select('tp')->from('UVDeskCoreFrameworkBundle:TicketPriority''tp');
  1305.         return $priorities $qb->getQuery()->getArrayResult();
  1306.     }
  1307.     public function getTicketLastThread($ticketId)
  1308.     {
  1309.         $qb $this->entityManager->createQueryBuilder();
  1310.         $qb->select("th")->from('UVDeskCoreFrameworkBundle:Thread''th')
  1311.                 ->leftJoin('th.ticket','t')
  1312.                 ->andWhere('t.id = :ticketId')
  1313.                 ->setParameter('ticketId',$ticketId)
  1314.                 ->orderBy('th.id''DESC');
  1315.         return $qb->getQuery()->setMaxResults(1)->getSingleResult();
  1316.     }
  1317.     public function getlastReplyAgentName($ticketId)
  1318.     {
  1319.         $qb $this->entityManager->createQueryBuilder();
  1320.         $qb->select("u.id,CONCAT(u.firstName,' ', u.lastName) AS name,u.firstName")->from('UVDeskCoreFrameworkBundle:Thread''th')
  1321.                 ->leftJoin('th.ticket','t')
  1322.                 ->leftJoin('th.user''u')
  1323.                 ->leftJoin('u.userInstance''userInstance')
  1324.                 ->andwhere('userInstance.supportRole != :roles')
  1325.                 ->andWhere('t.id = :ticketId')
  1326.                 ->andWhere('th.threadType = :threadType')
  1327.                 ->setParameter('threadType','reply')
  1328.                 ->andWhere('th.createdBy = :createdBy')
  1329.                 ->setParameter('createdBy','agent')
  1330.                 ->setParameter('ticketId',$ticketId)
  1331.                 ->setParameter('roles'4)
  1332.                 ->orderBy('th.id''DESC');
  1333.         $result $qb->getQuery()->setMaxResults(1)->getResult();
  1334.         return $result $result[0] : null;
  1335.     }
  1336.     public function getLastReply($ticketId$userType null
  1337.     {
  1338.         $queryBuilder $this->entityManager->createQueryBuilder();
  1339.         $queryBuilder->select("th, a, u.id as userId")
  1340.             ->from('UVDeskCoreFrameworkBundle:Thread''th')
  1341.             ->leftJoin('th.ticket','t')
  1342.             ->leftJoin('th.attachments''a')
  1343.             ->leftJoin('th.user','u')
  1344.             ->andWhere('t.id = :ticketId')
  1345.             ->andWhere('th.threadType = :threadType')
  1346.             ->setParameter('threadType','reply')
  1347.             ->setParameter('ticketId',$ticketId)
  1348.             ->orderBy('th.id''DESC')
  1349.             ->getMaxResults(1);
  1350.         if (!empty($userType)) {
  1351.             $queryBuilder->andWhere('th.createdBy = :createdBy')->setParameter('createdBy'$userType);
  1352.         }
  1353.         
  1354.         $threadResponse $queryBuilder->getQuery()->getArrayResult();
  1355.         
  1356.         if (!empty($threadResponse[0][0])) {
  1357.             $threadDetails $threadResponse[0][0];
  1358.             $userService $this->container->get('user.service');
  1359.             
  1360.             if ($threadDetails['createdBy'] == 'agent') {
  1361.                 $threadDetails['user'] = $userService->getAgentDetailById($threadResponse[0]['userId']);
  1362.             } else {
  1363.                 $threadDetails['user'] = $userService->getCustomerPartialDetailById($threadResponse[0]['userId']);
  1364.             }
  1365.             
  1366.             $threadDetails['reply'] = html_entity_decode($threadDetails['message']);
  1367.             $threadDetails['formatedCreatedAt'] = $this->timeZoneConverter($threadDetails['createdAt']);
  1368.             $threadDetails['timestamp'] = $userService->convertToDatetimeTimezoneTimestamp($threadDetails['createdAt']);
  1369.             if (!empty($threadDetails['attachments'])) {
  1370.                 $entityManager $this->entityManager;
  1371.                 $uvdeskFileSystemService $this->container->get('uvdesk.core.file_system.service');
  1372.                 $threadDetails['attachments'] = array_map(function ($attachment) use ($entityManager$uvdeskFileSystemService) {
  1373.                     $attachmentReferenceObject $this->entityManager->getReference(Attachment::class, $attachment['id']);
  1374.                     return $uvdeskFileSystemService->getFileTypeAssociations($attachmentReferenceObject);
  1375.                 }, $threadDetails['attachments']);
  1376.             }
  1377.         }
  1378.         return $threadDetails ?? null;
  1379.     }
  1380.     public function getSavedReplyContent($savedReplyId$ticketId)
  1381.     {
  1382.         $ticket $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Ticket')->find($ticketId);
  1383.         $savedReply $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:SavedReplies')->findOneById($savedReplyId);
  1384.         $emailPlaceholders $this->getSavedReplyPlaceholderValues($ticket'customer');
  1385.         return $this->container->get('email.service')->processEmailContent($savedReply->getMessage(), $emailPlaceholderstrue);
  1386.     }
  1387.     public function getSavedReplyPlaceholderValues($ticket$type "customer")
  1388.     {
  1389.         $variables = array();
  1390.         $variables['ticket.id'] = $ticket->getId();
  1391.         $variables['ticket.subject'] = $ticket->getSubject();
  1392.         $variables['ticket.status'] = $ticket->getStatus()->getCode();
  1393.         $variables['ticket.priority'] = $ticket->getPriority()->getCode();
  1394.         if($ticket->getSupportGroup())
  1395.             $variables['ticket.group'] = $ticket->getSupportGroup()->getName();
  1396.         else
  1397.             $variables['ticket.group'] = '';
  1398.         $variables['ticket.team'] = ($ticket->getSupportTeam() ? $ticket->getSupportTeam()->getName() : '');
  1399.         $customer $this->container->get('user.service')->getCustomerPartialDetailById($ticket->getCustomer()->getId());
  1400.         $variables['ticket.customerName'] = $customer['name'];
  1401.         $variables['ticket.customerEmail'] = $customer['email'];
  1402.         $userService $this->container->get('user.service');
  1403.       
  1404.         $variables['ticket.agentName'] = '';
  1405.         $variables['ticket.agentEmail'] = '';
  1406.         if ($ticket->getAgent()) {
  1407.             $agent $this->container->get('user.service')->getAgentDetailById($ticket->getAgent()->getId());
  1408.             if($agent) {
  1409.                 $variables['ticket.agentName'] = $agent['name'];
  1410.                 $variables['ticket.agentEmail'] = $agent['email'];
  1411.             }
  1412.         }
  1413.         
  1414.         $router $this->container->get('router');
  1415.         if ($type == 'customer') {
  1416.             $ticketListURL $router->generate('helpdesk_customer_ticket_collection', [
  1417.                 'id' => $ticket->getId(),
  1418.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  1419.         } else {
  1420.             $ticketListURL $router->generate('helpdesk_member_ticket_collection', [
  1421.                 'id' => $ticket->getId(),
  1422.             ], UrlGeneratorInterface::ABSOLUTE_URL);
  1423.         }
  1424.         $variables['ticket.link'] = sprintf("<a href='%s'>#%s</a>"$ticketListURL$ticket->getId());
  1425.         return $variables;
  1426.     }
  1427.     public function isEmailBlocked($email$website
  1428.     {
  1429.         $flag false;
  1430.         $email strtolower($email);
  1431.         $knowlegeBaseWebsite $this->entityManager->getRepository('UVDeskSupportCenterBundle:KnowledgebaseWebsite')->findOneBy(['website' => $website->getId(), 'isActive' => 1]);
  1432.         $list $this->container->get('user.service')->getWebsiteSpamDetails($knowlegeBaseWebsite);
  1433.         // Blacklist
  1434.         if (!empty($list['blackList']['email']) && in_array($email$list['blackList']['email'])) {
  1435.             // Emails
  1436.             $flag true;
  1437.         } elseif (!empty($list['blackList']['domain'])) {
  1438.             // Domains
  1439.             foreach ($list['blackList']['domain'] as $domain) {
  1440.                 if (strpos($email$domain)) {
  1441.                     $flag true;
  1442.                     break;
  1443.                 }
  1444.             }
  1445.         }
  1446.         // Whitelist
  1447.         if ($flag) {
  1448.             if (isset($email$list['whiteList']['email']) && in_array($email$list['whiteList']['email'])) {
  1449.                 // Emails
  1450.                 return false;
  1451.             } elseif (isset($list['whiteList']['domain'])) {
  1452.                 // Domains
  1453.                 foreach ($list['whiteList']['domain'] as $domain) {
  1454.                     if (strpos($email$domain)) {
  1455.                         $flag false;
  1456.                     }
  1457.                 }
  1458.             }
  1459.         }
  1460.         return $flag;
  1461.     }
  1462.     public function timeZoneConverter($dateFlag)
  1463.     {
  1464.         $website $this->entityManager->getRepository('UVDeskCoreFrameworkBundle:Website')->findOneBy(['code' => 'Knowledgebase']);
  1465.         $timeZone $website->getTimezone();
  1466.         $timeFormat $website->getTimeformat();
  1467.         $activeUser $this->container->get('user.service')->getSessionUser();
  1468.         $agentTimeZone = !empty($activeUser) ? $activeUser->getTimezone() : null;
  1469.         $agentTimeFormat = !empty($activeUser) ? $activeUser->getTimeformat() : null;
  1470.         $parameterType gettype($dateFlag);
  1471.         if($parameterType == 'string'){
  1472.             if(is_null($agentTimeZone) && is_null($agentTimeFormat)){
  1473.                 if(is_null($timeZone) && is_null($timeFormat)){
  1474.                     $datePattern date_create($dateFlag);
  1475.                     return date_format($datePattern,'d-m-Y h:ia');
  1476.                 } else {
  1477.                     $dateFlag = new \DateTime($dateFlag);
  1478.                     $datePattern $dateFlag->setTimezone(new \DateTimeZone($timeZone));
  1479.                     return date_format($datePattern$timeFormat);
  1480.                 }
  1481.             } else {
  1482.                 $dateFlag = new \DateTime($dateFlag);
  1483.                 $datePattern $dateFlag->setTimezone(new \DateTimeZone($agentTimeZone));
  1484.                 return date_format($datePattern$agentTimeFormat);
  1485.             }          
  1486.         } else {
  1487.             if(is_null($agentTimeZone) && is_null($agentTimeFormat)){
  1488.                 if(is_null($timeZone) && is_null($timeFormat)){
  1489.                     return date_format($dateFlag,'d-m-Y h:ia');
  1490.                 } else {
  1491.                     $datePattern $dateFlag->setTimezone(new \DateTimeZone($timeZone));
  1492.                     return date_format($datePattern$timeFormat);
  1493.                 }
  1494.             } else {
  1495.                 $datePattern $dateFlag->setTimezone(new \DateTimeZone($agentTimeZone));
  1496.                 return date_format($datePattern$agentTimeFormat);
  1497.             }    
  1498.         }         
  1499.     }
  1500.     public function fomatTimeByPreference($dbTime,$timeZone,$timeFormat,$agentTimeZone,$agentTimeFormat)
  1501.     {
  1502.         if(is_null($agentTimeZone) && is_null($agentTimeFormat)) {
  1503.             if(is_null($timeZone) && is_null($timeFormat)){
  1504.                 $dateTimeZone $dbTime;
  1505.                 $timeFormatString 'd-m-Y h:ia';
  1506.             } else {
  1507.                 $dateTimeZone $dbTime->setTimezone(new \DateTimeZone($timeZone));
  1508.                 $timeFormatString $timeFormat;
  1509.             }
  1510.         } else {
  1511.             $dateTimeZone $dbTime->setTimezone(new \DateTimeZone($agentTimeZone));
  1512.             $timeFormatString $agentTimeFormat;
  1513.         }
  1514.         $time['dateTimeZone'] = $dateTimeZone;
  1515.         $time['timeFormatString'] = $timeFormatString;
  1516.         return $time;
  1517.     }
  1518.     
  1519.     public function isTicketAccessGranted(Ticket $ticketUser $user null$firewall 'members')
  1520.     {
  1521.         // @TODO: Take current firewall into consideration (access check on behalf of agent/customer)
  1522.         if (empty($user)) {
  1523.             $user $this->container->get('user.service')->getSessionUser();
  1524.         }
  1525.         if (empty($user)) {
  1526.             return false;
  1527.         } else {
  1528.             $agentInstance $user->getAgentInstance();
  1529.     
  1530.             if (empty($agentInstance)) {
  1531.                 return false;
  1532.             }
  1533.         }
  1534.         if ($agentInstance->getSupportRole()->getId() == && in_array($agentInstance->getTicketAccessLevel(), [234])) {
  1535.             $accessLevel $agentInstance->getTicketAccessLevel();
  1536.             // Check if user has been given inidividual access
  1537.             if ($ticket->getAgent() != null && $ticket->getAgent()->getId() == $user->getId()) {
  1538.                 return true;
  1539.             }
  1540.             
  1541.             if ($accessLevel == || $accessLevel == 3) {
  1542.                 // Check if user belongs to a support team assigned to ticket
  1543.                 $teamReferenceIds array_map(function ($team) { return $team->getId(); }, $agentInstance->getSupportTeams()->toArray());
  1544.                 
  1545.                 if ($ticket->getSupportTeam() != null && in_array($ticket->getSupportTeam()->getId(), $teamReferenceIds)) {
  1546.                     return true;
  1547.                 } else if ($accessLevel == 2) {
  1548.                     // Check if user belongs to a support group assigned to ticket
  1549.                     $groupReferenceIds array_map(function ($group) { return $group->getId(); }, $agentInstance->getSupportGroups()->toArray());
  1550.                     if ($ticket->getSupportGroup() != null && in_array($ticket->getSupportGroup()->getId(), $groupReferenceIds)) {
  1551.                         return true;
  1552.                     }
  1553.                 }
  1554.             }
  1555.             return false;
  1556.         }
  1557.         return true;
  1558.     }
  1559.     public function addTicketCustomFields($thread$requestCustomFields = [], $filesCustomFields = [])
  1560.     {
  1561.         $ticket $thread->getTicket();
  1562.         $skipFileUpload false;
  1563.         $customFieldsCollection $this->entityManager->getRepository('UVDeskFormComponentPackage:CustomFields')->findAll();
  1564.         foreach ($customFieldsCollection as $customFields) {
  1565.             if(in_array($customFields->getFieldType(), ['select''checkbox''radio']) && !count($customFields->getCustomFieldValues()))
  1566.                 continue;
  1567.             elseif('file' != $customFields->getFieldType() && $requestCustomFields && array_key_exists($customFields->getId(), $requestCustomFields) && $requestCustomFields[$customFields->getId()]) {
  1568.                 if(count($customFields->getCustomFieldsDependency()) && !in_array($ticket->getType(), $customFields->getCustomFieldsDependency()->toArray()))
  1569.                     continue;
  1570.                 $ticketCustomField = new Entity\TicketCustomFieldsValues();
  1571.                 $ticketCustomField->setTicket($ticket);
  1572.                 //custom field
  1573.                 $ticketCustomField->setTicketCustomFieldsValues($customFields);
  1574.                 $ticketCustomField->setValue(json_encode($requestCustomFields[$customFields->getId()]));
  1575.                 if(in_array($customFields->getFieldType(), ['select''checkbox''radio'])) {
  1576.                     //add custom field values mapping too
  1577.                     if(is_array($requestCustomFields[$customFields->getId()])) {
  1578.                         foreach ($requestCustomFields[$customFields->getId()] as $value) {
  1579.                             if($ticketCustomFieldValues $this->entityManager->getRepository('UVDeskFormComponentPackage:CustomFieldsValues')
  1580.                                 ->findOneBy(['customFields' => $customFields'id' => $value]))
  1581.                                 $ticketCustomField->setTicketCustomFieldValueValues($ticketCustomFieldValues);
  1582.                         }
  1583.                     } elseif($ticketCustomFieldValues $this->entityManager->getRepository('UVDeskFormComponentPackage:CustomFieldsValues')
  1584.                             ->findOneBy(['customFields' => $customFields'id' => $requestCustomFields[$customFields->getId()]]))                                                        
  1585.                         $ticketCustomField->setTicketCustomFieldValueValues($ticketCustomFieldValues);
  1586.                 }
  1587.                 $this->entityManager->persist($ticketCustomField);
  1588.                 $this->entityManager->flush();
  1589.             } elseif($filesCustomFields && array_key_exists($customFields->getId(), $filesCustomFields) && $filesCustomFields[$customFields->getId()] && !$skipFileUpload) {
  1590.                 $skipFileUpload true;
  1591.                 //upload files
  1592.             
  1593.                 $path '/custom-fields/ticket/' $ticket->getId() . '/';
  1594.                 $fileNames $this->fileUploadService->uploadFile($filesCustomFields[$customFields->getid()], $pathtrue);
  1595.                 if(!empty($fileNames)) {
  1596.                     //save files entry to attachment table
  1597.                     $newFilesNames $this->customFieldsService->addFilesEntryToAttachmentTable([$fileNames], $thread);
  1598.                     foreach ($newFilesNames as $value) {
  1599.                         $ticketCustomField = new Entity\TicketCustomFieldsValues();
  1600.                         $ticketCustomField->setTicket($ticket);
  1601.                         //custom field
  1602.                         $ticketCustomField->setTicketCustomFieldsValues($customFields);
  1603.                         $ticketCustomField->setValue(json_encode(['name' => $value['name'], 'path' => $value['path'], 'id' => $value['id']]));
  1604.                         $this->entityManager->persist($ticketCustomField);
  1605.                         $this->entityManager->flush();
  1606.                     }
  1607.                 }
  1608.             }
  1609.         }
  1610.     }
  1611.     /**
  1612.     * return ticket todo ticket increment Id
  1613.     */
  1614.     public function getTicketTodoById($ticketId) {
  1615.         $currentUser $this->container->get('user.service')->getCurrentUser();
  1616.         $qb $this->entityManager->createQueryBuilder();
  1617.         $qb->select('td')->from('UVDeskTodoListPackage:Todo''td')
  1618.                 ->andwhere('td.ticket = :ticketId')
  1619.                 ->andwhere('td.agent = :userId')
  1620.                 ->setParameter('ticketId'$ticketId)
  1621.                 ->setParameter('userId'$currentUser->getId());
  1622.         return $qb->getQuery()->getArrayResult();
  1623.     }
  1624. }