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

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