<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Entity\Ticket;
use App\Service\LegApiService;
use App\Workflow\TicketAwmTransitionsAndStates;
use App\Workflow\TicketMalfunctionTransitionsAndStates;
use App\Workflow\TicketRefuelTransitionsAndStates;
use App\Workflow\TicketSensorTransitionsAndStates;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Workflow\Event\TransitionEvent;
use Symfony\Component\Workflow\Registry;
class TransitionEventSubscriber implements EventSubscriberInterface
{
private $tokenStorage;
private $em;
private $workflowRegistry;
private $logger;
private $apiService;
public function __construct(TokenStorageInterface $tokenStorage, EntityManagerInterface $em, Registry $workflowRegistry, LoggerInterface $logger, LegApiService $legApiService)
{
$this->tokenStorage = $tokenStorage;
$this->em = $em;
$this->workflowRegistry = $workflowRegistry;
$this->logger = $logger;
$this->apiService = $legApiService;
$this->logger->debug('aco.DEBUG: workflow: TransitionEventSubscriber: __construct');
}
public function authenticateAsSystemUser()
{
$systemUser = $this->em->getRepository(User::class)->getSystemUser();
$token = new UsernamePasswordToken($systemUser, $systemUser->getPassword(), 'public', $systemUser->getRoles());
// For older versions of Symfony, use security.context here
$this->tokenStorage->setToken($token);
}
public function onWorkflowMalfunctionEntered($event)
{
// echo "onWorkflowAwmEntered: ".$event->getSubject()->getMarking()."<br />";
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow: onWorkflowMalfunctionEntered: ENTERED');
$token = $this->tokenStorage->getToken();
$this->logger->debug('aco.DEBUG: workflow: onWorkflowMalfunctionEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: ENTERED Malfunction');
if ($ticket->getElevator()) {
$tga = $ticket->getElevator();
}
if ($ticket->getNea()) {
$tga = $ticket->getNea();
}
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: User: '.$token->getUser()->getUsername());
$userRoles = implode(', ', $token->getUser()->getRoles());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: User Roles: '.$userRoles);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: TransitionName: '.$event->getTransition()->getName());
switch ($event->getTransition()->getName()) {
case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getMaintenanceCompany()) {
$ticket->setAssignee($tga->getMaintenanceCompany());
}
$ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: case TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET');
$enabledTrans = $ticketStateMachine->getEnabledTransitions($ticket);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: enabledTrans: '.count($enabledTrans));
foreach ($enabledTrans as $k => $v) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: enabledTrans: '.$v->getName());
}
$this->authenticateAsSystemUser();
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
// $ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET);
break;
case TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED: '.TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED);
$enabledTrans = $ticketStateMachine->getEnabledTransitions($ticket);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: enabledTrans: '.count($enabledTrans));
foreach ($enabledTrans as $k => $v) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: enabledTrans: '.$v->getName());
}
// $this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getMaintenanceCompany()) {
$ticket->setAssignee($tga->getMaintenanceCompany());
}
$ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_TERMINATION);
break;
default:
if (TicketMalfunctionTransitionsAndStates::TRANS_TRANSFER_TO_DL != $event->getTransition()->getName()) {
// call api request
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: enabledTrans: '.$event->getTransition()->getName());
$reason = $event->getTransition()->getName();
$date = $ticket->getDueDate();
$reasons = [trim($ticket->getFailureCause()), trim($ticket->getReasonNewTermination()), trim($ticket->getDismissReason())];
$reasonString = implode("\n", $reasons);
// ablehnen soll nicht an die API uebertragen werden
if (TicketMalfunctionTransitionsAndStates::TRANS_DECLINE != $event->getTransition()->getName()) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowMalfunctionEntered: postStateRemote:');
$this->apiService->postStateRemote($ticket->getElevator(), $ticket->getElevator()->getState(), $date, $reasonString);
}
}
break;
}
}
public function onWorkflowZuesEntered($event)
{
// echo "onWorkflowAwmEntered: ".$event->getSubject()->getMarking()."<br />";
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow: onWorkflowZuesEntered: ENTERED');
$token = $this->tokenStorage->getToken();
$this->logger->debug('aco.DEBUG: workflow: onWorkflowZuesEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: ENTERED Malfunction');
if ($ticket->getElevator()) {
$tga = $ticket->getElevator();
}
if ($ticket->getNea()) {
$tga = $ticket->getNea();
}
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: User: '.$token->getUser()->getUsername());
$userRoles = implode(', ', $token->getUser()->getRoles());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: User Roles: '.$userRoles);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: TransitionName: '.$event->getTransition()->getName());
switch ($event->getTransition()->getName()) {
case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getMaintenanceCompany()) {
$ticket->setAssignee($tga->getMaintenanceCompany());
}
$ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: case TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET');
$enabledTrans = $ticketStateMachine->getEnabledTransitions($ticket);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: enabledTrans: '.count($enabledTrans));
foreach ($enabledTrans as $k => $v) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: enabledTrans: '.$v->getName());
}
$this->authenticateAsSystemUser();
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
// $ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET);
break;
case TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED: '.TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED);
$enabledTrans = $ticketStateMachine->getEnabledTransitions($ticket);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: enabledTrans: '.count($enabledTrans));
foreach ($enabledTrans as $k => $v) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowZuesEntered: enabledTrans: '.$v->getName());
}
// $this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getMaintenanceCompany()) {
$ticket->setAssignee($tga->getMaintenanceCompany());
}
$ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_TERMINATION);
break;
}
}
public function onWorkflowWarningEntered($event)
{
// echo "onWorkflowAwmEntered: ".$event->getSubject()->getMarking()."<br />";
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow: onWorkflowWarningEntered: ENTERED');
$this->logger->debug('aco.DEBUG: workflow: onWorkflowWarningEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowWarningEntered: ENTERED WARNING');
if ($ticket->getElevator()) {
$tga = $ticket->getElevator();
}
if ($ticket->getNea()) {
$tga = $ticket->getNea();
}
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowWarningEntered: TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED: '.TicketMalfunctionTransitionsAndStates::TRANS_NOT_REPAIRED);
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowWarningEntered: TransitionName: '.$event->getTransition()->getName());
switch ($event->getTransition()->getName()) {
case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowWarningEntered: case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getMaintenanceCompany()) {
$ticket->setAssignee($tga->getMaintenanceCompany());
}
// TODO: check if tickets should automatically assigend to DL
// $this->em->persist($ticket);
// $this->em->flush();
$ticketStateMachine->apply($ticket, TicketMalfunctionTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketMalfunctionTransitionsAndStates::TRANS_REOPEN_TICKET:
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
break;
}
}
public function onWorkflowRefuelEntered($event)
{
// echo "onWorkflowAwmEntered: ".$event->getSubject()->getMarking()."<br />";
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow: onWorkflowRefuelEntered: ENTERED');
$this->logger->debug('aco.DEBUG: workflow: onWorkflowRefuelEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowRefuelEntered: ENTERED Refuel');
if ($ticket->getNea()) {
$tga = $ticket->getNea();
}
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowRefuelEntered: TransitionName: '.$event->getTransition()->getName());
switch ($event->getTransition()->getName()) {
case TicketRefuelTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowRefuelEntered: case TicketMalfunctionTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($tga->getTankCompany()) {
$ticket->setAssignee($tga->getTankCompany());
}
// TODO: check if tickets should automatically assigend to DL
// $this->em->persist($ticket);
// $this->em->flush();
$ticketStateMachine->apply($ticket, TicketRefuelTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketRefuelTransitionsAndStates::TRANS_REOPEN_TICKET:
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
break;
}
}
public function onWorkflowTicketTransition(TransitionEvent $event)
{
$this->logger->debug('aco.DEBUG: TicketGenerator: workflow: onWorkflowTicketTransition');
$context = $event->getContext();
$user = $this->tokenStorage->getToken()->getUser();
if ($user instanceof UserInterface) {
$context['user'] = $user->getUsername();
}
$this->logger->debug('aco.DEBUG: workflow_transition: onWorkflowAwmEntered: User: '.$user->getUsername());
$context['transitionTo'] = [
$event->getSubject()->getMarking(),
];
$ticketRepo = $this->em->getRepository(Ticket::class);
$reciepients = $ticketRepo->getNotificationReciepients($event->getSubject(), true);
$context['mailing'] = implode(', ', $reciepients);
$event->setContext($context);
}
public function onWorkflowAwmEntered($event)
{
$this->logger->debug('aco.DEBUG: workflow_transition: onWorkflowAwmEntered: ENTERED');
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow: onWorkflowAwmEntered: AWM');
$this->logger->debug('aco.DEBUG: workflow: onWorkflowAwmEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: ENTERED AWM');
switch ($event->getTransition()->getName()) {
case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($ticket->getElevator()) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET: Ticket has elevator: '.$ticket->getElevator()->getId());
} else {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET: Ticket has NO elevator!!!');
}
if ($ticket->getElevator()->getMaintenanceCompany()) {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET: Ticket can be applied automatically. ');
$ticket->setAssignee($ticket->getElevator()->getMaintenanceCompany());
} else {
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::TRANS_INITIALIZE_TICKET: Ticket can NOT be applied automatically. ');
}
$ticketStateMachine->apply($ticket, TicketAwmTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketAwmTransitionsAndStates::TRANS_REOPEN_TICKET:
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
break;
// case TicketAwmTransitionsAndStates::TRANS_EMERGENCY_MODE:
case TicketAwmTransitionsAndStates::TRANS_NOT_REPAIRED:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowAwmEntered: case TicketAwmTransitionsAndStates::NOT_REPAIRED');
$ticketStateMachine->apply($ticket, TicketAwmTransitionsAndStates::TRANS_TERMINATION);
break;
}
}
public function onWorkflowSensorEntered($event)
{
// echo "onWorkflowSensorEntered: ".$event->getSubject()->getMarking()."<br />";
$ticket = $event->getSubject();
$ticketStateMachine = $this->workflowRegistry->get($ticket, $ticket->getType());
$this->logger->debug('aco.DEBUG: workflow_transition: onWorkflowSensorEntered: ENTERED');
$this->logger->debug('aco.DEBUG: workflow: onWorkflowSensorEntered: AWM');
$this->logger->debug('aco.DEBUG: workflow: onWorkflowSensorEntered: transition: '.$event->getTransition()->getName());
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowSensorEntered: ENTERED AWM');
switch ($event->getTransition()->getName()) {
case TicketSensorTransitionsAndStates::TRANS_INITIALIZE_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowSensorEntered: case TicketSensorTransitionsAndStates::TRANS_INITIALIZE_TICKET');
$this->authenticateAsSystemUser();
// check if DL can be assigned automatically
if ($ticket->getElevator()->getControlCompany()) {
$ticket->setAssignee($ticket->getElevator()->getControlCompany());
}
$ticketStateMachine->apply($ticket, TicketSensorTransitionsAndStates::TRANS_TRANSFER_TO_DL);
break;
case TicketSensorTransitionsAndStates::TRANS_REOPEN_TICKET:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowSensorEntered: case TicketSensorTransitionsAndStates::TRANS_REOPEN_TICKET');
// rermove all given answers
$ticket->setDueDate(null);
$ticket->setFailureCause(null);
$ticket->setReasonNewTermination(null);
$ticket->setDismissReason(null);
$ticket->setConfirmTechnicianOnSite(null);
$ticket->setSignature(null);
break;
// case TicketSensorTransitionsAndStates::TRANS_EMERGENCY_MODE:
case TicketSensorTransitionsAndStates::TRANS_NOT_REPAIRED:
$this->logger->debug('aco.DEBUG: workflow: workflow_transition: onWorkflowSensorEntered: case TicketSensorTransitionsAndStates::NOT_REPAIRED');
$ticketStateMachine->apply($ticket, TicketSensorTransitionsAndStates::TRANS_TERMINATION);
break;
}
}
public static function getSubscribedEvents(): array
{
return [
TransitionEvent::class => 'onWorkflowTicketTransition',
'workflow.malfunction.entered' => 'onWorkflowMalfunctionEntered',
'workflow.refuel.entered' => 'onWorkflowRefuelEntered',
'workflow.awm.entered' => 'onWorkflowAwmEntered',
'workflow.neamalfunction.entered' => 'onWorkflowMalfunctionEntered',
'workflow.sensor.entered' => 'onWorkflowSensorEntered',
'workflow.warning.entered' => 'onWorkflowWarningEntered',
'workflow.zues.entered' => 'onWorkflowZuesEntered',
// 'workflow.awm.enter' => 'onWorkflowAwmEnter',
// 'workflow.awm.leave' => 'onWorkflowAwmLeave',
// 'workflow.awm.completed' => 'onWorkflowAwmCompleted',
];
}
}