<?php
declare(strict_types=0);
/*
* WellCommerce Foundation
*
* This file is part of the WellCommerce package.
*
* (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
*
* For the full copyright and license information,
* please view the LICENSE file that was distributed with this source code.
*/
namespace WellCommerce\Bundle\EmarsysBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use WellCommerce\Bundle\AppBundle\Entity\NewsletterSubscriber;
use WellCommerce\Bundle\AppBundle\Entity\Shop;
use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
use WellCommerce\Bundle\EmarsysBundle\Client\EmarsysClient;
use WellCommerce\Component\Form\Event\FormEvent;
/**
* Class EmarsysSubscriber
*
* @package WellCommerce\Bundle\EmarsysBundle\EventListener
*/
class EmarsysSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'admin.shop.pre_form_init' => ['onShopFormAdminInit'],
'newsletter_subscriber.post_update' => ['onNewsletterSubscriberPostCreate'],
];
}
public function onNewsletterSubscriberPostCreate(EntityEvent $event)
{
/** @var NewsletterSubscriber $resource */
$resource = $event->getEntity();
$shop = $resource->getShop();
$triggerId = (int) $shop->getEmarsysTriggerId();
if ($resource instanceof NewsletterSubscriber) {
if ($resource->isEnabled()) {
$email = $resource->getEmail();
$listId = (int) $shop->getEmarsysContactListId();
if ($this->isClientEnabled($shop)) {
$api = $this->createApiClient($shop);
$sex = '';
if ($resource->getSex() === 'm') {
$sex = 1;
}
if ($resource->getSex() === 'f') {
$sex = 2;
}
$api->send('POST', 'contact', json_encode([
'key_id' => 3,
'1' => $resource->getFirstName(),
'3' => $email,
'46' => $sex,
]));
$eventResult = $api->send('POST', 'event/' . $triggerId . '/trigger', json_encode([
'key_id' => 3,
'external_id' => $email,
]));
if ($listId > 0) {
$api->send('POST', 'contactlist/' . $listId . '/add', json_encode([
'key_id' => 3,
'external_ids' => [$email],
]));
}
}
}
if (false === $resource->isEnabled()) {
$email = $resource->getEmail();
if ($this->isClientEnabled($shop)) {
$api = $this->createApiClient($shop);
$api->send('POST', 'contact/delete', json_encode([
'3' => $email,
]));
}
}
}
}
public function onShopFormAdminInit(FormEvent $event)
{
$resource = $event->getResource();
if ($resource instanceof Shop) {
$form = $event->getForm();
$builder = $event->getFormBuilder();
$emarsysData = $form->addChild($builder->getElement('nested_fieldset', [
'name' => 'emarsys_data',
'label' => 'emarsys.fieldset.settings',
]));
$emarsysData->addChild($builder->getElement('text_field', [
'name' => 'emarsysApiKey',
'label' => 'emarsys.label.api_key',
]));
$emarsysData->addChild($builder->getElement('text_field', [
'name' => 'emarsysApiSecret',
'label' => 'emarsys.label.api_secret',
]));
$emarsysData->addChild($builder->getElement('text_field', [
'name' => 'emarsysContactListId',
'label' => 'ID listy kontaktów',
]));
$emarsysData->addChild($builder->getElement('text_field', [
'name' => 'emarsysTriggerId',
'label' => 'ID triggera',
]));
}
}
private function createApiClient(Shop $shop): EmarsysClient
{
$username = $shop->getEmarsysApiKey();
$secret = $shop->getEmarsysApiSecret();
return new EmarsysClient($username, $secret);
}
private function isClientEnabled(Shop $shop): bool
{
return strlen($shop->getEmarsysApiKey()) > 0 && strlen($shop->getEmarsysApiSecret()) > 0;
}
}