src/EventListener/OpeOrderFurnitureWorkflowListener.php line 397

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\FurnitureOrderMailQueue;
  4. use App\Entity\OperationOrderFurnitureLine;
  5. use App\Entity\OperationOrderStepVersion;
  6. use App\Entity\PolymorphicOperationOrder\OperationOrderFurniture;
  7. use App\Service\Access;
  8. use App\Service\AdvertisingManagement;
  9. use App\Service\EmailService;
  10. use App\Service\FurnitureProductService;
  11. use App\Service\FurnitureStockService;
  12. use App\Service\MailQueueService;
  13. use App\Service\QuotaService;
  14. use App\Service\User as UserService;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Workflow\Event\Event;
  18. use Symfony\Component\Workflow\Registry;
  19. class OpeOrderFurnitureWorkflowListener implements EventSubscriberInterface
  20. {
  21.     private Access $access;
  22.     private AdvertisingManagement $advertisingManagement;
  23.     private EmailService $emailService;
  24.     private EntityManagerInterface $entityManager;
  25.     private FurnitureProductService $furnitureProductService;
  26.     private FurnitureStockService $furnitureStockService;
  27.     private MailQueueService $mailQueueService;
  28.     private QuotaService $quotaService;
  29.     private Registry $workflow;
  30.     private UserService $userService;
  31.     public function __construct(Access $accessAdvertisingManagement $advertisingManagementEmailService $emailServiceEntityManagerInterface $entityManagerFurnitureProductService $furnitureProductServiceFurnitureStockService $furnitureStockServiceMailQueueService $mailQueueServiceQuotaService $quotaServiceRegistry $wokflowUserService $userService)
  32.     {
  33.         $this->access $access;
  34.         $this->advertisingManagement $advertisingManagement;
  35.         $this->emailService $emailService;
  36.         $this->entityManager $entityManager;
  37.         $this->furnitureProductService $furnitureProductService;
  38.         $this->furnitureStockService $furnitureStockService;
  39.         $this->mailQueueService $mailQueueService;
  40.         $this->quotaService $quotaService;
  41.         $this->userService $userService;
  42.         $this->workflow $wokflow;
  43.     }
  44.     public function onEnter(Event $event): void
  45.     {
  46.     }
  47.     public function onTransition(Event $event): void
  48.     {
  49.     }
  50.     public function onEntered(Event $event): void
  51.     {
  52.     }
  53.     public function onCompleted(Event $event): void
  54.     {
  55.         $transitionName $event->getTransition()->getName();
  56.         $user $this->userService->getUser();
  57.         /** @var OperationOrderFurniture $operationOrder */
  58.         $operationOrder $event->getSubject();
  59.         $operationOrder->setUpdatedAt(new \DateTime());
  60.         if (method_exists($this$transitionName)) {
  61.             $this->{$transitionName}($operationOrder$transitionName);
  62.         }
  63.         if (null === $user) {
  64.             $user $operationOrder->getUser();
  65.         }
  66.         $this->entityManager->persist($operationOrder);
  67.         $operationOrderStepVersion = new OperationOrderStepVersion();
  68.         $operationOrderStepVersion->setDate(new \DateTime());
  69.         $operationOrderStepVersion->setStep(strtolower(substr((string) $transitionName2)));
  70.         $operationOrderStepVersion->setUser($user);
  71.         $operationOrderStepVersion->setOperationOrder($operationOrder);
  72.         $this->entityManager->persist($operationOrderStepVersion);
  73.         $this->entityManager->flush();
  74.     }
  75.     public function toCanceled(OperationOrderFurniture $operationOrderstring $transitionName): void
  76.     {
  77.         try {
  78.             $oldPrice $operationOrder->getPrice();
  79.             $operationOrder->setPrice(0.0);
  80.             $updatedQuota $this->quotaService->updateQuota($operationOrder$oldPrice);
  81.             $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  82.             if (!empty($furnitureInstances)) {
  83.                 foreach ($furnitureInstances as $furnitureInstance) {
  84.                     $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  85.                     if ($workflow->can($furnitureInstance'toAbandonned')) {
  86.                         $workflow->apply($furnitureInstance'toAbandonned');
  87.                     }
  88.                 }
  89.             }
  90.         } catch (\Exception) {
  91.             // echo 'Exception reçue : ',  $e->getMessage(), "\n";
  92.         }
  93.     }
  94.     public function toQteKo(OperationOrderFurniture $operationOrderstring $transitionName): void
  95.     {
  96.         try {
  97.             $oldPrice $operationOrder->getPrice();
  98.             $operationOrder->setPrice(0.0);
  99.             $updatedQuota $this->quotaService->updateQuota($operationOrder$oldPrice);
  100.             $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  101.             $this->sendMailQteKo($operationOrder$furnitureInstances);
  102.             if (!empty($furnitureInstances)) {
  103.                 foreach ($furnitureInstances as $furnitureInstance) {
  104.                     $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  105.                     if ($workflow->can($furnitureInstance'toAbandonnedToTransmit')) {
  106.                         $workflow->apply($furnitureInstance'toAbandonnedToTransmit');
  107.                     } elseif ($workflow->can($furnitureInstance'toAbandonnedNoTransmited')) {
  108.                         $workflow->apply($furnitureInstance'toAbandonnedNoTransmited');
  109.                     } elseif ($workflow->can($furnitureInstance'toAbandonned')) {
  110.                         $workflow->apply($furnitureInstance'toAbandonned');
  111.                     }
  112.                 }
  113.             }
  114.         } catch (\Exception) {
  115.             // echo 'Exception reçue : ',  $e->getMessage(), "\n";
  116.         }
  117.     }
  118.     public function toAbandonnedNoTransmited(OperationOrderFurniture $operationOrderstring $transitionName): void
  119.     {
  120.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  121.         if ($workflow->can($operationOrder'toAbandonned')) {
  122.             $workflow->apply($operationOrder'toAbandonned');
  123.         }
  124.     }
  125.     public function toAbandonnedToTransmit(OperationOrderFurniture $operationOrderstring $transitionName): void
  126.     {
  127.         $this->mailQueueService->addMailQueueEntryType1($operationOrder'AGENCY_NOTIF');
  128.         // todo to remove when api enabled
  129.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  130.         if ($workflow->can($operationOrder'toAbandonned')) {
  131.             $workflow->apply($operationOrder'toAbandonned');
  132.         }
  133.     }
  134.     public function toAbandonnedTransmited(OperationOrderFurniture $operationOrderstring $transitionName): void
  135.     {
  136.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  137.         if ($workflow->can($operationOrder'toAbandonned')) {
  138.             $workflow->apply($operationOrder'toAbandonned');
  139.         }
  140.     }
  141.     public function toAbandonned(OperationOrderFurniture $operationOrderstring $transitionName): void
  142.     {
  143.         try {
  144.             $oldPrice $operationOrder->getPrice();
  145.             $operationOrder->setPrice(0.0);
  146.             $updatedQuota $this->quotaService->updateQuota($operationOrder$oldPrice);
  147.             $orderMails $this->entityManager->getRepository(FurnitureOrderMailQueue::class)->findBy([
  148.                 'operationOrderFurniture' => $operationOrder,
  149.                 'type'                    => FurnitureOrderMailQueue::TYPE_AGENCY_NOTIF,
  150.                 'step'                    => 'toTransmit',
  151.             ]);
  152.             if (!empty($orderMails)) {
  153.                 foreach ($orderMails as $orderMail) {
  154.                     if ($orderMail instanceof FurnitureOrderMailQueue) {
  155.                         $this->entityManager->remove($orderMail);
  156.                     }
  157.                 }
  158.             }
  159.             $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  160.             if (!empty($furnitureInstances)) {
  161.                 foreach ($furnitureInstances as $furnitureInstance) {
  162.                     $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  163.                     if ($workflow->can($furnitureInstance'toAbandonned')) {
  164.                         $workflow->apply($furnitureInstance'toAbandonned');
  165.                     }
  166.                 }
  167.             }
  168.         } catch (\Exception) {
  169.             // echo 'Exception reçue : ',  $e->getMessage(), "\n";
  170.         }
  171.     }
  172.     public function toShipped(OperationOrderFurniture $operationOrderstring $transitionName): void
  173.     {
  174.         $opeOrderLines $operationOrder->getOpeOrderFurnitureLines()->toArray();
  175.         if (!empty($opeOrderLines)) {
  176.             foreach ($opeOrderLines as $opeOrderLine) {
  177.                 if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
  178.                     $instances $opeOrderLine->getFurnitureInstances()->toArray();
  179.                     if (!empty($instances)) {
  180.                         foreach ($instances as $instance) {
  181.                             $workflow $this->workflow->get($instance'furniture_instance_step');
  182.                             if ($instance->getStep() !== 'shipped' && $workflow->can($instance$transitionName)) {
  183.                                 $workflow->apply($instance$transitionName);
  184.                             }
  185.                         }
  186.                     }
  187.                 }
  188.             }
  189.         }
  190.     }
  191.     public function toDelivered(OperationOrderFurniture $operationOrderstring $transitionName): void
  192.     {
  193.         $opeOrderLines $operationOrder->getOpeOrderFurnitureLines()->toArray();
  194.         if (!empty($opeOrderLines)) {
  195.             foreach ($opeOrderLines as $opeOrderLine) {
  196.                 if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
  197.                     $instances $opeOrderLine->getFurnitureInstances()->toArray();
  198.                     if (!empty($instances)) {
  199.                         foreach ($instances as $instance) {
  200.                             $workflow $this->workflow->get($instance'furniture_instance_step');
  201.                             if ($instance->getStep() !== 'delivered' && $workflow->can($instance$transitionName)) {
  202.                                 $workflow->apply($instance$transitionName);
  203.                             }
  204.                         }
  205.                     }
  206.                 }
  207.             }
  208.         }
  209.     }
  210.     public function toFinishedClosed(OperationOrderFurniture $operationOrderstring $transitionName): void
  211.     {
  212.         $opeOrderLines $operationOrder->getOpeOrderFurnitureLines()->toArray();
  213.         if (!empty($opeOrderLines)) {
  214.             foreach ($opeOrderLines as $opeOrderLine) {
  215.                 if ($opeOrderLine instanceof OperationOrderFurnitureLine) {
  216.                     $instances $opeOrderLine->getFurnitureInstances()->toArray();
  217.                     if (!empty($instances)) {
  218.                         foreach ($instances as $instance) {
  219.                             $workflow $this->workflow->get($instance'furniture_instance_step');
  220.                             if ($instance->getStep() !== 'recovered' && $workflow->can($instance$transitionName)) {
  221.                                 $workflow->apply($instance'toRecovered');
  222.                             }
  223.                         }
  224.                     }
  225.                 }
  226.             }
  227.         }
  228.     }
  229.     public function toToTransmit(OperationOrderFurniture $operationOrderstring $transitionName): void
  230.     {
  231.         $this->mailQueueService->addMailQueueEntryType1($operationOrder'AGENCY_NOTIF');
  232.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  233.         if (!empty($furnitureInstances)) {
  234.             foreach ($furnitureInstances as $furnitureInstance) {
  235.                 $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  236.                 if ($workflow->can($furnitureInstance'toAwaitingDelivery')) {
  237.                     $workflow->apply($furnitureInstance'toAwaitingDelivery');
  238.                 }
  239.             }
  240.         }
  241.     }
  242.     public function toToModerate(OperationOrderFurniture $operationOrderstring $transitionName): void
  243.     {
  244.         $this->mailQueueService->addMailQueueEntryType1($operationOrder'MODERATION_NOTIF');
  245.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  246.         if (!empty($furnitureInstances)) {
  247.             foreach ($furnitureInstances as $furnitureInstance) {
  248.                 $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  249.                 if ($workflow->can($furnitureInstance'toAwaitingDelivery')) {
  250.                     $workflow->apply($furnitureInstance'toAwaitingDelivery');
  251.                 }
  252.             }
  253.         }
  254.     }
  255.     public function toUpdateToModerate(OperationOrderFurniture $operationOrderstring $transitionName): void
  256.     {
  257.         $this->mailQueueService->addMailQueueEntryType1($operationOrder'MODERATION_NOTIF');
  258.         $this->furnitureStockService->removeStocksOrderToCalendar($operationOrder);
  259.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  260.         if (!empty($furnitureInstances)) {
  261.             foreach ($furnitureInstances as $furnitureInstance) {
  262.                 $workflow $this->workflow->get($furnitureInstance'furniture_instance_step');
  263.                 if ($workflow->can($furnitureInstance'toAwaitingDelivery')) {
  264.                     $workflow->apply($furnitureInstance'toAwaitingDelivery');
  265.                 }
  266.             }
  267.         }
  268.     }
  269.     public function toModeratevalided(OperationOrderFurniture $operationOrderstring $transitionName): void
  270.     {
  271.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  272.         $this->sendUserMailModeration($operationOrder$furnitureInstancestrue);
  273.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  274.         if ($workflow->can($operationOrder'toToTransmit')) {
  275.             $workflow->apply($operationOrder'toToTransmit');
  276.         }
  277.     }
  278.     public function toUpdateModerateValided(OperationOrderFurniture $operationOrderstring $transitionName): void
  279.     {
  280.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  281.         $this->sendUserMailModeration($operationOrder$furnitureInstancestrue);
  282.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  283.         $opeOrderStepVersion $this->entityManager->getRepository(OperationOrderStepVersion::class)->findBy([
  284.             'operationOrder' => $operationOrder,
  285.             'step'           => 'requestSend'
  286.         ]);
  287.         if (!empty($opeOrderStepVersion) && $workflow->can($operationOrder'toUpdateToTransmit')) {
  288.             $workflow->apply($operationOrder'toUpdateToTransmit');
  289.         } elseif (empty($opeOrderStepVersion) && $workflow->can($operationOrder'toToTransmit')) {
  290.             $workflow->apply($operationOrder'toToTransmit');
  291.         }
  292.     }
  293.     public function toModerateRefused(OperationOrderFurniture $operationOrderstring $transitionName): void
  294.     {
  295.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  296.         $this->sendUserMailModeration($operationOrder$furnitureInstancesfalse);
  297.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  298.         if ($workflow->can($operationOrder'toAbandonnedNoTransmited')) {
  299.             $workflow->apply($operationOrder'toAbandonnedNoTransmited');
  300.         }
  301.     }
  302.     public function toUpdateModerateRefused(OperationOrderFurniture $operationOrderstring $transitionName): void
  303.     {
  304.         $furnitureInstances $this->furnitureProductService->getOrderFurnitureInstances($operationOrder);
  305.         $this->sendUserMailModeration($operationOrder$furnitureInstancesfalse);
  306.         $workflow $this->workflow->get($operationOrder'order_furniture_step');
  307.         $opeOrderStepVersion $this->entityManager->getRepository(OperationOrderStepVersion::class)->findBy([
  308.             'operationOrder' => $operationOrder,
  309.             'step'           => 'requestSend'
  310.         ]);
  311.         if (!empty($opeOrderStepVersion) && $workflow->can($operationOrder'toAbandonnedToTransmit')) {
  312.             $workflow->apply($operationOrder'toAbandonnedToTransmit');
  313.         } elseif (empty($opeOrderStepVersion) && $workflow->can($operationOrder'toAbandonnedNoTransmited')) {
  314.             $workflow->apply($operationOrder'toAbandonnedNoTransmited');
  315.         }
  316.     }
  317.     public function toUpdateToTransmit(OperationOrderFurniture $operationOrderstring $transitionName): void
  318.     {
  319.         $this->mailQueueService->addMailQueueEntryType1($operationOrder'AGENCY_NOTIF');
  320.     }
  321.     public function sendMailQteKo(OperationOrderFurniture $operationOrder, array $furnitureInstances): void
  322.     {
  323.         $user $operationOrder->getUser();
  324.         if ($user->getEmail() !== null) {
  325.             $advertiser $operationOrder->getOperation()->getAdvertiser();
  326.             $subdomain $advertiser->getSubdomain();
  327.             $defaultSubdomain $this->advertisingManagement->getDefaultSubdomain();
  328.             $defaultBaseUrl $this->advertisingManagement->getAbsoluteUrl($defaultSubdomain);
  329.             $baseUrl $this->advertisingManagement->getAbsoluteUrl($subdomain);
  330.             $opeOrderShowLink $baseUrl '/operation-order/' $operationOrder->getId();
  331.             $mailBody $this->access->render('emails/userOrderQteKo.html.twig', [
  332.                 'defaultBaseUrl'             => $defaultBaseUrl,
  333.                 'operationOrder'             => $operationOrder,
  334.                 'user'                       => $user,
  335.                 'furnitureInstances'         => $furnitureInstances,
  336.                 'opeOrderShowLink'           => $opeOrderShowLink,
  337.             ], 200$advertiser);
  338.             $this->emailService->send('Staci - Commande annulée''no-reply@staci-animations.com'$user->getEmail(), $mailBody, []);
  339.         }
  340.     }
  341.     public function sendUserMailModeration(OperationOrderFurniture $operationOrder, array $furnitureInstancesbool $isOk): void
  342.     {
  343.         $user $operationOrder->getUser();
  344.         if ($user->getEmail() !== null) {
  345.             $advertiser $operationOrder->getOperation()->getAdvertiser();
  346.             $subdomain $advertiser->getSubdomain();
  347.             $defaultSubdomain $this->advertisingManagement->getDefaultSubdomain();
  348.             $defaultBaseUrl $this->advertisingManagement->getAbsoluteUrl($defaultSubdomain);
  349.             $baseUrl $this->advertisingManagement->getAbsoluteUrl($subdomain);
  350.             $opeOrderShowLink $baseUrl '/operation-order/' $operationOrder->getId();
  351.             $mailBody $this->access->render('emails/userOrderModeration.html.twig', [
  352.                 'defaultBaseUrl'             => $defaultBaseUrl,
  353.                 'operationOrder'             => $operationOrder,
  354.                 'user'                       => $user,
  355.                 'furnitureInstances'         => $furnitureInstances,
  356.                 'opeOrderShowLink'           => $opeOrderShowLink,
  357.                 'isOk'                       => $isOk,
  358.             ], 200$advertiser);
  359.             $this->emailService->send('Staci - Commande modéré''no-reply@staci-animations.com'$user->getEmail(), $mailBody, []);
  360.         }
  361.     }
  362.     public function onLeave(Event $event): void
  363.     {
  364.     }
  365.     public static function getSubscribedEvents(): array
  366.     {
  367.         return [
  368.             'workflow.order_furniture_step.leave'     => 'onLeave',
  369.             'workflow.order_furniture_step.enter'     => 'onEnter',
  370.             'workflow.order_furniture_step.completed' => 'onCompleted',
  371.             'workflow.order_furniture_step.entered'   => 'onEntered',
  372.         ];
  373.     }
  374. }