src/EventListener/RefrigeratorInstanceWorkflowListener.php line 150

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\OperationOrder;
  4. use App\Entity\RefrigeratorInstance;
  5. use App\Entity\RefrigeratorInstanceStepVersion;
  6. use App\Service\DataLogger;
  7. use App\Service\MailQueueService;
  8. use App\Service\RefrigeratorBinProductService;
  9. use App\Service\RefrigeratorInstanceService;
  10. use App\Service\User as UserService;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Workflow\Event\Event;
  14. use Symfony\Component\Workflow\Registry;
  15. class RefrigeratorInstanceWorkflowListener implements EventSubscriberInterface
  16. {
  17.     private DataLogger $dataLogger;
  18.     private EntityManagerInterface $entityManager;
  19.     private MailQueueService $mailQueueService;
  20.     private RefrigeratorBinProductService $refrigeratorBinProductService;
  21.     private RefrigeratorInstanceService $refrigeratorInstanceService;
  22.     private UserService $userService;
  23.     private Registry $workflow;
  24.     public function __construct(EntityManagerInterface $entityManagerRefrigeratorBinProductService $refrigeratorBinProductServiceRefrigeratorInstanceService $refrigeratorInstanceServiceUserService $userServiceDataLogger $dataLoggerRegistry $wokflowMailQueueService $mailQueueService)
  25.     {
  26.         $this->entityManager $entityManager;
  27.         $this->mailQueueService $mailQueueService;
  28.         $this->refrigeratorBinProductService $refrigeratorBinProductService;
  29.         $this->refrigeratorInstanceService $refrigeratorInstanceService;
  30.         $this->dataLogger $dataLogger;
  31.         $this->userService $userService;
  32.         $this->workflow $wokflow;
  33.     }
  34.     public function onEnter(Event $event): void
  35.     {
  36.     }
  37.     public function onTransition(Event $event): void
  38.     {
  39.     }
  40.     public function onEntered(Event $event): void
  41.     {
  42.     }
  43.     public function onCompleted(Event $event): void
  44.     {
  45.         $transitionName $event->getTransition()->getName();
  46.         $user $this->userService->getUser();
  47.         /** @var RefrigeratorInstance $refrigeratorInstance */
  48.         $refrigeratorInstance $event->getSubject();
  49.         if (method_exists($this$transitionName)) {
  50.             $this->{$transitionName}($refrigeratorInstance$transitionName);
  51.         }
  52.         $refrigeratorInstanceStepVersion = new RefrigeratorInstanceStepVersion();
  53.         $refrigeratorInstanceStepVersion->setDate(new \DateTime());
  54.         $refrigeratorInstanceStepVersion->setStep(strtolower(substr((string) $transitionName2)));
  55.         $refrigeratorInstanceStepVersion->setUser($user);
  56.         $refrigeratorInstanceStepVersion->setRefrigeratorInstance($refrigeratorInstance);
  57.         $refrigeratorInstanceStepVersion->setRecoveryDate($refrigeratorInstance->getRecoveryDate());
  58.         $this->entityManager->persist($refrigeratorInstanceStepVersion);
  59.     }
  60.     public function toShipped(RefrigeratorInstance $refrigeratorInstancestring $transitionName): void
  61.     {
  62.         $operationOrder $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
  63.         $this->mailQueueService->addMailQueueEntryType2($operationOrder$refrigeratorInstance'shipped');
  64.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'shipped') {
  65.             $toChangeOrderStep true;
  66.             $refrigeratorInstances $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
  67.             if (!empty($refrigeratorInstances)) {
  68.                 foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
  69.                     if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'shipped') {
  70.                         $toChangeOrderStep false;
  71.                     }
  72.                 }
  73.                 $workflow $this->workflow->get($operationOrder'order_refrigeratorbin_step');
  74.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder$transitionName)) {
  75.                     $workflow->apply($operationOrder$transitionName);
  76.                 }
  77.             }
  78.         }
  79.     }
  80.     public function toDelivered(RefrigeratorInstance $refrigeratorInstancestring $transitionName): void
  81.     {
  82.         $operationOrder $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
  83.         $this->mailQueueService->addMailQueueEntryType2($operationOrder$refrigeratorInstance'delivered');
  84.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'delivered') {
  85.             $toChangeOrderStep true;
  86.             $refrigeratorInstances $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
  87.             if (!empty($refrigeratorInstances)) {
  88.                 foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
  89.                     if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'delivered') {
  90.                         $toChangeOrderStep false;
  91.                     }
  92.                 }
  93.                 $workflow $this->workflow->get($operationOrder'order_refrigeratorbin_step');
  94.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder$transitionName)) {
  95.                     $workflow->apply($operationOrder$transitionName);
  96.                 }
  97.             }
  98.         }
  99.     }
  100.     public function toRecovered(RefrigeratorInstance $refrigeratorInstancestring $transitionName): void
  101.     {
  102.         $operationOrder $this->refrigeratorInstanceService->getOperationOrder($refrigeratorInstance);
  103.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'finishedClosed') {
  104.             $toChangeOrderStep true;
  105.             $refrigeratorInstances $this->refrigeratorBinProductService->getOrderRefrigeratorInstances($operationOrder);
  106.             if (!empty($refrigeratorInstances)) {
  107.                 foreach ($refrigeratorInstances as $refrigeratorInstanceItem) {
  108.                     if ($refrigeratorInstanceItem instanceof RefrigeratorInstance && $refrigeratorInstanceItem->getStep() !== 'recovered') {
  109.                         $toChangeOrderStep false;
  110.                     }
  111.                 }
  112.                 $workflow $this->workflow->get($operationOrder'order_refrigeratorbin_step');
  113.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder'toFinishedClosed')) {
  114.                     $workflow->apply($operationOrder'toFinishedClosed');
  115.                 }
  116.             }
  117.         }
  118.     }
  119.     public function toUpdateRefused(RefrigeratorInstance $refrigeratorInstancestring $transitionName): void
  120.     {
  121.         $refrigeratorInstanceStepVersion null;
  122.         $refrigeratorInstanceStepVersions $this->entityManager->getRepository(RefrigeratorInstanceStepVersion::class)->findLastGoodStepVersion($refrigeratorInstance);
  123.         if (\is_array($refrigeratorInstanceStepVersions) && isset($refrigeratorInstanceStepVersions[0])) {
  124.             $refrigeratorInstanceStepVersion $refrigeratorInstanceStepVersions[0];
  125.         }
  126.         if ($refrigeratorInstanceStepVersion instanceof RefrigeratorInstanceStepVersion) {
  127.             $refrigeratorInstance->setRecoveryDate($refrigeratorInstanceStepVersion->getRecoveryDate());
  128.             $refrigeratorInstance->setStep('shipped');
  129.             $refrigeratorInstance $this->refrigeratorInstanceService->populateMailDateField($refrigeratorInstance);
  130.             $this->entityManager->persist($refrigeratorInstance);
  131.             $this->dataLogger->add('Revert recoveryDate : ' $refrigeratorInstanceStepVersion->getId(), 'refrigeratorInstanceWorkflow'$refrigeratorInstance->getId(), 'info');
  132.         }
  133.     }
  134.     public function onLeave(Event $event): void
  135.     {
  136.     }
  137.     public static function getSubscribedEvents(): array
  138.     {
  139.         return [
  140.             'workflow.refrigerator_instance_step.leave'         => 'onLeave',
  141.             'workflow.refrigerator_instance_step.transition'    => 'onTransition',
  142.             'workflow.refrigerator_instance_step.enter'         => 'onEnter',
  143.             'workflow.refrigerator_instance_step.entered'       => 'onEntered',
  144.             'workflow.refrigerator_instance_step.completed'     => 'onCompleted',
  145.         ];
  146.     }
  147. }