<?php
namespace App\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Entity\Access;
use App\Services\LogTools;
/**
* @extends ServiceEntityRepository<Access>
*
* @method Access|null find($id, $lockMode = null, $lockVersion = null)
* @method Access|null findOneBy(array $criteria, array $orderBy = null)
* @method Access[] findAll()
* @method Access[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class AccessRepository extends ServiceEntityRepository implements PasswordUpgraderInterface, UserLoaderInterface
{
public function __construct(ManagerRegistry $registry, LogTools $logTools)
{
parent::__construct($registry, Access::class);
$this->logTools = $logTools;
}
/**
* Used to upgrade (rehash) the user's password automatically over time.
*/
public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void
{
if (!$user instanceof Access) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user)));
}
$user->setPassword($newHashedPassword);
$this->add($user, true);
}
public function getForIdList($idList)
{
$query = $this
->createQueryBuilder('object')
->where('object.id in '.$idList);
return $query->getQuery()->getResult();
}
// Access::username no longer exists
// So use the email instead
public function findOneByUsername($username)
{
return $this->createQueryBuilder('access')
->andWhere('access.email = :username')
->setParameter('username', $username)
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
// Start method for User Provider //
// FOR SECURITY : Load by email + check if user is active
// https://symfony.com/doc/5.4/security/user_providers.html#using-a-custom-query-to-load-the-user
// Need to type the return to avoid deprecation (In Symfony 6.0, it will raise an error)
public function loadUserByIdentifier(string $identifier): ?UserInterface
{
$entityManager = $this->getEntityManager();
$query = 'SELECT access
FROM App\Entity\Access access
WHERE access.email = :identifier
AND access.isActive = true';
return $entityManager->createQuery($query)
->setParameter('identifier', $identifier)
->getOneOrNullResult();
}
/** @deprecated since Symfony 5.3 : Remove this when interface will change */
public function loadUserByUsername(string $usernameOrEmail)
{
return $this->loadUserByIdentifier($usernameOrEmail);
}
// End method for User Provider //
public function getAdmins()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere("access.roles LIKE '%ROLE_ADMIN%'");
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
public function getDevs()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere("access.email IN ('oanalivia', 'alexandre', 'dylan')");
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
public function getForAxiom()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere("access.email IN ('oanalivia', 'alexandre', 'dylan')");
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
public function getForAxiom_QB()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere("access.email IN ('oanalivia', 'alexandre', 'dylan')");
$query->addOrderBy('access.email', 'ASC');
return $query;
}
public function findWithoutFunction()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NULL');
$query->andWhere('access.isSystem = 0');
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
// TODO
// Username no longer exists, so remove this one day
public function findByEmailOrUsername($value)
{
$query = $this->createQueryBuilder('access');
// $query->where("access.username = :value OR access.email = :value");
$query->where("access.email = :value");
$query->setParameter('value', $value);
return $query->getQuery()->getResult();
}
public function searchForTerm($term, $societyGroup)
{
// Create Main Query
$query = $this->createQueryBuilder('access');
$query
->join('access.humanResource', 'humanResource')
->join('humanResource.society', 'society')
->join('society.societyGroup', 'societyGroup');
$query->where("societyGroup.id = ".$societyGroup->getId());
$query->andWhere("lower(access.email) LIKE :term");
$query->setParameter('term', "%".$term."%");
$results = $query->getQuery()->getResult();
return $results;
}
public function getFor($args)
{
$society = null;
$function = null;
$active = null;
if (array_key_exists('society', $args))
$society = $args['society'];
if (array_key_exists('function', $args))
$function = $args['function'];
if (array_key_exists('active', $args))
$active = $args['active'];
$query = $this->createQueryBuilder('access');
if ($society !== null)
{
$query->join('access.societies', 'society');
$query->andWhere('society.id = '.$society->getId());
}
if ($function !== null)
{
$query->join('access.function', 'function');
$query->andWhere('function.id = '.$function->getId());
}
if ($active !== null)
{
$query->andWhere('access.isActive = 1');
}
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
public function findWithFunction()
{
$query = $this->createQueryBuilder('access');
$query->where('access.function IS NOT NULL');
$query->andWhere('access.isSystem = 0');
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
// Functions already belong to a society group,
// so we are sure that we are only getting the users in that group
public function getForFunction($function)
{
$query = $this->createQueryBuilder('access');
$query->join('access.function', 'function');
$query->andWhere('function.id = '.$function->getId());
$query->addOrderBy('access.email', 'ASC');
return $query->getQuery()->getResult();
}
public function getActiveForSocietyGroup_QB($societyGroup, $plusOne = null)
{
$query = $this->createQueryBuilder('access');
$query->join('access.humanResource', 'hr');
$query->join('hr.society', 'society');
$query->join('society.societyGroup', 'societyGroup');
$query->where('societyGroup.id = ' . $societyGroup->getId());
$sql = "(access.function IS NOT NULL) AND (access.isActive = 1) AND (access.isSystem = 0)";
if ($plusOne !== null)
{
$query->andWhere($sql." OR (access.id = ".$plusOne->getId().")");
}
else
{
$query->andWhere($sql);
}
$query->addOrderBy('hr.lastname', 'ASC');
$query->addOrderBy('hr.firstname', 'ASC');
return $query;
}
public function getActiveForSocietyGroup($societyGroup, $plusOne = null)
{
$query = $this->getActiveForSocietyGroup_QB($societyGroup, $plusOne);
return $query->getQuery()->getResult();
}
public function getForSocietyGroup($societyGroup)
{
$query = $this->createQueryBuilder('access');
$query->join('access.humanResource', 'hr');
$query->join('hr.society', 'society');
$query->join('society.societyGroup', 'societyGroup');
$query->where('access.function IS NOT NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere('societyGroup.id = ' . $societyGroup->getId());
$query->addOrderBy('hr.lastname', 'ASC');
$query->addOrderBy('hr.firstname', 'ASC');
return $query->getQuery()->getResult();
}
public function getForSocietyGroup_QB($societyGroup, $orderBy = null)
{
$query = $this->createQueryBuilder('access');
$query->join('access.humanResource', 'hr');
$query->join('hr.society', 'society');
$query->join('society.societyGroup', 'societyGroup');
$query->where('access.function IS NOT NULL');
$query->andWhere('access.isSystem = 0');
$query->andWhere('societyGroup.id = ' . $societyGroup->getId());
if ($orderBy !== null)
{
$query->addOrderBy($orderBy, 'ASC');
}
else
{
$query->addOrderBy('access.email', 'ASC');
}
return $query;
}
public function getOrderedBy($field = null, $order = null)
{
$query = $this->createQueryBuilder('object');
if ($field !== null)
{
if ($order !== null)
{
$query->addOrderBy('object.'.$field, $order);
}
else
{
$query->addOrderBy('object.'.$field, 'ASC');
}
}
else
{
$query->addOrderBy('object.id', 'ASC');
}
return $query->getQuery()->getResult();
}
public function getOrderedBy_QB($field = null, $order = null)
{
$query = $this->createQueryBuilder('object');
if ($field !== null)
{
if ($order !== null)
{
$query->addOrderBy('object.'.$field, $order);
}
else
{
$query->addOrderBy('object.'.$field, 'ASC');
}
}
else
{
$query->addOrderBy('object.id', 'ASC');
}
return $query;
}
// Gets all the accesses which have
// access.humanResource.society = $baseSociety
public function getAccessesForBaseSociety($baseSociety)
{
if ($baseSociety === null)
return array();
$id = $baseSociety->getId();
$query = $this
->createQueryBuilder('access');
$query
->join('access.humanResource', 'rh')
->join('rh.society', 'rhSociety');
$query
->where('access.isActive = 1')
->andWhere('rhSociety.id = '.$id);
$query
->addOrderBy('rh.lastname', 'ASC')
->addOrderBy('rh.firstname', 'ASC');
return $query->getQuery()->getResult();
}
// Gets all the accesses which have
// access.humanResource.society = $baseSociety
public function getAccessesForBaseSociety_QB($baseSociety, Access $plusOne = null)
{
if ($baseSociety === null)
return array();
$id = $baseSociety->getId();
$query = $this
->createQueryBuilder('access');
$query
->join('access.humanResource', 'rh')
->join('rh.society', 'rhSociety');
$query
->where('access.isActive = 1');
if ($plusOne !== null)
$query->andWhere('(rhSociety.id = '.$id.' OR access.id = '.$plusOne->getId().')');
else
$query->andWhere('(rhSociety.id = '.$id.')');
$query
->addOrderBy('rh.lastname', 'ASC')
->addOrderBy('rh.firstname', 'ASC');
return $query;
}
// Gets all the accesses which have
// access.humanResource.society.societyGroup = $baseSocietyGroup
public function getAccessesForBaseSocietyGroup($baseSocietyGroup, $activeOnly = true)
{
if ($baseSocietyGroup === null)
return array();
$id = $baseSocietyGroup->getId();
$query = $this
->createQueryBuilder('access');
$query
->join('access.humanResource', 'rh')
->join('rh.society', 'rhSociety')
->join('rhSociety.societyGroup', 'rhSocietyGroup');
if ($activeOnly)
$query->where('access.isActive = 1');
$query
->andWhere('rhSocietyGroup.id = '.$id);
$query
->addOrderBy('rh.lastname', 'ASC')
->addOrderBy('rh.firstname', 'ASC');
return $query->getQuery()->getResult();
}
// Gets all the accesses which have
// access.humanResource.society.societyGroup = $baseSocietyGroup
public function getAccessesForBaseSocietyGroup_QB($info, $baseSocietyGroup, $activeOnly = true, Access $plusOne = null)
{
if ($baseSocietyGroup === null)
return array();
$id = $baseSocietyGroup->getId();
$query = $this
->createQueryBuilder('access');
$query
->join('access.humanResource', 'rh')
->join('rh.society', 'rhSociety')
->join('rhSociety.societyGroup', 'rhSocietyGroup');
if ($plusOne !== null)
{
if ($activeOnly)
{
$query->andWhere('((rhSocietyGroup.id = '.$id.' AND access.isActive = 1) OR access.id = '.$plusOne->getId().')');
}
else
{
$query->andWhere('(rhSocietyGroup.id = '.$id.' OR access.id = '.$plusOne->getId().')');
}
}
else
{
if ($activeOnly)
$query->where('access.isActive = 1');
$query->andWhere('rhSocietyGroup.id = '.$id);
}
$query
->addOrderBy('rh.lastname', 'ASC')
->addOrderBy('rh.firstname', 'ASC');
return $query;
}
public function getCoworkers($currentGroup, $access, $plusOne = null)
{
if ($currentGroup === null || $access === null)
{
$query = $this
->createQueryBuilder('access');
$query->where('1=0');
return $query;
}
$societies = $access->getSocietiesAsString();
// Get all accesses for the given Society
$query = $this
->createQueryBuilder('access');
$query->join('access.humanResource', 'humanResource');
$query->join('humanResource.society', 'baseSociety');
$query->join('baseSociety.societyGroup', 'societyGroup');
if ($plusOne === null)
{
$query->join('access.societies', 'society');
$query
->where('access.isActive = 1')
->andWhere('societyGroup.id = '.$currentGroup->getId())
->andWhere('society.id IN '.$societies);
}
else
{
$query->leftJoin('access.societies', 'society');
$sql = "(access.isActive = 1 AND societyGroup.id = ".$currentGroup->getId()." AND society.id IN ".$societies.")";
$query
->where($sql)
->orWhere('access.id = '.$plusOne->getId());
}
$query->addOrderBy('humanResource.lastname', 'ASC');
$query->addOrderBy('humanResource.firstname', 'ASC');
return $query->getQuery()->getResult();
}
public function getCoworkers_QB($currentGroup, $access, $plusOne = null)
{
if ($currentGroup === null || $access === null)
{
$query = $this
->createQueryBuilder('access');
$query->where('1=0');
return $query;
}
$societies = $access->getSocietiesAsString();
// Get all accesses for the given Society
$query = $this
->createQueryBuilder('access');
$query->join('access.humanResource', 'humanResource');
$query->join('humanResource.society', 'baseSociety');
$query->join('baseSociety.societyGroup', 'societyGroup');
if ($plusOne === null)
{
$query->join('access.societies', 'society');
$query
->where('access.isActive = 1')
->andWhere('societyGroup.id = '.$currentGroup->getId())
->andWhere('society.id IN '.$societies);
}
else
{
$query->leftJoin('access.societies', 'society');
$sql = "(access.isActive = 1 AND societyGroup.id = ".$currentGroup->getId()." AND society.id IN ".$societies.")";
$query
->where($sql)
->orWhere('access.id = '.$plusOne->getId());
}
$query->addOrderBy('humanResource.lastname', 'ASC');
$query->addOrderBy('humanResource.firstname', 'ASC');
return $query;
}
public function getRequiredDTData($start, $length, $orders, $search, $columns, $access, $currentGroup, $listSociety, $active)
{
// Create Main Query
$query = $this->createQueryBuilder('access');
// Create inner joins
$query
->select('DISTINCT access')
->join('access.function', 'function')
->join('access.humanResource', 'humanResource')
->join('humanResource.society', 'humanResource_society')
->join('humanResource_society.societyGroup', 'humanResource_societyGroup')
->leftJoin('access.societies', 'access_society')
->leftJoin('access_society.societyGroup', 'access_society_group')
->leftJoin('access.planningResources', 'planningResource');
if ($active)
{
$query->where('access.isActive = 1');
}
else
{
$query->where('access.isActive = 0');
}
// Any access based restrictions will go here too
if ($currentGroup !== null && $access !== null)
{
// Mandatory, all should be restricted to current group
$cond = 'humanResource_societyGroup.id = '.$currentGroup->getId();
$query->andWhere($cond);
if ($listSociety)
{
// Society first
$societies = $access->getSocietiesAsString();
$cond = 'humanResource_society.id IN '.$societies;
$query->andWhere($cond);
}
}
// Before doing any search, save the total results
$countQuery = clone $query;
$countQuery->select('COUNT(DISTINCT access)');
$recordsTotal = $countQuery->getQuery()->getSingleScalarResult();
// Fields Search
foreach ($columns as $key => $column)
{
if ($column['search']['value'] != '')
{
// $searchItem is what we are looking for
$searchItem = $column['search']['value'];
// $column['name'] is the name of the column as sent by the JS
switch($column['name'])
{
case 'creation_date':
{
$query->andWhere("access.creationDate LIKE :creationDate");
$query->setParameter("creationDate", "%".$searchItem."%");
break;
}
case 'lastname':
{
$query->andWhere("humanResource.lastname LIKE :lastname");
$query->setParameter("lastname", "%".$searchItem."%");
break;
}
case 'firstname':
{
$query->andWhere("humanResource.firstname LIKE :firstname");
$query->setParameter("firstname", "%".$searchItem."%");
break;
}
case 'email':
{
$query->andWhere("access.email LIKE :email");
$query->setParameter("email", "%".$searchItem."%");
break;
}
case 'function':
{
$query->andWhere("function.name LIKE :function");
$query->setParameter("function", "%".$searchItem."%");
break;
}
case 'base_society':
{
$query->andWhere('(humanResource_society.ref LIKE :rh_society OR humanResource_society.name LIKE :rh_society)');
$query->setParameter("rh_society", "%".$searchItem."%");
break;
}
case 'human_resource':
{
$query->andWhere('(humanResource.email LIKE :rh_email)');
$query->setParameter("rh_email", "%".$searchItem."%");
break;
}
case 'planning_resource':
{
$query->andWhere("planningResource.title LIKE :title");
$query->setParameter("title", "%".$searchItem."%");
break;
}
case 'society_for_access':
{
$query->andWhere("(access_society.ref LIKE :access_society_ref OR access_society.name LIKE :access_society_ref)");
$query->setParameter("access_society_ref", "%".$searchItem."%");
break;
}
}
}
}
// Get the total number of filtred results here
$countQuery = clone $query;
$countQuery->select('COUNT(DISTINCT access)');
$recordsFiltred = $countQuery->getQuery()->getSingleScalarResult();
// Limit
$query->setFirstResult($start)->setMaxResults($length);
// Order
foreach ($orders as $key => $order)
{
// $order['name'] is the name of the order column as sent by the JS
if ($order['name'] != '')
{
$orderColumn = null;
switch($order['name'])
{
case 'creation_date':
{
$orderColumn = 'access.creationDate';
break;
}
case 'lastname':
{
$orderColumn = 'humanResource.lastname';
break;
}
case 'firstname':
{
$orderColumn = 'humanResource.firstname';
break;
}
case 'function':
{
$orderColumn = 'function.name';
break;
}
case 'email':
{
$orderColumn = 'access.email';
break;
}
case 'human_resource':
{
$orderColumn = 'humanResource.lastname';
break;
}
case 'external_resource':
{
$orderColumn = 'externalResource.lastname';
break;
}
case 'planning_resource':
{
$orderColumn = 'planningResource.title';
break;
}
}
if ($orderColumn !== null)
{
$query->orderBy($orderColumn, $order['dir']);
}
}
}
// Get the actual results to display
$results = $query->getQuery()->getResult();
return array(
"results" => $results,
"recordsTotal" => $recordsTotal,
"recordsFiltered" => $recordsFiltred,
);
}
public function getAccessesRHForm($societyGroup, $access)
{
$query = $this->createQueryBuilder('access');
$query->join('access.societies', 'accessSociety');
$query->join('access.function', 'function');
$query->join('access.humanResource', 'rh');
$query->join('rh.society', 'rhSociety');
$query->join('rhSociety.societyGroup', 'rhSocietyGroup');
$query->andWhere('access.isActive = 1');
$query->andWhere('rhSocietyGroup.id = '.$societyGroup->getId());
$societies = $access->getSocietiesAsString();
// Get all accesses for the given Society
$query->andWhere('accessSociety.id in '.$societies);
$query->addOrderBy('rh.lastname', 'ASC');
$query->addOrderBy('rh.firstname', 'ASC');
$rest = $query->getQuery()->getResult();
return $rest;
}
// Plan.io Task #3596
public function getForAPIRest_QB($society, $plusOne = null)
{
$societyGroup = $society->getSocietyGroup();
if ($societyGroup === null)
{
return null;
}
$sgid = $societyGroup->getId();
// Get all the access which are already connected to an AccessAPI for this SocietyGroup
$sql = "SELECT GROUP_CONCAT(access_id) FROM api_rest_access_api WHERE society_group_id = $sgid";
if ($plusOne !== null)
{
$sql .= " AND access_id <> ".$plusOne->getId();
}
$conn = $this->getEntityManager()->getConnection();
$stmt = $conn->prepare($sql);
$result = $stmt->executeQuery();
$ids = $result->fetchOne();
if (!empty($ids))
{
$ids = "(".$ids.")";
}
else
{
$ids = "(0)";
}
$query = $this->createQueryBuilder('access');
$query->join('access.humanResource', 'humanResource');
$query->join('humanResource.society', 'society');
$query->where("society.id = ".$society->getId());
$query->andWhere('access.id NOT IN '.$ids);
return $query;
}
public function getShareManagers_QB()
{
$query = $this->createQueryBuilder('access');
$query->join('access.societyGroup', 'societyGroup');
$query->andWhere('societyGroup.rekto = 1');
$query->addOrderBy('access.email', 'ASC');
return $query;
}
}