<?php declare(strict_types=1);
namespace Ott\EmarsysIntegration\Subscriber;
use Ott\EmarsysIntegration\Client\TpgOneClient;
use Ott\EmarsysIntegration\Gateway\EmarsysCustomerGateway;
use Shopware\Core\Content\Newsletter\Event\NewsletterRegisterEvent;
use Shopware\Core\Framework\Struct\ArrayStruct;
use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
class StorefrontSubscriber implements EventSubscriberInterface
{
private const SALUTATION_NONE = 'prefer not to say';
private const SALUTATION_MALE = 'male';
private const SALUTATION_FEMALE = 'female';
public function __construct(
private readonly TpgOneClient $tpgOneClient,
private readonly RequestStack $requestStack,
private readonly EmarsysCustomerGateway $emarsysCustomerGateway,
)
{
}
public static function getSubscribedEvents(): array
{
return [
NavigationPageLoadedEvent::class => 'onNavigationPageLoaded',
NewsletterRegisterEvent::class => 'onNewsletterRegister',
];
}
public function onNavigationPageLoaded(NavigationPageLoadedEvent $event): void
{
$url = $event->getSalesChannelContext()->getSalesChannel()->getDomains()->first()->getUrl();
$departments = [];
foreach ($this->tpgOneClient->getDepartments()['suites'] ?? [] as $suite) {
if ($suite['media']) {
$suite['media'] = TpgOneClient::MEDIA_URL . $suite['media'];
}
$suite['preselection'] = false;
if ('moebel_wohnen' === $suite['mapping_name']) {
$suite['preselection'] = true;
}
$departments[] = $suite;
}
$event->getPage()->addExtension('ottEmarsys', new ArrayStruct([
'departments' => $departments,
'salutations' => $this->emarsysCustomerGateway->getSalutations(),
]));
}
public function onNewsletterRegister(NewsletterRegisterEvent $event): void
{
$email = $event->getNewsletterRecipient()->getEmail();
$payload = $this->requestStack->getMainRequest()->request->all();
$departments = [];
foreach ($this->tpgOneClient->getDepartments()['suites'] ?? [] as $suite) {
$departments[] = $suite;
}
$storeDepartments = [];
foreach ($payload as $parameter => $value) {
foreach ($departments as $department) {
if (
$parameter === $department['name']
&& 'on' === $value
) {
$storeDepartments[$department['name']] = 'on';
}
}
}
if ($email) {
$urlParts = explode('/', str_replace('https://', '', $event->getUrl()));
try {
$this->tpgOneClient->save(
array_merge([
'id' => $email,
'origin' => 'https://' . $urlParts[0],
'locale' => 'de_DE',
'userData' => [
'included' => [],
'data' => [
'attributes' => [
'email' => $email,
'firstName' => $payload['firstName'],
'lastName' => $payload['lastName'],
'gender' => $this->convertSalutationToGender($payload['salutationId']),
],
],
'optin' => 1,
],
], $storeDepartments)
);
} catch (\Exception $e) {
}
}
}
private function convertSalutationToGender(string $salutationId): string
{
$salutationKey = $this->emarsysCustomerGateway->getSalutationById($salutationId);
if (null === $salutationKey) {
return self::SALUTATION_NONE;
}
return match ($salutationKey) {
'not_specified' => self::SALUTATION_NONE,
'mrs' => self::SALUTATION_FEMALE,
'mr' => self::SALUTATION_MALE,
};
}
}