* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ declare(strict_types=1); namespace PrestaShop\PrestaShop\Core\Grid\Query\Security\Session; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Query\QueryBuilder; use PrestaShop\PrestaShop\Core\Grid\Query\AbstractDoctrineQueryBuilder; use PrestaShop\PrestaShop\Core\Grid\Query\DoctrineSearchCriteriaApplicatorInterface; use PrestaShop\PrestaShop\Core\Grid\Search\SearchCriteriaInterface; /** * Class EmployeeQueryBuilder is responsible for building queries for employees grid data. */ class EmployeeQueryBuilder extends AbstractDoctrineQueryBuilder { /** * @var DoctrineSearchCriteriaApplicatorInterface */ private $searchCriteriaApplicator; /** * @param Connection $connection * @param string $dbPrefix * @param DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator */ public function __construct( Connection $connection, string $dbPrefix, DoctrineSearchCriteriaApplicatorInterface $searchCriteriaApplicator ) { parent::__construct($connection, $dbPrefix); $this->searchCriteriaApplicator = $searchCriteriaApplicator; } /** * {@inheritdoc} */ public function getSearchQueryBuilder(SearchCriteriaInterface $searchCriteria): QueryBuilder { $qb = $this->getQueryBuilder($searchCriteria->getFilters()) ->select('es.id_employee_session, e.id_employee, e.firstname, e.lastname, e.email, es.date_upd') ; $this->searchCriteriaApplicator ->applySorting($searchCriteria, $qb) ->applyPagination($searchCriteria, $qb); return $qb; } /** * {@inheritdoc} */ public function getCountQueryBuilder(SearchCriteriaInterface $searchCriteria): QueryBuilder { return $this->getQueryBuilder($searchCriteria->getFilters()) ->select('COUNT(es.id_employee_session)') ; } /** * Get generic query builder. * * @param array $filters * * @return QueryBuilder */ private function getQueryBuilder(array $filters): QueryBuilder { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'employee_session', 'es') ->join('es', $this->dbPrefix . 'employee', 'e', 'e.id_employee = es.id_employee') ; $allowedFilters = [ 'date_upd', 'email', 'firstname', 'id_employee', 'id_employee_session', 'lastname', ]; foreach ($filters as $name => $value) { if (!in_array($name, $allowedFilters, true)) { continue; } if ('id_employee_session' === $name) { $qb->andWhere('es.id_employee_session = :' . $name); $qb->setParameter($name, $value); continue; } if ('id_employee' === $name) { $qb->andWhere('e.id_employee = :' . $name); $qb->setParameter($name, $value); continue; } if ('date_upd' === $name) { if (isset($value['from'])) { $qb->andWhere('es.date_upd >= :date_from'); $qb->setParameter('date_from', sprintf('%s 0:0:0', $value['from'])); } if (isset($value['to'])) { $qb->andWhere('es.date_upd <= :date_to'); $qb->setParameter('date_to', sprintf('%s 23:59:59', $value['to'])); } continue; } $qb->andWhere( sprintf( 'e.%s LIKE :%s', $name, $name ) ); $qb->setParameter($name, '%' . $value . '%'); } return $qb; } }