<?php declare(strict_types=1);namespace Shopware\Core\Content\Flow\Dispatching\Action;use Doctrine\DBAL\Connection;use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;use Shopware\Core\Framework\Event\DelayAware;use Shopware\Core\Framework\Event\FlowEvent;use Shopware\Core\Framework\Event\OrderAware;use Shopware\Core\Framework\Uuid\Uuid;class AddOrderAffiliateAndCampaignCodeAction extends FlowAction{    private Connection $connection;    private EntityRepositoryInterface $orderRepository;    /**     * @internal     */    public function __construct(        Connection $connection,        EntityRepositoryInterface $orderRepository    ) {        $this->connection = $connection;        $this->orderRepository = $orderRepository;    }    public static function getName(): string    {        return 'action.add.order.affiliate.and.campaign.code';    }    public static function getSubscribedEvents(): array    {        return [            self::getName() => 'handle',        ];    }    public function requirements(): array    {        return [OrderAware::class, DelayAware::class];    }    public function handle(FlowEvent $event): void    {        $config = $event->getConfig();        if (!\array_key_exists('affiliateCode', $config) || !\array_key_exists('campaignCode', $config)) {            return;        }        $baseEvent = $event->getEvent();        if (!$baseEvent instanceof OrderAware) {            return;        }        $orderId = $baseEvent->getOrderId();        $orderData = $this->getAffiliateAndCampaignCodeFromOrderId($orderId);        if (empty($orderData)) {            return;        }        $affiliateCode = $orderData['affiliate_code'];        if ($affiliateCode === null || $config['affiliateCode']['upsert']) {            $affiliateCode = $config['affiliateCode']['value'];        }        $campaignCode = $orderData['campaign_code'];        if ($campaignCode === null || $config['campaignCode']['upsert']) {            $campaignCode = $config['campaignCode']['value'];        }        $data = [];        if ($affiliateCode !== $orderData['affiliate_code']) {            $data['affiliateCode'] = $affiliateCode;        }        if ($campaignCode !== $orderData['campaign_code']) {            $data['campaignCode'] = $campaignCode;        }        if (empty($data)) {            return;        }        $data['id'] = $orderId;        $this->orderRepository->update([$data], $baseEvent->getContext());    }    private function getAffiliateAndCampaignCodeFromOrderId(string $orderId): array    {        $query = $this->connection->createQueryBuilder();        $query->select(['affiliate_code', 'campaign_code']);        $query->from('`order`');        $query->where('id = :id');        $query->setParameter('id', Uuid::fromHexToBytes($orderId));        if (!$data = $query->execute()->fetchAssociative()) {            return [];        }        return $data;    }}