<?php
namespace App\EventListener;
use App\Entity\FurnitureStock;
use App\Entity\FurnitureStockStepVersion;
use App\Service\FurnitureStockService;
use App\Service\User as UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\Event;
class FurnitureStockWorkflowListener implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
private FurnitureStockService $furnitureStockService;
private UserService $userService;
public function __construct(EntityManagerInterface $entityManager, FurnitureStockService $furnitureStockService, UserService $userService)
{
$this->entityManager = $entityManager;
$this->furnitureStockService = $furnitureStockService;
$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();
/** @var FurnitureStock $furnitureStock */
$furnitureStock = $event->getSubject();
if (method_exists($this, $transitionName)) {
$this->{$transitionName}($furnitureStock, $transitionName);
}
$furnitureStockStepVersion = new FurnitureStockStepVersion();
$furnitureStockStepVersion->setDate(new \DateTime());
$furnitureStockStepVersion->setStep(strtolower(substr((string) $transitionName, 2)));
$furnitureStockStepVersion->setUser($user);
$furnitureStockStepVersion->setFurnitureStock($furnitureStock);
$currentFurnitureInstance = $furnitureStock->getCurrentFurnitureInstance();
$furnitureStockStepVersion->setFurnitureInstance($currentFurnitureInstance);
$this->entityManager->persist($furnitureStockStepVersion);
}
public function toHs(furnitureStock $furnitureStock, string $transitionName): void
{
$this->furnitureStockService->reatributeFutureOrders($furnitureStock, new \DateTime());
$this->entityManager->persist($furnitureStock);
}
public function toMaintenance(furnitureStock $furnitureStock, string $transitionName): void
{
$furnitureStock->setCurrentFurnitureInstance(null);
$this->entityManager->persist($furnitureStock);
}
public function toFree(furnitureStock $furnitureStock, string $transitionName): void
{
$furnitureStock->setCurrentFurnitureInstance(null);
$this->entityManager->persist($furnitureStock);
}
public function onLeave(Event $event): void
{
}
public static function getSubscribedEvents(): array
{
return [
'workflow.furniture_stock_step.leave' => 'onLeave',
'workflow.furniture_stock_step.transition' => 'onTransition',
'workflow.furniture_stock_step.enter' => 'onEnter',
'workflow.furniture_stock_step.entered' => 'onEntered',
'workflow.furniture_stock_step.completed' => 'onCompleted',
];
}
}