/** * Utility function to return an array of events with a period * @param Date Start date of the period * @param Date End date of the period * @return array A list of events */ function getEventsForPeriod($start_date, $end_date, $filter = 'all', $user_id = null, $project_id = 0) { global $AppUI; // the event times are stored as unix time stamps, just to be different // convert to default db time stamp $db_start = $start_date->format(FMT_DATETIME_MYSQL); $db_end = $end_date->format(FMT_DATETIME_MYSQL); if (!isset($user_id)) { $user_id = $AppUI->user_id; } $project =& new CProject(); if ($project_id) { $p =& $AppUI->acl(); if ($p->checkModuleItem('projects', 'view', $project_id, $user_id)) { $allowedProjects = array('p.project_id = ' . $project_id); } else { $allowedProjects = array('1=0'); } } else { $allowedProjects = $project->getAllowedSQL($user_id, 'event_project'); } //do similiar actions for recurring and non-recurring events $queries = array('q' => 'q', 'r' => 'r'); foreach ($queries as $query_set) { ${$query_set} = new DBQuery(); ${$query_set}->addTable('events', 'e'); ${$query_set}->addQuery('e.*'); ${$query_set}->addOrder('e.event_start_date, e.event_end_date ASC'); ${$query_set}->addJoin('projects', 'p', 'p.project_id = e.event_project'); if ($AppUI->getState('CalIdxCompany')) { ${$query_set}->addWhere('project_company = ' . $AppUI->getState('CalIdxCompany')); } if (count($allowedProjects)) { ${$query_set}->addWhere('((' . implode(' AND ', $allowedProjects) . ') ' . ($AppUI->getState('CalIdxCompany') ? '' : $project_id ? '' : ' OR event_project = 0 ') . ')'); } switch ($filter) { case 'my': ${$query_set}->addJoin('user_events', 'ue', 'ue.event_id = e.event_id AND ue.user_id =' . $user_id); ${$query_set}->addWhere('(ue.user_id = ' . $user_id . ') AND (event_private=0 OR event_owner=' . $user_id . ')'); break; case 'own': ${$query_set}->addWhere('event_owner =' . $user_id); break; case 'all': ${$query_set}->addWhere('(event_private=0 OR event_owner=' . $user_id . ')'); break; } if ($query_set == 'q') { // assemble query for non-recursive events ${$query_set}->addWhere('(event_recurs <= 0)'); // following line is only good for *non-recursive* events ${$query_set}->addWhere("(event_start_date <= '{$db_end}' AND event_end_date >= '{$db_start}' " . "OR event_start_date BETWEEN '{$db_start}' AND '{$db_end}')"); $eventList = ${$query_set}->loadList(); } else { if ($query_set == 'r') { // assemble query for recursive events ${$query_set}->addWhere('(event_recurs > 0)'); $eventListRec = ${$query_set}->loadList(); } } } //Calculate the Length of Period (Daily, Weekly, Monthly View) setlocale(LC_TIME, 'en_AU'); $periodLength = Date_Calc::dateDiff($start_date->getDay(), $start_date->getMonth(), $start_date->getYear(), $end_date->getDay(), $end_date->getMonth(), $end_date->getYear()); setlocale(LC_ALL, $AppUI->user_lang); // AJD: Should this be going off the end of the array? I don't think so. // If it should then a comment to that effect would be nice. // for ($i=0; $i < sizeof($eventListRec)+1; $i++) { for ($i = 0, $sz = sizeof($eventListRec); $i < $sz; $i++) { //note from merlinyoda: j=0 is the original event according to getRecurrentEventforPeriod // So, since the event is *recurring* x times, the loop condition should be j <= x, not j < x. // This way the original and all recurrances are covered. //for ($j=0; $j < intval($eventListRec[$i]['event_times_recuring']); $j++) { for ($j = 0, $end = intval($eventListRec[$i]['event_times_recuring']); $j < $end; $j++) { if ($periodLength == 1) { // Daily View: show all $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] == 1 && $j == 0) { // Weekly or Monthly View and Hourly Recurrent Events: show one time and add string 'hourly' $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); $eventListRec[$i]['event_title'] = $eventListRec[$i]['event_title'] . ' (' . $AppUI->_('Hourly') . ')'; } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] > 1) { //Weekly and Monthly View and higher recurrence mode: show all events of recurrence > 1 $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } //add values to the eventsArray if check for recurrent event was positive if (sizeof($recEventDate) > 0) { $eList[0] = $eventListRec[$i]; $eList[0]['event_start_date'] = $recEventDate[0]->format(FMT_DATETIME_MYSQL); $eList[0]['event_end_date'] = $recEventDate[1]->format(FMT_DATETIME_MYSQL); $eventList = array_merge($eventList, $eList); } // clear array of positive recurrent events for the case that next loop recEventDate is empty in order to avoid double display $recEventDate = array(); } } //return a list of non-recurrent and recurrent events return $eventList; }
/** * Utility function to return an array of events with a period * @param Date Start date of the period * @param Date End date of the period * @return array A list of events */ public function getEventsForPeriod($start_date, $end_date, $filter = 'all', $user_id = null, $project_id = 0, $company_id = 0) { global $AppUI; // convert to default db time stamp $db_start = $start_date->format(FMT_DATETIME_MYSQL); $db_start = $AppUI->convertToSystemTZ($db_start); $db_end = $end_date->format(FMT_DATETIME_MYSQL); $db_end = $AppUI->convertToSystemTZ($db_end); if (!isset($user_id)) { $user_id = $AppUI->user_id; } $project = new CProject(); if ($project_id) { $p =& $AppUI->acl(); if ($p->checkModuleItem('projects', 'view', $project_id, $user_id)) { $allowedProjects = array('p.project_id = ' . (int) $project_id); } else { $allowedProjects = array('1=0'); } } else { $allowedProjects = $project->getAllowedSQL($user_id ? $user_id : $AppUI->user_id, 'event_project'); } //do similiar actions for recurring and non-recurring events $queries = array('q' => 'q', 'r' => 'r'); foreach ($queries as $query_set) { ${$query_set} = new w2p_Database_Query(); ${$query_set}->addTable('events', 'e'); ${$query_set}->addQuery('e.*'); ${$query_set}->addOrder('e.event_start_date, e.event_end_date ASC'); ${$query_set}->leftJoin('projects', 'p', 'p.project_id = e.event_project'); ${$query_set}->leftJoin('project_departments', 'project_departments', 'p.project_id = project_departments.project_id OR project_departments.project_id IS NULL'); ${$query_set}->leftJoin('departments', 'departments', 'departments.dept_id = project_departments.department_id OR dept_id IS NULL'); if ($company_id) { ${$query_set}->addWhere('project_company = ' . (int) $company_id); } else { if ($AppUI->getState('CalIdxCompany')) { ${$query_set}->addWhere('project_company = ' . $AppUI->getState('CalIdxCompany')); } } if (count($allowedProjects)) { ${$query_set}->addWhere('( ( ' . implode(' AND ', $allowedProjects) . ' ) ' . ($AppUI->getState('CalIdxCompany') ? '' : ($project_id ? '' : ' OR event_project = 0 ')) . ')'); } switch ($filter) { case 'my': ${$query_set}->addJoin('user_events', 'ue', 'ue.event_id = e.event_id AND ue.user_id =' . $user_id); ${$query_set}->addWhere('(ue.user_id = ' . (int) $user_id . ') AND (event_private = 0 OR event_owner=' . (int) $user_id . ')'); break; case 'own': ${$query_set}->addWhere('event_owner =' . (int) $user_id); break; case 'all': ${$query_set}->addWhere('(event_private = 0 OR event_owner=' . (int) $user_id . ')'); break; default: ${$query_set}->addWhere('(event_private = 0 OR event_owner=' . (int) $user_id . ')'); } if ($query_set == 'q') { // assemble query for non-recursive events ${$query_set}->addWhere('(event_recurs <= 0)'); // following line is only good for *non-recursive* events ${$query_set}->addWhere('(event_start_date <= \'' . $db_end . '\' AND event_end_date >= \'' . $db_start . '\' OR event_start_date BETWEEN \'' . $db_start . '\' AND \'' . $db_end . '\')'); $eventList = ${$query_set}->loadList(); } elseif ($query_set == 'r') { // assemble query for recursive events ${$query_set}->addWhere('(event_recurs > 0)'); $eventListRec = ${$query_set}->loadList(); } } //Calculate the Length of Period (Daily, Weekly, Monthly View) setlocale(LC_TIME, 'en'); $periodLength = Date_Calc::dateDiff($start_date->getDay(), $start_date->getMonth(), $start_date->getYear(), $end_date->getDay(), $end_date->getMonth(), $end_date->getYear()); setlocale(LC_ALL, $AppUI->user_lang); // AJD: Should this be going off the end of the array? I don't think so. // If it should then a comment to that effect would be nice. for ($i = 0, $i_cmp = sizeof($eventListRec); $i < $i_cmp; $i++) { //note from merlinyoda: j=0 is the original event according to getRecurrentEventforPeriod // So, since the event is *recurring* x times, the loop condition should be j <= x, not j < x. // This way the original and all recurrances are covered. for ($j = 0, $j_cmp = intval($eventListRec[$i]['event_times_recuring']); $j <= $j_cmp; $j++) { //Daily View //show all if ($periodLength <= 1) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] == 1 && $j == 0) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); $eventListRec[$i]['event_title'] = $eventListRec[$i]['event_title'] . ' (' . $AppUI->_('Hourly') . ')'; } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] > 1) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } //add values to the eventsArray if check for recurrent event was positive if (sizeof($recEventDate) > 0) { $eList[0] = $eventListRec[$i]; $eList[0]['event_start_date'] = $recEventDate[0]->format(FMT_DATETIME_MYSQL); $eList[0]['event_end_date'] = $recEventDate[1]->format(FMT_DATETIME_MYSQL); $eventList = array_merge($eventList, $eList); } // clear array of positive recurrent events for the case that next loop recEventDate is empty in order to avoid double display $recEventDate = array(); } } $i = 0; foreach ($eventList as $event) { $eventList[$i]['event_start_date'] = $AppUI->formatTZAwareTime($event['event_start_date'], '%Y-%m-%d %H:%M:%S'); $eventList[$i]['event_end_date'] = $AppUI->formatTZAwareTime($event['event_end_date'], '%Y-%m-%d %H:%M:%S'); $i++; } //echo '<pre>'; print_r($eventList); echo '</pre>'; //return a list of non-recurrent and recurrent events return $eventList; }
/** * Utility function to return an array of events with a period * @param Date Start date of the period * @param Date End date of the period * @return array A list of events */ function getEventsForPeriod($start_date, $end_date, $filter = 'all', $user_id = null) { global $AppUI; // the event times are stored as unix time stamps, just to be different // convert to default db time stamp $db_start = $start_date->format(FMT_DATETIME_MYSQL); $db_end = $end_date->format(FMT_DATETIME_MYSQL); if (!isset($user_id)) { $user_id = $AppUI->user_id; } $project =& new CProject(); $allowedProjects = $project->getAllowedSQL($user_id, 'event_project'); $q = new DBQuery(); $q->addTable('events', 'e'); $q->addQuery('e.*'); if (count($allowedProjects)) { $q->addWhere('( ( ' . implode(' AND ', $allowedProjects) . ") OR event_project = 0 )"); $q->addJoin('projects', 'p', 'p.project_id = e.event_project'); } switch ($filter) { case 'my': $q->addJoin('user_events', 'ue', 'ue.event_id = e.event_id AND ue.user_id =' . $user_id); $q->addWhere("( ( event_private = 0 AND ue.user_id = {$user_id} )\n\t\t\t\t\t\tOR event_owner={$user_id} )"); break; case 'own': $q->addWhere("( event_owner = {$user_id} )"); break; case 'all': $q->addWhere("( event_private=0 OR (event_private=1 AND event_owner={$user_id}) )"); break; } $q->addWhere("( event_start_date <= '{$db_end}' AND event_end_date >= '{$db_start}'\n\t\t\t\tOR event_start_date BETWEEN '{$db_start}' AND '{$db_end}')"); // duplicate query object for recursive events; $r = $q; // assemble query for non-recursive events $q->addWhere('( event_recurs <= 0 )'); $eventList = $q->loadList(); // assemble query for recursive events $r->addWhere('( event_recurs > 0 )'); $eventListRec = $r->loadList(); //Calculate the Length of Period (Daily, Weekly, Monthly View) $periodLength = Date_Calc::dateDiff($start_date->getDay(), $start_date->getMonth(), $start_date->getYear(), $end_date->getDay(), $end_date->getMonth(), $end_date->getYear()); // AJD: Should this be going off the end of the array? I don't think so. // If it should then a comment to that effect would be nice. // for ($i=0; $i < sizeof($eventListRec)+1; $i++) { for ($i = 0; $i < sizeof($eventListRec); $i++) { for ($j = 0; $j < intval($eventListRec[$i]['event_times_recuring']); $j++) { //Daily View //show all if ($periodLength == 1) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] == 1 && $j == 0) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); $eventListRec[$i]['event_title'] = $eventListRec[$i]['event_title'] . " (" . $AppUI->_('Hourly') . ")"; } elseif ($periodLength > 1 && $eventListRec[$i]['event_recurs'] > 1) { $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $eventListRec[$i]['event_start_date'], $eventListRec[$i]['event_end_date'], $eventListRec[$i]['event_recurs'], $eventListRec[$i]['event_times_recuring'], $j); } //add values to the eventsArray if check for recurrent event was positive if (sizeof($recEventDate) > 0) { $eList[0] = $eventListRec[$i]; $eList[0]['event_start_date'] = $recEventDate[0]->format(FMT_DATETIME_MYSQL); $eList[0]['event_end_date'] = $recEventDate[1]->format(FMT_DATETIME_MYSQL); $eventList = array_merge($eventList, $eList); } // clear array of positive recurrent events for the case that next loop recEventDate is empty in order to avoid double display $recEventDate = array(); } } //return a list of non-recurrent and recurrent events return $eventList; }
/** * Utility function to return an array of events with a period * @param Date Start date of the period * @param Date End date of the period * @return array A list of events */ function getEventsForPeriod($start_date, $end_date, $filter = 'all', $user_id = null, $project_id = 0) { global $AppUI; // the event times are stored as unix time stamps, just to be different // convert to default db time stamp $db_start = $start_date->format(FMT_DATETIME_MYSQL); $db_end = $end_date->format(FMT_DATETIME_MYSQL); if (!isset($user_id)) { $user_id = $AppUI->user_id; } $project = new CProject(); if ($project_id) { $p =& $AppUI->acl(); if ($p->checkModuleItem('projects', 'view', $project_id, $user_id)) { $allowedProjects = array('p.project_id = ' . $project_id); } else { $allowedProjects = array('1=0'); } } else { $allowedProjects = $project->getAllowedSQL($user_id, 'event_project'); } //do similiar actions for recurring and non-recurring events $queries = array('q' => 'q', 'r' => 'r'); foreach ($queries as $query_set) { ${$query_set} = new DBQuery(); ${$query_set}->addTable('events', 'e'); ${$query_set}->addQuery('DISTINCT e.*'); ${$query_set}->addOrder('e.event_start_date, e.event_end_date ASC'); ${$query_set}->addJoin('projects', 'p', 'p.project_id = e.event_project'); if ($AppUI->getState('CalIdxCompany')) { ${$query_set}->addWhere('p.project_company = ' . $AppUI->getState('CalIdxCompany')); } if (count($allowedProjects)) { ${$query_set}->addWhere('((' . implode(' AND ', $allowedProjects) . ') ' . ($AppUI->getState('CalIdxCompany') || $project_id ? '' : ' OR event_project = 0 ') . ')'); } switch ($filter) { case 'my': ${$query_set}->addJoin('user_events', 'ue', 'ue.event_id = e.event_id AND ue.user_id =' . $user_id); ${$query_set}->addWhere('(ue.user_id = ' . $user_id . ') AND (event_private=0 OR event_owner=' . $user_id . ')'); break; case 'own': ${$query_set}->addWhere('e.event_owner =' . $user_id); break; case 'all': ${$query_set}->addWhere('(e.event_private=0 OR e.event_owner=' . $user_id . ')'); break; } if ($query_set == 'q') { // assemble query for non-recursive events // following line is only good for *non-recursive* events ${$query_set}->addWhere('(event_recurs <= 0)'); ${$query_set}->addWhere("(event_start_date < '{$db_end}'" . " AND event_end_date > '{$db_start}')"); $eventList = ${$query_set}->loadList(); } else { if ($query_set == 'r') { // assemble query for recursive events ${$query_set}->addWhere('(event_recurs > 0)'); $eventListRec = ${$query_set}->loadList(); } } } //Calculate the Length of Period (Daily, Weekly, Monthly View) setlocale(LC_ALL, 'en_AU' . ($locale_char_set ? '.' . $locale_char_set : '.utf8')); $periodLength = Date_Calc::dateDiff($end_date->getDay(), $end_date->getMonth(), $end_date->getYear(), $start_date->getDay(), $start_date->getMonth(), $start_date->getYear()); setlocale(LC_ALL, $AppUI->user_lang); foreach ($eventListRec as $key => $ia) { $end = intval($ia['event_times_recuring']); for ($j = 0; $j < $end; $j++) { $recEventDate = array(); if ($periodLength <= 1) { // Daily View or clash check: show all $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $ia['event_start_date'], $ia['event_end_date'], $ia['event_recurs'], $ia['event_times_recuring'], $j); } else { if ($ia['event_recurs'] == 1 && $j == 0) { // Weekly or Monthly View and Hourly Recurrent Events //show one time and add string 'hourly' $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $ia['event_start_date'], $ia['event_end_date'], $ia['event_recurs'], $ia['event_times_recuring'], $j); $eventListRec[$key]['event_title'] = $ia['event_title'] . ' (' . $AppUI->_('Hourly') . ')'; } else { if ($ia['event_recurs'] > 1) { //Weekly and Monthly View and higher recurrence mode //show all events of recurrence > 1 $recEventDate = CEvent::getRecurrentEventforPeriod($start_date, $end_date, $ia['event_start_date'], $ia['event_end_date'], $ia['event_recurs'], $ia['event_times_recuring'], $j); } } } //add values to the eventsArray if check for recurrent event was positive if (!empty($recEventDate)) { $display_start = $recEventDate[0]->format(FMT_DATETIME_MYSQL); $display_end = $recEventDate[1]->format(FMT_DATETIME_MYSQL); $eventListRec[$key]['event_start_date'] = $display_start; $eventListRec[$key]['event_end_date'] = $display_end; $eventList = array_merge($eventList, array($eventListRec[$key])); } } } //return a list of non-recurrent and recurrent events return $eventList; }