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