<?php
declare(strict_types=1);
/**
* @author Mehrez Labidi
*/
namespace App\Security\Voter;
use App\Services\Annonces\Elites\RechercheElite;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Services\ManagerEntity\DroitsAccesManagers;
use Symfony\Component\Security\Core\Security;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\{
DetailCommandeGeneral,
GrilleAnalysePostMer,
CommandeGenerale
};
/**
* Description of FeuilleRouteStrategiqueVoter
*
* @author mehrez
*/
class FeuilleRouteStrategiqueVoter extends Voter {
public const ROLE_FEUILLE_ROUTE_STRATEGIQUE = 'ROLE_FEUILLE_ROUTE_STRATEGIQUE';
private $em;
private $dam;
private $requestStack;
public function __construct(Security $security, EntityManagerInterface $em, DroitsAccesManagers $dam, RequestStack $requestStack) {
$this->security = $security;
$this->em = $em;
$this->dam = $dam;
$this->requestStack = $requestStack;
}
/**
* Détermine si ce voter prend en charge l'attribut donné.
*
* @param string $attribute L'attribut de sécurité à vérifier
* @param mixed $subject Le sujet associé à la vérification (non utilisé ici)
* @return bool True si l'attribut correspond à ROLE_FEUILLE_ROUTE_STRATEGIQUE
*/
protected function supports(string $attribute, $subject): bool {
return $attribute === self::ROLE_FEUILLE_ROUTE_STRATEGIQUE;
}
/**
* Vérifie si l'utilisateur connecté possède le droit d'accès au service Elite.
*
* @param string $attribute L'attribut de sécurité à évaluer
* @param mixed $subject Le sujet associé (non utilisé ici)
* @param TokenInterface $token Le token d'authentification de l'utilisateur courant
* @return bool True si l'utilisateur dispose du droit Elite, false sinon
*/
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool {
$request = $this->requestStack->getCurrentRequest();
if (!$request || !$subject) {
return false;
}
try {
$id_annonce = $subject['id_annonce'];
if ($id_annonce == GrilleAnalysePostMer::ID_ANNONCE_EXEMPLE) {
return true;
}
if(!$this->security->getUser()){
return false;
}
$qb = $this->em->createQueryBuilder(); // feuille de route commandé à l'unité sans acces ELITE
$result = $qb->select('COUNT(cd.id_objet_commande)')
->from(CommandeGenerale::class, 'c')
->leftJoin(DetailCommandeGeneral::class, 'cd', 'WITH', 'cd.id_commande_generale = c.id_commande_generale')
->where('c.id_utilisateur = :id_utilisateur')->setParameter('id_utilisateur', $this->security->getUser()->getId())
->andWhere('cd.type_objet_commande = :type_objet_commande')->setParameter('type_objet_commande', 'feuille_route')
->andWhere('c.etat = :etat')->setParameter('etat', 'acces_active')
->andWhere('cd.id_objet_commande = :id_annonce')->setParameter('id_annonce', $id_annonce)
->getQuery()
->getSingleScalarResult();
return ($result > 0);
} catch (\Exception $e) {
return false;
}
}
}