<?phpnamespace Virgin\SystemIntegration\Subscribers;use Exception;use Shopware\Core\Content\ImportExport\Event\EnrichExportCriteriaEvent;use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeExportRecordEvent;use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeImportRecordEvent;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;use \Symfony\Component\EventDispatcher\EventSubscriberInterface;use Virgin\SystemIntegration\Services\Import\Product\ProductImporter;class ProductImportExportSubscriber implements EventSubscriberInterface{ const VIRGIN_SUBSCRIPTION_PROFILE = 'virgin_subscription'; /** @var ProductImporter */ private $productImporter; /** @var string */ private $salesChannelId; public function __construct( ProductImporter $productImporter ) { $this->productImporter = $productImporter; $this->salesChannelId = $productImporter->getSalesChannelId(); } /** * @inheritDoc */ public static function getSubscribedEvents(): array { return [ ImportExportBeforeImportRecordEvent::class => 'beforeImportRecord', ImportExportBeforeExportRecordEvent::class => 'beforeExportRecord', EnrichExportCriteriaEvent::class => 'enrichExportCriteria' ]; } /** * @param ImportExportBeforeImportRecordEvent $event * @throws Exception */ public function beforeImportRecord(ImportExportBeforeImportRecordEvent $event): void { if ($event->getConfig()->get('sourceEntity') !== 'product') { return; } $row = $event->getRow(); $record = []; foreach ($event->getConfig()->getMapping()->getElements() as $element){ $record[$element->getKey()] = $row[$element->getMappedKey()]; } try { if ($event->getConfig()->get('profileName') === self::VIRGIN_SUBSCRIPTION_PROFILE) { $record = $this->productImporter->convertSubscriptionToProduct($record, $this->salesChannelId); } } catch (\Exception $e){ $record['_error'] = $e; } $event->setRecord($record); } /** * @param ImportExportBeforeExportRecordEvent $event * @return void * @throws Exception */ public function beforeExportRecord(ImportExportBeforeExportRecordEvent $event): void { if ($event->getConfig()->get('sourceEntity') !== 'product') { return; } $record = $event->getRecord(); if (isset($record['_error'])){ return; } $originalRecord = $event->getOriginalRecord(); if ($event->getConfig()->get('profileName') == self::VIRGIN_SUBSCRIPTION_PROFILE) { $record = $this->productImporter->convertProductToSubscription($originalRecord, $record); } $event->setRecord($record); } public function enrichExportCriteria(EnrichExportCriteriaEvent $event) { $criteria = $event->getCriteria(); if ($event->getLogEntity()->getProfile()->getName() == self::VIRGIN_SUBSCRIPTION_PROFILE && $event->getLogEntity()->getActivity() == "export") { $criteria->addFilter(new NotFilter(MultiFilter::CONNECTION_AND, [new ContainsFilter('productNumber', 'SW')])); } $event->setCriteria($criteria); }}