<?php
namespace Virgin\SystemIntegration\Subscribers;
use Exception;
use Shopware\Core\Content\ImportExport\Event\EnrichExportCriteriaEvent;
use Shopware\Core\Content\ImportExport\Event\ImportExportAfterImportRecordEvent;
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',
ImportExportAfterImportRecordEvent::class => 'afterImportRecord',
EnrichExportCriteriaEvent::class => 'enrichExportCriteria'
];
}
public function afterImportRecord(ImportExportAfterImportRecordEvent $event): void
{
if ($event->getConfig()->get('sourceEntity') !== 'product') {
return;
}
$record = $event->getRecord();
$row = $event->getRow();
$context = $event->getContext();
$productId = $record['id'] ?? null;
if ($productId === null) {
return;
}
$translationData = [
'meta_title_eng' => $row['Meta title eng'] ?? null,
'meta_title_ita' => $row['Meta title ita'] ?? null,
'meta_title_deu' => $row['Meta title deu'] ?? null,
'meta_description_eng' => $row['Meta description eng'] ?? null,
'meta_description_ita' => $row['Meta description ita'] ?? null,
'meta_description_deu' => $row['Meta description deu'] ?? null,
];
$this->productImporter->upsertProductTranslations($productId, $record['name'], $translationData, $context);
}
/**
* @param ImportExportBeforeImportRecordEvent $event
* @throws Exception
*/
public function beforeImportRecord(ImportExportBeforeImportRecordEvent $event): void
{
if ($event->getConfig()->get('sourceEntity') !== 'product') {
return;
}
$context = $event->getContext();
$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);
}
}