<?php
declare(strict_types=1);
namespace WbfkExtensions\Subscriber;
use Enqueue\MessengerAdapter\EnvelopeItem\TransportConfiguration;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use WbfkExtensions\MessageQueue\Handler\SetOwnWarehouseStocksActiveIfAvailableHandler;
use WbfkExtensions\MessageQueue\Message\SetOwnWarehouseStocksActiveIfAvailable;
class ActivateOwnStocksOnProductSupplierChanges implements EventSubscriberInterface
{
public function __construct(
private readonly MessageBusInterface $bus
) {
}
public static function getSubscribedEvents(): array
{
return [
'wbfk_it_scope_product_supplier.written' => 'onProductSupplierWritten',
];
}
public function onProductSupplierWritten(EntityWrittenEvent $event): void
{
if ($event->getContext()->hasState(
SetOwnWarehouseStocksActiveIfAvailableHandler::OWN_STOCK_ACTIVATION_CONTEXT_STATE
)) {
// Since activation itself leads to 'wbfk_it_scope_product_supplier.written' event,
// We need to skip secondary event else, we will be running activation check multiple times for initial event
return;
}
$changedProductSupplierIds = $this->getChangedProductSupplierIds($event->getPayloads());
if (empty($changedProductSupplierIds)) {
return;
}
$this->bus->dispatch(new SetOwnWarehouseStocksActiveIfAvailable($changedProductSupplierIds), [
new TransportConfiguration([
'metadata' => [
'priority' => SetOwnWarehouseStocksActiveIfAvailable::PRIORITY,
],
]),
]);
}
private function getChangedProductSupplierIds(array $payloads): array
{
$changedProductSupplierIds = [];
foreach ($payloads as $payload) {
if (array_key_exists('stock', $payload) || array_key_exists('active', $payload)) {
$changedProductSupplierIds[] = $payload['id'];
}
}
return $changedProductSupplierIds;
}
}