<?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\CustomerAware;use Shopware\Core\Framework\Event\DelayAware;use Shopware\Core\Framework\Event\FlowEvent;use Shopware\Core\Framework\Uuid\Uuid;class AddCustomerAffiliateAndCampaignCodeAction extends FlowAction{    private Connection $connection;    private EntityRepositoryInterface $customerRepository;    /**     * @internal     */    public function __construct(        Connection $connection,        EntityRepositoryInterface $customerRepository    ) {        $this->connection = $connection;        $this->customerRepository = $customerRepository;    }    public static function getName(): string    {        return 'action.add.customer.affiliate.and.campaign.code';    }    public static function getSubscribedEvents(): array    {        return [            self::getName() => 'handle',        ];    }    public function requirements(): array    {        return [CustomerAware::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 CustomerAware) {            return;        }        $customerId = $baseEvent->getCustomerId();        $customerData = $this->getAffiliateAndCampaignCodeFromCustomerId($customerId);        if (empty($customerData)) {            return;        }        $affiliateCode = $customerData['affiliate_code'];        if ($affiliateCode === null || $config['affiliateCode']['upsert']) {            $affiliateCode = $config['affiliateCode']['value'];        }        $campaignCode = $customerData['campaign_code'];        if ($campaignCode === null || $config['campaignCode']['upsert']) {            $campaignCode = $config['campaignCode']['value'];        }        $data = [];        if ($affiliateCode !== $customerData['affiliate_code']) {            $data['affiliateCode'] = $affiliateCode;        }        if ($campaignCode !== $customerData['campaign_code']) {            $data['campaignCode'] = $campaignCode;        }        if (empty($data)) {            return;        }        $data['id'] = $customerId;        $this->customerRepository->update([$data], $baseEvent->getContext());    }    private function getAffiliateAndCampaignCodeFromCustomerId(string $customerId): array    {        $query = $this->connection->createQueryBuilder();        $query->select(['affiliate_code', 'campaign_code']);        $query->from('customer');        $query->where('id = :id');        $query->setParameter('id', Uuid::fromHexToBytes($customerId));        if (!$data = $query->execute()->fetchAssociative()) {            return [];        }        return $data;    }}