Skip to content

Commit c5f3252

Browse files
author
Valeriy Nayda
authored
Merge pull request #165 from magento-engcom/msi-website-default-stock
Assign Website at the time of Creation to the Default Stock
2 parents fc4a71b + 0698655 commit c5f3252

15 files changed

+536
-15
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Model;
9+
10+
/**
11+
* Delete link between Stock and Sales Channel (Service Provider Interface - SPI)
12+
*
13+
* @api
14+
*/
15+
interface DeleteSalesChannelToStockLinkInterface
16+
{
17+
/**
18+
* @param string $type
19+
* @param string $code
20+
* @return void
21+
*/
22+
public function execute(string $type, string $code);
23+
}

app/code/Magento/InventorySales/Model/GetAssignedSalesChannelsForStock.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
namespace Magento\InventorySales\Model;
99

1010
use Magento\InventorySales\Model\ResourceModel\GetAssignedSalesChannelsDataForStock;
11-
use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
1211
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
12+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
1313

1414
/**
1515
* @inheritdoc
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Model;
9+
10+
/**
11+
* Get assigned Stock id for Website (Service Provider Interface - SPI)
12+
*
13+
* @api
14+
*/
15+
interface GetAssignedStockIdForWebsiteInterface
16+
{
17+
/**
18+
* Get assigned stock to website
19+
*
20+
* @param string $websiteCode
21+
* @return int|null
22+
*/
23+
public function execute(string $websiteCode);
24+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Model\ResourceModel;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\InventorySales\Model\DeleteSalesChannelToStockLinkInterface;
12+
use Magento\InventorySales\Setup\Operation\CreateSalesChannelTable;
13+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
14+
15+
/**
16+
* Implementation of link deleting between Stock and Sales Channels for specific db layer
17+
*
18+
* There is no additional business logic on SPI (Service Provider Interface) level so could use resource model as
19+
* SPI implementation directly
20+
*/
21+
class DeleteSalesChannelToStockLink implements DeleteSalesChannelToStockLinkInterface
22+
{
23+
/**
24+
* @var ResourceConnection
25+
*/
26+
private $resourceConnection;
27+
28+
/**
29+
* @param ResourceConnection $resourceConnection
30+
*/
31+
public function __construct(
32+
ResourceConnection $resourceConnection
33+
) {
34+
$this->resourceConnection = $resourceConnection;
35+
}
36+
37+
/**
38+
* @inheritdoc
39+
*/
40+
public function execute(string $type, string $code)
41+
{
42+
$connection = $this->resourceConnection->getConnection();
43+
$tableName = $this->resourceConnection->getTableName(CreateSalesChannelTable::TABLE_NAME_SALES_CHANNEL);
44+
45+
$connection->delete($tableName, [
46+
SalesChannelInterface::TYPE . ' = ?' => $type,
47+
SalesChannelInterface::CODE . ' = ?' => $code,
48+
]);
49+
}
50+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Model\ResourceModel;
9+
10+
use Magento\Framework\App\ResourceConnection;
11+
use Magento\InventorySales\Model\GetAssignedStockIdForWebsiteInterface;
12+
use Magento\InventorySales\Setup\Operation\CreateSalesChannelTable;
13+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
14+
15+
/**
16+
* @inheritdoc
17+
*/
18+
class GetAssignedStockIdForWebsite implements GetAssignedStockIdForWebsiteInterface
19+
{
20+
/**
21+
* @var ResourceConnection
22+
*/
23+
private $resourceConnection;
24+
25+
/**
26+
* @param ResourceConnection $resourceConnection
27+
*/
28+
public function __construct(
29+
ResourceConnection $resourceConnection
30+
) {
31+
$this->resourceConnection = $resourceConnection;
32+
}
33+
34+
/**
35+
* @inheritdoc
36+
*/
37+
public function execute(string $websiteCode)
38+
{
39+
$connection = $this->resourceConnection->getConnection();
40+
$tableName = $this->resourceConnection->getTableName(CreateSalesChannelTable::TABLE_NAME_SALES_CHANNEL);
41+
42+
$select = $connection->select()
43+
->from($tableName, [CreateSalesChannelTable::STOCK_ID])
44+
->where('code = ?', $websiteCode)
45+
->where('type = ?', SalesChannelInterface::TYPE_WEBSITE);
46+
47+
$result = $connection->fetchCol($select);
48+
49+
if (count($result) === 0) {
50+
return null;
51+
}
52+
return reset($result);
53+
}
54+
}

app/code/Magento/InventorySales/Model/ResourceModel/ReplaceSalesChannelsDataForStock.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,7 @@ public function __construct(
3535
}
3636

3737
/**
38-
* Replace Sales Channels for Stock
39-
*
40-
* @param SalesChannelInterface[] $salesChannels
41-
* @param int $stockId
42-
* @return void
38+
* @inheritdoc
4339
*/
4440
public function execute(array $salesChannels, int $stockId)
4541
{

app/code/Magento/InventorySales/Observer/Stock/PopulateWithWebsiteSalesChannelsObserver.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,11 @@ public function execute(EventObserver $observer)
4949
$extensionAttributes = $stock->getExtensionAttributes();
5050
$assignedSalesChannels = $extensionAttributes->getSalesChannels();
5151

52-
foreach ($assignedSalesChannels as $key => $assignedSalesChannel) {
53-
if ($assignedSalesChannel->getType() === SalesChannelInterface::TYPE_WEBSITE) {
54-
unset($assignedSalesChannels[$key]);
52+
if (null !== $assignedSalesChannels) {
53+
foreach ($assignedSalesChannels as $key => $assignedSalesChannel) {
54+
if ($assignedSalesChannel->getType() === SalesChannelInterface::TYPE_WEBSITE) {
55+
unset($assignedSalesChannels[$key]);
56+
}
5557
}
5658
}
5759

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Observer\Website;
9+
10+
use Magento\Framework\Event\Observer;
11+
use Magento\Framework\Event\ObserverInterface;
12+
use Magento\InventoryApi\Api\StockRepositoryInterface;
13+
use Magento\InventoryCatalog\Api\DefaultStockProviderInterface;
14+
use Magento\InventorySales\Model\GetAssignedStockIdForWebsiteInterface;
15+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
16+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterfaceFactory;
17+
use Magento\Store\Api\Data\WebsiteInterface;
18+
use Magento\Store\Model\Website;
19+
20+
/**
21+
* Assign the website to the default stock
22+
*/
23+
class AssignWebsiteToDefaultStock implements ObserverInterface
24+
{
25+
/**
26+
* @var StockRepositoryInterface
27+
*/
28+
private $stockRepository;
29+
30+
/**
31+
* @var DefaultStockProviderInterface
32+
*/
33+
private $defaultStockProvider;
34+
35+
/**
36+
* @var SalesChannelInterfaceFactory
37+
*/
38+
private $salesChannelFactory;
39+
40+
/**
41+
* @var GetAssignedStockIdForWebsiteInterface
42+
*/
43+
private $getAssignedStockIdForWebsite;
44+
45+
/**
46+
* @param StockRepositoryInterface $stockRepository
47+
* @param DefaultStockProviderInterface $defaultStockProvider
48+
* @param SalesChannelInterfaceFactory $salesChannelFactory
49+
* @param GetAssignedStockIdForWebsiteInterface $getAssignedStockIdForWebsite
50+
*/
51+
public function __construct(
52+
StockRepositoryInterface $stockRepository,
53+
DefaultStockProviderInterface $defaultStockProvider,
54+
SalesChannelInterfaceFactory $salesChannelFactory,
55+
GetAssignedStockIdForWebsiteInterface $getAssignedStockIdForWebsite
56+
) {
57+
$this->stockRepository = $stockRepository;
58+
$this->defaultStockProvider = $defaultStockProvider;
59+
$this->salesChannelFactory = $salesChannelFactory;
60+
$this->getAssignedStockIdForWebsite = $getAssignedStockIdForWebsite;
61+
}
62+
63+
/**
64+
* @inheritdoc
65+
*/
66+
public function execute(Observer $observer)
67+
{
68+
/** @var Website $website */
69+
$website = $observer->getData('website');
70+
$websiteCode = $website->getCode();
71+
72+
if ($websiteCode === WebsiteInterface::ADMIN_CODE) {
73+
return;
74+
}
75+
76+
// checks is some stock already assigned to this website
77+
if ($this->getAssignedStockIdForWebsite->execute($websiteCode) !== null) {
78+
return;
79+
}
80+
81+
$defaultStockId = $this->defaultStockProvider->getId();
82+
$defaultStock = $this->stockRepository->get($defaultStockId);
83+
84+
$extensionAttributes = $defaultStock->getExtensionAttributes();
85+
$salesChannels = $extensionAttributes->getSalesChannels();
86+
$salesChannels[] = $this->createSalesChannelByWebsiteCode($websiteCode);
87+
88+
$extensionAttributes->setSalesChannels($salesChannels);
89+
$this->stockRepository->save($defaultStock);
90+
}
91+
92+
/**
93+
* Create the sales channel by given website code
94+
*
95+
* @param string $websiteCode
96+
* @return SalesChannelInterface
97+
*/
98+
private function createSalesChannelByWebsiteCode(string $websiteCode): SalesChannelInterface
99+
{
100+
$salesChannel = $this->salesChannelFactory->create();
101+
$salesChannel->setCode($websiteCode);
102+
$salesChannel->setType(SalesChannelInterface::TYPE_WEBSITE);
103+
return $salesChannel;
104+
}
105+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\InventorySales\Observer\Website;
9+
10+
use Magento\Framework\Event\Observer;
11+
use Magento\Framework\Event\ObserverInterface;
12+
use Magento\InventorySales\Model\DeleteSalesChannelToStockLinkInterface;
13+
use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
14+
use Magento\Store\Api\Data\WebsiteInterface;
15+
use Magento\Store\Model\Website;
16+
17+
/**
18+
* Delete link between Stock and Website
19+
*/
20+
class DeleteWebsiteToStockLink implements ObserverInterface
21+
{
22+
/**
23+
* @var DeleteSalesChannelToStockLinkInterface
24+
*/
25+
private $deleteSalesChannelToStockLink;
26+
27+
/**
28+
* @param DeleteSalesChannelToStockLinkInterface $deleteSalesChannelToStockLink
29+
*/
30+
public function __construct(
31+
DeleteSalesChannelToStockLinkInterface $deleteSalesChannelToStockLink
32+
) {
33+
$this->deleteSalesChannelToStockLink = $deleteSalesChannelToStockLink;
34+
}
35+
36+
/**
37+
* @inheritdoc
38+
*/
39+
public function execute(Observer $observer)
40+
{
41+
/** @var Website $website */
42+
$website = $observer->getData('website');
43+
$websiteCode = $website->getCode();
44+
45+
if ($websiteCode === WebsiteInterface::ADMIN_CODE) {
46+
return;
47+
}
48+
$this->deleteSalesChannelToStockLink->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
49+
}
50+
}

0 commit comments

Comments
 (0)