custom/plugins/OttEmarsysIntegration/src/Decorator/MailSendSubscriberDecorator.php line 54

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Ott\EmarsysIntegration\Decorator;
  3. use Ott\EmarsysIntegration\Event\EventDataProviderFactory;
  4. use Ott\EmarsysIntegration\Gateway\EmarsysCustomerGateway;
  5. use Ott\EmarsysIntegration\Service\ApiService;
  6. use Ott\EmarsysIntegration\Service\MailEventProvider;
  7. use Ott\EmarsysIntegration\Service\MailTriggerService;
  8. use Psr\Log\LoggerInterface;
  9. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  10. use Shopware\Core\Content\MailTemplate\Subscriber\MailSendSubscriber;
  11. use Shopware\Core\Framework\Event\MailActionInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Contracts\EventDispatcher\Event;
  14. class MailSendSubscriberDecorator implements EventSubscriberInterface
  15. {
  16.     private EventSubscriberInterface $parentMailSendSubscriber;
  17.     private MailEventProvider $mailEventProvider;
  18.     private MailTriggerService $mailTriggerService;
  19.     private bool $alreadyTriggeredEvent false;
  20.     private ApiService $apiService;
  21.     private EmarsysCustomerGateway $emarsysCustomerGateway;
  22.     private EventDataProviderFactory $dataProviderFactory;
  23.     private LoggerInterface $logger;
  24.     public function __construct(
  25.         EventSubscriberInterface $parentMailSendSubscriber,
  26.         MailEventProvider $mailEventProvider,
  27.         MailTriggerService $mailTriggerService,
  28.         ApiService $apiService,
  29.         EmarsysCustomerGateway $emarsysCustomerGateway,
  30.         EventDataProviderFactory $dataProviderFactory,
  31.         LoggerInterface $logger
  32.     )
  33.     {
  34.         $this->parentMailSendSubscriber $parentMailSendSubscriber;
  35.         $this->mailEventProvider $mailEventProvider;
  36.         $this->mailTriggerService $mailTriggerService;
  37.         $this->apiService $apiService;
  38.         $this->emarsysCustomerGateway $emarsysCustomerGateway;
  39.         $this->dataProviderFactory $dataProviderFactory;
  40.         $this->logger $logger;
  41.     }
  42.     public static function getSubscribedEvents(): array
  43.     {
  44.         return [
  45.             MailSendSubscriber::ACTION_NAME => 'sendMail',
  46.         ];
  47.     }
  48.     public function sendMail(Event $event): void
  49.     {
  50.         /** @var MailActionInterface $mailActionEvent */
  51.         $isOrderPlacedEvent false;
  52.         try {
  53.             $mailActionEvent $event->getEvent();
  54.             $isOrderPlacedEvent CheckoutOrderPlacedEvent::EVENT_NAME === $mailActionEvent->getName();
  55.             $salesChannelId $event->getContext()->getSource()->getSalesChannelId();
  56.             $mailEvent $this->mailEventProvider->getMailEvent(
  57.                 $mailActionEvent->getName(),
  58.                 $salesChannelId
  59.             );
  60.             if ($isOrderPlacedEvent) {
  61.                 $extension $mailActionEvent->getContext()->getExtension('cronjob');
  62.                 if (null === $extension || !$extension->getVars()['shouldSendMail']) {
  63.                     return;
  64.                 }
  65.             }
  66.         } catch (\Exception $e) {
  67.             $this->logger->error(
  68.                 sprintf(
  69.                     'Something went wrong while fetching MailEvent for %s: %s',
  70.                     $event->getEvent()->getName(),
  71.                     $e->getMessage()
  72.                 )
  73.             );
  74.             if (!$isOrderPlacedEvent) {
  75.                 $this->parentMailSendSubscriber->sendMail($event);
  76.             }
  77.             return;
  78.         }
  79.         if (null !== $mailEvent) {
  80.             try {
  81.                 $eventData $this->dataProviderFactory->getEventData($mailActionEvent);
  82.             } catch (\Exception $e) {
  83.                 $this->logger->error($e->getMessage());
  84.                 if (!$isOrderPlacedEvent) {
  85.                     $this->parentMailSendSubscriber->sendMail($event);
  86.                 }
  87.                 return;
  88.             }
  89.             if (
  90.                 null !== $eventData
  91.                 && !empty($eventData->getData())
  92.                 && !empty($eventData->getMail())
  93.                 && !$this->alreadyTriggeredEvent
  94.             ) {
  95.                 try {
  96.                     $mailActionEvent->stopPropagation();
  97.                     if (
  98.                         null !== $eventData->getCustomerId()
  99.                         && !$this->emarsysCustomerGateway->emarsysCustomerExists($eventData->getCustomerId())
  100.                     ) {
  101.                         $this->apiService->initApiClient($salesChannelId);
  102.                         $this->apiService->createEmarsysCustomer($eventData->getCustomerId());
  103.                     } elseif (
  104.                         null === $eventData->getCustomerId()
  105.                         && null !== $eventData->getMail()
  106.                     ) {
  107.                         $this->apiService->createEmarsysNewsletterCustomer($eventData->getMail());
  108.                     }
  109.                     $this->mailTriggerService->sendMail($mailEvent$eventData$salesChannelId);
  110.                     $this->alreadyTriggeredEvent true;
  111.                 } catch (\Exception $e) {
  112.                     $this->logger->error(
  113.                         sprintf(
  114.                             'Something went wrong while triggering MailEvent for %s: %s',
  115.                             $mailActionEvent->getName(),
  116.                             $e->getMessage()
  117.                         )
  118.                     );
  119.                     if (!$isOrderPlacedEvent) {
  120.                         $this->parentMailSendSubscriber->sendMail($event);
  121.                     }
  122.                 }
  123.             } else {
  124.                 if (!$isOrderPlacedEvent) {
  125.                     $this->parentMailSendSubscriber->sendMail($event);
  126.                 }
  127.             }
  128.         } else {
  129.             if (!$isOrderPlacedEvent) {
  130.                 $this->parentMailSendSubscriber->sendMail($event);
  131.             }
  132.         }
  133.     }
  134. }