custom/plugins/DkcPentagastOrderExport/src/Subscriber/OrderStateSubscriber.php line 32

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DkcPentagastOrderExport\Subscriber;
  3. use DkcPentagastOrderExport\Service\PentagastOrderExportService;
  4. use Shopware\Core\Checkout\Order\OrderEntity;
  5. use Shopware\Core\Checkout\Order\OrderStates;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\System\SalesChannel\SalesChannelEntity;
  9. use Shopware\Core\System\StateMachine\Event\StateMachineTransitionEvent;
  10. use Shopware\Core\System\SystemConfig\SystemConfigService;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class OrderStateSubscriber implements EventSubscriberInterface
  13. {
  14.     public function __construct(
  15.         private readonly PentagastOrderExportService $exportService,
  16.         private readonly EntityRepository $orderRepository,
  17.         private readonly EntityRepository $salesChannelRepository,
  18.         private readonly SystemConfigService $systemConfigService
  19.     ) {
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             StateMachineTransitionEvent::class => 'onStateMachineTransition',
  25.         ];
  26.     }
  27.     public function onStateMachineTransition(StateMachineTransitionEvent $event): void
  28.     {
  29.         if ($event->getStateMachineName() !== OrderStates::STATE_MACHINE) {
  30.             return;
  31.         }
  32.         $toPlace $event->getToPlace();
  33.         // Wir reagieren nur auf "in_progress" und "completed"
  34.         if (!\in_array($toPlace, [OrderStates::STATE_IN_PROGRESSOrderStates::STATE_COMPLETED], true)) {
  35.             return;
  36.         }
  37.         $orderId $event->getEntityId();
  38.         /** @var OrderEntity|null $order */
  39.         $order $this->orderRepository->search(
  40.             (new Criteria([$orderId]))
  41.                 ->addAssociation('salesChannel')
  42.                 ->addAssociation('lineItems')
  43.                 ->addAssociation('deliveries')
  44.                 ->addAssociation('deliveries.shippingOrderAddress.country')
  45.                 ->addAssociation('transactions.paymentMethod')
  46.                 ->addAssociation('billingAddress.country')
  47.                 ->addAssociation('orderCustomer'),
  48.             $event->getContext()
  49.         )->first();
  50.         if (!$order) {
  51.             return;
  52.         }
  53.         /** @var SalesChannelEntity|null $salesChannel */
  54.         $salesChannel $order->getSalesChannel();
  55.         if (!$salesChannel) {
  56.             $salesChannelId $order->getSalesChannelId();
  57.             $salesChannel $this->salesChannelRepository->search(
  58.                 new Criteria([$salesChannelId]),
  59.                 $event->getContext()
  60.             )->first();
  61.             if (!$salesChannel) {
  62.                 return;
  63.             }
  64.         }
  65.         $salesChannelId $salesChannel->getId();
  66.         $triggerState = (string) ($this->systemConfigService->get(
  67.             'DkcPentagastOrderExport.config.triggerState',
  68.             $salesChannelId
  69.         ) ?? 'transaction_paid');
  70.         // passende Kombination prüfen
  71.         if ($triggerState === 'order_completed' && $toPlace !== OrderStates::STATE_COMPLETED) {
  72.             return;
  73.         }
  74.         if ($triggerState === 'order_in_progress' && $toPlace !== OrderStates::STATE_IN_PROGRESS) {
  75.             return;
  76.         }
  77.         if (!\in_array($triggerState, ['order_completed''order_in_progress'], true)) {
  78.             // Für andere Trigger (z. B. all_orders, transaction_paid) macht dieser Subscriber nichts
  79.             return;
  80.         }
  81.         $this->exportService->exportOrder($order$salesChannel);
  82.     }
  83. }