src/EventListener/FurnitureInstanceWorkflowListener.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\FurnitureInstance;
  4. use App\Entity\FurnitureInstanceStepVersion;
  5. use App\Entity\FurnitureStock;
  6. use App\Entity\FurnitureStockDateStep;
  7. use App\Entity\OperationOrder;
  8. use App\Service\DataLogger;
  9. use App\Service\FurnitureInstanceService;
  10. use App\Service\FurnitureProductService;
  11. use App\Service\FurnitureStockService;
  12. use App\Service\MailQueueService;
  13. use App\Service\User as UserService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Workflow\Event\Event;
  17. use Symfony\Component\Workflow\Registry;
  18. class FurnitureInstanceWorkflowListener implements EventSubscriberInterface
  19. {
  20.     private DataLogger $dataLogger;
  21.     private EntityManagerInterface $entityManager;
  22.     private MailQueueService $mailQueueService;
  23.     private FurnitureProductService $furnitureProductService;
  24.     private FurnitureStockService $furnitureStockService;
  25.     private FurnitureInstanceService $furnitureInstanceService;
  26.     private UserService $userService;
  27.     private Registry $workflow;
  28.     public function __construct(EntityManagerInterface $entityManagerFurnitureProductService $furnitureProductServiceFurnitureStockService $furnitureStockServiceFurnitureInstanceService $furnitureInstanceServiceUserService $userServiceDataLogger $dataLoggerRegistry $wokflowMailQueueService $mailQueueService)
  29.     {
  30.         $this->entityManager $entityManager;
  31.         $this->mailQueueService $mailQueueService;
  32.         $this->furnitureProductService $furnitureProductService;
  33.         $this->furnitureStockService $furnitureStockService;
  34.         $this->furnitureInstanceService $furnitureInstanceService;
  35.         $this->dataLogger $dataLogger;
  36.         $this->userService $userService;
  37.         $this->workflow $wokflow;
  38.     }
  39.     public function onEnter(Event $event): void
  40.     {
  41.     }
  42.     public function onTransition(Event $event): void
  43.     {
  44.     }
  45.     public function onEntered(Event $event): void
  46.     {
  47.     }
  48.     public function onCompleted(Event $event): void
  49.     {
  50.         $transitionName $event->getTransition()->getName();
  51.         $user $this->userService->getUser();
  52.         /** @var FurnitureInstance $furnitureInstance */
  53.         $furnitureInstance $event->getSubject();
  54.         if (method_exists($this$transitionName)) {
  55.             $this->{$transitionName}($furnitureInstance$transitionName);
  56.         }
  57.         $furnitureInstanceStepVersion = new FurnitureInstanceStepVersion();
  58.         $furnitureInstanceStepVersion->setDate(new \DateTime());
  59.         $furnitureInstanceStepVersion->setStep(strtolower(substr((string) $transitionName2)));
  60.         $furnitureInstanceStepVersion->setUser($user);
  61.         $furnitureInstanceStepVersion->setFurnitureInstance($furnitureInstance);
  62.         $furnitureInstanceStepVersion->setRecoveryDate($furnitureInstance->getRecoveryDate());
  63.         $this->entityManager->persist($furnitureInstanceStepVersion);
  64.     }
  65.     public function toShipped(FurnitureInstance $furnitureInstancestring $transitionName): void
  66.     {
  67.         $operationOrder $this->furnitureInstanceService->getOperationOrder($furnitureInstance);
  68.         $this->mailQueueService->addMailQueueEntryType2($operationOrder$furnitureInstance'shipped');
  69.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'shipped') {
  70.             $toChangeOrderStep true;
  71.             $instances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  72.             if (!empty($instances)) {
  73.                 foreach ($instances as $instanceItem) {
  74.                     if ($instanceItem instanceof FurnitureInstance && $instanceItem->getStep() !== 'shipped') {
  75.                         $toChangeOrderStep false;
  76.                     }
  77.                 }
  78.                 $workflow $this->workflow->get($operationOrder'order_furniture_step');
  79.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder$transitionName)) {
  80.                     $workflow->apply($operationOrder$transitionName);
  81.                 }
  82.             }
  83.         }
  84.         $furnitureStock $furnitureInstance->getFurnitureStock();
  85.         $workflow $this->workflow->get($furnitureStock'furniture_stock_step');
  86.         if ($workflow->can($furnitureStock'toInProgress1')) {
  87.             $workflow->apply($furnitureStock'toInProgress1');
  88.         }
  89.     }
  90.     public function toDelivered(FurnitureInstance $furnitureInstancestring $transitionName): void
  91.     {
  92.         $operationOrder $this->furnitureInstanceService->getOperationOrder($furnitureInstance);
  93.         $this->mailQueueService->addMailQueueEntryType2($operationOrder$furnitureInstance'delivered');
  94.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'delivered') {
  95.             $toChangeOrderStep true;
  96.             $instances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  97.             if (!empty($instances)) {
  98.                 foreach ($instances as $instanceItem) {
  99.                     if ($instanceItem instanceof FurnitureInstance && $instanceItem->getStep() !== 'delivered') {
  100.                         $toChangeOrderStep false;
  101.                     }
  102.                 }
  103.                 $workflow $this->workflow->get($operationOrder'order_furniture_step');
  104.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder$transitionName)) {
  105.                     $workflow->apply($operationOrder$transitionName);
  106.                 }
  107.             }
  108.         }
  109.         $furnitureStock $furnitureInstance->getFurnitureStock();
  110.         $workflow $this->workflow->get($furnitureStock'furniture_stock_step');
  111.         if ($workflow->can($furnitureStock'toInProgress1')) {
  112.             $workflow->apply($furnitureStock'toInProgress1');
  113.         }
  114.     }
  115.     public function toRecovered(FurnitureInstance $furnitureInstancestring $transitionName): void
  116.     {
  117.         $operationOrder $this->furnitureInstanceService->getOperationOrder($furnitureInstance);
  118.         if ($operationOrder instanceof OperationOrder && $operationOrder->getStep() !== 'finishedClosed') {
  119.             $toChangeOrderStep true;
  120.             $instances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  121.             if (!empty($instances)) {
  122.                 foreach ($instances as $instanceItem) {
  123.                     if ($instanceItem instanceof FurnitureInstance && $instanceItem->getStep() !== 'recovered') {
  124.                         $toChangeOrderStep false;
  125.                     }
  126.                 }
  127.                 $workflow $this->workflow->get($operationOrder'order_furniture_step');
  128.                 if ($toChangeOrderStep === true && $workflow->can($operationOrder'toFinishedClosed')) {
  129.                     $workflow->apply($operationOrder'toFinishedClosed');
  130.                 }
  131.             }
  132.         }
  133.         $furnitureStock $furnitureInstance->getFurnitureStock();
  134.         $workflow $this->workflow->get($furnitureStock'furniture_stock_step');
  135.         if ($workflow->can($furnitureStock'toFree')) {
  136.             $workflow->apply($furnitureStock'toFree');
  137.         }
  138.     }
  139.     public function toUpdateRefused(FurnitureInstance $furnitureInstancestring $transitionName): void
  140.     {
  141.         $instanceStepVersion null;
  142.         $instanceStepVersions $this->entityManager->getRepository(FurnitureInstanceStepVersion::class)->findLastGoodStepVersion($furnitureInstance);
  143.         if (isset($instanceStepVersions[0])) {
  144.             $instanceStepVersion $instanceStepVersions[0];
  145.         }
  146.         if ($instanceStepVersion instanceof FurnitureInstanceStepVersion) {
  147.             $furnitureInstance->setRecoveryDate($instanceStepVersion->getRecoveryDate());
  148.             $furnitureInstance->setStep('shipped');
  149.             $furnitureInstance $this->furnitureInstanceService->populateMailDateField($furnitureInstance);
  150.             $this->recalculateStockCalendar($furnitureInstance);
  151.             $this->entityManager->persist($furnitureInstance);
  152.             $this->dataLogger->add('Revert recoveryDate : ' $instanceStepVersion->getId(), 'furnitureInstanceWorkflow'$furnitureInstance->getId(), 'info');
  153.         }
  154.     }
  155.     public function toAwaitingDelivery(FurnitureInstance $furnitureInstancestring $transitionName): void
  156.     {
  157.         $furnitureStock $furnitureInstance->getFurnitureStock();
  158.         $this->recalculateStockCalendar($furnitureInstance);
  159.         $workflow $this->workflow->get($furnitureStock'furniture_stock_step');
  160.         if ($workflow->can($furnitureStock'toReserved')) {
  161.             $workflow->apply($furnitureStock'toReserved');
  162.         }
  163.     }
  164.     public function toAbandonned(FurnitureInstance $furnitureInstancestring $transitionName): void
  165.     {
  166.         $furnitureStock $furnitureInstance->getFurnitureStock();
  167.         $operationOrder $furnitureInstance->getOperationOrderFurnitureLine()->getOperationOrderFurniture();
  168.         $furnitureStockDateSteps $this->entityManager->getRepository(FurnitureStockDateStep::class)->findBy([
  169.             'furnitureStock' => $furnitureStock,
  170.             'operationOrder' => $operationOrder,
  171.         ]);
  172.         if (!empty($furnitureStockDateSteps)) {
  173.             foreach ($furnitureStockDateSteps as $furnitureStockDateStep) {
  174.                 $furnitureStock->removeFurnitureStockDateStep($furnitureStockDateStep);
  175.             }
  176.         }
  177.         /*
  178.         $workflow = $this->workflow->get($furnitureStock, 'furniture_stock_step');
  179.         if ($workflow->can($furnitureStock, 'toFree')) {
  180.             $workflow->apply($furnitureStock, 'toFree');
  181.         }
  182.         */
  183.     }
  184.     public function toExtendToTransmit(FurnitureInstance $furnitureInstancestring $transitionName): void
  185.     {
  186.         $this->recalculateStockCalendar($furnitureInstance);
  187.     }
  188.     public function toRecoveryToTransmit(FurnitureInstance $furnitureInstancestring $transitionName): void
  189.     {
  190.         $this->recalculateStockCalendar($furnitureInstance);
  191.     }
  192.     public function onLeave(Event $event): void
  193.     {
  194.     }
  195.     public static function getSubscribedEvents(): array
  196.     {
  197.         return [
  198.             'workflow.furniture_instance_step.leave'         => 'onLeave',
  199.             'workflow.furniture_instance_step.transition'    => 'onTransition',
  200.             'workflow.furniture_instance_step.enter'         => 'onEnter',
  201.             'workflow.furniture_instance_step.entered'       => 'onEntered',
  202.             'workflow.furniture_instance_step.completed'     => 'onCompleted',
  203.         ];
  204.     }
  205.     private function recalculateStockCalendar(FurnitureInstance $furnitureInstance): void
  206.     {
  207.         $furnitureStock $furnitureInstance->getFurnitureStock();
  208.         if ($furnitureStock instanceof FurnitureStock) {
  209.             $operationOrder $furnitureInstance->getOperationOrderFurnitureLine()->getOperationOrderFurniture();
  210.             $this->furnitureStockService->removeStockOrderToCalendar($furnitureInstance->getFurnitureStock(), $operationOrder);
  211.             $this->furnitureStockService->addStockToCalendar($furnitureStock$furnitureInstance->getDeliveryDate(), $furnitureInstance->getRecoveryDate(), $operationOrder);
  212.         }
  213.     }
  214. }