<?php
namespace App\EventListener;
use App\Entity\OperationOrder;
use App\Entity\RefrigeratorInstance;
use App\Entity\RefrigeratorInstanceStepVersion;
use App\Service\DataLogger;
use App\Service\MailQueueService;
use App\Service\RefrigeratorBinProductService;
use App\Service\RefrigeratorInstanceService;
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 RefrigeratorInstanceWorkflowListener implements EventSubscriberInterface
{
private DataLogger $dataLogger;
private EntityManagerInterface $entityManager;
private MailQueueService $mailQueueService;
private RefrigeratorBinProductService $refrigeratorBinProductService;
private RefrigeratorInstanceService $refrigeratorInstanceService;
private UserService $userService;
private Registry $workflow;
public function __construct(EntityManagerInterface $entityManager, RefrigeratorBinProductService $refrigeratorBinProductService, RefrigeratorInstanceService $refrigeratorInstanceService, UserService $userService, DataLogger $dataLogger, Registry $wokflow, MailQueueService $mailQueueService)
{
$this->entityManager = $entityManager;
$this->mailQueueService = $mailQueueService;
$this->refrigeratorBinProductService = $refrigeratorBinProductService;
$this->refrigeratorInstanceService = $refrigeratorInstanceService;
$this->dataLogger = $dataLogger;
$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 RefrigeratorInstance $refrigeratorInstance */
$refrigeratorInstance = $event->getSubject();
if (method_exists($this, $transitionName)) {
$this->{$transitionName}($refrigeratorInstance, $transitionName);
}
$refrigeratorInstanceStepVersion = new RefrigeratorInstanceStepVersion();
$refrigeratorInstanceStepVersion->setDate(new \DateTime());
$refrigeratorInstanceStepVersion->setStep(strtolower(substr((string) $transitionName, 2)));
$refrigeratorInstanceStepVersion->setUser($user);
$refrigeratorInstanceStepVersion->setRefrigeratorInstance($refrigeratorInstance);
$refrigeratorInstanceStepVersion->setRecoveryDate($refrigeratorInstance->getRecoveryDate());
$this->entityManager->persist($refrigeratorInstanceStepVersion);
}
public function toShipped(RefrigeratorInstance $refrigeratorInstance, string $transitionName): void
{
$operationOrder = $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
$this->mailQueueService->addMailQueueEntryType2($operationOrder, $refrigeratorInstance, 'shipped');
if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'shipped') {
$toChangeOrderStep = true;
$refrigeratorInstances = $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'shipped') {
$toChangeOrderStep = false;
}
}
$workflow = $this->workflow->get($operationOrder, 'order_refrigeratorbin_step');
if ($toChangeOrderStep === true && $workflow->can($operationOrder, $transitionName)) {
$workflow->apply($operationOrder, $transitionName);
}
}
}
}
public function toDelivered(RefrigeratorInstance $refrigeratorInstance, string $transitionName): void
{
$operationOrder = $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
$this->mailQueueService->addMailQueueEntryType2($operationOrder, $refrigeratorInstance, 'delivered');
if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'delivered') {
$toChangeOrderStep = true;
$refrigeratorInstances = $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'delivered') {
$toChangeOrderStep = false;
}
}
$workflow = $this->workflow->get($operationOrder, 'order_refrigeratorbin_step');
if ($toChangeOrderStep === true && $workflow->can($operationOrder, $transitionName)) {
$workflow->apply($operationOrder, $transitionName);
}
}
}
}
public function toRecovered(RefrigeratorInstance $refrigeratorInstance, string $transitionName): void
{
$operationOrder = $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'finishedClosed') {
$toChangeOrderStep = true;
$refrigeratorInstances = $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
if (!empty($refrigeratorInstances)) {
foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'recovered') {
$toChangeOrderStep = false;
}
}
$workflow = $this->workflow->get($operationOrder, 'order_refrigeratorbin_step');
if ($toChangeOrderStep === true && $workflow->can($operationOrder, 'toFinishedClosed')) {
$workflow->apply($operationOrder, 'toFinishedClosed');
}
}
}
}
public function toUpdateRefused(RefrigeratorInstance $refrigeratorInstance, string $transitionName): void
{
$refrigeratorInstanceStepVersion = null;
$refrigeratorInstanceStepVersions = $this->entityManager->getRepository(RefrigeratorInstanceStepVersion::class)->findLastGoodStepVersion($refrigeratorInstance);
if (\is_array($refrigeratorInstanceStepVersions) && isset($refrigeratorInstanceStepVersions[0])) {
$refrigeratorInstanceStepVersion = $refrigeratorInstanceStepVersions[0];
}
if ($refrigeratorInstanceStepVersion instanceof RefrigeratorInstanceStepVersion) {
$refrigeratorInstance->setRecoveryDate($refrigeratorInstanceStepVersion->getRecoveryDate());
$refrigeratorInstance->setStep('shipped');
$refrigeratorInstance = $this->refrigeratorInstanceService->populateMailDateField($refrigeratorInstance);
$this->entityManager->persist($refrigeratorInstance);
$this->dataLogger->add('Revert recoveryDate : ' . $refrigeratorInstanceStepVersion->getId(), 'refrigeratorInstanceWorkflow', $refrigeratorInstance->getId(), 'info');
}
}
public function onLeave(Event $event): void
{
}
public static function getSubscribedEvents(): array
{
return [
'workflow.refrigerator_instance_step.leave' => 'onLeave',
'workflow.refrigerator_instance_step.transition' => 'onTransition',
'workflow.refrigerator_instance_step.enter' => 'onEnter',
'workflow.refrigerator_instance_step.entered' => 'onEntered',
'workflow.refrigerator_instance_step.completed' => 'onCompleted',
];
}
}