<?php
namespace WebBundle\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\DBAL\DBALException;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use Import1CBundle\Helper\v3\ConnectionHelper;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
use WebBundle\Entity\User;
use WebBundle\Helper\App;
use WebBundle\Helper\StrHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Traits\RepoTrait;
/**
* @method User|null findOneByUnid(string $unid)
* @method User|null findOneByEmail(string $email)
* @method User|null findOneByToken(string $token)
*/
class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface
{
use RepoTrait;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
public function upgradePassword(User $user, string $newHashedPassword)
{
$user->setPassword($newHashedPassword);
$user->setSalt(null);
$this->getEntityManager()->flush();
}
public function joinQuery($alias = 'u')
{
return $this->createQueryBuilder($alias)
->select("{$alias}");
}
/**
* Проверка токена
* @throws NonUniqueResultException
*/
public function getUserByToken(string $token): ?User
{
$q = $this->createQueryBuilder('u')
->where('u.token = :token')
->setParameter('token', $token)
->setMaxResults(1)
->getQuery();
return $q->getOneOrNullResult();
}
/**
* выбор менегеров для отчета по БМ
* @return array|null
*/
public function getEmployerUserManager()
{
$q = $this->createQueryBuilder('u')
->select('DISTINCT(u.alias) as alias, u.id, u.unid, u.roles')
->leftJoin('u.factories', 'f')
->andWhere('f.user is not null')
->andWhere('u.id <> :id')
->setParameter('id', 492295)
//->andWhere('e.fired =:fired')
//->andWhere('f.status =:status')
//->setParameter('fired', false)
//->setParameter('status', BiConst::STATE_PUBLISHED)
->orderBy('u.alias')
->getQuery();
return $q->getResult();
}
/**
* Получаем всех юзеров, у которых указаны локали
* @return array|null
*/
public function getActualUsers()
{
$role = 'a:0:{}';
$q = $this->createQueryBuilder('u')
->andWhere('u.roles != :role')
->setParameter('role', $role)
->orderBy('u.alias')
->getQuery();
$items = $q->getArrayResult();
$all = [];
if ($items) {
foreach ($items as $item) {
$all[$item['id']] = [
'id' => $item['id'],
'alias' => $item['alias'],
];
}
}
return $all;
}
/**
* Получаем всех юзеров, у которых назначены participants
* @return array|null
*/
public function getUsersByParticipants()
{
$q = $this->createQueryBuilder('u')
->select('u,p')
->innerJoin('u.participants', 'p')
->orderBy('u.alias')
->getQuery();
return $q->getArrayResult();
}
/**
* получить список менегеров серий для вывода в списке привязки звука
* @return array|null
*/
public function getManagers()
{
$role = '%ROLE_BM%';
$q = $this->createQueryBuilder('u')
->andWhere('u.roles like :role')
->setParameter('role', $role)
->orderBy('u.alias')
->getQuery();
$items = $q->getArrayResult();
$all = [];
if ($items) {
$all[] = ['id' => 'all', 'alias' => 'All'];
foreach ($items as $item) {
$all[] = ['id' => $item['id'], 'alias' => $item['alias']];
}
}
return $all;
}
/**
* @param string $url
* @return array|null
*/
public function getUrls($url)
{
$q = $this->createQueryBuilder('u')
->select('p.url')
->innerJoin('u.profile', 'p')
->andWhere('p.url LIKE :url')
->setParameter('url', $url . '%')
->getQuery()
->useQueryCache(true);
$res = $q->getArrayResult();
return count($res) > 0 ? array_column($res, 'url') : [];
}
/**
* Проверяет email на наличие у других юзеров
*
* @param $email
* @param $token
* @return int|mixed
*/
public function checkEmail($email, $token): int
{
$q = $this->createQueryBuilder('u')
->select('COUNT(u.id)')
->andWhere('u.email = :email')
->andWhere('u.token != :token')
->setParameters([
'email' => StrHelper::toLower($email),
'token' => StrHelper::toLower($token),
])
->getQuery()
->useQueryCache(true);
try {
return (int) $q->getSingleScalarResult();
} catch (NonUniqueResultException | NoResultException $e) {
return 0;
}
}
/**
* получить список менегеров серий для вывода в списке привязки звука
* @return array|null
*/
public function getListKons()
{
$q = $this->createQueryBuilder('u')
->select('u.id, u.unid, u.alias, u.roles, u.username, u.email')
->andWhere('u.enabled = true')
->andWhere('u.isActive = true')
->andWhere('u.roles like :role AND u.roles not like :role_all')
->setParameter('role', '%ROLE_TR%')
->setParameter('role_all', '%ROLE_TR_ALL%')
->orderBy('u.alias')
->getQuery();
$items = $q->getArrayResult();
return $items;
}
/**
* @param $id
* @return array
* @throws Exception
*/
public function getUserForStatTrans($id)
{
$q = $this->createQueryBuilder('u')
->select('u.id, u.alias, u.roles, u.username, u.email')
->andWhere('u.id = :id')
->setParameter('id', $id)
->getQuery();
$items = $q->getArrayResult();
if ($items) {
$items = $items[0];
$oServiceUser = App::getContainer()->get('adm.service.users');
$items['alias'] = $oServiceUser->buildEasyName($items['alias']);
}
return $items;
}
/**
* @param $unid
* @return array
* @throws Exception
*/
public function getUserForStatTransApi($unid)
{
$q = $this->createQueryBuilder('u')
->select('u.id, u.unid, u.alias, u.username')
->andWhere('u.unid = :unid')->setParameter('unid', $unid)
->andWhere('u.roles like :role')->setParameter('role', '%ROLE_TR%')
->getQuery();
$items = $q->getArrayResult();
if ($items) {
$items = $items[0];
$oServiceUser = App::getContainer()->get('adm.service.users');
$items['alias'] = $oServiceUser->buildEasyName($items['alias']);
}
return $items;
}
/**
* Список консов для админки для страница контактов
* @param $logins
* @return array
*/
public function getConsList($logins)
{
//$oServiceUser = App::getContainer()->get('adm.service.users');
$logins = implode("', '", $logins);
$sql = "SELECT
u.id, u.unid, u.alias, u.username
FROM
user u
WHERE u.username IN ('{$logins}')";
$items = $this->_em->getConnection()->fetchAll($sql);
$rows = [];
foreach ($items as $item) {
$rows[$item['username']] = $item['username'] . ' (' . $item['alias'] . ')';
//$rows[$item['username']] = $item['username'] . ' (' . $oServiceUser->buildEasyName($item['alias']) . ')';
}
return $rows;
}
/**
* @param $unids
* @return mixed
*/
public function getUsersByUnids($unids)
{
$q = $this->createQueryBuilder('u')
->select('u')
->andWhere('u.unid IN (:unids)')
->setParameter('unids', $unids)
->getQuery();
return $q->getResult();
}
public function getUsersWithNullUnids()
{
$q = $this->createQueryBuilder('u')
->select('u')
->andWhere('u.unid is NULL')
->getQuery();
return $q->getResult();
}
/**
* @param $nId
* @param $network
* @return mixed
*/
public function getUsersByNetworkId($nId, $network)
{
switch ($network) {
case 'google':
$network = 'google_id';
break;
case 'fb':
$network = 'fb_id';
break;
case 'vk':
$network = 'vk_id';
break;
case 'inst':
$network = 'ig_id';
break;
}
$user = $this->createQueryBuilder('u')
->select('u')
->andWhere('u.' . $network . ' = :nId')
->setParameter('nId', $nId)
->getQuery()
->getResult();
return $user[0] ?? false;
}
/**
* @param $sql
* @return bool
* @throws DBALException
* @throws DBALException
*/
public function sql($sql)
{
$conn = $this->getEntityManager()->getConnection();
$conn = $conn->prepare($sql);
return $conn->execute();
}
/**
* получене всех клиентов если у которых привязан соц сеть
*/
public function getAllUsersBySN()
{
return $this->createQueryBuilder('u')
->andWhere('u.social_network is not null')
->getQuery()->getResult();
}
/**
* Получение ФИО с скоращенными инициалами
* @param int $id
* @return false|string
* @throws DBALException
*/
public function getUserEasyNameById(int $id)
{
$conn = $this->_em->getConnection();
$id = $conn->quote($id);
$sql = "SELECT u.alias FROM user u WHERE u.id = {$id};";
$name = $conn->query($sql)->fetchColumn(0);
if ($name) {
$name = UserHelper::buildEasyName($name);
}
return $name;
}
public function getUsersForAmazonPersonalize()
{
$conn = $this->_em->getConnection();
$query = $conn->createQueryBuilder()
->select('u.id', 'up.sex', 'lc.code as country')
->from('user', 'u')
->leftJoin('u', 'list_country', 'lc', 'lc.id = up.country')
->where('u.is_active', 1);
$data = $query->execute()->fetchAll();
return $data;
}
/**
* @param string $unid
* @param string $email
* @return bool
* @throws DBALException
*/
public function checkUniqueEmailByUnid(string $unid, string $email)
{
$conn = $this->_em->getConnection();
$unid = $conn->quote($unid);
$email = $conn->quote($email);
$sql = "SELECT u.id FROM user u WHERE u.email = {$email} and u.unid != {$unid};";
$id = $conn->query($sql)->fetchColumn(0);
return !boolval($id);
}
public function getCountOfUsers()
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('count(user.id)');
$qb->from(User::class, 'user');
return $qb->getQuery()->getSingleScalarResult();
}
public function save(User $user, bool $flush = true): void
{
$this->getEntityManager()->persist($user);
if ($flush) {
$this->flush();
}
}
public function flush(): void
{
$this->getEntityManager()->flush();
}
public function getRecomendationGoogleUsers(int $page, int $limit): ?array
{
$start = ($page - 1) * $limit;
$sql = sprintf(
"SELECT id,token FROM `user` ORDER BY id LIMIT %d, %d;",
$start,
$limit
);
return ConnectionHelper::getInstance()->executeColumnsRows($sql);
}
}