src/webkul/uvdesk/core-framework/Repository/TicketRepository.php line 46

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