In Magento 2.3, a new feature was introduced Multi-Source Inventory aka MSI. It changes how the product inventory works. With this feature, a product can be assigned multiple sources and each source can have a different quantity of the product.
In this blog, I will explain how to save product quantities for multiple sources and how to retrieve the saved quantities. Here I will create a product with SKU “test_product” and two sources with source code “test_source” and “test_source2“. Please make sure that you have added the sources in the stock and selected the source channel in the stock.
1. Save product quantities for multiple sources
public function __construct( ..... \Magento\InventoryCatalogApi\Model\SourceItemsProcessorInterface $sourceItemsProcessor ) { ..... $this->sourceItemsProcessor = $sourceItemsProcessor; } public function execute() { $data = [ ['source_code'=>'test_source', 'status'=>1, 'quantity'=>50], ['source_code'=>'test_source2', 'status'=>1, 'quantity'=>80] ]; $this->sourceItemsProcessor->execute( 'test_product', $data ); }
Please note that if you want to update the quantity for a single product then you can not just pass a single array in the data. If you do then it will remove the previous sources. So now if you do,
$data = [ ['source_code'=>'test_source', 'status'=>1, 'quantity'=>100] ]; $this->sourceItemsProcessor->process( 'test_product', $data );
then it will remove the other source like shown below
2. Get the product’s multi-source quantities
public function __construct( ...... \Magento\InventoryCatalogAdminUi\Model\GetSourceItemsDataBySku $sourceDataBySku ) { ...... $this->sourceDataBySku = $sourceDataBySku; } public function execute() { $data = $this->sourceDataBySku->execute('test_product'); }
It returns the source-wise quantities in the array.
Array ( [0] => Array ( [source_code] => test_source [quantity] => 50 [status] => 1 [name] => Test Source [source_status] => 1 ) [1] => Array ( [source_code] => test_source2 [quantity] => 80 [status] => 1 [name] => Test Source 2 [source_status] => 1 ) )
To get the saleable quantity you can check,
Nice blog!