vendor/uvdesk/core-framework/Services/UserService.php line 178

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Services;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Twig\Environment as TwigEnvironment;
  5. use Doctrine\Common\Collections\Criteria;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\Filesystem\Filesystem as Fileservice;
  9. use Symfony\Component\DependencyInjection\ContainerInterface;
  10. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  11. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportRole;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Ticket;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportPrivilege;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportGroup;
  16. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportTeam;
  17. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SavedReplies;
  18. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Website;
  19. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  20. use Webkul\UVDesk\SupportCenterBundle\Entity\KnowledgebaseWebsite;
  21. class UserService
  22. {
  23. protected $container;
  24. protected $requestStack;
  25. protected $entityManager;
  26. protected $twig;
  27. public function __construct(ContainerInterface $container, RequestStack $requestStack, EntityManagerInterface $entityManager, TwigEnvironment $twig)
  28. {
  29. $this->container = $container;
  30. $this->requestStack = $requestStack;
  31. $this->entityManager = $entityManager;
  32. $this->twig = $twig;
  33. }
  34. public function getCustomFieldTemplateCustomer()
  35. {
  36. $request = $this->requestStack->getCurrentRequest();
  37. $ticket = $this->entityManager->getRepository(Ticket::class)->findOneById($request->attributes->get('id'));
  38. try {
  39. if ($this->isFileExists('apps/uvdesk/custom-fields')) {
  40. $customFieldsService = $this->container->get('uvdesk_package_custom_fields.service');
  41. $registeredBaseTwigPath = '_uvdesk_extension_uvdesk_custom_fields';
  42. } else if ($this->isFileExists('apps/uvdesk/form-component')) {
  43. $customFieldsService = $this->container->get('uvdesk_package_form_component.service');
  44. $registeredBaseTwigPath = '_uvdesk_extension_uvdesk_form_component';
  45. }
  46. } catch (\Exception $e) {
  47. // @TODO: Log execption message
  48. }
  49. $customerCustomFieldSnippet = !empty($customFieldsService) ? $customFieldsService->getCustomerCustomFieldSnippet($ticket) : [];
  50. if (!empty($registeredBaseTwigPath) && sizeof($customerCustomFieldSnippet["customFieldCollection"]) > 0) {
  51. return $this->twig->render('@' . $registeredBaseTwigPath . '/widgets/CustomFields/customFieldSnippetCustomer.html.twig', $customerCustomFieldSnippet);
  52. }
  53. return;
  54. }
  55. public function isGranted($role)
  56. {
  57. $securityContext = $this->container->get('security.token_storage');
  58. try {
  59. return (bool) ($role == $securityContext->getToken()->getRoles()[0]->getRole());
  60. } catch (AuthenticationCredentialsNotFoundException $e) {
  61. // @TODO: Handle Authentication Failure
  62. }
  63. return false;
  64. }
  65. public function getSessionUser()
  66. {
  67. $user = $this->container->get('security.token_storage')->getToken()?->getUser();
  68. return $user instanceof User ? $user : null;
  69. }
  70. public function getCurrentUser()
  71. {
  72. if ($this->container->get('security.token_storage')->getToken()) {
  73. return $this->container->get('security.token_storage')->getToken()?->getUser();
  74. } else {
  75. return false;
  76. }
  77. }
  78. public function getCountries()
  79. {
  80. return $this->helpdeskCountries = \Symfony\Component\Intl\Countries::getNames();
  81. }
  82. public function isAccessAuthorized($scope, User $user = null)
  83. {
  84. // Return false if no user is provided
  85. if (empty($user) && !($user = $this->getSessionUser())) {
  86. return false;
  87. }
  88. try {
  89. $userRole = $user?->getCurrentInstance()?->getSupportRole()->getCode();
  90. } catch (\Exception $error) {
  91. $userRole = '';
  92. }
  93. switch ($userRole) {
  94. case 'ROLE_SUPER_ADMIN':
  95. case 'ROLE_ADMIN':
  96. return true;
  97. case 'ROLE_AGENT':
  98. $agentPrivileges = $this->getUserPrivileges($this->getCurrentUser()?->getId());
  99. $agentPrivileges = array_merge($agentPrivileges, ['saved_filters_action', 'saved_replies']);
  100. return in_array($scope, $agentPrivileges) ? true : false;
  101. case 'ROLE_CUSTOMER':
  102. default:
  103. break;
  104. }
  105. return true;
  106. }
  107. public function getUserPrivileges($userId)
  108. {
  109. static $agentPrivilege = [];
  110. if (isset($agentPrivilege[$userId])) {
  111. return $agentPrivilege[$userId];
  112. }
  113. $userPrivileges = array();
  114. $user = $this->entityManager->getRepository(User::class)->find($userId);
  115. $privileges = $user->getAgentInstance()->getSupportPrivileges();
  116. if ($privileges) {
  117. foreach ($privileges as $privilege) {
  118. $userPrivileges = array_merge($userPrivileges, $privilege->getPrivileges());
  119. }
  120. }
  121. $agentPrivilege[$userId] = $this->agentPrivilege[$userId] = $userPrivileges;
  122. return $userPrivileges;
  123. }
  124. public function getSupportPrivileges()
  125. {
  126. $qb = $this->entityManager->createQueryBuilder();
  127. $qb->select("supportPrivilege")->from(SupportPrivilege::class, 'supportPrivilege');
  128. return $qb->getQuery()->getArrayResult();
  129. }
  130. public function getSupportGroups(Request $request = null)
  131. {
  132. static $results;
  133. if (null !== $results)
  134. return $results;
  135. $qb = $this->entityManager->createQueryBuilder();
  136. $qb->select('supportGroup.id, supportGroup.name')->from(SupportGroup::class, 'supportGroup')
  137. ->andWhere('supportGroup.isActive = 1');
  138. if ($request) {
  139. $qb->andWhere("supportGroup.name LIKE :groupName");
  140. $qb->setParameter('groupName', '%' . urldecode(trim($request->query->get('query'))) . '%');
  141. $qb->andWhere("supportGroup.id NOT IN (:ids)");
  142. $qb->setParameter('ids', explode(',', urldecode($request->query->get('not'))));
  143. }
  144. return $results = $qb->getQuery()->getArrayResult();
  145. }
  146. public function getSupportTeams(Request $request = null)
  147. {
  148. static $results;
  149. if (null !== $results)
  150. return $results;
  151. $queryBuilder = $this->entityManager->createQueryBuilder()
  152. ->select("user.id, user.email, CONCAT(user.firstName, ' ', user.lastName) as name, userInstance.profileImagePath as smallThumbnail")
  153. ->from(User::class, 'user')
  154. ->leftJoin('user.userInstance', 'userInstance')
  155. ->leftJoin('userInstance.supportRole', 'supportRole')
  156. ->where('supportRole.code != :customerRole')->setParameter('customerRole', 'ROLE_CUSTOMER')
  157. ->andWhere('userInstance.isActive = :isUserActive')->setParameter('isUserActive', true)
  158. ->orderBy('name', Criteria::ASC);
  159. if ($request && null != $request->query->get('query')) {
  160. $queryBuilder
  161. ->andWhere("CONCAT(dt.firstName,' ', dt.lastName) LIKE :customerName")
  162. ->setParameter('customerName', '%' . urldecode(trim($request->query->get('query'))) . '%');
  163. }
  164. $qb = $this->entityManager->createQueryBuilder();
  165. $qb->select('supportTeam.id, supportTeam.name')
  166. ->from(SupportTeam::class, 'supportTeam');
  167. $qb->andWhere('supportTeam.isActive = 1');
  168. if ($request) {
  169. $qb->andWhere("supportTeam.name LIKE :subGroupName");
  170. $qb->setParameter('subGroupName', '%' . urldecode($request->query->get('query')) . '%');
  171. $qb->andWhere("supportTeam.id NOT IN (:ids)");
  172. $qb->setParameter('ids', explode(',', urldecode($request->query->get('not'))));
  173. }
  174. return $results = $qb->getQuery()->getResult();
  175. }
  176. public function createUserInstance($email, $name, SupportRole $role, array $extras = [])
  177. {
  178. $user = $this->entityManager->getRepository(User::class)->findOneByEmail($email) ?: new User();
  179. $website = $this->entityManager->getRepository(Website::class)->findOneBy(['code' => 'knowledgebase']);
  180. $timeZone = $website->getTimezone();
  181. $timeFormat = $website->getTimeformat();
  182. if (null == $user->getId()) {
  183. $name = explode(' ', trim($name));
  184. $user->setEmail($email);
  185. $user->setFirstName(isset($extras['firstName']) ? $extras['firstName'] : array_shift($name));
  186. $user->setLastName(trim(implode(' ', $name)));
  187. $user->setIsEnabled($extras['active']);
  188. $user->setTimeZone($timeZone);
  189. $user->setTimeFormat($timeFormat);
  190. $this->entityManager->persist($user);
  191. $this->entityManager->flush();
  192. }
  193. $userInstance = 'ROLE_CUSTOMER' == $role->getCode() ? $user->getCustomerInstance() : $user->getAgentInstance();
  194. if (empty($userInstance)) {
  195. $userInstance = new UserInstance();
  196. $userInstance->setUser($user);
  197. $userInstance->setSupportRole($role);
  198. $userInstance->setContactNumber(!empty($extras['contact']) ? $extras['contact'] : null);
  199. $userInstance->setSkypeId(!empty($extras['skype']) ? $extras['skype'] : null);
  200. $userInstance->setDesignation(!empty($extras['designation']) ? $extras['designation'] : null);
  201. $userInstance->setSignature(!empty($extras['signature']) ? $extras['signature'] : null);
  202. $userInstance->setSource(!empty($extras['source']) ? $extras['source'] : 'website');
  203. $userInstance->setIsActive(!empty($extras['active']) ? (bool) $extras['active'] : false);
  204. $userInstance->setIsVerified(!empty($extras['verified']) ? (bool) $extras['verified'] : false);
  205. $userInstance->setIsStarred(!empty($extras['starred']) ? (bool) $extras['starred'] : false);
  206. if (!empty($extras['image'])) {
  207. $assetDetails = $this->container->get('uvdesk.core.file_system.service')->getUploadManager()->uploadFile($extras['image'], 'profile');
  208. if (!empty($assetDetails)) {
  209. $userInstance->setProfileImagePath($assetDetails['path']);
  210. }
  211. }
  212. $this->entityManager->persist($userInstance);
  213. $this->entityManager->flush();
  214. $user->addUserInstance($userInstance);
  215. // Trigger user created event
  216. $event = $role->getCode() == 'ROLE_CUSTOMER' ? new CoreWorkflowEvents\Customer\Create() : new CoreWorkflowEvents\Agent\Create();
  217. $event
  218. ->setUser($user);
  219. $this->container->get('event_dispatcher')->dispatch($event, 'uvdesk.automation.workflow.execute');
  220. }
  221. return $user;
  222. }
  223. public function getAgentPartialDataCollection(Request $request = null)
  224. {
  225. $queryBuilder = $this->entityManager->createQueryBuilder()
  226. ->select("user.id, user.email, CONCAT(user.firstName, ' ', COALESCE(user.lastName, '')) as name, userInstance.profileImagePath as smallThumbnail, userInstance.isOnline")
  227. ->from(User::class, 'user')
  228. ->leftJoin('user.userInstance', 'userInstance')
  229. ->leftJoin('userInstance.supportRole', 'supportRole')
  230. ->where('supportRole.code != :customerRole')->setParameter('customerRole', 'ROLE_CUSTOMER')
  231. ->andWhere('userInstance.isActive = :isUserActive')->setParameter('isUserActive', true)
  232. ->orderBy('name', Criteria::ASC);
  233. if ($request && null != $request->query->get('query')) {
  234. $queryBuilder
  235. ->andWhere("CONCAT(user.firstName,' ', user.lastName) LIKE :customerName")
  236. ->setParameter('customerName', '%' . urldecode($request->query->get('query')) . '%')
  237. ;
  238. }
  239. if ($request && null != $request->query->get('not')) {
  240. $queryBuilder
  241. ->andWhere("u.id NOT IN (:ids)")
  242. ->setParameter('ids', explode(',', urldecode($request->query->get('not'))))
  243. ;
  244. }
  245. return $queryBuilder->getQuery()->getArrayResult();
  246. }
  247. public function getAgentsPartialDetails(Request $request = null)
  248. {
  249. static $agents;
  250. if (null !== $agents) {
  251. return $agents;
  252. }
  253. $qb = $this->entityManager->createQueryBuilder();
  254. $qb
  255. ->select("u.id, userInstance.id as udId,u.email,CONCAT(u.firstName,' ', u.lastName) AS name,userInstance.profileImagePath as smallThumbnail")
  256. ->from(User::class, 'u')
  257. ->leftJoin('u.userInstance', 'userInstance')
  258. ->andWhere('userInstance.supportRole != :roles')
  259. ->setParameter('roles', 4)
  260. ->andWhere('userInstance.isActive = 1')
  261. ->orderBy('name', 'ASC')
  262. ;
  263. if ($request) {
  264. $qb->andWhere("CONCAT(u.firstName,' ', u.lastName) LIKE :customerName");
  265. $qb->setParameter('customerName', '%' . urldecode(trim($request->query->get('query'))) . '%');
  266. $qb->andWhere("u.id NOT IN (:ids)");
  267. $qb->setParameter('ids', explode(',', urldecode($request->query->get('not'))));
  268. }
  269. $data = $agents = $qb->getQuery()->getArrayResult();
  270. return $data;
  271. }
  272. public function getAgentDetailById($agentId)
  273. {
  274. if (!$agentId) {
  275. return;
  276. }
  277. $qb = $this->entityManager->createQueryBuilder();
  278. $qb
  279. ->select("DISTINCT u.id,u.email,CONCAT(u.firstName,' ', COALESCE(u.lastName,'')) AS name, u.firstName,u.lastName, u.isEnabled, userInstance.profileImagePath, userInstance.profileImagePath as smallThumbnail,userInstance.isActive, userInstance.isVerified, userInstance.designation, userInstance.contactNumber, userInstance.signature, userInstance.ticketAccessLevel, userInstance.isOnline")
  280. ->from(User::class, 'u')
  281. ->leftJoin('u.userInstance', 'userInstance')
  282. ->andWhere('userInstance.supportRole != :roles')
  283. ->andWhere('u.id = :agentId')
  284. ->setParameter('roles', 4)
  285. ->setParameter('agentId', $agentId)
  286. ;
  287. $result = $qb->getQuery()->getResult();
  288. return isset($result[0]) ? $result[0] : null;
  289. }
  290. public function getUsersByGroupId($groupId)
  291. {
  292. $qb = $this->entityManager->createQueryBuilder();
  293. $qb->select("DISTINCT user.id, user.email, CONCAT(user.firstName, ' ', user.lastName) AS name, userInstance.profileImagePath as smallThumbnail")
  294. ->from(User::class, 'user')
  295. ->leftJoin('user.userInstance', 'userInstance')
  296. ->leftJoin('userInstance.supportGroups', 'supportGroup')
  297. ->andWhere('userInstance.supportRole != :roles')->setParameter('roles', 4)
  298. ->andWhere('supportGroup.id = :groupId')->setParameter('groupId', $groupId)
  299. ->andWhere('userInstance.isActive = 1')
  300. ;
  301. $data = $qb->getQuery()->getArrayResult();
  302. return $data;
  303. }
  304. public function getUsersBySubGroupId($subGroupId)
  305. {
  306. $qb = $this->entityManager->createQueryBuilder();
  307. $qb->select("DISTINCT user.id, supportTeam.id as udId,user.email,CONCAT(user.firstName,' ', user.lastName) AS name,userInstance.profileImagePath as smallThumbnail")
  308. ->from(User::class, 'user')
  309. ->leftJoin('user.userInstance', 'userInstance')
  310. ->leftJoin('userInstance.supportTeams', 'supportTeam')
  311. ->andWhere('userInstance.supportRole != :roles')
  312. ->andWhere('supportTeam.id = :subGroupId')
  313. ->setParameter('roles', 4)
  314. ->setParameter('subGroupId', $subGroupId)
  315. ->andWhere('supportTeam.isActive = 1')
  316. ->andWhere('userInstance.isActive = 1');
  317. $data = $qb->getQuery()->getArrayResult();
  318. return $data;
  319. }
  320. public function getCustomerDetailsById($customerId)
  321. {
  322. $qb = $this->entityManager->createQueryBuilder();
  323. $qb->select("user.id,user.email,CONCAT(user.firstName,' ', COALESCE(user.lastName,'')) AS name,user.firstName,user.lastName,user.isEnabled,userInstance.contactNumber,userInstance.profileImagePath,userInstance.profileImagePath as smallThumbnail,userInstance.isActive, userInstance.isVerified")->from(User::class, 'user')
  324. ->leftJoin('user.userInstance', 'userInstance')
  325. ->andWhere('userInstance.supportRole = :roles')
  326. ->andWhere('user.id = :customerId')
  327. ->setParameter('roles', 4)
  328. ->setParameter('customerId', $customerId);
  329. $result = $qb->getQuery()->getResult();
  330. return ($result ? $result[0] : null);
  331. }
  332. public function getCustomerPartialDetailById($customerId)
  333. {
  334. $qb = $this->entityManager->createQueryBuilder();
  335. $qb->select("u.id,u.email,CONCAT(u.firstName,' ', COALESCE(u.lastName,'')) AS name,u.firstName,u.lastName,userInstance.contactNumber,userInstance.profileImagePath,userInstance.profileImagePath as smallThumbnail")->from(User::class, 'u')
  336. ->leftJoin('u.userInstance', 'userInstance')
  337. ->andWhere('userInstance.supportRole = :roles')
  338. ->andWhere('u.id = :customerId')
  339. ->setParameter('roles', 4)
  340. ->setParameter('customerId', $customerId);
  341. $result = $qb->getQuery()->getResult();
  342. return $result ? $result[0] : null;
  343. }
  344. public function getCustomersPartial(Request $request = null)
  345. {
  346. $qb = $this->entityManager->createQueryBuilder();
  347. $qb->from(User::class, 'u');
  348. $qb->select("DISTINCT u.id,u.email,CONCAT(u.firstName,' ', COALESCE(u.lastName,'')) AS name, userInstance.profileImagePath as smallThumbnail ")
  349. ->leftJoin('u.userInstance', 'userInstance')
  350. ->andWhere('userInstance.supportRole = :roles')
  351. ->setParameter('roles', 4)
  352. ->orderBy('name', 'ASC');
  353. if ($request) {
  354. if ($request->query->get('query')) {
  355. $qb->andWhere("CONCAT(u.firstName,' ', u.lastName) LIKE :customerName OR u.email LIKE :customerName");
  356. } else {
  357. $qb->andWhere("CONCAT(u.firstName,' ', u.lastName) LIKE :customerName");
  358. }
  359. $qb->setParameter('customerName', '%' . urldecode(trim($request->query->get('query'))) . '%')
  360. ->andWhere("u.id NOT IN (:ids)")
  361. ->setParameter('ids', explode(',', urldecode($request->query->get('not'))));
  362. }
  363. $query = $qb->getQuery();
  364. return $query->getScalarResult();
  365. }
  366. public function getCustomersCount()
  367. {
  368. $qb = $this->entityManager->createQueryBuilder();
  369. $qb->select($qb->expr()->countDistinct('c.id') . "as customerCount")->from(Ticket::class, 't')
  370. ->leftJoin('t.customer', 'c');
  371. $this->entityManager->getRepository(Ticket::class)->addPermissionFilter($qb, $this->container, false);
  372. return $qb->getQuery()->getSingleScalarResult();
  373. }
  374. public function getUserSubGroupIds($userId)
  375. {
  376. $qb = $this->entityManager->createQueryBuilder();
  377. $qb->select('supportTeams.id')->from(User::class, 'user')
  378. ->leftJoin('user.userInstance', 'userInstance')
  379. ->leftJoin('userInstance.supportTeams', 'supportTeams')
  380. ->andWhere('user.id = :userId')
  381. ->andWhere('userInstance.supportRole != :agentRole')
  382. ->andWhere('supportTeams.isActive = 1')
  383. ->setParameter('userId', $userId)
  384. ->setParameter('agentRole', '4');
  385. return array_column($qb->getQuery()->getArrayResult(), 'id');
  386. }
  387. public function getUserGroupIds($userId)
  388. {
  389. $qb = $this->entityManager->createQueryBuilder();
  390. $qb->select('supportGroup.id')->from(User::class, 'user')
  391. ->leftJoin('user.userInstance', 'userInstance')
  392. ->leftJoin('userInstance.supportGroups', 'supportGroup')
  393. ->andWhere('user.id = :userId')
  394. ->andWhere('supportGroup.isActive = 1')
  395. ->setParameter('userId', $userId);
  396. return array_column($qb->getQuery()->getArrayResult(), 'id');
  397. }
  398. public function createUser($data)
  399. {
  400. $user = new User();
  401. $user->setEmail($data['from']);
  402. $user->setFirstName($data['firstName']);
  403. $user->setLastName($data['lastName']);
  404. $user->setIsEnabled($data['isActive']);
  405. $this->entityManager->persist($user);
  406. $role = $this->entityManager->getRepository(SupportRole::class)->find($data['role']);
  407. $userInstance = new UserInstance();
  408. $userInstance->setSupportRole($role);
  409. $userInstance->setUser($user);
  410. $userInstance->setIsActive($data['isActive']);
  411. $userInstance->setIsVerified(0);
  412. if (isset($data['source']))
  413. $userInstance->setSource($data['source']);
  414. else
  415. $userInstance->setSource('website');
  416. if (isset($data['contactNumber'])) {
  417. $userInstance->setContactNumber($data['contactNumber']);
  418. }
  419. if (isset($data['profileImage']) && $data['profileImage']) {
  420. $userInstance->setProfileImagePath($data['profileImage']);
  421. }
  422. $this->entityManager->persist($userInstance);
  423. $this->entityManager->flush();
  424. $user->addUserInstance($userInstance);
  425. $this->entityManager->persist($user);
  426. $this->entityManager->flush();
  427. return $user;
  428. }
  429. public function getWebsiteConfiguration($code)
  430. {
  431. $enabled_bundles = $this->container->getParameter('kernel.bundles');
  432. if (!in_array('UVDeskSupportCenterBundle', array_keys($enabled_bundles))) {
  433. return [
  434. 'id' => 1,
  435. 'website' => 1,
  436. 'status' => 1,
  437. 'brandColor' => '#0056fc',
  438. 'pageBackgroundColor' => '#FFFFFF',
  439. 'headerBackgroundColor' => '#FFFFFF',
  440. 'bannerBackgroundColor' => '#7085F4',
  441. 'navTextColor' => '#7085F4',
  442. 'navActiveColor' => '#7085F4',
  443. 'linkColor' => '#7085F4',
  444. 'linkHoverColor' => '#7085F4',
  445. 'headerLinks' => null,
  446. 'footerLinks' => null,
  447. 'articleTextColor' => '#7085F4',
  448. 'whiteList' => null,
  449. 'blackList' => null,
  450. 'siteDescritption' => 'Hi! how can i help you.',
  451. 'metaDescription' => null,
  452. 'metaKeywords' => null,
  453. 'homepageContent' => null,
  454. 'ticketCreateOption' => 1,
  455. 'createdAt' => '2024-09-21 16:20:01',
  456. 'updatedat' => '2024-09-21 16:20:01',
  457. 'broadcastMessage' => null,
  458. 'removeCustomerLoginButton' => null,
  459. 'disableCustomerlogin' => 0,
  460. 'removeBrandingContent' => null,
  461. 'loginRequiredToCreate' => null,
  462. 'script' => null,
  463. 'customCss' => null,
  464. 'isActive' => 1,
  465. ];
  466. }
  467. $website = $this->entityManager->getRepository(Website::class)->findOneByCode($code);
  468. if ($website) {
  469. $configuration = $this->entityManager->getRepository(KnowledgebaseWebsite::class)->findOneBy([
  470. 'website' => $website->getId(),
  471. 'isActive' => 1
  472. ]);
  473. }
  474. return !empty($configuration) ? $configuration : false;
  475. }
  476. public function getWebsiteDetails($code)
  477. {
  478. $website = $this->entityManager->getRepository(Website::class)->findOneByCode($code);
  479. return !empty($website) ? $website : false;
  480. }
  481. public function convertToTimezone($date, $format = "d-m-Y H:ia")
  482. {
  483. if (!$date) {
  484. return "N/A";
  485. }
  486. $date = date_format($date, $format);
  487. $dateTime = date('Y-m-d H:i:s', strtotime($date));
  488. $scheduleDate = new \DateTime($dateTime, new \DateTimeZone(date_default_timezone_get()));
  489. $scheduleDate
  490. ->setTimeZone(new \DateTimeZone('Asia/Kolkata'));
  491. return $scheduleDate->format($format);
  492. }
  493. public function convertDateTimeToSupportedUserTimeFormat(\DateTime $date, $timezone = "Asia/Kolkata", $timeformat = "d-m-Y H:ia")
  494. {
  495. if (empty($date)) {
  496. return "N/A";
  497. }
  498. $currentUser = $this->getCurrentUser();
  499. if (!empty($currentUser)) {
  500. if ($currentUser->getTimezone() != null) {
  501. $timezone = $currentUser->getTimezone();
  502. }
  503. if ($currentUser->getTimeFormat() != null) {
  504. $timeformat = $currentUser->getTimeFormat();
  505. }
  506. }
  507. $date
  508. ->setTimeZone(new \DateTimeZone($timezone));
  509. return $date->format($timeformat);
  510. }
  511. public function convertToDatetimeTimezoneTimestamp($date, $format = "d-m-Y h:ia")
  512. {
  513. if (!$date)
  514. return "N/A";
  515. $currentUser = $this->getCurrentUser();
  516. $date = date_format($date, $format);
  517. $dateTime = date('Y-m-d H:i:s', strtotime($date));
  518. $scheduleDate = new \DateTime($dateTime, new \DateTimeZone(date_default_timezone_get()));
  519. $this->domain = $this->container->get('router')->getContext()->getHost();
  520. $scheduleDate->setTimeZone(new \DateTimeZone('Asia/Kolkata'));
  521. return $scheduleDate->getTimestamp();
  522. }
  523. public function removeCustomer($customer)
  524. {
  525. $userData = $this->entityManager->getRepository(UserInstance::class)->findBy(array('user' => $customer->getId()));
  526. $count = count($userData);
  527. $ticketData = $this->entityManager->getRepository(Ticket::class)->findBy(array('customer' => $customer->getId()));
  528. $fileService = new Fileservice();
  529. // Delete all tickets attachments.
  530. if ($ticketData) {
  531. foreach ($ticketData as $ticket) {
  532. $threads = $ticket->getThreads();
  533. if (count($threads) > 0) {
  534. foreach ($threads as $thread) {
  535. if (!empty($thread)) {
  536. $fileService->remove($this->container->getParameter('kernel.project_dir') . '/public/assets/threads/' . $thread->getId());
  537. }
  538. }
  539. }
  540. }
  541. }
  542. // Remove profile.
  543. foreach ($userData as $user) {
  544. if ($user->getSupportRole()->getId() == 4 && $user->getProfileImagePath()) {
  545. $fileService->remove($this->container->getParameter('kernel.project_dir') . '/public' . $user->getProfileImagePath());
  546. }
  547. }
  548. // getCustomerTickets
  549. $qb = $this->entityManager->createQueryBuilder();
  550. $query = $qb->delete(Ticket::class, 't')
  551. ->andWhere('t.customer = :customerId')
  552. ->setParameter('customerId', $customer->getId())
  553. ->getQuery();
  554. $query->execute();
  555. $qb = $this->entityManager->createQueryBuilder();
  556. $query = $qb->delete(UserInstance::class, 'userInstance')
  557. ->andWhere('userInstance.user = :customerId')
  558. ->andWhere('userInstance.supportRole = :roleId')
  559. ->setParameter('customerId', $customer->getId())
  560. ->setParameter('roleId', 4)
  561. ->getQuery();
  562. $query->execute();
  563. if ($count == 1) {
  564. $this->entityManager->remove($customer);
  565. $this->entityManager->flush();
  566. }
  567. }
  568. public function removeAgent($user)
  569. {
  570. $userData = $this->entityManager->getRepository(UserInstance::class)->findBy(array('user' => $user->getId()));
  571. $count = count($userData);
  572. $qb = $this->entityManager->createQueryBuilder();
  573. $query = $qb->delete(UserInstance::class, 'ud')
  574. ->andWhere('ud.user = :userId')
  575. ->andWhere('ud.supportRole = :roleId')
  576. ->setParameter('userId', $user->getId())
  577. ->setParameter('roleId', 3)
  578. ->getQuery();
  579. $query->execute();
  580. foreach ($user->getAgentInstance()->getSupportGroups() as $group) {
  581. $user->getAgentInstance()->removeSupportGroup($group);
  582. $this->entityManager->persist($group);
  583. $this->entityManager->flush();
  584. }
  585. $qb = $this->entityManager->createQueryBuilder();
  586. $query = $qb->update(Ticket::class, 't')
  587. ->set('t.agent', ':nullAgent')
  588. ->andWhere('t.agent = :agentId')
  589. ->setParameter('agentId', $user->getId())
  590. ->setParameter('nullAgent', null)
  591. ->getQuery();
  592. $query->execute();
  593. if ($count == 1) {
  594. $this->entityManager->remove($user);
  595. $this->entityManager->flush();
  596. }
  597. }
  598. public function getWebsiteView()
  599. {
  600. $website = $this->entityManager->getRepository(Website::class)->findOneBy(['code' => 'knowledgebase']);
  601. $layout = $this->entityManager->getRepository(KnowledgebaseWebsite::class)->findOneBy(['website' => $website->getId()]);
  602. $homepageContent = $layout->getHomepageContent();
  603. return (!empty($homepageContent)) ? $homepageContent . 'View' : 'masonryView';
  604. }
  605. public function getUserDetailById($userId)
  606. {
  607. $user = $this->entityManager->getRepository(User::class)->find($userId);
  608. foreach ($user->getUserInstance() as $row) {
  609. if ($row->getSupportRole()->getId() != 4)
  610. return $row;
  611. }
  612. return null;
  613. }
  614. public function getUserPrivilegeIds($userId)
  615. {
  616. $qb = $this->entityManager->createQueryBuilder();
  617. $qb
  618. ->select('supportPrivileges.id')
  619. ->from(User::class, 'user')
  620. ->leftJoin('user.userInstance', 'userInstance')
  621. ->leftJoin('userInstance.supportPrivileges', 'supportPrivileges')
  622. ->andWhere('user.id = :userId')
  623. ->setParameter('userId', $userId)
  624. ;
  625. return array_column($qb->getQuery()->getArrayResult(), 'id');
  626. }
  627. public function getWebsiteSpamDetails($websiteSpam)
  628. {
  629. $blackList = str_replace("\n", ',', str_replace("\r\n", ',', $websiteSpam->getBlackList()));
  630. $whiteList = str_replace("\n", ',', str_replace("\r\n", ',', $websiteSpam->getWhiteList()));
  631. return [
  632. 'blackList' => $this->filterBlockSpam($blackList),
  633. 'whiteList' => $this->filterBlockSpam($whiteList),
  634. ];
  635. }
  636. public function filterBlockSpam($str)
  637. {
  638. $list = array();
  639. foreach (explode(',', $str) as $value) {
  640. if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
  641. if (!isset($list['email'])) {
  642. $list['email'] = array();
  643. }
  644. array_push($list['email'], strtolower($value));
  645. } else if (filter_var($value, FILTER_VALIDATE_IP)) {
  646. if (!isset($list['ip'])) {
  647. $list['ip'] = array();
  648. }
  649. array_push($list['ip'], $value);
  650. } else if (isset($value[0]) && $value[0] == '@') {
  651. if (!isset($list['domain'])) {
  652. $list['domain'] = array();
  653. }
  654. array_push($list['domain'], strtolower($value));
  655. }
  656. }
  657. return $list;
  658. }
  659. // @TODO: Refactor this - We can instead just use \DateTimeZone::listIdentifiers() wherever need be.
  660. public function getTimezones()
  661. {
  662. return \DateTimeZone::listIdentifiers();
  663. }
  664. public function getUserSavedReplyReferenceIds()
  665. {
  666. // @TODO: Refactor this function
  667. $savedReplyIds = [];
  668. $groupIds = [];
  669. $teamIds = [];
  670. $userInstance = $this->getCurrentUser()->getAgentInstance();
  671. $userId = $userInstance->getId();
  672. // Get all the saved reply the current user has created.
  673. $savedReplyRepo = $this->entityManager->getRepository(SavedReplies::class)->findAll();
  674. if (in_array($userInstance->getSupportRole()->getCode(), ['ROLE_ADMIN', "ROLE_SUPER_ADMIN"])) {
  675. // If the user is admin or super admin, return all saved replies.
  676. foreach ($savedReplyRepo as $sr) {
  677. array_push($savedReplyIds, (int)$sr->getId());
  678. }
  679. return $savedReplyIds;
  680. }
  681. foreach ($savedReplyRepo as $sr) {
  682. if ($userId == $sr->getUser()->getId()) {
  683. //Save the ids of the saved reply.
  684. array_push($savedReplyIds, (int)$sr->getId());
  685. }
  686. }
  687. // Get the ids of the Group(s) the current user is associated with.
  688. $query = "select * from uv_user_support_groups where userInstanceId =" . $userId;
  689. $connection = $this->entityManager->getConnection();
  690. $stmt = $connection->prepare($query);
  691. $result = $stmt->executeQuery()->fetchAllAssociative();
  692. foreach ($result as $row) {
  693. array_push($groupIds, $row['supportGroupId']);
  694. }
  695. // Get all the saved reply's ids that is associated with the user's group(s).
  696. $query = "select * from uv_saved_replies_groups";
  697. $stmt = $connection->prepare($query);
  698. $result = $stmt->executeQuery()->fetchAllAssociative();
  699. foreach ($result as $row) {
  700. if (in_array($row['group_id'], $groupIds)) {
  701. array_push($savedReplyIds, (int) $row['savedReply_id']);
  702. }
  703. }
  704. // Get the ids of the Team(s) the current user is associated with.
  705. $query = "select * from uv_user_support_teams";
  706. $connection = $this->entityManager->getConnection();
  707. $stmt = $connection->prepare($query);
  708. $result = $stmt->executeQuery()->fetchAllAssociative();
  709. foreach ($result as $row) {
  710. if ($row['userInstanceId'] == $userId) {
  711. array_push($teamIds, $row['supportTeamId']);
  712. }
  713. }
  714. $query = "select * from uv_saved_replies_teams";
  715. $stmt = $connection->prepare($query);
  716. $result = $stmt->executeQuery()->fetchAllAssociative();
  717. foreach ($result as $row) {
  718. if (in_array($row['subgroup_id'], $teamIds)) {
  719. array_push($savedReplyIds, (int)$row['savedReply_id']);
  720. }
  721. }
  722. return $savedReplyIds;
  723. }
  724. // Return formatted time on user preference basis
  725. public function getLocalizedFormattedTime(\DateTime $timestamp, $user = null, $format = 'm-d-y h:i A')
  726. {
  727. $activeUserTimeZone = $this->entityManager->getRepository(Website::class)->findOneBy(['code' => 'Knowledgebase']);
  728. if (!empty($user) && $user != 'anon.' && $user->getTimezone() != null) {
  729. $timestamp = clone $timestamp;
  730. $timestamp->setTimeZone(new \DateTimeZone($user->getTimeZone()));
  731. $format = $user->getTimeFormat();
  732. } elseif (!empty($activeUserTimeZone) && $activeUserTimeZone != 'anon.' && $activeUserTimeZone->getTimezone() != null) {
  733. $timestamp = clone $timestamp;
  734. $timestamp->setTimeZone(new \DateTimeZone($activeUserTimeZone->getTimeZone()));
  735. $format = $activeUserTimeZone->getTimeFormat();
  736. }
  737. return $timestamp->format($format);
  738. }
  739. public function isFileExists($filePath)
  740. {
  741. $dir = $this->container->get('kernel')->getProjectDir();
  742. $file = str_replace("\\", '/', $dir . "/" . $filePath);
  743. if (is_dir($file)) {
  744. return true;
  745. }
  746. return false;
  747. }
  748. public function getCustomersCountForKudos($container)
  749. {
  750. $qb = $this->entityManager->createQueryBuilder();
  751. $qb->select($qb->expr()->countDistinct('c.id') . "as customerCount")->from(Ticket::class, 't')
  752. ->leftJoin('t.customer', 'c');
  753. $container->get('report.service')->addPermissionFilter($qb, $this->container, false);
  754. return $qb->getQuery()->getSingleScalarResult();
  755. }
  756. public function getAssignedUserSupportPrivilegeDetails($user, $userInstance)
  757. {
  758. $queryBuilder = $this->entityManager->createQueryBuilder();
  759. $queryBuilder
  760. ->select('DISTINCT privilege.id, privilege.name, privilege.privileges')
  761. ->from(SupportPrivilege::class, 'privilege')
  762. ->leftJoin('privilege.users', 'userInstance')
  763. ->where('userInstance.id = :userInstanceId')->setParameter('userInstanceId', $userInstance->getId())
  764. ;
  765. return $queryBuilder->getQuery()->getResult();
  766. }
  767. }