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

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