date_format) { case 'dd-mm-yyyy': $format_string = 'd-m-Y H:i'; break; case 'mm-dd-yyyy': $format_string = 'm-d-Y H:i'; break; case 'yyyy-mm-dd': $format_string = 'Y-m-d H:i'; break; } return date($format_string, self::mktime($timeInYMDHIS)); } /** * Split full timing into date and time part. */ static function splittime($fulltiming) { return split(' ', $fulltiming); } /** * Calculate the time interval to create repeated event entries. */ static function getRepeatInterval($type, $frequency, $recurringInfo, $start_date, $limit_date) { $repeatInterval = Array(); $starting = self::mktime($start_date); $limiting = self::mktime($limit_date); if($type == 'Daily') { $count = 0; while(true) { ++$count; $interval = ($count * $frequency); if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { break; } $repeatInterval[] = $interval; } } else if($type == 'Weekly') { if($recurringInfo->dayofweek_to_rpt == null) { $count = 0; $weekcount = 7; while(true) { ++$count; $interval = $count * $weekcount; if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { break; } $repeatInterval[] = $interval; } } else { $count = 0; while(true) { ++$count; $interval = $count; $new_timing = self::mktime(self::nexttime($starting, "+$interval days")); $new_timing_dayofweek = date('N', $new_timing); if($new_timing > $limiting) { break; } if(in_array($new_timing_dayofweek-1, $recurringInfo->dayofweek_to_rpt)) { $repeatInterval[] = $interval; } } } } else if($type == 'Monthly') { $count = 0; $avg_monthcount = 30; // TODO: We need to handle month increments precisely! while(true) { ++$count; $interval = $count * $avg_monthcount; if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { break; } $repeatInterval[] = $interval; } } else if($type == 'Yearly') { $count = 0; $avg_monthcount = 30; while(true) { ++$count; $interval = $count * $avg_monthcount; if(self::mktime(self::nexttime($starting, "+$interval days")) > $limiting) { break; } $repeatInterval[] = $interval; } } return $repeatInterval; } /** * Repeat Activity instance till given limit. */ static function repeat($focus) { global $log; $repeat = getrecurringObjValue(); $frequency = $repeat->recur_freq; $repeattype= $repeat->recur_type; $base_focus = new Activity(); $base_focus->retrieve_entity_info($focus->id,'Events'); $base_focus->id = $_REQUEST['record']; $base_focus_start = $base_focus->column_fields['date_start'].' '.$base_focus->column_fields['time_start']; $base_focus_end = $base_focus->column_fields['due_date'].' '.$base_focus->column_fields['time_end']; $repeat_limit = getDBInsertDateValue($_REQUEST['calendar_repeat_limit_date']).' '.$base_focus->column_fields['time_start']; $repeatIntervals = self::getRepeatInterval($repeattype, $frequency, $repeat, $base_focus_start, $repeat_limit); $base_focus_start = self::mktime($base_focus_start); $base_focus_end = self::mktime($base_focus_end); $skip_focus_fields = Array ('record_id', 'createdtime', 'modifiedtime', 'recurringtype'); /** Create instance before and reuse */ $new_focus = new Activity(); foreach($repeatIntervals as $interval) { $new_focus_start_timing = self::nexttime($base_focus_start, "+$interval days"); $new_focus_start_timing = self::splittime(self::formattime($new_focus_start_timing)); $new_focus_end_timing = self::nexttime($base_focus_end, "+$interval days"); $new_focus_end_timing = self::splittime(self::formattime($new_focus_end_timing)); // Reset the new_focus and prepare for reuse if(isset($new_focus->id)) unset($new_focus->id); foreach($new_focus->column_fields as $key=>$value) $new_focus->column_fields[$key] = ''; foreach($base_focus->column_fields as $key=>$value) { if(in_array($key, $skip_focus_fields)) { // skip copying few fields } else if($key == 'date_start') { $new_focus->column_fields['date_start'] = $new_focus_start_timing[0]; } else if($key == 'time_start') { $new_focus->column_fields['time_start'] = $new_focus_start_timing[1]; } else if($key == 'time_end') { $new_focus->column_fields['time_end'] = $new_focus_end_timing[1]; } else if($key == 'due_date') { $new_focus->column_fields['due_date'] = $new_focus_end_timing[0]; } else { $new_focus->column_fields[$key] = $value; } } $new_focus->save('Calendar'); } } } ?>