/**
  * {@inheritdoc}
  */
 public function apply(ProductTemplateInterface $template, array $products)
 {
     $this->templateUpdater->update($template, $products);
     $results = $this->validateProducts($products);
     $validProducts = $results['products'];
     $violations = $results['violations'];
     $this->productSaver->saveAll($validProducts);
     return $violations;
 }
 /**
  * {@inheritdoc}
  */
 public function process($product)
 {
     $actions = $this->getConfiguredActions();
     $variantGroup = $actions['value'];
     $variantGroup = $this->groupRepository->findOneByIdentifier($variantGroup);
     $variantGroup->addProduct($product);
     if (null !== $variantGroup->getProductTemplate()) {
         $this->templateUpdater->update($variantGroup->getProductTemplate(), [$product]);
     }
     if (null === $product || null !== $product && !$this->isProductValid($product)) {
         $this->stepExecution->incrementSummaryInfo('skipped_products');
         return null;
     }
     return $product;
 }
 /**
  * @param ProductInterface $product
  */
 protected function setProductValuesFromVariantGroup(ProductInterface $product)
 {
     $variantGroup = $product->getVariantGroup();
     if ($variantGroup !== null && $variantGroup->getProductTemplate() !== null) {
         $template = $variantGroup->getProductTemplate();
         $this->templateUpdater->update($template, [$product]);
     }
 }
 /**
  * {@inheritdoc}
  */
 public function process($product)
 {
     $configuration = $this->getJobConfiguration();
     if (!array_key_exists('actions', $configuration)) {
         throw new InvalidArgumentException('Missing configuration for \'actions\'.');
     }
     $actions = $configuration['actions'];
     $variantGroup = $actions['value'];
     $variantGroup = $this->groupRepository->findOneByIdentifier($variantGroup);
     $variantGroup->addProduct($product);
     if (null !== $variantGroup->getProductTemplate()) {
         $this->templateUpdater->update($variantGroup->getProductTemplate(), [$product]);
     }
     if (null === $product || null !== $product && !$this->isProductValid($product)) {
         $this->stepExecution->incrementSummaryInfo('skipped_products');
         return null;
     }
     return $product;
 }
 /**
  * Updates product with its variant group values to ensure that values coming from variant group are always
  * applied after the product values (if a product value is updated and should come from variant group)
  *
  * @param ProductInterface $product
  * @param array            $data
  */
 protected function updateProductVariantValues(ProductInterface $product, array $data)
 {
     $variantGroup = $product->getVariantGroup();
     $shouldEraseData = false;
     if (null !== $variantGroup && null !== $variantGroup->getProductTemplate()) {
         $template = $variantGroup->getProductTemplate();
         foreach (array_keys($data) as $field) {
             if ($template->hasValueForAttributeCode($field) || null === $product->getValue($field)) {
                 $shouldEraseData = true;
             }
         }
         if ($shouldEraseData) {
             $this->templateUpdater->update($template, [$product]);
         }
     }
 }