| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 | 
							- <?php
 
- /**
 
-  * Copyright © Magento, Inc. All rights reserved.
 
-  * See COPYING.txt for license details.
 
-  */
 
- namespace Magento\CatalogInventory\Model\ResourceModel;
 
- use Magento\CatalogInventory\Api\StockConfigurationInterface;
 
- use Magento\Store\Model\StoreManagerInterface;
 
- /**
 
-  * Stock resource model
 
-  */
 
- class Stock extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements QtyCounterInterface
 
- {
 
-     /**
 
-      * @var StockConfigurationInterface
 
-      */
 
-     protected $stockConfiguration;
 
-     /**
 
-      * Is initialized configuration flag
 
-      *
 
-      * @var bool
 
-      */
 
-     protected $_isConfig;
 
-     /**
 
-      * Manage Stock flag
 
-      *
 
-      * @var bool
 
-      */
 
-     protected $_isConfigManageStock;
 
-     /**
 
-      * Backorders
 
-      *
 
-      * @var bool
 
-      */
 
-     protected $_isConfigBackorders;
 
-     /**
 
-      * Minimum quantity allowed in shopping card
 
-      *
 
-      * @var int
 
-      */
 
-     protected $_configMinQty;
 
-     /**
 
-      * Product types that could have quantities
 
-      *
 
-      * @var array
 
-      */
 
-     protected $_configTypeIds;
 
-     /**
 
-      * Notify for quantity below _configNotifyStockQty value
 
-      *
 
-      * @var int
 
-      */
 
-     protected $_configNotifyStockQty;
 
-     /**
 
-      * Core store config
 
-      *
 
-      * @var \Magento\Framework\App\Config\ScopeConfigInterface
 
-      */
 
-     protected $_scopeConfig;
 
-     /**
 
-      * @var \Magento\Framework\Stdlib\DateTime\DateTime
 
-      */
 
-     protected $dateTime;
 
-     /**
 
-      * @var StoreManagerInterface
 
-      * @deprecated 100.1.0
 
-      */
 
-     protected $storeManager;
 
-     /**
 
-      * @param \Magento\Framework\Model\ResourceModel\Db\Context $context
 
-      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
 
-      * @param \Magento\Framework\Stdlib\DateTime\DateTime $dateTime
 
-      * @param StockConfigurationInterface $stockConfiguration
 
-      * @param StoreManagerInterface $storeManager
 
-      * @param string $connectionName
 
-      */
 
-     public function __construct(
 
-         \Magento\Framework\Model\ResourceModel\Db\Context $context,
 
-         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
 
-         \Magento\Framework\Stdlib\DateTime\DateTime $dateTime,
 
-         StockConfigurationInterface $stockConfiguration,
 
-         StoreManagerInterface $storeManager,
 
-         $connectionName = null
 
-     ) {
 
-         parent::__construct($context, $connectionName);
 
-         $this->_scopeConfig = $scopeConfig;
 
-         $this->dateTime = $dateTime;
 
-         $this->stockConfiguration = $stockConfiguration;
 
-         $this->storeManager = $storeManager;
 
-     }
 
-     /**
 
-      * Define main table and initialize connection
 
-      *
 
-      * @return void
 
-      */
 
-     protected function _construct()
 
-     {
 
-         $this->_init('cataloginventory_stock', 'stock_id');
 
-     }
 
-     /**
 
-      * Lock Stock Item records.
 
-      *
 
-      * @param int[] $productIds
 
-      * @param int $websiteId
 
-      * @return array
 
-      */
 
-     public function lockProductsStock(array $productIds, $websiteId)
 
-     {
 
-         if (empty($productIds)) {
 
-             return [];
 
-         }
 
-         $itemTable = $this->getTable('cataloginventory_stock_item');
 
-         $select = $this->getConnection()->select()->from(['si' => $itemTable])
 
-             ->where('website_id = ?', $websiteId)
 
-             ->where('product_id IN(?)', $productIds)
 
-             ->forUpdate(true);
 
-         $productTable = $this->getTable('catalog_product_entity');
 
-         $selectProducts = $this->getConnection()->select()->from(['p' => $productTable], [])
 
-             ->where('entity_id IN (?)', $productIds)
 
-             ->columns(
 
-                 [
 
-                     'product_id' => 'entity_id',
 
-                     'type_id' => 'type_id',
 
-                 ]
 
-             );
 
-         $items = [];
 
-         foreach ($this->getConnection()->query($select)->fetchAll() as $si) {
 
-             $items[$si['product_id']] = $si;
 
-         }
 
-         foreach ($this->getConnection()->fetchAll($selectProducts) as $p) {
 
-             $items[$p['product_id']]['type_id'] = $p['type_id'];
 
-         }
 
-         
 
-         return $items;
 
-     }
 
-     /**
 
-      * {@inheritdoc}
 
-      */
 
-     public function correctItemsQty(array $items, $websiteId, $operator)
 
-     {
 
-         if (empty($items)) {
 
-             return;
 
-         }
 
-         $connection = $this->getConnection();
 
-         $conditions = [];
 
-         foreach ($items as $productId => $qty) {
 
-             $case = $connection->quoteInto('?', $productId);
 
-             $result = $connection->quoteInto("qty{$operator}?", $qty);
 
-             $conditions[$case] = $result;
 
-         }
 
-         $value = $connection->getCaseSql('product_id', $conditions, 'qty');
 
-         $where = ['product_id IN (?)' => array_keys($items), 'website_id = ?' => $websiteId];
 
-         $connection->beginTransaction();
 
-         $connection->update($this->getTable('cataloginventory_stock_item'), ['qty' => $value], $where);
 
-         $connection->commit();
 
-     }
 
-     /**
 
-      * Load some inventory configuration settings
 
-      *
 
-      * @return void
 
-      */
 
-     protected function _initConfig()
 
-     {
 
-         if (!$this->_isConfig) {
 
-             $configMap = [
 
-                 '_isConfigManageStock' => \Magento\CatalogInventory\Model\Configuration::XML_PATH_MANAGE_STOCK,
 
-                 '_isConfigBackorders' => \Magento\CatalogInventory\Model\Configuration::XML_PATH_BACKORDERS,
 
-                 '_configMinQty' => \Magento\CatalogInventory\Model\Configuration::XML_PATH_MIN_QTY,
 
-                 '_configNotifyStockQty' => \Magento\CatalogInventory\Model\Configuration::XML_PATH_NOTIFY_STOCK_QTY,
 
-             ];
 
-             foreach ($configMap as $field => $const) {
 
-                 $this->{$field} = (int) $this->_scopeConfig->getValue(
 
-                     $const,
 
-                     \Magento\Store\Model\ScopeInterface::SCOPE_STORE
 
-                 );
 
-             }
 
-             $this->_isConfig = true;
 
-             $this->_configTypeIds = array_keys($this->stockConfiguration->getIsQtyTypeIds(true));
 
-         }
 
-     }
 
-     /**
 
-      * Set items out of stock basing on their quantities and config settings
 
-      *
 
-      * @deprecated 100.2.5
 
-      * @see \Magento\CatalogInventory\Model\ResourceModel\Stock\Item::updateSetOutOfStock
 
-      * @param string|int $website
 
-      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 
-      * @return void
 
-      */
 
-     public function updateSetOutOfStock($website = null)
 
-     {
 
-         $websiteId = $this->stockConfiguration->getDefaultScopeId();
 
-         $this->_initConfig();
 
-         $connection = $this->getConnection();
 
-         $values = ['is_in_stock' => 0, 'stock_status_changed_auto' => 1];
 
-         $select = $connection->select()->from($this->getTable('catalog_product_entity'), 'entity_id')
 
-             ->where('type_id IN(?)', $this->_configTypeIds);
 
-         $where = sprintf(
 
-             'website_id = %1$d' .
 
-             ' AND is_in_stock = 1' .
 
-             ' AND ((use_config_manage_stock = 1 AND 1 = %2$d) OR (use_config_manage_stock = 0 AND manage_stock = 1))' .
 
-             ' AND ((use_config_backorders = 1 AND %3$d = %4$d) OR (use_config_backorders = 0 AND backorders = %3$d))' .
 
-             ' AND ((use_config_min_qty = 1 AND qty <= %5$d) OR (use_config_min_qty = 0 AND qty <= min_qty))' .
 
-             ' AND product_id IN (%6$s)',
 
-             $websiteId,
 
-             $this->_isConfigManageStock,
 
-             \Magento\CatalogInventory\Model\Stock::BACKORDERS_NO,
 
-             $this->_isConfigBackorders,
 
-             $this->_configMinQty,
 
-             $select->assemble()
 
-         );
 
-         $connection->update($this->getTable('cataloginventory_stock_item'), $values, $where);
 
-     }
 
-     /**
 
-      * Set items in stock basing on their quantities and config settings
 
-      *
 
-      * @deprecated 100.2.5
 
-      * @see \Magento\CatalogInventory\Model\ResourceModel\Stock\Item::updateSetInStock
 
-      * @param int|string $website
 
-      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 
-      * @return void
 
-      */
 
-     public function updateSetInStock($website)
 
-     {
 
-         $websiteId = $this->stockConfiguration->getDefaultScopeId();
 
-         $this->_initConfig();
 
-         $connection = $this->getConnection();
 
-         $values = ['is_in_stock' => 1];
 
-         $select = $connection->select()->from($this->getTable('catalog_product_entity'), 'entity_id')
 
-             ->where('type_id IN(?)', $this->_configTypeIds);
 
-         $where = sprintf(
 
-             'website_id = %1$d' .
 
-             ' AND is_in_stock = 0' .
 
-             ' AND stock_status_changed_auto = 1' .
 
-             ' AND ((use_config_manage_stock = 1 AND 1 = %2$d) OR (use_config_manage_stock = 0 AND manage_stock = 1))' .
 
-             ' AND ((use_config_min_qty = 1 AND qty > %3$d) OR (use_config_min_qty = 0 AND qty > min_qty))' .
 
-             ' AND product_id IN (%4$s)',
 
-             $websiteId,
 
-             $this->_isConfigManageStock,
 
-             $this->_configMinQty,
 
-             $select->assemble()
 
-         );
 
-         $connection->update($this->getTable('cataloginventory_stock_item'), $values, $where);
 
-     }
 
-     /**
 
-      * Update items low stock date basing on their quantities and config settings
 
-      *
 
-      * @deprecated 100.2.5
 
-      * @see \Magento\CatalogInventory\Model\ResourceModel\Stock\Item::updateLowStockDate
 
-      * @param int|string $website
 
-      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 
-      * @return void
 
-      */
 
-     public function updateLowStockDate($website)
 
-     {
 
-         $websiteId = $this->stockConfiguration->getDefaultScopeId();
 
-         $this->_initConfig();
 
-         $connection = $this->getConnection();
 
-         $condition = $connection->quoteInto(
 
-             '(use_config_notify_stock_qty = 1 AND qty < ?)',
 
-             $this->_configNotifyStockQty
 
-         ) . ' OR (use_config_notify_stock_qty = 0 AND qty < notify_stock_qty)';
 
-         $currentDbTime = $connection->quoteInto('?', $this->dateTime->gmtDate());
 
-         $conditionalDate = $connection->getCheckSql($condition, $currentDbTime, 'NULL');
 
-         $value = ['low_stock_date' => new \Zend_Db_Expr($conditionalDate)];
 
-         $select = $connection->select()->from($this->getTable('catalog_product_entity'), 'entity_id')
 
-             ->where('type_id IN(?)', $this->_configTypeIds);
 
-         $where = sprintf(
 
-             'website_id = %1$d' .
 
-             ' AND ((use_config_manage_stock = 1 AND 1 = %2$d) OR (use_config_manage_stock = 0 AND manage_stock = 1))' .
 
-             ' AND product_id IN (%3$s)',
 
-             $websiteId,
 
-             $this->_isConfigManageStock,
 
-             $select->assemble()
 
-         );
 
-         $connection->update($this->getTable('cataloginventory_stock_item'), $value, $where);
 
-     }
 
-     /**
 
-      * Add low stock filter to product collection
 
-      *
 
-      * @param \Magento\Catalog\Model\ResourceModel\Product\Collection $collection
 
-      * @param array $fields
 
-      * @return $this
 
-      */
 
-     public function addLowStockFilter(\Magento\Catalog\Model\ResourceModel\Product\Collection $collection, $fields)
 
-     {
 
-         $this->_initConfig();
 
-         $connection = $collection->getSelect()->getConnection();
 
-         $qtyIf = $connection->getCheckSql(
 
-             'invtr.use_config_notify_stock_qty > 0',
 
-             $this->_configNotifyStockQty,
 
-             'invtr.notify_stock_qty'
 
-         );
 
-         $conditions = [
 
-             [
 
-                 $connection->prepareSqlCondition('invtr.use_config_manage_stock', 1),
 
-                 $connection->prepareSqlCondition($this->_isConfigManageStock, 1),
 
-                 $connection->prepareSqlCondition('invtr.qty', ['lt' => $qtyIf]),
 
-             ],
 
-             [
 
-                 $connection->prepareSqlCondition('invtr.use_config_manage_stock', 0),
 
-                 $connection->prepareSqlCondition('invtr.manage_stock', 1)
 
-             ],
 
-         ];
 
-         $where = [];
 
-         foreach ($conditions as $k => $part) {
 
-             $where[$k] = join(' ' . \Magento\Framework\DB\Select::SQL_AND . ' ', $part);
 
-         }
 
-         $where = $connection->prepareSqlCondition(
 
-             'invtr.low_stock_date',
 
-             ['notnull' => true]
 
-         ) . ' ' . \Magento\Framework\DB\Select::SQL_AND . ' ((' . join(
 
-             ') ' . \Magento\Framework\DB\Select::SQL_OR . ' (',
 
-             $where
 
-         ) . '))';
 
-         $collection->joinTable(
 
-             ['invtr' => 'cataloginventory_stock_item'],
 
-             'product_id = entity_id',
 
-             $fields,
 
-             $where
 
-         );
 
-         return $this;
 
-     }
 
- }
 
 
  |