public $__table = 'core_notify_recur'; // table name
public $id; // int(11) not_null primary_key auto_increment
public $person_id; // int(11) not_null
+ public $recur_id; //INT(11) not_null
public $dtstart; // datetime(19) not_null binary
public $dtend; // datetime(19) not_null binary
public $last_event_id; // int(11)
public $method; // string(128) not_null
-
###END_AUTOCODE
function notifytimesRange($advance) {
- $start = date('Y-m-d H:i:s', max(strtotime("NOW - 24 HOURS"), strtotime($this->dtstart)));
- $end = date('Y-m-d H:i:s', min(strtotime("NOW + $advance DAYS"), strtotime($this->dtend)));
-
+ $start = date('Y-m-d H:i:s', max(strtotime("NOW"), strtotime($this->dtstart)));
+ $end = date('Y-m-d H:i:s', min(strtotime("NOW + $advance DAYS"), strtotime($this->dtend)));
+
}
function notifytimes($advance)
if (strtotime($start) > strtotime($end)) {
return array(); // no data..
}
-
-
-
- switch($this->freq) {
- case 'HOURLY':
-
-
-
- // happens every day based on freq_hour.
- $hours = explode(',', $this->freq_hour);
- for ($day = date('Y-m-d', strtotime($start));
- strtotime($day) < strtotime($end);
- $day = date('Y-m-d', strtotime("$day + 1 DAY")))
- {
- foreach($hours as $h) {
- $hh = strpos($h,":") > 0 ? $h : "$H:00";
- $ret[] = $day . ' ' . $hh;
- }
- }
- return $this->applyTimezoneToList($ret);
-
- case 'DAILY':
- $hours = explode(',', $this->freq_hour);
- if (!$hours) {
- $hours = array(date('H:i', strtotime($this->dtstart)));
- }
-
- $days = explode(','. $this->freq_day);
-
- for ($day = date('Y-m-d', strtotime($start));
- strtotime($day) < strtotime($end);
- $day = date('Y-m-d', strtotime("$day + 1 DAY")))
- {
- // skip days not accounted for..
- if (!in_array(date('N', strtotime($day)), $days)) {
- continue;
- }
-
- foreach($hours as $h) {
- $hh = strpos($h,":") > 0 ? $h : "$H:00";
- $ret[] = $day . ' ' . $hh;
- }
- }
-
- return $this->applyTimezoneToList($ret);
-
-
- case 'MONTHLY': // ignored..
- case 'YEARLY': // ignored..
- break;
-
- }
-
- }
- function applyTimezoneToList($ar)
- {
$ret = array();
+ $hours = empty($this->freq_hour) ? array() : array_unique(json_decode($this->freq_hour));
+ $days = empty($this->freq_day) ? array() : json_decode($this->freq_day);
- $tz = explode($this->tz, ":");
- if ($tz < 0) {
-
- }
- $append = ($tz[0] < 0) ? " - " : " + ";
+ //days to use are = MON FRI SUN
- $append .= abs($tz[0]) . " HOURS";
- if (!empty($tz[1])) {
- $append .= $tz[1] . " MINUTES";
+ //ARE there events on these day in advance days in the future?
+ //TODAY = 25th of may (FRI)
+ //TODAY+1 = 26th (SAT)
+ //TODAY +2 = 27th = SUN (2== advance)
+ //foreeach day in the future upto >>> advance <<< days?
+
+ // - does an event occur on this day?
+ // -YES - then we will generate an event for it.
+ // -NO nothing happens..
+ $usedays = array();
+ for ( $i =0; $i < $advance +1; $i++) {
+ $ut = strtotime("NOW + $i DAYS");
+ $day = strtoupper(date("D", $ut));
+ if (in_array($day, $days)) {
+ $usedays[] = date("Y-m-d", $ut);
+ }
}
+
+ //print_r($this);
- foreach($ar as $a) {
- $ret[] = date('Y-m-d H:i', strtotime($a . $append));
-
+ foreach($usedays as $d){
+ foreach($hours as $h){
+ $date = new DateTime($d. ' ' . $h, new DateTimeZone($this->tz));
+ $date->setTimezone(new DateTimeZone(ini_get('date.timezone')));
+ $ret[] = $date->format('Y-m-d H:i:s');
+ }
}
return $ret;
-
-
}
- function generateNotifications(){
- //$this->notifytimes(2);
+ function generateNotifications()
+ {
//DB_DataObject::debugLevel(1);
$w = DB_DataObject::factory($this->tableName());
- //$this->notifytimes(2);
$w->find();
- //$test = $w->fetchAll();
- //$test = $this->notifytimes(2);
- $test = array();
while($w->fetch()){
- $test[] = clone($w);
- error_log($w->dtstart);
+ $w->generateNotificationsSingle();
+
}
-// foreach($test as $item){
-// error_log($item);
-// }
+ }
+
+
+ function generateNotificationsSingle()
+ {
+
+
+ $notifytimes = $this->notifyTimes(2);
+ ////print_R($notifytimes);
+
+ $newSearch = DB_DataObject::factory('core_notify');
+ $newSearch->whereAdd( 'act_start > NOW()');
+ $newSearch->recur_id = $this->id;
+ $old = $newSearch->fetchAll('act_start', 'id');
+ // returns array('2012-12-xx'=>12, 'date' => id....)
+
+
+ foreach($notifytimes as $time){
+
+ if (isset($old[$time])) {
+ // we already have it...
+ unset($old[$time]);
+ continue;
+ }
+ if (strtotime($time) < time()) {
+ // will not get deleted..
+ //echo "SKIP BEFORE NOW";
+ unset($old[$time]);
+ continue;
+ }
+ // do not have a notify event... creat it..
+ $add = DB_DataObject::factory('core_notify');
+ $add->setFrom(array(
+ "recur_id" => $this->id,
+ "act_start" => $time,
+ "act_when" => $time,
+ "person_id" => $this->person_id,
+ "onid" => $this->onid,
+ "ontable" => $this->ontable,
+ 'evtype' => $this->method,
+ ));
+ $add->insert();
+ }
+ foreach($old as $date => $id ) {
+ $del = DB_DataObject::factory('core_notify');
+ $del->get($id);
+ $del->delete();
+ }
+ //echo("UPDATED");
+
}
+ function onUpdate($old, $request,$roo)
+ {
+ $this->generateNotificationsSingle();
+
+ }
+ function onInsert($request,$roo)
+ {
+ $this->generateNotificationsSingle();
+
+ }
+ function beforeDelete($dependants_array, $roo)
+ {
+ $n = DB_DataObject::Factory("core_notify");
+ $n->recur_id = $this->id;
+ $n->whereAdd('act_start > NOW() OR act_when > NOW()');
+ // should delete old events that have not occurred...
+ $n->delete(DB_DATAOBJECT_WHEREADD_ONLY);
+ }
}