Example #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;
 }