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

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