protected function _hours() { $hours_html = ''; $dayWidth = round(100 / $this->_days); $week = Date_Calc::weekOfYear(1, $this->_start->month, $this->_start->year); $span = (7 - $week) % 7 + 1; $span_left = $this->_days; $t = new Horde_Date($this->_start); while ($span_left > 0) { $span_left -= $span; $week_label = Horde::url('#')->link(array('onclick' => 'return switchDateView(\'Week\',' . $t->dateString() . ');')) . "Week" . ' ' . $week . '</a>'; $hours_html .= sprintf('<th colspan="%d" width="%s%%">%s</th>', $span, $dayWidth, $week_label); $week++; $t->mday += 7; $span = min($span_left, 7); } $hours_html .= '</tr><tr><td width="100" class="label"> </td>'; for ($i = 0; $i < $this->_days; $i++) { $t = new Horde_Date(array('month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $day_label = Horde::url('#')->link(array('onclick' => 'return switchDateView(\'Day\',' . $t->dateString() . ');')) . ($i + 1) . '.</a>'; $hours_html .= sprintf('<th width="%s%%">%s</th>', $dayWidth, $day_label); } for ($i = 0; $i < $this->_days; $i++) { $start = new Horde_Date(array('hour' => $this->_startHour, 'month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $end = new Horde_Date(array('hour' => $this->_endHour, 'month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $this->_timeBlocks[] = array($start, $end); } return $hours_html; }
/** * Gets the week of the year for this date * * Gets the week of the year for this date * * @access public * @return int the week of the year */ function getWeekOfYear() { return Date_Calc::weekOfYear($this->day, $this->month, $this->year); }
function showWeeks() { global $allocated_hours_sum, $end_date, $start_date, $AppUI, $user_list, $user_names, $user_usage, $hideNonWd, $table_header, $table_rows, $df, $working_days_count, $total_hours_capacity, $total_hours_capacity_all; $working_days_count = 0; $allocated_hours_sum = 0; $ed = new CDate(Date_Calc::endOfWeek($end_date->day, $end_date->month, $end_date->year)); $sd = new CDate(Date_Calc::beginOfWeek($start_date->day, $start_date->month, $start_date->year)); $week_difference = ceil($ed->workingDaysInSpan($sd) / count(explode(",", dPgetConfig("cal_working_days")))); $actual_date = $sd; $table_header = "<tr><th>" . $AppUI->_("User") . "</th>"; for ($i = 0; $i < $week_difference; $i++) { $table_header .= "<th>" . Date_Calc::weekOfYear($actual_date->day, $actual_date->month, $actual_date->year) . "<br><table><td style='font-weight:normal; font-size:70%'>" . $actual_date->format($df) . "</td></table></th>"; $actual_date->addSeconds(168 * 3600); // + one week } $table_header .= "<th nowrap='nowrap' colspan='2'>" . $AppUI->_("Allocated") . "</th></tr>"; $table_rows = ""; foreach ($user_list as $user_id => $user_data) { @($user_names[$user_id] = $user_data["user_username"]); if (isset($user_usage[$user_id])) { $table_rows .= "<tr><td nowrap='nowrap'>(" . $user_data["user_username"] . ") " . $user_data["contact_first_name"] . " " . $user_data["contact_last_name"] . "</td>"; $actual_date = $sd; for ($i = 0; $i < $week_difference; $i++) { $awoy = $actual_date->year . Date_Calc::weekOfYear($actual_date->day, $actual_date->month, $actual_date->year); $table_rows .= "<td align='right'>"; if (isset($user_usage[$user_id][$awoy])) { $hours = number_format($user_usage[$user_id][$awoy], 2); $table_rows .= $hours; $percentage_used = round($hours / (dPgetConfig("daily_working_hours") * count(explode(",", dPgetConfig("cal_working_days")))) * 100); $bar_color = "blue"; if ($percentage_used > 100) { $bar_color = "red"; $percentage_used = 100; } $table_rows .= "<div style='height:2px;width:{$percentage_used}%; background-color:{$bar_color}'> </div>"; } else { $table_rows .= " "; } $table_rows .= "</td>"; $actual_date->addSeconds(168 * 3600); // + one week } $array_sum = array_sum($user_usage[$user_id]); $average_user_usage = number_format($array_sum / ($week_difference * count(explode(",", dPgetConfig("cal_working_days"))) * dPgetConfig("daily_working_hours")) * 100, 2); $allocated_hours_sum += $array_sum; $bar_color = "blue"; if ($average_user_usage > 100) { $bar_color = "red"; $average_user_usage = 100; } $table_rows .= "<td ><div align='left'>" . round($array_sum, 2) . " " . $AppUI->_("hours") . "</td> <td align='right'> " . $average_user_usage; $table_rows .= "%</div>"; $table_rows .= "<div align='left' style='height:2px;width:{$average_user_usage}%; background-color:{$bar_color}'> </div></td>"; $table_rows .= "</tr>"; } } $total_hours_capacity = $week_difference * count(explode(",", dPgetConfig("cal_working_days"))) * dPgetConfig("daily_working_hours") * count($user_usage); $total_hours_capacity_all = $week_difference * count(explode(",", dPgetConfig("cal_working_days"))) * dPgetConfig("daily_working_hours") * count($user_list); }
/** * Formats the date in the given format, much like * strfmt(). This function is used to alleviate the * problem with 32-bit numbers for dates pre 1970 * or post 2038, as strfmt() has on most systems. * Most of the formatting options are compatible. * * formatting options: * * %a abbreviated weekday name (Sun, Mon, Tue) * %A full weekday name (Sunday, Monday, Tuesday) * %b abbreviated month name (Jan, Feb, Mar) * %B full month name (January, February, March) * %d day of month (range 00 to 31) * %e day of month, single digit (range 0 to 31) * %E number of days since unspecified epoch (integer) * (%E is useful for passing a date in a URL as * an integer value. Then simply use * daysToDate() to convert back to a date.) * %j day of year (range 001 to 366) * %m month as decimal number (range 1 to 12) * %n newline character (\n) * %t tab character (\t) * %w weekday as decimal (0 = Sunday) * %U week number of current year, first sunday as first week * %y year as decimal (range 00 to 99) * %Y year as decimal including century (range 0000 to 9999) * %% literal '%' * * @param string year in format CCYY * @param string month in format MM * @param string day in format DD * @param string format for returned date * * @access public * * @return string date in given format */ function dateFormat($day, $month, $year, $format) { if (!Date_Calc::isValidDate($day, $month, $year)) { $year = Date_Calc::dateNow("%Y"); $month = Date_Calc::dateNow("%m"); $day = Date_Calc::dateNow("%d"); } $output = ""; for ($strpos = 0; $strpos < strlen($format); $strpos++) { $char = substr($format, $strpos, 1); if ($char == "%") { $nextchar = substr($format, $strpos + 1, 1); switch ($nextchar) { case "a": $output .= Date_Calc::getWeekdayAbbrname($day, $month, $year); break; case "A": $output .= Date_Calc::getWeekdayFullname($day, $month, $year); break; case "b": $output .= Date_Calc::getMonthAbbrname($month); break; case "B": $output .= Date_Calc::getMonthFullname($month); break; case "d": $output .= sprintf("%02d", $day); break; case "e": $output .= $day; break; case "E": $output .= Date_Calc::dateToDays($day, $month, $year); break; case "j": $output .= Date_Calc::julianDate($day, $month, $year); break; case "m": $output .= sprintf("%02d", $month); break; case "n": $output .= "\n"; break; case "t": $output .= "\t"; break; case "w": $output .= Date_Calc::dayOfWeek($day, $month, $year); break; case "U": $output .= Date_Calc::weekOfYear($day, $month, $year); break; case "y": $output .= substr($year, 2, 2); break; case "Y": $output .= $year; break; case "%": $output .= "%"; break; default: $output .= $char . $nextchar; } $strpos++; } else { $output .= $char; } } return $output; }
/** * Returns the number of the week in the year (ISO-8601), given a date * @param int year (2003) * @param int month (9) * @param int day (4) * @return int week number * @access protected */ function getWeekNInYear($y, $m, $d) { return Date_Calc::weekOfYear($d, $m, $y); //beware, Date_Calc doesn't follow ISO-8601 standard! }
/** * Formats the date in the given format, much like strfmt() * * This function is used to alleviate the problem with 32-bit numbers for * dates pre 1970 or post 2038, as strfmt() has on most systems. * Most of the formatting options are compatible. * * Formatting options: * <pre> * %a abbreviated weekday name (Sun, Mon, Tue) * %A full weekday name (Sunday, Monday, Tuesday) * %b abbreviated month name (Jan, Feb, Mar) * %B full month name (January, February, March) * %d day of month (range 00 to 31) * %e day of month, single digit (range 0 to 31) * %E number of days since unspecified epoch (integer) * (%E is useful for passing a date in a URL as * an integer value. Then simply use * daysToDate() to convert back to a date.) * %j day of year (range 001 to 366) * %m month as decimal number (range 1 to 12) * %n newline character (\n) * %t tab character (\t) * %w weekday as decimal (0 = Sunday) * %U week number of current year, first sunday as first week * %y year as decimal (range 00 to 99) * %Y year as decimal including century (range 0000 to 9999) * %% literal '%' * </pre> * * @param int $day the day of the month * @param int $month the month * @param int $year the year. Use the complete year instead of the * abbreviated version. E.g. use 2005, not 05. * @param string $format the format string * * @return string the date in the desired format * @access public * @static */ function dateFormat($day, $month, $year, $format) { if (!Date_Calc::isValidDate($day, $month, $year)) { $year = Date_Calc::dateNow('%Y'); $month = Date_Calc::dateNow('%m'); $day = Date_Calc::dateNow('%d'); } $output = ''; for ($strpos = 0; $strpos < strlen($format); $strpos++) { $char = substr($format, $strpos, 1); if ($char == '%') { $nextchar = substr($format, $strpos + 1, 1); switch ($nextchar) { case 'a': $output .= Date_Calc::getWeekdayAbbrname($day, $month, $year); break; case 'A': $output .= Date_Calc::getWeekdayFullname($day, $month, $year); break; case 'b': $output .= Date_Calc::getMonthAbbrname($month); break; case 'B': $output .= Date_Calc::getMonthFullname($month); break; case 'd': $output .= sprintf('%02d', $day); break; case 'e': $output .= $day; break; case 'E': $output .= Date_Calc::dateToDays($day, $month, $year); break; case 'j': $output .= Date_Calc::dayOfYear($day, $month, $year); break; case 'm': $output .= sprintf('%02d', $month); break; case 'n': $output .= "\n"; break; case 't': $output .= "\t"; break; case 'w': $output .= Date_Calc::dayOfWeek($day, $month, $year); break; case 'U': $output .= Date_Calc::weekOfYear($day, $month, $year); break; case 'y': $output .= sprintf('%0' . ($year < 0 ? '3' : '2') . 'd', $year % 100); break; case "Y": $output .= sprintf('%0' . ($year < 0 ? '5' : '4') . 'd', $year); break; case '%': $output .= '%'; break; default: $output .= $char . $nextchar; } $strpos++; } else { $output .= $char; } } return $output; }
function userUsageWeeks() { global $task_start_date, $task_end_date, $day_difference, $hours_added, $actual_date, $users, $user_data, $user_usage, $use_assigned_percentage, $user_tasks_counted_in, $task, $start_date, $end_date; $task_duration_per_week = $task->getTaskDurationPerWeek($use_assigned_percentage); $ted = new CDate(Date_Calc::endOfWeek($task_end_date->day, $task_end_date->month, $task_end_date->year)); $tsd = new CDate(Date_Calc::beginOfWeek($task_start_date->day, $task_start_date->month, $task_start_date->year)); $ed = new CDate(Date_Calc::endOfWeek($end_date->day, $end_date->month, $end_date->year)); $sd = new CDate(Date_Calc::beginOfWeek($start_date->day, $start_date->month, $start_date->year)); $week_difference = $end_date->workingDaysInSpan($start_date) / count(explode(",", dPgetConfig("cal_working_days"))); $actual_date = $start_date; for ($i = 0; $i <= $week_difference; $i++) { if (!$actual_date->before($tsd) && !$actual_date->after($ted)) { $awoy = $actual_date->year . Date_Calc::weekOfYear($actual_date->day, $actual_date->month, $actual_date->year); foreach ($users as $user_id => $user_data) { if (!isset($user_usage[$user_id][$awoy])) { $user_usage[$user_id][$awoy] = 0; } $percentage_assigned = $use_assigned_percentage ? $user_data["perc_assignment"] / 100 : 1; $hours_added = $task_duration_per_week * $percentage_assigned; $user_usage[$user_id][$awoy] += $hours_added; if ($user_usage[$user_id][$awoy] < 0.005) { //We want to show at least 0.01 even when the assigned time is very small so we know //that at that time the user has a running task $user_usage[$user_id][$awoy] += 0.006; $hours_added += 0.006; } // Let's register the tasks counted in for calculation if (!array_key_exists($user_id, $user_tasks_counted_in)) { $user_tasks_counted_in[$user_id] = array(); } if (!array_key_exists($task->task_project, $user_tasks_counted_in[$user_id])) { $user_tasks_counted_in[$user_id][$task->task_project] = array(); } if (!array_key_exists($task->task_id, $user_tasks_counted_in[$user_id][$task->task_project])) { $user_tasks_counted_in[$user_id][$task->task_project][$task->task_id] = 0; } // We add it up $user_tasks_counted_in[$user_id][$task->task_project][$task->task_id] += $hours_added; } } $actual_date->addSeconds(168 * 3600); // + one week } }
/** * Display a monthly calendar. * Dates that have events scheduled are highlighted. * * @param integer $year Year to display, default is current year * @param integer $month Starting month * @param integer $day Starting day * @param integer $cat Event category * @plaram integer $cal Calendar ID * @return string HTML for calendar page */ function EVLIST_monthview($year = 0, $month = 0, $day = 0, $cat = 0, $cal = 0, $opt = '') { global $_CONF, $_EV_CONF, $LANG_MONTH; EVLIST_setViewSession('month', $year, $month, $day); $retval = ''; list($currentyear, $currentmonth, $currentday) = explode('-', $_EV_CONF['_today']); // Default to the current month if ($year == 0) { $year = $currentyear; } if ($month == 0) { $month = $currentmonth; } if ($day == 0) { $day = $currentday; } $cat = (int) $cat; $cal = (int) $cal; // Set the calendar header. Done early because the _can_add value is // set by this function $cal_header = EVLIST_calHeader($year, $month, $day, 'month', $cat, $cal); // Get all the dates in the month $calendarView = Date_Calc::getCalendarMonth($month, $year, '%Y-%m-%d'); $x = count($calendarView) - 1; $y = count($calendarView[$x]) - 1; $starting_date = $calendarView[0][0]; $ending_date = $calendarView[$x][$y]; $daynames = EVLIST_getDayNames(); $events = EVLIST_getEvents($starting_date, $ending_date, array('cat' => $cat, 'cal' => $cal)); $nextmonth = $month + 1; $nextyear = $year; if ($nextmonth > 12) { $nextmonth = 1; $nextyear = $year + 1; } $prevmonth = $month - 1; $prevyear = $year; if ($prevmonth < 1) { $prevmonth = 12; $prevyear = $year - 1; } $tplpath = EVLIST_PI_PATH . '/templates/monthview'; $tpl = 'monthview'; if ($opt == 'print') { $tpl .= '_print'; } elseif ($_EV_CONF['cal_tmpl'] == 'json') { $tpl .= '_json'; } $T = new Template($tplpath); $T->set_file(array('monthview' => $tpl . '.thtml', 'allday_event' => 'event_allday.thtml', 'timed_event' => 'event_timed.thtml')); foreach ($daynames as $key => $dayname) { $T->set_var('dayname' . $key, $dayname); } list($y, $m, $d) = explode('-', $starting_date); $weekOfYear = Date_Calc::weekOfYear($d, $m, $y); $calendars_used = array(); $i = 0; $T->set_block('monthview', 'weekBlock', 'wBlock'); foreach ($calendarView as $weeknum => $weekdata) { list($weekYear, $weekMonth, $weekDay) = explode('-', $weekdata[0]); $T->set_var(array('wyear' => $weekYear, 'wmonth' => $weekMonth, 'wday' => $weekDay, 'urlfilt_cat' => $cat, 'urlfilt_cal' => $cal, 'weeknum' => $weekOfYear, $tplx => 'true')); $weekOfYear++; foreach ($weekdata as $daynum => $daydata) { list($y, $m, $d) = explode('-', $daydata); if ($daydata == $_EV_CONF['_today']) { $dayclass = 'today'; } elseif ($m == $month) { $dayclass = 'on'; } else { $dayclass = 'off'; } $T->set_var('cal_day_anchortags', COM_createLink(sprintf("%02d", $d), EVLIST_URL . '/index.php?view=day&' . "cat={$cat}&cal={$cal}" . "&day={$d}&month={$m}&year={$y}", array('class' => 'cal-date'))); if (!isset($events[$daydata])) { // Just to avoid foreach() errors $events[$daydata] = array(); } $dayentries = ''; $T->clear_var('cal_day_entries'); $T->set_block('monthview', 'dayBlock', 'dBlock'); foreach ($events[$daydata] as $event) { if (empty($event['title'])) { continue; } $ev_hover = ''; // Sanitize fields for display. No HTML in the popup. $title = htmlentities(strip_tags($event['title'])); $summary = htmlentities(strip_tags($event['summary'])); // add the calendar to the array to create the JS checkboxes $calendars_used[$event['cal_id']] = array('cal_name' => $event['cal_name'], 'cal_ena_ical' => $event['cal_ena_ical'], 'cal_id' => $event['cal_id'], 'fgcolor' => $event['fgcolor'], 'bgcolor' => $event['bgcolor']); // Create the hover tooltip. Timed events show the times first if ($event['allday'] == 0) { $ev_hover = date($_CONF['timeonly'], strtotime($event['rp_date_start'] . ' ' . $event['rp_time_start1'])); if ($event['split'] == 1 && !empty($event['rp_time_start2'])) { $ev_hover .= ' & ' . date($_CONF['timeonly'], strtotime($event['rp_date_start'] . ' ' . $event['rp_time_start2'])); } $ev_hover .= ' - '; } else { $ev_hover = ''; } // All events show the summary or title, if available if (!empty($summary)) { $ev_hover .= $summary; } else { $ev_hover .= $title; } $T->set_var(array('cal_id' => $event['cal_id'], 'cal_id_url' => $cal_id, 'cat_id' => $cat, 'ev_hover' => $ev_hover, 'ev_title' => $event['title'], 'eid' => $event['rp_id'], 'fgcolor' => $event['fgcolor'], 'bgcolor' => $event['bgcolor'], 'pi_url' => EVLIST_URL)); if ($event['allday'] == 1) { $dayentries .= $T->parse('output', 'allday_event', true); } else { $dayentries .= $T->parse('output', 'timed_event', true); } } // Now set the vars for the entire day block $T->set_var(array('year' => $y, 'month' => $m, 'day' => $d, 'cal_day_style' => $dayclass, 'pi_url' => EVLIST_URL, 'cal_day_entries' => $dayentries)); if ($_EV_CONF['_can_add']) { // Add the "Add Event" link for the day $T->set_var('can_add', 'true'); } $T->parse('dBlock', 'dayBlock', true); } $T->parse('wBlock', 'weekBlock', true); $T->clear_var('dBlock'); } $T->set_var(array('pi_url' => EVLIST_URL, 'thisyear' => $year, 'thismonth' => $month, 'thismonth_str' => $LANG_MONTH[(int) $month], 'prevmonth' => $prevmonth, 'prevyear' => $prevyear, 'nextmonth' => $nextmonth, 'nextyear' => $nextyear, 'urlfilt_cat' => (int) $cat, 'urlfilt_cal' => (int) $cal, 'cal_header' => $cal_header, 'cal_footer' => EVLIST_calFooter($calendars_used), 'cal_checkboxes' => EVLIST_cal_checkboxes($calendars_used), 'site_name' => $_CONF['site_name'], 'site_slogan' => $_CONF['site_slogan'])); $T->parse('output', 'monthview'); return $T->finish($T->get_var('output')); }
compare('Sat', Date_Calc::getWeekdayAbbrname(1, 1, 2005), 'getWeekdayAbbrname'); compare(11, Date_Calc::getMonthFromFullName('November'), 'getMonthFromFullName'); compare(327, Date_Calc::dayOfYear('22', '11', '2000'), 'dayOfYear str'); compare('November', Date_Calc::getMonthFullname('11'), 'getMonthFullname str'); compare('Nov', Date_Calc::getMonthAbbrname('11'), 'getMonthAbbrname str'); compare('Saturday', Date_Calc::getWeekdayFullname('01', '01', '2005'), 'getWeekdayFullname str'); compare('Sat', Date_Calc::getWeekdayAbbrname('01', '01', '2005'), 'getWeekdayAbbrname str'); $exp = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); compare($exp, Date_Calc::getMonthNames(), 'getMonthNames'); $exp = array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'); compare($exp, Date_Calc::getWeekDays(), 'getWeekDays'); compare(3, Date_Calc::dayOfWeek(22, 11, 2000), 'dayOfWeek'); compare(47, Date_Calc::weekOfYear(22, 11, 2000), 'weekOfYear'); compare(4, Date_Calc::quarterOfYear(22, 11, 2000), 'quarterOfYear'); compare(3, Date_Calc::dayOfWeek('22', '11', '2000'), 'dayOfWeek str'); compare(47, Date_Calc::weekOfYear('22', '11', '2000'), 'weekOfYear str'); compare(4, Date_Calc::quarterOfYear('22', '11', '2000'), 'quarterOfYear str'); compare(28, Date_Calc::daysInMonth(2, 1900), 'daysInMonth 1'); compare(29, Date_Calc::daysInMonth(2, 1996), 'daysInMonth 2'); compare(29, Date_Calc::daysInMonth(2, 2000), 'daysInMonth 3'); compare(28, Date_Calc::daysInMonth(2, 2001), 'daysInMonth 4'); compare(30, Date_Calc::daysInMonth(11, 2000), 'daysInMonth 5'); compare(28, Date_Calc::daysInMonth('02', 1900), 'daysInMonth 1 str'); compare(29, Date_Calc::daysInMonth('02', 1996), 'daysInMonth 2 str'); compare(29, Date_Calc::daysInMonth('02', 2000), 'daysInMonth 3 str'); compare(28, Date_Calc::daysInMonth('02', 2001), 'daysInMonth 4 str'); compare(30, Date_Calc::daysInMonth('11', '2000'), 'daysInMonth 5 str'); compare(5, Date_Calc::weeksInMonth(11, 2000), 'weeksInMonth'); compare(5, Date_Calc::weeksInMonth('11', '2000'), 'weeksInMonth str'); $exp = array('19000226', '19000227', '19000228', '19000301', '19000302', '19000303', '19000304'); compare($exp, Date_Calc::getCalendarWeek(27, 2, 1900), 'getCalendarWeek 1');
for ($i = 0; $i < $cnt; $i++) { $parts = explode(':', $wkno[$i]); $weeksno[$parts[0]] = str_replace("\n", '', $parts[1]); } unset($wkno); foreach ($weeksno as $date => $iso) { $year = substr($date, 0, 4); $month = substr($date, 4, 2); $day = substr($date, 6); $iso9601 = Date_Calc::gregorianToISO($day, $month, $year); if ($iso9601 != $iso) { $failed_test_data = true; echo $date . '(' . $iso . ') =>' . $year . '-' . $month . '-' . $day . '=>' . $iso9601 . " : failed\n"; } } /** * Bugs #19788 */ $failed_test_19788 = false; $pass1 = 2 == Date_Calc::weekOfYear(5, 1, 1998) ? true : false; $pass2 = 2 == Date_Calc::weekOfYear(6, 1, 1998) ? true : false; $pass3 = 2 == Date_Calc::weekOfYear(5, 1, 2004) ? true : false; $pass4 = 2 == Date_Calc::weekOfYear(6, 1, 2004) ? true : false; if (!($pass1 && $pass2 && $pass3 && $pass4)) { $failed_test_19788 = true; } if ($failed_test_19788 || $failed_test_data) { echo "Bug #19788: failed\n"; } else { echo "Bug #19788: OK\n"; }