CleanExpiredOrders.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Sales\Model\CronJob;
  8. use Magento\Framework\App\ObjectManager;
  9. use Magento\Sales\Api\OrderManagementInterface;
  10. use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
  11. use Magento\Store\Model\StoresConfig;
  12. use Magento\Sales\Model\Order;
  13. /**
  14. * Class that provides functionality of cleaning expired quotes by cron
  15. */
  16. class CleanExpiredOrders
  17. {
  18. /**
  19. * @var StoresConfig
  20. */
  21. protected $storesConfig;
  22. /**
  23. * @var CollectionFactory
  24. */
  25. protected $orderCollectionFactory;
  26. /**
  27. * @var OrderManagementInterface
  28. */
  29. private $orderManagement;
  30. /**
  31. * @param StoresConfig $storesConfig
  32. * @param CollectionFactory $collectionFactory
  33. * @param OrderManagementInterface|null $orderManagement
  34. */
  35. public function __construct(
  36. StoresConfig $storesConfig,
  37. CollectionFactory $collectionFactory,
  38. OrderManagementInterface $orderManagement = null
  39. ) {
  40. $this->storesConfig = $storesConfig;
  41. $this->orderCollectionFactory = $collectionFactory;
  42. $this->orderManagement = $orderManagement ?: ObjectManager::getInstance()->get(OrderManagementInterface::class);
  43. }
  44. /**
  45. * Clean expired quotes (cron process)
  46. *
  47. * @return void
  48. */
  49. public function execute()
  50. {
  51. $lifetimes = $this->storesConfig->getStoresConfigByPath('sales/orders/delete_pending_after');
  52. foreach ($lifetimes as $storeId => $lifetime) {
  53. /** @var $orders \Magento\Sales\Model\ResourceModel\Order\Collection */
  54. $orders = $this->orderCollectionFactory->create();
  55. $orders->addFieldToFilter('store_id', $storeId);
  56. $orders->addFieldToFilter('status', Order::STATE_PENDING_PAYMENT);
  57. $orders->getSelect()->where(
  58. new \Zend_Db_Expr('TIME_TO_SEC(TIMEDIFF(CURRENT_TIMESTAMP, `updated_at`)) >= ' . $lifetime * 60)
  59. );
  60. foreach ($orders->getAllIds() as $entityId) {
  61. $this->orderManagement->cancel((int) $entityId);
  62. }
  63. }
  64. }
  65. }