<?php
namespace CioOrderExportPerMail\Subscriber;
use CioPromotionalOfficeApi\Event\CreateSearchOrderSyncCriteriaEvent;
use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
use Shopware\Core\Checkout\Order\Event\OrderStateMachineStateChangeEvent;
use Shopware\Core\Content\Mail\Service\AbstractMailService;
use Shopware\Core\Content\MailTemplate\Aggregate\MailTemplateType\MailTemplateTypeEntity;
use Shopware\Core\Content\MailTemplate\MailTemplateEntity;
use Shopware\Core\Content\MailTemplate\MailTemplateTypes;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\ParameterBag;
class OrderSubscriber implements EventSubscriberInterface
{
private AbstractMailService $mailService;
private EntityRepositoryInterface $mailTemplateRepository;
private EntityRepositoryInterface $mailTemplateTypeRepository;
public function __construct(
AbstractMailService $mailService,
EntityRepositoryInterface $mailTemplateRepository,
EntityRepositoryInterface $mailTemplateTypeRepository
){
$this->mailService = $mailService;
$this->mailTemplateRepository = $mailTemplateRepository;
$this->mailTemplateTypeRepository = $mailTemplateTypeRepository;
}
public static function getSubscribedEvents(): array
{
return [
'state_leave.order.state.waiting_for_release' => 'onCheckoutOrderPlacedEvent',
CreateSearchOrderSyncCriteriaEvent::class => 'onCreateSearchOrderSyncCriteriaEvent'
];
}
public function onCheckoutOrderPlacedEvent(OrderStateMachineStateChangeEvent $event)
{
$order = $event->getOrder();
$manufacturerMails = [];
/** @var OrderLineItemEntity $lineItem */
foreach ($order->getLineItems() as $lineItem) {
if ($payload = $lineItem->getPayload()) {
if (array_key_exists('exportMail', $payload)) {
$exportMail = $payload['exportMail'];
// valid email address?
if (filter_var($exportMail, FILTER_VALIDATE_EMAIL)) {
$manufacturerMails[$exportMail] = $exportMail;
}
}
}
}
if (count($manufacturerMails)) {
/** @var MailTemplateTypeEntity $mailTemplateType */
$mailTemplateType = $this->mailTemplateTypeRepository->search((new Criteria())->addFilter(new EqualsFilter('technicalName', MailTemplateTypes::MAILTYPE_ORDER_CONFIRM)), $event->getContext())->first();
/** @var MailTemplateEntity $mailTemplate */
$mailTemplate = $this->mailTemplateRepository->search((new Criteria())->addFilter(new EqualsFilter('mailTemplateTypeId', $mailTemplateType->getId())), $event->getContext())->first();
$mailData = new ParameterBag();
$mailData->set('salesChannelId', $order->getSalesChannelId());
$mailData->set('recipients', $manufacturerMails);
$mailData->set('senderName', $mailTemplate->getTranslation('senderName'));
$mailData->set('subject', $mailTemplate->getSubject());
$mailData->set('contentHtml', $mailTemplate->getContentHtml());
$mailData->set('contentPlain', $mailTemplate->getContentPlain());
$this->mailService->send($mailData->all(), $event->getContext(), ['order' => $order]);
}
}
public function onCreateSearchOrderSyncCriteriaEvent(CreateSearchOrderSyncCriteriaEvent $event)
{
$criteria = $event->getCriteria();
// filter payload
$criteria->addAssociation('lineItems');
$criteria->addFilter(new EqualsFilter('lineItems.payload.exportMail', null));
$event->setCriteria($criteria);
}
}