<?php declare(strict_types=1);
namespace Fgits\AutoInvoice\Subscriber;
use Fgits\AutoInvoice\Service\ConditionChecker;
use Fgits\AutoInvoice\Service\CustomFields\OrderCustomFields;
use Fgits\AutoInvoice\Service\DB\Document as DBDocument;
use Fgits\AutoInvoice\Service\DB\Order;
use Fgits\AutoInvoice\Service\Document;
use Fgits\AutoInvoice\Service\DocumentCreator;
use Fgits\AutoInvoice\Service\FgitsLibrary\Mailer as FgitsMailer;
use Psr\Log\LoggerInterface;
use Shopware\Core\Content\MailTemplate\Service\Event\MailBeforeSentEvent;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Copyright (c) 2021. GOLLE IT.
*
* @author Andrey Grigorkin <andrey@golle-it.de>
*/
class MailSubscriber implements EventSubscriberInterface
{
/**
* @var DBDocument $dbDocument
*/
private $dbDocument;
/**
* @var Order $order
*/
private $order;
/**
* @var ConditionChecker $conditionChecker
*/
private $conditionChecker;
/**
* @var Document $document
*/
private $document;
/**
* @var DocumentCreator $documentCreator
*/
private $documentCreator;
/**
* @var FgitsMailer $mailer
*/
private $mailer;
/**
* @var OrderCustomFields $orderCustomFields
*/
private $orderCustomFields;
/**
* @var SystemConfigService $systemConfigService
*/
private $systemConfigService;
/**
* @var LoggerInterface $logger
*/
private $logger;
/**
* MailSubscriber constructor.
*
* @param DBDocument $dbDocument
* @param Order $order
* @param ConditionChecker $conditionChecker
* @param Document $document
* @param DocumentCreator $documentCreator
* @param FgitsMailer $mailer
* @param OrderCustomFields $orderCustomFields
* @param SystemConfigService $systemConfigService
* @param LoggerInterface $logger
*/
public function __construct(
DBDocument $dbDocument,
Order $order,
ConditionChecker $conditionChecker,
Document $document,
DocumentCreator $documentCreator,
FgitsMailer $mailer,
OrderCustomFields $orderCustomFields,
SystemConfigService $systemConfigService,
LoggerInterface $logger
) {
$this->dbDocument = $dbDocument;
$this->order = $order;
$this->conditionChecker = $conditionChecker;
$this->document = $document;
$this->documentCreator = $documentCreator;
$this->mailer = $mailer;
$this->orderCustomFields = $orderCustomFields;
$this->systemConfigService = $systemConfigService;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return[
MailBeforeSentEvent::class => 'onAfterCreateMessage'
];
}
/**
* Gets invoked when an email is ready to be sent.
*
* @param MailBeforeSentEvent $event
*
* @throws \Exception
*/
public function onAfterCreateMessage(MailBeforeSentEvent $event)
{
$data = $event->getData();
$config = $this->systemConfigService->get('fgitsAutoinvoiceSW6.config', $data['salesChannelId']);
if ($config['active'] && !empty($config['sendCustomerEmail']) && !empty($config['attachEmail']) && isset($data['templateId'])) {
$mailTemplate = $this->mailer->getMailTemplateById($data['templateId']);
$mailTemplateType = $mailTemplate->getMailTemplateType();
if ($mailTemplateType->getTechnicalName() == $config['attachEmail']) {
$order = $this->order->getLastOrder($event->getContext());
if ($this->conditionChecker->shouldSendInvoice($order, false)) {
$this->documentCreator->createInvoice($order);
$invoice = $this->document->getInvoice($order, $event->getContext());
$event->getMessage()->attach($invoice['content'], $invoice['fileName'], $invoice['mimeType']);
$this->dbDocument->setSent($invoice['id'], $invoice['orderVersionId']);
$this->orderCustomFields->setOrderProcessed($order);
}
$this->orderCustomFields->setOrderConfirmationSent($order);
}
}
}
}