CopySourceItemsPlugin.php 3.4 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\InventoryCatalogAdminUi\Plugin\Catalog;
  8. use Magento\Catalog\Model\Product;
  9. use Magento\Catalog\Model\Product\Attribute\Source\Status;
  10. use Magento\Catalog\Model\Product\Copier;
  11. use Magento\Framework\Api\SearchCriteriaBuilder;
  12. use Magento\Framework\Api\SearchCriteriaBuilderFactory;
  13. use Magento\InventoryApi\Api\Data\SourceItemInterface;
  14. use Magento\InventoryApi\Api\SourceItemRepositoryInterface;
  15. use Magento\InventoryCatalogAdminUi\Observer\SourceItemsProcessor;
  16. /**
  17. * Copies source items from the original product to the duplicate
  18. */
  19. class CopySourceItemsPlugin
  20. {
  21. /**
  22. * @var SourceItemRepositoryInterface
  23. */
  24. private $sourceItemRepository;
  25. /**
  26. * @var SearchCriteriaBuilderFactory
  27. */
  28. private $searchCriteriaBuilderFactory;
  29. /**
  30. * @var SourceItemsProcessor
  31. */
  32. private $sourceItemsProcessor;
  33. /**
  34. * @param SourceItemRepositoryInterface $sourceItemRepository
  35. * @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
  36. * @param SourceItemsProcessor $sourceItemsProcessor
  37. */
  38. public function __construct(
  39. SourceItemRepositoryInterface $sourceItemRepository,
  40. SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
  41. SourceItemsProcessor $sourceItemsProcessor
  42. ) {
  43. $this->sourceItemRepository = $sourceItemRepository;
  44. $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
  45. $this->sourceItemsProcessor = $sourceItemsProcessor;
  46. }
  47. /**
  48. * @param Copier $subject
  49. * @param Product $result
  50. * @param Product $product
  51. * @return Product $result
  52. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  53. */
  54. public function afterCopy(
  55. Copier $subject,
  56. Product $result,
  57. Product $product
  58. ) {
  59. $this->copySourceItems($product->getSku(), $result->getSku());
  60. $result->setStatus(Status::STATUS_DISABLED);
  61. return $result;
  62. }
  63. /**
  64. * @param string $sku
  65. * @return array
  66. */
  67. private function getSourceItems(string $sku): array
  68. {
  69. /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
  70. $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create();
  71. $searchCriteria = $searchCriteriaBuilder
  72. ->addFilter(SourceItemInterface::SKU, $sku)
  73. ->create();
  74. return $this->sourceItemRepository->getList($searchCriteria)->getItems();
  75. }
  76. /**
  77. * @param string $originalSku
  78. * @param string $duplicateSku
  79. */
  80. private function copySourceItems(string $originalSku, string $duplicateSku)
  81. {
  82. $sourceItems = $this->getSourceItems($originalSku);
  83. $duplicateItemData = [];
  84. if ($sourceItems) {
  85. foreach ($sourceItems as $sourceItem) {
  86. $duplicateItemData[] = [
  87. SourceItemInterface::SKU => $duplicateSku,
  88. SourceItemInterface::SOURCE_CODE => $sourceItem->getSourceCode(),
  89. SourceItemInterface::QUANTITY => $sourceItem->getQuantity(),
  90. SourceItemInterface::STATUS => $sourceItem->getStatus()
  91. ];
  92. }
  93. }
  94. $this->sourceItemsProcessor->process(
  95. $duplicateSku,
  96. $duplicateItemData
  97. );
  98. }
  99. }