<?php declare(strict_types=1);
namespace Fgits\AutoInvoice\Subscriber;
use Fgits\AutoInvoice\ScheduledTask\Export\AutoInvoiceExportTask;
use Fgits\AutoInvoice\ScheduledTask\OrderScan\AutoInvoiceOrderScanTask;
use Fgits\AutoInvoice\Service\FgitsLibrary\ScheduledTask;
use Fgits\AutoInvoice\Service\FgitsLibrary\Utility;
use Fgits\AutoInvoice\Service\OrderProcessor;
use Psr\Log\LoggerInterface;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Cart\Exception\OrderTransactionNotFoundException;
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
use Shopware\Core\Checkout\Order\OrderEntity;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Copyright (c) 2020. GOLLE IT.
*
* @author Andrey Grigorkin <andrey@golle-it.de>
*/
class OrderSubscriber implements EventSubscriberInterface
{
/**
* @var ScheduledTask $scheduledTask
*/
private $scheduledTask;
/**
* @var OrderProcessor $orderProcessor
*/
private $orderProcessor;
/**
* @var EntityRepositoryInterface $orderRepository
*/
private $orderRepository;
/**
* @var EntityRepositoryInterface $orderTransactionRepository
*/
private $orderTransactionRepository;
/**
* @var Utility $utility
*/
private $utility;
/**
* @var SystemConfigService $systemConfigService
*/
private $systemConfigService;
/**
* @var LoggerInterface $logger
*/
private $logger;
/**
* OrderSubscriber constructor.
*
* @param ScheduledTask $scheduledTask
* @param OrderProcessor $orderProcessor
* @param EntityRepositoryInterface $orderRepository
* @param EntityRepositoryInterface $orderTransactionRepository
* @param Utility $utility
* @param SystemConfigService $systemConfigService
* @param LoggerInterface $logger
*/
public function __construct(
ScheduledTask $scheduledTask,
OrderProcessor $orderProcessor,
EntityRepositoryInterface $orderRepository,
EntityRepositoryInterface $orderTransactionRepository,
Utility $utility,
SystemConfigService $systemConfigService,
LoggerInterface $logger
) {
$this->scheduledTask = $scheduledTask;
$this->orderProcessor = $orderProcessor;
$this->orderRepository = $orderRepository;
$this->orderTransactionRepository = $orderTransactionRepository;
$this->utility = $utility;
$this->systemConfigService = $systemConfigService;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return[
CheckoutOrderPlacedEvent::class => [['scheduleScheduledTasks'], ['onOrderPlaced']],
'state_machine.order_transaction.state_changed' => 'onOrderTransactionStateChanged',
'state_machine.order.state_changed' => [['onOrderStateChanged'], ['onOrderStateChangedTickets']]
];
}
public function scheduleScheduledTasks()
{
$this->scheduledTask->schedule(AutoInvoiceExportTask::getTaskName());
$this->scheduledTask->schedule(AutoInvoiceOrderScanTask::getTaskName());
}
/**
* Gets invoked when an order is created.
*
* @param CheckoutOrderPlacedEvent $event
*
* @throws \Exception
*/
public function onOrderPlaced(CheckoutOrderPlacedEvent $event)
{
$config = $this->systemConfigService->get('fgitsAutoinvoiceSW6.config', $event->getSalesChannelId());
if (!$config['active']) {
return;
}
$order = $event->getOrder();
if ($order instanceof OrderEntity) {
$this->orderProcessor->processOrder($order, $event->getContext(), true);
} else {
$this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.', $event->getName()));
}
}
/**
* Gets invoked when the payment status is changed.
*
* @param StateMachineStateChangeEvent $event
*
* @throws \Exception
*/
public function onOrderTransactionStateChanged(StateMachineStateChangeEvent $event)
{
$config = $this->systemConfigService->get('fgitsAutoinvoiceSW6.config', $event->getSalesChannelId());
if (!$config['active']) {
return;
}
$orderTransactionId = $event->getTransition()->getEntityId();
/** @var OrderTransactionEntity|null $orderTransaction */
$orderTransaction = $this->orderTransactionRepository->search(
new Criteria([$orderTransactionId]),
$event->getContext()
)->first();
if ($orderTransaction === null) {
throw new OrderTransactionNotFoundException($orderTransactionId);
}
$orderId = $orderTransaction->getOrderId();
/** @var OrderEntity|null $order */
$order = $this->orderRepository->search(new Criteria([$orderId]), $event->getContext())->get($orderId);
if ($order instanceof OrderEntity) {
$this->orderProcessor->processOrder($order, $event->getContext());
} else {
$this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.', $event->getName()));
}
}
/**
* Gets invoked when the order status is changed.
*
* @param StateMachineStateChangeEvent $event
*
* @throws \Exception
*/
public function onOrderStateChanged(StateMachineStateChangeEvent $event)
{
$config = $this->systemConfigService->get('fgitsAutoinvoiceSW6.config', $event->getSalesChannelId());
if (!$config['active']) {
return;
}
$orderId = $event->getTransition()->getEntityId();
/** @var OrderEntity|null $order */
$order = $this->orderRepository->search(new Criteria([$orderId]), $event->getContext())->get($orderId);
if ($order instanceof OrderEntity) {
$this->orderProcessor->processOrder($order, $event->getContext());
} else {
$this->logger->error(sprintf('Event %s did not receive a proper ordernumber. Unable to get Order-object. Aborting.', $event->getName()));
}
}
/**
* Gets invoked when the order status is changed.
*
* @param StateMachineStateChangeEvent $event
*/
public function onOrderStateChangedTickets(StateMachineStateChangeEvent $event)
{
$config = $this->systemConfigService->get('FgitsTicketsV3.config', $event->getSalesChannelId());
if (!$this->utility->isPluginActive('FgitsTicketsV3') || !$config['extrasActive'] || ($config['extrasActionOnCancel'] == 'none' && $config['extrasActionOnReopen'] == 'none')) {
return;
}
if ($event->getNextState()->getTechnicalName() == 'cancelled') {
$ticketsExtras = $this->utility->getService('Fgits\FgitsTicketsV3\Service\Extras');
switch ($config['extrasActionOnCancel']) {
case 'deactivate':
$ticketsExtras->deactivateTickets($event->getTransition()->getEntityId(), $event->getContext());
break;
case 'delete':
$ticketsExtras->deleteTickets($event->getTransition()->getEntityId(), $event->getContext());
break;
}
} elseif ($event->getNextState()->getTechnicalName() == 'open' && $event->getPreviousState()->getTechnicalName() == 'cancelled' && $config['extrasActionOnReopen'] == 'activate') {
$ticketsExtras = $this->utility->getService('Fgits\FgitsTicketsV3\Service\Extras');
$ticketsExtras->activateTickets($event->getTransition()->getEntityId(), $event->getContext());
}
}
}