src/EventSubscriber/AcoAnomalyTicketAnswerSubscriber.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\AcoAnomalyAssessment;
  4. use App\Entity\Elevator;
  5. use App\Entity\Ticket;
  6. use App\FailureDetection\AcoAnomaly\AcoAnomalyAssessmentService;
  7. use App\Workflow\TicketMalfunctionTransitionsAndStates;
  8. use Psr\Log\LoggerInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Security\Core\Security;
  11. /**
  12.  * Antwortet ein Dienstleister oder Betreiber im Warnungsticket "Stillstandswarnung", wirkt das
  13.  * genauso wie die Bewertung durch den Super-Admin in der AcoAnomalien-Liste:
  14.  *
  15.  *  - "Stillstand bestätigen"  -> Anlage geht auf "Anlage gestört", Störungsticket wird eröffnet
  16.  *  - "Fehlerkennung melden"   -> Verdacht wird geräumt, kein Ticket, Anlagenstatus bleibt
  17.  *
  18.  * Die Wirkung selbst liegt in AcoAnomalyAssessmentService — hier wird nur der Auslöser
  19.  * verdrahtet, damit es für beide Wege genau eine Wahrheit gibt.
  20.  *
  21.  * Bewusst ein eigener Zuhörer statt einer Erweiterung von TransitionEventSubscriber: dort
  22.  * hängen die allgemeinen Ticket-Übergänge, hier ausschließlich die Anomalie-Antworten.
  23.  */
  24. class AcoAnomalyTicketAnswerSubscriber implements EventSubscriberInterface
  25. {
  26.     private $assessmentService;
  27.     private $security;
  28.     private $logger;
  29.     public function __construct(
  30.         AcoAnomalyAssessmentService $assessmentService,
  31.         Security $security,
  32.         LoggerInterface $logger
  33.     ) {
  34.         $this->assessmentService $assessmentService;
  35.         $this->security $security;
  36.         $this->logger $logger;
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             'workflow.sa_warning.entered' => 'onWarningAnswered',
  42.         ];
  43.     }
  44.     public function onWarningAnswered($event): void
  45.     {
  46.         $transition $event->getTransition()->getName();
  47.         if (TicketMalfunctionTransitionsAndStates::TRANS_ANOMALY_CONFIRM === $transition) {
  48.             $result AcoAnomalyAssessment::RESULT_CONFIRMED;
  49.         } elseif (TicketMalfunctionTransitionsAndStates::TRANS_ANOMALY_FALSE_DETECTION === $transition) {
  50.             $result AcoAnomalyAssessment::RESULT_FALSE_DETECTION;
  51.         } else {
  52.             return;
  53.         }
  54.         $ticket $event->getSubject();
  55.         if (!$ticket instanceof Ticket) {
  56.             return;
  57.         }
  58.         $elevator $ticket->getElevator();
  59.         if (!$elevator instanceof Elevator) {
  60.             return;
  61.         }
  62.         // Läuft überhaupt noch ein unbewerteter Verdacht? Wurde die Episode zwischenzeitlich
  63.         // vom Super-Admin bewertet oder hat sich die Anlage selbst geheilt, bleibt die Antwort
  64.         // wirkungslos — das Ticket geht trotzdem zu, es hat sich ja erledigt.
  65.         $blocked $this->assessmentService->assessmentBlockedReason($elevator);
  66.         if (null !== $blocked) {
  67.             $this->logger->info(sprintf(
  68.                 'AcoAnomaly: Antwort "%s" auf Ticket %s ohne Wirkung — %s',
  69.                 $transition$ticket->getTicketId(), $blocked
  70.             ));
  71.             return;
  72.         }
  73.         $user $this->security->getUser();
  74.         $assessedBy $user ? (string) $user->getUsername() : 'unbekannt';
  75.         $this->assessmentService->assess($elevator$result$assessedBy$user);
  76.         $this->logger->info(sprintf(
  77.             'AcoAnomaly: Anlage %d über Ticket %s als "%s" bewertet durch %s',
  78.             $elevator->getId(), $ticket->getTicketId(), $result$assessedBy
  79.         ));
  80.     }
  81. }