custom/plugins/CodevisionMiraklConnector/src/Subscriber/MiraklProductExportEventsSubscriber.php line 35

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace CodevisionMiraklConnector\Subscriber;
  3. use CodevisionMiraklConnector\CodevisionMiraklConnector;
  4. use CodevisionMiraklConnector\Enum\Shopware\SalesChannel;
  5. use CodevisionMiraklConnector\Event\MiraklProductExportInspectEvent;
  6. use CodevisionMiraklConnector\Operation\GetValueFromConfigOperation;
  7. use CodevisionMiraklConnector\Response\ConfigurationValueResponse;
  8. use CodevisionMiraklConnector\Service\Logger\PluginLogAwareInterface;
  9. use CodevisionMiraklConnector\Service\Logger\PluginLogAwareTrait;
  10. use League\Tactician\CommandBus;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Webmozart\Assert\Assert;
  13. use Webmozart\Assert\InvalidArgumentException;
  14. class MiraklProductExportEventsSubscriber implements EventSubscriberInterfacePluginLogAwareInterface
  15. {
  16.     use PluginLogAwareTrait;
  17.     private CommandBus $commandBus;
  18.     public function __construct(CommandBus $commandBus)
  19.     {
  20.         $this->commandBus $commandBus;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             MiraklProductExportInspectEvent::NAME => 'onProductExportInspect',
  26.         ];
  27.     }
  28.     public function onProductExportInspect(MiraklProductExportInspectEvent $event): MiraklProductExportInspectEvent
  29.     {
  30.         $customFields $event->getProductExportEntity()->getSalesChannel()->getCustomFields();
  31.         if ($customFields === null) {
  32.             return $event;
  33.         }
  34.         if (array_key_exists('codevisionMiraklConnectorChannel_type'$customFields) === false) {
  35.             return $event;
  36.         }
  37.         if ($customFields['codevisionMiraklConnectorChannel_type'] !== SalesChannel::PRODUCT_SELECT_TYPE()->getValue(
  38.             )) {
  39.             return $event;
  40.         }
  41.         /**
  42.          * @var ConfigurationValueResponse $configResponse
  43.          */
  44.         $configResponse $this->commandBus->handle(new GetValueFromConfigOperation('enableProductSync'));
  45.         if ($configResponse->getConfigurationValue() === false) {
  46.             return $event;
  47.         }
  48.         $event->setIncludeInExport(true);
  49.         try {
  50.             $customFields $event->getProductEntity()->getCustomFields();
  51.             if ($customFields === null) {
  52.                 return $event;
  53.             }
  54.             if (array_key_exists('codevisionMiraklConnectorProduct_syncDate'$customFields) === false) {
  55.                 return $event;
  56.             }
  57.             $lastSyncDate = new \DateTimeImmutable($customFields['codevisionMiraklConnectorProduct_syncDate']);
  58.             // 15 Minutes grace period
  59.             $minInterval = new \DateInterval('PT15M');
  60.             $gracePeriodTime = (new \DateTime())->sub($minInterval);
  61.             // we do not want to send the offer again within a 15 minute time frame
  62.             // only active in production mode
  63.             if (CodevisionMiraklConnector::DEBUG_MODE === false) {
  64.                 Assert::greaterThan($gracePeriodTime$lastSyncDate);
  65.             }
  66.             // this is neccessary as the update date can be slightly different than the lastSyncDate due to server
  67.             // performance reasons, thus we deduct a 30 second grace period which captures that
  68.             $minInterval = new \DateInterval('PT30S');
  69.             $graceUpdateTime $event->getProductEntity()->getUpdatedAt()->sub($minInterval);
  70.             Assert::greaterThan($graceUpdateTime$lastSyncDate);
  71.         } catch (InvalidArgumentException $exception) {
  72.             $event->setIncludeInExport(false);
  73.         }
  74.         return $event;
  75.     }
  76. }