<?php
namespace App\EventListener;
use App\Entity\OperationOrder;
use App\Entity\OperationOrderStepVersion;
use App\Service\DataLogger;
use App\Service\OperationOrderService;
use App\Service\QuotaService;
use App\Service\User as UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
class OperationOrderWorkflowListener implements EventSubscriberInterface
{
private DataLogger $dataLogger;
private EntityManagerInterface $entityManager;
private OperationOrderService $operationOrderService;
private QuotaService $quotaService;
private UserService $userService;
public function __construct(EntityManagerInterface $entityManager, UserService $userService, DataLogger $dataLogger, OperationOrderService $operationOrderService, QuotaService $quotaService)
{
$this->entityManager = $entityManager;
$this->dataLogger = $dataLogger;
$this->operationOrderService = $operationOrderService;
$this->quotaService = $quotaService;
$this->userService = $userService;
}
public function onEnter(Event $event): void
{
}
public function onTransition(Event $event): void
{
}
public function onEntered(Event $event): void
{
}
public function onCompleted(Event $event): void
{
$transitionName = $event->getTransition()->getName();
$user = $this->userService->getUser();
$wsResponse = 'none';
/** @var OperationOrder $operationOrder */
$operationOrder = $event->getSubject();
if ('toCanceled' === $transitionName) {
try {
$oldPrice = $operationOrder->getPrice();
$operationOrder->setPrice(0.0);
$updatedQuota = $this->quotaService->updateQuota($operationOrder, $oldPrice);
} catch (\Exception) {
// echo 'Exception reçue : ', $e->getMessage(), "\n";
}
}
if (null === $user) {
$user = $operationOrder->getUser();
}
$this->entityManager->persist($operationOrder);
$operationOrderStepVersion = new OperationOrderStepVersion();
$operationOrderStepVersion->setDate(new \DateTime());
$operationOrderStepVersion->setStep(strtolower(substr((string) $transitionName, 2)));
$operationOrderStepVersion->setUser($user);
$operationOrderStepVersion->setOperationOrder($operationOrder);
$this->entityManager->persist($operationOrderStepVersion);
$this->entityManager->flush();
$this->dataLogger->add('WS from api for transision : ' . $transitionName, 'operationOrderWorkflow', $event->getSubject(), 'info');
$this->operationOrderService->notifyAgency($operationOrder, $transitionName);
}
public function onLeave(Event $event): void
{
}
public static function getSubscribedEvents(): array
{
return [
'workflow.operation_order_step.leave' => 'onLeave',
'workflow.operation_order_step.enter' => 'onEnter',
'workflow.operation_order_step.completed' => 'onCompleted',
'workflow.operation_order_step.entered' => 'onEntered',
];
}
}