From 25889920cf216e46873da968afe4b2dae5fead64 Mon Sep 17 00:00:00 2001 From: Philip Häusler Date: Tue, 16 Dec 2014 08:43:41 +0100 Subject: prepare for shift types model, add db update --- public/index.php | 1 + 1 file changed, 1 insertion(+) (limited to 'public') diff --git a/public/index.php b/public/index.php index 5c673f0a..54ea1090 100644 --- a/public/index.php +++ b/public/index.php @@ -15,6 +15,7 @@ require_once realpath(__DIR__ . '/../includes/model/NeededAngelTypes_model.php') require_once realpath(__DIR__ . '/../includes/model/Room_model.php'); require_once realpath(__DIR__ . '/../includes/model/ShiftEntry_model.php'); require_once realpath(__DIR__ . '/../includes/model/Shifts_model.php'); +require_once realpath(__DIR__ . '/../includes/model/ShiftTypes_model.php'); require_once realpath(__DIR__ . '/../includes/model/UserAngelTypes_model.php'); require_once realpath(__DIR__ . '/../includes/model/UserGroups_model.php'); require_once realpath(__DIR__ . '/../includes/model/User_model.php'); -- cgit v1.2.3-54-g00ecf From a73e98a8e069074fe439d8d54c93fd35c46ace8e Mon Sep 17 00:00:00 2001 From: Philip Häusler Date: Tue, 16 Dec 2014 09:01:39 +0100 Subject: prepare shift types controller and view --- includes/controller/shifttypes_controller.php | 39 +++++++++++++++++++++++++++ includes/view/ShiftTypes_view.php | 15 +++++++++++ public/index.php | 10 ++++--- 3 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 includes/controller/shifttypes_controller.php create mode 100644 includes/view/ShiftTypes_view.php (limited to 'public') diff --git a/includes/controller/shifttypes_controller.php b/includes/controller/shifttypes_controller.php new file mode 100644 index 00000000..3ceb5c0d --- /dev/null +++ b/includes/controller/shifttypes_controller.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/includes/view/ShiftTypes_view.php b/includes/view/ShiftTypes_view.php new file mode 100644 index 00000000..c18ea493 --- /dev/null +++ b/includes/view/ShiftTypes_view.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/public/index.php b/public/index.php index 54ea1090..6574b619 100644 --- a/public/index.php +++ b/public/index.php @@ -24,10 +24,12 @@ require_once realpath(__DIR__ . '/../includes/view/AngelTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/Questions_view.php'); require_once realpath(__DIR__ . '/../includes/view/Shifts_view.php'); require_once realpath(__DIR__ . '/../includes/view/ShiftEntry_view.php'); +require_once realpath(__DIR__ . '/../includes/view/ShiftTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/UserAngelTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/User_view.php'); require_once realpath(__DIR__ . '/../includes/controller/angeltypes_controller.php'); +require_once realpath(__DIR__ . '/../includes/controller/shifttypes_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/users_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/user_angeltypes_controller.php'); @@ -86,7 +88,7 @@ $free_pages = array( 'users', 'ical', 'shifts_json_export', - 'atom' + 'atom' ); // Gewünschte Seite/Funktion @@ -95,10 +97,10 @@ if (! isset($_REQUEST['p'])) $_REQUEST['p'] = isset($user) ? "news" : "login"; if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (in_array($_REQUEST['p'], $free_pages) || in_array($_REQUEST['p'], $privileges))) { $p = $_REQUEST['p']; - + $title = $p; $content = ""; - + if ($p == "api") { require_once realpath(__DIR__ . '/../includes/controller/api.php'); error("Api disabled temporily."); @@ -226,7 +228,7 @@ echo template_render('../templates/layout.html', array( 'content' => msg() . $content, 'header_toolbar' => header_toolbar(), 'faq_url' => $faq_url, - 'locale' => $_SESSION['locale'] + 'locale' => $_SESSION['locale'] )); counter(); -- cgit v1.2.3-54-g00ecf From c8cc46886b4a163f9408df80c3bfbdcfa4ae2f7b Mon Sep 17 00:00:00 2001 From: Philip Häusler Date: Tue, 16 Dec 2014 09:25:36 +0100 Subject: shift type list --- db/update.sql | 4 +- includes/controller/shifttypes_controller.php | 13 +++++++ includes/sys_menu.php | 53 ++++++++++++++------------- includes/view/ShiftTypes_view.php | 19 +++++++++- public/index.php | 2 + 5 files changed, 63 insertions(+), 28 deletions(-) (limited to 'public') diff --git a/db/update.sql b/db/update.sql index d7d91a80..8c9bdaec 100644 --- a/db/update.sql +++ b/db/update.sql @@ -5,7 +5,9 @@ CREATE TABLE IF NOT EXISTS `ShiftTypes` ( `angeltype_id` int(11) DEFAULT NULL, `description` text NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; +INSERT INTO `engelsystem`.`Privileges` (`id`, `name`, `desc`) VALUES (NULL , 'shifttypes', 'Administrate shift types'); +INSERT INTO `GroupPrivileges` SET `group_id`=-5, `privilege_id`=(SELECT `id` FROM `Privileges` WHERE `name`='shifttypes'); /* cleanup */ ALTER TABLE `User` DROP `ICQ` ; diff --git a/includes/controller/shifttypes_controller.php b/includes/controller/shifttypes_controller.php index 3ceb5c0d..6d061111 100644 --- a/includes/controller/shifttypes_controller.php +++ b/includes/controller/shifttypes_controller.php @@ -10,6 +10,19 @@ function shifttype_controller() { } function shifttypes_list_controller() { + global $privileges, $user; + + if (! in_array('shifttypes', $privileges)) + redirect('?'); + + $shifttypes = ShiftTypes(); + if ($shifttypes === false) + engelsystem_error("Unable to load shifttypes."); + + return array( + shifttypes_title(), + ShiftTypes_list_view($shifttypes) + ); } /** diff --git a/includes/sys_menu.php b/includes/sys_menu.php index ffe76219..75c7c3db 100644 --- a/includes/sys_menu.php +++ b/includes/sys_menu.php @@ -15,21 +15,21 @@ function page_link_to_absolute($page) { */ function header_toolbar() { global $p, $privileges, $user, $enable_tshirt_size; - + $toolbar_items = array(); - + if (isset($user)) $toolbar_items[] = toolbar_item_link(page_link_to('users') . '&action=view', 'time', User_shift_state_render($user)); - + if (! isset($user) && in_array('register', $privileges)) $toolbar_items[] = toolbar_item_link(page_link_to('register'), 'plus', register_title(), $p == 'register'); - + if (in_array('login', $privileges)) $toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $p == 'login'); - + if (isset($user) && in_array('user_messages', $privileges)) $toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages()); - + $hints = []; if (isset($user)) { $hint_class = 'info'; @@ -40,30 +40,30 @@ function header_toolbar() { if ($new_questions != "") $hints[] = $new_questions; } - + $unconfirmed_hint = user_angeltypes_unconfirmed_hint(); if ($unconfirmed_hint != '') $hints[] = $unconfirmed_hint; - + if (User_is_freeloader($user)) { $hints[] = error(sprintf(_("You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again."), $max_freeloadable_shifts), true); $hint_class = 'danger'; $glyphicon = 'warning-sign'; } - + // Hinweis für Engel, die noch nicht angekommen sind if ($user['Gekommen'] == 0) { $hints[] = error(_("You are not marked as arrived. Please go to heaven's desk, get your angel badge and/or tell them that you arrived already."), true); $hint_class = 'danger'; $glyphicon = 'warning-sign'; } - + if ($enable_tshirt_size && $user['Size'] == "") { $hints[] = error(_("You need to specify a tshirt size in your settings!"), true); $hint_class = 'danger'; $glyphicon = 'warning-sign'; } - + if ($user['DECT'] == "") { $hints[] = error(_("You need to specify a DECT phone number in your settings! If you don't have a DECT phone, just enter \"-\"."), true); $hint_class = 'danger'; @@ -72,40 +72,40 @@ function header_toolbar() { } if (count($hints) > 0) $toolbar_items[] = toolbar_popover($glyphicon . ' text-' . $hint_class, '', $hints, 'bg-' . $hint_class); - + $user_submenu = make_langselect(); $user_submenu[] = toolbar_item_divider(); if (in_array('user_myshifts', $privileges)) $toolbar_items[] = toolbar_item_link(page_link_to('users') . '&action=view', ' icon-icon_angel', $user['Nick'], $p == 'users'); - + if (in_array('user_settings', $privileges)) $user_submenu[] = toolbar_item_link(page_link_to('user_settings'), 'list-alt', settings_title(), $p == 'user_settings'); - + if (in_array('logout', $privileges)) $user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $p == 'logout'); - + if (count($user_submenu) > 0) $toolbar_items[] = toolbar_dropdown('', '', $user_submenu); - + return toolbar($toolbar_items, true); } function make_navigation() { global $p, $privileges; - + $menu = array(); $pages = array( "news" => news_title(), "user_meetings" => meetings_title(), "user_shifts" => shifts_title(), "angeltypes" => angeltypes_title(), - "user_questions" => questions_title() + "user_questions" => questions_title() ); - + foreach ($pages as $page => $title) if (in_array($page, $privileges)) $menu[] = toolbar_item_link(page_link_to($page), '', $title, $page == $p); - + $admin_menu = array(); $admin_pages = array( "admin_arrive" => admin_arrive_title(), @@ -113,31 +113,32 @@ function make_navigation() { "admin_user" => admin_user_title(), "admin_free" => admin_free_title(), "admin_questions" => admin_questions_title(), + "shifttypes" => shifttypes_title(), "admin_shifts" => admin_shifts_title(), "admin_rooms" => admin_rooms_title(), "admin_groups" => admin_groups_title(), "admin_import" => admin_import_title(), - "admin_log" => admin_log_title() + "admin_log" => admin_log_title() ); - + foreach ($admin_pages as $page => $title) if (in_array($page, $privileges)) $admin_menu[] = toolbar_item_link(page_link_to($page), '', $title, $page == $p); - + if (count($admin_menu) > 0) $menu[] = toolbar_dropdown('', _("Admin"), $admin_menu); - + return toolbar($menu); } function make_navigation_for($name, $pages) { global $privileges, $p; - + $menu = ""; foreach ($pages as $page) if (in_array($page, $privileges)) $menu .= '' . $title . ''; - + if ($menu != "") $menu = ''; return $menu; diff --git a/includes/view/ShiftTypes_view.php b/includes/view/ShiftTypes_view.php index c18ea493..a7df2c87 100644 --- a/includes/view/ShiftTypes_view.php +++ b/includes/view/ShiftTypes_view.php @@ -9,7 +9,24 @@ function ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $s function ShiftType_view($shifttype) { } -function ShiftTypes_list_view() { +function ShiftTypes_list_view($shifttypes) { + foreach ($shifttypes as &$shifttype) { + $shifttype['actions'] = table_buttons([ + button(page_link_to('shifttypes') . '&action=edit&shifttype_id=' . $shifttype['id'], _("edit"), "btn-xs"), + button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttypes['id'], _("delete"), "btn-xs") + ]); + } + + return page_with_title(shifttypes_title(), array( + msg(), + buttons(array( + button(page_link_to('shifttypes') . '&action=edit', _("New shifttype"), 'add') + )), + table(array( + 'name' => _("Name"), + 'actions' => "" + ), $shifttypes) + )); } ?> \ No newline at end of file diff --git a/public/index.php b/public/index.php index 6574b619..51bd7661 100644 --- a/public/index.php +++ b/public/index.php @@ -131,6 +131,8 @@ if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (i list($title, $content) = users_controller(); } elseif ($p == "user_angeltypes") { list($title, $content) = user_angeltypes_controller(); + } elseif ($p == "shifttypes") { + list($title, $content) = shifttypes_controller(); } elseif ($p == "news") { $title = news_title(); $content = user_news(); -- cgit v1.2.3-54-g00ecf From d02272afd6725d46c37b7ba781c5d40268aa09a6 Mon Sep 17 00:00:00 2001 From: Philip Häusler Date: Fri, 19 Dec 2014 22:41:55 +0100 Subject: add basic shift view --- includes/controller/shifts_controller.php | 61 ++++++++ includes/model/Shifts_model.php | 4 +- includes/pages/user_shifts.php | 242 +++++++++++++++--------------- includes/sys_menu.php | 2 +- includes/sys_template.php | 4 + includes/view/Shifts_view.php | 89 ++++++++++- includes/view/User_view.php | 84 ++++++----- public/index.php | 4 + 8 files changed, 320 insertions(+), 170 deletions(-) (limited to 'public') diff --git a/includes/controller/shifts_controller.php b/includes/controller/shifts_controller.php index 8352092d..58131d2e 100644 --- a/includes/controller/shifts_controller.php +++ b/includes/controller/shifts_controller.php @@ -1,5 +1,66 @@ 0) { $shift_entry_source = $shift_entry_source[0]; - + $result = ShiftEntry_delete($entry_id); if ($result === false) engelsystem_error('Unable to delete shift entry.'); - + engelsystem_log("Deleted " . User_Nick_render($shift_entry_source) . "'s shift: " . $shift_entry_source['name'] . " at " . $shift_entry_source['Name'] . " from " . date("y-m-d H:i", $shift_entry_source['start']) . " to " . date("y-m-d H:i", $shift_entry_source['end']) . " as " . $shift_entry_source['angel_type']); success(_("Shift entry deleted.")); } else @@ -42,16 +42,12 @@ function user_shifts() { elseif (isset($_REQUEST['edit_shift']) && in_array('admin_shifts', $privileges)) { $msg = ""; $ok = true; - + if (isset($_REQUEST['edit_shift']) && test_request_int('edit_shift')) $shift_id = $_REQUEST['edit_shift']; else redirect(page_link_to('user_shifts')); - - /* - * if (sql_num_query("SELECT * FROM `ShiftEntry` WHERE `SID`=" . sql_escape($shift_id) . " LIMIT 1") > 0) { error("Du kannst nur Schichten bearbeiten, bei denen niemand eingetragen ist."); redirect(page_link_to('user_shift')); } - */ - + $shift = sql_select(" SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.* FROM `Shifts` JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) @@ -60,13 +56,13 @@ function user_shifts() { if (count($shift) == 0) redirect(page_link_to('user_shifts')); $shift = $shift[0]; - + // Locations laden $rooms = sql_select("SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name`"); $room_array = array(); foreach ($rooms as $room) $room_array[$room['RID']] = $room['Name']; - + // Engeltypen laden $types = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $angel_types = array(); @@ -75,30 +71,30 @@ function user_shifts() { $angel_types[$type['id']] = $type; $needed_angel_types[$type['id']] = 0; } - + // Benötigte Engeltypen vom Raum $needed_angel_types_source = sql_select("SELECT `AngelTypes`.*, `NeededAngelTypes`.`count` FROM `AngelTypes` LEFT JOIN `NeededAngelTypes` ON (`NeededAngelTypes`.`angel_type_id` = `AngelTypes`.`id` AND `NeededAngelTypes`.`room_id`=" . sql_escape($shift['RID']) . ") ORDER BY `AngelTypes`.`name`"); foreach ($needed_angel_types_source as $type) { if ($type['count'] != "") $needed_angel_types[$type['id']] = $type['count']; } - + // Benötigte Engeltypen von der Schicht $needed_angel_types_source = sql_select("SELECT `AngelTypes`.*, `NeededAngelTypes`.`count` FROM `AngelTypes` LEFT JOIN `NeededAngelTypes` ON (`NeededAngelTypes`.`angel_type_id` = `AngelTypes`.`id` AND `NeededAngelTypes`.`shift_id`=" . sql_escape($shift_id) . ") ORDER BY `AngelTypes`.`name`"); foreach ($needed_angel_types_source as $type) { if ($type['count'] != "") $needed_angel_types[$type['id']] = $type['count']; } - + $name = $shift['name']; $rid = $shift['RID']; $start = $shift['start']; $end = $shift['end']; - + if (isset($_REQUEST['submit'])) { // Name/Bezeichnung der Schicht, darf leer sein $name = strip_request_item('name'); - + // Auswahl der sichtbaren Locations für die Schichten if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room_array[$_REQUEST['rid']])) $rid = $_REQUEST['rid']; @@ -107,26 +103,26 @@ function user_shifts() { $rid = $rooms[0]['RID']; $msg .= error(_("Please select a room."), true); } - + if (isset($_REQUEST['start']) && $tmp = DateTime::createFromFormat("Y-m-d H:i", trim($_REQUEST['start']))) $start = $tmp->getTimestamp(); else { $ok = false; $msg .= error(_("Please enter a valid starting time for the shifts."), true); } - + if (isset($_REQUEST['end']) && $tmp = DateTime::createFromFormat("Y-m-d H:i", trim($_REQUEST['end']))) $end = $tmp->getTimestamp(); else { $ok = false; $msg .= error(_("Please enter a valid ending time for the shifts."), true); } - + if ($start >= $end) { $ok = false; $msg .= error(_("The ending time has to be after the starting time."), true); } - + foreach ($needed_angel_types_source as $type) { if (isset($_REQUEST['type_' . $type['id']]) && preg_match("/^[0-9]+$/", trim($_REQUEST['type_' . $type['id']]))) { $needed_angel_types[$type['id']] = trim($_REQUEST['type_' . $type['id']]); @@ -135,7 +131,7 @@ function user_shifts() { $msg .= error(sprintf(_("Please check your input for needed angels of type %s."), $type['name']), true); } } - + if ($ok) { $shift['name'] = $name; $shift['RID'] = $rid; @@ -150,19 +146,19 @@ function user_shifts() { sql_query("INSERT INTO `NeededAngelTypes` SET `shift_id`=" . sql_escape($shift_id) . ", `angel_type_id`=" . sql_escape($type_id) . ", `count`=" . sql_escape($count)); $needed_angel_types_info[] = $angel_types[$type_id]['name'] . ": " . $count; } - + engelsystem_log("Updated shift '" . $name . "' from " . date("y-m-d H:i", $start) . " to " . date("y-m-d H:i", $end) . " with angel types " . join(", ", $needed_angel_types_info)); success(_("Shift updated.")); - redirect(page_link_to('user_shifts')); + redirect(shift_link($shift_id)); } } - + $room_select = html_select_key('rid', 'rid', $room_array, $rid); - + $angel_types = ""; foreach ($types as $type) $angel_types .= form_spinner('type_' . $type['id'], $type['name'], $needed_angel_types[$type['id']]); - + return page_with_title(shifts_title(), array( msg(), '', @@ -173,8 +169,8 @@ function user_shifts() { form_text('end', _("End:"), date("Y-m-d H:i", $end)), '

