custom/plugins/ErpOrdersWriter/src/Subscriber/OrderSubscriber.php line 71

Open in your IDE?
  1. <?php
  2. namespace CodeCouncil\ErpOrdersWriter\Subscriber;
  3. use CodeCouncil\ErpOrdersWriter\ERP\ERPConnectorService;
  4. use Psr\Log\LoggerInterface;
  5. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedCriteriaEvent;
  6. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  7. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  8. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class OrderSubscriber implements EventSubscriberInterface
  14. {
  15.     private ERPConnectorService $ERPConnectorService;
  16.     private LoggerInterface $logger;
  17.     private EntityRepository $orderTransactionRepository;
  18.     public function __construct(ERPConnectorService $ERPConnectorServiceLoggerInterface $loggerEntityRepository $orderTransactionRepository)
  19.     {
  20.         $this->ERPConnectorService $ERPConnectorService;
  21.         $this->logger $logger;
  22.         $this->orderTransactionRepository $orderTransactionRepository;
  23.     }
  24.     public static function getSubscribedEvents()
  25.     {
  26.         return [
  27.             CheckoutOrderPlacedCriteriaEvent::class => 'orderCreatedCriteriaEvent',
  28.             CheckoutOrderPlacedEvent::class => "orderCreatedEvent",
  29.             'state_machine.order_transaction.state_changed' => 'orderTransactionStateChange',
  30.         ];
  31.     }
  32.     public function orderCreatedCriteriaEvent(CheckoutOrderPlacedCriteriaEvent $event)
  33.     {
  34.         //We need following for email sent to order@iceberg.de
  35.         $criteria $event->getCriteria();
  36.         $criteria->addAssociations([
  37.             'billingAddress.country',
  38.             'billingAddress.countryState',
  39.             'deliveries.shippingOrderAddress.country',
  40.             'deliveries.shippingOrderAddress.countryState'
  41.         ]);
  42.     }
  43.     /**
  44.      * Triggered when order is placed.
  45.      *
  46.      * @param CheckoutOrderPlacedEvent $event
  47.      * @return void
  48.      */
  49.     public function orderCreatedEvent(CheckoutOrderPlacedEvent $event)
  50.     {
  51.         $this->logger->info("Order placed event order: " $event->getOrder()->getOrderNumber());
  52.         $orderIds $this->ERPConnectorService->createOrder($event->getOrder(), $event->getContext());
  53.         if ($orderIds === null) {
  54.             $this->logger->error("Failed to place order (number) " $event->getOrder()->getOrderNumber() . " into ERP after order has been placed in shop!");
  55.             return;
  56.         }
  57.         ['erpOrderId' => $orderId'erpCustomerId' => $customerId] = $orderIds;
  58.         $this->ERPConnectorService->sendInvoicePDFForOrder($orderId$customerId);
  59.     }
  60.     public function orderTransactionStateChange(StateMachineStateChangeEvent $event)
  61.     {
  62.         $nextState $event->getNextState()->getTechnicalName();
  63.         $prevState $event->getPreviousState()->getTechnicalName();
  64.         $this->logger->info("Order transaction state changed from: " $prevState " to: " $nextState);
  65.         //We want to mark paid if new state is paid or authorized.
  66.         if ($nextState !== OrderTransactionStates::STATE_PAID && $nextState !== OrderTransactionStates::STATE_AUTHORIZED)
  67.             return;
  68.         //Probably after order is authortized it will be marked as paid so if from state is authorized lets not do anything.
  69.         if($prevState === OrderTransactionStates::STATE_AUTHORIZED)
  70.             return;
  71.         if ($event->getTransition()->getEntityName() !== 'order_transaction') {
  72.             $this->logger->warning("Expected orderTransactionStateChange entity name to be order_transaction, given: " $event->getTransition()->getEntityName());
  73.             return;
  74.         }
  75.         $context $event->getContext();
  76.         $criteria = new Criteria([$event->getTransition()->getEntityId()]);
  77.         $criteria->setLimit(1);
  78.         $criteria->addAssociation('order.transactions');
  79.         /** @var OrderTransactionEntity $orderTransaction */
  80.         $orderTransaction $this->orderTransactionRepository->search($criteria$context)->first();
  81.         if ($orderTransaction === null) {
  82.             $this->logger->error("Failed to fetch order transaction inside orderTransactionStateChange event!");
  83.             return;
  84.         }
  85.         $order $orderTransaction->getOrder();
  86.         if ($order === null) {
  87.             $this->logger->error("Failed to fetch order inside orderTransactionStateChange event!");
  88.             return;
  89.         }
  90.         $this->logger->info("Marking order " $order->getOrderNumber() . " as paid...");
  91.         $status $this->ERPConnectorService->markOrderAsPaid($order$context);
  92.         if (!$status)
  93.             $this->logger->error("Failed to mark order as paid inside orderTransactionStateChange event!");
  94.     }
  95. }