function generate_tasks($verbose = true) { include_once 'when/When.php'; $mysqli = connectdb(true); $mysqli2 = connectdb(true); $mysqli3 = connectdb(true); $start = new DateTime(); $stmt = $mysqli->prepare("Select TaskID, Title, Details, RRule, Time FROM tasks_master WHERE Active='Y'"); $stmt->execute(); $stmt->bind_result($rtaskid, $rtitle, $rdetails, $rrrule, $rtime); while ($stmt->fetch()) { $r = new When(); $r->recur($start)->rrule($rrrule . ";COUNT=30"); if ($verbose) { echo $rtaskid . " " . $rtitle . " " . $rrrule . " " . $rdetails . "<br />"; } while ($result = $r->next()) { if (strtotime($result->format('Y-m-d')) < strtotime('+30 days')) { $nextime = $result->format('Y-m-d') . ' ' . $rtime; if ($verbose) { echo $nextime . " "; } $checkexistingstmt = $mysqli3->query("SELECT TaskWorkingID FROM tasks_working WHERE TaskID={$rtaskid} AND Scheduled='{$nextime}'"); if ($checkexistingstmt->num_rows > 0) { if ($verbose) { echo " - Already exists... skipping!!<br />"; } } else { $statement = $mysqli2->prepare("INSERT INTO tasks_working (TaskID, Scheduled) Values (?,?)"); if (!$statement->bind_param('is', $rtaskid, $nextime)) { if ($verbose) { echo "Binding parameters failed: (" . $statement->errno . ") " . $statement->error; } } if (!$statement->execute()) { if ($verbose) { echo " - Executing query failed: (" . $statement->errno . ") " . $statement->error; } } else { if ($verbose) { echo " - Sucessfully added task<br />"; } } } } } } $mysqli3->close(); $mysqli2->close(); $mysqli->close(); }
public function valid() { if ($this->cache === true) { // check to see if the current position has already been stored if (!empty($this->results[$this->position])) { return isset($this->results[$this->position]); } elseif ($next_date = parent::next()) { $this->results[] = $next_date; return isset($next_date); } } else { // check to see if there is another result and set that as the result if ($next_date = parent::next()) { $this->result = $next_date; return isset($this->result); } } // end the foreach loop when all options are exhausted return false; }
protected function createIcal($data, $params = false) { $ical = new icalCreatorVcalendar(); $ical->setProperty('method', isset($params['method']) ? $params['method'] : 'PUBLISH'); /* * Seta propiedades obrigatorias para alguns softwares (Outlook) */ $ical->setProperty('x-wr-calname', 'Calendar Expresso'); $ical->setProperty('X-WR-CALDESC', 'Calendar Expresso'); $ical->setProperty('X-WR-TIMEZONE', $params['X-WR-TIMEZONE']); foreach ($data as $i => $v) { switch ($v['type']) { case EVENT_ID: $vevent = $ical->newComponent('vevent'); $vevent->setProperty('summary', $v['summary']); $vevent->setProperty('description', isset($v['description']) ? $v['description'] : ''); $vevent->setProperty('location', $v['location']); $vevent->setProperty('tranp', isset($v['tranparent']) && $v['tranparent'] == TRANSP_TRANSPARENT ? 'TRANSPARENT' : 'OPAQUE'); $timezone = new DateTimeZone('UTC'); $apTimezone = self::nomalizeTZID(isset($v['timezone']) && $v['timezone'] != 'null' ? $v['timezone'] : $params['defaultTZI']); $apTimezoneOBJ = new DateTimeZone($apTimezone); $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); $sTime->setTimezone($apTimezoneOBJ); $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); $eTime->setTimezone($apTimezoneOBJ); if (isset($v['repeat']) && (isset($v['repeat']['frequency']) && $v['repeat']['frequency'] && $v['repeat']['frequency'] != 'none')) { $vevent->setProperty('rrule', $this->formatIcalRepeat($v['repeat'])); } $vevent->setProperty('dtstamp', array('timestamp' => $v['dtstamp'] / 1000)); if (isset($v['allDay']) && $v['allDay'] == 1) { $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); } else { $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone)); $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone)); $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); } if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) { $participants = $v['participants']; } else { $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); } if (is_array($participants) && count($participants) > 0) { foreach ($participants as $ii => $vv) { if (isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) { if ($vv['isExternal'] == 1) { $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); } else { $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); } } if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) { $alarms = isset($participants[$ii]['alarms']) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); if (is_array($alarms)) { self::createAlarms($alarms, $vevent); } } } } if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) { $this->createAttendee($v['participants'], $vevent); } if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) { $this->createAttachment($v['attachments'], $vevent); } $vevent->setProperty('uid', $v['uid']); $timezoneDayligth = Controller::read(array('concept' => 'timezones'), null, array('filter' => array('=', 'tzid', $apTimezone))); if (!empty($timezoneDayligth) && count($timezoneDayligth) > 0) { if (array_key_exists(0, $timezoneDayligth)) { $timezoneDayligth = $timezoneDayligth[0]; } date_default_timezone_set('UTC'); require_once ROOTPATH . '/plugins/when/When.php'; $r = new When(); $start = new DateTime('1970-01-01 ' . $timezoneDayligth['standardDtstart']); $r = new When(); $r->recur($start, $timezoneDayligth['standardFrequency'])->until($start->modify('+1 years'))->bymonth(array($timezoneDayligth['standardBymonth']))->byday(array($timezoneDayligth['daylightByday'])); $date = $r->next(); $timezone = $ical->newComponent('vtimezone'); $timezone->setProperty('tzid', $apTimezone); $standard = $timezone->newComponent("standard"); $standard->setProperty("tzoffsetfrom", $timezoneDayligth['standardFrom']); $standard->setProperty("tzoffsetto", $timezoneDayligth['standardTo']); $standard->setProperty("dtstart", $date->format(DATE_RFC822), array("VALUE" => "DATE")); $rrule = array('FREQ' => $timezoneDayligth['standardFrequency'], 'BYMONTH' => $timezoneDayligth['standardBymonth'], 'BYday' => array(preg_replace("/[^0-9]/", "", $timezoneDayligth['standardByday']), "DAY" => preg_replace("/[^a-zA-Z\\s]/", "", $timezoneDayligth['standardByday']))); $standard->setProperty('rrule', $rrule); $daylight = $timezone->newComponent("daylight"); $daylight->setProperty("tzoffsetfrom", $timezoneDayligth['daylightFrom']); $daylight->setProperty("tzoffsetto", $timezoneDayligth['daylightTo']); $start = new DateTime('1970-01-01 ' . $timezoneDayligth['daylightDtstart']); $r->recur($start, $timezoneDayligth['daylightFrequency'])->until($start->modify('+1 years'))->bymonth(array($timezoneDayligth['daylightBymonth']))->byday(array($timezoneDayligth['daylightByday'])); $date = $r->next(); $daylight->setProperty("dtstart", $date->format(DATE_RFC822), array("VALUE" => "DATE")); $rrule = array('FREQ' => $timezoneDayligth['daylightFrequency'], 'BYMONTH' => $timezoneDayligth['daylightBymonth'], 'BYday' => array(preg_replace("/[^0-9]/", "", $timezoneDayligth['daylightByday']), "DAY" => preg_replace("/[^a-zA-Z\\s]/", "", $timezoneDayligth['daylightByday']))); $daylight->setProperty('rrule', $rrule); } break; case TODO_ID: $todo = $ical->newComponent('todo'); $todo->setProperty('summary', $v['summary']); $todo->setProperty('description', isset($v['description']) ? $v['description'] : ''); $todo->setProperty('priority', $v['priority']); $todo->setProperty('percent-complete', $v['percentage']); $todo->setProperty('status', $this->_getStatusTodo($v['status'])); $timezone = new DateTimeZone('UTC'); $apTimezone = self::nomalizeTZID(isset($v['timezone']) && $v['timezone'] != 'null' ? $v['timezone'] : $params['defaultTZI']); $apTimezoneOBJ = new DateTimeZone($apTimezone); $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); $sTime->setTimezone($apTimezoneOBJ); $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); $eTime->setTimezone($apTimezoneOBJ); $todo->setProperty('dtstamp', array('timestamp' => $v['dtstamp'] / 1000)); if (isset($v['allDay']) && $v['allDay'] == 1) { $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); } else { $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone)); $todo->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone)); //$todo->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); } if (isset($v['due']) && $v['due'] != '' && (int) $v['due'] > 0) { $dueTime = new DateTime('@' . (int) ($v['due'] / 1000), $timezone); $dueTime->setTimezone($apTimezoneOBJ); $todo->setProperty('due', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone)); $todo->setProperty('dueTime', $dueTime->format(DATE_RFC822), array('TZID' => $apTimezone)); } if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) { $participants = $v['participants']; } else { $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); } if (is_array($participants) && count($participants) > 0) { foreach ($participants as $ii => $vv) { if (isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) { if ($vv['isExternal'] == 1) { $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); } else { $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); } } if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) { $alarms = isset($participants[$ii]['alarms']) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); if (is_array($alarms)) { self::createAlarms($alarms, $todo); } } } } if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) { $this->createAttendee($v['participants'], $todo); } if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) { $this->createAttachment($v['attachments'], $todo); } $todo->setProperty('uid', $v['uid']); break; default: break; } } return $ical->createCalendar(); }
/** * changing only WKST from MO to SU, yields different results... * DTSTART;TZID=America/New_York:19970805T090000 * RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU */ function testThirtyTwo() { $results[] = new DateTime('1997-08-05 09:00:00'); $results[] = new DateTime('1997-08-17 09:00:00'); $results[] = new DateTime('1997-08-19 09:00:00'); $results[] = new DateTime('1997-08-31 09:00:00'); $r = new When(); $r->recur('19970805T090000')->rrule('FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * Every year on the -1th, -100th, and -200th day for 5 occurrences (checked via google calendar import below) * BEGIN:VCALENDAR * PRODID:-//Google Inc//Google Calendar 70.9054//EN * VERSION:2.0 * CALSCALE:GREGORIAN * METHOD:PUBLISH * BEGIN:VTIMEZONE * TZID:America/New_York * X-LIC-LOCATION:America/New_York * BEGIN:DAYLIGHT * TZOFFSETFROM:-0500 * TZOFFSETTO:-0400 * TZNAME:EDT * DTSTART:19700308T020000 * RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU * END:DAYLIGHT * BEGIN:STANDARD * TZOFFSETFROM:-0400 * TZOFFSETTO:-0500 * TZNAME:EST * DTSTART:19701101T020000 * RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU * END:STANDARD * END:VTIMEZONE * BEGIN:VEVENT * DTSTART;VALUE=DATE:20101231 * RRULE:FREQ=YEARLY;COUNT=5;BYYEARDAY=-1,-100,-200 * DTSTAMP:20101231T090000 * CREATED:20101231T090000 * DESCRIPTION: * LAST-MODIFIED:20101231T090000 * LOCATION: * SEQUENCE:2 * STATUS:CONFIRMED * SUMMARY:testing yearly event * TRANSP:TRANSPARENT * END:VEVENT * END:VCALENDAR */ function testTwentyFour() { $results[] = new DateTime('2010-12-31 09:00:00'); $results[] = new DateTime('2010-09-23 09:00:00'); $results[] = new DateTime('2010-06-15 09:00:00'); $results[] = new DateTime('2011-12-31 09:00:00'); $results[] = new DateTime('2011-09-23 09:00:00'); $r = new When(); $r->recur('20101231T090000')->rrule('FREQ=YEARLY;COUNT=5;BYYEARDAY=-1,-100,-200'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * Every day in January, for 3 years: * DTSTART;TZID=America/New_York:19980101T090000 * RRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1 */ function testThirtySeven() { $results[] = new DateTime('1998-01-01 09:00:00'); $results[] = new DateTime('1998-01-02 09:00:00'); $results[] = new DateTime('1998-01-03 09:00:00'); $results[] = new DateTime('1998-01-04 09:00:00'); $results[] = new DateTime('1998-01-05 09:00:00'); $results[] = new DateTime('1998-01-06 09:00:00'); $results[] = new DateTime('1998-01-07 09:00:00'); $results[] = new DateTime('1998-01-08 09:00:00'); $results[] = new DateTime('1998-01-09 09:00:00'); $results[] = new DateTime('1998-01-10 09:00:00'); $results[] = new DateTime('1998-01-11 09:00:00'); $results[] = new DateTime('1998-01-12 09:00:00'); $results[] = new DateTime('1998-01-13 09:00:00'); $results[] = new DateTime('1998-01-14 09:00:00'); $results[] = new DateTime('1998-01-15 09:00:00'); $results[] = new DateTime('1998-01-16 09:00:00'); $results[] = new DateTime('1998-01-17 09:00:00'); $results[] = new DateTime('1998-01-18 09:00:00'); $results[] = new DateTime('1998-01-19 09:00:00'); $results[] = new DateTime('1998-01-20 09:00:00'); $results[] = new DateTime('1998-01-21 09:00:00'); $results[] = new DateTime('1998-01-22 09:00:00'); $results[] = new DateTime('1998-01-23 09:00:00'); $results[] = new DateTime('1998-01-24 09:00:00'); $results[] = new DateTime('1998-01-25 09:00:00'); $results[] = new DateTime('1998-01-26 09:00:00'); $results[] = new DateTime('1998-01-27 09:00:00'); $results[] = new DateTime('1998-01-28 09:00:00'); $results[] = new DateTime('1998-01-29 09:00:00'); $results[] = new DateTime('1998-01-30 09:00:00'); $results[] = new DateTime('1998-01-31 09:00:00'); $results[] = new DateTime('1999-01-01 09:00:00'); $results[] = new DateTime('1999-01-02 09:00:00'); $results[] = new DateTime('1999-01-03 09:00:00'); $results[] = new DateTime('1999-01-04 09:00:00'); $results[] = new DateTime('1999-01-05 09:00:00'); $results[] = new DateTime('1999-01-06 09:00:00'); $results[] = new DateTime('1999-01-07 09:00:00'); $results[] = new DateTime('1999-01-08 09:00:00'); $results[] = new DateTime('1999-01-09 09:00:00'); $results[] = new DateTime('1999-01-10 09:00:00'); $results[] = new DateTime('1999-01-11 09:00:00'); $results[] = new DateTime('1999-01-12 09:00:00'); $results[] = new DateTime('1999-01-13 09:00:00'); $results[] = new DateTime('1999-01-14 09:00:00'); $results[] = new DateTime('1999-01-15 09:00:00'); $results[] = new DateTime('1999-01-16 09:00:00'); $results[] = new DateTime('1999-01-17 09:00:00'); $results[] = new DateTime('1999-01-18 09:00:00'); $results[] = new DateTime('1999-01-19 09:00:00'); $results[] = new DateTime('1999-01-20 09:00:00'); $results[] = new DateTime('1999-01-21 09:00:00'); $results[] = new DateTime('1999-01-22 09:00:00'); $results[] = new DateTime('1999-01-23 09:00:00'); $results[] = new DateTime('1999-01-24 09:00:00'); $results[] = new DateTime('1999-01-25 09:00:00'); $results[] = new DateTime('1999-01-26 09:00:00'); $results[] = new DateTime('1999-01-27 09:00:00'); $results[] = new DateTime('1999-01-28 09:00:00'); $results[] = new DateTime('1999-01-29 09:00:00'); $results[] = new DateTime('1999-01-30 09:00:00'); $results[] = new DateTime('1999-01-31 09:00:00'); $results[] = new DateTime('2000-01-01 09:00:00'); $results[] = new DateTime('2000-01-02 09:00:00'); $results[] = new DateTime('2000-01-03 09:00:00'); $results[] = new DateTime('2000-01-04 09:00:00'); $results[] = new DateTime('2000-01-05 09:00:00'); $results[] = new DateTime('2000-01-06 09:00:00'); $results[] = new DateTime('2000-01-07 09:00:00'); $results[] = new DateTime('2000-01-08 09:00:00'); $results[] = new DateTime('2000-01-09 09:00:00'); $results[] = new DateTime('2000-01-10 09:00:00'); $results[] = new DateTime('2000-01-11 09:00:00'); $results[] = new DateTime('2000-01-12 09:00:00'); $results[] = new DateTime('2000-01-13 09:00:00'); $results[] = new DateTime('2000-01-14 09:00:00'); $results[] = new DateTime('2000-01-15 09:00:00'); $results[] = new DateTime('2000-01-16 09:00:00'); $results[] = new DateTime('2000-01-17 09:00:00'); $results[] = new DateTime('2000-01-18 09:00:00'); $results[] = new DateTime('2000-01-19 09:00:00'); $results[] = new DateTime('2000-01-20 09:00:00'); $results[] = new DateTime('2000-01-21 09:00:00'); $results[] = new DateTime('2000-01-22 09:00:00'); $results[] = new DateTime('2000-01-23 09:00:00'); $results[] = new DateTime('2000-01-24 09:00:00'); $results[] = new DateTime('2000-01-25 09:00:00'); $results[] = new DateTime('2000-01-26 09:00:00'); $results[] = new DateTime('2000-01-27 09:00:00'); $results[] = new DateTime('2000-01-28 09:00:00'); $results[] = new DateTime('2000-01-29 09:00:00'); $results[] = new DateTime('2000-01-30 09:00:00'); $results[] = new DateTime('2000-01-31 09:00:00'); $r = new When(); $r->recur('19980101T090000', 'daily')->until('20000131T140000')->bymonth(array(1)); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * Every year on the -1th, -100th, and -200th day for 5 occurrences (checked via google calendar import below) * BEGIN:VCALENDAR * PRODID:-//Google Inc//Google Calendar 70.9054//EN * VERSION:2.0 * CALSCALE:GREGORIAN * METHOD:PUBLISH * BEGIN:VTIMEZONE * TZID:America/New_York * X-LIC-LOCATION:America/New_York * BEGIN:DAYLIGHT * TZOFFSETFROM:-0500 * TZOFFSETTO:-0400 * TZNAME:EDT * DTSTART:19700308T020000 * RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU * END:DAYLIGHT * BEGIN:STANDARD * TZOFFSETFROM:-0400 * TZOFFSETTO:-0500 * TZNAME:EST * DTSTART:19701101T020000 * RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU * END:STANDARD * END:VTIMEZONE * BEGIN:VEVENT * DTSTART;VALUE=DATE:20101231 * RRULE:FREQ=YEARLY;COUNT=5;BYYEARDAY=-1,-100,-200 * DTSTAMP:20101231T090000 * CREATED:20101231T090000 * DESCRIPTION: * LAST-MODIFIED:20101231T090000 * LOCATION: * SEQUENCE:2 * STATUS:CONFIRMED * SUMMARY:testing yearly event * TRANSP:TRANSPARENT * END:VEVENT * END:VCALENDAR */ function testTwentyFour() { $results[] = new DateTime('2010-12-31 09:00:00'); $results[] = new DateTime('2010-09-23 09:00:00'); $results[] = new DateTime('2010-06-15 09:00:00'); $results[] = new DateTime('2011-12-31 09:00:00'); $results[] = new DateTime('2011-09-23 09:00:00'); $r = new When(); $r->recur('20101231T090000', 'yearly')->count(5)->byyearday(array(-1, -100, -200)); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
public function updateEvent($params) { $filter = array(CalendarManager::CALENDAR_KEY_ID => $params['calendarId']); $calendarData = self::retrieveCalendarData($filter); $cal = self::getRemoteCalendar($calendarData); $urls = explode('_', $params['id']); $url = $urls[0]; foreach ($cal as $obj1) { if ($url == $obj1->getUrl()) { $thisEvent = $obj1; } } $props = $thisEvent->getBaseComponent()->getProperties(); foreach ($props as $prop) { if ($prop->name == "DTSTART") { $dtstartzone = isset($prop->parameters["TZID"]) ? $prop->parameters["TZID"] : ""; $params['dtstartzone'] = $dtstartzone; $dtStartForAll = $prop->content; } if ($prop->name == "DTEND") { $dtEndForAll = $prop->content; } } //if (!$params['isEditAll'] && $params['eventGroup'] > 0) if (!$params['isEditAll']) { // edit on only this. $thisEvent = $cal->newComponent('VEVENT'); $thisEvent->update($params, $cal); $repeated = false; /*$startDate= date("Ymd\THis\Z",$params['timeStart']); $endDate= date("Ymd\THis\Z",$params['timeEnd']); */ $startDate = date("Ymd\\THis\\Z", CalDavConverter::dateCalDavToEyeos($dtStartForAll) - $params['gmtTimeDiffrence'] * 3600); $endDate = date("Ymd\\THis\\Z", CalDavConverter::dateCalDavToEyeos($dtEndForAll) - $params['gmtTimeDiffrence'] * 3600); } else { // edit all events $newValues = array('DTSTART' => $params['dtstart'], 'DTEND' => $params['dtend'], 'SUMMARY' => $params['subject'], 'LOCATION' => $params['location'], 'DESCRIPTION' => $params['description']); $thisEvent->setAllProperties($newValues); $cal->update($thisEvent->getUrl(), $thisEvent->getEtag()); $repeated = true; $startDate = date("Ymd\\THis\\Z", CalDavConverter::dateCalDavToEyeos($dtStartForAll) - $params['gmtTimeDiffrence'] * 3600); $endDate = date("Ymd\\THis\\Z", CalDavConverter::dateCalDavToEyeos($dtEndForAll) - $params['gmtTimeDiffrence'] * 3600); } $creator = ProcManager::getInstance()->getCurrentProcess()->getLoginContext()->getEyeosUser(); $start = new When(); $start->recur($startDate)->rrule($rrule); $end = new When(); $end->recur($endDate)->rrule($rrule); /*$repeated=false; if($params['repeatType']!='n'){ $repeated=true; }*/ $maxRepeatLimit = CalendarManager::MAX_REPEAT_LIMIT; $repeated = true; if ($repeated) { for ($i = 0; $i < $maxRepeatLimit; $i++) { $sDate = $start->next(); if (!is_object($sDate)) { break; } $timeStart = $sDate->getTimestamp(); $eDate = $end->next(); $timeEnd = $eDate->getTimestamp(); $newEvent = CalendarManager::getInstance()->getNewEvent(); $eventId = $url . '_' . $i; $newEvent->setId($eventId); $newEvent->setSubject($params['subject']); $newEvent->setTimeStart($timeStart); $newEvent->setTimeEnd($timeEnd); $newEvent->setCalendarId($params['calendarId']); $newEvent->setIsAllDay($params['isAllDay']); $newEvent->setRepetition($params['repetition']); $newEvent->setRepeatType($params['repeatType']); $newEvent->setLocation($params['location']); $newEvent->setDescription($params['description']); $newEvent->setFinalType($params['finalType']); $newEvent->setFinalValue($params['finalValue']); //$newEvent->seteventGroup(1); // its repeat event so we need to set it to greater then 0 $newEvent->setCreatorId($creator->getId()); $newEvent->setEventGroup(1); $newRepeatEventArr[] = $newEvent; } } else { $newEvent = CalendarManager::getInstance()->getNewEvent(); $eventId = $url; $newEvent->setId($eventId); $newEvent->setSubject($params['subject']); $newEvent->setTimeStart($params['timeStart']); $newEvent->setTimeEnd($params['timeEnd']); $newEvent->setCalendarId($params['calendarId']); $newEvent->setIsAllDay($params['isAllDay']); $newEvent->setRepetition($params['repetition']); $newEvent->setRepeatType($params['repeatType']); $newEvent->setLocation($params['location']); $newEvent->setDescription($params['description']); $newEvent->setFinalType($params['finalType']); $newEvent->setFinalValue($params['finalValue']); //$newEvent->seteventGroup(1); // its repeat event so we need to set it to greater then 0 $newEvent->setCreatorId($creator->getId()); $newEvent->setEventGroup(0); $newRepeatEventArr[] = $newEvent; } //print_r($newRepeatEventArr); return $newRepeatEventArr; }
public static function generateEventOutput($event, $start, $end) { $output = array(); if (isset($event['calendardata'])) { $object = OC_VObject::parse($event['calendardata']); $vevent = $object->VEVENT; } else { $vevent = $event['vevent']; } $last_modified = @$vevent->__get('LAST-MODIFIED'); $lastmodified = $last_modified ? $last_modified->getDateTime()->format('U') : 0; $output = array('id' => (int) $event['id'], 'title' => $event['summary'] != NULL || $event['summary'] != '' ? $event['summary'] : self::$l10n->t('unnamed'), 'description' => isset($vevent->DESCRIPTION) ? $vevent->DESCRIPTION->value : '', 'lastmodified' => $lastmodified); $dtstart = $vevent->DTSTART; $start_dt = $dtstart->getDateTime(); $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); $end_dt = $dtend->getDateTime(); if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) { $output['allDay'] = true; } else { $output['allDay'] = false; $start_dt->setTimezone(new DateTimeZone(self::$tz)); $end_dt->setTimezone(new DateTimeZone(self::$tz)); } // Handle exceptions to recurring events $exceptionDateObjects = $vevent->select('EXDATE'); $exceptionDateMap = array(); foreach ($exceptionDateObjects as $exceptionObject) { foreach ($exceptionObject->getDateTimes() as $datetime) { $ts = $datetime->getTimestamp(); $exceptionDateMap[idate('Y', $ts)][idate('m', $ts)][idate('d', $ts)] = true; } } $return = array(); if ($event['repeating'] == 1) { $duration = (double) $end_dt->format('U') - (double) $start_dt->format('U'); $r = new When(); $r->recur($start_dt)->rrule((string) $vevent->RRULE); /*$r = new iCal_Repeat_Generator(array('RECUR' => $start_dt, * 'RRULE' => (string)$vevent->RRULE * 'RDATE' => (string)$vevent->RDATE * 'EXRULE' => (string)$vevent->EXRULE * 'EXDATE' => (string)$vevent->EXDATE));*/ while ($result = $r->next()) { if ($result < $start) { continue; } if ($result > $end) { break; } // Check for exceptions to recurring events $ts = $result->getTimestamp(); if (isset($exceptionDateMap[idate('Y', $ts)][idate('m', $ts)][idate('d', $ts)])) { continue; } unset($ts); if ($output['allDay'] == true) { $output['start'] = $result->format('Y-m-d'); $output['end'] = date('Y-m-d', $result->format('U') + --$duration); } else { $output['start'] = $result->format('Y-m-d H:i:s'); $output['end'] = date('Y-m-d H:i:s', $result->format('U') + $result->format('Z') + $duration); } $return[] = $output; } } else { if ($output['allDay'] == true) { $output['start'] = $start_dt->format('Y-m-d'); $end_dt->modify('-1 sec'); $output['end'] = $end_dt->format('Y-m-d'); } else { $output['start'] = $start_dt->format('Y-m-d H:i:s'); $output['end'] = $end_dt->format('Y-m-d H:i:s'); } $return[] = $output; } return $return; }
function testTwentyFive() { $results[] = new DateTime('2010-01-15 09:00:00'); $results[] = new DateTime('2011-01-15 09:00:00'); $results[] = new DateTime('2012-01-15 09:00:00'); $results[] = new DateTime('2013-01-15 09:00:00'); $results[] = new DateTime('2014-01-15 09:00:00'); $results[] = new DateTime('2015-01-15 09:00:00'); $r = new When(); $r->recur('20100115T090000')->rrule('FREQ=YEARLY'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * The same day of every month: * RRULE:FREQ=MONTHLY */ function testTwentyThree() { $results[] = new DateTime('1997-09-14 09:00:00'); $results[] = new DateTime('1997-10-14 09:00:00'); $results[] = new DateTime('1997-11-14 09:00:00'); $results[] = new DateTime('1997-12-14 09:00:00'); $results[] = new DateTime('1998-01-14 09:00:00'); $results[] = new DateTime('1998-02-14 09:00:00'); $results[] = new DateTime('1998-03-14 09:00:00'); $results[] = new DateTime('1998-04-14 09:00:00'); $results[] = new DateTime('1998-05-14 09:00:00'); $results[] = new DateTime('1998-06-14 09:00:00'); $results[] = new DateTime('1998-07-14 09:00:00'); $results[] = new DateTime('1998-08-14 09:00:00'); $results[] = new DateTime('1998-09-14 09:00:00'); $results[] = new DateTime('1998-10-14 09:00:00'); $results[] = new DateTime('1998-11-14 09:00:00'); $results[] = new DateTime('1998-12-14 09:00:00'); $results[] = new DateTime('1999-01-14 09:00:00'); $r = new When(); $r->recur('19970914T090000')->count(17)->rrule('FREQ=MONTHLY'); foreach ($results as $result) { $date = $r->next(); $this->assertEquals($result, $date); } }
function getAllEventsOfRecurringEvent($obj) { $events = array(); $event = array(); $event["etag"] = $obj->getEtag(); $event["url"] = $obj->getUrl(); $event["eventgroupid"] = 0; $props = $obj->getBaseComponent()->getProperties(); $xDateArr = array(); $repeated = false; foreach ($props as $prop) { switch ($prop->name) { case "SUMMARY": $event["summary"] = $prop->content; break; case "DTSTART": $event["dtstart"] = $prop->content; $event["dtstartzone"] = isset($prop->parameters["TZID"]) ? $prop->parameters["TZID"] : ""; break; case "DTEND": $event["dtend"] = $prop->content; $event["dtendzone"] = isset($prop->parameters["TZID"]) ? $prop->parameters["TZID"] : ""; break; case "RRULE": $event["rrule"] = $prop->content; if (!empty($prop->content)) { $repeated = true; } $start = new When(); $start->recur($event["dtstart"])->rrule($event["rrule"]); $end = new When(); $end->recur($event["dtend"])->rrule($event["rrule"]); break; case "LOCATION": $event["location"] = $prop->content; break; case "DESCRIPTION": $event["description"] = $prop->content; break; case "UID": $event["uid"] = $prop->content; break; case "EXDATE": $event["exdate"][] = $prop->content; break; case "RECURRENCE-ID": $event["recurrence-id"] = $prop->content; $repeated = false; break; } } if ($repeated) { $tempEtag = $event['url']; $maxRepeatLimit = CalendarManager::MAX_REPEAT_LIMIT; for ($i = 0; $i < $maxRepeatLimit; $i++) { $sDate = $start->next(); if (!is_object($sDate)) { break; } $event['dtstart'] = $sDate->format("Ymd\\THis\\Z"); $eDate = $end->next(); if (!is_object($eDate)) { break; } $event['dtend'] = $eDate->format("Ymd\\THis\\Z"); $event["eventgroupid"] = 1; $event["url"] = $tempEtag . '_' . $i; // we appending '_$i' because in case of repeated eevents there is same id. to show event there should be different id. $events[] = $event; } } else { $events[] = $event; } return $events; }
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; }
/** * RRULE:FREQ=DAILY */ function testThirtyNine() { $results[] = new DateTime('1999-12-25 09:00:00'); $results[] = new DateTime('1999-12-26 09:00:00'); $results[] = new DateTime('1999-12-27 09:00:00'); $results[] = new DateTime('1999-12-28 09:00:00'); $results[] = new DateTime('1999-12-29 09:00:00'); $results[] = new DateTime('1999-12-30 09:00:00'); $results[] = new DateTime('1999-12-31 09:00:00'); $results[] = new DateTime('2000-01-01 09:00:00'); $results[] = new DateTime('2000-01-02 09:00:00'); $results[] = new DateTime('2000-01-03 09:00:00'); $results[] = new DateTime('2000-01-04 09:00:00'); $r = new When(); $r->recur('19991225T090000')->rrule('FREQ=DAILY'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * changing only WKST from MO to SU, yields different results... * DTSTART;TZID=America/New_York:19970805T090000 * RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU */ function testThirtyTwo() { $results[] = new DateTime('1997-08-05 09:00:00'); $results[] = new DateTime('1997-08-17 09:00:00'); $results[] = new DateTime('1997-08-19 09:00:00'); $results[] = new DateTime('1997-08-31 09:00:00'); $r = new When(); $r->recur('19970805T090000', 'weekly')->interval(2)->count(4)->byday(array('TU', 'SU'))->wkst('SU'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * The second-to-last weekday of the month: * DTSTART;TZID=America/New_York:19970929T090000 * RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2 */ function testTwentyTwo() { $results[] = new DateTime('1997-09-29 09:00:00'); $results[] = new DateTime('1997-10-30 09:00:00'); $results[] = new DateTime('1997-11-27 09:00:00'); $results[] = new DateTime('1997-12-30 09:00:00'); $results[] = new DateTime('1998-01-29 09:00:00'); $results[] = new DateTime('1998-02-26 09:00:00'); $results[] = new DateTime('1998-03-30 09:00:00'); $r = new When(); $r->recur('19970929T090000', 'monthly')->count(7)->byday(array('MO', 'TU', 'WE', 'TH', 'FR'))->bysetpos(array(-2)); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }
/** * The second-to-last weekday of the month: * DTSTART;TZID=America/New_York:19970929T090000 * RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2 */ function testTwentyTwo() { $results[] = new DateTime('1997-09-29 09:00:00'); $results[] = new DateTime('1997-10-30 09:00:00'); $results[] = new DateTime('1997-11-27 09:00:00'); $results[] = new DateTime('1997-12-30 09:00:00'); $results[] = new DateTime('1998-01-29 09:00:00'); $results[] = new DateTime('1998-02-26 09:00:00'); $results[] = new DateTime('1998-03-30 09:00:00'); $r = new When(); $r->recur('19970929T090000')->count(7)->rrule('FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2'); foreach ($results as $result) { $this->assertEquals($result, $r->next()); } }