setStartTime(check_request_datetime('start_day', 'start_time', $days, time())); $shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, time() + 24 * 60 * 60)); if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) { $shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60); } } /** * Update given ShiftsFilter with filter params from user input * * @param ShiftsFilter $shiftsFilter * The shifts filter to update from request data * @param boolean $user_shifts_admin * Has the user user_shift_admin privilege? * @param string[] $days * An array of available filter days */ function update_ShiftsFilter(ShiftsFilter $shiftsFilter, $user_shifts_admin, $days) { $shiftsFilter->setUserShiftsAdmin($user_shifts_admin); if (isset($_REQUEST['filled'])) { $shiftsFilter->setFilled(check_request_int_array('filled')); } if (isset($_REQUEST['rooms'])) { $shiftsFilter->setRooms(check_request_int_array('rooms')); } if (isset($_REQUEST['types'])) { $shiftsFilter->setTypes(check_request_int_array('types')); } if ((isset($_REQUEST['start_time']) && isset($_REQUEST['start_day']) && isset($_REQUEST['end_time']) && isset($_REQUEST['end_day'])) || $shiftsFilter->getStartTime() == null || $shiftsFilter->getEndTime() == null) { update_ShiftsFilter_timerange($shiftsFilter, $days); } } function load_rooms() { $rooms = sql_select("SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`='Y' ORDER BY `Name`"); if (count($rooms) == 0) { error(_("The administration has not configured any rooms yet.")); redirect('?'); } return $rooms; } function load_days() { $days = sql_select_single_col(" SELECT DISTINCT DATE(FROM_UNIXTIME(`start`)) AS `id`, DATE(FROM_UNIXTIME(`start`)) AS `name` FROM `Shifts` ORDER BY `start`"); if (count($days) == 0) { error(_("The administration has not configured any shifts yet.")); redirect('?'); } return $days; } function load_types() { global $user; if (sql_num_query("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0") == 0) { error(_("The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype.")); redirect('?'); } $types = sql_select("SELECT `AngelTypes`.`id`, `AngelTypes`.`name`, (`AngelTypes`.`restricted`=0 OR (NOT `UserAngelTypes`.`confirm_user_id` IS NULL OR `UserAngelTypes`.`id` IS NULL)) as `enabled` FROM `AngelTypes` LEFT JOIN `UserAngelTypes` ON (`UserAngelTypes`.`angeltype_id`=`AngelTypes`.`id` AND `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "') ORDER BY `AngelTypes`.`name`"); if (empty($types)) { return sql_select("SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0"); } return $types; } function view_user_shifts() { global $user, $privileges; global $ical_shifts; $ical_shifts = []; $days = load_days(); $rooms = load_rooms(); $types = load_types(); if (! isset($_SESSION['ShiftsFilter'])) { $room_ids = array_map('get_ids_from_array', $rooms); $type_ids = array_map('get_ids_from_array', $types); $_SESSION['ShiftsFilter'] = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids); } update_ShiftsFilter($_SESSION['ShiftsFilter'], in_array('user_shifts_admin', $privileges), $days); $shiftsFilter = $_SESSION['ShiftsFilter']; $shifts = Shifts_by_ShiftsFilter($shiftsFilter, $user); $ownshifts_source = sql_select(" SELECT `ShiftTypes`.`name`, `Shifts`.* FROM `Shifts` INNER JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) INNER JOIN `ShiftEntry` ON (`Shifts`.`SID` = `ShiftEntry`.`SID` AND `ShiftEntry`.`UID` = '" . sql_escape($user['UID']) . "') WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime()); $ownshifts = []; foreach ($ownshifts_source as $ownshift) { $ownshifts[$ownshift['SID']] = $ownshift; } unset($ownshifts_source); $shifts_table = ""; /* * [0] => Array ( [SID] => 1 [start] => 1355958000 [end] => 1355961600 [RID] => 1 [name] => [URL] => [PSID] => [room_name] => test1 [has_special_needs] => 1 [is_full] => 0 ) */ $first = 15 * 60 * floor($shiftsFilter->getStartTime() / (15 * 60)); $maxshow = ceil(($shiftsFilter->getEndTime() - $first) / (60 * 15)); $block = []; $todo = []; $myrooms = $rooms; // delete un-selected rooms from array foreach ($myrooms as $k => $v) { if (array_search($v["id"], $shiftsFilter->getRooms()) === false) { unset($myrooms[$k]); } // initialize $block array $block[$v["id"]] = array_fill(0, $maxshow, 0); } // calculate number of parallel shifts in each timeslot for each room foreach ($shifts as $k => $shift) { $rid = $shift["RID"]; $blocks = ($shift["end"] - $shift["start"]) / (15 * 60); $firstblock = floor(($shift["start"] - $first) / (15 * 60)); for ($i = $firstblock; $i < $blocks + $firstblock && $i < $maxshow; $i ++) { $block[$rid][$i] ++; } $shifts[$k]['own'] = in_array($shift['SID'], array_keys($ownshifts)); } $shifts_table = '
- | '; foreach ($myrooms as $key => $room) { $rid = $room["id"]; if (array_sum($block[$rid]) == 0) { // do not display columns without entries unset($block[$rid]); unset($myrooms[$key]); continue; } $colspan = call_user_func_array('max', $block[$rid]); if ($colspan == 0) { $colspan = 1; } $todo[$rid] = array_fill(0, $maxshow, $colspan); $shifts_table .= "1) ? ' colspan="' . $colspan . '"' : '') . ">" . Room_name_render([ 'RID' => $room['id'], 'Name' => $room['name'] ]) . " | \n"; } unset($block, $blocks, $firstblock, $colspan, $key, $room); $shifts_table .= "||
---|---|---|---|
"; $shifts_table .= date('Y-m-dH:i', $thistime); } elseif ($thistime % (60 * 60) == 0) { $shifts_table .= " | |||
"; $shifts_table .= date("H:i", $thistime); } else { $shifts_table .= " | |||
"; } $shifts_table .= " | "; foreach ($myrooms as $room) { $rid = $room["id"]; foreach ($shifts as $shift) { if ($shift["RID"] == $rid) { if (floor($shift["start"] / (15 * 60)) == $thistime / (15 * 60)) { $blocks = ($shift["end"] - $shift["start"]) / (15 * 60); if ($blocks < 1) { $blocks = 1; } $collides = in_array($shift['SID'], array_keys($ownshifts)); if (! $collides) { foreach ($ownshifts as $ownshift) { if ($ownshift['start'] >= $shift['start'] && $ownshift['start'] < $shift['end'] || $ownshift['end'] > $shift['start'] && $ownshift['end'] <= $shift['end'] || $ownshift['start'] < $shift['start'] && $ownshift['end'] > $shift['end']) { $collides = true; break; } } } $is_free = false; $shifts_row = ''; if (in_array('admin_shifts', $privileges)) { $shifts_row .= ''; $shifts_table .= $shifts_row; $shifts_table .= " | "; // also output that shift on ical export $ical_shifts[] = $shift; for ($j = 0; $j < $blocks && $i + $j < $maxshow; $j ++) { $todo[$rid][$i + $j] --; } } } } // fill up row with emptywhile ($todo[$rid][$i] -- > 0) { $shifts_table .= ' | '; } } $shifts_table .= " |
' . sprintf(_("Export of shown shifts. iCal format or JSON format available (please keep secret, otherwise reset the api key)."), page_link_to_absolute('ical') . '&key=' . $user['api_key'], page_link_to_absolute('shifts_json_export') . '&key=' . $user['api_key'], page_link_to('user_myshifts') . '&reset') . '
', 'filter' => _("Filter") ]) ]) ]); } function get_ids_from_array($array) { return $array["id"]; } function make_select($items, $selected, $name, $title = null) { $html_items = []; if (isset($title)) { $html_items[] = '