SubtractQuoteInventoryObserver.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogInventory\Observer;
  7. use Magento\Framework\Event\ObserverInterface;
  8. use Magento\CatalogInventory\Api\StockManagementInterface;
  9. use Magento\Framework\Event\Observer as EventObserver;
  10. /**
  11. * Catalog inventory module observer
  12. */
  13. class SubtractQuoteInventoryObserver implements ObserverInterface
  14. {
  15. /**
  16. * @var StockManagementInterface
  17. */
  18. protected $stockManagement;
  19. /**
  20. * @var ProductQty
  21. */
  22. protected $productQty;
  23. /**
  24. * @var \Magento\CatalogInventory\Observer\ItemsForReindex
  25. */
  26. protected $itemsForReindex;
  27. /**
  28. * SubtractQuoteInventoryObserver constructor.
  29. * @param StockManagementInterface $stockManagement
  30. * @param ProductQty $productQty
  31. * @param ItemsForReindex $itemsForReindex
  32. */
  33. public function __construct(
  34. StockManagementInterface $stockManagement,
  35. ProductQty $productQty,
  36. ItemsForReindex $itemsForReindex
  37. ) {
  38. $this->stockManagement = $stockManagement;
  39. $this->productQty = $productQty;
  40. $this->itemsForReindex = $itemsForReindex;
  41. }
  42. /**
  43. * Subtract quote items qtys from stock items related with quote items products.
  44. *
  45. * Used before order placing to make order save/place transaction smaller
  46. * Also called after every successful order placement to ensure subtraction of inventory
  47. *
  48. * @param EventObserver $observer
  49. * @return $this
  50. */
  51. public function execute(EventObserver $observer)
  52. {
  53. /** @var \Magento\Quote\Model\Quote $quote */
  54. $quote = $observer->getEvent()->getQuote();
  55. // Maybe we've already processed this quote in some event during order placement
  56. // e.g. call in event 'sales_model_service_quote_submit_before' and later in 'checkout_submit_all_after'
  57. if ($quote->getInventoryProcessed()) {
  58. return $this;
  59. }
  60. $items = $this->productQty->getProductQty($quote->getAllItems());
  61. /**
  62. * Remember items
  63. */
  64. $itemsForReindex = $this->stockManagement->registerProductsSale(
  65. $items,
  66. $quote->getStore()->getWebsiteId()
  67. );
  68. if (count($itemsForReindex)) {
  69. $this->itemsForReindex->setItems($itemsForReindex);
  70. }
  71. $quote->setInventoryProcessed(true);
  72. return $this;
  73. }
  74. }