<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;
use Symfony\Component\Security\Core\Security;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\BonDeLivraisonRepository;
use App\Repository\ProduitIMEIRepository;
use App\Repository\DevisRepository;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
class GlobalVariablesSubscriber implements EventSubscriberInterface
{
private Environment $twig;
private RequestStack $requestStack;
private BonDeLivraisonRepository $bonLivRepo;
private ProduitIMEIRepository $stokRepo;
private DevisRepository $devisRepos;
private Security $security;
private $em;
public function __construct(Environment $twig, BonDeLivraisonRepository $bonLivRepo, RequestStack $requestStack, ProduitIMEIRepository $stokRepo, DevisRepository $devisRepos, Security $security, EntityManagerInterface $em)
{
$this->twig = $twig;
$this->bonLivRepo = $bonLivRepo;
$this->requestStack = $requestStack;
$this->stokRepo = $stokRepo;
$this->devisRepos = $devisRepos;
$this->security = $security; // Injection du service Security
$this->em = $em;
}
public function onKernelController(ControllerEvent $event)
{
// Récupérer l'objet Request à partir de RequestStack
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return; // Sécurité : éviter d'accéder à une requête inexistante
}
$user = $this->security->getUser();
if ($user instanceof User) {
$roles = $user->getRoles();
if (empty(array_diff(["ROLE_USER", "ROLE_CAISSIERE"], $roles)) && count($roles) === 2) {
$userSiege = $user->getSiege()->getId();
$stockProduit = $this->stokRepo->findBy(["siege" => $userSiege, "dateSortie" => null]);
$stock = 0;
$bonLivraison = 0;
if ($stockProduit) {
$stock = $stock + count($stockProduit);
}
// bon de livraison
$qb = $this->bonLivRepo->createQueryBuilder('b')
->andWhere('b.receiver is not null')
->andWhere('b.validRefus IS NULL')
->andWhere('b.siegeReceiver = :siegeId OR b.siegeSender = :siegeId')
->andWhere('b.isValidByDA = :isValidByDA')
->setParameter('siegeId', $userSiege)
->andWhere('b.isValid = false or b.isValid is null')
->setParameter('isValidByDA', 1);
$bonLivr = $qb->getQuery()->getResult();
if ($bonLivr) {
$bonLivraison = $bonLivraison + count($bonLivr);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('stocks', $stock);
$this->twig->addGlobal('bonLivraisons', $bonLivraison);
}
if (empty(array_diff(["ROLE_USER", "ROLE_CSAF_AGENCE"], $roles)) && count($roles) === 2) {
$userSiege = $user->getSiege() == null ? null : $user->getSiege()->getId();
$userAgence = $user->getAgence()->getId();
$allDevis = $this->devisRepos->findBy(["agence" => $userAgence, "valide" => 0]);
$commandes = 0;
$bonLivraison = 0;
if ($allDevis) {
$commandes = $commandes + count($allDevis);
}
// bon de livraison
$qb = $this->bonLivRepo->createQueryBuilder('b')
->andWhere('b.receiver is not null')
->andWhere('b.bonType =:interne')
->setParameter('interne', 'interne')
->andWhere('b.validRefus IS NULL')
->andWhere('b.siegeReceiver = :siegeReceiver')
->andWhere('b.isValidByDA = false or b.isValidByDA is null')
->setParameter('siegeReceiver', $userSiege);
$bonLivr = $qb->getQuery()->getResult();
if ($bonLivr) {
$bonLivraison = $bonLivraison + count($bonLivr);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('commandes', $commandes);
$this->twig->addGlobal('bonLivraisons', $bonLivraison);
}
if (empty(array_diff(["ROLE_USER", "ROLE_DIRECTEUR_OPERATION"], $roles)) && count($roles) === 2) {
$allDevis = $this->devisRepos->findBy(["valide" => 2]);
$commandes = 0;
if ($allDevis) {
$commandes = $commandes + count($allDevis);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('commandes', $commandes);
}
if (empty(array_diff(["ROLE_USER", "ROLE_DIRECTEUR_AGENCE"], $roles)) && count($roles) === 2) {
$userAgence = $user->getAgence()->getId();
$allDevis = $this->devisRepos->findBy(["agence" => $userAgence, "valide" => [1]]);
$commandes = 0;
$bonLivraison = 0;
if ($allDevis) {
$commandes = $commandes + count($allDevis);
}
// bon de livraison
$qb = $this->bonLivRepo->createQueryBuilder('b')
->join('b.siegeReceiver', 's')
->where('s.agence = :agence')
->andWhere('b.isValidByDA IS NULL OR b.isValidByDA = 0')
->andWhere('b.isValid IS NULL OR b.isValid = 0')
->setParameter('agence', $userAgence);
$bonLiv = $qb->getQuery()->getResult();
if ($bonLiv) {
$bonLivraison = $bonLivraison + count($bonLiv);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('commandes', $commandes);
$this->twig->addGlobal('bonLivraisons', $bonLivraison);
}
if (empty(array_diff(["ROLE_USER", "ROLE_DAF"], $roles)) && count($roles) === 2) {
$allDevis = $this->devisRepos->findBy(["valide" => 4]);
$commandes = 0;
$bonLivraison = 0;
if ($allDevis) {
$commandes = $commandes + count($allDevis);
}
// bon de livraison
$qb = $this->bonLivRepo->createQueryBuilder('b')
->where('b.siegeReceiver = :siegeReceiver')
->andWhere('b.isValidByDA IS NULL OR b.isValidByDA = 0')
->andWhere('b.isValid IS NULL OR b.isValid = 0')
->setParameter('siegeReceiver', 36);
$bonLivr = $qb->getQuery()->getResult();
if ($bonLivr) {
$bonLivraison = $bonLivraison + count($bonLivr);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('commandes', $commandes);
$this->twig->addGlobal('bonLivraisons', $bonLivraison);
}
if (empty(array_diff(["ROLE_USER", "ROLE_DIR_SP"], $roles)) && count($roles) === 2) {
$allDevis = $this->devisRepos->findBy(["valide" => [5]]);
$commandes = 0;
if ($allDevis) {
$commandes = $commandes + count($allDevis);
}
// Ajout des variables globales à Twig
$this->twig->addGlobal('commandes', $commandes);
}
if (empty(array_diff(["ROLE_USER", "ROLE_LOGISTIQUE"], $roles)) && count($roles) === 2) {
$userSiege = $user->getSiege()->getId();
$stockProduit = $this->stokRepo->findBy(["siege" => 36, "dateSortie" => null]);
$stock = 0;
if ($stockProduit) {
$stock = $stock + count($stockProduit);
}
$this->twig->addGlobal('stocks', $stock);
}
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}