<?php
namespace App\EventListener;
use App\Entity\OperationOrderRefrigeratorLine;
use App\Entity\OperationOrderStepVersion;
use App\Entity\PolymorphicOperationOrder\OperationOrderRefrigeratorBin;
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;
use Symfony\Component\Workflow\Registry;
class OpeOrderRefrigeratorbinWorkflowListener implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
private QuotaService $quotaService;
private UserService $userService;
private Registry $workflow;
public function __construct(EntityManagerInterface $entityManager, UserService $userService, QuotaService $quotaService, Registry $wokflow)
{
$this->entityManager = $entityManager;
$this->quotaService = $quotaService;
$this->userService = $userService;
$this->workflow = $wokflow;
}
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 OperationOrderRefrigeratorBin $operationOrder */
$operationOrder = $event->getSubject();
$operationOrder->setUpdatedAt(new \DateTime());
if (method_exists($this, $transitionName)) {
$this->{$transitionName}($operationOrder, $transitionName);
}
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();
}
public function toCanceled(OperationOrderRefrigeratorBin $operationOrder, string $transitionName): void
{
try {
$oldPrice = $operationOrder->getPrice();
$operationOrder->setPrice(0.0);
$updatedQuota = $this->quotaService->updateQuota($operationOrder, $oldPrice);
} catch (\Exception) {
// echo 'Exception reçue : ', $e->getMessage(), "\n";
}
}
public function toShipped(OperationOrderRefrigeratorBin $operationOrder, string $transitionName): void
{
$opeOrderRefrigeratorLines = $operationOrder->getOpeOrderRefrigeratorLines()->toArray();
if (!empty($opeOrderRefrigeratorLines)) {
foreach ($opeOrderRefrigeratorLines as $opeOrderRefrigeratorLine) {
if ($opeOrderRefrigeratorLine instanceof OperationOrderRefrigeratorLine) {
$refrigeratorInstances = $opeOrderRefrigeratorLine->getRefrigeratorInstances()->toArray();
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstance) {
$workflow = $this->workflow->get($refrigeratorInstance, 'refrigerator_instance_step');
if ($refrigeratorInstance->getStep() !== 'shipped' && $workflow->can($refrigeratorInstance, $transitionName)) {
$workflow->apply($refrigeratorInstance, $transitionName);
}
}
}
}
}
}
}
public function toDelivered(OperationOrderRefrigeratorBin $operationOrder, string $transitionName): void
{
$opeOrderRefrigeratorLines = $operationOrder->getOpeOrderRefrigeratorLines()->toArray();
if (!empty($opeOrderRefrigeratorLines)) {
foreach ($opeOrderRefrigeratorLines as $opeOrderRefrigeratorLine) {
if ($opeOrderRefrigeratorLine instanceof OperationOrderRefrigeratorLine) {
$refrigeratorInstances = $opeOrderRefrigeratorLine->getRefrigeratorInstances()->toArray();
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstance) {
$workflow = $this->workflow->get($refrigeratorInstance, 'refrigerator_instance_step');
if ($refrigeratorInstance->getStep() !== 'delivered' && $workflow->can($refrigeratorInstance, $transitionName)) {
$workflow->apply($refrigeratorInstance, $transitionName);
}
}
}
}
}
}
}
public function toAbandonnedTransmited(OperationOrderRefrigeratorBin $operationOrder, string $transitionName): void
{
$workflow = $this->workflow->get($operationOrder, 'order_refrigeratorbin_step');
if ($workflow->can($operationOrder, 'toAbandonned')) {
$workflow->apply($operationOrder, 'toAbandonned');
}
}
public function toFinishedClosed(OperationOrderRefrigeratorBin $operationOrder, string $transitionName): void
{
$opeOrderRefrigeratorLines = $operationOrder->getOpeOrderRefrigeratorLines()->toArray();
if (!empty($opeOrderRefrigeratorLines)) {
foreach ($opeOrderRefrigeratorLines as $opeOrderRefrigeratorLine) {
if ($opeOrderRefrigeratorLine instanceof OperationOrderRefrigeratorLine) {
$refrigeratorInstances = $opeOrderRefrigeratorLine->getRefrigeratorInstances()->toArray();
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstance) {
$workflow = $this->workflow->get($refrigeratorInstance, 'refrigerator_instance_step');
if ($refrigeratorInstance->getStep() !== 'recovered' && $workflow->can($refrigeratorInstance, 'toRecovered')) {
$workflow->apply($refrigeratorInstance, 'toRecovered');
}
}
}
}
}
}
}
public function onLeave(Event $event): void
{
}
public static function getSubscribedEvents(): array
{
return [
'workflow.order_refrigeratorbin_step.leave' => 'onLeave',
'workflow.order_refrigeratorbin_step.enter' => 'onEnter',
'workflow.order_refrigeratorbin_step.completed' => 'onCompleted',
'workflow.order_refrigeratorbin_step.entered' => 'onEntered',
];
}
}