GetSkuListInStock.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryIndexer\Indexer\SourceItem;
  8. use Magento\Framework\App\ResourceConnection;
  9. use Magento\Inventory\Model\ResourceModel\SourceItem as SourceItemResourceModel;
  10. use Magento\Inventory\Model\ResourceModel\StockSourceLink as StockSourceLinkResourceModel;
  11. use Magento\Inventory\Model\StockSourceLink;
  12. use Magento\InventoryApi\Api\Data\SourceItemInterface;
  13. /**
  14. * Returns relations between stock and sku list
  15. */
  16. class GetSkuListInStock
  17. {
  18. /**
  19. * @var ResourceConnection
  20. */
  21. private $resourceConnection;
  22. /**
  23. * @var SkuListInStockFactory
  24. */
  25. private $skuListInStockFactory;
  26. /**
  27. * @var int
  28. */
  29. private $groupConcatMaxLen;
  30. /**
  31. * GetSkuListInStock constructor.
  32. *
  33. * @param ResourceConnection $resourceConnection
  34. * @param SkuListInStockFactory $skuListInStockFactory
  35. * @param int $groupConcatMaxLen
  36. */
  37. public function __construct(
  38. ResourceConnection $resourceConnection,
  39. SkuListInStockFactory $skuListInStockFactory,
  40. int $groupConcatMaxLen
  41. ) {
  42. $this->resourceConnection = $resourceConnection;
  43. $this->skuListInStockFactory = $skuListInStockFactory;
  44. $this->groupConcatMaxLen = $groupConcatMaxLen;
  45. }
  46. /**
  47. * Returns all assigned Stock ids by given Source Item ids
  48. *
  49. * @param int[] $sourceItemIds
  50. * @return SkuListInStock[] List of stock id to sku1,sku2 assignment
  51. */
  52. public function execute(array $sourceItemIds): array
  53. {
  54. $connection = $this->resourceConnection->getConnection();
  55. $sourceStockLinkTable = $this->resourceConnection->getTableName(
  56. StockSourceLinkResourceModel::TABLE_NAME_STOCK_SOURCE_LINK
  57. );
  58. $sourceItemTable = $this->resourceConnection->getTableName(
  59. SourceItemResourceModel::TABLE_NAME_SOURCE_ITEM
  60. );
  61. $select = $connection
  62. ->select()
  63. ->from(
  64. ['source_item' => $sourceItemTable],
  65. [
  66. SourceItemInterface::SKU =>
  67. sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR ',')", 'source_item.' . SourceItemInterface::SKU)
  68. ]
  69. )->joinInner(
  70. ['stock_source_link' => $sourceStockLinkTable],
  71. sprintf(
  72. 'source_item.%s = stock_source_link.%s',
  73. SourceItemInterface::SOURCE_CODE,
  74. StockSourceLink::SOURCE_CODE
  75. ),
  76. [StockSourceLink::STOCK_ID]
  77. )->where('source_item.source_item_id IN (?)', $sourceItemIds)
  78. ->group(['stock_source_link.' . StockSourceLink::STOCK_ID]);
  79. $connection->query('SET group_concat_max_len = ' . $this->groupConcatMaxLen);
  80. $items = $connection->fetchAll($select);
  81. return $this->getStockIdToSkuList($items);
  82. }
  83. /**
  84. * Return the assigned stock id to sku list
  85. *
  86. * @param array $items
  87. * @return SkuListInStock[]
  88. */
  89. private function getStockIdToSkuList(array $items): array
  90. {
  91. $skuListInStockList = [];
  92. foreach ($items as $item) {
  93. /** @var SkuListInStock $skuListInStock */
  94. $skuListInStock = $this->skuListInStockFactory->create();
  95. $skuListInStock->setStockId((int)$item[StockSourceLink::STOCK_ID]);
  96. $skuListInStock->setSkuList(explode(',', $item[SourceItemInterface::SKU]));
  97. $skuListInStockList[] = $skuListInStock;
  98. }
  99. return $skuListInStockList;
  100. }
  101. }