src/Security/Voter/SolicitudPolicyVoter.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Entity\Solicitud;
  4. use App\Entity\Usuario;
  5. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  6. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  7. use Symfony\Component\Security\Core\Security;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. class SolicitudPolicyVoter extends Voter
  10. {
  11.     private $security;
  12.     public function __construct(Security $security)
  13.     {
  14.         $this->security = $security;
  15.     }
  16.     protected function supports(string $attribute, $subject): bool
  17.     {
  18.         return in_array($attribute, ['EDIT'])
  19.             && $subject instanceof Solicitud;
  20.     }
  21.     protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
  22.     {
  23.         $user = $token->getUser();
  24.         if (!$user instanceof UserInterface) {
  25.             return false;
  26.         }
  27.         $solicitud = $subject;
  28.         switch ($attribute) {
  29.             case 'EDIT':
  30.                     return $this->canEdit($solicitud, $user);
  31.                 break;
  32.         }
  33.         return false;
  34.     }
  35.     private function isOwner(Solicitud $solicitud, Usuario $usuario):bool {
  36.         return $usuario === $solicitud->getUsuario();
  37.     }
  38.     private function canEdit(Solicitud $solicitud, Usuario $usuario):bool {
  39.         if(($this->isOwner($solicitud, $usuario) || $this->isAdmin()) && $this->hasCorrectStatus($solicitud)){
  40.             return true;
  41.         }
  42.         return false;
  43.     }
  44.     private function isAdmin():bool {
  45.         // ROLE_SUPER_ADMIN tiene todos los permisos
  46.         if ($this->security->isGranted('ROLE_SUPER_ADMIN') ||
  47.             $this->security->isGranted('ROLE_ADMIN')
  48.         ) {
  49.             return true;
  50.         }
  51.         return false;
  52.     }
  53.     /**
  54.      * Indica si el estatus de la solicitud permite edición.
  55.      *
  56.      * Bloquea cuando el workflow está en "finalizado" o el catálogo
  57.      * no es Pendiente / En proceso / Rechazado.
  58.      *
  59.      * @param Solicitud $solicitud
  60.      * @return bool
  61.      */
  62.     private function hasCorrectStatus(Solicitud $solicitud): bool
  63.     {
  64.         // Workflow finalizado: no editable aunque el catálogo aún diga "En proceso"
  65.         if ($solicitud->getEstado() === 'finalizado') {
  66.             return false;
  67.         }
  68.         $estatusSolicitud = $solicitud->getEstatusSolicitud();
  69.         if ($estatusSolicitud === null) {
  70.             return false;
  71.         }
  72.         // Solo Pendiente (1), En proceso (2) o Rechazado (5)
  73.         $estatus = [1, 2, 5];
  74.         return in_array((int) $estatusSolicitud->getId(), $estatus, true);
  75.     }
  76. }