diff --git a/InventorySales/Plugin/Quote/Api/ValidateQtyBeforeSave.php b/InventorySales/Plugin/Quote/Api/ValidateQtyBeforeSave.php
new file mode 100644
index 000000000000..ec4101481367
--- /dev/null
+++ b/InventorySales/Plugin/Quote/Api/ValidateQtyBeforeSave.php
@@ -0,0 +1,65 @@
+validator = $validator;
+ $this->observerFactory = $observerFactory;
+ }
+
+ /**
+ * @param CartItemRepositoryInterface $subject
+ * @param CartItemInterface $item
+ *
+ * @return array
+ * @throws LocalizedException
+ */
+ public function beforeSave(CartItemRepositoryInterface $subject, CartItemInterface $item): array
+ {
+ /** @var Event $event */
+ $event = $this->observerFactory->create(Event::class, ['data' => ['item' => $item]]);
+ /** @var Observer $observer */
+ $observer = $this->observerFactory->create(Observer::class, ['data' => ['event' => $event]]);
+
+ $this->validator->validate($observer);
+
+ if (!empty($item->getMessage()) && $item->getHasError()) {
+ throw new LocalizedException(__($item->getMessage()));
+ }
+
+ return [$item];
+ }
+}
diff --git a/InventorySales/Plugin/Quote/Model/Quote/Item/CartItemPersister/ValidateQtyBeforePersist.php b/InventorySales/Plugin/Quote/Model/Quote/Item/CartItemPersister/ValidateQtyBeforePersist.php
new file mode 100644
index 000000000000..e4527a56aaad
--- /dev/null
+++ b/InventorySales/Plugin/Quote/Model/Quote/Item/CartItemPersister/ValidateQtyBeforePersist.php
@@ -0,0 +1,72 @@
+qtyValidator = $validator;
+ $this->observerFactory = $observerFactory;
+ }
+
+ /**
+ * Validate item qty before save.
+ *
+ * @param CartItemPersister $subject
+ * @param CartInterface $quote
+ * @param CartItemInterface $item
+ *
+ * @return array
+ * @throws LocalizedException
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+ public function beforeSave(CartItemPersister $subject, CartInterface $quote, CartItemInterface $item): array
+ {
+ /** @var Event $event */
+ $event = $this->observerFactory->create(Event::class, ['data' => ['item' => $item]]);
+ /** @var Observer $observer */
+ $observer = $this->observerFactory->create(Observer::class, ['data' => ['event' => $event]]);
+
+ $this->qtyValidator->validate($observer);
+ if (!empty($item->getMessage()) && $item->getHasError()) {
+ throw new LocalizedException(__($item->getMessage()));
+ }
+
+ return [
+ $quote,
+ $item
+ ];
+ }
+}
diff --git a/InventorySales/composer.json b/InventorySales/composer.json
index e6a579643343..f401f79a71e7 100644
--- a/InventorySales/composer.json
+++ b/InventorySales/composer.json
@@ -19,7 +19,8 @@
"magento/module-sales": "*"
},
"suggest": {
- "magento/module-inventory-catalog": "*"
+ "magento/module-inventory-catalog": "*",
+ "magento/module-quote": "*"
},
"require-dev": {
"magento/module-inventory-indexer": "*"
diff --git a/InventorySales/etc/di.xml b/InventorySales/etc/di.xml
index e98fa584ef90..b664f83a2817 100644
--- a/InventorySales/etc/di.xml
+++ b/InventorySales/etc/di.xml
@@ -189,4 +189,10 @@
+
+
+
+
+
+
diff --git a/InventorySales/etc/events.xml b/InventorySales/etc/events.xml
index 63cfbdac4429..5d7a1bcbb668 100644
--- a/InventorySales/etc/events.xml
+++ b/InventorySales/etc/events.xml
@@ -23,4 +23,8 @@
+
+
+
+