<?php
namespace App\EventSubscriber\Savills;
use App\Repository\Savills\WorkValidationRequestRepository;
use App\Service\Savills\WorkValidationRequest\WorkflowHandler;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
class WorkValidationRequestTransitionsSubscriber implements EventSubscriberInterface
{
private WorkValidationRequestRepository $workValidationRequestRepository;
private WorkflowHandler $workflowHandler;
public function __construct(WorkflowHandler $workflowHandler, WorkValidationRequestRepository $workValidationRequestRepository,
private LoggerInterface $logger, private EntityManagerInterface $em
) {
$this->workflowHandler = $workflowHandler;
$this->workValidationRequestRepository = $workValidationRequestRepository;
}
public function onChange(Event $event): void
{
$eventTransition = $event->getTransition();
$transitionAuto = $event->getMetadata('transition_auto', $eventTransition);
if (isset($transitionAuto) && true == $transitionAuto) {
$workValidationRequest = $this->workValidationRequestRepository->find($event->getSubject()->getId());
$nextSteps = $this->workflowHandler->nextStep($workValidationRequest);
$this->em->flush();
if (!$workValidationRequest) {
$this->logger->alert(sprintf(
'Fail to find Work Validation %s.',
$event->getSubject()->getId()
));
}
$this->logger->alert(sprintf(
'OS %s is in step %s.',
$workValidationRequest->getId(),
$workValidationRequest->getPlace()
));
if (1 == count($nextSteps)) {
$stepName = reset($nextSteps);
if ($this->workflowHandler->goToStep($workValidationRequest, $stepName)) {
$this->logger->alert(sprintf(
'Success moving %s to step %s in workflow.',
$event->getSubject()->getId(),
$stepName
));
} else {
$this->logger->alert(sprintf(
'Fail to move %s to step %s in workflow.',
$event->getSubject()->getId(),
$stepName
));
}
} else {
$this->logger->alert(sprintf(
'Too many steps possible for %s in workflow.',
$event->getSubject()->getId()
));
}
}
}
public static function getSubscribedEvents(): array
{
return [
'workflow.work_validation_request.entered' => 'onChange',
];
}
}