' . _("Needed angels") . '

', $angel_types, - form_submit('submit', _("Save")) - )) + form_submit('submit', _("Save")) + )) )); } // Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg) elseif (isset($_REQUEST['delete_shift']) && in_array('user_shifts_admin', $privileges)) { @@ -182,7 +178,7 @@ function user_shifts() { $shift_id = $_REQUEST['delete_shift']; else redirect(page_link_to('user_shifts')); - + $shift = sql_select(" SELECT `Shifts`.*, `ShiftTypes`.`name`, `Room`.* FROM `Shifts` @@ -192,28 +188,28 @@ function user_shifts() { if (count($shift) == 0) redirect(page_link_to('user_shifts')); $shift = $shift[0]; - + // Schicht löschen bestätigt if (isset($_REQUEST['delete'])) { $result = Shift_delete($shift_id); if ($result === false) engelsystem_error('Unable to delete shift.'); - + engelsystem_log("Deleted shift " . $shift['name'] . " from " . date("y-m-d H:i", $shift['start']) . " to " . date("y-m-d H:i", $shift['end'])); success(_("Shift deleted.")); redirect(page_link_to('user_shifts')); } - + return page_with_title(shifts_title(), array( error(sprintf(_("Do you want to delete the shift %s from %s to %s?"), $shift['name'], date("Y-m-d H:i", $shift['start']), date("H:i", $shift['end'])), true), - '' . _("delete") . '' + '' . _("delete") . '' )); } elseif (isset($_REQUEST['shift_id'])) { if (isset($_REQUEST['shift_id']) && preg_match("/^[0-9]*$/", $_REQUEST['shift_id'])) $shift_id = $_REQUEST['shift_id']; else redirect(page_link_to('user_shifts')); - + $shift = sql_select(" SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.* FROM `Shifts` @@ -223,18 +219,18 @@ function user_shifts() { if (count($shift) == 0) redirect(page_link_to('user_shifts')); $shift = $shift[0]; - + if (isset($_REQUEST['type_id']) && preg_match("/^[0-9]*$/", $_REQUEST['type_id'])) $type_id = $_REQUEST['type_id']; else redirect(page_link_to('user_shifts')); - + // Schicht läuft schon, Eintragen für Engel nicht mehr möglich if (! in_array('user_shifts_admin', $privileges) && time() > $shift['start']) { error(_("This shift is running now or ended already. Please contact a dispatcher to join the shift.")); - redirect(page_link_to('user_shifts')); + redirect(shift_link($shift)); } - + // Another shift the user is signed up for collides with this one if (! in_array('user_shifts_admin', $privileges) && sql_num_query(" SELECT `Shifts`.`SID` @@ -242,18 +238,18 @@ function user_shifts() { INNER JOIN `ShiftEntry` ON (`Shifts`.`SID` = `ShiftEntry`.`SID` AND `ShiftEntry`.`UID` = " . sql_escape($user['UID']) . ") WHERE `start` < '" . sql_escape($shift['end']) . "' AND `end` > '" . sql_escape($shift['start']) . "'") > 0) { error(_("You already subscribed to shift in the same timeslot. Please contact a dispatcher to join the shift.")); - redirect(page_link_to('user_shifts')); + redirect(shift_link($shift)); } - + if (in_array('user_shifts_admin', $privileges)) $type = sql_select("SELECT * FROM `AngelTypes` WHERE `id`=" . sql_escape($type_id) . " LIMIT 1"); else $type = sql_select("SELECT * FROM `UserAngelTypes` JOIN `AngelTypes` ON (`UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id`) WHERE `AngelTypes`.`id` = " . sql_escape($type_id) . " AND (`AngelTypes`.`restricted` = 0 OR (`UserAngelTypes`.`user_id` = " . sql_escape($user['UID']) . " AND NOT `UserAngelTypes`.`confirm_user_id` IS NULL)) LIMIT 1"); - + if (count($type) == 0) redirect(page_link_to('user_shifts')); $type = $type[0]; - + if (isset($_REQUEST['submit'])) { $selected_type_id = $type_id; if (in_array('user_shifts_admin', $privileges)) { @@ -261,25 +257,25 @@ function user_shifts() { $user_id = $_REQUEST['user_id']; else $user_id = $user['UID']; - + if (sql_num_query("SELECT * FROM `User` WHERE `UID`=" . sql_escape($user_id) . " LIMIT 1") == 0) redirect(page_link_to('user_shifts')); - + if (isset($_REQUEST['angeltype_id']) && test_request_int('angeltype_id') && sql_num_query("SELECT * FROM `AngelTypes` WHERE `id`=" . sql_escape($_REQUEST['angeltype_id']) . " LIMIT 1") > 0) $selected_type_id = $_REQUEST['angeltype_id']; } else $user_id = $user['UID']; - + if (sql_num_query("SELECT * FROM `ShiftEntry` WHERE `SID`='" . sql_escape($shift['SID']) . "' AND `UID` = '" . sql_escape($user_id) . "'")) return error("This angel does already have an entry for this shift.", true); - + $freeloaded = $shift['freeloaded']; $freeload_comment = $shift['freeload_comment']; if (in_array("user_shifts_admin", $privileges)) { $freeloaded = isset($_REQUEST['freeloaded']); $freeload_comment = strip_request_item_nl('freeload_comment'); } - + $comment = strip_request_item_nl('comment'); $result = ShiftEntry_create(array( 'SID' => $shift_id, @@ -287,28 +283,28 @@ function user_shifts() { 'UID' => $user_id, 'Comment' => $comment, 'freeloaded' => $freeloaded, - 'freeload_comment' => $freeload_comment + 'freeload_comment' => $freeload_comment )); if ($result === false) engelsystem_error('Unable to create shift entry.'); - + if ($type['restricted'] == 0 && sql_num_query("SELECT * FROM `UserAngelTypes` INNER JOIN `AngelTypes` ON `AngelTypes`.`id` = `UserAngelTypes`.`angeltype_id` WHERE `angeltype_id` = '" . sql_escape($selected_type_id) . "' AND `user_id` = '" . sql_escape($user_id) . "' ") == 0) sql_query("INSERT INTO `UserAngelTypes` (`user_id`, `angeltype_id`) VALUES ('" . sql_escape($user_id) . "', '" . sql_escape($selected_type_id) . "')"); - + $user_source = User($user_id); engelsystem_log("User " . User_Nick_render($user_source) . " signed up for shift " . $shift['name'] . " from " . date("y-m-d H:i", $shift['start']) . " to " . date("y-m-d H:i", $shift['end'])); success(_("You are subscribed. Thank you!") . ' ' . _("My shifts") . ' »'); - redirect(page_link_to('user_shifts')); + redirect(shift_link($shift)); } - + if (in_array('user_shifts_admin', $privileges)) { $users = sql_select("SELECT *, (SELECT count(*) FROM `ShiftEntry` WHERE `freeloaded`=1 AND `ShiftEntry`.`UID`=`User`.`UID`) AS `freeloaded` FROM `User` ORDER BY `Nick`"); $users_select = array(); - + foreach ($users as $usr) $users_select[$usr['UID']] = $usr['Nick'] . ($usr['freeloaded'] == 0 ? "" : " (" . _("Freeloader") . ")"); $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); - + $angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $angeltypes = array(); foreach ($angeltypes_source as $angeltype) @@ -318,7 +314,7 @@ function user_shifts() { $user_text = User_Nick_render($user); $angeltyppe_select = $type['name']; } - + return ShiftEntry_edit_view($user_text, date("Y-m-d H:i", $shift['start']) . ' – ' . date('Y-m-d H:i', $shift['end']) . ' (' . shift_length($shift) . ')', $shift['Name'], $shift['name'], $angeltyppe_select, "", false, null, in_array('user_shifts_admin', $privileges)); } else { return view_user_shifts(); @@ -328,25 +324,25 @@ function user_shifts() { function view_user_shifts() { global $user, $privileges; global $ical_shifts; - + $ical_shifts = array(); $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('?'); } - + $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('?'); } - + if (in_array('user_shifts_admin', $privileges)) $types = sql_select("SELECT `id`, `name` FROM `AngelTypes` ORDER BY `AngelTypes`.`name`"); else @@ -356,32 +352,32 @@ function view_user_shifts() { $filled = array( array( 'id' => '1', - 'name' => _('occupied') + 'name' => _('occupied') ), array( 'id' => '0', - 'name' => _('free') - ) + 'name' => _('free') + ) ); - + if (count($types) == 0) { error(_("The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype.")); redirect('?'); } - + if (! isset($_SESSION['user_shifts'])) $_SESSION['user_shifts'] = array(); - + if (! isset($_SESSION['user_shifts']['filled'])) { $_SESSION['user_shifts']['filled'] = array( - 0 + 0 ); } - + foreach (array( 'rooms', 'types', - 'filled' + 'filled' ) as $key) { if (isset($_REQUEST[$key])) { $filtered = array_filter($_REQUEST[$key], 'is_numeric'); @@ -392,7 +388,7 @@ function view_user_shifts() { if (! isset($_SESSION['user_shifts'][$key])) $_SESSION['user_shifts'][$key] = array_map('get_ids_from_array', $$key); } - + if (isset($_REQUEST['rooms'])) { if (isset($_REQUEST['new_style'])) $_SESSION['user_shifts']['new_style'] = true; @@ -403,7 +399,7 @@ function view_user_shifts() { $_SESSION['user_shifts']['new_style'] = true; foreach (array( 'start', - 'end' + 'end' ) as $key) { if (isset($_REQUEST[$key . '_day']) && in_array($_REQUEST[$key . '_day'], $days)) $_SESSION['user_shifts'][$key . '_day'] = $_REQUEST[$key . '_day']; @@ -420,24 +416,24 @@ function view_user_shifts() { $_SESSION['user_shifts']['end_day'] = $_SESSION['user_shifts']['start_day']; if ($_SESSION['user_shifts']['start_day'] == $_SESSION['user_shifts']['end_day'] && $_SESSION['user_shifts']['start_time'] >= $_SESSION['user_shifts']['end_time']) $_SESSION['user_shifts']['end_time'] = '23:59'; - + if (isset($_SESSION['user_shifts']['start_day'])) { $starttime = DateTime::createFromFormat("Y-m-d H:i", $_SESSION['user_shifts']['start_day'] . $_SESSION['user_shifts']['start_time']); $starttime = $starttime->getTimestamp(); } else $starttime = now(); - + if (isset($_SESSION['user_shifts']['end_day'])) { $endtime = DateTime::createFromFormat("Y-m-d H:i", $_SESSION['user_shifts']['end_day'] . $_SESSION['user_shifts']['end_time']); $endtime = $endtime->getTimestamp(); } else $endtime = now() + 24 * 60 * 60; - + if (! isset($_SESSION['user_shifts']['rooms']) || count($_SESSION['user_shifts']['rooms']) == 0) $_SESSION['user_shifts']['rooms'] = array( - 0 + 0 ); - + $SQL = "SELECT DISTINCT `ShiftTypes`.`name`, `Shifts`.*, `Room`.`Name` as `room_name`, nat2.`special_needs` > 0 AS 'has_special_needs' FROM `Shifts` INNER JOIN `Room` USING (`RID`) @@ -447,14 +443,14 @@ function view_user_shifts() { LEFT JOIN (SELECT se.`SID`, se.`TID`, COUNT(*) as count FROM `ShiftEntry` AS se GROUP BY se.`SID`, se.`TID`) AS entries ON entries.`SID` = `Shifts`.`SID` AND entries.`TID` = nat.`angel_type_id` WHERE `Shifts`.`RID` IN (" . implode(',', $_SESSION['user_shifts']['rooms']) . ") AND `start` BETWEEN " . $starttime . " AND " . $endtime; - + if (count($_SESSION['user_shifts']['filled']) == 1) { if ($_SESSION['user_shifts']['filled'][0] == 0) $SQL .= " - AND (nat.`count` > entries.`count` OR entries.`count` IS NULL OR EXISTS (SELECT `SID` FROM `ShiftEntry` WHERE `UID` = " .sql_escape($user['UID']) . " AND `ShiftEntry`.`SID` = `Shifts`.`SID`))"; + AND (nat.`count` > entries.`count` OR entries.`count` IS NULL OR EXISTS (SELECT `SID` FROM `ShiftEntry` WHERE `UID` = " . sql_escape($user['UID']) . " AND `ShiftEntry`.`SID` = `Shifts`.`SID`))"; elseif ($_SESSION['user_shifts']['filled'][0] == 1) $SQL .= " - AND (nat.`count` <= entries.`count` OR EXISTS (SELECT `SID` FROM `ShiftEntry` WHERE `UID` = " .sql_escape($user['UID']) . " AND `ShiftEntry`.`SID` = `Shifts`.`SID`))"; + AND (nat.`count` <= entries.`count` OR EXISTS (SELECT `SID` FROM `ShiftEntry` WHERE `UID` = " . sql_escape($user['UID']) . " AND `ShiftEntry`.`SID` = `Shifts`.`SID`))"; } $SQL .= " ORDER BY `start`"; @@ -470,7 +466,7 @@ function view_user_shifts() { foreach ($ownshifts_source as $ownshift) $ownshifts[$ownshift['SID']] = $ownshift; unset($ownshifts_source); - + $shifts_table = ""; // qqqq /* @@ -482,7 +478,7 @@ function view_user_shifts() { $block = array(); $todo = array(); $myrooms = $rooms; - + // delete un-selected rooms from array foreach ($myrooms as $k => $v) { if (array_search($v["id"], $_SESSION['user_shifts']['rooms']) === FALSE) @@ -490,7 +486,7 @@ function view_user_shifts() { // 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"]; @@ -500,7 +496,7 @@ function view_user_shifts() { $block[$rid][$i] ++; $shifts[$k]['own'] = in_array($shift['SID'], array_keys($ownshifts)); } - + $shifts_table = '
'; foreach ($myrooms as $key => $room) { $rid = $room["id"]; @@ -517,15 +513,14 @@ function view_user_shifts() { $shifts_table .= " 1) ? ' colspan="' . $colspan . '"' : '') . ">${room['name']}\n"; } unset($block, $blocks, $firstblock, $colspan, $key, $room); - + $shifts_table .= ""; for ($i = 0; $i < $maxshow; $i ++) { $thistime = $first + ($i * 15 * 60); if ($thistime % (24 * 60 * 60) == 23 * 60 * 60 && $endtime - $starttime > 24 * 60 * 60) { $shifts_table .= "
-
"; $shifts_table .= date('y-m-dH:i', $thistime); - } - elseif ($thistime % (60 * 60) == 0) { + } elseif ($thistime % (60 * 60) == 0) { $shifts_table .= "
"; $shifts_table .= date("H:i", $thistime); } else { @@ -540,26 +535,23 @@ function view_user_shifts() { $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']) - { + 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; } } - + // qqqqqq $is_free = false; - $shifts_row = $shift['name']; + $shifts_row = '' . $shift['name'] . ''; if (in_array('admin_shifts', $privileges)) $shifts_row .= ' ' . table_buttons(array( button(page_link_to('user_shifts') . '&edit_shift=' . $shift['SID'], glyph('edit'), 'btn-xs'), - button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs') + button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs') )); $shifts_row .= '
'; $query = "SELECT `NeededAngelTypes`.`count`, `AngelTypes`.`id`, `AngelTypes`.`restricted`, `UserAngelTypes`.`confirm_user_id`, `AngelTypes`.`name`, `UserAngelTypes`.`user_id` @@ -577,7 +569,7 @@ function view_user_shifts() { $query .= " AND `angel_type_id` IN (" . implode(',', $_SESSION['user_shifts']['types']) . ") "; $query .= " ORDER BY `AngelTypes`.`name`"; $angeltypes = sql_select($query); - + if (count($angeltypes) > 0) { foreach ($angeltypes as $angeltype) { $entries = sql_select("SELECT * FROM `ShiftEntry` JOIN `User` ON (`ShiftEntry`.`UID` = `User`.`UID`) WHERE `SID`=" . sql_escape($shift['SID']) . " AND `TID`=" . sql_escape($angeltype['id']) . " ORDER BY `Nick`"); @@ -594,7 +586,7 @@ function view_user_shifts() { } if (in_array('user_shifts_admin', $privileges)) $entry_list[] = "" . User_Nick_render($entry) . ' ' . table_buttons(array( - button(page_link_to('user_shifts') . '&entry_id=' . $entry['id'], glyph('trash'), 'btn-xs') + button(page_link_to('user_shifts') . '&entry_id=' . $entry['id'], glyph('trash'), 'btn-xs') )) . ''; else $entry_list[] = "" . User_Nick_render($entry) . ""; @@ -603,20 +595,20 @@ function view_user_shifts() { $inner_text = sprintf(ngettext("%d helper needed", "%d helpers needed", $angeltype['count'] - count($entries)), $angeltype['count'] - count($entries)); // is the shift still running or alternatively is the user shift admin? $user_may_join_shift = true; - + // you cannot join if user alread joined a parallel or this shift $user_may_join_shift &= ! $collides; - + // you cannot join if user is not of this angel type $user_may_join_shift &= isset($angeltype['user_id']); - + // you cannot join if you are not confirmed if ($angeltype['restricted'] == 1 && isset($angeltype['user_id'])) $user_may_join_shift &= isset($angeltype['confirm_user_id']); - + // you can only join if the shift is in future or running $user_may_join_shift &= time() < $shift['start']; - + // User shift admins may join anybody in every shift $user_may_join_shift |= in_array('user_shifts_admin', $privileges); if ($user_may_join_shift) @@ -631,11 +623,11 @@ function view_user_shifts() { else $entry_list[] = $inner_text . ' (Werde ' . $angeltype['name'] . ')'; } - + unset($inner_text); $is_free = true; } - + $shifts_row .= '' . $angeltype['name'] . ': '; $shifts_row .= join(", ", $entry_list); $shifts_row .= '
'; @@ -678,16 +670,16 @@ function view_user_shifts() { $info[] = date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']); if (count($_SESSION['user_shifts']['rooms']) > 1) $info[] = $shift['room_name']; - + $shift_row = array( 'info' => join('
', $info), - 'entries' => $shift['name'] + 'entries' => $shift['name'] ); - + if (in_array('admin_shifts', $privileges)) $shift_row['info'] .= ' ' . table_buttons(array( button(page_link_to('user_shifts') . '&edit_shift=' . $shift['SID'], glyph('edit'), 'btn-xs'), - button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs') + button(page_link_to('user_shifts') . '&delete_shift=' . $shift['SID'], glyph('trash'), 'btn-xs') )); $shift_row['entries'] .= '
'; $is_free = false; @@ -708,7 +700,7 @@ function view_user_shifts() { $angeltypes = sql_select($query); if (count($angeltypes) > 0) { $my_shift = sql_num_query("SELECT * FROM `ShiftEntry` WHERE `SID`=" . sql_escape($shift['SID']) . " AND `UID`=" . sql_escape($user['UID']) . " LIMIT 1") > 0; - + foreach ($angeltypes as &$angeltype) { $entries = sql_select("SELECT * FROM `ShiftEntry` JOIN `User` ON (`ShiftEntry`.`UID` = `User`.`UID`) WHERE `SID`=" . sql_escape($shift['SID']) . " AND `TID`=" . sql_escape($angeltype['id']) . " ORDER BY `Nick`"); $entry_list = array(); @@ -716,7 +708,7 @@ function view_user_shifts() { foreach ($entries as $entry) { if (in_array('user_shifts_admin', $privileges)) $member = User_Nick_render($entry) . ' ' . table_buttons(array( - button(page_link_to('user_shifts') . '&entry_id=' . $entry['id'], glyph('trash'), 'btn-xs') + button(page_link_to('user_shifts') . '&entry_id=' . $entry['id'], glyph('trash'), 'btn-xs') )); else $member = User_Nick_render($entry); @@ -732,20 +724,20 @@ function view_user_shifts() { $inner_text = sprintf(ngettext("%d helper needed", "%d helpers needed", $angeltype['count'] - count($entries) + $freeloader), $angeltype['count'] - count($entries) + $freeloader); // is the shift still running or alternatively is the user shift admin? $user_may_join_shift = true; - + /* you cannot join if user already joined this shift */ $user_may_join_shift &= ! $my_shift; - + // you cannot join if user is not of this angel type $user_may_join_shift &= isset($angeltype['user_id']); - + // you cannot join if you are not confirmed if ($angeltype['restricted'] == 1 && isset($angeltype['user_id'])) $user_may_join_shift &= isset($angeltype['confirm_user_id']); - + // you can only join if the shift is in future or running $user_may_join_shift &= time() < $shift['start']; - + // User shift admins may join anybody in every shift $user_may_join_shift |= in_array('user_shifts_admin', $privileges); if ($user_may_join_shift) @@ -759,11 +751,11 @@ function view_user_shifts() { $entry_list[] = $inner_text . ' (Werde ' . $angeltype['name'] . ')'; } } - + unset($inner_text); $is_free = true; } - + $shift_row['entries'] .= '' . $angeltype['name'] . ': '; $shift_row['entries'] .= join(", ", $entry_list); $shift_row['entries'] .= '
'; @@ -778,13 +770,13 @@ function view_user_shifts() { } $shifts_table = table(array( 'info' => _("Time") . "/" . _("Room"), - 'entries' => _("Entries") + 'entries' => _("Entries") ), $shifts_table); } - + if ($user['api_key'] == "") User_reset_api_key($user, false); - + return page(array( '
', msg(), @@ -801,9 +793,9 @@ function view_user_shifts() { 'new_style_checkbox' => '', 'shifts_table' => msg() . $shifts_table, 'ical_text' => '

