<?php
namespace App\EventSubscriber;
use App\Entity\Solicitud;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\GuardEvent;
use Symfony\Component\Workflow\TransitionBlocker;
/**
* Guard genérico de modalidad para workflows unificados.
*
* Lee el campo `modalidad` de la metadata de cada transición y lo compara
* con `Solicitud::getSolicitudTipo()->getId()`.
*
* - Si la transición NO declara `modalidad` → se permite siempre (backward compatible).
* - Si la transición declara `modalidad: [1]` y la solicitud es tipo 2 → se bloquea.
* - Funciona para TODOS los workflows que usen la convención `metadata.modalidad`.
*
* @see config/packages/workflow.yaml — metadata.modalidad en places y transiciones
*/
class WorkflowModalidadGuardSubscriber implements EventSubscriberInterface
{
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
// Escucha el guard de TODOS los workflows → reutilizable para futuros trámites
return [
'workflow.guard' => ['onWorkflowGuard', 0],
];
}
/**
* Bloquea la transición si la modalidad de la solicitud no está permitida.
*
* @param GuardEvent $event Evento guard del workflow
*/
public function onWorkflowGuard(GuardEvent $event): void
{
$subject = $event->getSubject();
if (!$subject instanceof Solicitud) {
return;
}
$transition = $event->getTransition();
$modalidadesPermitidas = $event->getMetadata('modalidad', $transition);
// Sin metadata de modalidad → la transición aplica para cualquier tipo
if (empty($modalidadesPermitidas)) {
return;
}
$solicitudTipo = $subject->getSolicitudTipo();
// Si la solicitud no tiene tipo asignado, no bloquear (permite flujo inicial)
if ($solicitudTipo === null) {
return;
}
$tipoId = (int) $solicitudTipo->getId();
if (!in_array($tipoId, (array) $modalidadesPermitidas, true)) {
$event->addTransitionBlocker(
new TransitionBlocker(
sprintf(
'La transición "%s" no está disponible para la modalidad %d (permitidas: %s).',
$transition->getName(),
$tipoId,
implode(', ', (array) $modalidadesPermitidas)
),
'workflow_modalidad_guard.blocked'
)
);
}
}
}