custom/plugins/DkcPentagastOrderExport/src/Subscriber/OrderPaidSubscriber.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\Aggregate\OrderTransaction\OrderTransactionEntity;
  5. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
  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 OrderPaidSubscriber implements EventSubscriberInterface
  13. {
  14.     public function __construct(
  15.         private readonly PentagastOrderExportService $exportService,
  16.         private readonly EntityRepository $orderTransactionRepository,
  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() !== OrderTransactionStates::STATE_MACHINE) {
  30.             return;
  31.         }
  32.         if ($event->getToPlace() !== OrderTransactionStates::STATE_PAID) {
  33.             return;
  34.         }
  35.         $transactionId $event->getEntityId();
  36.         /** @var OrderTransactionEntity|null $transaction */
  37.         $transaction $this->orderTransactionRepository->search(
  38.             (new Criteria([$transactionId]))
  39.                 ->addAssociation('order')
  40.                 ->addAssociation('order.salesChannel')
  41.                 ->addAssociation('order.lineItems')
  42.                 ->addAssociation('order.deliveries')
  43.                 ->addAssociation('order.deliveries.shippingOrderAddress.country')
  44.                 ->addAssociation('order.transactions.paymentMethod')
  45.                 ->addAssociation('order.billingAddress.country')
  46.                 ->addAssociation('order.orderCustomer'),
  47.             $event->getContext()
  48.         )->first();
  49.         if (!$transaction) {
  50.             return;
  51.         }
  52.         $order $transaction->getOrder();
  53.         if (!$order) {
  54.             return;
  55.         }
  56.         /** @var SalesChannelEntity|null $salesChannel */
  57.         $salesChannel $order->getSalesChannel();
  58.         if (!$salesChannel) {
  59.             $salesChannelId $order->getSalesChannelId();
  60.             $salesChannel $this->salesChannelRepository->search(
  61.                 new Criteria([$salesChannelId]),
  62.                 $event->getContext()
  63.             )->first();
  64.             if (!$salesChannel) {
  65.                 return;
  66.             }
  67.         }
  68.         $salesChannelId $salesChannel->getId();
  69.         $triggerState = (string) ($this->systemConfigService->get(
  70.             'DkcPentagastOrderExport.config.triggerState',
  71.             $salesChannelId
  72.         ) ?? 'transaction_paid');
  73.         if ($triggerState !== 'transaction_paid') {
  74.             return;
  75.         }
  76.         $this->exportService->exportOrder($order$salesChannel);
  77.     }
  78. }