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

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