123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\InventoryIndexer\Indexer\SourceItem;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Inventory\Model\ResourceModel\SourceItem as SourceItemResourceModel;
- use Magento\Inventory\Model\ResourceModel\StockSourceLink as StockSourceLinkResourceModel;
- use Magento\Inventory\Model\StockSourceLink;
- use Magento\InventoryApi\Api\Data\SourceItemInterface;
- /**
- * Returns relations between stock and sku list
- */
- class GetSkuListInStock
- {
- /**
- * @var ResourceConnection
- */
- private $resourceConnection;
- /**
- * @var SkuListInStockFactory
- */
- private $skuListInStockFactory;
- /**
- * @var int
- */
- private $groupConcatMaxLen;
- /**
- * GetSkuListInStock constructor.
- *
- * @param ResourceConnection $resourceConnection
- * @param SkuListInStockFactory $skuListInStockFactory
- * @param int $groupConcatMaxLen
- */
- public function __construct(
- ResourceConnection $resourceConnection,
- SkuListInStockFactory $skuListInStockFactory,
- int $groupConcatMaxLen
- ) {
- $this->resourceConnection = $resourceConnection;
- $this->skuListInStockFactory = $skuListInStockFactory;
- $this->groupConcatMaxLen = $groupConcatMaxLen;
- }
- /**
- * Returns all assigned Stock ids by given Source Item ids
- *
- * @param int[] $sourceItemIds
- * @return SkuListInStock[] List of stock id to sku1,sku2 assignment
- */
- public function execute(array $sourceItemIds): array
- {
- $connection = $this->resourceConnection->getConnection();
- $sourceStockLinkTable = $this->resourceConnection->getTableName(
- StockSourceLinkResourceModel::TABLE_NAME_STOCK_SOURCE_LINK
- );
- $sourceItemTable = $this->resourceConnection->getTableName(
- SourceItemResourceModel::TABLE_NAME_SOURCE_ITEM
- );
- $select = $connection
- ->select()
- ->from(
- ['source_item' => $sourceItemTable],
- [
- SourceItemInterface::SKU =>
- sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR ',')", 'source_item.' . SourceItemInterface::SKU)
- ]
- )->joinInner(
- ['stock_source_link' => $sourceStockLinkTable],
- sprintf(
- 'source_item.%s = stock_source_link.%s',
- SourceItemInterface::SOURCE_CODE,
- StockSourceLink::SOURCE_CODE
- ),
- [StockSourceLink::STOCK_ID]
- )->where('source_item.source_item_id IN (?)', $sourceItemIds)
- ->group(['stock_source_link.' . StockSourceLink::STOCK_ID]);
- $connection->query('SET group_concat_max_len = ' . $this->groupConcatMaxLen);
- $items = $connection->fetchAll($select);
- return $this->getStockIdToSkuList($items);
- }
- /**
- * Return the assigned stock id to sku list
- *
- * @param array $items
- * @return SkuListInStock[]
- */
- private function getStockIdToSkuList(array $items): array
- {
- $skuListInStockList = [];
- foreach ($items as $item) {
- /** @var SkuListInStock $skuListInStock */
- $skuListInStock = $this->skuListInStockFactory->create();
- $skuListInStock->setStockId((int)$item[StockSourceLink::STOCK_ID]);
- $skuListInStock->setSkuList(explode(',', $item[SourceItemInterface::SKU]));
- $skuListInStockList[] = $skuListInStock;
- }
- return $skuListInStockList;
- }
- }
|