' . _("iCal export") . '

' . 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") + 'filter' => _("Filter") )), - '
' + '' )); } @@ -829,14 +821,14 @@ function make_select($items, $selected, $name, $title = null) { $html_items = array(); if (isset($title)) $html_items[] = '

' . $title . '

' . "\n"; - + foreach ($items as $i) $html_items[] = '
' . (! isset($i['enabled']) || $i['enabled'] ? '' : glyph("lock")) . '

'; $html = '
' . "\n"; $html .= implode("\n", $html_items); $html .= buttons(array( button("javascript: check_all('selection_" . $name . "')", _("All"), ""), - button("javascript: uncheck_all('selection_" . $name . "')", _("None"), "") + button("javascript: uncheck_all('selection_" . $name . "')", _("None"), "") )); $html .= '
' . "\n"; return $html; diff --git a/includes/sys_menu.php b/includes/sys_menu.php index 75c7c3db..c5cded11 100644 --- a/includes/sys_menu.php +++ b/includes/sys_menu.php @@ -14,7 +14,7 @@ function page_link_to_absolute($page) { * Renders the header toolbar containing search, login/logout, user and settings links. */ function header_toolbar() { - global $p, $privileges, $user, $enable_tshirt_size; + global $p, $privileges, $user, $enable_tshirt_size, $max_freeloadable_shifts; $toolbar_items = array(); diff --git a/includes/sys_template.php b/includes/sys_template.php index b9ae39de..56751e16 100644 --- a/includes/sys_template.php +++ b/includes/sys_template.php @@ -9,6 +9,10 @@ $themes = array( "2" => "Engelsystem 31c3" ); +function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') { + return '
' . $content . '
'; +} + /** * Render glyphicon * diff --git a/includes/view/Shifts_view.php b/includes/view/Shifts_view.php index d0e7d809..47f83a9f 100644 --- a/includes/view/Shifts_view.php +++ b/includes/view/Shifts_view.php @@ -1,7 +1,94 @@ = $needed_angeltype['count']) + $class = 'progress-bar-success'; + $needed_angels .= '
'; + $needed_angels .= '
' . button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $needed_angeltype['TID'], _('Sign up')) . '
'; + $needed_angels .= '

' . $angeltypes[$needed_angeltype['TID']]['name'] . '

'; + $needed_angels .= progress_bar(0, $needed_angeltype['count'], $needed_angeltype['taken'], $class, $needed_angeltype['taken'] . ' / ' . $needed_angeltype['count']); + + $angels = []; + foreach ($shift['ShiftEntry'] as $shift_entry) { + if ($shift_entry['TID'] == $needed_angeltype['TID']) { + $entry = User_Nick_render(User($shift_entry['UID'])); + if ($shift_entry['freeloaded']) + $entry = '' . $entry . ''; + if ($user_shift_admin) { + $entry .= '
'; + $entry .= button_glyph(page_link_to('user_myshifts') . '&edit=' . $shift['SID'] . '&id=' . $shift_entry['UID'], 'pencil', 'btn-xs'); + $entry .= button_glyph(page_link_to('user_shifts') . '&entry_id=' . $shift_entry['id'], 'trash', 'btn-xs'); + $entry .= '
'; + } + $angels[] = $entry; + } + } + + $needed_angels .= join(', ', $angels); + + $needed_angels .= '
'; + } + + return page_with_title($shift['name'] . ' %c', [ + msg(), + $shift_admin ? buttons([ + button(shift_edit_link($shift), glyph('pencil') . _('edit')), + button(shift_delete_link($shift), glyph('trash') . _('delete')) + ]) : '', + div('row', [ + div('col-sm-3', [ + '

' . _('Start') . '

', + '

', + date('y-m-d', $shift['start']), + '
', + date('H:i', $shift['start']), + '

' + ]), + div('col-sm-3', [ + '

' . _('End') . '

', + '

', + date('y-m-d', $shift['end']), + '
', + date('H:i', $shift['end']), + '

' + ]), + div('col-sm-3', [ + '

' . _('Location') . '

', + '

' . $room['Name'] . '

' + ]), + div('col-sm-3', [ + '

' . _('More info') . '

', + $shift['URL'] != '' ? '' . $shift['URL'] . '' : '' + ]) + ]), + div('row', [ + div('col-sm-6', [ + '

' . _('Needed angels') . '

', + '
' . $needed_angels . '
' + ]), + div('col-sm-6', [ + '

' . _('Description') . '

', + $parsedown->parse($shifttype['description']) + ]) + ]) + ]); +} + /** * Calc shift length in format 12:23h. - * @param Shift $shift + * + * @param Shift $shift */ function shift_length($shift) { $length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ":"; diff --git a/includes/view/User_view.php b/includes/view/User_view.php index 99ca3eeb..59456946 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -16,7 +16,7 @@ $tshirt_sizes = array( 'S-G' => "S Girl", 'M-G' => "M Girl", 'L-G' => "L Girl", - 'XL-G' => "XL Girl" + 'XL-G' => "XL Girl" ); function Users_view($users, $order_by, $arrived_count, $active_count, $force_active_count, $freeloads_count, $tshirts_count) { @@ -28,7 +28,7 @@ function Users_view($users, $order_by, $arrived_count, $active_count, $force_act $user['Tshirt'] = glyph_bool($user['Tshirt']); $user['lastLogIn'] = date(_('m/d/Y h:i a'), $user['lastLogIn']); $user['actions'] = table_buttons(array( - button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs') + button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs') )); } $users[] = array( @@ -38,13 +38,13 @@ function Users_view($users, $order_by, $arrived_count, $active_count, $force_act 'force_active' => $force_active_count, 'freeloads' => $freeloads_count, 'Tshirt' => $tshirts_count, - 'actions' => '' . count($users) . '' + 'actions' => '' . count($users) . '' ); - + return page_with_title(_('All users'), array( msg(), buttons(array( - button(page_link_to('register'), glyph('plus') . _('New user')) + button(page_link_to('register'), glyph('plus') . _('New user')) )), table(array( 'Nick' => Users_table_header_link('Nick', _('Nick'), $order_by), @@ -58,8 +58,8 @@ function Users_view($users, $order_by, $arrived_count, $active_count, $force_act 'Tshirt' => Users_table_header_link('Tshirt', _('T-Shirt'), $order_by), 'Size' => Users_table_header_link('Size', _('Size'), $order_by), 'lastLogIn' => Users_table_header_link('lastLogIn', _('Last login'), $order_by), - 'actions' => '' - ), $users) + 'actions' => '' + ), $users) )); } @@ -71,18 +71,18 @@ function User_shift_state_render($user) { $upcoming_shifts = ShiftEntries_upcoming_for_user($user); if ($upcoming_shifts === false) return false; - + if (count($upcoming_shifts) == 0) return '' . _("Free") . ''; - + if ($upcoming_shifts[0]['start'] > time()) if ($upcoming_shifts[0]['start'] - time() > 3600) return '' . _("Next shift %c") . ''; else return '' . _("Next shift %c") . ''; - + $halfway = ($upcoming_shifts[0]['start'] + $upcoming_shifts[0]['end']) / 2; - + if (time() < $halfway) return '' . _("Shift starts %c") . ''; else @@ -91,17 +91,17 @@ function User_shift_state_render($user) { function User_view($user_source, $admin_user_privilege, $freeloader, $user_angeltypes, $user_groups, $shifts, $its_me) { global $LETZTES_AUSTRAGEN, $privileges; - + $user_name = htmlspecialchars($user_source['Vorname']) . " " . htmlspecialchars($user_source['Name']); - + $myshifts_table = array(); $html = ""; $timesum = 0; foreach ($shifts as $shift) { - $shift_info = $shift['name']; + $shift_info = '' . $shift['name'] . ''; foreach ($shift['needed_angeltypes'] as $needed_angel_type) { $shift_info .= '
' . $needed_angel_type['name'] . ': '; - + $shift_entries = array(); foreach ($needed_angel_type['users'] as $user_shift) { if ($its_me) @@ -110,34 +110,36 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel $member = User_Nick_render($user_shift); if ($user_shift['freeloaded']) $member = '' . $member . ''; - + $shift_entries[] = $member; } $shift_info .= join(", ", $shift_entries); } - + $myshift = array( 'date' => date("Y-m-d", $shift['start']), 'time' => date("H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']), 'room' => $shift['Name'], 'shift_info' => $shift_info, - 'comment' => $shift['Comment'] + 'comment' => $shift['Comment'] ); - + if ($shift['freeloaded']) { if (in_array("user_shifts_admin", $privileges)) $myshift['comment'] .= '

' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '

'; else $myshift['comment'] .= '

' . _("Freeloaded") . '

'; } - - $myshift['actions'] = array(); + + $myshift['actions'] = [ + button(shift_link($shift), glyph('eye-open') . _('view'), 'btn-xs') + ]; if ($its_me || in_array('user_shifts_admin', $privileges)) $myshift['actions'][] = button(page_link_to('user_myshifts') . '&edit=' . $shift['id'] . '&id=' . $user_source['UID'], glyph('edit') . _('edit'), 'btn-xs'); if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) $myshift['actions'][] = button(page_link_to('user_myshifts') . ((! $its_me) ? '&id=' . $user_source['UID'] : '') . '&cancel=' . $shift['id'], glyph('trash') . _('sign off'), 'btn-xs'); $myshift['actions'] = table_buttons($myshift['actions']); - + if ($shift['freeloaded']) $timesum += - 2 * ($shift['end'] - $shift['start']); else @@ -151,9 +153,9 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel 'room' => "", 'shift_info' => "", 'comment' => "", - 'actions' => "" + 'actions' => "" ); - + return page_with_title(' ' . htmlspecialchars($user_source['Nick']) . ' ' . $user_name . '', array( msg(), div('row', array( @@ -161,7 +163,7 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel '

', '', $user_source['DECT'], - '

' + '' )), div('col-md-3', array( '

' . _("User state") . '

', @@ -169,28 +171,28 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel $user_source['Gekommen'] ? User_shift_state_render($user_source) . '
' : '', ($user_source['Gekommen'] ? ' ' . _("Arrived") . '' : '' . _("Not arrived") . ''), ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Aktiv']) ? ' ' . _("Active") . '' : '', - ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' ' . _("T-Shirt") . '' : '' + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' ' . _("T-Shirt") . '' : '' )), div('col-md-3', array( '

' . _("Angeltypes") . '

', - User_angeltypes_render($user_angeltypes) + User_angeltypes_render($user_angeltypes) )), div('col-md-3', array( '

' . _("Rights") . '

', - User_groups_render($user_groups) - )) + User_groups_render($user_groups) + )) )), div('row space-top', array( div('col-md-12', array( buttons(array( $admin_user_privilege ? button(page_link_to('admin_user') . '&id=' . $user_source['UID'], glyph("edit") . _("edit")) : '', - ($admin_user_privilege && !$user_source['Gekommen']) ? button(page_link_to('admin_arrive') . '&arrived=' . $user_source['UID'], _("arrived")) : '', + ($admin_user_privilege && ! $user_source['Gekommen']) ? button(page_link_to('admin_arrive') . '&arrived=' . $user_source['UID'], _("arrived")) : '', $its_me ? button(page_link_to('user_settings'), glyph('list-alt') . _("Settings")) : '', $its_me ? button(page_link_to('ical') . '&key=' . $user_source['api_key'], glyph('calendar') . _("iCal Export")) : '', $its_me ? button(page_link_to('shifts_json_export') . '&key=' . $user_source['api_key'], glyph('export') . _("JSON Export")) : '', - $its_me ? button(page_link_to('user_myshifts') . '&reset', glyph('repeat') . _('Reset API key')) : '' - )) - )) + $its_me ? button(page_link_to('user_myshifts') . '&reset', glyph('repeat') . _('Reset API key')) : '' + )) + )) )), ($its_me || $admin_user_privilege) ? '

' . _("Shifts") . '

' : '', ($its_me || $admin_user_privilege) ? table(array( @@ -199,9 +201,9 @@ function User_view($user_source, $admin_user_privilege, $freeloader, $user_angel 'room' => _("Location"), 'shift_info' => _("Name & workmates"), 'comment' => _("Comment"), - 'actions' => _("Action") + 'actions' => _("Action") ), $myshifts_table) : '', - $its_me && count($shifts) == 0 ? error(sprintf(_("Go to the shifts table to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '' + $its_me && count($shifts) == 0 ? error(sprintf(_("Go to the shifts table to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '' )); } @@ -214,8 +216,8 @@ function User_password_recovery_view() { _("We will send you an e-mail with a password recovery link. Please use the email address you used for registration."), form(array( form_text('email', _("E-Mail"), ""), - form_submit('submit', _("Recover")) - )) + form_submit('submit', _("Recover")) + )) )); } @@ -229,8 +231,8 @@ function User_password_set_view() { form(array( form_password('password', _("Password")), form_password('password2', _("Confirm password")), - form_submit('submit', _("Save")) - )) + form_submit('submit', _("Save")) + )) )); } @@ -261,7 +263,7 @@ function User_groups_render($user_groups) { /** * Render a users avatar. * - * @param User $user + * @param User $user * @return string */ function User_Avatar_render($user) { @@ -271,7 +273,7 @@ function User_Avatar_render($user) { /** * Render a user nickname. * - * @param User $user_source + * @param User $user_source * @return string */ function User_Nick_render($user_source) { diff --git a/public/index.php b/public/index.php index 51bd7661..230e9141 100644 --- a/public/index.php +++ b/public/index.php @@ -29,6 +29,7 @@ require_once realpath(__DIR__ . '/../includes/view/UserAngelTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/User_view.php'); require_once realpath(__DIR__ . '/../includes/controller/angeltypes_controller.php'); +require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/shifttypes_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/users_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/user_angeltypes_controller.php'); @@ -88,6 +89,7 @@ $free_pages = array( 'users', 'ical', 'shifts_json_export', + 'shifts', 'atom' ); @@ -127,6 +129,8 @@ if (isset($_REQUEST['p']) && preg_match("/^[a-z0-9_]*$/i", $_REQUEST['p']) && (i $content = user_password_recovery_controller(); } elseif ($p == "angeltypes") { list($title, $content) = angeltypes_controller(); + } elseif ($p == "shifts") { + list($title, $content) = shifts_controller(); } elseif ($p == "users") { list($title, $content) = users_controller(); } elseif ($p == "user_angeltypes") { -- cgit v1.2.3-54-g00ecf From 6a05c3d9deb306eb7f64b275f54ec9dffec31023 Mon Sep 17 00:00:00 2001 From: Philip Häusler Date: Mon, 22 Dec 2014 17:55:20 +0100 Subject: rewrite create shifts for shifttypes --- includes/controller/rooms_controller.php | 7 ++ includes/controller/shifttypes_controller.php | 4 + includes/pages/admin_shifts.php | 152 +++++++++++++++----------- includes/view/Rooms_view.php | 10 ++ includes/view/ShiftTypes_view.php | 7 ++ public/index.php | 2 + 6 files changed, 120 insertions(+), 62 deletions(-) create mode 100644 includes/controller/rooms_controller.php create mode 100644 includes/view/Rooms_view.php (limited to 'public') diff --git a/includes/controller/rooms_controller.php b/includes/controller/rooms_controller.php new file mode 100644 index 00000000..5d55e1b7 --- /dev/null +++ b/includes/controller/rooms_controller.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/includes/controller/shifttypes_controller.php b/includes/controller/shifttypes_controller.php index f5760ad5..443ce470 100644 --- a/includes/controller/shifttypes_controller.php +++ b/includes/controller/shifttypes_controller.php @@ -1,5 +1,9 @@ getTimestamp(); $end = $start + 24 * 60 * 60; @@ -16,52 +15,75 @@ function admin_shifts() { $angelmode = 'manually'; $length = ''; $change_hours = array(); - $name = ""; - + $title = ""; + $shifttype_id = null; + // Locations laden (auch unsichtbare - fuer Erzengel ist das ok) $rooms = sql_select("SELECT * FROM `Room` ORDER BY `Name`"); $room_array = array(); foreach ($rooms as $room) $room_array[$room['RID']] = $room['Name']; - + // Engeltypen laden $types = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); $needed_angel_types = array(); foreach ($types as $type) $needed_angel_types[$type['id']] = 0; - + + // Load shift types + $shifttypes_source = ShiftTypes(); + if ($shifttypes_source === false) + engelsystem_error('Unable to load shift types.'); + $shifttypes = []; + foreach ($shifttypes_source as $shifttype) + $shifttypes[$shifttype['id']] = $shifttype['name']; + if (isset($_REQUEST['preview']) || isset($_REQUEST['back'])) { + if (isset($_REQUEST['shifttype_id'])) { + $shifttype = ShiftType($_REQUEST['shifttype_id']); + if ($shifttype === false) + engelsystem_error('Unable to load shift type.'); + if ($shifttype == null) { + $ok = false; + error(_('Please select a shift type.')); + } else + $shifttype_id = $_REQUEST['shifttype_id']; + } else { + $ok = false; + error(_('Please select a shift type.')); + } + // Name/Bezeichnung der Schicht, darf leer sein - $name = strip_request_item('name'); - + $title = strip_request_item('title'); + // Auswahl der sichtbaren Locations für die Schichten if (isset($_REQUEST['rid']) && preg_match("/^[0-9]+$/", $_REQUEST['rid']) && isset($room_array[$_REQUEST['rid']])) $rid = $_REQUEST['rid']; else { $ok = false; $rid = $rooms[0]['RID']; - $msg .= error("Wähle bitte einen Raum aus.", true); + error(_('Please select a location.')); } - + if (isset($_REQUEST['start']) && $tmp = DateTime::createFromFormat("Y-m-d H:i", trim($_REQUEST['start']))) $start = $tmp->getTimestamp(); else { $ok = false; - $msg .= error("Bitte gib einen Startzeitpunkt für die Schichten an.", true); + error(_('Please select a start time.')); } - + if (isset($_REQUEST['end']) && $tmp = DateTime::createFromFormat("Y-m-d H:i", trim($_REQUEST['end']))) $end = $tmp->getTimestamp(); else { $ok = false; - $msg .= error("Bitte gib einen Endzeitpunkt für die Schichten an.", true); + error(_('Please select an end time.')); } - + if ($start >= $end) { $ok = false; - $msg .= error("Das Ende muss nach dem Startzeitpunkt liegen!", true); + error(_('The shifts end has to be after its start.')); } - + if (isset($_REQUEST['mode'])) { if ($_REQUEST['mode'] == 'single') { $mode = 'single'; @@ -71,7 +93,7 @@ function admin_shifts() { $length = trim($_REQUEST['length']); } else { $ok = false; - $msg .= error("Bitte gib eine Schichtlänge in Minuten an.", true); + error(_('Please enter a shift duration in minutes.')); } } elseif ($_REQUEST['mode'] == 'variable') { if (isset($_REQUEST['change_hours']) && preg_match("/^([0-9]{2}(,|$))/", trim(str_replace(" ", "", $_REQUEST['change_hours'])))) { @@ -79,14 +101,14 @@ function admin_shifts() { $change_hours = array_map('trim', explode(",", $_REQUEST['change_hours'])); } else { $ok = false; - $msg .= error("Bitte gib die Schichtwechsel-Stunden kommagetrennt ein.", true); + error(_('Please split the shift-change hours by colons.')); } } } else { $ok = false; - $msg .= error("Bitte wähle einen Modus.", true); + error(_('Please select a mode.')); } - + if (isset($_REQUEST['angelmode'])) { if ($_REQUEST['angelmode'] == 'location') { $angelmode = 'location'; @@ -97,26 +119,26 @@ function admin_shifts() { $needed_angel_types[$type['id']] = trim($_REQUEST['type_' . $type['id']]); } else { $ok = false; - $msg .= error("Bitte überprüfe die Eingaben für die benötigten Engel des Typs " . $type['name'] . ".", true); + error(sprintf(_('Please check the needed angels for team %s.'), $type['name'])); } } if (array_sum($needed_angel_types) == 0) { $ok = false; - $msg .= error("Es werden 0 Engel benötigt. Bitte wähle benötigte Engel.", true); + error(_('There are 0 angels needed. Please enter the amounts of needed angels.')); } } else { $ok = false; - $msg .= error("Bitte Wähle einen Modus für die benötigten Engel.", true); + error(_('Please select a mode for needed angels.')); } } else { $ok = false; - $msg .= error("Bitte wähle benötigte Engel.", true); + error(_('Please select needed angels.')); } - + // Beim Zurück-Knopf das Formular zeigen if (isset($_REQUEST['back'])) $ok = false; - + // Alle Eingaben in Ordnung if ($ok) { if ($angelmode == 'location') { @@ -131,25 +153,27 @@ function admin_shifts() { 'start' => $start, 'end' => $end, 'RID' => $rid, - 'name' => $name + 'title' => $title, + 'shifttype_id' => $shifttype_id ); } elseif ($mode == 'multi') { $shift_start = $start; do { $shift_end = $shift_start + $length * 60; - + if ($shift_end > $end) $shift_end = $end; if ($shift_start >= $shift_end) break; - + $shifts[] = array( 'start' => $shift_start, 'end' => $shift_end, 'RID' => $rid, - 'name' => $name + 'title' => $title, + 'shifttype_id' => $shifttype_id ); - + $shift_start = $shift_end; } while ($shift_end < $end); } elseif ($mode == 'variable') { @@ -167,53 +191,56 @@ function admin_shifts() { } else break; } - + $shift_start = $start; do { $day = DateTime::createFromFormat("Y-m-d H:i", date("Y-m-d", $shift_start) . " 00:00")->getTimestamp(); $shift_end = $day + $change_hours[$change_index] * 60 * 60; - + if ($shift_end > $end) $shift_end = $end; if ($shift_start >= $shift_end) $shift_end += 24 * 60 * 60; - + $shifts[] = array( 'start' => $shift_start, 'end' => $shift_end, 'RID' => $rid, - 'name' => $name + 'name' => $title, + 'shifttype_id' => $shifttype_id ); - + $shift_start = $shift_end; $change_index = ($change_index + count($change_hours) - 1) % count($change_hours); } while ($shift_end < $end); } - + $shifts_table = array(); foreach ($shifts as $shift) { - $shifts_table_entry = array( - 'timeslot' => ' ' . date("Y-m-d H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']) . '
' . $room_array[$shift['RID']], - 'entries' => $shift['name'] - ); - foreach ($types as $type) { + $shifts_table_entry = [ + 'timeslot' => ' ' . date("Y-m-d H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']) . '
' . Room_name_render(Room($shift['RID'])), + 'title' => ShiftType_name_render(ShiftType($shifttype_id)) . ($shift['title'] ? '
' . $shift['title'] : ''), + 'needed_angels' => '' + ]; + foreach ($types as $type) if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) - $shifts_table_entry['entries'] .= '
' . $type['name'] . ': ' . $needed_angel_types[$type['id']] . ' missing'; - } + $shifts_table_entry['needed_angels'] .= '' . AngelType_name_render($type) . ': ' . $needed_angel_types[$type['id']] . '
'; + $shifts_table[] = $shifts_table_entry; } - + // Fürs Anlegen zwischenspeichern: $_SESSION['admin_shifts_shifts'] = $shifts; $_SESSION['admin_shifts_types'] = $needed_angel_types; - + $hidden_types = ""; foreach ($needed_angel_types as $type_id => $count) $hidden_types .= form_hidden('type_' . $type_id, $count); return page_with_title(_("Preview"), array( form(array( $hidden_types, - form_hidden('name', $name), + form_hidden('shifttype_id', $shifttype_id), + form_hidden('title', $title), form_hidden('rid', $rid), form_hidden('start', date("Y-m-d H:i", $start)), form_hidden('end', date("Y-m-d H:i", $end)), @@ -223,24 +250,25 @@ function admin_shifts() { form_hidden('angelmode', $angelmode), form_submit('back', _("back")), table(array( - 'timeslot' => _("Timeslot"), - 'entries' => _("Entries") + 'timeslot' => _('Time and location'), + 'title' => _('Type and title'), + 'needed_angels' => _('Needed angels') ), $shifts_table), - form_submit('submit', _("Save")) - )) + form_submit('submit', _("Save")) + )) )); } } elseif (isset($_REQUEST['submit'])) { if (! is_array($_SESSION['admin_shifts_shifts']) || ! is_array($_SESSION['admin_shifts_types'])) redirect(page_link_to('admin_shifts')); - + foreach ($_SESSION['admin_shifts_shifts'] as $shift) { $shift['URL'] = null; $shift['PSID'] = null; $shift_id = Shift_create($shift); if ($shift_id === false) engelsystem_error('Unable to create shift.'); - + engelsystem_log("Shift created: " . $shift['name'] . " from " . date("Y-m-d H:i", $shift['start']) . " to " . date("Y-m-d H:i", $shift['end'])); $needed_angel_types_info = array(); foreach ($_SESSION['admin_shifts_types'] as $type_id => $count) { @@ -251,27 +279,27 @@ function admin_shifts() { } } } - + engelsystem_log("Shift needs following angel types: " . join(", ", $needed_angel_types_info)); - $msg = success("Schichten angelegt.", true); + success("Schichten angelegt."); + redirect(page_link_to('admin_shifts')); } else { unset($_SESSION['admin_shifts_shifts']); unset($_SESSION['admin_shifts_types']); } - + if (! isset($_REQUEST['rid'])) $_REQUEST['rid'] = null; $room_select = html_select_key('rid', 'rid', $room_array, $_REQUEST['rid']); $angel_types = ""; foreach ($types as $type) $angel_types .= form_spinner('type_' . $type['id'], $type['name'], $needed_angel_types[$type['id']]); - + return page_with_title(admin_shifts_title(), array( msg(), - $msg, form(array( - form_text('name', _("Name"), $name), - // TODO: form_textarea('description', _("Description"), ''), + form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), + form_text('title', _("Title"), $title), form_select('rid', _("Room"), $room_array, $_REQUEST['rid']), '
', '
', @@ -291,8 +319,8 @@ function admin_shifts() { $angel_types, '
', '
', - form_submit('preview', _("Preview")) - )) + form_submit('preview', _("Preview")) + )) )); } ?> diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php new file mode 100644 index 00000000..bb41a4d3 --- /dev/null +++ b/includes/view/Rooms_view.php @@ -0,0 +1,10 @@ +' . glyph('map-marker') . $room['Name'] . ''; + return $room['Name']; +} + +?> \ No newline at end of file diff --git a/includes/view/ShiftTypes_view.php b/includes/view/ShiftTypes_view.php index 3f538a51..10431440 100644 --- a/includes/view/ShiftTypes_view.php +++ b/includes/view/ShiftTypes_view.php @@ -1,5 +1,12 @@ ' . $shifttype['name'] . ''; + return $shifttype['name']; +} + function ShiftType_delete_view($shifttype) { return page_with_title(sprintf(_("Delete shifttype %s"), $shifttype['name']), array( info(sprintf(_("Do you want to delete shifttype %s?"), $shifttype['name']), true), diff --git a/public/index.php b/public/index.php index 230e9141..967fe3a7 100644 --- a/public/index.php +++ b/public/index.php @@ -22,6 +22,7 @@ require_once realpath(__DIR__ . '/../includes/model/User_model.php'); require_once realpath(__DIR__ . '/../includes/view/AngelTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/Questions_view.php'); +require_once realpath(__DIR__ . '/../includes/view/Rooms_view.php'); require_once realpath(__DIR__ . '/../includes/view/Shifts_view.php'); require_once realpath(__DIR__ . '/../includes/view/ShiftEntry_view.php'); require_once realpath(__DIR__ . '/../includes/view/ShiftTypes_view.php'); @@ -29,6 +30,7 @@ require_once realpath(__DIR__ . '/../includes/view/UserAngelTypes_view.php'); require_once realpath(__DIR__ . '/../includes/view/User_view.php'); require_once realpath(__DIR__ . '/../includes/controller/angeltypes_controller.php'); +require_once realpath(__DIR__ . '/../includes/controller/rooms_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/shifts_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/shifttypes_controller.php'); require_once realpath(__DIR__ . '/../includes/controller/users_controller.php'); -- cgit v1.2.3-54-g00ecf