vendor/uvdesk/core-framework/Repository/UserRepository.php line 244

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Repository;
  3. use Doctrine\ORM\Query;
  4. use Doctrine\Common\Collections\Criteria;
  5. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  6. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  7. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  8. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportGroup;
  9. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTeam;
  10. use Symfony\Component\HttpFoundation\ParameterBag;
  11. use Symfony\Component\DependencyInjection\ContainerInterface;
  12. /**
  13. * UserRepository
  14. *
  15. * This class was generated by the Doctrine ORM. Add your own custom
  16. * repository methods below.
  17. */
  18. class UserRepository extends \Doctrine\ORM\EntityRepository
  19. {
  20. const LIMIT = 10;
  21. public $safeFields = ['page', 'limit', 'sort', 'order', 'direction'];
  22. public function getAllAgents(ParameterBag $params = null, ContainerInterface $container) {
  23. $params = !empty($params) ? array_reverse($params->all()) : [];
  24. $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  25. ->select("user, userInstance, supportRole")
  26. ->from(User::class, 'user')
  27. ->leftJoin('user.userInstance', 'userInstance')
  28. ->leftJoin('userInstance.supportRole', 'supportRole')
  29. ->where('supportRole.id != :customerRole')->setParameter('customerRole', 4)
  30. ->orderBy('userInstance.createdAt', !isset($params['sort']) ? Criteria::DESC : Criteria::ASC);
  31. foreach ($params as $field => $fieldValue) {
  32. if (in_array($field, $this->safeFields))
  33. continue;
  34. if (!in_array($field, ['dateUpdated', 'dateAdded', 'search', 'isActive'])) {
  35. $queryBuilder->andWhere("user.$field = :$field")->setParameter($field, $fieldValue);
  36. } else {
  37. if ('search' == $field) {
  38. $queryBuilder->andWhere("CONCAT(a.firstName,' ', a.lastName) LIKE :fullName OR a.email LIKE :email")
  39. ->setParameter('fullName', '%' . urldecode(trim($fieldValue)) . '%')
  40. ->setParameter('email', '%' . urldecode(trim($fieldValue)) . '%');
  41. } else if ('isActive' == $field) {
  42. $queryBuilder->andWhere('userInstance.isActive = :isActive')->setParameter('isActive', $fieldValue);
  43. }
  44. }
  45. }
  46. // Pagination
  47. $options = ['distinct' => true, 'wrap-queries' => true];
  48. $currentPage = isset($params['page']) ? $params['page'] : 1;
  49. $paginationQueryBuilder = clone $queryBuilder;
  50. $totalUsers = (int) $paginationQueryBuilder->select('COUNT (DISTINCT user.id)')->getQuery()->getSingleScalarResult();
  51. $query = $queryBuilder->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count', $totalUsers);
  52. $pagination = $container->get('knp_paginator')->paginate($query, $currentPage, self::LIMIT, $options);
  53. // Parse result
  54. $paginationParams = $pagination->getParams();
  55. $paginationAttributes = $pagination->getPaginationData();
  56. $paginationParams['page'] = 'replacePage';
  57. $paginationAttributes['url'] = '#' . $container->get('uvdesk.service')->buildPaginationQuery($paginationParams);
  58. $userService = $container->get('user.service');
  59. return [
  60. 'pagination_data' => $paginationAttributes,
  61. 'users' => array_map(function ($user) use ($userService) {
  62. return [
  63. 'id' => $user['id'],
  64. 'email' => $user['email'],
  65. 'smallThumbnail' => $user['userInstance'][0]['profileImagePath'] ?: null,
  66. 'isActive' => $user['userInstance'][0]['isActive'],
  67. 'name' => ucwords(trim(implode(' ', [$user['firstName'], $user['lastName']]))),
  68. 'role' => $user['userInstance'][0]['supportRole']['description'],
  69. 'roleCode' => $user['userInstance'][0]['supportRole']['code'],
  70. 'isOnline' => $user['userInstance'][0]['isOnline'],
  71. 'lastLogin' => !empty($user['userInstance'][0]['lastLogin'])
  72. ? $userService->getLocalizedFormattedTime($user['userInstance'][0]['lastLogin'])
  73. : 'NA',
  74. ];
  75. }, $pagination->getItems()),
  76. ];
  77. }
  78. public function getAllAgentsForChoice(ParameterBag $obj = null, $container)
  79. {
  80. $qb = $this->getEntityManager()->createQueryBuilder();
  81. $qb->select('a')->from($this->getEntityName(), 'a')
  82. ->leftJoin('a.userInstance', 'userInstance')
  83. ->leftJoin('userInstance.supportRole', 'supportRole')
  84. ->andWhere('userInstance.supportRole NOT IN (:roles)')
  85. ->setParameter('roles', [4]);
  86. return $qb;
  87. }
  88. public function getAllCustomer(ParameterBag $obj = null, $container)
  89. {
  90. $json = array();
  91. $qb = $this->getEntityManager()->createQueryBuilder();
  92. $qb->select('a,userInstance')->from($this->getEntityName(), 'a');
  93. $qb->leftJoin('a.userInstance', 'userInstance');
  94. $qb->addSelect("CONCAT(a.firstName,' ',a.lastName) AS name");
  95. $data = $obj->all();
  96. $data = array_reverse($data);
  97. foreach ($data as $key => $value) {
  98. if (! in_array($key,$this->safeFields)) {
  99. if ($key!='dateUpdated' AND $key!='dateAdded' AND $key!='search' AND $key!='starred' AND $key!='isActive') {
  100. $qb->andWhere('a.'.$key.' = :'.$key);
  101. $qb->setParameter($key, $value);
  102. } else {
  103. if ($key == 'search') {
  104. $qb->andWhere("CONCAT(a.firstName,' ', a.lastName) LIKE :fullName OR a.email LIKE :email");
  105. $qb->setParameter('fullName', '%'.urldecode(trim($value)).'%');
  106. $qb->setParameter('email', '%'.urldecode(trim($value)).'%');
  107. } elseif ($key == 'starred') {
  108. $qb->andWhere('userInstance.isStarred = 1');
  109. } elseif ($key == 'isActive') {
  110. $qb->andWhere('userInstance.isActive = :isActive');
  111. $qb->setParameter('isActive', $value);
  112. }
  113. }
  114. }
  115. }
  116. $qb->andWhere('userInstance.supportRole = :roles');
  117. $qb->setParameter('roles', 4);
  118. if (!isset($data['sort'])) {
  119. $qb->orderBy('userInstance.createdAt',Criteria::DESC);
  120. }
  121. $paginator = $container->get('knp_paginator');
  122. $newQb = clone $qb;
  123. $newQb->select('DISTINCT a.id');
  124. $results = $paginator->paginate(
  125. $qb->getQuery()->setHydrationMode(Query::HYDRATE_ARRAY)->setHint('knp_paginator.count', count($newQb->getQuery()->getResult())),
  126. isset($data['page']) ? $data['page'] : 1,
  127. self::LIMIT,
  128. array('distinct' => true, 'wrap-queries' => true)
  129. );
  130. $paginationData = $results->getPaginationData();
  131. $queryParameters = $results->getParams();
  132. $queryParameters['page'] = "replacePage";
  133. $paginationData['url'] = '#'.$container->get('uvdesk.service')->buildPaginationQuery($queryParameters);
  134. $this->container = $container;
  135. $data = array();
  136. $userService = $this->container->get('user.service');
  137. foreach ($results as $key => $customer) {
  138. $data[] = [
  139. 'id' => $customer[0]['id'],
  140. 'email' => $customer[0]['email'],
  141. 'smallThumbnail' => $customer[0]['userInstance'][0]['profileImagePath'],
  142. 'isStarred' => $customer[0]['userInstance'][0]['isStarred'],
  143. 'isActive' => $customer[0]['userInstance'][0]['isActive'],
  144. 'name' => $customer[0]['firstName'].' '.$customer[0]['lastName'],
  145. 'source' => $customer[0]['userInstance'][0]['source'],
  146. 'count' => $this->getCustomerTicketCount($customer[0]['id']),
  147. 'isOnline' => $customer[0]['userInstance'][0]['isOnline'],
  148. 'lastLogin' => !empty($customer[0]['userInstance'][0]['lastLogin'])
  149. ? $userService->getLocalizedFormattedTime($customer[0]['userInstance'][0]['lastLogin'])
  150. : 'NA',
  151. ];
  152. }
  153. $json['customers'] = $data;
  154. $json['pagination_data'] = $paginationData;
  155. $json['customer_count'] = $this->getCustomerCountDetails($container);
  156. return $json;
  157. }
  158. public function getCustomerCountDetails($container) {
  159. $starredQb = $this->getEntityManager()->createQueryBuilder();
  160. $starredQb->select('COUNT(u.id) as countUser')
  161. ->from($this->getEntityName(), 'u')
  162. ->leftJoin('u.userInstance', 'userInstance')
  163. ->andWhere('userInstance.isActive = 1')
  164. ->andWhere('userInstance.supportRole = :roles')
  165. ->setParameter('roles', 4);
  166. $all = $starredQb->getQuery()->getResult();
  167. $starredQb->andWhere('userInstance.isStarred = 1');
  168. $starred = $starredQb->getQuery()->getResult();
  169. return array('all' => $all[0]['countUser'],'starred' => $starred[0]['countUser']);
  170. }
  171. public function getCustomerTicketCount($customerId) {
  172. $qb = $this->getEntityManager()->createQueryBuilder();
  173. $qb->select('COUNT(t.id) as countTicket')->from(Ticket::class, 't');
  174. $qb->andWhere('t.status = 1');
  175. $qb->andWhere('t.isTrashed != 1');
  176. $qb->andWhere('t.customer = :customerId');
  177. $qb->setParameter('customerId', $customerId);
  178. $result = $qb->getQuery()->getResult();
  179. return $result[0]['countTicket'];
  180. }
  181. public function getAgentByEmail($username)
  182. {
  183. $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  184. ->select('u, dt')
  185. ->from(User::class, 'u')
  186. ->leftJoin('u.userInstance', 'dt')
  187. ->where('u.email = :email')->setParameter('email', $username)
  188. ->andWhere('dt.supportRole != :roles')->setParameter('roles', 4)
  189. ;
  190. return $queryBuilder->getQuery()->getOneOrNullResult();
  191. }
  192. public function getSupportGroups(Request $request = null)
  193. {
  194. $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  195. ->select('supportGroup.id, supportGroup.name')->from(SupportGroup::class, 'supportGroup')
  196. ->where('supportGroup.isActive = :isActive')->setParameter('isActive', true);
  197. if ($request) {
  198. $queryBuilder
  199. ->andWhere("supportGroup.name LIKE :groupName")->setParameter('groupName', '%' . urldecode($request->query->get('query')) . '%')
  200. ->andWhere("supportGroup.id NOT IN (:ids)")->setParameter('ids', explode(',', urldecode($request->query->get('not'))));
  201. }
  202. return $queryBuilder->getQuery()->getArrayResult();
  203. }
  204. public function getSupportTeams(Request $request = null)
  205. {
  206. $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  207. ->select('supportTeam.id, supportTeam.name')->from(SupportTeam::class, 'supportTeam')
  208. ->where('supportTeam.isActive = :isActive')->setParameter('isActive', true);
  209. if ($request) {
  210. $queryBuilder
  211. ->andWhere("supportTeam.name LIKE :subGroupName")->setParameter('subGroupName', '%' . urldecode($request->query->get('query')) . '%')
  212. ->andWhere("supportTeam.id NOT IN (:ids)")->setParameter('ids', explode(',',urldecode($request->query->get('not'))));
  213. }
  214. return $queryBuilder->getQuery()->getResult();
  215. }
  216. public function getUserSupportGroupReferences(User $user)
  217. {
  218. $query = $this->getEntityManager()->createQueryBuilder()
  219. ->select('ug.id')->from(User::class, 'u')
  220. ->leftJoin('u.userInstance','userInstance')
  221. ->leftJoin('userInstance.supportGroups','ug')
  222. ->andWhere('u.id = :userId')
  223. ->setParameter('userId', $user->getId())
  224. ->andWhere('ug.isActive = 1');
  225. return array_map('current', $query->getQuery()->getResult());
  226. }
  227. public function getUserSupportTeamReferences(User $user)
  228. {
  229. $query = $this->getEntityManager()->createQueryBuilder()
  230. ->select('ut.id')->from(User::class, 'u')
  231. ->leftJoin('u.userInstance','userInstance')
  232. ->leftJoin('userInstance.supportTeams','ut')
  233. ->andWhere('u.id = :userId')
  234. ->andWhere('userInstance.supportRole != :agentRole')
  235. ->andWhere('ut.isActive = 1')
  236. ->setParameter('userId', $user->getId())
  237. ->setParameter('agentRole', '4');
  238. return array_map('current', $query->getQuery()->getResult());
  239. }
  240. public function lastUpdatedRole($user)
  241. {
  242. $qb = $this->getEntityManager()->createQueryBuilder();
  243. $qb->select('us')->from(UserInstance::class, 'us');
  244. $qb->andWhere('us.user = :userId');
  245. $qb->setParameter('userId',$user->getId());
  246. $qb->setMaxResults(1);
  247. $qb->orderBy('us.createdAt', Criteria::DESC);
  248. return $qb->getQuery()->getResult();
  249. }
  250. public function retrieveHelpdeskCustomerInstances($username)
  251. {
  252. $queryBuilder = $this->getEntityManager()->createQueryBuilder()
  253. ->select('u, dt')
  254. ->from(User::class, 'u')
  255. ->leftJoin('u.userInstance', 'dt')
  256. ->where('u.email = :email')->setParameter('email', $username)
  257. ->andWhere('dt.supportRole = :roles')->setParameter('roles', 4)
  258. ;
  259. return $queryBuilder->getQuery()->getOneOrNullResult();
  260. }
  261. }