<?php declare(strict_types=1);
namespace DkcPentagastOrderExport\Subscriber;
use DkcPentagastOrderExport\Service\PentagastOrderExportService;
use Shopware\Core\Checkout\Order\OrderEntity;
use Shopware\Core\Checkout\Order\OrderStates;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\System\SalesChannel\SalesChannelEntity;
use Shopware\Core\System\StateMachine\Event\StateMachineTransitionEvent;
use Shopware\Core\System\SystemConfig\SystemConfigService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class OrderStateSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly PentagastOrderExportService $exportService,
private readonly EntityRepository $orderRepository,
private readonly EntityRepository $salesChannelRepository,
private readonly SystemConfigService $systemConfigService
) {
}
public static function getSubscribedEvents(): array
{
return [
StateMachineTransitionEvent::class => 'onStateMachineTransition',
];
}
public function onStateMachineTransition(StateMachineTransitionEvent $event): void
{
if ($event->getStateMachineName() !== OrderStates::STATE_MACHINE) {
return;
}
$toPlace = $event->getToPlace();
// Wir reagieren nur auf "in_progress" und "completed"
if (!\in_array($toPlace, [OrderStates::STATE_IN_PROGRESS, OrderStates::STATE_COMPLETED], true)) {
return;
}
$orderId = $event->getEntityId();
/** @var OrderEntity|null $order */
$order = $this->orderRepository->search(
(new Criteria([$orderId]))
->addAssociation('salesChannel')
->addAssociation('lineItems')
->addAssociation('deliveries')
->addAssociation('deliveries.shippingOrderAddress.country')
->addAssociation('transactions.paymentMethod')
->addAssociation('billingAddress.country')
->addAssociation('orderCustomer'),
$event->getContext()
)->first();
if (!$order) {
return;
}
/** @var SalesChannelEntity|null $salesChannel */
$salesChannel = $order->getSalesChannel();
if (!$salesChannel) {
$salesChannelId = $order->getSalesChannelId();
$salesChannel = $this->salesChannelRepository->search(
new Criteria([$salesChannelId]),
$event->getContext()
)->first();
if (!$salesChannel) {
return;
}
}
$salesChannelId = $salesChannel->getId();
$triggerState = (string) ($this->systemConfigService->get(
'DkcPentagastOrderExport.config.triggerState',
$salesChannelId
) ?? 'transaction_paid');
// passende Kombination prüfen
if ($triggerState === 'order_completed' && $toPlace !== OrderStates::STATE_COMPLETED) {
return;
}
if ($triggerState === 'order_in_progress' && $toPlace !== OrderStates::STATE_IN_PROGRESS) {
return;
}
if (!\in_array($triggerState, ['order_completed', 'order_in_progress'], true)) {
// Für andere Trigger (z. B. all_orders, transaction_paid) macht dieser Subscriber nichts
return;
}
$this->exportService->exportOrder($order, $salesChannel);
}
}