src/Voter/ProduitDeclinaisonVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Voter;
  3. use App\Entity\Boutique\ProduitDeclinaison;
  4. use App\Manager\Boutique\ProduitStockBalanceManager;
  5. use FOS\UserBundle\Model\UserInterface;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  8. use Symfony\Component\Security\Core\Security;
  9. class ProduitDeclinaisonVoter extends Voter
  10. {
  11.     // these strings are just invented: you can use anything
  12.     const BUY 'buy';
  13.     private $security;
  14.     /**
  15.      * @var ProduitStockBalanceManager
  16.      */
  17.     private $produitStockBalanceManager;
  18.     public function __construct(Security $securityProduitStockBalanceManager $produitStockBalanceManager)
  19.     {
  20.         $this->security $security;
  21.         $this->produitStockBalanceManager $produitStockBalanceManager;
  22.     }
  23.     protected function supports($attribute$subject)
  24.     {
  25.         // if the attribute isn't one we support, return false
  26.         if (!in_array($attribute, array(self::BUY))) {
  27.             return false;
  28.         }
  29.         if (!$subject instanceof ProduitDeclinaison) {
  30.             return false;
  31.         }
  32.         return true;
  33.     }
  34.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  35.     {
  36.         $user $token->getUser();
  37.         switch ($attribute) {
  38.             case self::BUY:
  39.                 return $this->canBuy($subject$user);
  40.         }
  41.         throw new \LogicException('This code should not be reached!');
  42.     }
  43.     private function canBuy(ProduitDeclinaison $produitDeclinaison$user)
  44.     {
  45.         $produit $produitDeclinaison->getProduit();
  46.         if (!($user instanceof UserInterface)) {
  47.             return false;
  48.         }
  49.         if (
  50.             false === $produit->getGroups()->isEmpty() &&
  51.             false === $user->getGroups()->isEmpty() &&
  52.             !in_array($user->getGroups()->first()->getId(), $produit->getUserGroupIds())
  53.         ) {
  54.             return false;
  55.         }
  56.         if (
  57.             false === $user->getGroups()->isEmpty() &&
  58.             true === $user->getGroups()->first()->getRestrictionAchat() &&
  59.             false === $this->security->isGranted(['ROLE_ADMIN','ROLE_DELEGUE'])
  60.         ) {
  61.             return false;
  62.         }
  63.         if (false === $produit->getActive()) {
  64.             return false;
  65.         }
  66.         if (false === $produit->getDispoVente()) {
  67.             return false;
  68.         }
  69.         if (true === $produit->getGestionStock() && $this->produitStockBalanceManager->getStock(null$produitDeclinaison) <= 0) {
  70.             return false;
  71.         }
  72. //        if (false === $produit->getVisible() || false === $produitDeclinaison->getVisible()) {
  73. //            return false;
  74. //        }
  75.         if (!is_null($produit->getProduitReducCe()) && false === $produit->getProduitReducCe()->seanceDisponibleVente()) {
  76.             return false;
  77.         }
  78.         if (
  79.             (true === $produit->getVisible() && true === $produitDeclinaison->getVisible()) ||
  80.             (
  81.                 (false === $produit->getVisible() || false === $produitDeclinaison->getVisible()) &&
  82.                 false === $produit->getIsReducCe() &&
  83.                 $this->security->isGranted(['ROLE_ADMIN','ROLE_PREVIOUS_ADMIN'])
  84.             )
  85.         ) {
  86.             $dateActuelle = new \DateTime();
  87.             if (
  88.                 $produit->getPublishedAt() <= $dateActuelle &&
  89.                 ($produit->getExpiredAt() >= $dateActuelle || is_null($produit->getExpiredAt()))
  90.             ) {
  91.                 return true;
  92.             }
  93.         }
  94.         return false;
  95.     }
  96. }