custom/plugins/SystemIntegration/src/Subscribers/ProductImportExportSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. namespace Virgin\SystemIntegration\Subscribers;
  3. use Exception;
  4. use Shopware\Core\Content\ImportExport\Event\EnrichExportCriteriaEvent;
  5. use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeExportRecordEvent;
  6. use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeImportRecordEvent;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  10. use \Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Virgin\SystemIntegration\Services\Import\Product\ProductImporter;
  12. class ProductImportExportSubscriber implements EventSubscriberInterface
  13. {
  14. const VIRGIN_SUBSCRIPTION_PROFILE = 'virgin_subscription';
  15. /** @var ProductImporter */
  16. private $productImporter;
  17. /** @var string */
  18. private $salesChannelId;
  19. public function __construct(
  20. ProductImporter $productImporter
  21. ) {
  22. $this->productImporter = $productImporter;
  23. $this->salesChannelId = $productImporter->getSalesChannelId();
  24. }
  25. /**
  26. * @inheritDoc
  27. */
  28. public static function getSubscribedEvents(): array
  29. {
  30. return [
  31. ImportExportBeforeImportRecordEvent::class => 'beforeImportRecord',
  32. ImportExportBeforeExportRecordEvent::class => 'beforeExportRecord',
  33. EnrichExportCriteriaEvent::class => 'enrichExportCriteria'
  34. ];
  35. }
  36. /**
  37. * @param ImportExportBeforeImportRecordEvent $event
  38. * @throws Exception
  39. */
  40. public function beforeImportRecord(ImportExportBeforeImportRecordEvent $event): void
  41. {
  42. if ($event->getConfig()->get('sourceEntity') !== 'product') {
  43. return;
  44. }
  45. $row = $event->getRow();
  46. $record = [];
  47. foreach ($event->getConfig()->getMapping()->getElements() as $element){
  48. $record[$element->getKey()] = $row[$element->getMappedKey()];
  49. }
  50. try {
  51. if ($event->getConfig()->get('profileName') === self::VIRGIN_SUBSCRIPTION_PROFILE) {
  52. $record = $this->productImporter->convertSubscriptionToProduct($record, $this->salesChannelId);
  53. }
  54. } catch (\Exception $e){
  55. $record['_error'] = $e;
  56. }
  57. $event->setRecord($record);
  58. }
  59. /**
  60. * @param ImportExportBeforeExportRecordEvent $event
  61. * @return void
  62. * @throws Exception
  63. */
  64. public function beforeExportRecord(ImportExportBeforeExportRecordEvent $event): void
  65. {
  66. if ($event->getConfig()->get('sourceEntity') !== 'product') {
  67. return;
  68. }
  69. $record = $event->getRecord();
  70. if (isset($record['_error'])){
  71. return;
  72. }
  73. $originalRecord = $event->getOriginalRecord();
  74. if ($event->getConfig()->get('profileName') == self::VIRGIN_SUBSCRIPTION_PROFILE) {
  75. $record = $this->productImporter->convertProductToSubscription($originalRecord, $record);
  76. }
  77. $event->setRecord($record);
  78. }
  79. public function enrichExportCriteria(EnrichExportCriteriaEvent $event)
  80. {
  81. $criteria = $event->getCriteria();
  82. if ($event->getLogEntity()->getProfile()->getName() == self::VIRGIN_SUBSCRIPTION_PROFILE && $event->getLogEntity()->getActivity() == "export") {
  83. $criteria->addFilter(new NotFilter(MultiFilter::CONNECTION_AND, [new ContainsFilter('productNumber', 'SW')]));
  84. }
  85. $event->setCriteria($criteria);
  86. }
  87. }