| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | 
							- <?php
 
- /**
 
-  * Copyright © Magento, Inc. All rights reserved.
 
-  * See COPYING.txt for license details.
 
-  */
 
- declare(strict_types=1);
 
- namespace Magento\InventoryCatalogAdminUi\Observer;
 
- use Magento\Catalog\Api\Data\ProductInterface;
 
- use Magento\Framework\Api\DataObjectHelper;
 
- use Magento\Framework\Api\SearchCriteriaBuilder;
 
- use Magento\Framework\Api\SearchCriteriaBuilderFactory;
 
- use Magento\Framework\Exception\InputException;
 
- use Magento\InventoryApi\Api\Data\SourceItemInterface;
 
- use Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory;
 
- use Magento\InventoryApi\Api\SourceItemRepositoryInterface;
 
- use Magento\InventoryApi\Api\SourceItemsDeleteInterface;
 
- use Magento\InventoryApi\Api\SourceItemsSaveInterface;
 
- /**
 
-  * At the time of processing Product save form this class used to save source items correctly
 
-  * Perform replace strategy of sources for the product
 
-  */
 
- class SourceItemsProcessor
 
- {
 
-     /**
 
-      * @var SearchCriteriaBuilderFactory
 
-      */
 
-     private $searchCriteriaBuilderFactory;
 
-     /**
 
-      * @var SourceItemRepositoryInterface
 
-      */
 
-     private $sourceItemRepository;
 
-     /**
 
-      * @var SourceItemInterfaceFactory
 
-      */
 
-     private $sourceItemFactory;
 
-     /**
 
-      * @var DataObjectHelper
 
-      */
 
-     private $dataObjectHelper;
 
-     /**
 
-      * @var SourceItemsSaveInterface
 
-      */
 
-     private $sourceItemsSave;
 
-     /**
 
-      * @var SourceItemsDeleteInterface
 
-      */
 
-     private $sourceItemsDelete;
 
-     /**
 
-      * @param SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory
 
-      * @param SourceItemRepositoryInterface $sourceItemRepository
 
-      * @param SourceItemInterfaceFactory $sourceItemFactory
 
-      * @param DataObjectHelper $dataObjectHelper
 
-      * @param SourceItemsSaveInterface $sourceItemsSave
 
-      * @param SourceItemsDeleteInterface $sourceItemsDelete
 
-      */
 
-     public function __construct(
 
-         SearchCriteriaBuilderFactory $searchCriteriaBuilderFactory,
 
-         SourceItemRepositoryInterface $sourceItemRepository,
 
-         SourceItemInterfaceFactory $sourceItemFactory,
 
-         DataObjectHelper $dataObjectHelper,
 
-         SourceItemsSaveInterface $sourceItemsSave,
 
-         SourceItemsDeleteInterface $sourceItemsDelete
 
-     ) {
 
-         $this->searchCriteriaBuilderFactory = $searchCriteriaBuilderFactory;
 
-         $this->sourceItemRepository = $sourceItemRepository;
 
-         $this->sourceItemFactory = $sourceItemFactory;
 
-         $this->dataObjectHelper = $dataObjectHelper;
 
-         $this->sourceItemsSave = $sourceItemsSave;
 
-         $this->sourceItemsDelete = $sourceItemsDelete;
 
-     }
 
-     /**
 
-      * @param string $sku
 
-      * @param array $sourceItemsData
 
-      * @return void
 
-      * @throws InputException
 
-      */
 
-     public function process($sku, array $sourceItemsData)
 
-     {
 
-         $sourceItemsForDelete = $this->getCurrentSourceItemsMap($sku);
 
-         $sourceItemsForSave = [];
 
-         foreach ($sourceItemsData as $sourceItemData) {
 
-             $this->validateSourceItemData($sourceItemData);
 
-             $sourceCode = $sourceItemData[SourceItemInterface::SOURCE_CODE];
 
-             if (isset($sourceItemsForDelete[$sourceCode])) {
 
-                 $sourceItem = $sourceItemsForDelete[$sourceCode];
 
-             } else {
 
-                 /** @var SourceItemInterface $sourceItem */
 
-                 $sourceItem = $this->sourceItemFactory->create();
 
-             }
 
-             $sourceItemData[SourceItemInterface::SKU] = $sku;
 
-             $this->dataObjectHelper->populateWithArray($sourceItem, $sourceItemData, SourceItemInterface::class);
 
-             $sourceItemsForSave[] = $sourceItem;
 
-             unset($sourceItemsForDelete[$sourceCode]);
 
-         }
 
-         if ($sourceItemsForSave) {
 
-             $this->sourceItemsSave->execute($sourceItemsForSave);
 
-         }
 
-         if ($sourceItemsForDelete) {
 
-             $this->sourceItemsDelete->execute($sourceItemsForDelete);
 
-         }
 
-     }
 
-     /**
 
-      * Get Source Items Hash Table by SKU
 
-      *
 
-      * @param string $sku
 
-      * @return SourceItemInterface[]
 
-      */
 
-     private function getCurrentSourceItemsMap(string $sku): array
 
-     {
 
-         /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
 
-         $searchCriteriaBuilder = $this->searchCriteriaBuilderFactory->create();
 
-         $searchCriteria = $searchCriteriaBuilder->addFilter(ProductInterface::SKU, $sku)->create();
 
-         $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
 
-         $sourceItemMap = [];
 
-         if ($sourceItems) {
 
-             foreach ($sourceItems as $sourceItem) {
 
-                 $sourceItemMap[$sourceItem->getSourceCode()] = $sourceItem;
 
-             }
 
-         }
 
-         return $sourceItemMap;
 
-     }
 
-     /**
 
-      * @param array $sourceItemData
 
-      * @return void
 
-      * @throws InputException
 
-      */
 
-     private function validateSourceItemData(array $sourceItemData)
 
-     {
 
-         if (!isset($sourceItemData[SourceItemInterface::SOURCE_CODE])) {
 
-             throw new InputException(__('Wrong Product to Source relation parameters given.'));
 
-         }
 
-     }
 
- }
 
 
  |