<?php
namespace App\EventSubscriber;
use App\Entity\AcoAnomalyAssessment;
use App\Entity\Elevator;
use App\Entity\Ticket;
use App\FailureDetection\AcoAnomaly\AcoAnomalyAssessmentService;
use App\Workflow\TicketMalfunctionTransitionsAndStates;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;
/**
* Antwortet ein Dienstleister oder Betreiber im Warnungsticket "Stillstandswarnung", wirkt das
* genauso wie die Bewertung durch den Super-Admin in der AcoAnomalien-Liste:
*
* - "Stillstand bestätigen" -> Anlage geht auf "Anlage gestört", Störungsticket wird eröffnet
* - "Fehlerkennung melden" -> Verdacht wird geräumt, kein Ticket, Anlagenstatus bleibt
*
* Die Wirkung selbst liegt in AcoAnomalyAssessmentService — hier wird nur der Auslöser
* verdrahtet, damit es für beide Wege genau eine Wahrheit gibt.
*
* Bewusst ein eigener Zuhörer statt einer Erweiterung von TransitionEventSubscriber: dort
* hängen die allgemeinen Ticket-Übergänge, hier ausschließlich die Anomalie-Antworten.
*/
class AcoAnomalyTicketAnswerSubscriber implements EventSubscriberInterface
{
private $assessmentService;
private $security;
private $logger;
public function __construct(
AcoAnomalyAssessmentService $assessmentService,
Security $security,
LoggerInterface $logger
) {
$this->assessmentService = $assessmentService;
$this->security = $security;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
'workflow.sa_warning.entered' => 'onWarningAnswered',
];
}
public function onWarningAnswered($event): void
{
$transition = $event->getTransition()->getName();
if (TicketMalfunctionTransitionsAndStates::TRANS_ANOMALY_CONFIRM === $transition) {
$result = AcoAnomalyAssessment::RESULT_CONFIRMED;
} elseif (TicketMalfunctionTransitionsAndStates::TRANS_ANOMALY_FALSE_DETECTION === $transition) {
$result = AcoAnomalyAssessment::RESULT_FALSE_DETECTION;
} else {
return;
}
$ticket = $event->getSubject();
if (!$ticket instanceof Ticket) {
return;
}
$elevator = $ticket->getElevator();
if (!$elevator instanceof Elevator) {
return;
}
// Läuft überhaupt noch ein unbewerteter Verdacht? Wurde die Episode zwischenzeitlich
// vom Super-Admin bewertet oder hat sich die Anlage selbst geheilt, bleibt die Antwort
// wirkungslos — das Ticket geht trotzdem zu, es hat sich ja erledigt.
$blocked = $this->assessmentService->assessmentBlockedReason($elevator);
if (null !== $blocked) {
$this->logger->info(sprintf(
'AcoAnomaly: Antwort "%s" auf Ticket %s ohne Wirkung — %s',
$transition, $ticket->getTicketId(), $blocked
));
return;
}
$user = $this->security->getUser();
$assessedBy = $user ? (string) $user->getUsername() : 'unbekannt';
$this->assessmentService->assess($elevator, $result, $assessedBy, $user);
$this->logger->info(sprintf(
'AcoAnomaly: Anlage %d über Ticket %s als "%s" bewertet durch %s',
$elevator->getId(), $ticket->getTicketId(), $result, $assessedBy
));
}
}