<?php
namespace App\Voter;
use App\Entity\Boutique\ProduitDeclinaison;
use App\Manager\Boutique\ProduitStockBalanceManager;
use FOS\UserBundle\Model\UserInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
class ProduitDeclinaisonVoter extends Voter
{
// these strings are just invented: you can use anything
const BUY = 'buy';
private $security;
/**
* @var ProduitStockBalanceManager
*/
private $produitStockBalanceManager;
public function __construct(Security $security, ProduitStockBalanceManager $produitStockBalanceManager)
{
$this->security = $security;
$this->produitStockBalanceManager = $produitStockBalanceManager;
}
protected function supports($attribute, $subject)
{
// if the attribute isn't one we support, return false
if (!in_array($attribute, array(self::BUY))) {
return false;
}
if (!$subject instanceof ProduitDeclinaison) {
return false;
}
return true;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
$user = $token->getUser();
switch ($attribute) {
case self::BUY:
return $this->canBuy($subject, $user);
}
throw new \LogicException('This code should not be reached!');
}
private function canBuy(ProduitDeclinaison $produitDeclinaison, $user)
{
$produit = $produitDeclinaison->getProduit();
if (!($user instanceof UserInterface)) {
return false;
}
if (
false === $produit->getGroups()->isEmpty() &&
false === $user->getGroups()->isEmpty() &&
!in_array($user->getGroups()->first()->getId(), $produit->getUserGroupIds())
) {
return false;
}
if (
false === $user->getGroups()->isEmpty() &&
true === $user->getGroups()->first()->getRestrictionAchat() &&
false === $this->security->isGranted(['ROLE_ADMIN','ROLE_DELEGUE'])
) {
return false;
}
if (false === $produit->getActive()) {
return false;
}
if (false === $produit->getDispoVente()) {
return false;
}
if (true === $produit->getGestionStock() && $this->produitStockBalanceManager->getStock(null, $produitDeclinaison) <= 0) {
return false;
}
// if (false === $produit->getVisible() || false === $produitDeclinaison->getVisible()) {
// return false;
// }
if (!is_null($produit->getProduitReducCe()) && false === $produit->getProduitReducCe()->seanceDisponibleVente()) {
return false;
}
if (
(true === $produit->getVisible() && true === $produitDeclinaison->getVisible()) ||
(
(false === $produit->getVisible() || false === $produitDeclinaison->getVisible()) &&
false === $produit->getIsReducCe() &&
$this->security->isGranted(['ROLE_ADMIN','ROLE_PREVIOUS_ADMIN'])
)
) {
$dateActuelle = new \DateTime();
if (
$produit->getPublishedAt() <= $dateActuelle &&
($produit->getExpiredAt() >= $dateActuelle || is_null($produit->getExpiredAt()))
) {
return true;
}
}
return false;
}
}