vendor/uvdesk/core-framework/Services/UVDeskService.php line 158

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\CoreFrameworkBundle\Services;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\DependencyInjection\ContainerInterface;
  6. use Webkul\UVDesk\SupportCenterBundle\Entity\KnowledgebaseWebsite;
  7. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  8. class UVDeskService
  9. {
  10. protected $container;
  11. protected $requestStack;
  12. protected $entityManager;
  13. private $avoidArray = [
  14. '!',
  15. '@',
  16. '#',
  17. '$',
  18. '%',
  19. '^',
  20. '&',
  21. '*',
  22. '(',
  23. ')',
  24. '_',
  25. '+',
  26. '-',
  27. '=',
  28. '/',
  29. '\\',
  30. ':',
  31. '{',
  32. '}',
  33. '[',
  34. ']',
  35. '<',
  36. '>',
  37. '.',
  38. '?',
  39. ';',
  40. '"',
  41. '\'',
  42. ',',
  43. '|',
  44. '1',
  45. '2',
  46. '3',
  47. '4',
  48. '5',
  49. '6',
  50. '7',
  51. '8',
  52. '9',
  53. '0',
  54. ' true ',
  55. ' false ',
  56. ' do ',
  57. ' did ',
  58. ' is ',
  59. ' are ',
  60. ' am ',
  61. ' was ',
  62. ' were ',
  63. ' has ',
  64. ' have ',
  65. ' had ',
  66. ' will ',
  67. ' would ',
  68. ' shall ',
  69. ' should ',
  70. ' must ',
  71. ' can ',
  72. ' could ',
  73. ' not ',
  74. ' never ',
  75. ' neither ',
  76. ' either ',
  77. ' the ',
  78. ' a ',
  79. ' an ',
  80. ' this ',
  81. ' that ',
  82. ' here ',
  83. ' there ',
  84. ' then ',
  85. ' when ',
  86. ' since ',
  87. ' he ',
  88. ' him ',
  89. ' himself ',
  90. ' she ',
  91. ' her ',
  92. ' herself ',
  93. ' i ',
  94. ' me ',
  95. ' myself ',
  96. ' mine ',
  97. ' you ',
  98. ' your ',
  99. ' yourself ',
  100. ' ur ',
  101. ' we ',
  102. ' ourself ',
  103. ' it ',
  104. ' its ',
  105. ' for ',
  106. ' from ',
  107. ' on ',
  108. ' and ',
  109. ' in ',
  110. ' be ',
  111. ' to ',
  112. ' or ',
  113. ' of ',
  114. ' with ',
  115. ' what ',
  116. ' why ',
  117. ' where ',
  118. ' who ',
  119. ' whom ',
  120. ' which ',
  121. ' a ',
  122. ' b ',
  123. ' c ',
  124. ' d ',
  125. ' e ',
  126. ' f ',
  127. ' g ',
  128. ' h ',
  129. ' i ',
  130. ' j ',
  131. ' k ',
  132. ' l ',
  133. ' m ',
  134. ' n ',
  135. ' o ',
  136. ' p ',
  137. ' q ',
  138. ' r ',
  139. ' s ',
  140. ' t ',
  141. ' u ',
  142. ' v ',
  143. ' w ',
  144. ' x ',
  145. ' y ',
  146. ' z ',
  147. ' ',
  148. ];
  149. public function __construct(ContainerInterface $container, RequestStack $requestStack, EntityManagerInterface $entityManager, UserService $userService)
  150. {
  151. $this->container = $container;
  152. $this->requestStack = $requestStack;
  153. $this->entityManager = $entityManager;
  154. $this->userService = $userService;
  155. }
  156. public function updatesLocales($locales)
  157. {
  158. $fileTranslation = $this->container->get('kernel')->getProjectDir() . '/config/packages/translation.yaml';
  159. $fileServices = $this->container->get('kernel')->getProjectDir() . '/config/services.yaml';
  160. // get file content and index
  161. $fileTrans = file($fileTranslation);
  162. $fileServs = file($fileServices);
  163. foreach ($fileTrans as $index => $content) {
  164. if (false !== strpos($content, 'default_locale')) {
  165. list($helpdesk_panel_locales, $helpdesk_panel_text) = array($index, $content);
  166. }
  167. if (false !== strpos($content, '- ')) {
  168. list($helpdesk_panel_locales_fallback, $helpdesk_panel_text_fallback) = array($index, $content);
  169. }
  170. }
  171. foreach ($fileServs as $indexs => $contents) {
  172. if (false !== strpos($contents, 'locale')) {
  173. list($helpdesk_services_locales, $helpdesk_services_text) = array($indexs, $contents);
  174. }
  175. }
  176. // save updated data in a variable ($updatedFileContent)
  177. $updatedFileContent = $fileTrans;
  178. $updatedServicesFileContent = $fileServs;
  179. $updatedlocales = (null !== $helpdesk_panel_locales) ? substr($helpdesk_panel_text, 0, strpos($helpdesk_panel_text, 'default_locale') + strlen('default_locale: ')) . $locales . PHP_EOL : '';
  180. $updatedlocales_fallback = (null !== $helpdesk_panel_locales_fallback) ? substr($helpdesk_panel_text_fallback, 0, strpos($helpdesk_panel_text_fallback, '- ') + strlen('- ')) . $locales . PHP_EOL : '';
  181. $updatedServiceslocales = (null !== $helpdesk_services_locales) ? substr($helpdesk_services_text, 0, strpos($helpdesk_services_text, 'locale') + strlen('locale: ')) . $locales . PHP_EOL : '';
  182. $updatedFileContent[$helpdesk_panel_locales] = $updatedlocales;
  183. $updatedFileContent[$helpdesk_panel_locales_fallback] = $updatedlocales_fallback;
  184. $updatedServicesFileContent[$helpdesk_services_locales] = $updatedServiceslocales;
  185. // flush updated content in file
  186. $status = file_put_contents($fileTranslation, $updatedFileContent);
  187. $status1 = file_put_contents($fileServices, $updatedServicesFileContent);
  188. return true;
  189. }
  190. public function getLocalesList()
  191. {
  192. $translator = $this->container->get('translator');
  193. return [
  194. 'en' => $translator->trans("English"),
  195. 'fr' => $translator->trans("French"),
  196. 'it' => $translator->trans("Italian"),
  197. 'ar' => $translator->trans("Arabic"),
  198. 'de' => $translator->trans("German"),
  199. 'es' => $translator->trans("Spanish"),
  200. 'tr' => $translator->trans("Turkish"),
  201. 'da' => $translator->trans("Danish"),
  202. 'zh' => $translator->trans("Chinese"),
  203. 'pl' => $translator->trans("Polish"),
  204. 'he' => $translator->trans("Hebrew"),
  205. 'pt_BR' => $translator->trans("Portuguese"),
  206. 'hu' => $translator->trans("Hungarian"),
  207. ];
  208. }
  209. public function getActiveLocales()
  210. {
  211. $localesList = $this->getLocalesList();
  212. $activeLocales = $this->container->getParameter("app_locales");
  213. $explodeActiveLocales = explode("|", $activeLocales);
  214. return $explodeActiveLocales;
  215. }
  216. public function getLocales()
  217. {
  218. $localesList = $this->getLocalesList();
  219. $explodeActiveLocales = $this->getActiveLocales();
  220. $listingActiveLocales = array();
  221. foreach ($explodeActiveLocales as $key => $value) {
  222. $listingActiveLocales[$value] = $localesList[$value];
  223. }
  224. return $listingActiveLocales;
  225. }
  226. public function getDefaultLangauge()
  227. {
  228. return $this->container->getParameter("kernel.default_locale");
  229. }
  230. public function getTimezones()
  231. {
  232. return \DateTimeZone::listIdentifiers();
  233. }
  234. public function getPrivileges()
  235. {
  236. $agentPrivilegeCollection = [];
  237. // $agentPrivilegeCollection = $this->entityManager->getRepository('UserBundle:AgentPrivilege')->findAll();
  238. return $agentPrivilegeCollection;
  239. }
  240. public function getLocaleUrl($locale)
  241. {
  242. $request = $this->requestStack->getCurrentRequest();
  243. return str_replace('/' . $request->getLocale() . '/', '/' . $locale . '/', $request->getRequestUri());
  244. }
  245. public function buildPaginationQuery(array $query = [])
  246. {
  247. $params = array();
  248. $query['page'] = "replacePage";
  249. if (isset($query['domain'])) unset($query['domain']);
  250. if (isset($query['_locale'])) unset($query['_locale']);
  251. foreach ($query as $key => $value) {
  252. $params[] = !isset($value) ? $key : $key . '/' . str_replace('%2F', '/', rawurlencode($value));
  253. }
  254. $http_query = implode('/', $params);
  255. if (isset($query['new'])) {
  256. $http_query = str_replace('new/1', 'new', $http_query);
  257. } elseif (isset($query['unassigned'])) {
  258. $http_query = str_replace('unassigned/1', 'unassigned', $http_query);
  259. } elseif (isset($query['notreplied'])) {
  260. $http_query = str_replace('notreplied/1', 'notreplied', $http_query);
  261. } elseif (isset($query['mine'])) {
  262. $http_query = str_replace('mine/1', 'mine', $http_query);
  263. } elseif (isset($query['starred'])) {
  264. $http_query = str_replace('starred/1', 'starred', $http_query);
  265. } elseif (isset($query['trashed'])) {
  266. $http_query = str_replace('trashed/1', 'trashed', $http_query);
  267. }
  268. return $http_query;
  269. }
  270. public function getEntityManagerResult($entity, $callFunction, $args = false, $extraPrams = false)
  271. {
  272. if ($extraPrams)
  273. return $this->entityManager->getRepository($entity)
  274. ->$callFunction($args, $extraPrams);
  275. else
  276. return $this->entityManager->getRepository($entity)
  277. ->$callFunction($args);
  278. }
  279. public function getValidBroadcastMessage($msg, $format = 'Y-m-d H:i:s')
  280. {
  281. $broadcastMessage = !empty($msg) ? json_decode($msg, true) : false;
  282. if (
  283. ! empty($broadcastMessage)
  284. && isset($broadcastMessage['isActive'])
  285. && $broadcastMessage['isActive']
  286. ) {
  287. $timezone = new \DateTimeZone('Asia/Kolkata');
  288. $nowTimestamp = date('U');
  289. if (array_key_exists('from', $broadcastMessage) && ($fromDateTime = \DateTime::createFromFormat($format, $broadcastMessage['from'], $timezone))) {
  290. $fromTimeStamp = $fromDateTime->format('U');
  291. if ($nowTimestamp < $fromTimeStamp) {
  292. return false;
  293. }
  294. }
  295. if (array_key_exists('to', $broadcastMessage) && ($toDateTime = \DateTime::createFromFormat($format, $broadcastMessage['to'], $timezone))) {
  296. $toTimeStamp = $toDateTime->format('U');;
  297. if ($nowTimestamp > $toTimeStamp) {
  298. return false;
  299. }
  300. }
  301. } else {
  302. return false;
  303. }
  304. // return valid broadcast message Array
  305. return $broadcastMessage;
  306. }
  307. public function getConfigParameter($param)
  308. {
  309. if (
  310. $param
  311. && $this->container->hasParameter($param)
  312. ) {
  313. return $this->container->getParameter($param);
  314. } else {
  315. return false;
  316. }
  317. }
  318. public function isDarkSkin($brandColor)
  319. {
  320. $brandColor = str_replace('#', '', $brandColor);
  321. if (strlen($brandColor) == 3)
  322. $brandColor .= $brandColor;
  323. $chars = str_split($brandColor);
  324. $a2fCount = 0;
  325. foreach ($chars as $key => $char) {
  326. if (in_array($key, [0, 2, 4]) && in_array(strtoupper($char), ['A', 'B', 'C', 'D', 'E', 'F'])) {
  327. $a2fCount++;
  328. }
  329. }
  330. if ($a2fCount >= 2)
  331. return true;
  332. else
  333. return false;
  334. }
  335. public function getActiveConfiguration($websiteId)
  336. {
  337. $configurationRepo = $this->entityManager->getRepository(KnowledgebaseWebsite::class);
  338. $configuration = $configurationRepo->findOneBy(['website' => $websiteId, 'isActive' => 1]);
  339. return $configuration;
  340. }
  341. public function getSupportPrivelegesResources()
  342. {
  343. $translator = $this->container->get('translator');
  344. return [
  345. 'ticket' => [
  346. 'ROLE_AGENT_CREATE_TICKET' => $translator->trans('Can create ticket'),
  347. 'ROLE_AGENT_EDIT_TICKET' => $translator->trans('Can edit ticket'),
  348. 'ROLE_AGENT_DELETE_TICKET' => $translator->trans('Can delete ticket'),
  349. 'ROLE_AGENT_RESTORE_TICKET' => $translator->trans('Can restore trashed ticket'),
  350. 'ROLE_AGENT_ASSIGN_TICKET' => $translator->trans('Can assign ticket'),
  351. 'ROLE_AGENT_ASSIGN_TICKET_GROUP' => $translator->trans('Can assign ticket group'),
  352. 'ROLE_AGENT_UPDATE_TICKET_STATUS' => $translator->trans('Can update ticket status'),
  353. 'ROLE_AGENT_UPDATE_TICKET_PRIORITY' => $translator->trans('Can update ticket priority'),
  354. 'ROLE_AGENT_UPDATE_TICKET_TYPE' => $translator->trans('Can update ticket type'),
  355. 'ROLE_AGENT_ADD_NOTE' => $translator->trans('Can add internal notes to ticket'),
  356. 'ROLE_AGENT_EDIT_THREAD_NOTE' => $translator->trans('Can edit thread/notes'),
  357. 'ROLE_AGENT_MANAGE_LOCK_AND_UNLOCK_THREAD' => $translator->trans('Can lock/unlock thread'),
  358. 'ROLE_AGENT_ADD_COLLABORATOR_TO_TICKET' => $translator->trans('Can add collaborator to ticket'),
  359. 'ROLE_AGENT_DELETE_COLLABORATOR_FROM_TICKET' => $translator->trans('Can delete collaborator from ticket'),
  360. 'ROLE_AGENT_DELETE_THREAD_NOTE' => $translator->trans('Can delete thread/notes'),
  361. 'ROLE_AGENT_APPLY_WORKFLOW' => $translator->trans('Can apply prepared response on ticket'),
  362. 'ROLE_AGENT_ADD_TAG' => $translator->trans('Can add ticket tags'),
  363. 'ROLE_AGENT_DELETE_TAG' => $translator->trans('Can delete ticket tags')
  364. ],
  365. 'advanced' => [
  366. 'ROLE_AGENT_MANAGE_EMAIL_TEMPLATE' => $translator->trans('Can manage email templates'),
  367. 'ROLE_AGENT_MANAGE_GROUP' => $translator->trans('Can manage groups'),
  368. 'ROLE_AGENT_MANAGE_SUB_GROUP' => $translator->trans('Can manage Sub-Groups/ Teams'),
  369. 'ROLE_AGENT_MANAGE_AGENT' => $translator->trans('Can manage agents'),
  370. 'ROLE_AGENT_MANAGE_AGENT_PRIVILEGE' => $translator->trans('Can manage agent privileges'),
  371. 'ROLE_AGENT_MANAGE_TICKET_TYPE' => $translator->trans('Can manage ticket types'),
  372. 'ROLE_AGENT_MANAGE_CUSTOMER' => $translator->trans('Can manage customers'),
  373. 'ROLE_AGENT_MANAGE_WORKFLOW_MANUAL' => $translator->trans('Can manage Prepared Responses'),
  374. 'ROLE_AGENT_MANAGE_WORKFLOW_AUTOMATIC' => $translator->trans('Can manage Automatic workflow'),
  375. 'ROLE_AGENT_MANAGE_TAG' => $translator->trans('Can manage tags'),
  376. 'ROLE_AGENT_MANAGE_KNOWLEDGEBASE' => $translator->trans('Can manage knowledgebase'),
  377. 'ROLE_AGENT_MANAGE_AGENT_ACTIVITY' => $translator->trans("Can manage agent activity"),
  378. 'ROLE_AGENT_MANAGE_MARKETING_ANNOUNCEMENT' => $translator->trans("Can manage marketing announcement"),
  379. 'ROLE_AGENT_MANAGE_APP' => $translator->trans("Can manage apps"),
  380. ]
  381. ];
  382. }
  383. public function generateCsrfToken($intention)
  384. {
  385. $csrf = $this->container->get('security.csrf.token_manager');
  386. return $csrf->getToken($intention)->getValue();
  387. }
  388. /**
  389. * This function will create content text from recived text, which we can use in meta content and as well in searching save like elastic
  390. * @param string $text String text
  391. * @param no. $length max return length string (which will convert to array)
  392. * @param boolean $returnArray what return type required
  393. * @return string/ array comma seperated/ []
  394. */
  395. public function createConentToKeywords($text, $length = 255, $returnArray = false)
  396. {
  397. //to remove all tags from text, if any tags are in encoded form
  398. $newText = preg_replace('/[\s]+/', ' ', str_replace($this->avoidArray, ' ', strtolower(strip_tags(html_entity_decode(strip_tags($text))))));
  399. if ($length)
  400. $newText = substr($newText, 0, $length);
  401. return ($returnArray ? explode(' ', $newText) : str_replace(' ', ',', $newText));
  402. }
  403. public function requestHeadersSent()
  404. {
  405. return headers_sent() ? true : false;
  406. }
  407. /**
  408. * get current prefixes of member panel and knowledgebase
  409. */
  410. public function getCurrentWebsitePrefixes()
  411. {
  412. $filePath = $this->container->get('kernel')->getProjectDir() . '/config/packages/uvdesk.yaml';
  413. // get file content and index
  414. $file = file($filePath);
  415. foreach ($file as $index => $content) {
  416. if (false !== strpos($content, 'uvdesk_site_path.member_prefix')) {
  417. list($member_panel_line, $member_panel_text) = array($index, $content);
  418. }
  419. if (false !== strpos($content, 'uvdesk_site_path.knowledgebase_customer_prefix')) {
  420. list($customer_panel_line, $customer_panel_text) = array($index, $content);
  421. }
  422. }
  423. $memberPrefix = substr($member_panel_text, strpos($member_panel_text, 'uvdesk_site_path.member_prefix') + strlen('uvdesk_site_path.member_prefix: '));
  424. $knowledgebasePrefix = substr($customer_panel_text, strpos($customer_panel_text, 'uvdesk_site_path.knowledgebase_customer_prefix') + strlen('uvdesk_site_path.knowledgebase_customer_prefix: '));
  425. return [
  426. 'memberPrefix' => trim(preg_replace('/\s\s+/', ' ', $memberPrefix)),
  427. 'knowledgebasePrefix' => trim(preg_replace('/\s\s+/', ' ', $knowledgebasePrefix)),
  428. ];
  429. }
  430. /**
  431. * update your website prefixes
  432. */
  433. public function updateWebsitePrefixes($member_panel_prefix, $knowledgebase_prefix)
  434. {
  435. $filePath = $this->container->get('kernel')->getProjectDir() . '/config/packages/uvdesk.yaml';
  436. $website_prefixes = [
  437. 'member_prefix' => $member_panel_prefix,
  438. 'customer_prefix' => $knowledgebase_prefix,
  439. ];
  440. // get file content and index
  441. $file = file($filePath);
  442. foreach ($file as $index => $content) {
  443. if (false !== strpos($content, 'uvdesk_site_path.member_prefix')) {
  444. list($member_panel_line, $member_panel_text) = array($index, $content);
  445. }
  446. if (false !== strpos($content, 'uvdesk_site_path.knowledgebase_customer_prefix')) {
  447. list($customer_panel_line, $customer_panel_text) = array($index, $content);
  448. }
  449. }
  450. // save updated data in a variable ($updatedFileContent)
  451. $updatedFileContent = $file;
  452. // get old member-prefix
  453. $oldMemberPrefix = substr($member_panel_text, strpos($member_panel_text, 'uvdesk_site_path.member_prefix') + strlen('uvdesk_site_path.member_prefix: '));
  454. $oldMemberPrefix = preg_replace('/([\r\n\t])/', '', $oldMemberPrefix);
  455. $updatedPrefixForMember = (null !== $member_panel_line) ? substr($member_panel_text, 0, strpos($member_panel_text, 'uvdesk_site_path.member_prefix') + strlen('uvdesk_site_path.member_prefix: ')) . $website_prefixes['member_prefix'] . PHP_EOL : '';
  456. $updatedPrefixForCustomer = (null !== $customer_panel_line) ? substr($customer_panel_text, 0, strpos($customer_panel_text, 'uvdesk_site_path.knowledgebase_customer_prefix') + strlen('uvdesk_site_path.knowledgebase_customer_prefix: ')) . $website_prefixes['customer_prefix'] . PHP_EOL : '';
  457. $updatedFileContent[$member_panel_line] = $updatedPrefixForMember;
  458. $updatedFileContent[$customer_panel_line] = $updatedPrefixForCustomer;
  459. // flush updated content in file
  460. file_put_contents($filePath, $updatedFileContent);
  461. $router = $this->container->get('router');
  462. $knowledgebaseURL = $router->generate('helpdesk_knowledgebase');
  463. $memberLoginURL = $router->generate('helpdesk_member_handle_login');
  464. $memberLoginURL = str_replace($oldMemberPrefix, $website_prefixes['member_prefix'], $memberLoginURL);
  465. return $collectionURL = [
  466. 'memberLogin' => $memberLoginURL,
  467. 'knowledgebase' => $knowledgebaseURL,
  468. ];
  469. }
  470. public static function getTimeFormats()
  471. {
  472. return array(
  473. 'm-d-y G:i' => 'm-d-y G:i (01-15-1991 13:00)',
  474. 'm-d-y h:ia' => 'm-d-y h:ia (01-15-1991 01:00pm)',
  475. 'd-m-y G:i' => 'd-m-y G:i (15-01-1991 13:00)',
  476. 'd-m-y h:ia' => 'd-m-y h:ia (15-01-1991 01:00pm)',
  477. 'd-m G:i' => 'd-m G:i (15-01 13:00)',
  478. 'd-m h:ia' => 'd-m h:ia (15-01 01:00pm)',
  479. 'd-M G:i' => 'd-M G:i (15-Jan 13:00)',
  480. 'd-M h:ia' => 'd-M h:ia (15-Jan 01:00pm)',
  481. 'D-m G:i' => 'D-m G:i (Mon-01 13:00)',
  482. 'D-m h:ia' => 'D-m h:ia (Mon-01 01:00pm)',
  483. 'Y-m-d H:i:sa' => 'Y-m-d H:i:s (1991-01-15 01:00:30pm)',
  484. );
  485. }
  486. public function generateCompleteLocalResourcePathUri($resource)
  487. {
  488. $resourceUriComponent = parse_url($resource);
  489. if (!empty($resourceUriComponent['scheme'])) {
  490. return $resource;
  491. }
  492. if (empty($this->completeLocalResourcePathUri)) {
  493. $router = $this->container->get('router');
  494. $scheme = $router->getContext()->getScheme();
  495. $siteurl = $this->container->getParameter('uvdesk.site_url');
  496. $baseurl = "$scheme://$siteurl";
  497. $urlComponents = parse_url($baseurl);
  498. $completeLocalResourcePathUri = "{$urlComponents['scheme']}://{$urlComponents['host']}";
  499. if (!empty($urlComponents['path'])) {
  500. $completeLocalResourcePathUri .= $urlComponents['path'];
  501. }
  502. if (substr($completeLocalResourcePathUri, -1) == '/') {
  503. $completeLocalResourcePathUri = substr($completeLocalResourcePathUri, 0, -1);
  504. }
  505. $this->completeLocalResourcePathUri = $completeLocalResourcePathUri;
  506. }
  507. if ($resource[0] != '/') {
  508. $resource = "/$resource";
  509. }
  510. return $this->completeLocalResourcePathUri . $resource;
  511. }
  512. public function getAvailableUserAccessScopes($user, $userInstance)
  513. {
  514. $supportRole = $userInstance->getSupportRole();
  515. $isAdminAccessGranted = in_array($supportRole->getId(), [1, 2]) ? true : false;
  516. $availableSupportPrivileges = $this->getSupportPrivelegesResources();
  517. $resolvedAvailableSupportPrivileges = [];
  518. foreach ($availableSupportPrivileges as $index => $collection) {
  519. foreach ($collection as $privilegeId => $privilegeDescription) {
  520. $resolvedAvailableSupportPrivileges[] = $privilegeId;
  521. }
  522. }
  523. if (false == $isAdminAccessGranted) {
  524. $assignedUserSupportPrivileges = $this->userService->getAssignedUserSupportPrivilegeDetails($user, $userInstance);
  525. $resolvedAssignedUserSupportPrivileges = [];
  526. foreach ($assignedUserSupportPrivileges as $assignedSupportPrivilege) {
  527. foreach ($assignedSupportPrivilege['privileges'] as $privilegeId) {
  528. $resolvedAssignedUserSupportPrivileges[] = $privilegeId;
  529. }
  530. }
  531. return array_map(function ($supportPrivilege) {
  532. return strtolower(str_replace('ROLE_AGENT_', '', $supportPrivilege));
  533. }, $resolvedAssignedUserSupportPrivileges);
  534. }
  535. return array_map(function ($supportPrivilege) {
  536. return strtolower(str_replace('ROLE_AGENT_', '', $supportPrivilege));
  537. }, $resolvedAvailableSupportPrivileges);
  538. }
  539. }