vendor/uvdesk/core-framework/Repository/TicketRatingRepository.php line 124

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\TicketRating;
  9. use Symfony\Component\HttpFoundation\ParameterBag;
  10. use Symfony\Component\DependencyInjection\ContainerInterface;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. /**
  14. * TicketRatingRepository
  15. *
  16. * This class was generated by the Doctrine ORM. Add your own custom
  17. * repository methods below.
  18. */
  19. class TicketRatingRepository extends \Doctrine\ORM\EntityRepository
  20. {
  21. public $safeFields = array('page','limit','sort','order','direction');
  22. const LIMIT = 10;
  23. private $container;
  24. public function getRatedTicketList(\Symfony\Component\HttpFoundation\ParameterBag $obj = null, $container) {
  25. $data = array_reverse($obj->all());
  26. $userService = $container->get('user.service');
  27. $startDate = $userService->convertToTimezone(new \DateTime($data['start']),'Y-m-d');
  28. $endDate = $userService->convertToTimezone(new \DateTime($data['end']),'Y-m-d');
  29. $json = array();
  30. $qb = $this->getEntityManager()->createQueryBuilder();
  31. $qb->select('r,c.id as customerId,c.email,cd.profileImagePath as smallThumbnail,t.id as ticketId')->from($this->getEntityName(), 'r')
  32. ->leftJoin('r.ticket', 't')
  33. ->leftJoin('t.agent', 'a')
  34. ->leftJoin('t.customer', 'tc')
  35. ->leftJoin('t.supportGroup', 'gr')
  36. ->leftJoin('t.supportTeam', 'te')
  37. ->leftJoin('t.priority', 'pr')
  38. ->leftJoin('t.type', 'tp')
  39. ->leftJoin('r.customer', 'c')
  40. ->leftJoin('c.userInstance', 'cd')
  41. ->addSelect("CONCAT(c.firstName,' ', c.lastName) AS name")
  42. ->where('r.createdAt BETWEEN :startDate AND :endDate')
  43. ->setParameter('startDate', $startDate." 00:00:01")
  44. ->setParameter('endDate', $endDate." 23:59:59")
  45. ->andWhere('t.isTrashed != 1')
  46. ->andWhere('cd.supportRole = 4');
  47. $container->get('report.service')->addPermissionFilter($qb, $container);
  48. if (isset($data['priority'])) {
  49. $qb->andWhere('pr.id IN (:priorityIds)');
  50. $qb->setParameter('priorityIds', explode(',', $data['priority']));
  51. }
  52. if (isset($data['type'])) {
  53. $qb->andWhere('tp.id IN (:typeIds)');
  54. $qb->setParameter('typeIds', explode(',', $data['type']));
  55. }
  56. if (isset($data['agent'])) {
  57. $qb->andWhere('a.id IN (:agentIds)');
  58. $qb->setParameter('agentIds', explode(',', $data['agent']));
  59. }
  60. if (isset($data['customer'])) {
  61. $qb->andWhere('tc.id IN (:customerIds)');
  62. $qb->setParameter('customerIds', explode(',', $data['customer']));
  63. }
  64. if (isset($data['group'])) {
  65. $qb->andWhere('gr.id IN (:groupIds)');
  66. $qb->setParameter('groupIds', explode(',', $data['group']));
  67. }
  68. if (isset($data['team'])) {
  69. $qb->andWhere('te.id IN (:teamIds)');
  70. $qb->setParameter('teamIds', explode(',', $data['team']));
  71. }
  72. if (isset($data['source'])) {
  73. $qb->andWhere('t.source IN (:sources)');
  74. $qb->setParameter('sources', explode(',', $data['source']));
  75. }
  76. if (!isset($data['sort'])){
  77. $qb->orderBy('r.createdAt',Criteria::DESC);
  78. }
  79. $paginator = $container->get('knp_paginator');
  80. $newQb = clone $qb;
  81. $newQb->select('DISTINCT r.id');
  82. $results = $paginator->paginate(
  83. $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count', count($newQb->getQuery()->getResult())),
  84. isset($data['page']) ? $data['page'] : 1,
  85. self::LIMIT,
  86. array('distinct' => true)
  87. );
  88. $paginationData = $results->getPaginationData();
  89. $queryParameters = $results->getParams();
  90. $data = [];
  91. foreach ($results as $rating) {
  92. $customer = array(
  93. 'id' => $rating['customerId'],
  94. 'name' => $rating['name'],
  95. 'email' => $rating['email'],
  96. 'smallThumbnail' => $rating['smallThumbnail']
  97. );
  98. $data[] = array(
  99. 'id' => $rating[0]['id'],
  100. 'ticketId' => $rating['ticketId'],
  101. 'customer' => $customer,
  102. 'count' => $rating[0]['stars'],
  103. 'formatedRatedAt' => $rating[0]['createdAt']->format('d-m-Y H:i A'),
  104. );
  105. }
  106. $paginationData['url'] = '#'.$container->get('report.service')->symfony_http_build_query($queryParameters);
  107. $json['ratedTickets'] = $data;
  108. $json['pagination'] = $paginationData;
  109. return $json;
  110. }
  111. public function getRatingData(\Symfony\Component\HttpFoundation\ParameterBag $obj = null, $container)
  112. {
  113. $data_time = array_reverse($obj->all());
  114. $userService = $container->get('user.service');
  115. $startDate = $userService->convertToTimezone(new \DateTime($data_time['start']),'Y-m-d');
  116. $endDate = $userService->convertToTimezone(new \DateTime($data_time['end']),'Y-m-d');
  117. $data = array();
  118. $qb = $this->getEntityManager()->createQueryBuilder();
  119. $qb->select('avg(r.stars) as avgCount, count(r.customer) as totalRatedCustomer')->from(TicketRating::class, 'r')
  120. ->leftJoin('r.ticket', 't')
  121. ->andWhere('r.createdAt BETWEEN :startDate AND :endDate')
  122. ->andWhere('t.isTrashed != 1')
  123. ->groupBy('r.ticket')
  124. ->setParameter('startDate', $startDate." 00:00:01")
  125. ->setParameter('endDate', $endDate." 23:59:59");
  126. $container->get('report.service')->addPermissionFilter($qb, $this->container);
  127. $qb = $this->filterQuerySlim($qb, $data_time);
  128. $result = $qb->getQuery()->getResult();
  129. $ratedCustomerCount = 0;
  130. $rateTotal = 0;
  131. foreach ($result as $rating) {
  132. $rateTotal += $rating['avgCount'];
  133. $ratedCustomerCount += $rating['totalRatedCustomer'];
  134. }
  135. $ratePercent = $rateTotal ? ($rateTotal / ( count($result) * 5 )) : 0;
  136. $data['rating'] = $ratePercent;
  137. $data['ratedCustomer'] = $ratedCustomerCount;
  138. $data['totalCustomer'] = $container->get('user.service')->getCustomersCountForKudos($container);
  139. return $data;
  140. }
  141. public function filterQuerySlim($qb, $data_time, $filterAgent = true)
  142. {
  143. if (isset($data_time['priority'])) {
  144. $qb->leftJoin('t.priority', 'pr')
  145. ->andWhere('pr.id IN (:priorityIds)')
  146. ->setParameter('priorityIds', explode(',', $data_time['priority']));
  147. }
  148. if (isset($data_time['type'])) {
  149. $qb->leftJoin('t.type', 'tp')
  150. ->andWhere('tp.id IN (:typeIds)')
  151. ->setParameter('typeIds', explode(',', $data_time['type']));
  152. }
  153. if ($filterAgent && isset($data_time['agent'])) {
  154. $qb->leftJoin('t.agent', 'a')
  155. ->andWhere('a.id IN (:agentIds)')
  156. ->setParameter('agentIds', explode(',', $data_time['agent']));
  157. }
  158. if (isset($data_time['customer'])) {
  159. $qb->leftJoin('t.customer', 'c')
  160. ->andWhere('c.id IN (:customerIds)')
  161. ->setParameter('customerIds', explode(',', $data_time['customer']));
  162. }
  163. if (isset($data_time['group'])) {
  164. $qb->leftJoin('t.supportGroup', 'gr')
  165. ->andWhere('gr.id IN (:groupIds)')
  166. ->setParameter('groupIds', explode(',', $data_time['group']));
  167. }
  168. if (isset($data_time['team'])) {
  169. $qb->leftJoin('t.supportTeam', 'tSub')
  170. ->andWhere('tSub.id IN (:subGroupIds)')
  171. ->setParameter('subGroupIds', explode(',', $data_time['team']));
  172. }
  173. return $qb;
  174. }
  175. public function getRatingByStarCount(\Symfony\Component\HttpFoundation\ParameterBag $obj = null, $rateId, $container)
  176. {
  177. $data_time = array_reverse($obj->all());
  178. $userService = $container->get('user.service');
  179. $startDate = $userService->convertToTimezone(new \DateTime($data_time['start']),'Y-m-d');
  180. $endDate = $userService->convertToTimezone(new \DateTime($data_time['end']),'Y-m-d');
  181. $data = array();
  182. $qb = $this->getEntityManager()->createQueryBuilder();
  183. $qb->select('COUNT(r.id)')->from(TicketRating::class, 'r')
  184. ->leftJoin('r.ticket', 't')
  185. ->andWhere('r.createdAt BETWEEN :startDate AND :endDate')
  186. ->andWhere('t.isTrashed != 1')
  187. ->andWhere('r.stars = :count')
  188. ->setParameter('startDate', $startDate." 00:00:01")
  189. ->setParameter('endDate', $endDate." 23:59:59")
  190. ->setParameter('count', $rateId);
  191. $container->get('report.service')->addPermissionFilter($qb, $this->container);
  192. $qb = $this->filterQuerySlim($qb, $data_time);
  193. return $qb->getQuery()->getSingleScalarResult();
  194. }
  195. }