From Niraj Patel issue:
I tried the below scenario in Magento 2.4.0 version
Anyone please try the below scenario in your Magento 2.4 version ?
I created one configurable product and it's two simple children with 100 qty.
Before Order place: I went to Admin Product Grid there are two columns Quantity and Salable Quantity. One child product has 100 Quantity and Salable Quantity are 100
After Placed order: In Admin product grid, same child product has salable quantity is 0 and quantity column shows 100 quantity and when I went product edit page it still shows in stock
status even no backorders and Manages stock set to yes
and I did reindex.
Expected Result: when the product becomes zero salable quantity it should automatically change stock status out of stock
Actual Result: when the product becomes zero salable quantity it does not change stock status from in stock
to `out of stock
Anyone faces above issue in your Magento 2.4 version ?
____________________
My SOLUTION: Create Lexim_InventoryConfigurableProduct extension
etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Inventory\Model\SourceItem\Command\DecrementSourceItemQty">
<plugin name="update_parent_configurable_product_stock_status_in_legacy_stock" disabled="true"/>
<plugin name="update_parent_configurable_product_stock_status_in_legacy_stock_fix" type="Lexim\InventoryConfigurableProduct\Plugin\InventoryApi\UpdateParentStockStatusInLegacyStockPlugin"/>
</type>
</config>
Plugin\InventoryApi\UpdateParentStockStatusInLegacyStockPlugin.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Lexim\InventoryConfigurableProduct\Plugin\InventoryApi;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Inventory\Model\SourceItem\Command\DecrementSourceItemQty;
use Magento\InventoryApi\Api\Data\SourceItemInterface;
use Magento\InventoryCatalogApi\Api\DefaultSourceProviderInterface;
use Magento\InventoryCatalogApi\Model\GetProductIdsBySkusInterface;
use Magento\ConfigurableProduct\Model\Inventory\ChangeParentStockStatus;
/**
* Apply a fix for update configurable product stock status in legacy stock
* after decrement quantity of child stock item
*/
class UpdateParentStockStatusInLegacyStockPlugin
{
/**
* @var DefaultSourceProviderInterface
*/
private $defaultSourceProvider;
/**
* @var ChangeParentStockStatus
*/
private $changeParentStockStatus;
/**
* @var GetProductIdsBySkusInterface
*/
private $getProductIdsBySkus;
/**
* @param DefaultSourceProviderInterface $defaultSourceProvider
* @param GetProductIdsBySkusInterface $getProductIdsBySkus
* @param ChangeParentStockStatus $changeParentStockStatus
*/
public function __construct(
DefaultSourceProviderInterface $defaultSourceProvider,
GetProductIdsBySkusInterface $getProductIdsBySkus,
ChangeParentStockStatus $changeParentStockStatus
) {
$this->defaultSourceProvider = $defaultSourceProvider;
$this->getProductIdsBySkus = $getProductIdsBySkus;
$this->changeParentStockStatus = $changeParentStockStatus;
}
/**
* Make configurable product out of stock if all its children out of stock
*
* @param DecrementSourceItemQty $subject
* @param void $result
* @param SourceItemInterface[] $sourceItemDecrementData
* @return void
* @throws NoSuchEntityException
*/
public function afterExecute(DecrementSourceItemQty $subject, $result, array $sourceItemDecrementData): void
{
$productIds = [];
$sourceItems = array_column($sourceItemDecrementData, 'source_item');
/** @var SourceItemInterface $sourceItem */
foreach ($sourceItems as $sourceItem) {
$sku = $sourceItem->getSku();
if ($sourceItem->getSourceCode() === $this->defaultSourceProvider->getCode()
&& $productId = ($this->getProductIdsBySkus->execute([$sku])[$sku] ?? null)
) {
$productIds[] = (int) $productId;
}
}
if ($productIds) {
$this->changeParentStockStatus->execute($productIds);
}
}
}
registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Lexim_InventoryConfigurableProduct',
__DIR__
);
module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Lexim_InventoryConfigurableProduct" setup_version="1.0.0" />
</config>