src/Security/Voter/AffairVoter.php line 24

Open in your IDE?
  1. <?php
  2. /*
  3.  * To change this license header, choose License Headers in Project Properties.
  4.  * To change this template file, choose Tools | Templates
  5.  * and open the template in the editor.
  6.  */
  7. namespace App\Security\Voter;
  8. use App\Entity\JIT\Affair;
  9. use App\Entity\JIT\Person;
  10. use App\Entity\Security\User;
  11. use LogicException;
  12. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  13. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  14. use Symfony\Component\Security\Core\Security;
  15. /**
  16.  * Description of AffairVoter
  17.  *
  18.  * @author NOUTCHEU Blaise
  19.  */
  20. class AffairVoter extends Voter {
  21.     // these strings are just invented: you can use anything
  22.     const LIST = 'ROLE_JIT_AFFAIR_INDEX';
  23.     const ADD 'ROLE_JIT_AFFAIR_ADD';
  24.     const ADDBP 'ROLE_JIT_AFFAIR_ADDBP';
  25.     const VIEW 'ROLE_JIT_AFFAIR_VIEW';
  26.     const CLONE = 'ROLE_JIT_AFFAIR_CLONE';
  27.     const EDIT 'ROLE_JIT_AFFAIR_EDIT';
  28.     const DELETE 'ROLE_JIT_AFFAIR_DELETE';
  29.     const OPEN 'ROLE_JIT_AFFAIR_OPEN';
  30.     const WAIT 'ROLE_JIT_AFFAIR_WAIT';
  31.     const CLOSE 'ROLE_JIT_AFFAIR_CLOSE';
  32.     const REOPEN 'ROLE_JIT_AFFAIR_REOPEN';
  33.     private $security;
  34.     public function __construct(Security $security) {
  35.         $this->security $security;
  36.     }
  37.     protected function supports(string $attribute$subject) {
  38.         // only a teacher can add affair on his subject
  39.         if (in_array($attribute, [
  40.                     self::LIST,
  41.                     self::ADD,
  42.                     self::ADDBP,
  43.                     self::VIEW,
  44.                     self::CLONE,
  45.                     self::EDIT,
  46.                     self::DELETE,
  47.                     self::OPEN,
  48.                     self::WAIT,
  49.                     self::CLOSE,
  50.                     self::REOPEN,
  51.                 ])) {
  52.             return true;
  53.         }
  54.         if (!in_array($attribute, [
  55.                     self::VIEW,
  56.                 ])) {
  57.             return false;
  58.         }
  59.         // only vote on `Affair` objects
  60.         if (!$subject instanceof Affair) {
  61.             return false;
  62.         }
  63.         return true;
  64.     }
  65.     protected function voteOnAttribute(string $attribute$subjectTokenInterface $token) {
  66.         $user $token->getUser();
  67.         if (!$user instanceof User) {
  68.             // the user must be logged in; if not, deny access
  69.             return false;
  70.         }
  71.         // ROLE_JIT_AFFAIR_MANAGE can do anything on affair! The power!
  72.         if ($this->security->isGranted('ROLE_MANAGER')) {
  73.             return true;
  74.         }
  75.         if ($this->security->isGranted('ROLE_DEV')) {
  76.             return true;
  77.         }
  78.         switch ($attribute) {
  79.             case self::LIST:
  80.                 return $this->canList($user//&& false
  81.                 ;
  82.             case self::ADD:
  83.                 return $this->canAdd($user);
  84.             case self::ADDBP:
  85.                 return $this->canAddBP($subject$user);
  86.             case self::CLONE:
  87.                 return $this->canClone($subject$user);
  88.             case self::VIEW:
  89.                 return $this->canView($subject$user);
  90.             case self::EDIT:
  91.                 return $this->canEdit($subject$user);
  92.             case self::DELETE:
  93.                 return $this->canDelete($subject$user);
  94.             case self::OPEN:
  95.                 return $this->canOpen($subject$user);
  96.             case self::WAIT:
  97.                 return $this->canWait($subject$user);
  98.             case self::CLOSE:
  99.                 return $this->canClose($subject$user);
  100.             case self::REOPEN:
  101.                 return $this->canReopen($subject$user);
  102.                 
  103.         }
  104.         throw new LogicException('This code should not be reached!');
  105.     }
  106.     private function canList(User $user): bool {
  107.         if ($user->isEmployee()) {
  108.             return true;
  109.         } else if ($user->isOwner() or $user->isTenant()) {
  110.             return $user->hasAffair();
  111.         }
  112.         return false;
  113.     }
  114.     private function canAdd(User $user): bool {
  115.         if ($user->isEmployee()) {
  116.             return true;
  117.         }
  118.         return false;
  119.     }
  120.     private function canAddBP(Person $personUser $user) {
  121.         return $this->canAdd($user) && $this->security->isGranted('ROLE_JIT_PERSON_VIEW'$person);
  122.     }
  123.     private function canClone(Affair $affairUser $user) {
  124.         return $this->canAdd($user) && $this->canView($affair$user);
  125.     }
  126.     private function canView(Affair $affairUser $user) {
  127.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  128.             return true;
  129.         } else if ($user->getPersons()->contains($affair->getMgr())) {
  130.             return true;
  131.         } else if ($user->getPersons()->contains($affair->getDnd())) {
  132.             return true;
  133.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  134.             return true;
  135.         }
  136.         return false;
  137.     }
  138.     private function canEdit(Affair $affairUser $user) {
  139.         if(!$affair->isEditable()){
  140.             return false;
  141.         }
  142.         //Uniquement le chef d'agence peut modifier une affairne
  143.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  144.             return true;
  145.         }else if ($user->getPersons()->contains($affair->getMgr())) {
  146.             return true;
  147.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  148.             return true;
  149.         }
  150.         return false;
  151.     }
  152.     private function canDelete(Affair $affairUser $user) {
  153.         if(!$affair->isDeletable()){
  154.             return false;
  155.         }
  156.         
  157.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  158.             return true;
  159.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  160.             return $user->hasAgency();
  161.         }
  162.         return false;
  163.     }
  164.     
  165.     private function canOpen(Affair $affairUser $user) {
  166.         if(!$affair->isToOpen()){
  167.             return false;
  168.         }
  169.         
  170.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  171.             return true;
  172.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  173.             return $user->hasAgency();
  174.         }
  175.         return false;
  176.     }
  177.     
  178.     private function canWait(Affair $affairUser $user) {
  179.         if(!$affair->isToWait()){
  180.             return false;
  181.         }
  182.         
  183.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  184.             return true;
  185.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  186.             return $user->hasAgency();
  187.         }
  188.         return false;
  189.     }
  190.     
  191.     private function canClose(Affair $affairUser $user) {
  192.         if(!$affair->isToClose()){
  193.             return false;
  194.         }
  195.         
  196.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  197.             return true;
  198.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  199.             return $user->hasAgency();
  200.         }
  201.         return false;
  202.     }
  203.     
  204.     private function canReopen(Affair $affairUser $user) {
  205.         if(!$affair->isToReopen()){
  206.             return false;
  207.         }
  208.         
  209.         if ($user->getMyAgencies()->contains($affair->getAgency())) {
  210.             return true;
  211.         } else if ($user->getMyEmployees()->contains($affair->getMgr())) {
  212.             return $user->hasAgency();
  213.         }
  214.         return false;
  215.     }
  216. }