diff --git a/app/code/Magento/Inventory/Controller/Adminhtml/Stock/Save.php b/app/code/Magento/Inventory/Controller/Adminhtml/Stock/Save.php index 5ac8de22a195..c4188a362c70 100644 --- a/app/code/Magento/Inventory/Controller/Adminhtml/Stock/Save.php +++ b/app/code/Magento/Inventory/Controller/Adminhtml/Stock/Save.php @@ -10,6 +10,7 @@ use Magento\Backend\App\Action\Context; use Magento\Framework\Api\DataObjectHelper; use Magento\Framework\Controller\Result\Redirect; +use Magento\Framework\EntityManager\EventManager; use Magento\Framework\Exception\CouldNotSaveException; use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\NoSuchEntityException; @@ -48,25 +49,33 @@ class Save extends Action */ private $stockSourceLinkProcessor; + /** + * @var EventManager + */ + private $eventManager; + /** * @param Context $context * @param StockInterfaceFactory $stockFactory * @param StockRepositoryInterface $stockRepository * @param DataObjectHelper $sourceHydrator * @param StockSourceLinkProcessor $stockSourceLinkProcessor + * @param EventManager $eventManager */ public function __construct( Context $context, StockInterfaceFactory $stockFactory, StockRepositoryInterface $stockRepository, DataObjectHelper $sourceHydrator, - StockSourceLinkProcessor $stockSourceLinkProcessor + StockSourceLinkProcessor $stockSourceLinkProcessor, + EventManager $eventManager ) { parent::__construct($context); $this->stockFactory = $stockFactory; $this->stockRepository = $stockRepository; $this->dataObjectHelper = $sourceHydrator; $this->stockSourceLinkProcessor = $stockSourceLinkProcessor; + $this->eventManager = $eventManager; } /** @@ -126,6 +135,13 @@ private function processSave(array $requestData, int $stockId = null): int $stock = $this->stockRepository->get($stockId); } $this->dataObjectHelper->populateWithArray($stock, $requestData['general'], StockInterface::class); + $this->eventManager->dispatch( + 'save_stock_controller_populate_stock_with_data', + [ + 'request_data' => $requestData, + 'stock' => $stock, + ] + ); $stockId = $this->stockRepository->save($stock); $assignedSources = diff --git a/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_source_listing.xml b/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_source_listing.xml index cc0d8fa8f353..fb593ae7678c 100644 --- a/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_source_listing.xml +++ b/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_source_listing.xml @@ -268,7 +268,7 @@ - + inventory/source/edit diff --git a/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_stock_listing.xml b/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_stock_listing.xml index 04001ecf931f..b758548cc060 100644 --- a/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_stock_listing.xml +++ b/app/code/Magento/Inventory/view/adminhtml/ui_component/inventory_stock_listing.xml @@ -118,7 +118,7 @@ - + inventory/stock/edit diff --git a/app/code/Magento/InventorySales/Observer/Stock/PopulateWithWebsiteSalesChannelsObserver.php b/app/code/Magento/InventorySales/Observer/Stock/PopulateWithWebsiteSalesChannelsObserver.php new file mode 100644 index 000000000000..eb1242c9c0ea --- /dev/null +++ b/app/code/Magento/InventorySales/Observer/Stock/PopulateWithWebsiteSalesChannelsObserver.php @@ -0,0 +1,81 @@ +salesChannelFactory = $salesChannelFactory; + } + + /** + * Populate stock with sales channels during saving via controller + * + * @param EventObserver $observer + * @return void + */ + public function execute(EventObserver $observer) + { + /** @var StockInterface $stock */ + $stock = $observer->getEvent()->getStock(); + $requestData = $observer->getEvent()->getRequestData(); + + $extensionAttributes = $stock->getExtensionAttributes(); + $assignedSalesChannels = $extensionAttributes->getSalesChannels(); + + foreach ($assignedSalesChannels as $key => $assignedSalesChannel) { + if ($assignedSalesChannel->getType() === SalesChannelInterface::TYPE_WEBSITE) { + unset($assignedSalesChannels[$key]); + } + } + + if (isset($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE]) + && is_array($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE]) + ) { + foreach ($requestData['sales_channels'][SalesChannelInterface::TYPE_WEBSITE] as $websiteCode) { + $assignedSalesChannels[] = $this->createSalesChannelByWebsiteCode($websiteCode); + } + } + $extensionAttributes->setSalesChannels($assignedSalesChannels); + } + + /** + * Create the sales channel by given website code + * + * @param string $websiteCode + * @return SalesChannelInterface + */ + private function createSalesChannelByWebsiteCode(string $websiteCode): SalesChannelInterface + { + $salesChannel = $this->salesChannelFactory->create(); + $salesChannel->setCode($websiteCode); + $salesChannel->setType(SalesChannelInterface::TYPE_WEBSITE); + return $salesChannel; + } +} diff --git a/app/code/Magento/InventorySales/Plugin/Inventory/Ui/StockDataProvider/SalesChannels.php b/app/code/Magento/InventorySales/Plugin/Inventory/Ui/StockDataProvider/SalesChannels.php index 1b348a95106b..21265a54e6cc 100644 --- a/app/code/Magento/InventorySales/Plugin/Inventory/Ui/StockDataProvider/SalesChannels.php +++ b/app/code/Magento/InventorySales/Plugin/Inventory/Ui/StockDataProvider/SalesChannels.php @@ -7,13 +7,37 @@ namespace Magento\InventorySales\Plugin\Inventory\Ui\StockDataProvider; +use Magento\CatalogInventory\Model\Stock\StockRepository; use Magento\Inventory\Ui\DataProvider\StockDataProvider; +use Magento\InventorySales\Model\GetAssignedSalesChannelsForStockInterface; /** * Customize stock form. Add sales channels data */ class SalesChannels { + /** + * @var GetAssignedSalesChannelsForStockInterface + */ + private $getAssignedSalesChannelsForStock; + + /** + * @var StockRepository + */ + private $stockRepository; + + /** + * @param GetAssignedSalesChannelsForStockInterface $getAssignedSalesChannelsForStock + * @param StockRepository $stockRepository + */ + public function __construct( + GetAssignedSalesChannelsForStockInterface $getAssignedSalesChannelsForStock, + StockRepository $stockRepository + ) { + $this->getAssignedSalesChannelsForStock = $getAssignedSalesChannelsForStock; + $this->stockRepository = $stockRepository; + } + /** * @param StockDataProvider $subject * @param array $data @@ -23,12 +47,18 @@ public function afterGetData(StockDataProvider $subject, array $data): array { if ('inventory_stock_form_data_source' === $subject->getName()) { foreach ($data as &$stockData) { - $stockData['sales_channels'] = $this->getSalesChannelsDataForStock(); + $salesChannelsData = $this->getSalesChannelsDataForStock($stockData['general']); + if (count($salesChannelsData)) { + $stockData['sales_channels'] = $salesChannelsData; + } } unset($stockData); } elseif ($data['totalRecords'] > 0) { foreach ($data['items'] as &$stockData) { - $stockData['sales_channels'] = $this->getSalesChannelsDataForStock(); + $salesChannelsData = $this->getSalesChannelsDataForStock($stockData); + if (count($salesChannelsData)) { + $stockData['sales_channels'] = $salesChannelsData; + } } unset($stockData); } @@ -36,13 +66,17 @@ public function afterGetData(StockDataProvider $subject, array $data): array } /** + * @param array $stock * @return array */ - private function getSalesChannelsDataForStock(): array + private function getSalesChannelsDataForStock(array $stock): array { - // @todo: replace on real data - return [ - 'websites' => ['base'], - ]; + $salesChannelsData = []; + foreach ($stock['extension_attributes'] as $salesChannels) { + foreach ($salesChannels as $salesChannel) { + $salesChannelsData[$salesChannel['type']][] = $salesChannel['code']; + } + } + return $salesChannelsData; } } diff --git a/app/code/Magento/InventorySales/Ui/Component/Listing/Column/SalesChannels.php b/app/code/Magento/InventorySales/Ui/Component/Listing/Column/SalesChannels.php index 1c5581567e52..6c6d4ee93c78 100644 --- a/app/code/Magento/InventorySales/Ui/Component/Listing/Column/SalesChannels.php +++ b/app/code/Magento/InventorySales/Ui/Component/Listing/Column/SalesChannels.php @@ -7,42 +7,74 @@ namespace Magento\InventorySales\Ui\Component\Listing\Column; +use Magento\InventorySales\Ui\SalesChannelNameResolverInterface; use Magento\Ui\Component\Listing\Columns\Column; +use Magento\Framework\View\Element\UiComponentFactory; +use Magento\Framework\View\Element\UiComponent\ContextInterface; /** - * Add grid column for sales channels + * Add grid column for sales channels. Prepare data */ class SalesChannels extends Column { /** - * Prepare column value - * - * @param array $salesChannelData - * @return string + * @var SalesChannelNameResolverInterface */ - private function prepareStockChannelData(array $salesChannelData) - { - $websiteData = ''; - foreach ($salesChannelData as $key => $channelData) { - $websiteData .= $key . ': ' . implode(',', $channelData); - } - return $websiteData; + private $salesChannelNameResolver; + + /** + * @param ContextInterface $context + * @param UiComponentFactory $uiComponentFactory + * @param SalesChannelNameResolverInterface $salesChannelNameResolver + * @param array $components + * @param array $data + */ + public function __construct( + ContextInterface $context, + UiComponentFactory $uiComponentFactory, + SalesChannelNameResolverInterface $salesChannelNameResolver, + array $components = [], + array $data = [] + ) { + parent::__construct($context, $uiComponentFactory, $components, $data); + $this->salesChannelNameResolver = $salesChannelNameResolver; } /** - * @inheritdoc + * Prepare data source + * + * @param array $dataSource + * @return array */ public function prepareDataSource(array $dataSource) { if ($dataSource['data']['totalRecords'] > 0) { foreach ($dataSource['data']['items'] as &$row) { - if (isset($row['sales_channels'])) { - $row['sales_channels'] = $this->prepareStockChannelData($row['sales_channels']); - } + $row['sales_channels'] = $this->prepareSalesChannelData($row['sales_channels']); } } unset($row); return $dataSource; } + + /** + * Prepare sales value + * + * @param array $salesChannelData + * @return array + */ + private function prepareSalesChannelData(array $salesChannelData): array + { + $preparedChannelData = []; + foreach ($salesChannelData as $type => $salesChannel) { + foreach ($salesChannel as $code) { + $preparedChannelData[$type][] = [ + 'name' => $this->salesChannelNameResolver->resolve($type, $code), + 'code' => $code, + ]; + } + } + return $preparedChannelData; + } } diff --git a/app/code/Magento/InventorySales/Ui/SalesChannelNameResolverInterface.php b/app/code/Magento/InventorySales/Ui/SalesChannelNameResolverInterface.php new file mode 100644 index 000000000000..b8a055b9c269 --- /dev/null +++ b/app/code/Magento/InventorySales/Ui/SalesChannelNameResolverInterface.php @@ -0,0 +1,23 @@ +websiteRepository = $websiteRepository; + } + + /** + * @inheritdoc + */ + public function resolve(string $type, string $code): string + { + return SalesChannelInterface::TYPE_WEBSITE === $type ? $this->websiteRepository->get($code)->getName() : $code; + } +} diff --git a/app/code/Magento/InventorySales/etc/adminhtml/events.xml b/app/code/Magento/InventorySales/etc/adminhtml/events.xml new file mode 100644 index 000000000000..f8a8d2a22cc2 --- /dev/null +++ b/app/code/Magento/InventorySales/etc/adminhtml/events.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/app/code/Magento/InventorySales/etc/di.xml b/app/code/Magento/InventorySales/etc/di.xml index 20de14b1d48a..962fbdc81230 100644 --- a/app/code/Magento/InventorySales/etc/di.xml +++ b/app/code/Magento/InventorySales/etc/di.xml @@ -10,9 +10,13 @@ + + + + diff --git a/app/code/Magento/InventorySales/view/adminhtml/ui_component/inventory_stock_form.xml b/app/code/Magento/InventorySales/view/adminhtml/ui_component/inventory_stock_form.xml index 08e14fc318aa..4312e5ca7e5f 100644 --- a/app/code/Magento/InventorySales/view/adminhtml/ui_component/inventory_stock_form.xml +++ b/app/code/Magento/InventorySales/view/adminhtml/ui_component/inventory_stock_form.xml @@ -6,11 +6,6 @@ */ -->
- - -