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

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