<?php declare(strict_types=1);
namespace CodevisionMiraklConnector\Subscriber;
use CodevisionMiraklConnector\CodevisionMiraklConnector;
use CodevisionMiraklConnector\Enum\Shopware\SalesChannel;
use CodevisionMiraklConnector\Event\MiraklProductExportInspectEvent;
use CodevisionMiraklConnector\Operation\GetValueFromConfigOperation;
use CodevisionMiraklConnector\Response\ConfigurationValueResponse;
use CodevisionMiraklConnector\Service\Logger\PluginLogAwareInterface;
use CodevisionMiraklConnector\Service\Logger\PluginLogAwareTrait;
use League\Tactician\CommandBus;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Webmozart\Assert\Assert;
use Webmozart\Assert\InvalidArgumentException;
class MiraklProductExportEventsSubscriber implements EventSubscriberInterface, PluginLogAwareInterface
{
use PluginLogAwareTrait;
private CommandBus $commandBus;
public function __construct(CommandBus $commandBus)
{
$this->commandBus = $commandBus;
}
public static function getSubscribedEvents(): array
{
return [
MiraklProductExportInspectEvent::NAME => 'onProductExportInspect',
];
}
public function onProductExportInspect(MiraklProductExportInspectEvent $event): MiraklProductExportInspectEvent
{
$customFields = $event->getProductExportEntity()->getSalesChannel()->getCustomFields();
if ($customFields === null) {
return $event;
}
if (array_key_exists('codevisionMiraklConnectorChannel_type', $customFields) === false) {
return $event;
}
if ($customFields['codevisionMiraklConnectorChannel_type'] !== SalesChannel::PRODUCT_SELECT_TYPE()->getValue(
)) {
return $event;
}
/**
* @var ConfigurationValueResponse $configResponse
*/
$configResponse = $this->commandBus->handle(new GetValueFromConfigOperation('enableProductSync'));
if ($configResponse->getConfigurationValue() === false) {
return $event;
}
$event->setIncludeInExport(true);
try {
$customFields = $event->getProductEntity()->getCustomFields();
if ($customFields === null) {
return $event;
}
if (array_key_exists('codevisionMiraklConnectorProduct_syncDate', $customFields) === false) {
return $event;
}
$lastSyncDate = new \DateTimeImmutable($customFields['codevisionMiraklConnectorProduct_syncDate']);
// 15 Minutes grace period
$minInterval = new \DateInterval('PT15M');
$gracePeriodTime = (new \DateTime())->sub($minInterval);
// we do not want to send the offer again within a 15 minute time frame
// only active in production mode
if (CodevisionMiraklConnector::DEBUG_MODE === false) {
Assert::greaterThan($gracePeriodTime, $lastSyncDate);
}
// this is neccessary as the update date can be slightly different than the lastSyncDate due to server
// performance reasons, thus we deduct a 30 second grace period which captures that
$minInterval = new \DateInterval('PT30S');
$graceUpdateTime = $event->getProductEntity()->getUpdatedAt()->sub($minInterval);
Assert::greaterThan($graceUpdateTime, $lastSyncDate);
} catch (InvalidArgumentException $exception) {
$event->setIncludeInExport(false);
}
return $event;
}
}