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

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