sourceItemsProcessor = $sourceItemsProcessor; $this->getSkusByProductIdsInterface = $getSkusByProductIdsInterface; } /** * @param EventObserver $observer * * @return void */ public function execute(EventObserver $observer) { /** @var ProductInterface $product */ $product = $observer->getEvent()->getProduct(); if ($product->getTypeId() !== Configurable::TYPE_CODE) { return; } /** @var Save $controller */ $controller = $observer->getEvent()->getController(); $configurableMatrix = $controller->getRequest()->getParam('configurable-matrix-serialized', ''); if ($configurableMatrix != '') { $productsData = json_decode($configurableMatrix, true); foreach ($productsData as $key => $productData) { if (isset($productData['quantity_per_source'])) { $quantityPerSource = is_array($productData['quantity_per_source']) ? $productData['quantity_per_source'] : []; // get sku by child id, because child sku can be changed if product with such sku already exists. $childProductId = $product->getExtensionAttributes()->getConfigurableProductLinks()[$key]; $childProductSku = $this->getSkusByProductIdsInterface->execute([$childProductId])[$childProductId]; $this->processSourceItems($quantityPerSource, $childProductSku); } } } } /** * @param array $sourceItems * @param string $productSku * * @return void */ private function processSourceItems(array $sourceItems, string $productSku) { foreach ($sourceItems as $key => $sourceItem) { if (!isset($sourceItem[SourceItemInterface::STATUS])) { $sourceItems[$key][SourceItemInterface::QUANTITY] = $sourceItems[$key]['quantity_per_source']; $sourceItems[$key][SourceItemInterface::STATUS] = $sourceItems[$key][SourceItemInterface::QUANTITY] > 0 ? 1 : 0; } } $this->sourceItemsProcessor->process($productSku, $sourceItems); } }