src/Voter/ProduitVoter.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Voter;
  3. use App\Entity\Boutique\Produit;
  4. use App\Entity\Boutique\ProduitCouponReductionHistorique;
  5. use App\Entity\User\User;
  6. use App\Manager\Boutique\ProduitStockBalanceManager;
  7. use App\Repository\Boutique\ProduitCouponReductionHistoriqueRepository;
  8. use App\Repository\Boutique\ProduitRepository;
  9. use FOS\UserBundle\Model\UserInterface;
  10. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  11. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  12. use Symfony\Component\Security\Core\Security;
  13. class ProduitVoter extends Voter
  14. {
  15.     // these strings are just invented: you can use anything
  16.     const VIEW  'view';
  17.     const BUY   'buy';
  18.     private $security;
  19.     /**
  20.      * @var ProduitStockBalanceManager
  21.      */
  22.     private $produitStockBalanceManager;
  23.     /**
  24.      * @var ProduitCouponReductionHistoriqueRepository
  25.      */
  26.     private $produitCouponReductionHistoriqueRepository;
  27.     public function __construct(
  28.         Security $security,
  29.         ProduitStockBalanceManager $produitStockBalanceManager,
  30.         ProduitCouponReductionHistoriqueRepository $produitCouponReductionHistoriqueRepository
  31.     )
  32.     {
  33.         $this->security                                     $security;
  34.         $this->produitStockBalanceManager                   $produitStockBalanceManager;
  35.         $this->produitCouponReductionHistoriqueRepository   $produitCouponReductionHistoriqueRepository;
  36.     }
  37.     protected function supports($attribute$subject)
  38.     {
  39.         // if the attribute isn't one we support, return false
  40.         if (!in_array($attribute, array(self::VIEWself::BUY))) {
  41.             return false;
  42.         }
  43.         if (!$subject instanceof Produit) {
  44.             return false;
  45.         }
  46.         return true;
  47.     }
  48.     protected function voteOnAttribute($attribute$subjectTokenInterface $token)
  49.     {
  50.         $user $token->getUser();
  51.         switch ($attribute) {
  52.             case self::VIEW:
  53.                 return $this->canView($subject$user);
  54.             case self::BUY:
  55.                 return $this->canBuy($subject$user);
  56.         }
  57.         throw new \LogicException('This code should not be reached!');
  58.     }
  59.     private function canView(Produit $produitUser $user)
  60.     {
  61.         if ($this->security->isGranted(['ROLE_ADMIN','ROLE_PREVIOUS_ADMIN'])) {
  62.             return true;
  63.         }
  64.         if (
  65.             false === $produit->getGroups()->isEmpty() &&
  66.             false === $user->getGroups()->isEmpty() &&
  67.             !in_array($user->getGroups()->first()->getId(), $produit->getUserGroupIds())
  68.         ) {
  69.             return false;
  70.         }
  71.         if (false === $produit->getActive()) {
  72.             return false;
  73.         }
  74.         if (true === $produit->getVisible()) {
  75.             $dateActuelle = new \DateTime();
  76.             // Check si l'utilisateur a consommé tous les coupons de réduction
  77.             if ($produit->isCouponReduction()) {
  78.                 // Récupération de l'histoire d'utilisation du coupon actuel et de l'utilisateur
  79.                 $produitCouponUserHistorique $this->produitCouponReductionHistoriqueRepository->findByUserAndCoupon($user$produit);
  80.                 $couponReductionUtilisationRestante $produit->getCouponReductionUtilisationNombre() - $produitCouponUserHistorique;
  81.                 if ($couponReductionUtilisationRestante <= 0) {
  82.                     return false;
  83.                 }
  84.             }
  85.             if (
  86.                 $produit->getPublishedAt() <= $dateActuelle &&
  87.                 ($produit->getExpiredAt() >= $dateActuelle || is_null($produit->getExpiredAt()))
  88.             ) {
  89.                 return true;
  90.             }
  91.         }
  92.         return false;
  93.     }
  94.     private function canBuy(Produit $produit$user)
  95.     {
  96.         if (!($user instanceof UserInterface)) {
  97.             return false;
  98.         }
  99.         if (true === $produit->isCouponReduction()) {
  100.             return false;
  101.         }
  102.         if (
  103.             false === $produit->getGroups()->isEmpty() &&
  104.             false === $user->getGroups()->isEmpty() &&
  105.             !in_array($user->getGroups()->first()->getId(), $produit->getUserGroupIds())
  106.         ) {
  107.             return false;
  108.         }
  109.         if (
  110.             false === $user->getGroups()->isEmpty() &&
  111.             true === $user->getGroups()->first()->getRestrictionAchat() &&
  112.             false === $this->security->isGranted(['ROLE_ADMIN','ROLE_DELEGUE'])
  113.         ) {
  114.             return false;
  115.         }
  116.         if (false === $produit->getActive()) {
  117.             return false;
  118.         }
  119.         if (false === $produit->getDispoVente()) {
  120.             return false;
  121.         }
  122.         if (true === $produit->getGestionStock() && $this->produitStockBalanceManager->getStock($produit) <= && is_null($produit->getDefaultDeclinaison())) {
  123.             return false;
  124.         }
  125. //        if (false === $produit->getVisible()) {
  126. //            return false;
  127. //        }
  128.         if (!is_null($produit->getProduitReducCe()) && false === $produit->getProduitReducCe()->seanceDisponibleVente()) {
  129.             return false;
  130.         }
  131.         if (
  132.             true === $produit->getVisible() ||
  133.             (
  134.                 false === $produit->getVisible() &&
  135.                 false === $produit->getIsReducCe() &&
  136.                 $this->security->isGranted(['ROLE_ADMIN','ROLE_PREVIOUS_ADMIN'])
  137.             )
  138.         ) {
  139.             $dateActuelle = new \DateTime();
  140.             if (
  141.                 $produit->getPublishedAt() <= $dateActuelle &&
  142.                 ($produit->getExpiredAt() >= $dateActuelle || is_null($produit->getExpiredAt()))
  143.             ) {
  144.                 return true;
  145.             }
  146.         }
  147.         return false;
  148.     }
  149. }