<?php
namespace App\Repository\Users;
use App\Entity\Users\Child as Student;
use App\Entity\Users\StudentsParents;
use App\Entity\Users\User;
use Bo\SubscriptionBundle\Entity\OfferHistory;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use ED\BlogBundle\Interfaces\Repository\BlogUserRepositoryInterface;
use Symfony\Component\Security\Core\User\UserInterface;
// this class previously extended EntityRepository, but BaseUserRepository also extends EntityRepository, so we can change the extends here thanks to inheritance
/**
* Class UserRepository
* @package Bo\UserBundle\Entity
*/
class UserRepository extends ServiceEntityRepository/* BaseUserRepository implements BlogUserRepositoryInterface*/
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
/**
* @param UserInterface $user
* @param string $discr
*/
public function changeUserDiscr(UserInterface $user, $discr)
{
$stmt = $this->_em->getConnection()->prepare('UPDATE aba_user SET discr = :discr WHERE id = :id');
$stmt->execute([
'discr' => $discr,
'id' => $user->getId(),
]);
$this->_em->detach($user);
}
/**
* @param User $user
*/
public function remove(User $user)
{
$this->_em->remove($user);
$this->_em->flush();
}
/**
* @param User $user
*/
public function save(User $user)
{
$this->_em->persist($user);
$this->_em->flush($user);
}
public function getNBUser($type = null){
$q = $this->_em->createQueryBuilder('u')
->select('COUNT(u)')
->from(User::class,'u');
if(is_null($type)){
$q=$q->where('u INSTANCE OF BoStudentBundle:Student')->orWhere('u INSTANCE OF BoUserBundle:Parents');
}
else{
if($type == 'parents'){
$q=$q->where('u INSTANCE OF BoUserBundle:Parents');
}else{
$q=$q->where('u INSTANCE OF BoStudentBundle:Student');
}
}
$q = $q->andWhere('u.created > \'2015-09-01 00:00:00\'');
return $q->getQuery()->getSingleScalarResult();
}
public function getUserForIntercom($type = null,$offset = 0, $limit = 100){
$q = $this->_em->createQueryBuilder('l')
->select('u')
->from(User::class,'u');
if(is_null($type)){
$q=$q->where('u INSTANCE OF BoStudentBundle:Student')->orWhere('u INSTANCE OF BoUserBundle:Parents');
}
else{
if($type == 'parents'){
$q=$q->where('u INSTANCE OF BoUserBundle:Parents');
}else{
$q=$q->where('u INSTANCE OF BoStudentBundle:Student');
}
}
$q = $q->andWhere('u.created > \'2015-09-01 00:00:00\'');
$q = $q->setFirstResult($offset)->setMaxResults($limit);
return $q->getQuery()->getResult();
}
/**
* @param array $criteria
* @return array|User[]
*/
public function findByUniqueCriteria($criteria)
{
return $this->_em->getRepository(User::class)->findBy($criteria);
}
/**
* Create the query for select old student
*
* @param string $lastLoginDate
* @return mixed
*/
public function createQueryForSelectOldStudent($lastLoginDate)
{
$q = $this->_em->createQueryBuilder('u')
->select('u.id');
$this->initQueryBuilderForOldStudent($q, $lastLoginDate);
return $q->getQuery();
}
/**
* Count the number of old students
*
* @param string $lastLoginDate
* @return mixed
* @throws \Doctrine\ORM\Query\QueryException
*/
public function countOldStudent($lastLoginDate)
{
$q = $this->_em->createQueryBuilder('u')
->select('COUNT(u.id)');
$this->initQueryBuilderForOldStudent($q, $lastLoginDate);
return $q->getQuery()->getSingleScalarResult();
}
/**
* Initialize query builder with restrictions of old student
*
* @param QueryBuilder $queryBuilder
* @param string $lastLoginDate
*/
private function initQueryBuilderForOldStudent(QueryBuilder $queryBuilder, $lastLoginDate)
{
$queryBuilder->from('BoStudentBundle:Student','u')
->where('u.guardiant IS NULL')
->andWhere('u.lastLogin IS NULL OR u.lastLogin < :lastLoginDate')
->andWhere('
(SELECT COUNT(s.id) FROM BoStudentBundle:OfferStudent s WHERE s.student = u.id) = 0 OR
(SELECT COUNT(s2.id) FROM BoStudentBundle:OfferStudent s2 WHERE s2.student = u.id AND s2.unSubscripted IS NULL) = 0
')
->setParameter('lastLoginDate', $lastLoginDate);
}
/**
* Disable old students by id. NOTE : we juste add "-supp" sufix and change the status of the student
*
* @param array $ids
*/
public function disableOldStudentByIds(array $ids)
{
$queryBuilder = $this->_em->createQueryBuilder('u');
$queryBuilder->update('BoStudentBundle:Student','u')
->set('u.username', $queryBuilder->expr()->concat('u.username', $queryBuilder->expr()->literal('-supp')))
->set('u.email', $queryBuilder->expr()->concat('u.email', $queryBuilder->expr()->literal('-supp')))
->set('u.usernameCanonical', $queryBuilder->expr()->concat('u.usernameCanonical', $queryBuilder->expr()->literal('-supp')))
->set('u.emailCanonical', $queryBuilder->expr()->concat('u.emailCanonical', $queryBuilder->expr()->literal('-supp')))
->set('u.status', OfferHistory::STATUS_DISABLE_MANUALLY)
->where($queryBuilder->expr()->in('u.id', ':ids'))
->setParameter('ids', $ids)
->getQuery()
->execute();
}
/**
* All list admin staff lesbonsprofs
*/
public function getAllStaff()
{
$qb = $this->_em->createQueryBuilder()
->select('u')
->from('BoUserBundle:User', 'u')
->Where("u.roles LIKE '%ROLE_MARKETING%' or u.roles LIKE '%ROLE_EDITOR%' or u.roles LIKE '%ROLE_SUPER_ADMIN%' or u.roles LIKE '%ROLE_ADMIN%' or u.roles LIKE '%ROLE_TEACHER_MAIN%' ")
->orderBy('u.id','desc')
->setMaxResults(150)
;
}
public function checkEmailExist($id,$email)
{
return $this->createQueryBuilder('u')
->where("u.email = :email and u.id != :id")
->setParameters(['email'=>$email,'id'=>$id])
->getQuery()->getResult()
;
}
/**
* @param $username
*/
public function getUsername($username)
{
$result = $this->_em->createQueryBuilder()
->select('u')
->from('BoUserBundle:User', 'u')
->where("u.username LIKE :username")
->setParameter('username', $username)
->getQuery()
->getResult();
return $result;
}
public function getBrothersNSisterByParents(array $parents){
if(empty($parents)){
return [];
}
$ids = [];
foreach ($parents as $row){
$ids[] = $row->getId();
}
$qb = $this->_em->createQueryBuilder();
$result = $this->_em->createQueryBuilder()
->select('distinct(u),u,u.firstname')
->from(User::class, 'u')
->join(StudentsParents::class,'sp',Join::WITH,'sp.student=u.id')
->where($qb->expr()->in('sp.parents', $ids))
->orderBy('u.firstname','asc')
->getQuery()
->getResult();
$tab = [];
foreach ($result as $tmp){
$tab[] = $tmp[0];
}
return $tab;
}
}