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

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