diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 14d9a599ae011..4fe0b7f88027c 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -9,8 +9,8 @@ */ namespace Magento\Cron\Observer; -use Laminas\Http\PhpEnvironment\Request as Environment; use Exception; +use Laminas\Http\PhpEnvironment\Request as Environment; use Magento\Cron\Model\DeadlockRetrierInterface; use Magento\Cron\Model\ResourceModel\Schedule\Collection as ScheduleCollection; use Magento\Cron\Model\Schedule; @@ -184,6 +184,11 @@ class ProcessCronQueueObserver implements ObserverInterface */ private $retrier; + /** + * @var array + */ + private $ignoreMismatches = []; + /** * @param \Magento\Framework\ObjectManagerInterface $objectManager * @param \Magento\Cron\Model\ScheduleFactory $scheduleFactory @@ -201,6 +206,7 @@ class ProcessCronQueueObserver implements ObserverInterface * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param DeadlockRetrierInterface $retrier * @param Environment $environment + * @param array $ignoreMismatches * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -219,7 +225,8 @@ public function __construct( \Magento\Framework\Lock\LockManagerInterface $lockManager, \Magento\Framework\Event\ManagerInterface $eventManager, DeadlockRetrierInterface $retrier, - Environment $environment + Environment $environment, + array $ignoreMismatches = [] ) { $this->_objectManager = $objectManager; $this->_scheduleFactory = $scheduleFactory; @@ -237,6 +244,7 @@ public function __construct( $this->lockManager = $lockManager; $this->eventManager = $eventManager; $this->retrier = $retrier; + $this->ignoreMismatches = $ignoreMismatches; } /** @@ -789,6 +797,9 @@ private function getCronExpression($jobConfig) private function cleanupScheduleMismatches() { foreach ($this->invalid as $jobCode => $scheduledAtList) { + if (in_array($jobCode, $this->ignoreMismatches)) { + continue; + } $this->cleanup( [ 'status = ?' => Schedule::STATUS_PENDING, diff --git a/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php b/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php new file mode 100644 index 0000000000000..d2095d3d68369 --- /dev/null +++ b/app/code/Magento/Sales/Observer/SetCronPendingPaymentOrder.php @@ -0,0 +1,102 @@ +scheduleFactory = $scheduleFactory; + $this->dateTime = $dateTime; + $this->logger = $logger; + $this->scopeConfig = $scopeConfig; + } + + /** + * Set cron for order pending payment + * + * @param \Magento\Framework\Event\Observer $observer + * @return $this|void + */ + public function execute(\Magento\Framework\Event\Observer $observer) + { + if ($this->isStart) { + return $this; + } + + $order = $observer->getEvent()->getOrder(); + if (!$order->getId() || $order->getStatus() !== Order::STATE_PENDING_PAYMENT) { + return $this; + } + + $lifetime = $this->scopeConfig->getValue( + self::XML_PATH_ORDER_DELETE_PENDING, + ScopeInterface::SCOPE_WEBSITES, + $order->getStore()->getWebsite()->getId() + ); + $currentTime = $this->dateTime->gmtTimestamp(); + try { + $schedule = $this->scheduleFactory->create() + ->setJobCode('sales_clean_orders') + ->setStatus(Schedule::STATUS_PENDING) + ->setCreatedAt(date('Y-m-d H:i:s', $currentTime)) + ->setScheduledAt(date('Y-m-d H:i', $currentTime + $lifetime * 60)); + + $schedule->save(); + $this->isStart = true; + } catch (\Exception $e) { + $this->logger->critical($e); + } + } +} diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml index d5dc1938bdab5..30d76c694e69d 100644 --- a/app/code/Magento/Sales/etc/di.xml +++ b/app/code/Magento/Sales/etc/di.xml @@ -1038,4 +1038,11 @@ + + + + sales_clean_orders + + + diff --git a/app/code/Magento/Sales/etc/events.xml b/app/code/Magento/Sales/etc/events.xml index b3a7a4ab99577..29094d589de07 100644 --- a/app/code/Magento/Sales/etc/events.xml +++ b/app/code/Magento/Sales/etc/events.xml @@ -56,4 +56,7 @@ name="sales_assign_order_to_customer" instance="Magento\Sales\Observer\AssignOrderToCustomerObserver" /> + + + diff --git a/app/code/Magento/Sales/etc/module.xml b/app/code/Magento/Sales/etc/module.xml index 11eebaa3d5a3d..cbb154c7951ad 100644 --- a/app/code/Magento/Sales/etc/module.xml +++ b/app/code/Magento/Sales/etc/module.xml @@ -13,6 +13,7 @@ +