/** * @param Mage_Cron_Model_Schedule $schedule * @return Varien_Object */ public function getStartingIn(Mage_Cron_Model_Schedule $schedule) { $schedTime = $schedule->getScheduledAt(); if ($schedTime == '0000-00-00 00:00:00' or $schedTime == '') { $runtime = new Varien_Object(); $runtime->setHours(0); $runtime->setMinutes(0); $runtime->setSeconds(0); $runtime->setToString('0h 0m 0s'); return $runtime; } // Calc Time interval till Exec $starttime = strtotime($schedTime) - strtotime(now()); $prefix = '+'; if ($starttime < 0) { $prefix = '-'; $starttime *= -1; } $runtimeSec = $starttime % 60; $runtimeMin = (int) ($starttime / 60) % 60; $runtimeHour = (int) ($starttime / 3600); $runtime = new Varien_Object(); $runtime->setHours($runtimeHour); $runtime->setMinutes($runtimeMin); $runtime->setSeconds($runtimeSec); $runtime->setPrefix($prefix); $runtime->setToString($runtimeHour . 'h ' . $runtimeMin . 'm ' . $runtimeSec . 's'); return $runtime; }
/** * Process cron task * * @param Mage_Cron_Model_Schedule $schedule * @param $jobConfig * @param bool $isAlways * @return Mage_Cron_Model_Observer */ protected function _processJob($schedule, $jobConfig, $isAlways = false) { $runConfig = $jobConfig->run; if (!$isAlways) { $scheduleLifetime = Mage::getStoreConfig(self::XML_PATH_SCHEDULE_LIFETIME) * 60; $now = time(); $time = strtotime($schedule->getScheduledAt()); if ($time > $now) { return; } } $errorStatus = Mage_Cron_Model_Schedule::STATUS_ERROR; try { if (!$isAlways) { if ($time < $now - $scheduleLifetime) { $errorStatus = Mage_Cron_Model_Schedule::STATUS_MISSED; Mage::throwException(Mage::helper('cron')->__('Too late for the schedule.')); } } // Aoe_Scheduler: stuff from the original method was removed and refactored into the schedule module /* @var $schedule Aoe_Scheduler_Model_Schedule */ $schedule->runNow(!$isAlways); } catch (Exception $e) { $schedule->setStatus($errorStatus)->setMessages($e->__toString()); // Aoe_Scheduler: additional handling: Mage::dispatchEvent('cron_' . $schedule->getJobCode() . '_exception', array('schedule' => $schedule, 'exception' => $e)); Mage::dispatchEvent('cron_exception', array('schedule' => $schedule, 'exception' => $e)); Mage::helper('aoe_scheduler')->sendErrorMail($schedule, $e->__toString()); } $schedule->save(); return $this; }
/** * Create process schedules. * * @param Mage_Cron_Model_Schedule $schedule * * @return void */ protected function _createProcessSchedule($schedule) { $isNew = $schedule->isObjectNew(); $parts = explode('_', $schedule->getJobCode()); $scheduleWithItems = SixBySix_RealTimeDespatch_Model_Resource_Process_Schedule_Collection::getLastScheduleWithItems($parts[0]); $schedule = Mage::getModel('realtimedespatch/process_schedule')->load($schedule->getId(), 'cron_id')->setCronId($schedule->getId())->setStatus($schedule->getStatus())->setScheduled($schedule->getScheduledAt())->setExecuted($schedule->getExecutedAt())->setType($parts[1])->setEntity($parts[0]); if ($schedule->getStatus() == Mage_Cron_Model_Schedule::STATUS_MISSED) { $schedule->setExecuted(date('Y-m-d H:i:s')); } if (!$schedule->getParentId() && !$isNew && $scheduleWithItems->getId()) { $schedule->setParentId($scheduleWithItems->getParentId()); $schedule->setMessageId($scheduleWithItems->getMessageId()); $schedule->setExecutedWithItems($scheduleWithItems->getExecutedWithItems()); } $schedule->save(); return $schedule; }
/** * Run an import through a cron job * @param Aoe_Scheduler_Model_Schedule|Mage_Cron_Model_Schedule $cron */ public function process(Mage_Cron_Model_Schedule $cron) { //initialize the translations so that we are able to translate things. Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_TRANSLATE); $cronName = $cron->getJobCode(); $profile = str_replace('ho_import_', '', $cronName); $logHelper = Mage::helper('ho_import/log'); try { /** @var Ho_Import_Model_Import $import */ $import = Mage::getModel('ho_import/import'); $import->setProfile($profile); $import->process(); } catch (Exception $e) { $logHelper->log($logHelper->getExceptionTraceAsString($e), Zend_Log::CRIT); $cron->setStatus($cron::STATUS_ERROR); } $logHelper->done(); }
/** * Test for required values when admin config setting related to the this extension are changed * * @param Mage_Cron_Model_Schedule $schedule * @return bool */ public function adminSystemConfigChangedSectionTax($schedule) { Mage::app()->cleanCache('block_html'); $storeId = Mage::getModel('core/store')->load($schedule->getEvent()->getStore())->getStoreId(); $errors = array(); if (!Mage::getStoreConfig('tax/advanced/url', $storeId)) { $errors[] = 'You must enter a connection url'; } if (!Mage::getStoreConfig('tax/advanced/license', $storeId)) { $errors[] = 'You must enter a license key'; } if (!Mage::getStoreConfig('tax/advanced/checksum', $storeId)) { $errors[] = 'You must enter a checksum'; } $session = Mage::getSingleton('adminhtml/session'); if (count($errors) == 1) { $session->addError(implode('', $errors)); } elseif (count($errors)) { $session->addError('Please make sure the following fields as filled in in your Accuratetax.com Module Setup:<br /> ' . implode('<br />', $errors) . '<br/>'); } }
/** * Process cron task * * @param Mage_Cron_Model_Schedule $schedule * @param $jobConfig * @param bool $isAlways * @return Mage_Cron_Model_Observer */ protected function _processJob($schedule, $jobConfig, $isAlways = false) { $runConfig = $jobConfig->run; if (!$isAlways) { $scheduleLifetime = Mage::getStoreConfig(self::XML_PATH_SCHEDULE_LIFETIME) * 60; $now = time(); $time = strtotime($schedule->getScheduledAt()); if ($time > $now) { return; } } $errorStatus = Mage_Cron_Model_Schedule::STATUS_ERROR; try { if (!$isAlways) { if ($time < $now - $scheduleLifetime) { $errorStatus = Mage_Cron_Model_Schedule::STATUS_MISSED; Mage::throwException(Mage::helper('cron')->__('Too late for the schedule.')); } } if ($runConfig->model) { if (!preg_match(self::REGEX_RUN_MODEL, (string) $runConfig->model, $run)) { Mage::throwException(Mage::helper('cron')->__('Invalid model/method definition, expecting "model/class::method".')); } if (!($model = Mage::getModel($run[1])) || !method_exists($model, $run[2])) { Mage::throwException(Mage::helper('cron')->__('Invalid callback: %s::%s does not exist', $run[1], $run[2])); } $callback = array($model, $run[2]); $arguments = array($schedule); } if (empty($callback)) { Mage::throwException(Mage::helper('cron')->__('No callbacks found')); } if (!$isAlways) { if (!$schedule->tryLockJob()) { // another cron started this job intermittently, so skip it return; } /** though running status is set in tryLockJob we must set it here because the object was loaded with a pending status and will set it back to pending if we don't set it here */ //$schedule->setStatus(Mage_Cron_Model_Schedule::STATUS_RUNNING); } $schedule->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', time()))->save(); call_user_func_array($callback, $arguments); $schedule->setStatus(Mage_Cron_Model_Schedule::STATUS_SUCCESS)->setFinishedAt(strftime('%Y-%m-%d %H:%M:%S', time())); } catch (Exception $e) { $schedule->setStatus($errorStatus)->setMessages($e->__toString()); } $schedule->save(); return $this; }
/** * Processing object before save data * * Check if there are other schedules for the same job at the same time and skip saving in this case. * * @return Mage_Core_Model_Abstract */ protected function _beforeSave() { $collection = Mage::getModel('cron/schedule')->getCollection()->addFieldToFilter('status', Mage_Cron_Model_Schedule::STATUS_PENDING)->addFieldToFilter('job_code', $this->getJobCode())->addFieldToFilter('scheduled_at', $this->getScheduledAt()); if ($this->getId() !== null) { $collection->addFieldToFilter('schedule_id', array('neq' => $this->getId())); } $count = $collection->count(); if ($count > 0) { $this->_dataSaveAllowed = false; // prevents this object from being stored to database $this->log(sprintf('Pending schedule for "%s" at "%s" already exists %s times. Skipping.', $this->getJobCode(), $this->getScheduledAt(), $count)); } else { $this->_dataSaveAllowed = true; // allow the next object to save (because it's not reset automatically) } return parent::_beforeSave(); }
/** * Run operation in crontab * * @param Mage_Cron_Model_Schedule $schedule * @param bool $forceRun * @return bool */ public function processScheduledOperation($schedule, $forceRun = false) { $operation = Mage::getModel('enterprise_importexport/scheduled_operation')->loadByJobCode($schedule->getJobCode()); $result = false; if ($operation && ($operation->getStatus() || $forceRun)) { $result = $operation->run(); } return $result; }
/** * Bypass parent's setCronExpr is the expression is "always" * This will break trySchedule, but always tasks will never be tried to scheduled anyway * * @param $expr * @return $this * @throws Mage_Core_Exception */ public function setCronExpr($expr) { if ($expr == 'always') { $this->setData('cron_expr', $expr); } else { parent::setCronExpr($expr); } return $this; }
/** * Clean logs * * @param Mage_Cron_Model_Schedule|null $backupSchedule * * @return $this */ public function run($backupSchedule = null) { #Mage::log('Single mode mask: ' . (int)$this->getData('single_mode'), null, 'cron.log'); #Mage::log('Single mode enabled: ' . (int)Mage::helper('mpbackup/config')->isSingleModeEnabled(), null, 'cron.log'); if (true !== $this->getData('single_mode') && Mage::helper('mpbackup/config')->isSingleModeEnabled()) { return $this; } try { $this->_generateJobs(); } catch (Exception $e) { Mage::logException($e); } $this->_errors = array(); $executedAt = $backupSchedule instanceof Mage_Cron_Model_Schedule ? strtotime($backupSchedule->getData('executed_at')) : time(); $schedules = $this->_getBackupPendingSchedules(); $scheduleLifetime = Mage::getStoreConfig(Mage_Cron_Model_Observer::XML_PATH_SCHEDULE_LIFETIME) * 60; /** @var Mageplace_Backup_Model_Cron_Schedule $schedule */ foreach ($schedules->getIterator() as $schedule) { $time = strtotime($schedule->getData('scheduled_at')); if ($time > $executedAt) { continue; } $errorStatus = Mageplace_Backup_Helper_Const::STATUS_ERROR; try { if ($time < $executedAt - $scheduleLifetime) { $errorStatus = Mageplace_Backup_Helper_Const::STATUS_MISSED; throw Mage::exception('Mageplace_Backup', Mage::helper('cron')->__('Too late for the schedule.') . ($backupSchedule instanceof Mage_Cron_Model_Schedule ? ' Schedule ID#' . $backupSchedule->getId() . '.' : '') . ' Backup schedule ID#' . $schedule->getId() . '.'); } if (!$schedule->tryJobLock()) { /* another cron started this job intermittently, so skip it */ continue; } $schedule->setStatus(Mageplace_Backup_Helper_Const::STATUS_RUNNING)->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', time()))->save(); $profile_id = $schedule->getProfileId(); if (!$profile_id) { continue; } $profile = Mage::getModel('mpbackup/profile')->load($profile_id); if (!is_object($profile) || !$profile->getId()) { throw Mage::exception('Mageplace_Backup', Mage::helper('mpbackup')->__('Profile ID#%s not founded.', $profile_id)); } $finish = true; switch ($schedule->getData('job_code')) { case self::JOB_CODE_BACKUP: $finish = $this->backupRun($profile, $schedule); break; case self::JOB_CODE_DELETE: $this->deleteOldBackups($profile); break; case self::JOB_CODE_CHECK_RUNNING: $this->checkRunningBackups($profile); break; } if ($finish) { $schedule->setStatus(Mageplace_Backup_Helper_Const::STATUS_SUCCESS)->setFinishedAt(strftime('%Y-%m-%d %H:%M:%S', time())); } } catch (Exception $e) { $schedule->setStatus($errorStatus)->setMessages($e->__toString()); Mage::logException($e); Mage::log('MPBackup cron errors: ' . $e->getMessage()); if ($errorStatus != Mageplace_Backup_Helper_Const::STATUS_MISSED) { $this->_errors[] = $e->__toString(); } } $schedule->save(); } if (isset($profile) && !empty($this->_errors)) { $this->sendErrorsEmail($profile); } $this->_cleanupJobs(); return $this; }
/** * Get cron job message * Note: Limits to 100 characters * * @param Mage_Cron_Model_Schedule $job * * @return string */ public function getTruncatedJobMessages($job) { return Mage::helper('core/string')->truncate($job->getMessages(), 100); }
public function _construct() { parent::_construct(); $this->_init('mpbackup/cron_schedule'); }
/** * @param Mage_Cron_Model_Schedule $schedule * @return void */ public function execute(Mage_Cron_Model_Schedule $schedule) { $service = $this->getFactory()->getServiceTransactionStatusExecute(); $count = $service->executePending(); $schedule->setMessages($count . ' Transaction-Status processed'); }
public function registerCreditmemos(Mage_Cron_Model_Schedule $schedule) { $helper = $this->getHelper(); $result = array('registered' => array(), 'errors' => array()); foreach (Mage::app()->getStores() as $store) { /** @var Mage_Core_Model_Store $store */ if (!$helper->isActive($store)) { continue; } $api = $helper->getApi($store); $limit = max(intval($helper->getConfig('register_creditmemos_batch', $store)), 25); /** @var Mage_Sales_Model_Resource_Order_Creditmemo_Collection $creditmemos */ $creditmemos = Mage::getSingleton('sales/order_creditmemo')->getCollection(); $creditmemos->addFieldToFilter('store_id', $store->getId()); $creditmemos->addFieldToFilter('avatax_document', array('null' => true)); $creditmemos->addOrder('updated_at', 'ASC'); if ($limit) { $creditmemos->setPageSize($limit); } foreach ($creditmemos as $creditmemo) { /** @var Mage_Sales_Model_Order_Creditmemo $creditmemo */ try { $helper->registerCreditmemo($api, $creditmemo); $result['registered'][] = $creditmemo->getIncrementId(); } catch (Exception $e) { $result['errors'][] = $e->getMessage(); if ($e instanceof Aoe_AvaTax_Exception && count($e->getAvaTaxMessages())) { foreach ($e->getAvaTaxMessages() as $message) { $result['errors'][] = $message; } } try { $creditmemo->setDataChanges(true); $creditmemo->addComment('Failed to register creditmemo with AvaTax: ' . $e->getMessage()); $creditmemo->save(); $creditmemo->getOrder()->addStatusHistoryComment('Failed to register creditmemo with AvaTax: ' . $e->getMessage()); $creditmemo->getOrder()->save(); } catch (Exception $e2) { $result['errors'][] = $e2->getMessage(); Mage::logException($e2); } Mage::logException($e); } } } if (count($result['errors'])) { $schedule->setStatus(Mage_Cron_Model_Schedule::STATUS_ERROR); } elseif (!count($result['registered'])) { $schedule->setStatus('nothing'); } return $result; }
public function testDispatchCronDoesNotCallApiIfNoMessages() { $schedule = new Mage_Cron_Model_Schedule(); $schedule->setJobCode('triggerCode'); $events = $this->getEventCollection(); $this->observer->expects($this->once())->method('getEvents')->with('cron', 'triggerCode')->will($this->returnValue($events)); $messages = array(); $this->messageProcessor->expects($this->once())->method('processEvents')->with($events)->will($this->returnValue($messages)); $this->esendexApi->expects($this->never())->method('sendMultipleMessages'); $this->observer->dispatchCron($schedule); }
/** * Dispatch For Cron Jobs */ public function dispatchCron(Mage_Cron_Model_Schedule $schedule) { $triggerCode = $schedule->getJobCode(); $events = $this->getEvents(Esendex_Sms_Model_Event::TRIGGER_TYPE_CRON, $triggerCode); $this->dispatch($events); }