<?php
namespace App\EventSubscriber;
use App\Entity\DatosUsuario;
use App\Entity\Usuario;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Workflow\Event\GuardEvent;
use Symfony\Component\Workflow\TransitionBlocker;
class WorkflowAreaGuardSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
private Security $security;
public function __construct(EntityManagerInterface $em, Security $security)
{
$this->em = $em;
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [
'workflow.expedicion_cna.guard' => 'onExpedicionCnaGuard',
];
}
public function onExpedicionCnaGuard(GuardEvent $event): void
{
$allowedAreaIds = $event->getMetadata('allowed_area_ids', $event->getTransition());
if (empty($allowedAreaIds)) {
return;
}
$user = $this->security->getUser();
if (!$user instanceof Usuario) {
$event->addTransitionBlocker(new TransitionBlocker('Usuario no autenticado.', 'workflow_area_guard.unauthenticated'));
return;
}
$datosUsuario = $this->em->getRepository(DatosUsuario::class)->findOneBy([
'usuario' => $user,
]);
$areaUsuarioId = null;
if ($datosUsuario !== null && $datosUsuario->getArea() !== null) {
$areaUsuarioId = (int) $datosUsuario->getArea()->getId();
}
if (empty($areaUsuarioId)) {
$event->addTransitionBlocker(new TransitionBlocker('El usuario no tiene área asignada.', 'workflow_area_guard.missing_area'));
return;
}
$allowedAreaIds = array_map(static function ($areaId): int {
return (int) $areaId;
}, (array) $allowedAreaIds);
if (!in_array($areaUsuarioId, $allowedAreaIds, true)) {
$event->addTransitionBlocker(new TransitionBlocker('Tu área no tiene permiso para ejecutar esta transición.', 'workflow_area_guard.forbidden_area'));
}
}
}