custom/plugins/fgitsAutoinvoiceSW6/src/Subscriber/OrderSubscriber.php line 101

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Fgits\AutoInvoice\Subscriber;
  3. use Fgits\AutoInvoice\ScheduledTask\Export\AutoInvoiceExportTask;
  4. use Fgits\AutoInvoice\ScheduledTask\OrderScan\AutoInvoiceOrderScanTask;
  5. use Fgits\AutoInvoice\Service\FgitsLibrary\ScheduledTask;
  6. use Fgits\AutoInvoice\Service\FgitsLibrary\Utility;
  7. use Fgits\AutoInvoice\Service\OrderProcessor;
  8. use Psr\Log\LoggerInterface;
  9. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  10. use Shopware\Core\Checkout\Cart\Exception\OrderTransactionNotFoundException;
  11. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  12. use Shopware\Core\Checkout\Order\OrderEntity;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  16. use Shopware\Core\System\SystemConfig\SystemConfigService;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. /**
  19.  * Copyright (c) 2020. GOLLE IT.
  20.  *
  21.  * @author Andrey Grigorkin <andrey@golle-it.de>
  22.  */
  23. class OrderSubscriber implements EventSubscriberInterface
  24. {
  25.     /**
  26.      * @var ScheduledTask $scheduledTask
  27.      */
  28.     private $scheduledTask;
  29.     /**
  30.      * @var OrderProcessor $orderProcessor
  31.      */
  32.     private $orderProcessor;
  33.     /**
  34.      * @var EntityRepositoryInterface $orderRepository
  35.      */
  36.     private $orderRepository;
  37.     /**
  38.      * @var EntityRepositoryInterface $orderTransactionRepository
  39.      */
  40.     private $orderTransactionRepository;
  41.     /**
  42.      * @var Utility $utility
  43.      */
  44.     private $utility;
  45.     /**
  46.      * @var SystemConfigService $systemConfigService
  47.      */
  48.     private $systemConfigService;
  49.     /**
  50.      * @var LoggerInterface $logger
  51.      */
  52.     private $logger;
  53.     /**
  54.      * OrderSubscriber constructor.
  55.      *
  56.      * @param ScheduledTask $scheduledTask
  57.      * @param OrderProcessor $orderProcessor
  58.      * @param EntityRepositoryInterface $orderRepository
  59.      * @param EntityRepositoryInterface $orderTransactionRepository
  60.      * @param Utility $utility
  61.      * @param SystemConfigService $systemConfigService
  62.      * @param LoggerInterface $logger
  63.      */
  64.     public function __construct(
  65.         ScheduledTask $scheduledTask,
  66.         OrderProcessor $orderProcessor,
  67.         EntityRepositoryInterface $orderRepository,
  68.         EntityRepositoryInterface $orderTransactionRepository,
  69.         Utility $utility,
  70.         SystemConfigService $systemConfigService,
  71.         LoggerInterface $logger
  72.     ) {
  73.         $this->scheduledTask              $scheduledTask;
  74.         $this->orderProcessor             $orderProcessor;
  75.         $this->orderRepository            $orderRepository;
  76.         $this->orderTransactionRepository $orderTransactionRepository;
  77.         $this->utility                    $utility;
  78.         $this->systemConfigService        $systemConfigService;
  79.         $this->logger                     $logger;
  80.     }
  81.     public static function getSubscribedEvents(): array
  82.     {
  83.         return[
  84.             CheckoutOrderPlacedEvent::class => [['scheduleScheduledTasks'], ['onOrderPlaced']],
  85.             'state_machine.order_transaction.state_changed' => 'onOrderTransactionStateChanged',
  86.             'state_machine.order.state_changed' => [['onOrderStateChanged'], ['onOrderStateChangedTickets']]
  87.         ];
  88.     }
  89.     public function scheduleScheduledTasks()
  90.     {
  91.         $this->scheduledTask->schedule(AutoInvoiceExportTask::getTaskName());
  92.         $this->scheduledTask->schedule(AutoInvoiceOrderScanTask::getTaskName());
  93.     }
  94.     /**
  95.      * Gets invoked when an order is created.
  96.      *
  97.      * @param CheckoutOrderPlacedEvent $event
  98.      *
  99.      * @throws \Exception
  100.      */
  101.     public function onOrderPlaced(CheckoutOrderPlacedEvent $event)
  102.     {
  103.         $config $this->systemConfigService->get('fgitsAutoinvoiceSW6.config'$event->getSalesChannelId());
  104.         if (!$config['active']) {
  105.             return;
  106.         }
  107.         $order $event->getOrder();
  108.         if ($order instanceof OrderEntity) {
  109.             $this->orderProcessor->processOrder($order$event->getContext(), true);
  110.         } else {
  111.             $this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.'$event->getName()));
  112.         }
  113.     }
  114.     /**
  115.      * Gets invoked when the payment status is changed.
  116.      *
  117.      * @param StateMachineStateChangeEvent $event
  118.      *
  119.      * @throws \Exception
  120.      */
  121.     public function onOrderTransactionStateChanged(StateMachineStateChangeEvent $event)
  122.     {
  123.         $config $this->systemConfigService->get('fgitsAutoinvoiceSW6.config'$event->getSalesChannelId());
  124.         if (!$config['active']) {
  125.             return;
  126.         }
  127.         $orderTransactionId $event->getTransition()->getEntityId();
  128.         /** @var OrderTransactionEntity|null $orderTransaction */
  129.         $orderTransaction $this->orderTransactionRepository->search(
  130.             new Criteria([$orderTransactionId]),
  131.             $event->getContext()
  132.         )->first();
  133.         if ($orderTransaction === null) {
  134.             throw new OrderTransactionNotFoundException($orderTransactionId);
  135.         }
  136.         $orderId $orderTransaction->getOrderId();
  137.         /** @var OrderEntity|null $order */
  138.         $order $this->orderRepository->search(new Criteria([$orderId]), $event->getContext())->get($orderId);
  139.         if ($order instanceof OrderEntity) {
  140.             $this->orderProcessor->processOrder($order$event->getContext());
  141.         } else {
  142.             $this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.'$event->getName()));
  143.         }
  144.     }
  145.     /**
  146.      * Gets invoked when the order status is changed.
  147.      *
  148.      * @param StateMachineStateChangeEvent $event
  149.      *
  150.      * @throws \Exception
  151.      */
  152.     public function onOrderStateChanged(StateMachineStateChangeEvent $event)
  153.     {
  154.         $config $this->systemConfigService->get('fgitsAutoinvoiceSW6.config'$event->getSalesChannelId());
  155.         if (!$config['active']) {
  156.             return;
  157.         }
  158.         $orderId $event->getTransition()->getEntityId();
  159.         /** @var OrderEntity|null $order */
  160.         $order $this->orderRepository->search(new Criteria([$orderId]), $event->getContext())->get($orderId);
  161.         if ($order instanceof OrderEntity) {
  162.             $this->orderProcessor->processOrder($order$event->getContext());
  163.         } else {
  164.             $this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.'$event->getName()));
  165.         }
  166.     }
  167.     /**
  168.      * Gets invoked when the order status is changed.
  169.      *
  170.      * @param StateMachineStateChangeEvent $event
  171.      */
  172.     public function onOrderStateChangedTickets(StateMachineStateChangeEvent $event)
  173.     {
  174.         $config $this->systemConfigService->get('FgitsTicketsV3.config'$event->getSalesChannelId());
  175.         if (!$this->utility->isPluginActive('FgitsTicketsV3') || !$config['extrasActive'] || ($config['extrasActionOnCancel'] == 'none' && $config['extrasActionOnReopen'] == 'none')) {
  176.             return;
  177.         }
  178.         if ($event->getNextState()->getTechnicalName() == 'cancelled') {
  179.             $ticketsExtras $this->utility->getService('Fgits\FgitsTicketsV3\Service\Extras');
  180.             switch ($config['extrasActionOnCancel']) {
  181.                 case 'deactivate':
  182.                     $ticketsExtras->deactivateTickets($event->getTransition()->getEntityId(), $event->getContext());
  183.                     break;
  184.                 case 'delete':
  185.                     $ticketsExtras->deleteTickets($event->getTransition()->getEntityId(), $event->getContext());
  186.                     break;
  187.             }
  188.         } elseif ($event->getNextState()->getTechnicalName() == 'open' && $event->getPreviousState()->getTechnicalName() == 'cancelled' && $config['extrasActionOnReopen'] == 'activate') {
  189.             $ticketsExtras $this->utility->getService('Fgits\FgitsTicketsV3\Service\Extras');
  190.             $ticketsExtras->activateTickets($event->getTransition()->getEntityId(), $event->getContext());
  191.         }
  192.     }
  193. }