質問

In my custom module, I'm using StockRegistryInterface to set qty and save my product. But on Magento 2.3 I started facing the issue of having 0 salable qty right after saving the product.

Default stock 0

After digging a bit, I saw that StockRegistryInterface is deprecated and it was replaced with Multi Source Inventory. How should I save the qty of my product now?

Here is the piece of code where I do it with StockRegistryInterface:

        /* @var ProductInterface $product */
        $stockItem = $this->stock->getStockItemBySku($product->getSku());
        $stockItem->setQty($this->estoque_disponivel);
        $stockItem->setIsInStock(true);
        $this->stock->updateStockItemBySku($product->getSku(), $stockItem);
役に立ちましたか?

解決

Here you go!

/**
 * @var Magento\InventoryApi\Api\SourceItemsSaveInterface
 */
protected $sourceItemsSave;

/**
 * @var Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory
 */
protected $sourceItemFactory;

/**
 * @param SourceItemsSaveInterface $sourceItemsSave
 * @param SourceItemInterfaceFactory $sourceItemFactory
 */
public function __construct(
    Magento\InventoryApi\Api\SourceItemsSaveInterface $sourceItemsSave,
    Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory $sourceItemFactory,
) {
    $this->sourceItemsSave = $sourceItemsSave;
    $this->sourceItemFactory = $sourceItemFactory;
}

/**
 * @param $sku
 * @param $qty
 * @param $source
 */
public function setQtyToProduct($sku, $qty, $source)
{
    $sourceItem = $this->sourceItemFactory->create();
    $sourceItem->setSourceCode($source);
    $sourceItem->setSku($sku);
    $sourceItem->setQuantity($qty);
    $sourceItem->setStatus(1);

    $this->sourceItemsSave->execute([$sourceItem]);
}

他のヒント

I found how to set qty to the product on the 'MSI way'.

PS: I'm using the default source.

The constructor:

private $sourceItemsSave;
private $sourceItemInterface;

public function __construct(
    SourceItemInterface $sourceItemInterface,
    SourceItemsSaveInterface $sourceItemsSave,
)
{
    $this->sourceItemsSave = $sourceItemsSave;
    $this->sourceItemInterface = $sourceItemInterface;
}

Saving the qty:

public function setQtyToProduct($product, $qty){

        /* @var ProductInterface $product */

        $this->sourceItemInterface->setSku($product->getSku());
        $this->sourceItemInterface->setQuantity($qty);
        $this->sourceItemInterface->setStatus(1);
        $this->sourceItemInterface->setSourceCode('default');
        $this->sourceItemsSave->execute([$this->sourceItemInterface]);
}

Use this page for the corresponding match for new Inventory API - https://github.com/magento-engcom/msi/wiki/Magento-MSI-APIs

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top