vendor/uvdesk/core-framework/Repository/TicketRepository.php line 464

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Repository;
  3. use Doctrine\ORM\Query;
  4. use Doctrine\ORM\QueryBuilder;
  5. use Doctrine\Common\Collections\Criteria;
  6. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  7. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity\TicketType;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Tag;
  10. use Symfony\Component\HttpFoundation\ParameterBag;
  11. use Symfony\Component\DependencyInjection\ContainerInterface;
  12. /**
  13.  * TicketRepository
  14.  *
  15.  * This class was generated by the Doctrine ORM. Add your own custom
  16.  * repository methods below.
  17.  */
  18. class TicketRepository extends \Doctrine\ORM\EntityRepository
  19. {
  20.     const LIMIT 15;
  21.     const TICKET_GLOBAL_ACCESS 1;
  22.     const TICKET_GROUP_ACCESS 2;
  23.     const TICKET_TEAM_ACCESS  3;
  24.     const DEFAULT_PAGINATION_LIMIT 15;
  25.     private $container;
  26.     private $requestStack;
  27.     private $safeFields = ['page''limit''sort''order''direction'];
  28.     public function getTicketLabelCollection(Ticket $ticketUser $user)
  29.     {
  30.         // $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  31.         //     ->select("DISTINCT supportLabel.id, supportLabel.name, supportLabel.colorCode as color")
  32.         //     ->from(Ticket::class, 'ticket')
  33.         //     ->leftJoin('ticket.supportLabels', 'supportLabel')
  34.         //     // ->leftJoin('supportLabel.user', 'user')
  35.         //     ->where('ticket.id = :ticketId')->setParameter('ticketId', $ticket->getId())
  36.         //     ->andWhere('supportLabel.user = :user')->setParameter('user', $user);
  37.         return [];
  38.     }
  39.     public function getAllTickets(ParameterBag $obj null$container$actAsUser null)
  40.     {
  41.         $currentUser $actAsUser ? : $container->get('user.service')->getCurrentUser();
  42.         $json = array();
  43.         $qb $this->getEntityManager()->createQueryBuilder();
  44.         $qb->select('DISTINCT t,gr,pr,tp,s,a.id as agentId,c.id as customerId')->from($this->getEntityName(), 't');
  45.         $qb->leftJoin('t.agent''a');
  46.         $qb->leftJoin('a.userInstance''ad');
  47.         $qb->leftJoin('t.status''s');
  48.         $qb->leftJoin('t.customer''c');
  49.         $qb->leftJoin('t.supportGroup''gr');
  50.         $qb->leftJoin('t.priority''pr');
  51.         $qb->leftJoin('t.type''tp');
  52.         $qb->addSelect("CONCAT(a.firstName,' ', a.lastName) AS name");
  53.         $qb->andwhere("t.agent IS NULL OR ad.supportRole != 4");
  54.         $data $obj $obj->all() : [];
  55.         $data array_reverse($data);
  56.         $groupIds = [];
  57.         if(isset($data['agent'])) {
  58.             $query $this->getEntityManager()->createQueryBuilder()
  59.                 ->select('ug.id')->from(User::class, 'u'
  60.                 ->leftJoin('u.userInstance','userInstance')
  61.                 ->leftJoin('userInstance.supportGroups','ug')
  62.                 ->andwhere('u.id = :userId')
  63.                 ->setParameter('userId'$data['agent'])
  64.                 ->andwhere('ug.isActive = 1');
  65.             $groupIds array_map('current'$query->getQuery()->getResult());
  66.         } 
  67.         foreach ($data as $key => $value) {
  68.             if(!in_array($key,$this->safeFields)) {
  69.                 if(isset($data['search']) && $key == 'search') {
  70.                     $qb->andwhere("t.subject LIKE :subject OR a.email LIKE :agentName OR t.id LIKE :ticketId");
  71.                     $qb->setParameter('subject''%'.urldecode($value).'%');
  72.                     $qb->setParameter('agentName''%'.urldecode($value).'%');
  73.                     $qb->setParameter('ticketId''%'.urldecode($value).'%');
  74.                 } elseif($key == 'status') {
  75.                     $qb->andwhere('t.status = '.intval($value));
  76.                 }
  77.                 if(isset($data['agent']) && $key == 'agent') {
  78.                     $qb->andWhere("a.id = :agentID OR gr.id IN(:supportGroupIds)");
  79.                     $qb->setParameter('agentID',intval($value));
  80.                     $qb->setParameter('supportGroupIds'$groupIds);
  81.                 }
  82.             }
  83.         }
  84.         $qb->andwhere('t.isTrashed != 1');
  85.         if(!isset($data['sort'])) {
  86.             $qb->orderBy('t.id',Criteria::DESC);
  87.         }
  88.         if(isset($data['sort']) && $data['sort'] == "t.updatedAt") {
  89.             $qb->orderBy('t.updatedAt',Criteria::DESC);
  90.         }
  91.         $paginator $container->get('knp_paginator');
  92.         $newQb = clone $qb;
  93.         $newQb->select('COUNT(DISTINCT t.id)');
  94.         $results $paginator->paginate(
  95.             $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count'$newQb->getQuery()->getSingleScalarResult()),
  96.             isset($data['page']) ? $data['page'] : 1,
  97.             isset($data['limit']) && !empty($data['limit']) ? $data['limit'] : self::LIMIT,
  98.             array('distinct' => true)
  99.         );
  100.         $paginationData $results->getPaginationData();
  101.         $queryParameters $results->getParams();
  102.         $queryParameters['page'] = "replacePage";
  103.         $paginationData['url'] = '#'.$container->get('uvdesk.service')->buildPaginationQuery($queryParameters);
  104.         $data = array();
  105.         $userService $container->get('user.service');
  106.         $ticketService $container->get('ticket.service');
  107.         $translatorService $container->get('translator');
  108.         foreach ($results as $key => $ticket) {
  109.          //   $ticket[0]['status']['description'] = $translatorService->trans($ticket[0]['status']['description']);
  110.             $data[] = [
  111.                 'id' => $ticket[0]['id'],
  112.                 'subject' => $ticket[0]['subject'],
  113.                 'isCustomerView' => $ticket[0]['isCustomerViewed'],
  114.                 'status' => $ticket[0]['status'],
  115.                 'source' => $ticket[0]['source'],
  116.                 'isStarred' => $ticket[0]['isStarred'],
  117.                 'group' => $ticket[0]['supportGroup'],
  118.                 'type' => $ticket[0]['type'],
  119.                 'priority' => $ticket[0]['priority'],
  120.                 'formatedCreatedAt' => $userService->convertToTimezone($ticket[0]['createdAt']),
  121.                 'totalThreads' => $ticketService->getTicketTotalThreads($ticket[0]['id']),
  122.                 'agent' => $ticket['agentId'] ? $userService->getAgentDetailById($ticket['agentId']) : null,
  123.                 'customer' => $ticket['customerId'] ? $userService->getCustomerPartialDetailById($ticket['customerId']) : null,
  124.                 // 'hasAttachments' => $ticketService->hasAttachments($ticket[0]['id'])
  125.             ];
  126.         }
  127.         $json['tickets'] = $data;
  128.         $json['pagination'] = $paginationData;
  129.         return $json;
  130.     }
  131.     public function getAllCustomerTickets(ParameterBag $obj null$container$actAsUser null)
  132.     {
  133.         $currentUser $actAsUser ? : $container->get('user.service')->getCurrentUser();
  134.         $json = array();
  135.         $qb $this->getEntityManager()->createQueryBuilder();
  136.         $qb->select('DISTINCT t,gr,pr,tp,s,a.id as agentId,c.id as customerId')->from($this->getEntityName(), 't');
  137.         $qb->leftJoin('t.agent''a');
  138.         $qb->leftJoin('a.userInstance''ad');
  139.         $qb->leftJoin('t.status''s');
  140.         $qb->leftJoin('t.customer''c');
  141.         $qb->leftJoin('t.supportGroup''gr');
  142.         $qb->leftJoin('t.priority''pr');
  143.         $qb->leftJoin('t.type''tp');
  144.         $qb->leftJoin('t.collaborators''tc');
  145.         $qb->addSelect("CONCAT(a.firstName,' ', a.lastName) AS name");
  146.         $qb->andwhere("t.agent IS NULL OR ad.supportRole != 4");
  147.         $data $obj->all();
  148.         $data array_reverse($data);
  149.         foreach ($data as $key => $value) {
  150.             if(!in_array($key,$this->safeFields)) {
  151.                 if(isset($data['search']) && $key == 'search') {
  152.                     $qb->andwhere("t.subject LIKE :subject OR a.email LIKE :agentName OR t.id LIKE :ticketId");
  153.                     $qb->setParameter('subject''%'.urldecode($value).'%');
  154.                     $qb->setParameter('agentName''%'.urldecode($value).'%');
  155.                     $qb->setParameter('ticketId''%'.urldecode($value).'%');
  156.                 } elseif($key == 'status') {
  157.                     $qb->andwhere('t.status = '.intval($value));
  158.                 }
  159.             }
  160.         }
  161.         $qb->andwhere('t.customer = :customerId OR tc.id =:collaboratorId');
  162.         $qb->setParameter('customerId'$currentUser->getId());
  163.         $qb->setParameter('collaboratorId'$currentUser->getId());
  164.         $qb->andwhere('t.isTrashed != 1');
  165.         if(!isset($data['sort'])) {
  166.             $qb->orderBy('t.id',Criteria::DESC);
  167.         }
  168.         $paginator $container->get('knp_paginator');
  169.         $newQb = clone $qb;
  170.         $newQb->select('COUNT(DISTINCT t.id)');
  171.         $results $paginator->paginate(
  172.             $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count'$newQb->getQuery()->getSingleScalarResult()),
  173.             isset($data['page']) ? $data['page'] : 1,
  174.             self::LIMIT,
  175.             array('distinct' => true)
  176.         );
  177.         $paginationData $results->getPaginationData();
  178.         $queryParameters $results->getParams();
  179.         $queryParameters['page'] = "replacePage";
  180.         $paginationData['url'] = '#'.$container->get('uvdesk.service')->buildPaginationQuery($queryParameters);
  181.         $data = array();
  182.         $userService $container->get('user.service');
  183.         $ticketService $container->get('ticket.service');
  184.         $translatorService $container->get('translator');
  185.         foreach ($results as $key => $ticket) {
  186.             $ticket[0]['status']['code'] = $translatorService->trans($ticket[0]['status']['code']);
  187.             $data[] = [
  188.                 'id' => $ticket[0]['id'],
  189.                 'subject' => $ticket[0]['subject'],
  190.                 'isCustomerView' => $ticket[0]['isCustomerViewed'],
  191.                 'status' => $ticket[0]['status'],
  192.                 'group' => $ticket[0]['supportGroup'],
  193.                 'type' => $ticket[0]['type'],
  194.                 'priority' => $ticket[0]['priority'],
  195.                 'totalThreads' => $ticketService->getTicketTotalThreads($ticket[0]['id']),
  196.                 'agent' => $ticket['agentId'] ? $userService->getAgentDetailById($ticket['agentId']) : null,
  197.                 'customer' => $ticket['customerId'] ? $userService->getCustomerPartialDetailById($ticket['customerId']) : null,
  198.                 'formatedCreatedAt' => $userService->getLocalizedFormattedTime($ticket[0]['createdAt'],$userService->getSessionUser()),
  199.             ];
  200.         }
  201.         $json['tickets'] = $data;
  202.         $json['pagination'] = $paginationData;
  203.         return $json;
  204.     }
  205.     public function addPermissionFilter($qbUser $user, array $supportGroupReferences = [], array $supportTeamReferences = [])
  206.     {
  207.         $userInstance $user->getAgentInstance();
  208.         if (!empty($userInstance) && ('ROLE_AGENT' == $userInstance->getSupportRole()->getCode() && $userInstance->getTicketAccesslevel() != self::TICKET_GLOBAL_ACCESS)) {
  209.             $qualifiedGroups = empty($this->params['group']) ? $supportGroupReferences array_intersect($supportGroupReferencesexplode(','$this->params['group']));
  210.             $qualifiedTeams = empty($this->params['team']) ? $supportTeamReferences array_intersect($supportTeamReferencesexplode(','$this->params['team']));
  211.             switch ($userInstance->getTicketAccesslevel()) {
  212.                 case self::TICKET_GROUP_ACCESS:
  213.                     $qb
  214.                         ->andWhere("ticket.agent = :agentId OR supportGroup.id IN(:supportGroupIds) OR supportTeam.id IN(:supportTeamIds)")
  215.                         ->setParameter('agentId'$user->getId())
  216.                         ->setParameter('supportGroupIds'$qualifiedGroups)
  217.                         ->setParameter('supportTeamIds'$qualifiedTeams);
  218.                     break;
  219.                 case self::TICKET_TEAM_ACCESS:
  220.                     $qb
  221.                         ->andWhere("ticket.agent = :agentId OR supportTeam.id IN(:supportTeamIds)")
  222.                         ->setParameter('agentId'$user->getId())
  223.                         ->setParameter('supportTeamIds'$qualifiedTeams);
  224.                     break;
  225.                 default:
  226.                     $qb
  227.                         ->andWhere("ticket.agent = :agentId")
  228.                         ->setParameter('agentId'$user->getId());
  229.                     break;
  230.             }
  231.         }
  232.         return $qb;
  233.     }
  234.     public function prepareBaseTicketQuery(User $user, array $supportGroupIds = [], array $supportTeamIds = [], array $params = [], bool $filterByStatus true)
  235.     {
  236.         $queryBuilder $this->getEntityManager()->createQueryBuilder()
  237.             ->select("
  238.                 DISTINCT ticket,
  239.                 supportGroup.name as groupName,
  240.                 supportTeam.name as teamName, 
  241.                 priority,
  242.                 type.code as typeName, 
  243.                 agent.id as agentId,
  244.                 agent.email as agentEmail,
  245.                 agentInstance.profileImagePath as smallThumbnail, 
  246.                 customer.id as customerId, 
  247.                 customer.email as customerEmail, 
  248.                 customerInstance.profileImagePath as customersmallThumbnail, 
  249.                 CONCAT(customer.firstName, ' ', customer.lastName) AS customerName, 
  250.                 CONCAT(agent.firstName,' ', agent.lastName) AS agentName
  251.             ")
  252.             ->from(Ticket::class, 'ticket')
  253.             ->leftJoin('ticket.type''type')
  254.             ->leftJoin('ticket.agent''agent')
  255.             ->leftJoin('ticket.threads''threads')
  256.             ->leftJoin('ticket.priority''priority')
  257.             ->leftJoin('ticket.customer''customer')
  258.             ->leftJoin('ticket.supportTeam''supportTeam')
  259.             ->leftJoin('ticket.supportTags''supportTags')
  260.             ->leftJoin('agent.userInstance''agentInstance')
  261.             ->leftJoin('ticket.supportLabels''supportLabel')
  262.             ->leftJoin('ticket.supportGroup''supportGroup')
  263.             ->leftJoin('customer.userInstance''customerInstance')
  264.             ->where('customerInstance.supportRole = 4')
  265.             ->andWhere("agent.id IS NULL OR agentInstance.supportRole != 4")
  266.             ->andWhere('ticket.isTrashed = :isTrashed')->setParameter('isTrashed', isset($params['trashed']) ? true false);
  267.         if (!isset($params['sort'])) {
  268.             $queryBuilder->orderBy('ticket.updatedAt'Criteria::DESC);
  269.         }
  270.         if ($filterByStatus) {
  271.             $queryBuilder->andWhere('ticket.status = :status')->setParameter('status', isset($params['status']) ? $params['status'] : 1);
  272.         }
  273.         $this->addPermissionFilter($queryBuilder$user$supportGroupIds$supportTeamIds);
  274.         // applyFilter according to params
  275.         return $this->prepareTicketListQueryWithParams($queryBuilder$params$user);
  276.     }
  277.     public function prepareBasePaginationTicketTypesQuery(array $params)
  278.     {
  279.         $queryBuilder $this->getEntityManager()->createQueryBuilder()
  280.             ->select("ticketType")
  281.             ->from(TicketType::class, 'ticketType');
  282.         // Apply filters
  283.         foreach ($params as $field => $fieldValue) {
  284.             if (in_array($field$this->safeFields)) {
  285.                 continue;
  286.             }
  287.             switch ($field) {
  288.                 case 'search':
  289.                     $queryBuilder->andwhere("ticketType.code LIKE :searchQuery OR ticketType.description LIKE :searchQuery");
  290.                     $queryBuilder->setParameter('searchQuery''%' urldecode(trim($fieldValue)) . '%');
  291.                     break;
  292.                 case 'isActive':
  293.                     $queryBuilder->andwhere("ticketType.isActive LIKE :searchQuery");
  294.                     $queryBuilder->setParameter('searchQuery''%' urldecode(trim($fieldValue)) . '%');
  295.                     break;
  296.                 default:
  297.                     break;
  298.             }
  299.         }
  300.         // Define sort by
  301.         if (empty($params['sort']) || 'a.id' == $params['sort']) {
  302.             $queryBuilder->orderBy('ticketType.id', (empty($params['direction']) || 'ASC' == strtoupper($params['direction'])) ? Criteria::ASC Criteria::DESC);
  303.         } else {
  304.             $queryBuilder->orderBy('ticketType.code', (empty($params['direction']) || 'ASC' == strtoupper($params['direction'])) ? Criteria::ASC Criteria::DESC);
  305.         }
  306.         return $queryBuilder;
  307.     }
  308.     public function prepareBasePaginationTagsQuery(array $params)
  309.     {
  310.         $queryBuilder $this->getEntityManager()->createQueryBuilder()
  311.             ->select('supportTag.id as id, supportTag.name as name, COUNT(ticket) as totalTickets')
  312.             ->from(Tag::class, 'supportTag')
  313.             ->leftJoin('supportTag.tickets''ticket')
  314.             ->groupBy('supportTag.id');
  315.         // Apply filters
  316.         foreach ($params as $field => $fieldValue) {
  317.             if (in_array($field$this->safeFields)) {
  318.                 continue;
  319.             }
  320.             switch ($field) {
  321.                 case 'search':
  322.                     $queryBuilder->andwhere("supportTag.name LIKE :searchQuery")->setParameter('searchQuery''%' urldecode(trim($fieldValue)) . '%');
  323.                     break;
  324.                 default:
  325.                     break;
  326.             }
  327.         }
  328.         // Define sort by
  329.         if (empty($params['sort']) || 'a.id' == $params['sort']) {
  330.             $queryBuilder->orderBy('supportTag.id', (empty($params['direction']) || 'ASC' == strtoupper($params['direction'])) ? Criteria::ASC Criteria::DESC);
  331.         } else {
  332.             $queryBuilder->orderBy('supportTag.name', (empty($params['direction']) || 'ASC' == strtoupper($params['direction'])) ? Criteria::ASC Criteria::DESC);
  333.         }
  334.         return $queryBuilder;
  335.     }
  336.     public function getTicketTabDetails(User $user, array $supportGroupIds = [], array $supportTeamIds = [], array $params = [], bool $filterByStatus true)
  337.     {
  338.         $data = array(=> 0=> 0=> 0=> 0=> 0=> 0);
  339.         
  340.         $queryBuilder $this->getEntityManager()->createQueryBuilder()
  341.             ->select("
  342.                 COUNT(DISTINCT ticket.id) as countTicket, 
  343.                 status.id as statusId, 
  344.                 status.code as tab
  345.             ")
  346.             ->from(Ticket::class, 'ticket')
  347.             ->leftJoin('ticket.type',   'type')
  348.             ->leftJoin('ticket.agent''agent')
  349.             ->leftJoin('ticket.status''status')
  350.             ->leftJoin('ticket.threads''threads')
  351.             ->leftJoin('ticket.priority''priority')
  352.             ->leftJoin('ticket.customer''customer')
  353.             ->leftJoin('ticket.supportTeam''supportTeam')
  354.             ->leftJoin('ticket.supportTags''supportTags')
  355.             ->leftJoin('ticket.supportGroup''supportGroup')
  356.             ->leftJoin('agent.userInstance''agentInstance')
  357.             ->leftJoin('ticket.supportLabels''supportLabel')
  358.             ->leftJoin('customer.userInstance''customerInstance')
  359.             ->where('customerInstance.supportRole = 4')
  360.             ->andWhere("agent.id IS NULL OR agentInstance.supportRole != 4")
  361.             ->andWhere('ticket.isTrashed = :isTrashed')->setParameter('isTrashed', isset($params['trashed']) ? true false)
  362.             ->groupBy('status');
  363.         // applyFilter according to permission
  364.         $this->addPermissionFilter($queryBuilder$user$supportGroupIds$supportTeamIds);
  365.         
  366.         $queryBuilder $this->prepareTicketListQueryWithParams($queryBuilder$params$user);
  367.         $results $queryBuilder->getQuery()->getResult();
  368.         foreach($results as $status) {
  369.             $data[$status['statusId']] += $status['countTicket'];
  370.         }
  371.         return $data;
  372.     }
  373.     public function countTicketTotalThreads($ticketId$threadType 'reply')
  374.     {
  375.         $totalThreads $this->getEntityManager()->createQueryBuilder()
  376.             ->select('COUNT(thread.id) as threads')
  377.             ->from(Ticket::class, 'ticket')
  378.             ->leftJoin('ticket.threads''thread')
  379.             ->where('ticket.id = :ticketId')->setParameter('ticketId'$ticketId)
  380.             ->andWhere('thread.threadType = :threadType')->setParameter('threadType'$threadType)
  381.             ->getQuery()->getSingleScalarResult();
  382.         
  383.         return (int) $totalThreads;
  384.     }
  385.     public function getTicketNavigationIteration($ticket$container)
  386.     {
  387.         $ticketsCollection $this->getEntityManager()->getRepository(Ticket::class)
  388.                    ->getAllTickets(null$container);
  389.         if ($ticketsCollection)
  390.             $results $ticketsCollection['tickets'];
  391.         $nextPrevPage = array('next' => 0,'prev' => 0);
  392.         for ($i 0$i count($results); $i++) {
  393.             if($results[$i]['id'] == $ticket->getId()) {
  394.                 $nextPrevPage['next'] = isset($results[$i 1]) ? $results[$i 1]['id'] : 0;
  395.                 $nextPrevPage['prev'] = isset($results[$i 1]) ? $results[$i 1]['id'] : 0;
  396.             }
  397.         }
  398.         return $nextPrevPage;
  399.     }
  400.     public function countCustomerTotalTickets(User $user$container)
  401.     {
  402.         $userService $container->get('user.service');
  403.         $queryBuilder $this->getEntityManager()->createQueryBuilder()
  404.             ->select('COUNT(ticket.id) as tickets')
  405.             ->from(Ticket::class, 'ticket')
  406.             ->leftJoin('ticket.priority''p')
  407.             ->leftJoin('ticket.status''s')
  408.             ->leftJoin('ticket.agent''a')
  409.             ->leftJoin('ticket.type''type')
  410.             ->leftJoin('ticket.supportGroup''supportGroup')
  411.             ->leftJoin('ticket.supportTeam''supportTeam')
  412.             ->leftJoin('a.userInstance''ad')
  413.             ->andWhere('ticket.customer = :customerId')
  414.             ->andWhere('ticket.isTrashed != 1')
  415.             ->setParameter('customerId'$user->getId())
  416.             ->andwhere("a IS NULL OR ad.supportRole != 4")
  417.             ->orderBy('ticket.id'Criteria::DESC);
  418.         $agent $userService->getCurrentUser();
  419.         $supportGroupReference $this->getEntityManager()->getRepository(User::class)->getUserSupportGroupReferences($agent);
  420.         $supportTeamReference  $this->getEntityManager()->getRepository(User::class)->getUserSupportTeamReferences($agent);
  421.         
  422.         $this->addPermissionFilter($queryBuilder$agent$supportGroupReference$supportTeamReference);
  423.         return (int) $queryBuilder->getQuery()->getSingleScalarResult();
  424.     }
  425.     public function isLabelAlreadyAdded($ticket,$label)
  426.     {
  427.         $qb $this->getEntityManager()->createQueryBuilder();
  428.         $qb->select('COUNT(t.id) as ticketCount')->from(Ticket::class, 't')
  429.                 ->leftJoin('t.supportLabels','tl')
  430.                 ->andwhere('tl.id = :labelId')
  431.                 ->andwhere('t.id = :ticketId')
  432.                 ->setParameter('labelId',$label->getId())
  433.                 ->setParameter('ticketId',$ticket->getId());
  434.         return $qb->getQuery()->getSingleScalarResult() ? true false;
  435.     }
  436.     public function isTicketCollaborator($ticket$collaboratorEmail)
  437.     {
  438.         if ($ticket->getCollaborators()) {
  439.             foreach ($ticket->getCollaborators() as $collaborator) {
  440.                 if (strtolower($collaborator->getEmail()) == strtolower($collaboratorEmail)) {
  441.                     return true;
  442.                 }
  443.             }
  444.         }
  445.         return false;
  446.     }
  447.     public function getTicketDetails(ParameterBag $obj null$container)
  448.     {
  449.         $data $obj->all();
  450.         $userService $container->get('user.service');
  451.         $ticketService $container->get('ticket.service');
  452.         $json = [];
  453.         $qb $this->getEntityManager()->createQueryBuilder();
  454.         $qb->select('DISTINCT t,gr.name as groupName,supportTeam.name as supportTeamName,tp.code as typeName,s,pr,a.id as agentId,c.id as customerId')->from($this->getEntityName(), 't')
  455.                 ->leftJoin('t.agent''a')
  456.                 ->leftJoin('t.status''s')
  457.                 ->leftJoin('t.customer''c')
  458.                 ->leftJoin('t.supportGroup''gr')
  459.                 ->leftJoin('t.supportTeam''supportTeam')
  460.                 ->leftJoin('t.priority''pr')
  461.                 ->leftJoin('t.type''tp')
  462.                 ->leftJoin('c.userInstance''cd')
  463.                 ->leftJoin('a.userInstance''ad')
  464.                 ->leftJoin('t.supportTags''tg')
  465.                 ->leftJoin('t.supportLabels''tl')
  466.                 ->andwhere('t.id = :ticketId')
  467.                 ->setParameter('ticketId'$data['ticketId']);
  468.         $results $qb->getQuery()->getArrayResult();
  469.         $ticket array_shift($results);
  470.         
  471.         return [
  472.             'id' => $ticket[0]['id'],
  473.             'subject' => $ticket[0]['subject'],
  474.             'isStarred' => $ticket[0]['isStarred'],
  475.             'isAgentView' => $ticket[0]['isAgentViewed'],
  476.             'isAgentCustomViewed' => $ticket[0]['isAgentCustomViewed'],
  477.             'isTrashed' => $ticket[0]['isTrashed'],
  478.             'status' => $ticket[0]['status'],
  479.             'groupName' => $ticket['groupName'],
  480.             'subGroupName' => $ticket['supportTeamName'],
  481.             'typeName' => $ticket['typeName'],
  482.             'priority' => $ticket[0]['priority'],
  483.             'formatedCreatedAt' => $ticketService->timeZoneConverter($ticket[0]['createdAt']),      
  484.             'ticketLabels' => $ticketService->getTicketLabels($ticket[0]['id']),
  485.             'totalThreads' => $ticketService->getTicketTotalThreads($ticket[0]['id']),
  486.             'agent' => $ticket['agentId'] ? $userService->getAgentDetailById($ticket['agentId']) : null,
  487.             'customer' => $ticket['customerId'] ? $userService->getCustomerPartialDetailById($ticket['customerId']) : null,
  488.             'lastReplyAgentName' => $ticketService->getlastReplyAgentName($ticket[0]['id']),
  489.             'createThread' => $ticketService->getCreateReply($ticket[0]['id']),
  490.             'lastReply' => $ticketService->getLastReply($ticket[0]['id']),
  491.         ];
  492.     }
  493.     // Get customer more ticket sidebar details
  494.     public function getCustomerMoreTicketsSidebar($customerId$container$request) {
  495.         $userService $container->get('user.service');
  496.         $ticketService $container->get('ticket.service');
  497.         $qb $this->getEntityManager()->createQueryBuilder();
  498.         $qb->select("DISTINCT ticket as tickets,s.code as statusName, supportTeam.name as teamName,supportGroup.name as groupName, p.code as priorityName, p.colorCode as priorityColor, type.code as typeName, a.id as agentId, CONCAT(a.firstName, ' ', a.lastName) AS agentName")
  499.                 ->from($this->getEntityName(), 'ticket')
  500.                 ->leftJoin('ticket.priority''p')
  501.                 ->leftJoin('ticket.status''s')
  502.                 ->leftJoin('ticket.agent''a')
  503.                 ->leftJoin('ticket.type''type')
  504.                 ->leftJoin('ticket.supportGroup''supportGroup')
  505.                 ->leftJoin('ticket.supportTeam''supportTeam')
  506.                 ->leftJoin('a.userInstance''ad')
  507.                 ->andWhere('ticket.customer = :customerId')
  508.                 ->andWhere('ticket.isTrashed != 1')
  509.                 ->setParameter('customerId'$customerId)
  510.                 ->andwhere("a IS NULL OR ad.supportRole != 4")
  511.                 ->orderBy('ticket.id'Criteria::DESC);
  512.         $user $userService->getCurrentUser();
  513.         $supportGroupReference $this->getEntityManager()->getRepository(User::class)->getUserSupportGroupReferences($user);
  514.         $supportTeamReference  $this->getEntityManager()->getRepository(User::class)->getUserSupportTeamReferences($user);
  515.         // if($currentUser->getRole() == "ROLE_AGENT" && $currentUser->detail['agent']->getTicketView() != UserData::GLOBAL_ACCESS) {
  516.         //     $this->em->getRepository('WebkulTicketBundle:Ticket')->addPermissionFilter($qb, $this->container, false);
  517.         //     $qb->addSelect('gr.name as groupName');
  518.         // } else {
  519.         //     $qb->leftJoin('t.supportGroup', 'gr');
  520.         //     $qb->addSelect('gr.name as groupName');
  521.         // }
  522.         $this->addPermissionFilter($qb$user$supportGroupReference$supportTeamReference);
  523.        
  524.         $results $qb->getQuery()->getArrayResult();
  525.         foreach ($results as $key => $ticket) {
  526.             $results[$key] = $ticket['tickets'];
  527.             unset($ticket['tickets']);
  528.             $results[$key] = array_merge($results[$key], $ticket);
  529.             $results[$key]['timestamp']= $userService->convertToTimezone($results[$key]['createdAt']);
  530.             $results[$key]['formatedCreatedAt'] = $results[$key]['createdAt']->format('d-m-Y H:i A');
  531.             $results[$key]['totalThreads']= $ticketService->getTicketTotalThreads($results[$key]['id']);
  532.             
  533.         }
  534.         return $results;
  535.     }
  536.     public function prepareTicketListQueryWithParams($queryBuilder$params$actAsUser null)
  537.     {
  538.         foreach ($params as $field => $fieldValue) {
  539.             if (in_array($field$this->safeFields)) {
  540.                 continue;
  541.             }
  542.             if($actAsUser != null ) {
  543.                 $userInstance $actAsUser->getAgentInstance();
  544.                 if (!empty($userInstance) && ('ROLE_AGENT' == $userInstance->getSupportRole()->getCode() && $field == 'mine') || ('ROLE_ADMIN' == $userInstance->getSupportRole()->getCode()) && $field == 'mine') {
  545.                     $fieldValue $actAsUser->getId();
  546.                 }
  547.             } 
  548.             switch ($field) {
  549.                 case 'label':
  550.                     $queryBuilder->andwhere('supportLabel.id = :labelIds');
  551.                     $queryBuilder->setParameter('labelIds'$fieldValue);
  552.                     break;
  553.                 case 'starred':
  554.                     $queryBuilder->andWhere('ticket.isStarred = 1');
  555.                     break;
  556.                 case 'search':
  557.                     $value trim($fieldValue);
  558.                     $queryBuilder->andwhere("ticket.subject LIKE :search OR ticket.id  LIKE :search OR customer.email LIKE :search OR CONCAT(customer.firstName,' ', customer.lastName) LIKE :search OR agent.email LIKE :search OR CONCAT(agent.firstName,' ', agent.lastName) LIKE :search");
  559.                     $queryBuilder->setParameter('search''%'.urldecode($value).'%');
  560.                     break;
  561.                 case 'unassigned':
  562.                     $queryBuilder->andWhere("agent.id is NULL");
  563.                     break;
  564.                 case 'notreplied':
  565.                     $queryBuilder->andWhere('ticket.isReplied = 0');
  566.                     break;
  567.                 case 'mine':
  568.                     $queryBuilder->andWhere('agent = :agentId')->setParameter('agentId'$fieldValue);
  569.                     break;
  570.                 case 'new':
  571.                     $queryBuilder->andwhere('ticket.isNew = 1');
  572.                     break;
  573.                 case 'priority':
  574.                     $queryBuilder->andwhere('priority.id = :priority')->setParameter('priority'$fieldValue);
  575.                     break;
  576.                 case 'type':
  577.                     $queryBuilder->andwhere('type.id IN (:typeCollection)')->setParameter('typeCollection'explode(','$fieldValue));
  578.                     break;
  579.                 case 'agent':
  580.                     $queryBuilder->andwhere('agent.id IN (:agentCollection)')->setParameter('agentCollection'explode(','$fieldValue));
  581.                     break;
  582.                 case 'customer':
  583.                     $queryBuilder->andwhere('customer.id IN (:customerCollection)')->setParameter('customerCollection'explode(','$fieldValue));
  584.                     break;
  585.                 case 'group':
  586.                     $queryBuilder->andwhere('supportGroup.id IN (:groupIds)');
  587.                     $queryBuilder->setParameter('groupIds'explode(','$fieldValue));
  588.                     break;
  589.                 case 'team':
  590.                     $queryBuilder->andwhere("supportTeam.id In(:subGrpKeys)");
  591.                     $queryBuilder->setParameter('subGrpKeys'explode(','$fieldValue));
  592.                     break;
  593.                 case 'tag':
  594.                     $queryBuilder->andwhere("supportTags.id In(:tagIds)");
  595.                     $queryBuilder->setParameter('tagIds'explode(','$fieldValue));
  596.                     break;
  597.                 case 'source':
  598.                     $queryBuilder->andwhere('ticket.source IN (:sources)');
  599.                     $queryBuilder->setParameter('sources'explode(','$fieldValue));
  600.                     break;
  601.                 case 'after':
  602.                     $date \DateTime::createFromFormat('d-m-Y H:i'$fieldValue.' 23:59');
  603.                     if ($date) {
  604.                        // $date = \DateTime::createFromFormat('d-m-Y H:i', $this->userService->convertTimezoneToServer($date, 'd-m-Y H:i'));
  605.                         $queryBuilder->andwhere('ticket.createdAt > :afterDate');
  606.                         $queryBuilder->setParameter('afterDate'$date);
  607.                     }
  608.                     break;
  609.                 case 'before':
  610.                     $date \DateTime::createFromFormat('d-m-Y H:i'$fieldValue.' 00:00');
  611.                     if ($date) {
  612.                         //$date = \DateTime::createFromFormat('d-m-Y H:i', $container->get('user.service')->convertTimezoneToServer($date, 'd-m-Y H:i'));
  613.                         $queryBuilder->andwhere('ticket.createdAt < :beforeDate');
  614.                         $queryBuilder->setParameter('beforeDate'$date);
  615.                     }
  616.                     break;
  617.                 case 'repliesLess':
  618.                     $queryBuilder->andWhere('threads.threadType = :threadType')->setParameter('threadType''reply')
  619.                         ->groupBy('ticket.id')
  620.                         ->andHaving('count(threads.id) < :threadValueLesser')->setParameter('threadValueLesser'intval($params['repliesLess']));
  621.                     break;
  622.                 case 'repliesMore':
  623.                     $queryBuilder->andWhere('threads.threadType = :threadType')->setParameter('threadType''reply')
  624.                         ->groupBy('ticket.id')
  625.                         ->andHaving('count(threads.id) > :threadValueGreater')->setParameter('threadValueGreater'intval($params['repliesMore']));
  626.                     break;
  627.                 case 'mailbox':
  628.                         $queryBuilder->andwhere('ticket.mailboxEmail IN (:mailboxEmails)');
  629.                         $queryBuilder->setParameter('mailboxEmails'explode(','$fieldValue));
  630.                     break;
  631.                 default:
  632.                     break;
  633.             }
  634.         }
  635.         return $queryBuilder;
  636.     }
  637.     public function getAgentTickets($agentId,$container) {
  638.         $qb $this->getEntityManager()->createQueryBuilder();
  639.         $qb->select('t')->from(Ticket::class, 't');
  640.         $qb->andwhere('t.agent = :agentId');
  641.         $qb->setParameter('agentId',$agentId);
  642.         return $qb->getQuery()->getResult();
  643.     }
  644. }