<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace App\Security\Voter;
use App\Entity\JIT\Affair;
use App\Entity\JIT\Person;
use App\Entity\Security\User;
use LogicException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
/**
* Description of AffairVoter
*
* @author NOUTCHEU Blaise
*/
class AffairVoter extends Voter {
// these strings are just invented: you can use anything
const LIST = 'ROLE_JIT_AFFAIR_INDEX';
const ADD = 'ROLE_JIT_AFFAIR_ADD';
const ADDBP = 'ROLE_JIT_AFFAIR_ADDBP';
const VIEW = 'ROLE_JIT_AFFAIR_VIEW';
const CLONE = 'ROLE_JIT_AFFAIR_CLONE';
const EDIT = 'ROLE_JIT_AFFAIR_EDIT';
const DELETE = 'ROLE_JIT_AFFAIR_DELETE';
const OPEN = 'ROLE_JIT_AFFAIR_OPEN';
const WAIT = 'ROLE_JIT_AFFAIR_WAIT';
const CLOSE = 'ROLE_JIT_AFFAIR_CLOSE';
const REOPEN = 'ROLE_JIT_AFFAIR_REOPEN';
private $security;
public function __construct(Security $security) {
$this->security = $security;
}
protected function supports(string $attribute, $subject) {
// only a teacher can add affair on his subject
if (in_array($attribute, [
self::LIST,
self::ADD,
self::ADDBP,
self::VIEW,
self::CLONE,
self::EDIT,
self::DELETE,
self::OPEN,
self::WAIT,
self::CLOSE,
self::REOPEN,
])) {
return true;
}
if (!in_array($attribute, [
self::VIEW,
])) {
return false;
}
// only vote on `Affair` objects
if (!$subject instanceof Affair) {
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token) {
$user = $token->getUser();
if (!$user instanceof User) {
// the user must be logged in; if not, deny access
return false;
}
// ROLE_JIT_AFFAIR_MANAGE can do anything on affair! The power!
if ($this->security->isGranted('ROLE_MANAGER')) {
return true;
}
if ($this->security->isGranted('ROLE_DEV')) {
return true;
}
switch ($attribute) {
case self::LIST:
return $this->canList($user) //&& false
;
case self::ADD:
return $this->canAdd($user);
case self::ADDBP:
return $this->canAddBP($subject, $user);
case self::CLONE:
return $this->canClone($subject, $user);
case self::VIEW:
return $this->canView($subject, $user);
case self::EDIT:
return $this->canEdit($subject, $user);
case self::DELETE:
return $this->canDelete($subject, $user);
case self::OPEN:
return $this->canOpen($subject, $user);
case self::WAIT:
return $this->canWait($subject, $user);
case self::CLOSE:
return $this->canClose($subject, $user);
case self::REOPEN:
return $this->canReopen($subject, $user);
}
throw new LogicException('This code should not be reached!');
}
private function canList(User $user): bool {
if ($user->isEmployee()) {
return true;
} else if ($user->isOwner() or $user->isTenant()) {
return $user->hasAffair();
}
return false;
}
private function canAdd(User $user): bool {
if ($user->isEmployee()) {
return true;
}
return false;
}
private function canAddBP(Person $person, User $user) {
return $this->canAdd($user) && $this->security->isGranted('ROLE_JIT_PERSON_VIEW', $person);
}
private function canClone(Affair $affair, User $user) {
return $this->canAdd($user) && $this->canView($affair, $user);
}
private function canView(Affair $affair, User $user) {
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getPersons()->contains($affair->getMgr())) {
return true;
} else if ($user->getPersons()->contains($affair->getDnd())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return true;
}
return false;
}
private function canEdit(Affair $affair, User $user) {
if(!$affair->isEditable()){
return false;
}
//Uniquement le chef d'agence peut modifier une affairne
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
}else if ($user->getPersons()->contains($affair->getMgr())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return true;
}
return false;
}
private function canDelete(Affair $affair, User $user) {
if(!$affair->isDeletable()){
return false;
}
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return $user->hasAgency();
}
return false;
}
private function canOpen(Affair $affair, User $user) {
if(!$affair->isToOpen()){
return false;
}
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return $user->hasAgency();
}
return false;
}
private function canWait(Affair $affair, User $user) {
if(!$affair->isToWait()){
return false;
}
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return $user->hasAgency();
}
return false;
}
private function canClose(Affair $affair, User $user) {
if(!$affair->isToClose()){
return false;
}
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return $user->hasAgency();
}
return false;
}
private function canReopen(Affair $affair, User $user) {
if(!$affair->isToReopen()){
return false;
}
if ($user->getMyAgencies()->contains($affair->getAgency())) {
return true;
} else if ($user->getMyEmployees()->contains($affair->getMgr())) {
return $user->hasAgency();
}
return false;
}
}