diff --git a/vendor/magento/module-inventory-bundle-import-export/Plugin/Import/Product/UpdateBundleProductsStockItemStatusPlugin.php b/vendor/magento/module-inventory-bundle-import-export/Plugin/Import/Product/UpdateBundleProductsStockItemStatusPlugin.php
index 22d4e5077d74..e69de29bb2d1 100644
--- a/vendor/magento/module-inventory-bundle-import-export/Plugin/Import/Product/UpdateBundleProductsStockItemStatusPlugin.php
+++ b/vendor/magento/module-inventory-bundle-import-export/Plugin/Import/Product/UpdateBundleProductsStockItemStatusPlugin.php
@@ -1,58 +0,0 @@
-changeParentStockStatus = $changeParentStockStatus;
- $this->isSingleSourceMode = $isSingleSourceMode;
- }
-
- /**
- * Allow automatic parent stock update in single source mode only
- *
- * @param StockItemImporterInterface $subject
- * @param mixed $result
- * @param array $stockData
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterImport(
- StockItemImporterInterface $subject,
- $result,
- array $stockData
- ): void {
- if ($stockData && $this->isSingleSourceMode->execute()) {
- $this->changeParentStockStatus->execute(array_column($stockData, 'product_id'));
- }
- }
-}
diff --git a/vendor/magento/module-inventory-bundle-import-export/etc/di.xml b/vendor/magento/module-inventory-bundle-import-export/etc/di.xml
index 2e96e75240cf..b35e3e61025c 100644
--- a/vendor/magento/module-inventory-bundle-import-export/etc/di.xml
+++ b/vendor/magento/module-inventory-bundle-import-export/etc/di.xml
@@ -11,8 +11,5 @@
-
diff --git a/vendor/magento/module-inventory-bundle-product/Model/StockStatusProcessor.php b/vendor/magento/module-inventory-bundle-product/Model/StockStatusProcessor.php
new file mode 100644
index 000000000000..802772eece91
--- /dev/null
+++ b/vendor/magento/module-inventory-bundle-product/Model/StockStatusProcessor.php
@@ -0,0 +1,57 @@
+changeParentStockStatus = $changeParentStockStatus;
+ $this->getProductIdsBySkus = $getProductIdsBySkus;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function execute(array $skus): void
+ {
+ $productIds = [];
+ foreach ($skus as $sku) {
+ try {
+ $productIds[] = (int)$this->getProductIdsBySkus->execute([$sku])[$sku];
+ } catch (NoSuchEntityException $e) {
+ continue;
+ }
+ }
+ $this->changeParentStockStatus->execute($productIds);
+ }
+}
diff --git a/vendor/magento/module-inventory-bundle-product/etc/di.xml b/vendor/magento/module-inventory-bundle-product/etc/di.xml
index 126e580a5981..75f75e761a5f 100644
--- a/vendor/magento/module-inventory-bundle-product/etc/di.xml
+++ b/vendor/magento/module-inventory-bundle-product/etc/di.xml
@@ -29,6 +29,13 @@
+
+
+
+ - Magento\InventoryBundleProduct\Model\StockStatusProcessor
+
+
+
diff --git a/vendor/magento/module-inventory-catalog/Plugin/Inventory/UpdateCompositeProductStockStatusOnDecrementSourceItemQty.php b/vendor/magento/module-inventory-catalog/Plugin/Inventory/UpdateCompositeProductStockStatusOnDecrementSourceItemQty.php
new file mode 100644
index 000000000000..991ac15ce87c
--- /dev/null
+++ b/vendor/magento/module-inventory-catalog/Plugin/Inventory/UpdateCompositeProductStockStatusOnDecrementSourceItemQty.php
@@ -0,0 +1,64 @@
+isSingleSourceMode = $isSingleSourceMode;
+ $this->compositeProductStockStatusProcessor = $compositeProductStockStatusProcessor;
+ }
+
+ /**
+ * Update parent products stock status after decrementing quantity of children stock
+ *
+ * @param DecrementSourceItemQty $subject
+ * @param void $result
+ * @param SourceItemInterface[] $sourceItemDecrementData
+ * @return void
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function afterExecute(DecrementSourceItemQty $subject, $result, array $sourceItemDecrementData): void
+ {
+ if ($this->isSingleSourceMode->execute()) {
+ $sourceItems = array_column($sourceItemDecrementData, 'source_item');
+ $skus = [];
+ foreach ($sourceItems as $sourceItem) {
+ $skus[] = $sourceItem->getSku();
+ }
+ if ($skus) {
+ $this->compositeProductStockStatusProcessor->execute($skus);
+ }
+ }
+ }
+}
diff --git a/vendor/magento/module-inventory-catalog/Plugin/InventoryApi/UpdateCompositeProductStockStatusOnSourceItemsSave.php b/vendor/magento/module-inventory-catalog/Plugin/InventoryApi/UpdateCompositeProductStockStatusOnSourceItemsSave.php
new file mode 100644
index 000000000000..b6c4bd90cdf5
--- /dev/null
+++ b/vendor/magento/module-inventory-catalog/Plugin/InventoryApi/UpdateCompositeProductStockStatusOnSourceItemsSave.php
@@ -0,0 +1,63 @@
+isSingleSourceMode = $isSingleSourceMode;
+ $this->compositeProductStockStatusProcessor = $compositeProductStockStatusProcessor;
+ }
+
+ /**
+ * Update parent products stock status on children products source items update
+ *
+ * @param SourceItemsSaveInterface $subject
+ * @param void $result
+ * @param SourceItemInterface[] $sourceItems
+ * @return void
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function afterExecute(SourceItemsSaveInterface $subject, $result, array $sourceItems): void
+ {
+ if ($this->isSingleSourceMode->execute()) {
+ $skus = [];
+ foreach ($sourceItems as $sourceItem) {
+ $skus[] = $sourceItem->getSku();
+ }
+ if ($skus) {
+ $this->compositeProductStockStatusProcessor->execute($skus);
+ }
+ }
+ }
+}
diff --git a/vendor/magento/module-inventory-catalog/etc/di.xml b/vendor/magento/module-inventory-catalog/etc/di.xml
index dca453877852..63da3ffa1e61 100644
--- a/vendor/magento/module-inventory-catalog/etc/di.xml
+++ b/vendor/magento/module-inventory-catalog/etc/di.xml
@@ -22,10 +22,14 @@
+
+
@@ -95,6 +99,7 @@
+
diff --git a/vendor/magento/module-inventory-catalog-api/Model/CompositeProductStockStatusProcessorInterface.php b/vendor/magento/module-inventory-catalog-api/Model/CompositeProductStockStatusProcessorInterface.php
new file mode 100644
index 000000000000..56a2345f67bf
--- /dev/null
+++ b/vendor/magento/module-inventory-catalog-api/Model/CompositeProductStockStatusProcessorInterface.php
@@ -0,0 +1,22 @@
+compositeProductStockStatusProcessors = $compositeProductStockStatusProcessors;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function execute(array $skus): void
+ {
+ foreach ($this->compositeProductStockStatusProcessors as $compositeProductStockStatusProcessor) {
+ $compositeProductStockStatusProcessor->execute($skus);
+ }
+ }
+}
diff --git a/vendor/magento/module-inventory-catalog-api/etc/di.xml b/vendor/magento/module-inventory-catalog-api/etc/di.xml
index 60beb25a0d9d..f3666356bb7b 100644
--- a/vendor/magento/module-inventory-catalog-api/etc/di.xml
+++ b/vendor/magento/module-inventory-catalog-api/etc/di.xml
@@ -15,4 +15,6 @@
type="Magento\InventoryCatalogApi\Model\BulkInventoryTransferValidatorChain" />
-
\ No newline at end of file
+
+
diff --git a/vendor/magento/module-inventory-configurable-product/Model/StockStatusProcessor.php b/vendor/magento/module-inventory-configurable-product/Model/StockStatusProcessor.php
new file mode 100644
index 000000000000..913b5babcc25
--- /dev/null
+++ b/vendor/magento/module-inventory-configurable-product/Model/StockStatusProcessor.php
@@ -0,0 +1,57 @@
+getProductIdsBySkus = $getProductIdsBySkus;
+ $this->changeParentStockStatus = $changeParentStockStatus;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function execute(array $skus): void
+ {
+ $productIds = [];
+ foreach ($skus as $sku) {
+ try {
+ $productIds[] = (int)$this->getProductIdsBySkus->execute([$sku])[$sku];
+ } catch (NoSuchEntityException $e) {
+ continue;
+ }
+ }
+ $this->changeParentStockStatus->execute($productIds);
+ }
+}
diff --git a/vendor/magento/module-inventory-configurable-product/etc/di.xml b/vendor/magento/module-inventory-configurable-product/etc/di.xml
index a0fddf9b7178..cdaf8d5f849e 100644
--- a/vendor/magento/module-inventory-configurable-product/etc/di.xml
+++ b/vendor/magento/module-inventory-configurable-product/etc/di.xml
@@ -36,9 +36,12 @@
-
-
+
+
+
+ - Magento\InventoryConfigurableProduct\Model\StockStatusProcessor
+
+
getProductIdsBySkus = $getProductIdsBySkus;
+ $this->changeParentStockStatus = $changeParentStockStatus;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function execute(array $skus): void
+ {
+ foreach ($skus as $sku) {
+ try {
+ $productId = (int)$this->getProductIdsBySkus->execute([$sku])[$sku];
+ } catch (NoSuchEntityException $e) {
+ continue;
+ }
+ $this->changeParentStockStatus->execute($productId);
+ }
+ }
+}
diff --git a/vendor/magento/module-inventory-grouped-product/Plugin/InventoryCatalog/Model/UpdateParentStockStatusPlugin.php b/vendor/magento/module-inventory-grouped-product/Plugin/InventoryCatalog/Model/UpdateParentStockStatusPlugin.php
index a8381d474a2f..e69de29bb2d1 100644
--- a/vendor/magento/module-inventory-grouped-product/Plugin/InventoryCatalog/Model/UpdateParentStockStatusPlugin.php
+++ b/vendor/magento/module-inventory-grouped-product/Plugin/InventoryCatalog/Model/UpdateParentStockStatusPlugin.php
@@ -1,79 +0,0 @@
-messageManager = $messageManager;
- $this->changeParentStockStatus = $changeParentStockStatus;
- $this->getProductIdsBySkus = $getProductIdsBySkus;
- }
-
- /**
- * After execute plugin
- *
- * @param UpdateInventory $subject
- * @param mixed $result
- * @param InventoryData $data
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterExecute(UpdateInventory $subject, $result, InventoryData $data)
- {
- $skus = $data->getSkus();
- try {
- $productIds = $this->getProductIdsBySkus->execute($skus);
- } catch (NoSuchEntityException $e) {
- $productIds = [];
- }
- try {
- foreach ($productIds as $productId) {
- $this->changeParentStockStatus->execute((int)$productId);
- }
- } catch (\Exception $e) {
- $this->messageManager->addExceptionMessage(
- $e,
- __('Something went wrong while updating the product(s) stock status.')
- );
- }
- }
-}
diff --git a/vendor/magento/module-inventory-grouped-product/etc/di.xml b/vendor/magento/module-inventory-grouped-product/etc/di.xml
index 222095ef3758..5f01c3b8d9dc 100644
--- a/vendor/magento/module-inventory-grouped-product/etc/di.xml
+++ b/vendor/magento/module-inventory-grouped-product/etc/di.xml
@@ -10,8 +10,12 @@
-
-
+
+
+
+ - Magento\InventoryGroupedProduct\Model\StockStatusProcessor
+
+
changeParentStockStatus = $changeParentStockStatus;
- $this->isSingleSourceMode = $isSingleSourceMode;
- }
-
- /**
- * Update configurable products stock item status based on children products stock status after import
- *
- * @param StockItemImporterInterface $subject
- * @param void $result
- * @param array $stockData
- * @return void
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function afterImport(
- StockItemImporterInterface $subject,
- $result,
- array $stockData
- ): void {
- if ($stockData && $this->isSingleSourceMode->execute()) {
- $this->changeParentStockStatus->execute(array_column($stockData, 'product_id'));
- }
- }
-}
diff --git a/vendor/magento/module-inventory-import-export/etc/di.xml b/vendor/magento/module-inventory-import-export/etc/di.xml
index 5d0db3157688..c7b505e1dade 100644
--- a/vendor/magento/module-inventory-import-export/etc/di.xml
+++ b/vendor/magento/module-inventory-import-export/etc/di.xml
@@ -27,9 +27,9 @@
-
+