-
Notifications
You must be signed in to change notification settings - Fork 247
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improved Stock Item configuration #2297
Changes from all commits
3f62ec7
18c50bb
6aa6d80
4e86729
df9ef98
ba1219a
1510f07
db2ea80
947707a
b4c106c
bdd2c7d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
declare(strict_types=1); | ||
|
||
namespace Magento\InventoryConfiguration\Model; | ||
|
||
use Magento\Framework\App\Config\ScopeConfigInterface; | ||
use Magento\Framework\App\ResourceConnection; | ||
use Magento\InventoryConfigurationApi\Api\Data\SourceItemConfigurationInterface; | ||
use Magento\InventoryConfigurationApi\Api\GetBackorderStatusConfigurationValueInterface; | ||
|
||
class GetBackorderStatusConfigurationValue implements GetBackorderStatusConfigurationValueInterface | ||
{ | ||
/** | ||
* @var ResourceConnection; | ||
*/ | ||
private $resourceConnection; | ||
|
||
/** | ||
* @var ScopeConfigInterface | ||
*/ | ||
private $scopeConfig; | ||
|
||
public function __construct( | ||
ResourceConnection $resourceConnection, | ||
ScopeConfigInterface $scopeConfig | ||
) { | ||
$this->resourceConnection = $resourceConnection; | ||
$this->scopeConfig = $scopeConfig; | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forSourceItem(string $sku, string $sourceCode): ?int | ||
{ | ||
$connection = $this->resourceConnection->getConnection(); | ||
$configurationTable = $this->resourceConnection->getTableName('inventory_configuration'); | ||
$select = $connection->select() | ||
->from($configurationTable) | ||
->where('sku = ?', $sku) | ||
->where('source_code = ?', $sourceCode) | ||
->where('config_option = ?', SourceItemConfigurationInterface::BACKORDERS); | ||
$data = $connection->fetchRow($select); | ||
if ($data === false || $data['value'] === null) { | ||
return $this->forSource($sourceCode); | ||
} | ||
return (int)$data['value']; | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forSource(string $sourceCode): ?int | ||
{ | ||
$connection = $this->resourceConnection->getConnection(); | ||
$configurationTable = $this->resourceConnection->getTableName('inventory_configuration'); | ||
$select = $connection->select() | ||
->from($configurationTable) | ||
->where('sku IS NULL') | ||
->where('source_code = ?', $sourceCode) | ||
->where('config_option = ?', SourceItemConfigurationInterface::BACKORDERS); | ||
$data = $connection->fetchRow($select); | ||
if ($data === false || $data['value'] === null) { | ||
return $this->forGlobal(); | ||
} | ||
return (int)$data['value']; | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forGlobal(): int | ||
{ | ||
// FIXME if config value is missing, null casted to int gives 0, that's a different semantic from missing value | ||
return (int)$this->scopeConfig->getValue( | ||
SourceItemConfigurationInterface::XML_PATH_BACKORDERS | ||
); | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function execute(string $sku = null, string $sourceCode = null): ?int | ||
{ | ||
if ($sku !== null && $sourceCode !== null) { | ||
return $this->forSourceItem($sku, $sourceCode); | ||
} | ||
|
||
if ($sourceCode !== null) | ||
{ | ||
return $this->forSource($sourceCode); | ||
} | ||
|
||
return $this->forGlobal(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
<?php | ||
/** | ||
* Copyright © Magento, Inc. All rights reserved. | ||
* See COPYING.txt for license details. | ||
*/ | ||
declare(strict_types=1); | ||
|
||
namespace Magento\InventoryConfiguration\Model; | ||
|
||
use Magento\Framework\App\Config\Storage\WriterInterface; | ||
use Magento\Framework\App\ResourceConnection; | ||
use Magento\InventoryConfigurationApi\Api\Data\SourceItemConfigurationInterface; | ||
use Magento\InventoryConfigurationApi\Api\SetBackorderStatusConfigurationValueInterface; | ||
|
||
class SetBackorderStatusConfigurationValue implements SetBackorderStatusConfigurationValueInterface | ||
{ | ||
/** | ||
* @var ResourceConnection; | ||
*/ | ||
private $resourceConnection; | ||
|
||
/** | ||
* @var WriterInterface | ||
*/ | ||
private $configWriter; | ||
|
||
public function __construct( | ||
ResourceConnection $resourceConnection, | ||
WriterInterface $configWriter | ||
) { | ||
$this->resourceConnection = $resourceConnection; | ||
$this->configWriter = $configWriter; | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forSourceItem(string $sku, string $sourceCode, ?int $backorderStatus): void | ||
{ | ||
// TODO should validate allowed values? | ||
$connection = $this->resourceConnection->getConnection(); | ||
$configurationTable = $this->resourceConnection->getTableName('inventory_configuration'); | ||
$select = $connection->select() | ||
->from($configurationTable) | ||
->where('sku = ?', $sku) | ||
->where('source_code = ?', $sourceCode) | ||
->where('config_option = ?', SourceItemConfigurationInterface::BACKORDERS); | ||
$data = $connection->fetchRow($select); | ||
$isNew = false; | ||
if ($data === false) { | ||
$isNew = true; | ||
$data = [ | ||
'sku' => $sku, | ||
'source_code' => $sourceCode, | ||
'stock_id' => null, | ||
'config_option' => SourceItemConfigurationInterface::BACKORDERS, | ||
]; | ||
} | ||
$data['value'] = $backorderStatus ? (string)$backorderStatus : null; | ||
if ($isNew) { | ||
$connection->insert($configurationTable, $data); | ||
} else { | ||
$where = [ | ||
'sku = ?' => $sku, | ||
'source_code = ?' => $sourceCode, | ||
'stock_id IS NULL', | ||
'config_option = ?' => SourceItemConfigurationInterface::BACKORDERS, | ||
]; | ||
|
||
$connection->update($configurationTable, $data, $where); | ||
} | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forSource(string $sourceCode, ?int $backorderStatus): void | ||
{ | ||
// TODO should validate allowed values? | ||
$connection = $this->resourceConnection->getConnection(); | ||
$configurationTable = $this->resourceConnection->getTableName('inventory_configuration'); | ||
$select = $connection->select() | ||
->from($configurationTable) | ||
->where('sku IS NULL') | ||
->where('source_code = ?', $sourceCode) | ||
->where('stock_id IS NULL') | ||
->where('config_option = ?', SourceItemConfigurationInterface::BACKORDERS); | ||
$data = $connection->fetchRow($select); | ||
$isNew = false; | ||
if ($data === false) { | ||
$isNew = true; | ||
$data = [ | ||
'sku' => null, | ||
'source_code' => $sourceCode, | ||
'stock_id' => null, | ||
'config_option' => SourceItemConfigurationInterface::BACKORDERS, | ||
]; | ||
} | ||
$data['value'] = $backorderStatus ? (string)$backorderStatus : null; | ||
if ($isNew) { | ||
$connection->insert($configurationTable, $data); | ||
} else { | ||
$where = [ | ||
'sku IS NULL', | ||
'source_code = ?' => $sourceCode, | ||
'stock_id IS NULL', | ||
'config_option = ?' => SourceItemConfigurationInterface::BACKORDERS, | ||
]; | ||
$connection->update($configurationTable, $data, $where); | ||
} | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function forGlobal(int $backorderStatus): void | ||
{ | ||
// TODO should validate allowed values? | ||
$this->configWriter->save( | ||
SourceItemConfigurationInterface::XML_PATH_BACKORDERS, | ||
$backorderStatus | ||
); | ||
} | ||
|
||
/** | ||
* @inheritDoc | ||
*/ | ||
public function execute(string $sku = null, string $sourceCode = null, string $backorderStatus = null): void | ||
{ | ||
if ($sku !== null && $sourceCode !== null) { | ||
$this->forSourceItem($sku, $sourceCode, is_numeric($backorderStatus) ? (int)$backorderStatus : null); | ||
return; | ||
} | ||
|
||
if ($sourceCode !== null) | ||
{ | ||
$this->forSource($sourceCode, is_numeric($backorderStatus) ? (int)$backorderStatus : null); | ||
return; | ||
} | ||
|
||
if (!is_numeric($backorderStatus)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. got it; maybe after introducing validation I can be more specific here |
||
throw new \Magento\Framework\Exception\CouldNotSaveException( | ||
__('Backorder status should be a numeric value to be saved in global scope') | ||
); | ||
} | ||
|
||
$this->forGlobal((int)$backorderStatus); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Imo validation would save a lot of time in the future