src/Repository/UserRepository.php line 13

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\User;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  5. use Doctrine\ORM\Query\Expr\Orx;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. class UserRepository extends ServiceEntityRepository
  8. {
  9.     public function __construct(ManagerRegistry $registry)
  10.     {
  11.         parent::__construct($registryUser::class);
  12.     }
  13.     public function findManyUsers($ids)
  14.     {
  15.         $qb $this->createQueryBuilder('U');
  16.         $qb->where($qb->expr()->in('U.id'$ids));
  17.         return $qb->getQuery()->getResult();
  18.     }
  19.     /**
  20.      * Find all users with roles and company
  21.      * @param $company
  22.      * @param $role
  23.      * @return array
  24.      */
  25.     public function findByRoleAndCompany($role$company)
  26.     {
  27.         return $this->createQueryBuilder('U')
  28.             ->leftJoin('U.roles''R')
  29.             ->addSelect('R')
  30.             ->where('U.company = :value')->setParameter('value'$company)
  31.             ->Where('R.name = :value')->setParameter('value'$role)
  32.             ->getQuery()
  33.             ->getResult();
  34.     }
  35.     /**
  36.      * Get all users for datatable query
  37.      */
  38.     public function getQueryUsers($roles$company$isContact null,$hasSites=false)
  39.     {
  40.         $queryBuilder $this->createQueryBuilder('u');
  41.         $query $queryBuilder
  42.             ->select('u.id')
  43.             ->addSelect('u.lastname')
  44.             ->addSelect('u.firstname')
  45.             ->addSelect('u.email')
  46.             ->addSelect('u.updatedAt')
  47.             ->addSelect('u.lastLoginAt')
  48.             ->addSelect('u.isContact as contact')
  49.             ->addSelect('d.name as department')
  50.             ->addSelect('r.name as role')
  51. //            ->orderBy('u.lastLoginAt','DESC')
  52.             ->leftJoin('u.roles''r')
  53.             ->leftJoin('u.department''d')
  54.             ->where('r.name IN (:roles)')->setParameter('roles'$roles)
  55.             ->andWhere('u.company = :company')->setParameter('company'$company);
  56.         if($hasSites){
  57.             $query->addSelect('s.name as site');
  58.             $query ->leftJoin('u.site','s');
  59.         }
  60.         if ($isContact != null) {
  61.             $query->andWhere('u.isContact = :contact')->setParameter('contact'$isContact);
  62.         }
  63.         return $query;
  64.     }
  65.     /**
  66.      * Get all users for datatable query
  67.      */
  68.     public function getQueryUsersWithStat($roles$company$type)
  69.     {
  70.         $qb $this->createQueryBuilder('u');
  71.         $query  =
  72.             $qb->select('u.id')
  73.             ->addSelect('u.lastname')
  74.             ->addSelect('u.firstname')
  75.             ->addSelect('d.name as department')
  76.             ->leftJoin('u.roles''r')
  77.             ->leftJoin('u.department''d')
  78.             ->where('r.name IN (:roles)')->setParameter('roles'$roles)
  79.             ->andWhere('u.company = :company')->setParameter('company'$company)
  80.             ->leftJoin('u.userActivities''ua')
  81.             ->leftJoin('ua.activity''a')
  82.             ->leftJoin('a.category''cat')
  83. //            ->addSelect('COUNT(cat.id) AS nb_question')
  84.             ->andWhere('cat.profile_type = :type')->setParameter('type'$type)
  85. //            ->addSelect($qb->expr()->countDistinct('a.id') . ' AS completion')
  86.             ->groupBy('u.id');
  87.         return $query;
  88.     }
  89.     /**
  90.      * Get all users for one company
  91.      */
  92.     public function getUsersForOneCompany($company$roles null)
  93.     {
  94.         if ($roles === null) {
  95.             $roles User::getStandardRoleNames();
  96.         }
  97.         $queryBuilder $this->createQueryBuilder('u');
  98.         $query $queryBuilder
  99.             //            ->select('u.id')
  100.             //            ->addSelect('u.lastname')
  101.             //            ->addSelect('u.firstname')
  102.             //            ->addSelect('u.email')
  103.             //            ->addSelect('u.updatedAt')
  104.             //            ->addSelect('d.name as department')
  105.             ->leftJoin('u.roles''r')
  106.             ->leftJoin('u.department''d')
  107.             ->where('r.name IN (:roles)')->setParameter('roles'$roles)
  108.             ->andWhere('u.company = :company')->setParameter('company'$company);
  109.         return $query->getQuery()->getResult();
  110.     }
  111.     public function removeDepartment($company){
  112.         $queryBuilder $this->createQueryBuilder('u');
  113.         $queryBuilder->update('App:User''u')
  114.             ->set('u.department'':department')
  115.             ->where('u.company = :company')
  116.             ->setParameter('department'null)
  117.             ->setParameter('company'$company)
  118.             ->getQuery()->execute();
  119.     }
  120.     public function removeJob($company){
  121.         $queryBuilder $this->createQueryBuilder('u');
  122.         $queryBuilder->update('App:User''u')
  123.             ->set('u.job'':job')
  124.             ->where('u.company = :company')
  125.             ->setParameter('job'null)
  126.             ->setParameter('company'$company)
  127.             ->getQuery()->execute();
  128.     }
  129.     public function findRHORContactEmailForCompany($company,$isContact=true){
  130.         $queryBuilder $this->createQueryBuilder('U');
  131.         $q $queryBuilder
  132.             ->select('U')
  133.             ->leftJoin('U.roles''R')
  134.             ->where('U.company = :value')->setParameter('value'$company);
  135.             if($isContact){
  136.                 $q->andWhere(
  137.                     new Orx([
  138.                         "U.isContact = 1",
  139.                         "R.name = 'ROLE_RH' ",
  140.                     ])
  141.                 );
  142.             }
  143.             else{
  144.                 $q->andWhere("R.name = 'ROLE_RH'");
  145.             }
  146.             return $q->getQuery()->getResult();
  147.     }
  148.     public function getWithRoleAndJob($user){
  149.         $queryBuilder $this->createQueryBuilder('u');
  150.         $q $queryBuilder
  151.             ->select('u.id')
  152.             ->addSelect('u.lastname')
  153.             ->addSelect('u.firstname')
  154.             ->addSelect('u.email')
  155.             ->addSelect('u.lastLoginAt')
  156.             ->addSelect('d.name as department')
  157.             ->addSelect('r.name as role')
  158.             ->addSelect('j.name as job')
  159.             ->leftJoin('u.roles''r')
  160.             ->leftJoin('u.department''d')
  161.             ->leftJoin('u.job''j')
  162.             ->where('u = :user')->setParameter('user'$user);
  163.         return $q->getQuery()->getResult();
  164.     }
  165.     public function findUsersNoYetRegisteredFromDate($startDate,$endDate)
  166.     {
  167.         $queryBuilder $this->createQueryBuilder('u');
  168.         $result $queryBuilder
  169.             ->select('u')
  170.             ->andWhere('u.createdAt > :start')
  171.             ->setParameter('start'$startDate)
  172.             ->andWhere('u.createdAt < :end')
  173.             ->setParameter('end'$endDate)
  174.             ->andWhere('u.password is null')
  175.             ->getQuery()
  176.             ->getResult()
  177.         ;
  178.         return $result;
  179.     }
  180.     public function findUsersRegistered($company)
  181.     {
  182.         $queryBuilder $this->createQueryBuilder('u');
  183.         $result $queryBuilder
  184.             ->select('u')
  185.             ->leftJoin('u.department''d')
  186.             ->andWhere('u.company = :company')->setParameter('company'$company)
  187.             ->andWhere('u.password is not null')
  188.             ->getQuery()
  189.             ->getResult()
  190.         ;
  191.         return $result;
  192.     }
  193.     /**
  194.      * @return User[]
  195.      */
  196.     public function findBySearchQuery(string $rawQuery,$company): array
  197.     {
  198.         $query $this->sanitizeSearchQuery($rawQuery);
  199.         $searchTerms $this->extractSearchTerms($query);
  200.         if (=== count($searchTerms)) {
  201.             return [];
  202.         }
  203.         $queryBuilder $this->createQueryBuilder('u');
  204.         $queryBuilder
  205.             ->select('u.id')
  206.             ->addSelect('u.lastname')
  207.             ->addSelect('u.firstname');
  208.         foreach ($searchTerms as $key => $term) {
  209.             $queryBuilder
  210.                 ->orWhere('u.lastname LIKE :t_' $key)
  211.                 ->orWhere('u.firstname LIKE :t_' $key)
  212.                 ->setParameter('t_' $key'%' $term '%');
  213.         }
  214.         return $queryBuilder
  215.             ->andWhere('u.company = :company')->setParameter('company'$company)
  216.             ->orderBy('u.lastname''DESC')
  217.             ->getQuery()
  218.             ->getResult();
  219.     }
  220.     /**
  221.      * Removes all non-alphanumeric characters except whitespaces.
  222.      */
  223.     private function sanitizeSearchQuery(string $query): string
  224.     {
  225.         return trim(preg_replace('/[[:space:]]+/'' '$query));
  226.     }
  227.     /**
  228.      * Splits the search query into terms and removes the ones which are irrelevant.
  229.      */
  230.     private function extractSearchTerms(string $searchQuery): array
  231.     {
  232.         $terms array_unique(explode(' '$searchQuery));
  233.         return array_filter($terms, function ($term) {
  234.             return <= mb_strlen($term);
  235.         });
  236.     }
  237. }