/** * 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; }
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; }