public function loadVariationByFallback(Product $parentProduct, array $attributes)
{
$variation = false;
if ($this->isProductHasSwatch($parentProduct) && $parentProduct->getDocumentSource() !== null) {
$documentSource = $parentProduct->getDocumentSource();
$childrenIds = isset($documentSource['children_ids']) ? $documentSource['children_ids'] : [];
if (!empty($childrenIds)) {
$childrenIds = array_map('intval', $childrenIds);
$productCollection = $this->productCollectionFactory->create();
$productCollection->addIdFilter($childrenIds);
$configurableAttributes = $this->getAttributesFromConfigurable($parentProduct);
$allAttributesArray = [];
foreach ($configurableAttributes as $attribute) {
foreach ($attribute->getOptions() as $option) {
$allAttributesArray[$attribute['attribute_code']][] = (int) $option->getValue();
}
}
$resultAttributesToFilter = array_merge($attributes, array_diff_key($allAttributesArray, $attributes));
$this->addFilterByAttributes($productCollection, $resultAttributesToFilter);
$variationProduct = $productCollection->getFirstItem();
if ($variationProduct && $variationProduct->getId()) {
$variation = $this->productRepository->getById($variationProduct->getId());
}
}
} else {
$variation = parent::loadVariationByFallback($parentProduct, $attributes);
}
return $variation;
}