![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-bundle/Model/ResourceModel/Indexer/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Bundle\Model\ResourceModel\Indexer; use Magento\Catalog\Model\ResourceModel\Indexer\ActiveTableSwitcher; use Magento\CatalogInventory\Model\Indexer\Stock\Action\Full; use Magento\CatalogInventory\Model\ResourceModel\Indexer\Stock\DefaultStock; use Magento\Eav\Model\Config; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\Indexer\Table\StrategyInterface; use Magento\Framework\Model\ResourceModel\Db\Context; /** * Bundle Stock Status Indexer Resource Model * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Stock extends DefaultStock { /** * @var ActiveTableSwitcher */ private $activeTableSwitcher; /** * @var StockStatusSelectBuilder */ private $stockStatusSelectBuilder; /** * @var BundleOptionStockDataSelectBuilder */ private $bundleOptionStockDataSelectBuilder; /** * @param Context $context * @param StrategyInterface $tableStrategy * @param Config $eavConfig * @param ScopeConfigInterface $scopeConfig * @param ActiveTableSwitcher $activeTableSwitcher * @param StockStatusSelectBuilder $stockStatusSelectBuilder * @param BundleOptionStockDataSelectBuilder $bundleOptionStockDataSelectBuilder * @param string $connectionName */ public function __construct( Context $context, StrategyInterface $tableStrategy, Config $eavConfig, ScopeConfigInterface $scopeConfig, ActiveTableSwitcher $activeTableSwitcher, StockStatusSelectBuilder $stockStatusSelectBuilder, BundleOptionStockDataSelectBuilder $bundleOptionStockDataSelectBuilder, $connectionName = null ) { parent::__construct($context, $tableStrategy, $eavConfig, $scopeConfig, $connectionName); $this->activeTableSwitcher = $activeTableSwitcher; $this->stockStatusSelectBuilder = $stockStatusSelectBuilder; $this->bundleOptionStockDataSelectBuilder = $bundleOptionStockDataSelectBuilder; } /** * Retrieve table name for temporary bundle option stock index * * @return string */ protected function _getBundleOptionTable() { return $this->getTable('catalog_product_bundle_stock_index'); } /** * Prepare stock status per Bundle options, website and stock * * @param int|array $entityIds * @param bool $usePrimaryTable use primary or temporary index table * * @return $this */ protected function _prepareBundleOptionStockData($entityIds = null, $usePrimaryTable = false) { $this->_cleanBundleOptionStockData(); $connection = $this->getConnection(); $table = $this->getActionType() === Full::ACTION_TYPE ? $this->activeTableSwitcher->getAdditionalTableName($this->getMainTable()) : $this->getMainTable(); $idxTable = $usePrimaryTable ? $table : $this->getIdxTable(); $select = $this->bundleOptionStockDataSelectBuilder->buildSelect($idxTable); $status = new \Zend_Db_Expr( 'MAX(' . $connection->getCheckSql('e.required_options = 0', 'i.stock_status', '0') . ')' ); $select->columns(['status' => $status]); if ($entityIds !== null) { $select->where('product.entity_id IN(?)', $entityIds); } // clone select for bundle product without required bundle options $selectNonRequired = clone $select; $select->where('bo.required = ?', 1); $selectNonRequired->where('bo.required = ?', 0)->having($status . ' = 1'); $query = $select->insertFromSelect($this->_getBundleOptionTable()); $connection->query($query); $query = $selectNonRequired->insertFromSelect($this->_getBundleOptionTable()); $connection->query($query); return $this; } /** * Get the select object for get stock status by product ids * * @param int|array $entityIds * @param bool $usePrimaryTable use primary or temporary index table * * @return \Magento\Framework\DB\Select */ protected function _getStockStatusSelect($entityIds = null, $usePrimaryTable = false) { $this->_prepareBundleOptionStockData($entityIds, $usePrimaryTable); $connection = $this->getConnection(); $select = parent::_getStockStatusSelect($entityIds, $usePrimaryTable); $select = $this->stockStatusSelectBuilder->buildSelect($select); $statusNotNullExpr = $connection->getCheckSql('o.stock_status IS NOT NULL', 'o.stock_status', '0'); $statusExpr = $this->getStatusExpression($connection); $select->columns( [ 'status' => $connection->getLeastSql( [ new \Zend_Db_Expr('MIN(' . $statusNotNullExpr . ')'), new \Zend_Db_Expr('MIN(' . $statusExpr . ')'), ] ), ] ); if ($entityIds !== null) { $select->where('e.entity_id IN(?)', $entityIds); } return $select; } /** * Prepare stock status data in temporary index table * * @param int|array $entityIds the product limitation * @return $this */ protected function _prepareIndexTable($entityIds = null) { parent::_prepareIndexTable($entityIds); $this->_cleanBundleOptionStockData(); return $this; } /** * Update Stock status index by product ids * * @param array|int $entityIds * * @return $this */ protected function _updateIndex($entityIds) { parent::_updateIndex($entityIds); $this->_cleanBundleOptionStockData(); return $this; } /** * Clean temporary bundle options stock data * * @return $this */ protected function _cleanBundleOptionStockData() { $this->getConnection()->delete($this->_getBundleOptionTable()); return $this; } }