custom/plugins/CodevisionMiraklConnector/src/Subscriber/MiraklOfferExportEventsSubscriber.php line 21

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 Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Webmozart\Assert\Assert;
  8. use Webmozart\Assert\InvalidArgumentException;
  9. class MiraklOfferExportEventsSubscriber implements EventSubscriberInterface
  10. {
  11.     public static function getSubscribedEvents(): array
  12.     {
  13.         return [
  14.             MiraklProductExportInspectEvent::NAME => 'onOfferExport',
  15.         ];
  16.     }
  17.     public function onOfferExport(MiraklProductExportInspectEvent $event): MiraklProductExportInspectEvent
  18.     {
  19.         $customFields $event->getProductExportEntity()->getSalesChannel()->getCustomFields();
  20.         if ($customFields === null) {
  21.             return $event;
  22.         }
  23.         if (array_key_exists('codevisionMiraklConnectorChannel_type'$customFields) === false) {
  24.             return $event;
  25.         }
  26.         if ($customFields['codevisionMiraklConnectorChannel_type'] !== SalesChannel::OFFER_SELECT_TYPE()->getValue()) {
  27.             return $event;
  28.         }
  29.         $event->setIncludeInExport(true);
  30.         try {
  31.             $customFields $event->getProductEntity()->getCustomFields();
  32.             if ($customFields === null) {
  33.                 return $event;
  34.             }
  35.             /**
  36.              * Feature 2023-01-06: We do not want to disable offer export if products aren't synchronized
  37.              * they could have been synchronized outside of shopware already
  38.              *
  39.              * Assert::keyExists($customFields, 'codevisionMiraklConnectorProduct_syncDate');
  40.              *
  41.              * $lastImportErrorMessage = $customFields['codevisionMiraklConnectorProduct_errorMessage'] ?? '';
  42.              *
  43.              * Assert::length($lastImportErrorMessage, 0);
  44.              */
  45.             if (array_key_exists('codevisionMiraklConnectorProduct_offerSyncDate'$customFields) === false) {
  46.                 return $event;
  47.             }
  48.             $lastSyncDate = new \DateTimeImmutable($customFields['codevisionMiraklConnectorProduct_offerSyncDate']);
  49.             // 15 Minutes grace period
  50.             $minInterval = new \DateInterval('PT15M');
  51.             $gracePeriodTime = (new \DateTime())->sub($minInterval);
  52.             // we do not want to send the offer again within a 15 minute time frame
  53.             // only active in production mode
  54.             if (CodevisionMiraklConnector::DEBUG_MODE === false) {
  55.                 Assert::greaterThan($gracePeriodTime$lastSyncDate);
  56.             }
  57.             // this is neccessary as the update date can be slightly different than the lastSyncDate due to server
  58.             // performance reasons, thus we deduct a 30 second grace period which captures that
  59.             $minInterval = new \DateInterval('PT30S');
  60.             $graceUpdateTime $event->getProductEntity()->getUpdatedAt()->sub($minInterval);
  61.             Assert::greaterThan($graceUpdateTime$lastSyncDate);
  62.         } catch (InvalidArgumentException $exception) {
  63.             $event->setIncludeInExport(false);
  64.         }
  65.         return $event;
  66.     }
  67. }