CRM-17686 Add field to scheduled job form...
authorDavid Reedy Jr <davidrjr.konadave@gmail.com>
Mon, 28 Dec 2015 18:20:09 +0000 (12:20 -0600)
committerDavid Reedy Jr <davidrjr.konadave@gmail.com>
Thu, 31 Dec 2015 23:23:27 +0000 (17:23 -0600)
...to specify first/next run

CRM/Admin/Form/Job.php
CRM/Upgrade/Incremental/sql/4.7.beta5.mysql.tpl
templates/CRM/Admin/Form/Job.tpl
xml/schema/Core/Job.xml

index 013a564ce6fa64b3f8c76900aa2ae47c41740871..549d07855c38df3fffdf8d6b99ce321479bedf82 100644 (file)
@@ -96,6 +96,9 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
 
     $this->add('select', 'run_frequency', ts('Run frequency'), CRM_Core_SelectValues::getJobFrequency());
 
+    // CRM-17686
+    $this->addDateTime('next_scheduled_run', ts(($this->_id ? 'Next' : 'First') . ' Run Date / Time'), FALSE, array('formatType' => 'activityDateTime'));
+
     $this->add('textarea', 'parameters', ts('Command parameters'),
       "cols=50 rows=6"
     );
@@ -156,6 +159,13 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
 
     CRM_Core_DAO::storeValues($dao, $defaults);
 
+    // CRM-17686
+    if (!empty($dao->next_scheduled_run)) {
+      $ts = strtotime($dao->next_scheduled_run);
+      $defaults['next_scheduled_run'] = date('m/d/Y', $ts);
+      $defaults['next_scheduled_run_time'] = date('h:iA', $ts);
+    }
+
     // CRM-10708
     // job entity thats shipped with core is all lower case.
     // this makes sure camel casing is followed for proper working of default population.
@@ -194,6 +204,37 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
     $dao->description = $values['description'];
     $dao->is_active = CRM_Utils_Array::value('is_active', $values, 0);
 
+    // CRM-17686
+    $dt = '';
+    if (!empty($values['next_scheduled_run'])) {
+      $dt = $values['next_scheduled_run'] . ' ';;
+    }
+    if (!empty($values['next_scheduled_run_time'])) {
+      $dt .= $values['next_scheduled_run_time'];
+    }
+    $ts = strtotime(trim($dt));
+    // if a date/time is supplied and not in the past, then set the next scheduled run...
+    if ($ts > time()) {
+      $dao->next_scheduled_run = CRM_Utils_Date::currentDBDate($ts);
+      // warn about monthly/quarterly scheduling, if applicable
+      if (($dao->run_frequency == 'Monthly') || ($dao->run_frequency == 'Quarter')) {
+        $info = getdate($ts);
+        if ($info['mday'] > 28) {
+          CRM_Core_Session::setStatus(
+            ts('Relative month values are calculated based on the length of month(s) that they pass through.
+              The result will land on the same day of the month except for days 29-31 when the target month contains fewer days.
+              For example, if a job is scheduled to run on August 31st, the following invocation will occur on October 1st.
+              To avoid this issue, please schedule Monthly and Quarterly jobs to run within the first 28 days of the month.'),
+            ts('Warning'), 'info', array('expires' => 0));
+        }
+      }
+    }
+    // ...otherwise, if this isn't a new scheduled job, clear the next scheduled run
+    elseif ($this->_id) {
+      $job = new CRM_Core_ScheduledJob(array('id' => $dao->id));
+      $job->clearNextScheduledRun();
+    }
+
     $dao->save();
 
     // CRM-11143 - Give warning message if update_greetings is Enabled (is_active) since it generally should not be run automatically via execute action or runjobs url.
index a97a6161571b9163d3e5f071857cfb2b8baf14f9..99af7aeb516672cb62ef50bb3704d3a66c95b416 100644 (file)
@@ -1 +1,5 @@
 {* file to handle db changes in 4.7.beta5 during upgrade *}
+
+-- CRM-17686
+ALTER TABLE `civicrm_job`
+ADD COLUMN `next_scheduled_run` timestamp NULL DEFAULT NULL COMMENT 'When is this cron entry scheduled to run next' AFTER `last_run`;
index 00092b408fb85cc85f28f15e315af5391a362865..2521de7859f0f414ec2e4476b59818f9905e4094 100644 (file)
@@ -105,6 +105,15 @@ CRM.$(function($) {
       <td class="label">{$form.parameters.label}<br />{docURL page="Managing Scheduled Jobs" resource="wiki"}</td>
       <td>{$form.parameters.html}</td>
     </tr>
+    <tr class="crm-job-form-block-next_scheduled_run">
+        <td class="label">{$form.next_scheduled_run.label}</td>
+        <td>
+            {if $hideCalender neq true}{include file="CRM/common/jcalendar.tpl" elementName=next_scheduled_run}{else}{$next_scheduled_run|crmDate}{/if}<br />
+            <div dlass="description">{ts}Do not run this job before this date / time.
+              Leave blank to run {if $action eq 1}as soon as possible{else}at next scheduled interval{/if}.{/ts}
+            </div>
+        </td>
+    </tr>
     <tr class="crm-job-form-block-is_active">
       <td></td><td>{$form.is_active.html}&nbsp;{$form.is_active.label}</td>
     </tr>
index b897731cbfb7aef32a262179fd9fca39fcc253d3..1abeeb8e0f6de2cb5470edccf5a90e95ce8ec637 100644 (file)
     <comment>When was this cron entry last run</comment>
     <add>4.1</add>
   </field>
+  <field>
+    <name>next_scheduled_run</name>
+    <type>timestamp</type>
+    <default>NULL</default>
+    <comment>When is this cron entry scheduled to run next</comment>
+    <add>4.7</add>
+  </field>
   <field>
     <name>name</name>
     <title>Job Name</title>