Ejemplo n.º 1
0
 /**
  * This function takes criterias saved in civicrm_action_schedule table
  * and creates recursion rule
  *
  * @param array $scheduleReminderDetails
  *   Array of repeat criterias saved in civicrm_action_schedule table .
  *
  * @return object
  *   When object
  */
 public function getRecursionFromSchedule($scheduleReminderDetails = array())
 {
     $r = new When();
     //If there is some data for this id
     if ($scheduleReminderDetails['repetition_frequency_unit']) {
         if ($scheduleReminderDetails['start_action_date']) {
             $currDate = date('Y-m-d H:i:s', strtotime($scheduleReminderDetails['start_action_date']));
         } else {
             $currDate = date("Y-m-d H:i:s");
         }
         $start = new DateTime($currDate);
         $this->recursion_start_date = $start;
         if ($scheduleReminderDetails['repetition_frequency_unit']) {
             $repetition_frequency_unit = $scheduleReminderDetails['repetition_frequency_unit'];
             if ($repetition_frequency_unit == "day") {
                 $repetition_frequency_unit = "dai";
             }
             $repetition_frequency_unit = $repetition_frequency_unit . 'ly';
             $r->recur($start, $repetition_frequency_unit);
         }
         if ($scheduleReminderDetails['repetition_frequency_interval']) {
             $r->interval($scheduleReminderDetails['repetition_frequency_interval']);
         } else {
             $r->errors[] = 'Repeats every: is a required field';
         }
         //week
         if ($scheduleReminderDetails['repetition_frequency_unit'] == 'week') {
             if ($scheduleReminderDetails['start_action_condition']) {
                 $startActionCondition = $scheduleReminderDetails['start_action_condition'];
                 $explodeStartActionCondition = explode(',', $startActionCondition);
                 $buildRuleArray = array();
                 foreach ($explodeStartActionCondition as $key => $val) {
                     $buildRuleArray[] = strtoupper(substr($val, 0, 2));
                 }
                 $r->wkst('MO')->byday($buildRuleArray);
             }
         }
         //month
         if ($scheduleReminderDetails['repetition_frequency_unit'] == 'month') {
             if ($scheduleReminderDetails['entity_status']) {
                 $startActionDate = explode(" ", $scheduleReminderDetails['entity_status']);
                 switch ($startActionDate[0]) {
                     case 'first':
                         $startActionDate1 = 1;
                         break;
                     case 'second':
                         $startActionDate1 = 2;
                         break;
                     case 'third':
                         $startActionDate1 = 3;
                         break;
                     case 'fourth':
                         $startActionDate1 = 4;
                         break;
                     case 'last':
                         $startActionDate1 = -1;
                         break;
                 }
                 $concatStartActionDateBits = $startActionDate1 . strtoupper(substr($startActionDate[1], 0, 2));
                 $r->byday(array($concatStartActionDateBits));
             } elseif ($scheduleReminderDetails['limit_to']) {
                 $r->bymonthday(array($scheduleReminderDetails['limit_to']));
             }
         }
         //Ends
         if ($scheduleReminderDetails['start_action_offset']) {
             if ($scheduleReminderDetails['start_action_offset'] > 30) {
                 $r->errors[] = 'Occurrences should be less than or equal to 30';
             }
             $r->count($scheduleReminderDetails['start_action_offset']);
         }
         if (!empty($scheduleReminderDetails['absolute_date'])) {
             $absoluteDate = CRM_Utils_Date::setDateDefaults($scheduleReminderDetails['absolute_date']);
             // absolute_date column of scheduled-reminder table is of type date (and not datetime)
             // and we always want the date to be included, and therefore appending 23:59
             $endDate = new DateTime($absoluteDate[0] . ' ' . '23:59');
             $r->until($endDate);
         }
         if (!$scheduleReminderDetails['start_action_offset'] && !$scheduleReminderDetails['absolute_date']) {
             $r->errors[] = 'Ends: is a required field';
         }
     } else {
         $r->errors[] = 'Repeats: is a required field';
     }
     return $r;
 }
Ejemplo n.º 2
0
 public static function decodeRepeat($repeat, $start, $end)
 {
     date_default_timezone_set('UTC');
     require_once ROOTPATH . '/plugins/when/When.php';
     $r = new When();
     if ($repeat['frequency'] === 'none') {
         return array();
     }
     //Nao deve ser usando o horário da repeticao pois nela contem apenas o dias,
     //deve se recuperar o horário do evento para um correto calculo.
     if (max($start, $repeat['startTime']) != $repeat['startTime']) {
         $time = new DateTime('@' . (int) ($repeat['startTime'] / 1000), new DateTimeZone('UTC'));
         $hoursOcurrence = new DateTime('@' . (int) ($start / 1000), new DateTimeZone('UTC'));
         $hoursOcurrence = $hoursOcurrence->format('H');
         $diffTime = ($time->format('H') - $hoursOcurrence) * 3600000 + $time->format('i') * 60000;
         $start = new DateTime('@' . (int) (($start + $diffTime) / 1000), new DateTimeZone('UTC'));
     } else {
         $start = new DateTime('@' . (int) (max($start, $repeat['startTime']) / 1000), new DateTimeZone('UTC'));
     }
     foreach ($repeat as $rule => $value) {
         if (!isset($value) || !$value || $value === "0") {
             continue;
         }
         switch (strtolower($rule)) {
             case "starttime":
                 break;
             case "frequency":
                 $r->recur($start, $value);
                 break;
             case "endtime":
                 $r->until(new DateTime('@' . (int) ($value / 1000)));
                 break;
             case "count":
             case "interval":
             case "wkst":
                 $r->{$rule}($value);
                 break;
             default:
                 $r->{$rule}(!is_array($value) ? explode(',', $value) : $value);
                 break;
         }
     }
     $return = array();
     while ($result = $r->next()) {
         $u = $result->format('U') * 1000;
         if ($u > $end) {
             //data da repetição atual maior que a data final da busca do usuario ?
             break;
         }
         $return[] = $u;
     }
     return $return;
 }