<?php
namespace App\Repository;
use App\Entity\Alert;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Alert|null find($id, $lockMode = null, $lockVersion = null)
* @method Alert|null findOneBy(array $criteria, array $orderBy = null)
* @method Alert[] findAll()
* @method Alert[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class AlertRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Alert::class);
}
public function search($isArchive = false,$data, $page = 0, $max = NULL, $getResult = true, $columnOrder = NULL, $dirOrder = NULL,$count=false) {
$qb = $this->createQueryBuilder('c');
$query = isset($data['query']) && $data['query'] ? $data['query'] : null;
$devProject = isset($data['devProject']) && $data['devProject'] ? $data['devProject'] : null;
$searchDate = isset($data['searchDate']) && $data['searchDate'] ? new \DateTime($data['searchDate']) : null;
$typeAlert = isset($data['typeAlert']) && $data['typeAlert'] ? $data['typeAlert'] : null;
$qb->leftJoin('c.project','p');
$qb->andWhere('p.name like :query ')
->setParameter('query', "%" . $query . "%")
;
if($typeAlert){
$qb->andWhere('c.typeAlert = :typeAlert ')
->setParameter('typeAlert', $typeAlert)
;
}
if($isArchive){
$qb->andWhere('c.isArchived = 1');
}else{
$qb->andWhere('c.isArchived = 0 or c.isArchived is null');
}
$qb->andWhere('c.isDeleted = 0 or c.isDeleted is null');
$qb->andWhere('c.isNotEnabledDashboard = 0 or c.isNotEnabledDashboard is null');
$spvsTab = isset($data['spvsTab']) && $data['spvsTab'] ? $data['spvsTab'] : null;
$user = isset($data['user']) && $data['user'] ? $data['user'] : null;
if($user){
$qb->leftJoin('p.fournisseurProject', 'fournisseurProject');
if (in_array('ROLE_COMPTABLE',$user->getRoles())||in_array('ROLE_AUDITEUR',$user->getRoles())) {
$qb->andWhere('p.spv in (:spvsTab)')
->setParameter('spvsTab',$spvsTab);
}elseif (in_array('ROLE_FOURNISSEUR',$user->getRoles())){
$qb->innerJoin('fournisseurProject.fournisseur', 'fournisseur');
$qb->leftJoin('p.fournisseur', 'fournisseurUser');
$qb->leftJoin('fournisseur.user', 'fournisseurProjectUser');
$qb->leftJoin('fournisseurUser.user', 'fournisseurUserUser');
$qb->andWhere('fournisseurProjectUser.id = :userFournisseur or fournisseurUserUser.id = :userFournisseur')
->setParameter('userFournisseur', $user->getId());
}
elseif(in_array('ROLE_DEV',$user->getRoles())){
if($user->getEntreprise()){
$qb->andWhere('(p.developpeur = :user) or (p.entreprise = :userEntreprise)')
->setParameter('user',$user->getId())
->setParameter('userEntreprise',$user->getEntreprise()->getId());
}else{
$qb->andWhere('p.developpeur = :user')
->setParameter('user',$user->getId());
}
}elseif (in_array('ROLE_EPC',$user->getRoles())){
$qb->andWhere('p.epc = :user or c.developpeur = :user')
->setParameter('user',$user->getId());
}elseif (in_array('ROLE_CONSTRUCTEUR',$user->getRoles())){
$qb->innerJoin('p.constructeurUser','constructeur');
$qb->andWhere('constructeur.constructeur = :user')
->setParameter('user',$user->getId());
}elseif (in_array('ROLE_ADMIN',$user->getRoles()) || in_array('ROLE_SUPER_ADMINISTRATOR',$user->getRoles())){
}
}
$qb->andWhere('p.isArchived = 0 or p.isArchived is null');
$date6mois = new \DateTime('now');
$date6mois->modify('+3 month');
$qb->andWhere('c.dateLimit <= :date6mois')
->setParameter('date6mois',$date6mois);
if($searchDate){
$qb->andWhere('c.dateLimit LIKE :searchDate')
->setParameter('searchDate','%'.$searchDate->format('Y-m-d').'%');
}
if($count){
$qb->select('count(DISTINCT c.id) as result');
return $qb->getQuery()->getOneOrNullResult();
}else{
$qb->select('DISTINCT c');
$qb->orderBy("c.$columnOrder", $dirOrder);
if ($columnOrder) {
if($columnOrder == 'project'){
$qb->orderBy("c.project", $dirOrder);
}elseif($columnOrder == 'typeAlert'){
$qb->orderBy("c.typeAlert", $dirOrder);
}elseif($columnOrder == 'delaiRestant'){
$qb->orderBy("c.dateLimit", $dirOrder);
}elseif($columnOrder == 'dateLimit'){
$qb->orderBy("c.dateLimit", $dirOrder);
}else{
}
}
if ($max) {
$preparedQuery = $qb->getQuery()
->setMaxResults($max)
->setFirstResult($page * $max)
;
} else {
$preparedQuery = $qb->getQuery();
}
return $getResult ? $preparedQuery->getResult() : $preparedQuery;
}
}
public function getActives($spvs,$user) {
$qb = $this->createQueryBuilder('c');
$spvsTab = $spvs;
if ($user and (in_array("ROLE_AUDITEUR", $user->getRoles()) or in_array("ROLE_COMPTABLE", $user->getRoles()))) {
$qb->andWhere('p.spv in (:spvsTab)')
->setParameter('spvsTab',$spvsTab);
}
$qb->leftJoin('c.project','p');
$qb->andWhere('p.isArchived = 0 or p.isArchived is null');
$qb->andWhere('c.isArchived = 0 or c.isArchived is null');
$qb->andWhere('c.isDeleted = 0 or c.isDeleted is null');
$qb->andWhere('c.isNotEnabledDashboard = 0 or c.isNotEnabledDashboard is null');
return $qb->getQuery()->getResult();
}
public function findAllAlertByTokens($tokens){
$qb = $this->createQueryBuilder('c');
$qb->andWhere('c.token in (:tokens)')
->setParameter('tokens',$tokens);
return $qb->getQuery()->getResult();
}
}