src/Repository/UserRepository.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Company;
  4. use App\Entity\User;
  5. use App\Services\ToolsService;
  6. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Doctrine\ORM\NonUniqueResultException;
  9. use Doctrine\ORM\OptimisticLockException;
  10. use Doctrine\ORM\ORMException;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
  13. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  14. use Symfony\Component\Security\Core\Security;
  15. use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
  16. use Symfony\Component\Security\Core\User\UserInterface;
  17. /**
  18.  * @method User|null find($id, $lockMode = null, $lockVersion = null)
  19.  * @method User|null findOneBy(array $criteria, array $orderBy = null)
  20.  * @method User[]    findAll()
  21.  * @method User[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  22.  */
  23. class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterfaceUserLoaderInterface
  24. {
  25.     /**
  26.      * @var Security
  27.      */
  28.     private $security;
  29.     /**
  30.      * @var ToolsService
  31.      */
  32.     private $tools;
  33.     public function __construct(ManagerRegistry $registrySecurity $securityToolsService $tools)
  34.     {
  35.         parent::__construct($registryUser::class);
  36.         $this->security $security;
  37.         $this->tools $tools;
  38.     }
  39.     /**
  40.      * Used to upgrade (rehash) the user's password automatically over time.
  41.      * @param UserInterface $user
  42.      * @param string $newEncodedPassword
  43.      * @throws ORMException
  44.      * @throws OptimisticLockException
  45.      */
  46.     public function upgradePassword(UserInterface $userstring $newEncodedPassword): void
  47.     {
  48.         if (!$user instanceof User) {
  49.             throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user)));
  50.         }
  51.         $user->setPassword($newEncodedPassword);
  52.         $this->_em->persist($user);
  53.         $this->_em->flush();
  54.     }
  55.     /**
  56.      * @param string $username
  57.      * @return User|null
  58.      */
  59.     public function loadUserByUsername(string $username): ?User
  60.     {
  61.         $entityManager $this->getEntityManager();
  62.         try {
  63.             return $entityManager->createQuery(
  64.                 'SELECT u
  65.                     FROM App\Entity\User u
  66.                     WHERE u.username = :query'
  67.             )
  68.                 ->setParameter('query'$username)
  69.                 ->getOneOrNullResult();
  70.         } catch (NonUniqueResultException $e) {
  71.             return null;
  72.         }
  73.     }
  74.     /**
  75.      * @param string $username
  76.      * @param Company $company
  77.      * @return User|null
  78.      */
  79.     public function loadUserByUsernameAndCompany(string $usernameCompany $company): ?User
  80.     {
  81.         $entityManager $this->getEntityManager();
  82.         try {
  83.             return $entityManager->createQuery(
  84.                 'SELECT u
  85.                     FROM App\Entity\User u
  86.                     WHERE (u.username = :query
  87.                     OR u.email = :query) AND u.company = :company'
  88.             )
  89.                 ->setParameter('query'$username)
  90.                 ->setParameter('company'$company)
  91.                 ->getOneOrNullResult();
  92.         } catch (NonUniqueResultException $e) {
  93.             return null;
  94.         }
  95.     }
  96.     public function getStatsUsers(array $filters = [])
  97.     {
  98.         $defaultFilters = [
  99.             'company' => null,
  100.             'start' => null,
  101.             'end' => null,
  102.         ];
  103.         $filters array_merge($defaultFilters$filters);
  104.         $datas = [
  105.             'users_total' => [
  106.                 'count' => 0
  107.             ],
  108.             'users_active' => [
  109.                 'count' => 0
  110.             ]
  111.         ];
  112.         $filters['company'] = (isset($filters['company']) && $filters['company'] instanceof Company) ? $filters['company']->getId() : $filters['company'];
  113.         // Get departments Data
  114.         $sql "SELECT * FROM department ";
  115.         if(isset($filters['company'])) {
  116.             $sql .="WHERE company_id = {$filters['company']} ";
  117.         }
  118.         
  119.         $sql .= "ORDER BY name ASC;";
  120.         $departments $this->tools->getQueryResults($sql);
  121.         // Initialize $datas
  122.         foreach($departments as $department) {
  123.             $datas['users_total']['departments'][$department['id']] = [
  124.                 'name' => $department['name'],
  125.                 'count' => 0,
  126.                 'percent' => 0,
  127.             ];
  128.             $datas['users_total']['count'] = 0;
  129.             $datas['users_active']['departments'][$department['id']] = [
  130.                 'name' => $department['name'],
  131.                 'count' => 0,
  132.                 'percent' => 0,
  133.             ];
  134.             if($this->security->getUser() instanceof User && in_array("ROLE_ADMIN",$this->security->getUser()->getRoles())) {
  135.                 $datas['users_total']['departments'][$department['id']]['company'] = $department['company_id'];
  136.                 $datas['users_active']['departments'][$department['id']]['company'] = $department['company_id'];
  137.             }
  138.             $datas['users_active']['count'] = 0;
  139.         }
  140.         // Récupère un tableau d'utilisateurs actif
  141.         $sql "SELECT VE.user_id FROM `video_event` AS VE, user AS U
  142.             WHERE U.id = VE.user_id ";
  143.         if(isset($filters['company'])) {
  144.             $sql .= "AND U.company_id = {$filters['company']} ";
  145.         }
  146.         if(isset($filters['start']) && isset($filters['end'])) {
  147.             $sql .= "AND VE.date BETWEEN '".$filters['start']->format("Y-m-d H:i:s")."' AND '".$filters['end']->format("Y-m-d H:i:s")."' ";
  148.         }
  149.         $sql .= "AND VE.timecode > 0
  150.         GROUP BY VE.user_id";
  151.         $activeUsersQueryResults $this->tools->getQueryResults($sql);
  152.         $activeUsers = [];
  153.         foreach(array_values($activeUsersQueryResults) as $user) {
  154.             $activeUsers[] = $user['user_id'];
  155.         }
  156.         // Récupère tous les utilisateurs de la Company
  157.         $sql "SELECT * FROM user ";
  158.         if(isset($filters['company'])) {
  159.             $sql .="WHERE company_id = {$filters['company']} ";
  160.         }
  161.         $users $this->tools->getQueryResults($sql);
  162.         // Compte le nombre d'utilisateur, et utilisateurs actif par departement
  163.         foreach($users as $user) {
  164.             $datas['users_total']['count']++;
  165.             $departmentId = (empty($user['department_id'])) ? " " $user['department_id'];
  166.             if(!isset($datas['users_total']['departments'][$departmentId])){
  167.                 $datas['users_total']['departments'][$departmentId]['count'] = 0;
  168.             }
  169.             $datas['users_total']['departments'][$departmentId]['count']++;
  170.             $datas['users_total']['departments'][$departmentId]['percent'] = number_format(($datas['users_total']['departments'][$departmentId]['count']/$datas['users_total']['count'])*1002);
  171.             if(in_array($user['id'], $activeUsers)) {
  172.                 $datas['users_active']['count']++;
  173.                 if(!isset($datas['users_active']['departments'][$departmentId])) {
  174.                     $datas['users_active']['departments'][$departmentId]['count'] = 0;
  175.                 }
  176.                 $datas['users_active']['departments'][$departmentId]['count']++;
  177.                 $datas['users_active']['departments'][$departmentId]['percent'] = number_format(($datas['users_active']['departments'][$departmentId]['count']/$datas['users_active']['count'])*1002);
  178.             }
  179.         }
  180.         if(!isset($datas['users_active']['departments'])) {
  181.             $datas['users_active']['departments'] = [];
  182.         }
  183.         // Tri les departments par "count" DESC
  184.         $columnsTotal array_column($datas['users_total']['departments'], 'count');
  185.         array_multisort($columnsTotalSORT_DESC$datas['users_total']['departments']);
  186.         $columnsActive array_column($datas['users_active']['departments'], 'count');
  187.         array_multisort($columnsActiveSORT_DESC$datas['users_active']['departments']);
  188.         return $datas;
  189.     }
  190.     public function getUsersByRole(array $filters = [])
  191.     {
  192.         $defaultFilters = [
  193.             'role' => "ADMIN",
  194.             'active' => null,
  195.             'orderBy' => null,
  196.             'limit' => null,
  197.         ];
  198.         $filters array_merge($defaultFilters$filters);
  199.         $role strtoupper($filters['role']);
  200.         $date = new \DateTime();
  201.         $sql "SELECT 
  202.             U.id, 
  203.             U.code,
  204.             U.username,
  205.             U.roles,
  206.             U.password,
  207.             U.email,
  208.             U.quotas,
  209.             U.quotas_type AS quotasType,
  210.             U.active,
  211.             U.created_at AS createdAt,
  212.             U.recovery_token AS recoveryToken,
  213.             U.last_login AS lastLogin,
  214.             U.newsletter,
  215.             U.newsletter_date AS newsletterDate,
  216.             U.email_updated_at AS emailUpdatedAt,
  217.             U.email_validated_at AS emailValidatedAt,
  218.             U.first_login AS firstLogin,
  219.             U.home_survey AS homeSurvey,
  220.             U.status,
  221.             U.department_id AS departmentId,
  222.             U.company_id AS companyId,
  223.             C.name AS companyName,
  224.             C.active AS companyActive,
  225.             C.status AS companyStatus,
  226.             C.subscription_start AS companySubscriptionStart,
  227.             C.subscription_end AS companySubscriptionEnd
  228.             FROM user AS U
  229.             
  230.             LEFT JOIN company AS C ON U.company_id = C.id
  231.             WHERE U.roles LIKE '%\"ROLE_{$role}\"%'
  232.             AND C.active = 1
  233.             ";
  234.         if(isset($filters['active'])) {
  235.             $sql .= " AND U.active = {$filters['active']} ";
  236.         }
  237.         if(isset($filters['orderBy'])) {
  238.             $sql .= " ORDER BY {$filters['orderBy']} ";
  239.         }
  240.         if(isset($filters['limit'])) {
  241.             $sql .= "LIMIT {$filters['limit']} ";
  242.         }
  243.         try {
  244.             return $this->getQueryResults($sql);
  245.         } catch (\Throwable $th) {
  246.             return [];
  247.         }
  248.     }
  249.     private function getQueryResults(string $sql) {
  250.         $conn $this->getEntityManager()->getConnection();
  251.         $query $conn->prepare($sql);
  252.         $query $query->executeQuery();
  253.         return $query->fetchAllAssociative();
  254.     }
  255.     private function getQuery(array $criterias, array $orderBy null$limit null$offset null)
  256.     {
  257.         $sql "SELECT 
  258.             U.id, 
  259.             U.code,
  260.             U.username,
  261.             U.roles,
  262.             U.password,
  263.             U.email,
  264.             U.quotas,
  265.             U.quotas_type AS quotasType,
  266.             U.active,
  267.             U.created_at AS createdAt,
  268.             U.recovery_token AS recoveryToken,
  269.             U.last_login AS lastLogin,
  270.             U.newsletter,
  271.             U.newsletter_date AS newsletterDate,
  272.             U.email_updated_at AS emailUpdatedAt,
  273.             U.email_validated_at AS emailValidatedAt,
  274.             U.first_login AS firstLogin,
  275.             U.home_survey AS homeSurvey,
  276.             U.status,
  277.             U.department_id AS departmentId,
  278.             U.company_id AS companyId,
  279.             
  280.             C.name AS companyName,
  281.             C.active AS companyActive,
  282.             C.status AS companyStatus,
  283.             C.subscription_start AS companySubscriptionStart,
  284.             C.subscription_end AS companySubscriptionEnd,
  285.             C.manager_first_name AS companyManagerFirstName,
  286.             C.manager_last_name AS companyManagerLastName
  287.             FROM user AS U
  288.             
  289.             LEFT JOIN company AS C ON U.company_id = C.id
  290.             ";
  291.         // WHERE
  292.         if(!empty($criterias)) {
  293.             foreach($criterias as $key => $value) {
  294.                 $condition = (str_contains($sql"WHERE")) ? "AND " "WHERE ";
  295.                 $sql .= (intval($value)) ? "{$condition} U.{$this->tools->toSnakeCase($key)} = {$value} " "{$condition} U.{$this->tools->toSnakeCase($key)} LIKE '%{$value}%' ";
  296.             }
  297.         }
  298.         // ORDER BY
  299.         if(isset($orderBy) && is_array($orderBy)) {
  300.             $sql .= "ORDER BY ";
  301.             foreach($orderBy as $key => $value) {
  302.                 $condition = ($key !== array_key_first($orderBy)) ? ",""";
  303.                 $sql .= "{$condition} U.{$this->tools->toSnakeCase($key)} {$value} ";
  304.             }
  305.         }
  306.         // LIMIT
  307.         if(isset($limit)) {
  308.             $sql .= "LIMIT {$limit}";
  309.         }
  310.         return $sql;
  311.     }
  312.     public function getUsersInNativeSql(array $criterias, array $orderBy null$limit null$offset null)
  313.     {
  314.         $sql $this->getQuery($criterias$orderBy$limit$offset);
  315.         return $this->tools->getQueryResults($sqlfalse);
  316.     }
  317.     public function getUserByIdInNativeSql(int $id)
  318.     {
  319.         $sql $this->getQuery(['id' => $id]);
  320.         return $this->tools->getQueryResults($sqltrue);
  321.     }
  322.     /**
  323.      * Récupére tous les utilisateurs actifs
  324.      */
  325.     public function getActiveUsersInNativeSql(array $filters null, array $orderBy null)
  326.     {
  327.         $sql "SELECT 
  328.             U.id, 
  329.             U.code,
  330.             U.username,
  331.             U.roles,
  332.             U.password,
  333.             U.email,
  334.             U.quotas,
  335.             U.quotas_type AS quotasType,
  336.             U.active,
  337.             U.created_at AS createdAt,
  338.             U.recovery_token AS recoveryToken,
  339.             U.last_login AS lastLogin,
  340.             U.newsletter,
  341.             U.newsletter_date AS newsletterDate,
  342.             U.email_updated_at AS emailUpdatedAt,
  343.             U.email_validated_at AS emailValidatedAt,
  344.             U.first_login AS firstLogin,
  345.             U.home_survey AS homeSurvey,
  346.             U.status,
  347.             U.department_id AS departmentId,
  348.             U.company_id AS companyId,
  349.             C.name AS companyName,
  350.             C.active AS companyActive,
  351.             C.status AS companyStatus,
  352.             C.subscription_start AS companySubscriptionStart,
  353.             C.subscription_end AS companySubscriptionEnd
  354.         
  355.             FROM user AS U
  356.             LEFT JOIN company AS C ON U.company_id = C.id
  357.             
  358.             WHERE U.active = 1
  359.             AND U.email IS NOT NULL
  360.             AND U.last_login IS NOT NULL
  361.             
  362.             AND C.active = 1
  363.             AND C.status LIKE 'active'
  364.             AND NOW() > C.subscription_start
  365.             AND NOW() < C.subscription_end ";
  366.         if(!empty($filters)) {
  367.             $sql $this->tools->addAndWhereToQuery($sql$filters"U");
  368.         }
  369.         if(!empty($orderBy)) {
  370.             $sql $this->tools->addOrderByToQuery($sql$orderBy"U");
  371.         }
  372.         $result $this->tools->getQueryResults($sql);
  373.         return $result;
  374.     }
  375.     public function getUserCountActive($companyId)
  376.     {
  377.         $sql "SELECT COUNT(U.id) AS nb_user FROM user AS U WHERE U.company_id = {$companyId} AND U.active = 1 AND U.last_login IS NOT NULL ";
  378.         return $this->tools->getQueryResults($sqltrue);
  379.     }
  380.     public function patchIsFirstLogin(int $idint $isFirstLogin)
  381.     {
  382.         $result false;
  383.         try {
  384.             $sql "UPDATE user SET user.first_login = '{$isFirstLogin}' WHERE user.id = {$id}";
  385.             $conn $this->getEntityManager()->getConnection();
  386.             $query $conn->prepare($sql);
  387.             $query $query->executeQuery();
  388.             $result true;
  389.         } catch (\Throwable $th) {
  390.             // throw $th;
  391.         }
  392.         return $result;
  393.     }
  394.     public function customGetDisplayTeamplayTuto(int $id)
  395.     {
  396.         try {
  397.             $sql "
  398.                 SELECT
  399.                 user.display_teamplay_tuto
  400.                 FROM `user`
  401.                 WHERE user.id = {$id}
  402.             ";
  403.         } catch (\Throwable $th) {
  404.             // throw $th;
  405.         }
  406.         return $this->tools->getQueryResults($sqltrue);
  407.     }
  408.     public function getUserByEmailAndRoles(string $emailstring $role)
  409.     {
  410.         // $query = $this->createQueryBuilder('u')
  411.         //     ->andWhere('u.email = :email')
  412.         //     // ->andWhere('u.roles = ROLE_MANAGER"')
  413.         //     ->setParameter('email', $email)
  414.         // ;
  415.         // if ($env == "back") {
  416.         //     $query
  417.         //         ->andWhere('u.roles IN (:role)')
  418.         //         ->setParameter('role', json_encode(['ROLE_MANAGER']))
  419.         //     ;
  420.         // }
  421.         // return $query->getQuery()->getResult();
  422.         $sql "SELECT * FROM `user` WHERE email = '{$email}' AND roles LIKE '%{$role}%' ORDER BY created_at DESC ";
  423.         return $this->tools->getQueryResults($sqltrue);
  424.     }
  425. }