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 @@
*/
-->