Showing Salable QTY in frontend Magento 2.3

The definition of salable quantity includes the quantity minQty.

Nowadays MSI is the approach. So no other methods, shortcuts, objectmanagers or M1 flashback code. It all has to be an MSI approach that will be compatible with future versions of M2.

So, let's get into it:

    $websiteCode = $this->storeManager->getWebsite()->getCode();
    $stock = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
    $stockId = $stock->getStockId();

This gets your stock id for your website. It might always be the same but you have to look it up.

If on the frontend you want to show a different message for an item on backorder then you can do this:

        $stockItem = $this->getStockItemConfiguration->execute($product->getSku(), $stockId);
        $minQty = $stockItem->getMinQty();

        $salableQty = $this->productSalableQty->execute($product->getSku(), $stockId);

To determine if the product is in stock and on sale:

        $product->isSalable()

If you want to show what is low stock then you can get this from:

    $lowStock = $this->scopeConfig->getValue(self::XML_PATH_STOCK_THRESHOLD_QTY, ScopeInterface::SCOPE_STORE);

Combining these values to show stock availability:

        if (($salableQty + $minQty) > $lowStock) {

This shows what is readily available with no wait on backorders and no low stock.

If you want to know what is in stock including low stock, change the above to:

        if (($salableQty + $minQty) > 0) {

To setup your class use the interfaces:

use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface;
use Magento\InventorySalesApi\Api\GetProductSalableQtyInterface;
use Magento\InventorySalesApi\Api\StockResolverInterface;
use Magento\Store\Model\StoreManagerInterface;

Then, for your constructor:

const XML_PATH_STOCK_THRESHOLD_QTY = 'cataloginventory/options/stock_threshold_qty';

private $getStockItemConfiguration;
private $productSalableQty;
private $stockResolver;
private $storeManager;

public function __construct(
    . . .
    GetProductSalableQtyInterface $productSalableQty,
    GetStockItemConfigurationInterface $getStockItemConfiguration,
    StockResolverInterface $stockResolver,
    StoreManagerInterface $storeManager,
    . . .
) {
    $this->getStockItemConfiguration = $getStockItemConfiguration;
    $this->productSalableQty = $productSalableQty;
    $this->stockResolver = $stockResolver;
    $this->storeManager = $storeManager;
    . . .
}

Try this. A complete solution based on the other answers

use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;

$productSalable = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
$stockResolver = $objectManager->get('\Magento\InventorySalesApi\Api\StockResolverInterface');

$stockId    = $stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $website_code)->getStockId();
$stockQty   = $productSalable->execute($product_sku, $stockId);

$website_code = code of the website from all store. $product_sku = the sku of the product. Result($stockQty) will be the qty of the product of specific stock and not the default stock value


I found my own solution in the following piece of code:

<?php 
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $StockState = $objectManager->get('\Magento\InventorySalesApi\Api\GetProductSalableQtyInterface');
    $qty = $StockState->execute($_product->getSku(), 2);
?>

I hope it can be of help for others! :)

2 = $stockId