EmicoEcommerce/Magento2TweakwiseExport

View on GitHub
Model/Write/Products/ExportEntityBundle.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

namespace Tweakwise\Magento2TweakwiseExport\Model\Write\Products;

use Tweakwise\Magento2TweakwiseExport\Model\StockItem;
use Magento\Catalog\Model\Product\Attribute\Source\Status;

class ExportEntityBundle extends CompositeExportEntity
{
    /**
     * @var bool
     */
    protected $isStockCombined;

    /**
     * @return StockItem
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     * @SuppressWarnings(PHPMD.NPathComplexity)
     */
    public function getStockItem(): ?StockItem
    {
        if ($this->isStockCombined) {
            return $this->stockItem;
        }

        if (!$this->children) {
            return $this->stockItem;
        }

        $optionGroups = [];
        foreach ($this->getEnabledChildren() as $child) {
            $childOptions = $child->getChildOptions();
            if (!$childOptions) {
                continue;
            }

            $optionId = $childOptions->getOptionId();
            $childQty = $child->getStockItem() ? $child->getStockItem()->getQty() : 0;

            $optionGroups[$optionId]['qty'] =
                isset($optionGroups[$optionId]['qty'])
                    ? $optionGroups[$optionId]['qty'] + $childQty
                    : $childQty;

            if (isset($optionGroups[$optionId]['is_in_stock']) && $optionGroups[$optionId]['is_in_stock']) {
                continue;
            }

            $optionGroups[$optionId]['is_in_stock'] = $child->getStockItem()->getIsInStock();

            if (!$childOptions->isRequired()) {
                $optionGroups[$optionId]['is_in_stock'] = 1;
            }
        }

        if (empty($optionGroups)) {
            $this->isStockCombined = true;
            return $this->stockItem;
        }

        $qty = min(array_column($optionGroups, 'qty'));
        $isInStock = min(array_map(fn ($child) => $child['is_in_stock'], $optionGroups));
        $stockItem = new StockItem();
        $stockItem->setQty($qty);
        $stockItem->setIsInStock($isInStock);

        $this->stockItem = $stockItem;
        $this->isStockCombined = true;
        return $this->stockItem;
    }

    /**
     * @return bool
     */
    protected function shouldExportByChildStatus(): bool
    {
        $optionGroupStatus = [];
        foreach ($this->getAllChildren() as $child) {
            $childOptions = $child->getChildOptions();
            if (!$childOptions) {
                continue;
            }

            $optionId = $childOptions->getOptionId();
            if (!$childOptions->isRequired()) {
                $optionGroupStatus[$optionId] = 1;
                continue;
            }

            if (isset($optionGroupStatus[$optionId]) && $optionGroupStatus[$optionId]) {
                continue;
            }

            $childStatus = $child->getStatus() === Status::STATUS_ENABLED ? 1 : 0;
            $optionGroupStatus[$optionId] = $childStatus;
        }

        return (empty($optionGroupStatus)) || array_product($optionGroupStatus) === 1;
    }
}