diff options
Diffstat (limited to 'includes')
78 files changed, 12414 insertions, 9022 deletions
diff --git a/includes/controller/angeltypes_controller.php b/includes/controller/angeltypes_controller.php index cd2aa3e4..daa754eb 100644 --- a/includes/controller/angeltypes_controller.php +++ b/includes/controller/angeltypes_controller.php @@ -2,225 +2,275 @@ /** * Text for Angeltype related links. + * + * @return string */ -function angeltypes_title() { - return _("Angeltypes"); +function angeltypes_title() +{ + return _('Angeltypes'); } /** * Route angeltype actions. + * + * @return array */ -function angeltypes_controller() { - $action = strip_request_item('action', 'list'); - - switch ($action) { - default: - case 'list': - return angeltypes_list_controller(); - case 'view': - return angeltype_controller(); - case 'edit': - return angeltype_edit_controller(); - case 'delete': - return angeltype_delete_controller(); - case 'about': - return angeltypes_about_controller(); - } +function angeltypes_controller() +{ + $action = strip_request_item('action', 'list'); + + switch ($action) { + case 'view': + return angeltype_controller(); + case 'edit': + return angeltype_edit_controller(); + case 'delete': + return angeltype_delete_controller(); + case 'about': + return angeltypes_about_controller(); + case 'list': + default: + return angeltypes_list_controller(); + } } /** * Path to angeltype view. * - * @param AngelType $angeltype_id + * @param int $angeltype_id AngelType id + * @return string */ -function angeltype_link($angeltype_id) { - return page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id; +function angeltype_link($angeltype_id) +{ + return page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype_id; } /** * Job description for all angeltypes (public to everyone) + * + * @return array */ -function angeltypes_about_controller() { - global $user; - - if (isset($user)) { - $angeltypes = AngelTypes_with_user($user); - } else { - $angeltypes = AngelTypes(); - } - - return [ - _("Teams/Job description"), - AngelTypes_about_view($angeltypes, isset($user)) - ]; +function angeltypes_about_controller() +{ + global $user; + + if (isset($user)) { + $angeltypes = AngelTypes_with_user($user); + } else { + $angeltypes = AngelTypes(); + } + + return [ + _('Teams/Job description'), + AngelTypes_about_view($angeltypes, isset($user)) + ]; } /** * Delete an Angeltype. + * + * @return array */ -function angeltype_delete_controller() { - global $privileges; - - if (! in_array('admin_angel_types', $privileges)) { - redirect(page_link_to('angeltypes')); - } - - $angeltype = load_angeltype(); - - if (isset($_REQUEST['confirmed'])) { - AngelType_delete($angeltype); - success(sprintf(_("Angeltype %s deleted."), AngelType_name_render($angeltype))); - redirect(page_link_to('angeltypes')); - } - - return [ - sprintf(_("Delete angeltype %s"), $angeltype['name']), - AngelType_delete_view($angeltype) - ]; +function angeltype_delete_controller() +{ + global $privileges; + + if (!in_array('admin_angel_types', $privileges)) { + redirect(page_link_to('angeltypes')); + } + + $angeltype = load_angeltype(); + + if (isset($_REQUEST['confirmed'])) { + AngelType_delete($angeltype); + success(sprintf(_('Angeltype %s deleted.'), AngelType_name_render($angeltype))); + redirect(page_link_to('angeltypes')); + } + + return [ + sprintf(_('Delete angeltype %s'), $angeltype['name']), + AngelType_delete_view($angeltype) + ]; } /** * Change an Angeltype. + * + * @return array */ -function angeltype_edit_controller() { - global $privileges, $user; - - // In supporter mode only allow to modify description - $supporter_mode = ! in_array('admin_angel_types', $privileges); - - if (isset($_REQUEST['angeltype_id'])) { - // Edit existing angeltype - $angeltype = load_angeltype(); - - if (! User_is_AngelType_supporter($user, $angeltype)) { - redirect(page_link_to('angeltypes')); - } - } else { - // New angeltype - if ($supporter_mode) { - // Supporters aren't allowed to create new angeltypes. - redirect(page_link_to('angeltypes')); +function angeltype_edit_controller() +{ + global $privileges, $user; + + // In supporter mode only allow to modify description + $supporter_mode = !in_array('admin_angel_types', $privileges); + + if (isset($_REQUEST['angeltype_id'])) { + // Edit existing angeltype + $angeltype = load_angeltype(); + + if (!User_is_AngelType_supporter($user, $angeltype)) { + redirect(page_link_to('angeltypes')); + } + } else { + // New angeltype + if ($supporter_mode) { + // Supporters aren't allowed to create new angeltypes. + redirect(page_link_to('angeltypes')); + } + $angeltype = AngelType_new(); } - $angeltype = AngelType_new(); - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (! $supporter_mode) { - if (isset($_REQUEST['name'])) { - $result = AngelType_validate_name($_REQUEST['name'], $angeltype); - $angeltype['name'] = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("Please check the name. Maybe it already exists.")); + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (!$supporter_mode) { + if (isset($_REQUEST['name'])) { + $result = AngelType_validate_name($_REQUEST['name'], $angeltype); + $angeltype['name'] = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('Please check the name. Maybe it already exists.')); + } + } + + $angeltype['restricted'] = isset($_REQUEST['restricted']); + $angeltype['no_self_signup'] = isset($_REQUEST['no_self_signup']); + + $angeltype['requires_driver_license'] = isset($_REQUEST['requires_driver_license']); } - } - - $angeltype['restricted'] = isset($_REQUEST['restricted']); - $angeltype['no_self_signup'] = isset($_REQUEST['no_self_signup']); - $angeltype['requires_driver_license'] = isset($_REQUEST['requires_driver_license']); - } - - $angeltype['description'] = strip_request_item_nl('description', $angeltype['description']); - - if ($valid) { - if ($angeltype['id'] != null) { - AngelType_update($angeltype); - } else { - $angeltype = AngelType_create($angeltype); - } - - success("Angel type saved."); - redirect(angeltype_link($angeltype['id'])); + $angeltype['description'] = strip_request_item_nl('description', $angeltype['description']); + + if ($valid) { + if ($angeltype['id'] != null) { + AngelType_update($angeltype); + } else { + $angeltype = AngelType_create($angeltype); + } + + success('Angel type saved.'); + redirect(angeltype_link($angeltype['id'])); + } } - } - - return [ - sprintf(_("Edit %s"), $angeltype['name']), - AngelType_edit_view($angeltype, $supporter_mode) - ]; + + return [ + sprintf(_('Edit %s'), $angeltype['name']), + AngelType_edit_view($angeltype, $supporter_mode) + ]; } /** * View details of a given angeltype. + * + * @return array */ -function angeltype_controller() { - global $privileges, $user; - - if (! in_array('angeltypes', $privileges)) { - redirect('?'); - } - - $angeltype = load_angeltype(); - $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); - $user_driver_license = UserDriverLicense($user['UID']); - $members = Users_by_angeltype($angeltype); - - return [ - sprintf(_("Team %s"), $angeltype['name']), - AngelType_view($angeltype, $members, $user_angeltype, in_array('admin_user_angeltypes', $privileges) || $user_angeltype['supporter'], in_array('admin_angel_types', $privileges), $user_angeltype['supporter'], $user_driver_license, $user) - ]; +function angeltype_controller() +{ + global $privileges, $user; + + if (!in_array('angeltypes', $privileges)) { + redirect('?'); + } + + $angeltype = load_angeltype(); + $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); + $user_driver_license = UserDriverLicense($user['UID']); + $members = Users_by_angeltype($angeltype); + + return [ + sprintf(_('Team %s'), $angeltype['name']), + AngelType_view( + $angeltype, + $members, + $user_angeltype, + in_array('admin_user_angeltypes', $privileges) || $user_angeltype['supporter'], + in_array('admin_angel_types', $privileges), + $user_angeltype['supporter'], + $user_driver_license, + $user + ) + ]; } /** * View a list of all angeltypes. + * + * @return array */ -function angeltypes_list_controller() { - global $privileges, $user; - - if (! in_array('angeltypes', $privileges)) { - redirect('?'); - } - - $angeltypes = AngelTypes_with_user($user); - - foreach ($angeltypes as &$angeltype) { - $actions = [ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("view"), "btn-xs") - ]; - - if (in_array('admin_angel_types', $privileges)) { - $actions[] = button(page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], _("edit"), "btn-xs"); - $actions[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), "btn-xs"); +function angeltypes_list_controller() +{ + global $privileges, $user; + + if (!in_array('angeltypes', $privileges)) { + redirect('?'); } - - $angeltype['membership'] = AngelType_render_membership($angeltype); - if ($angeltype['user_angeltype_id'] != null) { - $actions[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], _("leave"), "btn-xs"); - } else { - $actions[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), "btn-xs"); + + $angeltypes = AngelTypes_with_user($user); + + foreach ($angeltypes as &$angeltype) { + $actions = [ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('view'), 'btn-xs') + ]; + + if (in_array('admin_angel_types', $privileges)) { + $actions[] = button( + page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], + _('edit'), + 'btn-xs' + ); + $actions[] = button( + page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], + _('delete'), + 'btn-xs' + ); + } + + $angeltype['membership'] = AngelType_render_membership($angeltype); + if ($angeltype['user_angeltype_id'] != null) { + $actions[] = button( + page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], + _('leave'), + 'btn-xs' + ); + } else { + $actions[] = button( + page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], + _('join'), + 'btn-xs' + ); + } + + $angeltype['restricted'] = $angeltype['restricted'] ? glyph('lock') : ''; + $angeltype['no_self_signup'] = $angeltype['no_self_signup'] ? '' : glyph('share'); + + $angeltype['name'] = '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'] . '">' . $angeltype['name'] . '</a>'; + + $angeltype['actions'] = table_buttons($actions); } - - $angeltype['restricted'] = $angeltype['restricted'] ? glyph('lock') : ''; - $angeltype['no_self_signup'] = $angeltype['no_self_signup'] ? '' : glyph('share'); - - $angeltype['name'] = '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'] . '">' . $angeltype['name'] . '</a>'; - - $angeltype['actions'] = table_buttons($actions); - } - - return [ - angeltypes_title(), - AngelTypes_list_view($angeltypes, in_array('admin_angel_types', $privileges)) - ]; + + return [ + angeltypes_title(), + AngelTypes_list_view($angeltypes, in_array('admin_angel_types', $privileges)) + ]; } /** * Loads an angeltype from given angeltype_id request param. + * + * @return array */ -function load_angeltype() { - if (! isset($_REQUEST['angeltype_id'])) { - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($_REQUEST['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - return $angeltype; +function load_angeltype() +{ + if (!isset($_REQUEST['angeltype_id'])) { + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($_REQUEST['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist . ')); + redirect(page_link_to('angeltypes')); + } + + return $angeltype; } -?> diff --git a/includes/controller/event_config_controller.php b/includes/controller/event_config_controller.php index 4f07fe4c..06245c47 100644 --- a/includes/controller/event_config_controller.php +++ b/includes/controller/event_config_controller.php @@ -1,103 +1,127 @@ <?php -function event_config_title() { - return _("Event config"); +/** + * @return string + */ +function event_config_title() +{ + return _('Event config'); } -function event_config_edit_controller() { - global $privileges; - - if (! in_array('admin_event_config', $privileges)) { - redirect('?'); - } - - $event_name = null; - $event_welcome_msg = null; - $buildup_start_date = null; - $event_start_date = null; - $event_end_date = null; - $teardown_end_date = null; - - $event_config = EventConfig(); - if ($event_config != null) { - $event_name = $event_config['event_name']; - $buildup_start_date = $event_config['buildup_start_date']; - $event_start_date = $event_config['event_start_date']; - $event_end_date = $event_config['event_end_date']; - $teardown_end_date = $event_config['teardown_end_date']; - $event_welcome_msg = $event_config['event_welcome_msg']; - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['event_name'])) { - $event_name = strip_request_item('event_name'); - } - if ($event_name == '') { - $event_name = null; - } - - if (isset($_REQUEST['event_welcome_msg'])) { - $event_welcome_msg = strip_request_item_nl('event_welcome_msg'); - } - if ($event_welcome_msg == '') { - $event_welcome_msg = null; - } - - $result = check_request_date('buildup_start_date', _("Please enter buildup start date."), true); - $buildup_start_date = $result->getValue(); - $valid &= $result->isValid(); - - $result = check_request_date('event_start_date', _("Please enter event start date."), true); - $event_start_date = $result->getValue(); - $valid &= $result->isValid(); - - $result = check_request_date('event_end_date', _("Please enter event end date."), true); - $event_end_date = $result->getValue(); - $valid &= $result->isValid(); - - $result = check_request_date('teardown_end_date', _("Please enter teardown end date."), true); - $teardown_end_date = $result->getValue(); - $valid &= $result->isValid(); - - if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) { - $valid = false; - error(_("The buildup start date has to be before the event start date.")); - } - - if ($event_start_date != null && $event_end_date != null && $event_start_date > $event_end_date) { - $valid = false; - error(_("The event start date has to be before the event end date.")); - } - - if ($event_end_date != null && $teardown_end_date != null && $event_end_date > $teardown_end_date) { - $valid = false; - error(_("The event end date has to be before the teardown end date.")); +/** + * @return array + */ +function event_config_edit_controller() +{ + global $privileges; + + if (!in_array('admin_event_config', $privileges)) { + redirect('?'); } - - if ($buildup_start_date != null && $teardown_end_date != null && $buildup_start_date > $teardown_end_date) { - $valid = false; - error(_("The buildup start date has to be before the teardown end date.")); + + $event_name = null; + $event_welcome_msg = null; + $buildup_start_date = null; + $event_start_date = null; + $event_end_date = null; + $teardown_end_date = null; + + $event_config = EventConfig(); + if ($event_config != null) { + $event_name = $event_config['event_name']; + $buildup_start_date = $event_config['buildup_start_date']; + $event_start_date = $event_config['event_start_date']; + $event_end_date = $event_config['event_end_date']; + $teardown_end_date = $event_config['teardown_end_date']; + $event_welcome_msg = $event_config['event_welcome_msg']; } - - if ($valid) { - $result = EventConfig_update($event_name, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date, $event_welcome_msg); - - if ($result === false) { - engelsystem_error("Unable to update event config."); - } - - engelsystem_log("Changed event config: $event_name, $event_welcome_msg, " . date("Y-m-d", $buildup_start_date) . ", " . date("Y-m-d", $event_start_date) . ", " . date("Y-m-d", $event_end_date) . ", " . date("Y-m-d", $teardown_end_date)); - success(_("Settings saved.")); - redirect(page_link_to('admin_event_config')); + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['event_name'])) { + $event_name = strip_request_item('event_name'); + } + if ($event_name == '') { + $event_name = null; + } + + if (isset($_REQUEST['event_welcome_msg'])) { + $event_welcome_msg = strip_request_item_nl('event_welcome_msg'); + } + if ($event_welcome_msg == '') { + $event_welcome_msg = null; + } + + $result = check_request_date('buildup_start_date', _('Please enter buildup start date.'), true); + $buildup_start_date = $result->getValue(); + $valid &= $result->isValid(); + + $result = check_request_date('event_start_date', _('Please enter event start date.'), true); + $event_start_date = $result->getValue(); + $valid &= $result->isValid(); + + $result = check_request_date('event_end_date', _('Please enter event end date.'), true); + $event_end_date = $result->getValue(); + $valid &= $result->isValid(); + + $result = check_request_date('teardown_end_date', _('Please enter teardown end date.'), true); + $teardown_end_date = $result->getValue(); + $valid &= $result->isValid(); + + if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) { + $valid = false; + error(_('The buildup start date has to be before the event start date.')); + } + + if ($event_start_date != null && $event_end_date != null && $event_start_date > $event_end_date) { + $valid = false; + error(_('The event start date has to be before the event end date.')); + } + + if ($event_end_date != null && $teardown_end_date != null && $event_end_date > $teardown_end_date) { + $valid = false; + error(_('The event end date has to be before the teardown end date.')); + } + + if ($buildup_start_date != null && $teardown_end_date != null && $buildup_start_date > $teardown_end_date) { + $valid = false; + error(_('The buildup start date has to be before the teardown end date.')); + } + + if ($valid) { + $result = EventConfig_update( + $event_name, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date, + $event_welcome_msg + ); + + if ($result === false) { + engelsystem_error('Unable to update event config.'); + } + + engelsystem_log( + 'Changed event config: $event_name, $event_welcome_msg, ' + . date('Y-m-d', $buildup_start_date) . ', ' . date('Y-m-d', $event_start_date) . ', ' + . date('Y-m-d', $event_end_date) . ', ' . date('Y-m-d', $teardown_end_date) + ); + success(_('Settings saved.')); + redirect(page_link_to('admin_event_config')); + } } - } - - return [ - event_config_title(), - EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date) - ]; -} -?>
\ No newline at end of file + return [ + event_config_title(), + EventConfig_edit_view( + $event_name, + $event_welcome_msg, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date + ) + ]; +} diff --git a/includes/controller/rooms_controller.php b/includes/controller/rooms_controller.php index bba38bb5..3f5ff387 100644 --- a/includes/controller/rooms_controller.php +++ b/includes/controller/rooms_controller.php @@ -1,7 +1,6 @@ <?php -use Engelsystem\ShiftsFilterRenderer; use Engelsystem\ShiftsFilter; -use Engelsystem\ShiftCalendarRenderer; +use Engelsystem\ShiftsFilterRenderer; /** * Room controllers for managing everything room related. @@ -9,93 +8,109 @@ use Engelsystem\ShiftCalendarRenderer; /** * View a room with its shifts. + * + * @return array */ -function room_controller() { - global $privileges; - - if (! in_array('view_rooms', $privileges)) { - redirect(page_link_to()); - } - - - $room = load_room(); - - if($room['show'] != 'Y' && !in_array('admin_rooms', $privileges)) { - redirect(page_link_to()); - } - - $all_shifts = Shifts_by_room($room); - $days = []; - foreach ($all_shifts as $shift) { - $day = date("Y-m-d", $shift['start']); - if (! in_array($day, $days)) { - $days[] = $day; +function room_controller() +{ + global $privileges; + + if (!in_array('view_rooms', $privileges)) { + redirect(page_link_to()); + } + + $room = load_room(); + $all_shifts = Shifts_by_room($room); + $days = []; + foreach ($all_shifts as $shift) { + $day = date('Y-m-d', $shift['start']); + if (!in_array($day, $days)) { + $days[] = $day; + } + } + + $shiftsFilter = new ShiftsFilter( + true, + [$room['RID']], + AngelType_ids() + ); + $selected_day = date('Y-m-d'); + if (!empty($days)) { + $selected_day = $days[0]; + } + if (isset($_REQUEST['shifts_filter_day'])) { + $selected_day = $_REQUEST['shifts_filter_day']; } - } - - $shiftsFilter = new ShiftsFilter(true, [ - $room['RID'] - ], AngelType_ids()); - $selected_day = date("Y-m-d"); - if (! empty($days)) { - $selected_day = $days[0]; - } - if (isset($_REQUEST['shifts_filter_day'])) { - $selected_day = $_REQUEST['shifts_filter_day']; - } - $shiftsFilter->setStartTime(parse_date("Y-m-d H:i", $selected_day . ' 00:00')); - $shiftsFilter->setEndTime(parse_date("Y-m-d H:i", $selected_day . ' 23:59')); - - $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter); - $shiftsFilterRenderer->enableDaySelection($days); - - $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); - - return [ - $room['Name'], - Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer) - ]; + $shiftsFilter->setStartTime(parse_date('Y-m-d H:i', $selected_day . ' 00:00')); + $shiftsFilter->setEndTime(parse_date('Y-m-d H:i', $selected_day . ' 23:59')); + + $shiftsFilterRenderer = new ShiftsFilterRenderer($shiftsFilter); + $shiftsFilterRenderer->enableDaySelection($days); + + $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); + + return [ + $room['Name'], + Room_view($room, $shiftsFilterRenderer, $shiftCalendarRenderer) + ]; } /** * Dispatch different room actions. + * + * @return array */ -function rooms_controller() { - if (! isset($_REQUEST['action'])) { - $_REQUEST['action'] = 'list'; - } - - switch ($_REQUEST['action']) { - default: - case 'list': - redirect(page_link_to('admin_rooms')); - case 'view': - return room_controller(); - } +function rooms_controller() +{ + if (!isset($_REQUEST['action'])) { + $_REQUEST['action'] = 'list'; + } + + switch ($_REQUEST['action']) { + case 'view': + return room_controller(); + case 'list': + default: + redirect(page_link_to('admin_rooms')); + break; + } + + exit; } -function room_link($room) { - return page_link_to('rooms') . '&action=view&room_id=' . $room['RID']; +/** + * @param array $room + * @return string + */ +function room_link($room) +{ + return page_link_to('rooms') . '&action=view&room_id=' . $room['RID']; } -function room_edit_link($room) { - return page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID']; +/** + * @param array $room + * @return string + */ +function room_edit_link($room) +{ + return page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID']; } /** * Loads room by request param room_id + * + * @return array */ -function load_room() { - if (! test_request_int('room_id')) { - redirect(page_link_to()); - } - - $room = Room($_REQUEST['room_id']); - if ($room == null) { - redirect(page_link_to()); - } - - return $room; -} +function load_room() +{ + if (!test_request_int('room_id')) { + redirect(page_link_to()); + } -?>
\ No newline at end of file + $room = Room($_REQUEST['room_id']); + if ($room == null) { + redirect(page_link_to()); + } + + return $room; +} diff --git a/includes/controller/shift_entries_controller.php b/includes/controller/shift_entries_controller.php index d0a12288..cb2d9bee 100644 --- a/includes/controller/shift_entries_controller.php +++ b/includes/controller/shift_entries_controller.php @@ -1,187 +1,291 @@ <?php +use Engelsystem\Database\DB; + /** * Sign up for a shift. + * + * @return string */ -function shift_entry_add_controller() { - global $privileges, $user; - - if (isset($_REQUEST['shift_id']) && preg_match("/^[0-9]*$/", $_REQUEST['shift_id'])) { - $shift_id = $_REQUEST['shift_id']; - } else { - redirect(page_link_to('user_shifts')); - } - - // Locations laden - $rooms = sql_select("SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name`"); - $room_array = []; - foreach ($rooms as $room) { - $room_array[$room['RID']] = $room['Name']; - } - - $shift = Shift($shift_id); - $shift['Name'] = $room_array[$shift['RID']]; - if ($shift == null) { - redirect(page_link_to('user_shifts')); - } - - if (isset($_REQUEST['type_id']) && preg_match("/^[0-9]*$/", $_REQUEST['type_id'])) { - $type_id = $_REQUEST['type_id']; - } else { - redirect(page_link_to('user_shifts')); - } - - if (in_array('user_shifts_admin', $privileges) || in_array('shiftentry_edit_angeltype_supporter', $privileges)) { - $type = AngelType($type_id); - } 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))"); - $type = $type[0]; - } - - if ($type == null) { - redirect(page_link_to('user_shifts')); - } - - if (isset($_REQUEST['user_id']) && preg_match("/^[0-9]*$/", $_REQUEST['user_id']) && (in_array('user_shifts_admin', $privileges) || in_array('shiftentry_edit_angeltype_supporter', $privileges))) { - $user_id = $_REQUEST['user_id']; - } else { - $user_id = $user['UID']; - } - - $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $type); - $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $type['id']); - - $shift_signup_allowed = Shift_signup_allowed(User($user_id), $shift, $type, null, null, $needed_angeltype, $shift_entries); - if (! $shift_signup_allowed->isSignupAllowed()) { - error(_("You are not allowed to sign up for this shift. Maybe shift is full or already running.")); - redirect(shift_link($shift)); - } - - if (isset($_REQUEST['submit'])) { - $selected_type_id = $type_id; - if (in_array('user_shifts_admin', $privileges) || in_array('shiftentry_edit_angeltype_supporter', $privileges)) { - - if (sql_num_query("SELECT * FROM `User` WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1") == 0) { +function shift_entry_add_controller() +{ + global $privileges, $user; + + $shift_id = 0; + if (isset($_REQUEST['shift_id']) && preg_match('/^\d*$/', $_REQUEST['shift_id'])) { + $shift_id = $_REQUEST['shift_id']; + } else { 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']; - } } - - 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); + + // Locations laden + $rooms = Rooms(); + $room_array = []; + foreach ($rooms as $room) { + $room_array[$room['RID']] = $room['Name']; } - - $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'); + + $shift = Shift($shift_id); + $shift['Name'] = $room_array[$shift['RID']]; + if ($shift == null) { + redirect(page_link_to('user_shifts')); } - - $comment = strip_request_item_nl('comment'); - $result = ShiftEntry_create([ - 'SID' => $shift_id, - 'TID' => $selected_type_id, - 'UID' => $user_id, - 'Comment' => $comment, - 'freeloaded' => $freeloaded, - 'freeload_comment' => $freeload_comment - ]); - if ($result === false) { - engelsystem_error('Unable to create shift entry.'); + + $type_id = 0; + if (isset($_REQUEST['type_id']) && preg_match('/^\d*$/', $_REQUEST['type_id'])) { + $type_id = $_REQUEST['type_id']; + } else { + redirect(page_link_to('user_shifts')); } - - 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) . "')"); + + if (in_array('user_shifts_admin', $privileges) || in_array('shiftentry_edit_angeltype_supporter', $privileges)) { + $type = AngelType($type_id); + } else { + // TODO: Move queries to model + $type = DB::select(' + SELECT * + FROM `UserAngelTypes` + JOIN `AngelTypes` ON (`UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id`) + WHERE `AngelTypes`.`id` = ? + AND ( + `AngelTypes`.`restricted` = 0 + OR ( + `UserAngelTypes`.`user_id` = ? + AND NOT `UserAngelTypes`.`confirm_user_id` IS NULL + ) + ) + ', [$type_id, $user['UID']]); + $type = array_shift($type); } - - $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!") . ' <a href="' . page_link_to('user_myshifts') . '">' . _("My shifts") . ' »</a>'); - 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 = []; - foreach ($users as $usr) { - $users_select[$usr['UID']] = $usr['Nick'] . ($usr['freeloaded'] == 0 ? "" : " (" . _("Freeloader") . ")"); + + if (empty($type)) { + redirect(page_link_to('user_shifts')); } - $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); - - $angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); - $angeltypes = []; - foreach ($angeltypes_source as $angeltype) { - $angeltypes[$angeltype['id']] = $angeltype['name']; + + if ( + isset($_REQUEST['user_id']) + && preg_match('/^\d*$/', $_REQUEST['user_id']) + && ( + in_array('user_shifts_admin', $privileges) + || in_array('shiftentry_edit_angeltype_supporter', $privileges) + ) + ) { + $user_id = $_REQUEST['user_id']; + } else { + $user_id = $user['UID']; } - $angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); - } elseif (in_array('shiftentry_edit_angeltype_supporter', $privileges)) { - $users = Users_by_angeltype($type); - $users_select = []; - foreach ($users as $usr) { - if (! $type['restricted'] || $usr['confirm_user_id'] != null) { - $users_select[$usr['UID']] = $usr['Nick']; - } + + $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $type); + $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $type['id']); + + $shift_signup_allowed = Shift_signup_allowed( + User($user_id), + $shift, + $type, + null, + null, + $needed_angeltype, + $shift_entries + ); + if (!$shift_signup_allowed->isSignupAllowed()) { + error(_('You are not allowed to sign up for this shift. Maybe shift is full or already running.')); + redirect(shift_link($shift)); + } + + if (isset($_REQUEST['submit'])) { + $selected_type_id = $type_id; + if (in_array('user_shifts_admin', $privileges) || in_array('shiftentry_edit_angeltype_supporter', + $privileges) + ) { + + if (count(DB::select('SELECT `UID` FROM `User` WHERE `UID`=? LIMIT 1', [$user_id])) == 0) { + redirect(page_link_to('user_shifts')); + } + + if ( + isset($_REQUEST['angeltype_id']) + && test_request_int('angeltype_id') + && count(DB::select( + 'SELECT `id` FROM `AngelTypes` WHERE `id`=? LIMIT 1', + [$_REQUEST['angeltype_id']] + )) > 0 + ) { + $selected_type_id = $_REQUEST['angeltype_id']; + } + } + + if (count(DB::select( + 'SELECT `id` FROM `ShiftEntry` WHERE `SID`= ? AND `UID` = ?', + [$shift['SID'], $user_id])) + ) { + return error('This angel does already have an entry for this shift.', true); + } + + $freeloaded = isset($shift['freeloaded']) ? $shift['freeloaded'] : false; + $freeload_comment = isset($shift['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([ + 'SID' => $shift_id, + 'TID' => $selected_type_id, + 'UID' => $user_id, + 'Comment' => $comment, + 'freeloaded' => $freeloaded, + 'freeload_comment' => $freeload_comment + ]); + if ($result === false) { + engelsystem_error('Unable to create shift entry.'); + } + + if ( + $type['restricted'] == 0 + && count(DB::select(' + SELECT `UserAngelTypes`.`id` FROM `UserAngelTypes` + INNER JOIN `AngelTypes` ON `AngelTypes`.`id` = `UserAngelTypes`.`angeltype_id` + WHERE `angeltype_id` = ? + AND `user_id` = ? + ', [$selected_type_id, $user_id])) == 0 + ) { + DB::insert( + 'INSERT INTO `UserAngelTypes` (`user_id`, `angeltype_id`) VALUES (?, ?)', + [$user_id, $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!') . ' <a href="' . page_link_to('user_myshifts') . '">' . _('My shifts') . ' »</a>'); + redirect(shift_link($shift)); } - $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); - - $angeltypes_source = User_angeltypes($user); - $angeltypes = []; - foreach ($angeltypes_source as $angeltype) { - if ($angeltype['supporter']) { - $angeltypes[$angeltype['id']] = $angeltype['name']; - } - $angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); + + $angeltype_select = ''; + if (in_array('user_shifts_admin', $privileges)) { + $users = DB::select(' + SELECT *, + ( + SELECT count(*) + FROM `ShiftEntry` + WHERE `freeloaded`=1 + AND `ShiftEntry`.`UID`=`User`.`UID` + ) AS `freeloaded` + FROM `User` + ORDER BY `Nick` + '); + $users_select = []; + 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 = DB::select('SELECT `id`, `name` FROM `AngelTypes` ORDER BY `name`'); + $angeltypes = []; + foreach ($angeltypes_source as $angeltype) { + $angeltypes[$angeltype['id']] = $angeltype['name']; + } + $angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); + } elseif (in_array('shiftentry_edit_angeltype_supporter', $privileges)) { + $users = Users_by_angeltype($type); + $users_select = []; + foreach ($users as $usr) { + if (!$type['restricted'] || $usr['confirm_user_id'] != null) { + $users_select[$usr['UID']] = $usr['Nick']; + } + } + $user_text = html_select_key('user_id', 'user_id', $users_select, $user['UID']); + + $angeltypes_source = User_angeltypes($user); + $angeltypes = []; + foreach ($angeltypes_source as $angeltype) { + if ($angeltype['supporter']) { + $angeltypes[$angeltype['id']] = $angeltype['name']; + } + $angeltype_select = html_select_key('angeltype_id', 'angeltype_id', $angeltypes, $type['id']); + } + } else { + $user_text = User_Nick_render($user); + $angeltype_select = $type['name']; } - } else { - $user_text = User_Nick_render($user); - $angeltype_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'], $angeltype_select, "", false, null, in_array('user_shifts_admin', $privileges)); + + 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'], + $angeltype_select, '', + false, + null, + in_array('user_shifts_admin', $privileges) + ); } /** * Remove somebody from a shift. */ -function shift_entry_delete_controller() { - global $privileges, $user; - - if (! isset($_REQUEST['entry_id']) || ! test_request_int('entry_id')) { - redirect(page_link_to('user_shifts')); - } - $entry_id = $_REQUEST['entry_id']; - - $shift_entry_source = sql_select(" - SELECT `User`.`Nick`, `ShiftEntry`.`Comment`, `ShiftEntry`.`UID`, `ShiftTypes`.`name`, `Shifts`.*, `Room`.`Name`, `AngelTypes`.`name` as `angel_type`, `AngelTypes`.`id` as `angeltype_id` +function shift_entry_delete_controller() +{ + global $privileges, $user; + + if (!isset($_REQUEST['entry_id']) || !test_request_int('entry_id')) { + redirect(page_link_to('user_shifts')); + } + $entry_id = $_REQUEST['entry_id']; + + $shift_entry_source = DB::select(' + SELECT + `User`.`Nick`, + `ShiftEntry`.`Comment`, + `ShiftEntry`.`UID`, + `ShiftTypes`.`name`, + `Shifts`.*, + `Room`.`Name`, + `AngelTypes`.`name` AS `angel_type`, + `AngelTypes`.`id` AS `angeltype_id` FROM `ShiftEntry` JOIN `User` ON (`User`.`UID`=`ShiftEntry`.`UID`) JOIN `AngelTypes` ON (`ShiftEntry`.`TID` = `AngelTypes`.`id`) JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) - WHERE `ShiftEntry`.`id`='" . sql_escape($entry_id) . "'"); - if (count($shift_entry_source) > 0) { - $shift_entry_source = $shift_entry_source[0]; - - if (!in_array('user_shifts_admin', $privileges) && (!in_array('shiftentry_edit_angeltype_supporter', $privileges) || !User_is_AngelType_supporter($user, AngelType($shift_entry_source['angeltype_id'])))) { - redirect(page_link_to('user_shifts')); - } - - $result = ShiftEntry_delete($entry_id); - if ($result === false) { - engelsystem_error('Unable to delete shift entry.'); + WHERE `ShiftEntry`.`id`=?', + [$entry_id] + ); + if (count($shift_entry_source) > 0) { + $shift_entry_source = array_shift($shift_entry_source); + + if (!in_array('user_shifts_admin', $privileges) && (!in_array('shiftentry_edit_angeltype_supporter', + $privileges) || !User_is_AngelType_supporter($user, AngelType($shift_entry_source['angeltype_id']))) + ) { + redirect(page_link_to('user_shifts')); + } + + $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 { + error(_('Entry not found.')); } - - 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 { - error(_("Entry not found.")); - } - redirect(shift_link($shift_entry_source)); -} -?>
\ No newline at end of file + redirect(shift_link($shift_entry_source)); +} diff --git a/includes/controller/shifts_controller.php b/includes/controller/shifts_controller.php index 9ac8a766..c8b6932a 100644 --- a/includes/controller/shifts_controller.php +++ b/includes/controller/shifts_controller.php @@ -1,324 +1,393 @@ <?php use Engelsystem\ShiftSignupState; -function shift_link($shift) { - return page_link_to('shifts') . '&action=view&shift_id=' . $shift['SID']; +/** + * @param array $shift + * @return string + */ +function shift_link($shift) +{ + $link = page_link_to('shifts') . '&action=view'; + if (isset($shift['SID'])) { + $link .= '&shift_id=' . $shift['SID']; + } + return $link; } -function shift_delete_link($shift) { - return page_link_to('user_shifts') . '&delete_shift=' . $shift['SID']; +/** + * @param array $shift + * @return string + */ +function shift_delete_link($shift) +{ + return page_link_to('user_shifts') . '&delete_shift=' . $shift['SID']; } -function shift_edit_link($shift) { - return page_link_to('user_shifts') . '&edit_shift=' . $shift['SID']; +/** + * @param array $shift + * @return string + */ +function shift_edit_link($shift) +{ + return page_link_to('user_shifts') . '&edit_shift=' . $shift['SID']; } /** * Edit a single shift. + * + * @return string */ -function shift_edit_controller() { - global $privileges; - - // Schicht bearbeiten - $msg = ""; - $valid = true; - - if (! in_array('admin_shifts', $privileges)) { - redirect(page_link_to('user_shifts')); - } - - if (! isset($_REQUEST['edit_shift']) || ! test_request_int('edit_shift')) { - redirect(page_link_to('user_shifts')); - } - $shift_id = $_REQUEST['edit_shift']; - - $shift = Shift($shift_id); - - $room = select_array(Rooms(), 'RID', 'Name'); - $angeltypes = select_array(AngelTypes(), 'id', 'name'); - $shifttypes = select_array(ShiftTypes(), 'id', 'name'); - - $needed_angel_types = select_array(NeededAngelTypes_by_shift($shift_id), 'id', 'count'); - foreach (array_keys($angeltypes) as $angeltype_id) { - if (! isset($needed_angel_types[$angeltype_id])) { - $needed_angel_types[$angeltype_id] = 0; +function shift_edit_controller() +{ + global $privileges; + + // Schicht bearbeiten + $msg = ''; + $valid = true; + + if (!in_array('admin_shifts', $privileges)) { + redirect(page_link_to('user_shifts')); } - } - - $shifttype_id = $shift['shifttype_id']; - $title = $shift['title']; - $rid = $shift['RID']; - $start = $shift['start']; - $end = $shift['end']; - - if (isset($_REQUEST['submit'])) { - // Name/Bezeichnung der Schicht, darf leer sein - $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[$_REQUEST['rid']])) { - $rid = $_REQUEST['rid']; - } else { - $valid = false; - $msg .= error(_("Please select a room."), true); + + if (!isset($_REQUEST['edit_shift']) || !test_request_int('edit_shift')) { + redirect(page_link_to('user_shifts')); } - - if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { - $shifttype_id = $_REQUEST['shifttype_id']; - } else { - $valid = false; - $msg .= error(_('Please select a shifttype.'), true); + $shift_id = $_REQUEST['edit_shift']; + + $shift = Shift($shift_id); + + $room = select_array(Rooms(), 'RID', 'Name'); + $angeltypes = select_array(AngelTypes(), 'id', 'name'); + $shifttypes = select_array(ShiftTypes(), 'id', 'name'); + + $needed_angel_types = select_array(NeededAngelTypes_by_shift($shift_id), 'id', 'count'); + foreach (array_keys($angeltypes) as $angeltype_id) { + if (!isset($needed_angel_types[$angeltype_id])) { + $needed_angel_types[$angeltype_id] = 0; + } } - - if (isset($_REQUEST['start']) && $tmp = parse_date("Y-m-d H:i", $_REQUEST['start'])) { - $start = $tmp; - } else { - $valid = false; - $msg .= error(_("Please enter a valid starting time for the shifts."), true); + + $shifttype_id = $shift['shifttype_id']; + $title = $shift['title']; + $rid = $shift['RID']; + $start = $shift['start']; + $end = $shift['end']; + + if (isset($_REQUEST['submit'])) { + // Name/Bezeichnung der Schicht, darf leer sein + $title = strip_request_item('title'); + + // Auswahl der sichtbaren Locations für die Schichten + if (isset($_REQUEST['rid']) && preg_match('/^\d+$/', $_REQUEST['rid']) && isset($room[$_REQUEST['rid']])) { + $rid = $_REQUEST['rid']; + } else { + $valid = false; + $msg .= error(_('Please select a room.'), true); + } + + if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { + $shifttype_id = $_REQUEST['shifttype_id']; + } else { + $valid = false; + $msg .= error(_('Please select a shifttype.'), true); + } + + if (isset($_REQUEST['start']) && $tmp = parse_date('Y-m-d H:i', $_REQUEST['start'])) { + $start = $tmp; + } else { + $valid = false; + $msg .= error(_('Please enter a valid starting time for the shifts.'), true); + } + + if (isset($_REQUEST['end']) && $tmp = parse_date('Y-m-d H:i', $_REQUEST['end'])) { + $end = $tmp; + } else { + $valid = false; + $msg .= error(_('Please enter a valid ending time for the shifts.'), true); + } + + if ($start >= $end) { + $valid = false; + $msg .= error(_('The ending time has to be after the starting time.'), true); + } + + foreach ($needed_angel_types as $needed_angeltype_id => $needed_angeltype_name) { + if (isset($_REQUEST['type_' . $needed_angeltype_id]) && test_request_int('type_' . $needed_angeltype_id)) { + $needed_angel_types[$needed_angeltype_id] = trim($_REQUEST['type_' . $needed_angeltype_id]); + } else { + $valid = false; + $msg .= error(sprintf( + _('Please check your input for needed angels of type %s.'), + $needed_angeltype_name + ), true); + } + } + + if ($valid) { + $shift['shifttype_id'] = $shifttype_id; + $shift['title'] = $title; + $shift['RID'] = $rid; + $shift['start'] = $start; + $shift['end'] = $end; + + $result = Shift_update($shift); + if ($result === false) { + engelsystem_error('Unable to update shift.'); + } + NeededAngelTypes_delete_by_shift($shift_id); + $needed_angel_types_info = []; + foreach ($needed_angel_types as $type_id => $count) { + NeededAngelType_add($shift_id, $type_id, null, $count); + $needed_angel_types_info[] = $angeltypes[$type_id] . ': ' . $count; + } + + engelsystem_log( + 'Updated shift \'' . $shifttypes[$shifttype_id] . ', ' . $title + . '\' 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(shift_link([ + 'SID' => $shift_id + ])); + } } - - if (isset($_REQUEST['end']) && $tmp = parse_date("Y-m-d H:i", $_REQUEST['end'])) { - $end = $tmp; - } else { - $valid = false; - $msg .= error(_("Please enter a valid ending time for the shifts."), true); + + $angel_types_spinner = ''; + foreach ($angeltypes as $angeltype_id => $angeltype_name) { + $angel_types_spinner .= form_spinner('type_' . $angeltype_id, $angeltype_name, + $needed_angel_types[$angeltype_id]); } - - if ($start >= $end) { - $valid = false; - $msg .= error(_("The ending time has to be after the starting time."), true); + + return page_with_title( + shifts_title(), + [ + msg(), + '<noscript>' . info(_('This page is much more comfortable with javascript.'), true) . '</noscript>', + form([ + form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), + form_text('title', _('Title'), $title), + form_select('rid', _('Room:'), $room, $rid), + form_text('start', _('Start:'), date('Y-m-d H:i', $start)), + form_text('end', _('End:'), date('Y-m-d H:i', $end)), + '<h2>' . _('Needed angels') . '</h2>', + $angel_types_spinner, + form_submit('submit', _('Save')) + ]) + ] + ); +} + +/** + * @return string + */ +function shift_delete_controller() +{ + global $privileges; + + if (!in_array('user_shifts_admin', $privileges)) { + redirect(page_link_to('user_shifts')); } - - foreach ($needed_angel_types as $needed_angeltype_id => $needed_angeltype_name) { - if (isset($_REQUEST['type_' . $needed_angeltype_id]) && test_request_int('type_' . $needed_angeltype_id)) { - $needed_angel_types[$needed_angeltype_id] = trim($_REQUEST['type_' . $needed_angeltype_id]); - } else { - $valid = false; - $msg .= error(sprintf(_("Please check your input for needed angels of type %s."), $needed_angeltype_name), true); - } + + // Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg) + if (!isset($_REQUEST['delete_shift']) || !preg_match('/^\d*$/', $_REQUEST['delete_shift'])) { + redirect(page_link_to('user_shifts')); } - - if ($valid) { - $shift['shifttype_id'] = $shifttype_id; - $shift['title'] = $title; - $shift['RID'] = $rid; - $shift['start'] = $start; - $shift['end'] = $end; - - $result = Shift_update($shift); - if ($result === false) { - engelsystem_error('Unable to update shift.'); - } - NeededAngelTypes_delete_by_shift($shift_id); - $needed_angel_types_info = []; - foreach ($needed_angel_types as $type_id => $count) { - NeededAngelType_add($shift_id, $type_id, null, $count); - $needed_angel_types_info[] = $angeltypes[$type_id] . ": " . $count; - } - - engelsystem_log("Updated shift '" . $shifttypes[$shifttype_id] . ", " . $title . "' 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(shift_link([ - 'SID' => $shift_id - ])); + $shift_id = $_REQUEST['delete_shift']; + + $shift = Shift($shift_id); + if ($shift == null) { + redirect(page_link_to('user_shifts')); } - } - - $angel_types_spinner = ""; - foreach ($angeltypes as $angeltype_id => $angeltype_name) { - $angel_types_spinner .= form_spinner('type_' . $angeltype_id, $angeltype_name, $needed_angel_types[$angeltype_id]); - } - - return page_with_title(shifts_title(), [ - msg(), - '<noscript>' . info(_("This page is much more comfortable with javascript."), true) . '</noscript>', - form([ - form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), - form_text('title', _("Title"), $title), - form_select('rid', _("Room:"), $room, $rid), - form_text('start', _("Start:"), date("Y-m-d H:i", $start)), - form_text('end', _("End:"), date("Y-m-d H:i", $end)), - '<h2>' . _("Needed angels") . '</h2>', - $angel_types_spinner, - form_submit('submit', _("Save")) - ]) - ]); -} -function shift_delete_controller() { - global $privileges; - - if (! in_array('user_shifts_admin', $privileges)) { - redirect(page_link_to('user_shifts')); - } - - // Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg) - if (! isset($_REQUEST['delete_shift']) || ! preg_match("/^[0-9]*$/", $_REQUEST['delete_shift'])) { - redirect(page_link_to('user_shifts')); - } - $shift_id = $_REQUEST['delete_shift']; - - $shift = Shift($shift_id); - if ($shift == null) { - redirect(page_link_to('user_shifts')); - } - - // Schicht löschen bestätigt - if (isset($_REQUEST['delete'])) { - Shift_delete($shift_id); - - 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(), [ - 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), - '<a class="button" href="?p=user_shifts&delete_shift=' . $shift_id . '&delete">' . _("delete") . '</a>' - ]); + // Schicht löschen bestätigt + if (isset($_REQUEST['delete'])) { + Shift_delete($shift_id); + + 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(), [ + 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), + '<a class="button" href="?p=user_shifts&delete_shift=' . $shift_id . '&delete">' . _('delete') . '</a>' + ]); } -function shift_controller() { - global $user, $privileges; - - if (! in_array('user_shifts', $privileges)) { - redirect(page_link_to('?')); - } - - if (! isset($_REQUEST['shift_id'])) { - redirect(page_link_to('user_shifts')); - } - - $shift = Shift($_REQUEST['shift_id']); - if ($shift == null) { - error(_("Shift could not be found.")); - redirect(page_link_to('user_shifts')); - } - - $shifttype = ShiftType($shift['shifttype_id']); - $room = Room($shift['RID']); - $angeltypes = AngelTypes(); - $user_shifts = Shifts_by_user($user); - - $shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0); - foreach ($angeltypes as &$angeltype) { - $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype); - $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']); - - $angeltype_signup_state = Shift_signup_allowed($user, $shift, $angeltype, null, $user_shifts, $needed_angeltype, $shift_entries); - if ($shift_signup_state == null) { - $shift_signup_state = $angeltype_signup_state; - } else { - $shift_signup_state->combineWith($angeltype_signup_state); +/** + * @return array + */ +function shift_controller() +{ + global $user, $privileges; + + if (!in_array('user_shifts', $privileges)) { + redirect(page_link_to('?')); + } + + if (!isset($_REQUEST['shift_id'])) { + redirect(page_link_to('user_shifts')); + } + + $shift = Shift($_REQUEST['shift_id']); + if ($shift == null) { + error(_('Shift could not be found.')); + redirect(page_link_to('user_shifts')); } - $angeltype['shift_signup_state'] = $angeltype_signup_state; - } - - return [ - $shift['name'], - Shift_view($shift, $shifttype, $room, $angeltypes, $shift_signup_state) - ]; + + $shifttype = ShiftType($shift['shifttype_id']); + $room = Room($shift['RID']); + $angeltypes = AngelTypes(); + $user_shifts = Shifts_by_user($user); + + $shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0); + foreach ($angeltypes as &$angeltype) { + $needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype); + $shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']); + + $angeltype_signup_state = Shift_signup_allowed( + $user, + $shift, + $angeltype, + null, + $user_shifts, + $needed_angeltype, + $shift_entries + ); + if ($shift_signup_state == null) { + $shift_signup_state = $angeltype_signup_state; + } else { + $shift_signup_state->combineWith($angeltype_signup_state); + } + $angeltype['shift_signup_state'] = $angeltype_signup_state; + } + + return [ + $shift['name'], + Shift_view($shift, $shifttype, $room, $angeltypes, $shift_signup_state) + ]; } -function shifts_controller() { - if (! isset($_REQUEST['action'])) { - redirect(page_link_to('user_shifts')); - } - - switch ($_REQUEST['action']) { - default: - redirect(page_link_to('?')); - case 'view': - return shift_controller(); - case 'next': - return shift_next_controller(); - } +/** + * @return array|false + */ +function shifts_controller() +{ + if (!isset($_REQUEST['action'])) { + redirect(page_link_to('user_shifts')); + } + + switch ($_REQUEST['action']) { + case 'view': + return shift_controller(); + case 'next': + return shift_next_controller(); + default: + redirect(page_link_to('?')); + } + + return false; } /** * Redirects the user to his next shift. + * + * @return false */ -function shift_next_controller() { - global $user, $privileges; - - if (! in_array('user_shifts', $privileges)) { - redirect(page_link_to('?')); - } - - $upcoming_shifts = ShiftEntries_upcoming_for_user($user); - if ($upcoming_shifts === false) { - return false; - } - - if (count($upcoming_shifts) > 0) { - redirect(shift_link($upcoming_shifts[0])); - } - - redirect(page_link_to('user_shifts')); +function shift_next_controller() +{ + global $user, $privileges; + + if (!in_array('user_shifts', $privileges)) { + redirect(page_link_to('?')); + } + + $upcoming_shifts = ShiftEntries_upcoming_for_user($user); + + if (!empty($upcoming_shifts)) { + redirect(shift_link($upcoming_shifts[0])); + } + + redirect(page_link_to('user_shifts')); + exit; } /** * Export all shifts using api-key. */ -function shifts_json_export_all_controller() { - global $api_key; - - if ($api_key == "") { - engelsystem_error("Config contains empty apikey."); - } - - if (! isset($_REQUEST['api_key'])) { - engelsystem_error("Missing parameter api_key."); - } - - if ($_REQUEST['api_key'] != $api_key) { - engelsystem_error("Invalid api_key."); - } - - $shifts_source = Shifts(); - if ($shifts_source === false) { - engelsystem_error("Unable to load shifts."); - } - - header("Content-Type: application/json; charset=utf-8"); - raw_output(json_encode($shifts_source)); +function shifts_json_export_all_controller() +{ + $api_key = config('api_key'); + + if (empty($api_key)) { + engelsystem_error('Config contains empty apikey.'); + } + + if (!isset($_REQUEST['api_key'])) { + engelsystem_error('Missing parameter api_key.'); + } + + if ($_REQUEST['api_key'] != $api_key) { + engelsystem_error('Invalid api_key.'); + } + + $shifts_source = Shifts(); + if ($shifts_source === false) { + engelsystem_error('Unable to load shifts.'); + } + + header('Content-Type: application/json; charset=utf-8'); + raw_output(json_encode($shifts_source)); } /** * Export filtered shifts via JSON. * (Like iCal Export or shifts view) */ -function shifts_json_export_controller() { - global $user; - - if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { - engelsystem_error("Missing key."); - } - - $key = $_REQUEST['key']; - - $user = User_by_api_key($key); - if ($user == null) { - engelsystem_error("Key invalid."); - } - if (! in_array('shifts_json_export', privileges_for_user($user['UID']))) { - engelsystem_error("No privilege for shifts_json_export."); - } - - $shifts = load_ical_shifts(); - - header("Content-Type: application/json; charset=utf-8"); - raw_output(json_encode($shifts)); +function shifts_json_export_controller() +{ + global $user; + + if (!isset($_REQUEST['key']) || !preg_match('/^[\da-f]{32}$/', $_REQUEST['key'])) { + engelsystem_error('Missing key.'); + } + + $key = $_REQUEST['key']; + + $user = User_by_api_key($key); + if ($user == null) { + engelsystem_error('Key invalid.'); + } + if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) { + engelsystem_error('No privilege for shifts_json_export.'); + } + + $shifts = load_ical_shifts(); + + header('Content-Type: application/json; charset=utf-8'); + raw_output(json_encode($shifts)); } /** * Returns users shifts to export. + * + * @return array */ -function load_ical_shifts() { - global $user; - - return Shifts_by_user($user); -} +function load_ical_shifts() +{ + global $user; -?>
\ No newline at end of file + return Shifts_by_user($user); +} diff --git a/includes/controller/shifttypes_controller.php b/includes/controller/shifttypes_controller.php index 456e39ae..9a470e29 100644 --- a/includes/controller/shifttypes_controller.php +++ b/includes/controller/shifttypes_controller.php @@ -1,179 +1,192 @@ <?php -function shifttype_link($shifttype) { - return page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id']; +/** + * @param array $shifttype + * @return string + */ +function shifttype_link($shifttype) +{ + return page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id']; } /** * Delete a shifttype. + * + * @return array */ -function shifttype_delete_controller() { - if (! isset($_REQUEST['shifttype_id'])) { - redirect(page_link_to('shifttypes')); - } - - $shifttype = ShiftType($_REQUEST['shifttype_id']); - if ($shifttype === false) { - engelsystem_error('Unable to load shifttype.'); - } - - if ($shifttype == null) { - redirect(page_link_to('shifttypes')); - } - - if (isset($_REQUEST['confirmed'])) { - $result = ShiftType_delete($shifttype['id']); - if ($result === false) { - engelsystem_error('Unable to delete shifttype.'); +function shifttype_delete_controller() +{ + if (!isset($_REQUEST['shifttype_id'])) { + redirect(page_link_to('shifttypes')); } - - engelsystem_log('Deleted shifttype ' . $shifttype['name']); - success(sprintf(_('Shifttype %s deleted.'), $shifttype['name'])); - redirect(page_link_to('shifttypes')); - } - - return [ - sprintf(_("Delete shifttype %s"), $shifttype['name']), - ShiftType_delete_view($shifttype) - ]; -} -/** - * Edit or create shift type. - */ -function shifttype_edit_controller() { - $shifttype_id = null; - $name = ""; - $angeltype_id = null; - $description = ""; - - $angeltypes = AngelTypes(); - - if (isset($_REQUEST['shifttype_id'])) { $shifttype = ShiftType($_REQUEST['shifttype_id']); - if ($shifttype === false) { - engelsystem_error('Unable to load shifttype.'); - } + if ($shifttype == null) { - error(_('Shifttype not found.')); - redirect(page_link_to('shifttypes')); - } - $shifttype_id = $shifttype['id']; - $name = $shifttype['name']; - $angeltype_id = $shifttype['angeltype_id']; - $description = $shifttype['description']; - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['name']) && $_REQUEST['name'] != '') { - $name = strip_request_item('name'); - } else { - $valid = false; - error(_('Please enter a name.')); + redirect(page_link_to('shifttypes')); } - - if (isset($_REQUEST['angeltype_id']) && preg_match("/^[0-9]+$/", $_REQUEST['angeltype_id'])) { - $angeltype_id = $_REQUEST['angeltype_id']; - } else { - $angeltype_id = null; + + if (isset($_REQUEST['confirmed'])) { + $result = ShiftType_delete($shifttype['id']); + if (empty($result)) { + engelsystem_error('Unable to delete shifttype.'); + } + + engelsystem_log('Deleted shifttype ' . $shifttype['name']); + success(sprintf(_('Shifttype %s deleted.'), $shifttype['name'])); + redirect(page_link_to('shifttypes')); } - - if (isset($_REQUEST['description'])) { - $description = strip_request_item_nl('description'); + + return [ + sprintf(_('Delete shifttype %s'), $shifttype['name']), + ShiftType_delete_view($shifttype) + ]; +} + +/** + * Edit or create shift type. + * + * @return array + */ +function shifttype_edit_controller() +{ + $shifttype_id = null; + $name = ''; + $angeltype_id = null; + $description = ''; + + $angeltypes = AngelTypes(); + + if (isset($_REQUEST['shifttype_id'])) { + $shifttype = ShiftType($_REQUEST['shifttype_id']); + if ($shifttype == null) { + error(_('Shifttype not found.')); + redirect(page_link_to('shifttypes')); + } + $shifttype_id = $shifttype['id']; + $name = $shifttype['name']; + $angeltype_id = $shifttype['angeltype_id']; + $description = $shifttype['description']; } - - if ($valid) { - if ($shifttype_id) { - $result = ShiftType_update($shifttype_id, $name, $angeltype_id, $description); - if ($result === false) { - engelsystem_error('Unable to update shifttype.'); + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['name']) && $_REQUEST['name'] != '') { + $name = strip_request_item('name'); + } else { + $valid = false; + error(_('Please enter a name.')); + } + + if (isset($_REQUEST['angeltype_id']) && preg_match('/^\d+$/', $_REQUEST['angeltype_id'])) { + $angeltype_id = $_REQUEST['angeltype_id']; + } else { + $angeltype_id = null; } - engelsystem_log('Updated shifttype ' . $name); - success(_('Updated shifttype.')); - } else { - $shifttype_id = ShiftType_create($name, $angeltype_id, $description); - if ($shifttype_id === false) { - engelsystem_error('Unable to create shifttype.'); + + if (isset($_REQUEST['description'])) { + $description = strip_request_item_nl('description'); + } + + if ($valid) { + if ($shifttype_id) { + $result = ShiftType_update($shifttype_id, $name, $angeltype_id, $description); + if ($result === false) { + engelsystem_error('Unable to update shifttype.'); + } + engelsystem_log('Updated shifttype ' . $name); + success(_('Updated shifttype.')); + } else { + $shifttype_id = ShiftType_create($name, $angeltype_id, $description); + if ($shifttype_id === false) { + engelsystem_error('Unable to create shifttype.'); + } + engelsystem_log('Created shifttype ' . $name); + success(_('Created shifttype.')); + } + redirect(page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype_id); } - engelsystem_log('Created shifttype ' . $name); - success(_('Created shifttype.')); - } - redirect(page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype_id); } - } - - return [ - shifttypes_title(), - ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) - ]; + + return [ + shifttypes_title(), + ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) + ]; } -function shifttype_controller() { - if (! isset($_REQUEST['shifttype_id'])) { - redirect(page_link_to('shifttypes')); - } - $shifttype = ShiftType($_REQUEST['shifttype_id']); - if ($shifttype === false) { - engelsystem_error('Unable to load shifttype.'); - } - if ($shifttype == null) { - redirect(page_link_to('shifttypes')); - } - - $angeltype = null; - if ($shifttype['angeltype_id'] != null) { - $angeltype = AngelType($shifttype['angeltype_id']); - } - - return [ - $shifttype['name'], - ShiftType_view($shifttype, $angeltype) - ]; +/** + * @return array + */ +function shifttype_controller() +{ + if (!isset($_REQUEST['shifttype_id'])) { + redirect(page_link_to('shifttypes')); + } + $shifttype = ShiftType($_REQUEST['shifttype_id']); + if ($shifttype == null) { + redirect(page_link_to('shifttypes')); + } + + $angeltype = null; + if ($shifttype['angeltype_id'] != null) { + $angeltype = AngelType($shifttype['angeltype_id']); + } + + return [ + $shifttype['name'], + ShiftType_view($shifttype, $angeltype) + ]; } /** * List all shift types. + * + * @return array */ -function shifttypes_list_controller() { - $shifttypes = ShiftTypes(); - if ($shifttypes === false) { - engelsystem_error("Unable to load shifttypes."); - } - - return [ - shifttypes_title(), - ShiftTypes_list_view($shifttypes) - ]; +function shifttypes_list_controller() +{ + $shifttypes = ShiftTypes(); + if ($shifttypes === false) { + engelsystem_error('Unable to load shifttypes.'); + } + + return [ + shifttypes_title(), + ShiftTypes_list_view($shifttypes) + ]; } /** * Text for shift type related links. + * + * @return string */ -function shifttypes_title() { - return _("Shifttypes"); +function shifttypes_title() +{ + return _('Shifttypes'); } /** * Route shift type actions + * + * @return array */ -function shifttypes_controller() { - if (! isset($_REQUEST['action'])) { - $_REQUEST['action'] = 'list'; - } - - switch ($_REQUEST['action']) { - default: - case 'list': - return shifttypes_list_controller(); - case 'view': - return shifttype_controller(); - case 'edit': - return shifttype_edit_controller(); - case 'delete': - return shifttype_delete_controller(); - } -} +function shifttypes_controller() +{ + if (!isset($_REQUEST['action'])) { + $_REQUEST['action'] = 'list'; + } -?>
\ No newline at end of file + switch ($_REQUEST['action']) { + case 'view': + return shifttype_controller(); + case 'edit': + return shifttype_edit_controller(); + case 'delete': + return shifttype_delete_controller(); + case 'list': + default: + return shifttypes_list_controller(); + } +} diff --git a/includes/controller/user_angeltypes_controller.php b/includes/controller/user_angeltypes_controller.php index 6ef894c7..f31aeecd 100644 --- a/includes/controller/user_angeltypes_controller.php +++ b/includes/controller/user_angeltypes_controller.php @@ -2,362 +2,421 @@ /** * Display a hint for team/angeltype supporters if there are unconfirmed users for his angeltype. + * + * @return string|null */ -function user_angeltypes_unconfirmed_hint() { - global $user; - - $unconfirmed_user_angeltypes = User_unconfirmed_AngelTypes($user); - if (count($unconfirmed_user_angeltypes) == 0) { - return null; - } - - $unconfirmed_links = []; - foreach ($unconfirmed_user_angeltypes as $user_angeltype) { - $unconfirmed_links[] = '<a href="' . page_link_to('angeltypes') . '&action=view&angeltype_id=' . $user_angeltype['angeltype_id'] . '">' . $user_angeltype['name'] . ' (+' . $user_angeltype['count'] . ')' . '</a>'; - } - - return sprintf(ngettext("There is %d unconfirmed angeltype.", "There are %d unconfirmed angeltypes.", count($unconfirmed_user_angeltypes)), count($unconfirmed_user_angeltypes)) . " " . _('Angel types which need approvals:') . ' ' . join(', ', $unconfirmed_links); +function user_angeltypes_unconfirmed_hint() +{ + global $user; + + $unconfirmed_user_angeltypes = User_unconfirmed_AngelTypes($user); + if (count($unconfirmed_user_angeltypes) == 0) { + return null; + } + + $unconfirmed_links = []; + foreach ($unconfirmed_user_angeltypes as $user_angeltype) { + $unconfirmed_links[] = '<a href="' + . page_link_to('angeltypes') + . '&action=view&angeltype_id=' . $user_angeltype['angeltype_id'] + . '">' . $user_angeltype['name'] + . ' (+' . $user_angeltype['count'] . ')' + . '</a>'; + } + + return sprintf(ngettext('There is %d unconfirmed angeltype.', 'There are %d unconfirmed angeltypes.', + count($unconfirmed_user_angeltypes)), + count($unconfirmed_user_angeltypes)) . ' ' . _('Angel types which need approvals:') . ' ' . join(', ', + $unconfirmed_links); } /** * Remove all unconfirmed users from a specific angeltype. + * + * @return array */ -function user_angeltypes_delete_all_controller() { - global $user; - - if (! isset($_REQUEST['angeltype_id'])) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($_REQUEST['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (! User_is_AngelType_supporter($user, $angeltype)) { - error(_("You are not allowed to delete all users for this angeltype.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - UserAngelTypes_delete_all($angeltype['id']); - - engelsystem_log(sprintf("Denied all users for angeltype %s", AngelType_name_render($angeltype))); - success(sprintf(_("Denied all users for angeltype %s."), AngelType_name_render($angeltype))); - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - _("Deny all users"), - UserAngelTypes_delete_all_view($angeltype) - ]; +function user_angeltypes_delete_all_controller() +{ + global $user; + + if (!isset($_REQUEST['angeltype_id'])) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($_REQUEST['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (!User_is_AngelType_supporter($user, $angeltype)) { + error(_('You are not allowed to delete all users for this angeltype.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + UserAngelTypes_delete_all($angeltype['id']); + + engelsystem_log(sprintf('Denied all users for angeltype %s', AngelType_name_render($angeltype))); + success(sprintf(_('Denied all users for angeltype %s.'), AngelType_name_render($angeltype))); + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + _('Deny all users'), + UserAngelTypes_delete_all_view($angeltype) + ]; } /** * Confirm all unconfirmed users for an angeltype. + * + * @return array */ -function user_angeltypes_confirm_all_controller() { - global $user, $privileges; - - if (! isset($_REQUEST['angeltype_id'])) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($_REQUEST['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); - if ($user_angeltype == null) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (! in_array('admin_user_angeltypes', $privileges) && ! $user_angeltype['supporter']) { - error(_("You are not allowed to confirm all users for this angeltype.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - UserAngelTypes_confirm_all($angeltype['id'], $user); - - engelsystem_log(sprintf("Confirmed all users for angeltype %s", AngelType_name_render($angeltype))); - success(sprintf(_("Confirmed all users for angeltype %s."), AngelType_name_render($angeltype))); - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - _("Confirm all users"), - UserAngelTypes_confirm_all_view($angeltype) - ]; +function user_angeltypes_confirm_all_controller() +{ + global $user, $privileges; + + if (!isset($_REQUEST['angeltype_id'])) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($_REQUEST['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); + if ($user_angeltype == null) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (!in_array('admin_user_angeltypes', $privileges) && !$user_angeltype['supporter']) { + error(_('You are not allowed to confirm all users for this angeltype.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + UserAngelTypes_confirm_all($angeltype['id'], $user); + + engelsystem_log(sprintf('Confirmed all users for angeltype %s', AngelType_name_render($angeltype))); + success(sprintf(_('Confirmed all users for angeltype %s.'), AngelType_name_render($angeltype))); + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + _('Confirm all users'), + UserAngelTypes_confirm_all_view($angeltype) + ]; } /** * Confirm an user for an angeltype. + * + * @return array */ -function user_angeltype_confirm_controller() { - global $user; - - if (! isset($_REQUEST['user_angeltype_id'])) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); - if ($user_angeltype == null) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($user_angeltype['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (! User_is_AngelType_supporter($user, $angeltype)) { - error(_("You are not allowed to confirm this users angeltype.")); - redirect(page_link_to('angeltypes')); - } - - $user_source = User($user_angeltype['user_id']); - if ($user_source == null) { - error(_("User doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - $result = UserAngelType_confirm($user_angeltype['id'], $user); - if ($result === false) { - engelsystem_error("Unable to confirm user angeltype."); - } - - engelsystem_log(sprintf("%s confirmed for angeltype %s", User_Nick_render($user_source), AngelType_name_render($angeltype))); - success(sprintf(_("%s confirmed for angeltype %s."), User_Nick_render($user_source), AngelType_name_render($angeltype))); - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - _("Confirm angeltype for user"), - UserAngelType_confirm_view($user_angeltype, $user_source, $angeltype) - ]; +function user_angeltype_confirm_controller() +{ + global $user; + + if (!isset($_REQUEST['user_angeltype_id'])) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); + if ($user_angeltype == null) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($user_angeltype['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (!User_is_AngelType_supporter($user, $angeltype)) { + error(_('You are not allowed to confirm this users angeltype.')); + redirect(page_link_to('angeltypes')); + } + + $user_source = User($user_angeltype['user_id']); + if ($user_source == null) { + error(_('User doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + UserAngelType_confirm($user_angeltype['id'], $user); + + engelsystem_log(sprintf( + '%s confirmed for angeltype %s', + User_Nick_render($user_source), + AngelType_name_render($angeltype) + )); + success(sprintf( + _('%s confirmed for angeltype %s.'), + User_Nick_render($user_source), + AngelType_name_render($angeltype) + )); + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + _('Confirm angeltype for user'), + UserAngelType_confirm_view($user_angeltype, $user_source, $angeltype) + ]; } /** * Remove a user from an Angeltype. + * + * @return array */ -function user_angeltype_delete_controller() { - global $user; - - if (! isset($_REQUEST['user_angeltype_id'])) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); - if ($user_angeltype == null) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($user_angeltype['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $user_source = User($user_angeltype['user_id']); - if ($user_source == null) { - error(_("User doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if ($user['UID'] != $user_angeltype['user_id'] && ! User_is_AngelType_supporter($user, $angeltype)) { - error(_("You are not allowed to delete this users angeltype.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - $result = UserAngelType_delete($user_angeltype); - if ($result === false) { - engelsystem_error("Unable to delete user angeltype."); - } - - $success_message = sprintf(_("User %s removed from %s."), User_Nick_render($user_source), $angeltype['name']); - engelsystem_log($success_message); - success($success_message); - - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - _("Remove angeltype"), - UserAngelType_delete_view($user_angeltype, $user_source, $angeltype) - ]; +function user_angeltype_delete_controller() +{ + global $user; + + if (!isset($_REQUEST['user_angeltype_id'])) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); + if ($user_angeltype == null) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($user_angeltype['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $user_source = User($user_angeltype['user_id']); + if ($user_source == null) { + error(_('User doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if ($user['UID'] != $user_angeltype['user_id'] && !User_is_AngelType_supporter($user, $angeltype)) { + error(_('You are not allowed to delete this users angeltype.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + $result = UserAngelType_delete($user_angeltype); + if ($result === false) { + engelsystem_error('Unable to delete user angeltype.'); + } + + $success_message = sprintf(_('User %s removed from %s.'), User_Nick_render($user_source), $angeltype['name']); + engelsystem_log($success_message); + success($success_message); + + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + _('Remove angeltype'), + UserAngelType_delete_view($user_angeltype, $user_source, $angeltype) + ]; } /** * Update an UserAngelType. + * + * @return array */ -function user_angeltype_update_controller() { - global $privileges; - - if (! in_array('admin_angel_types', $privileges)) { - error(_("You are not allowed to set supporter rights.")); - redirect(page_link_to('angeltypes')); - } - - if (! isset($_REQUEST['user_angeltype_id'])) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['supporter']) && preg_match("/^[01]$/", $_REQUEST['supporter'])) { - $supporter = $_REQUEST['supporter'] == "1"; - } else { - error(_("No supporter update given.")); - redirect(page_link_to('angeltypes')); - } - - $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); - if ($user_angeltype == null) { - error(_("User angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $angeltype = AngelType($user_angeltype['angeltype_id']); - if ($angeltype == null) { - error(_("Angeltype doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - $user_source = User($user_angeltype['user_id']); - if ($user_source == null) { - error(_("User doesn't exist.")); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - UserAngelType_update($user_angeltype['id'], $supporter); - - $success_message = sprintf($supporter ? _("Added supporter rights for %s to %s.") : _("Removed supporter rights for %s from %s."), AngelType_name_render($angeltype), User_Nick_render($user_source)); - engelsystem_log($success_message); - success($success_message); - - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - $supporter ? _("Add supporter rights") : _("Remove supporter rights"), - UserAngelType_update_view($user_angeltype, $user_source, $angeltype, $supporter) - ]; +function user_angeltype_update_controller() +{ + global $privileges; + $supporter = false; + + if (!in_array('admin_angel_types', $privileges)) { + error(_('You are not allowed to set supporter rights.')); + redirect(page_link_to('angeltypes')); + } + + if (!isset($_REQUEST['user_angeltype_id'])) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['supporter']) && preg_match('/^[01]$/', $_REQUEST['supporter'])) { + $supporter = $_REQUEST['supporter'] == '1'; + } else { + error(_('No supporter update given.')); + redirect(page_link_to('angeltypes')); + } + + $user_angeltype = UserAngelType($_REQUEST['user_angeltype_id']); + if ($user_angeltype == null) { + error(_('User angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $angeltype = AngelType($user_angeltype['angeltype_id']); + if ($angeltype == null) { + error(_('Angeltype doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + $user_source = User($user_angeltype['user_id']); + if ($user_source == null) { + error(_('User doesn\'t exist.')); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + UserAngelType_update($user_angeltype['id'], $supporter); + + $success_message = sprintf( + $supporter ? _('Added supporter rights for %s to %s.') : _('Removed supporter rights for %s from %s.'), + AngelType_name_render($angeltype), + User_Nick_render($user_source) + ); + engelsystem_log($success_message); + success($success_message); + + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + $supporter ? _('Add supporter rights') : _('Remove supporter rights'), + UserAngelType_update_view($user_angeltype, $user_source, $angeltype, $supporter) + ]; } /** * User joining an Angeltype (Or supporter doing this for him). */ -function user_angeltype_add_controller() { - global $user; - - $angeltype = load_angeltype(); - - // User is joining by itself - if (! User_is_AngelType_supporter($user, $angeltype)) { - return user_angeltype_join_controller($angeltype); - } - - // Allow to add any user - - // Default selection - $user_source = $user; - - // Load possible users, that are not in the angeltype already - $users_source = Users_by_angeltype_inverted($angeltype); - - if (isset($_REQUEST['submit'])) { - $user_source = load_user(); - - if (! UserAngelType_exists($user_source, $angeltype)) { - $user_angeltype_id = UserAngelType_create($user_source, $angeltype); - - engelsystem_log(sprintf("User %s added to %s.", User_Nick_render($user_source), AngelType_name_render($angeltype))); - success(sprintf(_("User %s added to %s."), User_Nick_render($user_source), AngelType_name_render($angeltype))); - - UserAngelType_confirm($user_angeltype_id, $user_source); - engelsystem_log(sprintf("User %s confirmed as %s.", User_Nick_render($user), AngelType_name_render($angeltype))); - - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - } - - return [ - _("Add user to angeltype"), - UserAngelType_add_view($angeltype, $users_source, $user_source['UID']) - ]; +function user_angeltype_add_controller() +{ + global $user; + + $angeltype = load_angeltype(); + + // User is joining by itself + if (!User_is_AngelType_supporter($user, $angeltype)) { + return user_angeltype_join_controller($angeltype); + } + + // Allow to add any user + + // Default selection + $user_source = $user; + + // Load possible users, that are not in the angeltype already + $users_source = Users_by_angeltype_inverted($angeltype); + + if (isset($_REQUEST['submit'])) { + $user_source = load_user(); + + if (!UserAngelType_exists($user_source, $angeltype)) { + $user_angeltype_id = UserAngelType_create($user_source, $angeltype); + + engelsystem_log(sprintf( + 'User %s added to %s.', + User_Nick_render($user_source), + AngelType_name_render($angeltype) + )); + success(sprintf( + _('User %s added to %s.'), + User_Nick_render($user_source), + AngelType_name_render($angeltype) + )); + + UserAngelType_confirm($user_angeltype_id, $user_source); + engelsystem_log(sprintf( + 'User %s confirmed as %s.', + User_Nick_render($user), + AngelType_name_render($angeltype) + )); + + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + } + + return [ + _('Add user to angeltype'), + UserAngelType_add_view($angeltype, $users_source, $user_source['UID']) + ]; } /** * A user joins an angeltype. + * + * @param array $angeltype + * @return array */ -function user_angeltype_join_controller($angeltype) { - global $user, $privileges; - - $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); - if ($user_angeltype != null) { - error(sprintf(_("You are already a %s."), $angeltype['name'])); - redirect(page_link_to('angeltypes')); - } - - if (isset($_REQUEST['confirmed'])) { - $user_angeltype_id = UserAngelType_create($user, $angeltype); - - $success_message = sprintf(_("You joined %s."), $angeltype['name']); - engelsystem_log(sprintf("User %s joined %s.", User_Nick_render($user), AngelType_name_render($angeltype))); - success($success_message); - - if (in_array('admin_user_angeltypes', $privileges)) { - UserAngelType_confirm($user_angeltype_id, $user); - engelsystem_log(sprintf("User %s confirmed as %s.", User_Nick_render($user), AngelType_name_render($angeltype))); - } - - redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); - } - - return [ - sprintf(_("Become a %s"), $angeltype['name']), - UserAngelType_join_view($user, $angeltype) - ]; +function user_angeltype_join_controller($angeltype) +{ + global $user, $privileges; + + $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); + if ($user_angeltype != null) { + error(sprintf(_('You are already a %s.'), $angeltype['name'])); + redirect(page_link_to('angeltypes')); + } + + if (isset($_REQUEST['confirmed'])) { + $user_angeltype_id = UserAngelType_create($user, $angeltype); + + $success_message = sprintf(_('You joined %s.'), $angeltype['name']); + engelsystem_log(sprintf('User %s joined %s.', User_Nick_render($user), AngelType_name_render($angeltype))); + success($success_message); + + if (in_array('admin_user_angeltypes', $privileges)) { + UserAngelType_confirm($user_angeltype_id, $user); + engelsystem_log(sprintf( + 'User %s confirmed as %s.', + User_Nick_render($user), + AngelType_name_render($angeltype) + )); + } + + redirect(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id']); + } + + return [ + sprintf(_('Become a %s'), $angeltype['name']), + UserAngelType_join_view($user, $angeltype) + ]; } /** * Route UserAngelType actions. + * + * @return array */ -function user_angeltypes_controller() { - if (! isset($_REQUEST['action'])) { - redirect(page_link_to('angeltypes')); - } - - switch ($_REQUEST['action']) { - case 'delete_all': - return user_angeltypes_delete_all_controller(); - case 'confirm_all': - return user_angeltypes_confirm_all_controller(); - case 'confirm': - return user_angeltype_confirm_controller(); - case 'delete': - return user_angeltype_delete_controller(); - case 'update': - return user_angeltype_update_controller(); - case 'add': - return user_angeltype_add_controller(); - default: - redirect(page_link_to('angeltypes')); - } -} +function user_angeltypes_controller() +{ + if (!isset($_REQUEST['action'])) { + redirect(page_link_to('angeltypes')); + } -?>
\ No newline at end of file + switch ($_REQUEST['action']) { + case 'delete_all': + return user_angeltypes_delete_all_controller(); + case 'confirm_all': + return user_angeltypes_confirm_all_controller(); + case 'confirm': + return user_angeltype_confirm_controller(); + case 'delete': + return user_angeltype_delete_controller(); + case 'update': + return user_angeltype_update_controller(); + case 'add': + return user_angeltype_add_controller(); + default: + redirect(page_link_to('angeltypes')); + exit; + } +} diff --git a/includes/controller/user_driver_licenses_controller.php b/includes/controller/user_driver_licenses_controller.php index 26deab7d..3098c8ce 100644 --- a/includes/controller/user_driver_licenses_controller.php +++ b/includes/controller/user_driver_licenses_controller.php @@ -1,132 +1,148 @@ <?php /** - * Generates a hint, if user joined angeltypes that require a driving license and the user has no driver license information provided. + * Generates a hint, if user joined angeltypes that require a driving license and the user has no driver license + * information provided. + * + * @return string|null */ -function user_driver_license_required_hint() { - global $user; - - $angeltypes = User_angeltypes($user); - $user_driver_license = UserDriverLicense($user['UID']); - - // User has already entered data, no hint needed. - if ($user_driver_license != null) { - return null; - } - - foreach ($angeltypes as $angeltype) { - if ($angeltype['requires_driver_license']) { - return sprintf(_("You joined an angeltype which requires a driving license. Please edit your driving license information here: %s."), '<a href="' . user_driver_license_edit_link() . '">' . _("driving license information") . '</a>'); +function user_driver_license_required_hint() +{ + global $user; + + $angeltypes = User_angeltypes($user); + $user_driver_license = UserDriverLicense($user['UID']); + + // User has already entered data, no hint needed. + if ($user_driver_license != null) { + return null; } - } - - return null; + + foreach ($angeltypes as $angeltype) { + if ($angeltype['requires_driver_license']) { + return sprintf( + _('You joined an angeltype which requires a driving license. Please edit your driving license information here: %s.'), + '<a href="' . user_driver_license_edit_link() . '">' . _('driving license information') . '</a>' + ); + } + } + + return null; } /** * Route user driver licenses actions. + * + * @return array */ -function user_driver_licenses_controller() { - global $user; - - if (! isset($user)) { - redirect(page_link_to('')); - } - - $action = strip_request_item('action', 'edit'); - - switch ($action) { - default: - case 'edit': - return user_driver_license_edit_controller(); - } +function user_driver_licenses_controller() +{ + global $user; + + if (!isset($user)) { + redirect(page_link_to('')); + } + + $action = strip_request_item('action', 'edit'); + + switch ($action) { + default: + case 'edit': + return user_driver_license_edit_controller(); + } } /** * Link to user driver license edit page for given user. * - * @param User $user + * @param array $user + * @return string */ -function user_driver_license_edit_link($user = null) { - if ($user == null) { - return page_link_to('user_driver_licenses'); - } - return page_link_to('user_driver_licenses') . '&user_id=' . $user['UID']; +function user_driver_license_edit_link($user = null) +{ + if ($user == null) { + return page_link_to('user_driver_licenses'); + } + return page_link_to('user_driver_licenses') . '&user_id=' . $user['UID']; } /** * Loads the user for the driver license. + * + * @return array */ -function user_driver_license_load_user() { - global $user; - - $user_source = $user; - - if (isset($_REQUEST['user_id'])) { - $user_source = User($_REQUEST['user_id']); - if ($user_source == null) { - redirect(user_driver_license_edit_link()); +function user_driver_license_load_user() +{ + global $user; + + $user_source = $user; + + if (isset($_REQUEST['user_id'])) { + $user_source = User($_REQUEST['user_id']); + if ($user_source == null) { + redirect(user_driver_license_edit_link()); + } } - } - - return $user_source; + + return $user_source; } /** * Edit a users driver license information. + * + * @return array */ -function user_driver_license_edit_controller() { - global $privileges, $user; - - $user_source = user_driver_license_load_user(); - - // only privilege admin_user can edit other users driver license information - if ($user['UID'] != $user_source['UID'] && ! in_array('admin_user', $privileges)) { - redirect(user_driver_license_edit_link()); - } - - $user_driver_license = UserDriverLicense($user_source['UID']); - if ($user_driver_license == null) { - $wants_to_drive = false; - $user_driver_license = UserDriverLicense_new(); - } else { - $wants_to_drive = true; - } - - if (isset($_REQUEST['submit'])) { - $wants_to_drive = isset($_REQUEST['wants_to_drive']); - if ($wants_to_drive) { - $user_driver_license['has_car'] = isset($_REQUEST['has_car']); - $user_driver_license['has_license_car'] = isset($_REQUEST['has_license_car']); - $user_driver_license['has_license_3_5t_transporter'] = isset($_REQUEST['has_license_3_5t_transporter']); - $user_driver_license['has_license_7_5t_truck'] = isset($_REQUEST['has_license_7_5t_truck']); - $user_driver_license['has_license_12_5t_truck'] = isset($_REQUEST['has_license_12_5t_truck']); - $user_driver_license['has_license_forklift'] = isset($_REQUEST['has_license_forklift']); - - if (UserDriverLicense_valid($user_driver_license)) { - if ($user_driver_license['user_id'] == null) { - $user_driver_license = UserDriverLicenses_create($user_driver_license, $user); - } else { - UserDriverLicenses_update($user_driver_license); +function user_driver_license_edit_controller() +{ + global $privileges, $user; + + $user_source = user_driver_license_load_user(); + + // only privilege admin_user can edit other users driver license information + if ($user['UID'] != $user_source['UID'] && !in_array('admin_user', $privileges)) { + redirect(user_driver_license_edit_link()); + } + + $user_driver_license = UserDriverLicense($user_source['UID']); + if ($user_driver_license == null) { + $wants_to_drive = false; + $user_driver_license = UserDriverLicense_new(); + } else { + $wants_to_drive = true; + } + + if (isset($_REQUEST['submit'])) { + $wants_to_drive = isset($_REQUEST['wants_to_drive']); + if ($wants_to_drive) { + $user_driver_license['has_car'] = isset($_REQUEST['has_car']); + $user_driver_license['has_license_car'] = isset($_REQUEST['has_license_car']); + $user_driver_license['has_license_3_5t_transporter'] = isset($_REQUEST['has_license_3_5t_transporter']); + $user_driver_license['has_license_7_5t_truck'] = isset($_REQUEST['has_license_7_5t_truck']); + $user_driver_license['has_license_12_5t_truck'] = isset($_REQUEST['has_license_12_5t_truck']); + $user_driver_license['has_license_forklift'] = isset($_REQUEST['has_license_forklift']); + + if (UserDriverLicense_valid($user_driver_license)) { + if ($user_driver_license['user_id'] == null) { + $user_driver_license = UserDriverLicenses_create($user_driver_license, $user_source); + } else { + UserDriverLicenses_update($user_driver_license); + } + engelsystem_log('Driver license information updated.'); + success(_('Your driver license information has been saved.')); + redirect(user_link($user_source)); + } else { + error(_('Please select at least one driving license.')); + } + } elseif ($user_driver_license['user_id'] != null) { + UserDriverLicenses_delete($user_source['UID']); + engelsystem_log('Driver license information removed.'); + success(_('Your driver license information has been removed.')); + redirect(user_link($user_source)); } - engelsystem_log("Driver license information updated."); - success(_("Your driver license information has been saved.")); - redirect(user_link($user_source)); - } else { - error(_("Please select at least one driving license.")); - } - } elseif ($user_driver_license['id'] != null) { - UserDriverLicenses_delete($user_source['UID']); - engelsystem_log("Driver license information removed."); - success(_("Your driver license information has been removed.")); - redirect(user_link($user_source)); } - } - - return [ - sprintf(_("Edit %s driving license information"), $user_source['Nick']), - UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) - ]; -} -?>
\ No newline at end of file + return [ + sprintf(_('Edit %s driving license information'), $user_source['Nick']), + UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) + ]; +} diff --git a/includes/controller/users_controller.php b/includes/controller/users_controller.php index 3825af7c..84b6bbda 100644 --- a/includes/controller/users_controller.php +++ b/includes/controller/users_controller.php @@ -1,371 +1,467 @@ <?php -use Engelsystem\ShiftsFilter; + +use Engelsystem\Database\DB; use Engelsystem\ShiftCalendarRenderer; +use Engelsystem\ShiftsFilter; /** * Route user actions. + * + * @return array */ -function users_controller() { - global $user; - - if (! isset($user)) { - redirect(page_link_to('')); - } - - if (! isset($_REQUEST['action'])) { - $_REQUEST['action'] = 'list'; - } - - switch ($_REQUEST['action']) { - default: - case 'list': - return users_list_controller(); - case 'view': - return user_controller(); - case 'edit': - return user_edit_controller(); - case 'delete': - return user_delete_controller(); - case 'edit_vouchers': - return user_edit_vouchers_controller(); - } +function users_controller() +{ + global $user; + + if (!isset($user)) { + redirect(page_link_to('')); + } + + if (!isset($_REQUEST['action'])) { + $_REQUEST['action'] = 'list'; + } + + switch ($_REQUEST['action']) { + case 'view': + return user_controller(); + case 'delete': + return user_delete_controller(); + case 'edit_vouchers': + return user_edit_vouchers_controller(); + case 'list': + default: + return users_list_controller(); + } } /** * Delete a user, requires to enter own password for reasons. + * + * @return array */ -function user_delete_controller() { - global $privileges, $user; - - if (isset($_REQUEST['user_id'])) { - $user_source = User($_REQUEST['user_id']); - } else { - $user_source = $user; - } - - if (! in_array('admin_user', $privileges)) { - redirect(page_link_to('')); - } - - // You cannot delete yourself - if ($user['UID'] == $user_source['UID']) { - error(_("You cannot delete yourself.")); - redirect(user_link($user)); - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (! (isset($_REQUEST['password']) && verify_password($_REQUEST['password'], $user['Passwort'], $user['UID']))) { - $valid = false; - error(_("Your password is incorrect. Please try it again.")); +function user_delete_controller() +{ + global $privileges, $user; + + if (isset($_REQUEST['user_id'])) { + $user_source = User($_REQUEST['user_id']); + } else { + $user_source = $user; + } + + if (!in_array('admin_user', $privileges)) { + redirect(page_link_to('')); } - - if ($valid) { - $result = User_delete($user_source['UID']); - if ($result === false) { - engelsystem_error('Unable to delete user.'); - } - - mail_user_delete($user_source); - success(_("User deleted.")); - engelsystem_log(sprintf("Deleted %s", User_Nick_render($user_source))); - - redirect(users_link()); + + // You cannot delete yourself + if ($user['UID'] == $user_source['UID']) { + error(_('You cannot delete yourself.')); + redirect(user_link($user)); } - } - - return [ - sprintf(_("Delete %s"), $user_source['Nick']), - User_delete_view($user_source) - ]; + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (!(isset($_REQUEST['password']) && verify_password($_REQUEST['password'], $user['Passwort'], + $user['UID'])) + ) { + $valid = false; + error(_('Your password is incorrect. Please try it again.')); + } + + if ($valid) { + $result = User_delete($user_source['UID']); + if ($result === false) { + engelsystem_error('Unable to delete user.'); + } + + mail_user_delete($user_source); + success(_('User deleted.')); + engelsystem_log(sprintf('Deleted %s', User_Nick_render($user_source))); + + redirect(users_link()); + } + } + + return [ + sprintf(_('Delete %s'), $user_source['Nick']), + User_delete_view($user_source) + ]; } -function users_link() { - return page_link_to('users'); +/** + * @return string + */ +function users_link() +{ + return page_link_to('users'); } -function user_edit_link($user) { - return page_link_to('admin_user') . '&user_id=' . $user['UID']; +/** + * @param array $user + * @return string + */ +function user_edit_link($user) +{ + return page_link_to('admin_user') . '&user_id=' . $user['UID']; } -function user_delete_link($user) { - return page_link_to('users') . '&action=delete&user_id=' . $user['UID']; +/** + * @param array $user + * @return string + */ +function user_delete_link($user) +{ + return page_link_to('users') . '&action=delete&user_id=' . $user['UID']; } -function user_link($user) { - return page_link_to('users') . '&action=view&user_id=' . $user['UID']; +/** + * @param array $user + * @return string + */ +function user_link($user) +{ + return page_link_to('users') . '&action=view&user_id=' . $user['UID']; } -function user_edit_vouchers_controller() { - global $privileges, $user; - - if (isset($_REQUEST['user_id'])) { - $user_source = User($_REQUEST['user_id']); - } else { - $user_source = $user; - } - - if (! in_array('admin_user', $privileges)) { - redirect(page_link_to('')); - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['vouchers']) && test_request_int('vouchers') && trim($_REQUEST['vouchers']) >= 0) { - $vouchers = trim($_REQUEST['vouchers']); +/** + * @return array + */ +function user_edit_vouchers_controller() +{ + global $privileges, $user; + + if (isset($_REQUEST['user_id'])) { + $user_source = User($_REQUEST['user_id']); } else { - $valid = false; - error(_("Please enter a valid number of vouchers.")); + $user_source = $user; } - - if ($valid) { - $user_source['got_voucher'] = $vouchers; - - $result = User_update($user_source); - if ($result === false) { - engelsystem_error('Unable to update user.'); - } - - success(_("Saved the number of vouchers.")); - engelsystem_log(User_Nick_render($user_source) . ': ' . sprintf("Got %s vouchers", $user_source['got_voucher'])); - - redirect(user_link($user_source)); + + if (!in_array('admin_user', $privileges)) { + redirect(page_link_to('')); } - } - - return [ - sprintf(_("%s's vouchers"), $user_source['Nick']), - User_edit_vouchers_view($user_source) - ]; + + if (isset($_REQUEST['submit'])) { + $valid = true; + + $vouchers = ''; + if (isset($_REQUEST['vouchers']) && test_request_int('vouchers') && trim($_REQUEST['vouchers']) >= 0) { + $vouchers = trim($_REQUEST['vouchers']); + } else { + $valid = false; + error(_('Please enter a valid number of vouchers.')); + } + + if ($valid) { + $user_source['got_voucher'] = $vouchers; + + $result = User_update($user_source); + if ($result === false) { + engelsystem_error('Unable to update user.'); + } + + success(_('Saved the number of vouchers.')); + engelsystem_log(User_Nick_render($user_source) . ': ' . sprintf('Got %s vouchers', + $user_source['got_voucher'])); + + redirect(user_link($user_source)); + } + } + + return [ + sprintf(_('%s\'s vouchers'), $user_source['Nick']), + User_edit_vouchers_view($user_source) + ]; } -function user_controller() { - global $privileges, $user; - - $user_source = $user; - if (isset($_REQUEST['user_id'])) { - $user_source = User($_REQUEST['user_id']); - if ($user_source == null) { - error(_("User not found.")); - redirect('?'); +/** + * @return array + */ +function user_controller() +{ + global $privileges, $user; + + $user_source = $user; + if (isset($_REQUEST['user_id'])) { + $user_source = User($_REQUEST['user_id']); + if ($user_source == null) { + error(_('User not found.')); + redirect('?'); + } } - } - - $shifts = Shifts_by_user($user_source, in_array("user_shifts_admin", $privileges)); - foreach ($shifts as &$shift) { - // TODO: Move queries to model - $shift['needed_angeltypes'] = sql_select("SELECT DISTINCT `AngelTypes`.* FROM `ShiftEntry` JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` WHERE `ShiftEntry`.`SID`='" . sql_escape($shift['SID']) . "' ORDER BY `AngelTypes`.`name`"); - foreach ($shift['needed_angeltypes'] as &$needed_angeltype) { - $needed_angeltype['users'] = sql_select(" - SELECT `ShiftEntry`.`freeloaded`, `User`.* - FROM `ShiftEntry` - JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` - WHERE `ShiftEntry`.`SID`='" . sql_escape($shift['SID']) . "' - AND `ShiftEntry`.`TID`='" . sql_escape($needed_angeltype['id']) . "'"); + + $shifts = Shifts_by_user($user_source, in_array('user_shifts_admin', $privileges)); + foreach ($shifts as &$shift) { + // TODO: Move queries to model + $shift['needed_angeltypes'] = DB::select(' + SELECT DISTINCT `AngelTypes`.* + FROM `ShiftEntry` + JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` + WHERE `ShiftEntry`.`SID` = ? + ORDER BY `AngelTypes`.`name` + ', + [$shift['SID']] + ); + foreach ($shift['needed_angeltypes'] as &$needed_angeltype) { + $needed_angeltype['users'] = DB::select(' + SELECT `ShiftEntry`.`freeloaded`, `User`.* + FROM `ShiftEntry` + JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` + WHERE `ShiftEntry`.`SID` = ? + AND `ShiftEntry`.`TID` = ? + ', + [$shift['SID'], $needed_angeltype['id']] + ); + } + } + + if ($user_source['api_key'] == '') { + User_reset_api_key($user_source, false); } - } - - if ($user_source['api_key'] == "") { - User_reset_api_key($user_source, false); - } - - return [ - $user_source['Nick'], - User_view($user_source, in_array('admin_user', $privileges), User_is_freeloader($user_source), User_angeltypes($user_source), User_groups($user_source), $shifts, $user['UID'] == $user_source['UID']) - ]; + + return [ + $user_source['Nick'], + User_view( + $user_source, + in_array('admin_user', $privileges), + User_is_freeloader($user_source), + User_angeltypes($user_source), + User_groups($user_source), + $shifts, + $user['UID'] == $user_source['UID'] + ) + ]; } /** * List all users. + * + * @return array */ -function users_list_controller() { - global $privileges; - - if (! in_array('admin_user', $privileges)) { - redirect(page_link_to('')); - } - - $order_by = 'Nick'; - if (isset($_REQUEST['OrderBy']) && in_array($_REQUEST['OrderBy'], User_sortable_columns())) { - $order_by = $_REQUEST['OrderBy']; - } - - $users = Users($order_by); - if ($users === false) { - engelsystem_error('Unable to load users.'); - } - - foreach ($users as &$user) { - $user['freeloads'] = count(ShiftEntries_freeloaded_by_user($user)); - } - - return [ - _('All users'), - Users_view($users, $order_by, User_arrived_count(), User_active_count(), User_force_active_count(), ShiftEntries_freeleaded_count(), User_tshirts_count(), User_got_voucher_count()) - ]; +function users_list_controller() +{ + global $privileges; + + if (!in_array('admin_user', $privileges)) { + redirect(page_link_to('')); + } + + $order_by = 'Nick'; + if (isset($_REQUEST['OrderBy']) && in_array($_REQUEST['OrderBy'], User_sortable_columns())) { + $order_by = $_REQUEST['OrderBy']; + } + + $users = Users($order_by); + if ($users === false) { + engelsystem_error('Unable to load users.'); + } + + foreach ($users as &$user) { + $user['freeloads'] = count(ShiftEntries_freeloaded_by_user($user)); + } + + return [ + _('All users'), + Users_view( + $users, + $order_by, + User_arrived_count(), + User_active_count(), + User_force_active_count(), + ShiftEntries_freeleaded_count(), + User_tshirts_count(), + User_got_voucher_count() + ) + ]; } /** * Second step of password recovery: set a new password using the token link from email + * + * @return string */ -function user_password_recovery_set_new_controller() { - global $min_password_length; - $user_source = User_by_password_recovery_token($_REQUEST['token']); - if ($user_source == null) { - error(_("Token is not correct.")); - redirect(page_link_to('login')); - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['password']) && strlen($_REQUEST['password']) >= $min_password_length) { - if ($_REQUEST['password'] != $_REQUEST['password2']) { - $valid = false; - error(_("Your passwords don't match.")); - } - } else { - $valid = false; - error(_("Your password is to short (please use at least 6 characters).")); +function user_password_recovery_set_new_controller() +{ + $user_source = User_by_password_recovery_token($_REQUEST['token']); + if ($user_source == null) { + error(_('Token is not correct.')); + redirect(page_link_to('login')); } - - if ($valid) { - set_password($user_source['UID'], $_REQUEST['password']); - success(_("Password saved.")); - redirect(page_link_to('login')); + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if ( + isset($_REQUEST['password']) + && strlen($_REQUEST['password']) >= config('min_password_length') + ) { + if ($_REQUEST['password'] != $_REQUEST['password2']) { + $valid = false; + error(_('Your passwords don\'t match.')); + } + } else { + $valid = false; + error(_('Your password is to short (please use at least 6 characters).')); + } + + if ($valid) { + set_password($user_source['UID'], $_REQUEST['password']); + success(_('Password saved.')); + redirect(page_link_to('login')); + } } - } - - return User_password_set_view(); + + return User_password_set_view(); } /** * First step of password recovery: display a form that asks for your email and send email with recovery link + * + * @return string */ -function user_password_recovery_start_controller() { - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['email']) && strlen(strip_request_item('email')) > 0) { - $email = strip_request_item('email'); - if (check_email($email)) { - $user_source = User_by_email($email); - if ($user_source == null) { - $valid = false; - error(_("E-mail address is not correct.")); +function user_password_recovery_start_controller() +{ + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['email']) && strlen(strip_request_item('email')) > 0) { + $email = strip_request_item('email'); + if (check_email($email)) { + $user_source = User_by_email($email); + if ($user_source == null) { + $valid = false; + error(_('E-mail address is not correct.')); + } + } else { + $valid = false; + error(_('E-mail address is not correct.')); + } + } else { + $valid = false; + error(_('Please enter your e-mail.')); + } + + if ($valid) { + $token = User_generate_password_recovery_token($user_source); + engelsystem_email_to_user( + $user_source, + _('Password recovery'), + sprintf( + _('Please visit %s to recover your password.'), + page_link_to_absolute('user_password_recovery') . '&token=' . $token + ) + ); + success(_('We sent an email containing your password recovery link.')); + redirect(page_link_to('login')); } - } else { - $valid = false; - error(_("E-mail address is not correct.")); - } - } else { - $valid = false; - error(_("Please enter your e-mail.")); - } - - if ($valid) { - $token = User_generate_password_recovery_token($user_source); - engelsystem_email_to_user($user_source, _("Password recovery"), sprintf(_("Please visit %s to recover your password."), page_link_to_absolute('user_password_recovery') . '&token=' . $token)); - success(_("We sent an email containing your password recovery link.")); - redirect(page_link_to('login')); } - } - - return User_password_recovery_view(); + + return User_password_recovery_view(); } /** * User password recovery in 2 steps. * (By email) + * + * @return string */ -function user_password_recovery_controller() { - if (isset($_REQUEST['token'])) { - return user_password_recovery_set_new_controller(); - } else { +function user_password_recovery_controller() +{ + if (isset($_REQUEST['token'])) { + return user_password_recovery_set_new_controller(); + } + return user_password_recovery_start_controller(); - } } /** * Menu title for password recovery. + * + * @return string */ -function user_password_recovery_title() { - return _("Password recovery"); +function user_password_recovery_title() +{ + return _('Password recovery'); } /** * Loads a user from param user_id. + * + * return array */ -function load_user() { - if (! isset($_REQUEST['user_id'])) { - redirect(page_link_to()); - } - - $user = User($_REQUEST['user_id']); - if ($user === false) { - engelsystem_error("Unable to load user."); - } - - if ($user == null) { - error(_("User doesn't exist.")); - redirect(page_link_to()); - } - - return $user; +function load_user() +{ + if (!isset($_REQUEST['user_id'])) { + redirect(page_link_to()); + } + + $user = User($_REQUEST['user_id']); + + if ($user == null) { + error(_('User doesn\'t exist.')); + redirect(page_link_to()); + } + + return $user; } -function shiftCalendarRendererByShiftFilter(ShiftsFilter $shiftsFilter) { - $shifts = Shifts_by_ShiftsFilter($shiftsFilter); - $needed_angeltypes_source = NeededAngeltypes_by_ShiftsFilter($shiftsFilter); - $shift_entries_source = ShiftEntries_by_ShiftsFilter($shiftsFilter); - - $needed_angeltypes = []; - $shift_entries = []; - foreach ($shifts as $shift) { - $needed_angeltypes[$shift['SID']] = []; - $shift_entries[$shift['SID']] = []; - } - foreach ($shift_entries_source as $shift_entry) { - if (isset($shift_entries[$shift_entry['SID']])) { - $shift_entries[$shift_entry['SID']][] = $shift_entry; +/** + * @param ShiftsFilter $shiftsFilter + * @return ShiftCalendarRenderer + */ +function shiftCalendarRendererByShiftFilter(ShiftsFilter $shiftsFilter) +{ + $shifts = Shifts_by_ShiftsFilter($shiftsFilter); + $needed_angeltypes_source = NeededAngeltypes_by_ShiftsFilter($shiftsFilter); + $shift_entries_source = ShiftEntries_by_ShiftsFilter($shiftsFilter); + + $needed_angeltypes = []; + $shift_entries = []; + foreach ($shifts as $shift) { + $needed_angeltypes[$shift['SID']] = []; + $shift_entries[$shift['SID']] = []; } - } - foreach ($needed_angeltypes_source as $needed_angeltype) { - if (isset($needed_angeltypes[$needed_angeltype['SID']])) { - $needed_angeltypes[$needed_angeltype['SID']][] = $needed_angeltype; + foreach ($shift_entries_source as $shift_entry) { + if (isset($shift_entries[$shift_entry['SID']])) { + $shift_entries[$shift_entry['SID']][] = $shift_entry; + } } - } - unset($needed_angeltypes_source); - unset($shift_entries_source); - - if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled())) { - return new ShiftCalendarRenderer($shifts, $needed_angeltypes, $shift_entries, $shiftsFilter); - } - - $filtered_shifts = []; - foreach ($shifts as $shift) { - $needed_angels_count = 0; - foreach ($needed_angeltypes[$shift['SID']] as $needed_angeltype) { - $taken = 0; - foreach ($shift_entries[$shift['SID']] as $shift_entry) { - if ($needed_angeltype['angel_type_id'] == $shift_entry['TID'] && $shift_entry['freeloaded'] == 0) { - $taken ++; + foreach ($needed_angeltypes_source as $needed_angeltype) { + if (isset($needed_angeltypes[$needed_angeltype['SID']])) { + $needed_angeltypes[$needed_angeltype['SID']][] = $needed_angeltype; } - } - - $needed_angels_count += max(0, $needed_angeltype['count'] - $taken); } - if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && $taken < $needed_angels_count) { - $filtered_shifts[] = $shift; + unset($needed_angeltypes_source); + unset($shift_entries_source); + + if ( + in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) + && in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled()) + ) { + return new ShiftCalendarRenderer($shifts, $needed_angeltypes, $shift_entries, $shiftsFilter); } - if (in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled()) && $taken >= $needed_angels_count) { - $filtered_shifts[] = $shift; + + $filtered_shifts = []; + foreach ($shifts as $shift) { + $needed_angels_count = 0; + $taken = 0; + foreach ($needed_angeltypes[$shift['SID']] as $needed_angeltype) { + $taken = 0; + foreach ($shift_entries[$shift['SID']] as $shift_entry) { + if ($needed_angeltype['angel_type_id'] == $shift_entry['TID'] && $shift_entry['freeloaded'] == 0) { + $taken++; + } + } + + $needed_angels_count += max(0, $needed_angeltype['count'] - $taken); + } + if (in_array(ShiftsFilter::FILLED_FREE, $shiftsFilter->getFilled()) && $taken < $needed_angels_count) { + $filtered_shifts[] = $shift; + } + if (in_array(ShiftsFilter::FILLED_FILLED, $shiftsFilter->getFilled()) && $taken >= $needed_angels_count) { + $filtered_shifts[] = $shift; + } } - } - - return new ShiftCalendarRenderer($filtered_shifts, $needed_angeltypes, $shift_entries, $shiftsFilter); -} -?> + return new ShiftCalendarRenderer($filtered_shifts, $needed_angeltypes, $shift_entries, $shiftsFilter); +} diff --git a/includes/engelsystem_provider.php b/includes/engelsystem_provider.php index 595af9f9..a818e4cd 100644 --- a/includes/engelsystem_provider.php +++ b/includes/engelsystem_provider.php @@ -1,9 +1,73 @@ <?php + +use Engelsystem\Config\Config; +use Engelsystem\Database\Db; +use Engelsystem\Exceptions\Handler as ExceptionHandler; + /** * This file includes all needed functions, connects to the db etc. */ -require_once realpath(__DIR__ . '/../includes/mysqli_provider.php'); +if (!is_readable(__DIR__ . '/../vendor/autoload.php')) { + die('Please run composer.phar install'); +} +require __DIR__ . '/../vendor/autoload.php'; + + +/** + * Load configuration + */ +$config = new Config(); +Config::setInstance($config); +$config->set(require __DIR__ . '/../config/config.default.php'); + +if (file_exists(__DIR__ . '/../config/config.php')) { + $config->set(array_replace_recursive( + $config->get(null), + require __DIR__ . '/../config/config.php' + )); +} + +date_default_timezone_set($config->get('timezone')); + + +/** + * Check for maintenance + */ +if ($config->get('maintenance')) { + echo file_get_contents(__DIR__ . '/../public/maintenance.html'); + die(); +} + + +/** + * Register error handler + */ +$errorHandler = new ExceptionHandler(); +if (config('environment') == 'development') { + $errorHandler->setEnvironment(ExceptionHandler::ENV_DEVELOPMENT); + ini_set('display_errors', true); + error_reporting(E_ALL); +} else { + ini_set('display_errors', false); +} + + +/** + * Connect to database + */ +Db::connect( + 'mysql:host=' . config('database')['host'] . ';dbname=' . config('database')['db'] . ';charset=utf8', + config('database')['user'], + config('database')['pw'] +) || die('Error: Unable to connect to database'); +Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +Db::getPdo()->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + + +/** + * Include legacy code + */ require_once realpath(__DIR__ . '/../includes/sys_auth.php'); require_once realpath(__DIR__ . '/../includes/sys_form.php'); require_once realpath(__DIR__ . '/../includes/sys_log.php'); @@ -63,16 +127,6 @@ require_once realpath(__DIR__ . '/../includes/helper/email_helper.php'); require_once realpath(__DIR__ . '/../includes/mailer/shifts_mailer.php'); require_once realpath(__DIR__ . '/../includes/mailer/users_mailer.php'); -require_once realpath(__DIR__ . '/../config/config.default.php'); -if (file_exists(realpath(__DIR__ . '/../config/config.php'))) { - require_once realpath(__DIR__ . '/../config/config.php'); -} - -if ($maintenance_mode) { - echo file_get_contents(__DIR__ . '/../public/maintenance.html'); - die(); -} - require_once realpath(__DIR__ . '/../includes/pages/admin_active.php'); require_once realpath(__DIR__ . '/../includes/pages/admin_arrive.php'); require_once realpath(__DIR__ . '/../includes/pages/admin_free.php'); @@ -91,14 +145,12 @@ require_once realpath(__DIR__ . '/../includes/pages/user_questions.php'); require_once realpath(__DIR__ . '/../includes/pages/user_settings.php'); require_once realpath(__DIR__ . '/../includes/pages/user_shifts.php'); -require_once realpath(__DIR__ . '/../vendor/parsedown/Parsedown.php'); +/** + * Init application + */ session_start(); gettext_init(); -sql_connect($config['host'], $config['user'], $config['pw'], $config['db']); - load_auth(); - -?> diff --git a/includes/helper/email_helper.php b/includes/helper/email_helper.php index 462b5641..a2e25269 100644 --- a/includes/helper/email_helper.php +++ b/includes/helper/email_helper.php @@ -1,26 +1,50 @@ <?php -function engelsystem_email_to_user($recipient_user, $title, $message, $not_if_its_me = false) { - global $user; - - if ($not_if_its_me && $user['UID'] == $recipient_user['UID']) { - return true; - } - - gettext_locale($recipient_user['Sprache']); - - $message = sprintf(_("Hi %s,"), $recipient_user['Nick']) . "\n\n" . _("here is a message for you from the engelsystem:") . "\n\n" . $message . "\n\n" . _("This email is autogenerated and has not to be signed. You got this email because you are registered in the engelsystem."); - - gettext_locale(); - return engelsystem_email($recipient_user['email'], $title, $message); -} +/** + * @param array $recipient_user + * @param string $title + * @param string $message + * @param bool $not_if_its_me + * @return bool + */ +function engelsystem_email_to_user($recipient_user, $title, $message, $not_if_its_me = false) +{ + global $user; + + if ($not_if_its_me && $user['UID'] == $recipient_user['UID']) { + return true; + } + + gettext_locale($recipient_user['Sprache']); + + $message = sprintf(_('Hi %s,'), $recipient_user['Nick']) . "\n\n" + . _('here is a message for you from the engelsystem:') . "\n\n" + . $message . "\n\n" + . _('This email is autogenerated and has not to be signed. You got this email because you are registered in the engelsystem.'); -function engelsystem_email($address, $title, $message) { - global $no_reply_email; - $result = mail($address, $title, $message, sprintf("Content-Type: text/plain; charset=UTF-8\r\nFrom: Engelsystem <%s>", $no_reply_email)); - if ($result === false) { - engelsystem_error('Unable to send email.'); - } + gettext_locale(); + + return engelsystem_email($recipient_user['email'], $title, $message); } -?> +/** + * @param string $address + * @param string $title + * @param string $message + * @return bool + */ +function engelsystem_email($address, $title, $message) +{ + $result = mail( + $address, + $title, + $message, + "Content-Type: text/plain; charset=UTF-8\r\nFrom: Engelsystem <noreply@engelsystem.de>" + ); + + if ($result === false) { + engelsystem_error('Unable to send email.'); + } + + return true; +} diff --git a/includes/helper/error_helper.php b/includes/helper/error_helper.php index 58d0ac86..9314a57a 100644 --- a/includes/helper/error_helper.php +++ b/includes/helper/error_helper.php @@ -5,8 +5,7 @@ * * @param string $message */ -function engelsystem_error($message) { - raw_output($message); +function engelsystem_error($message) +{ + raw_output($message); } - -?>
\ No newline at end of file diff --git a/includes/helper/graph_helper.php b/includes/helper/graph_helper.php index 42a6c07a..12c7df6c 100644 --- a/includes/helper/graph_helper.php +++ b/includes/helper/graph_helper.php @@ -2,40 +2,42 @@ /** * Renders a bargraph - * @param string $key keyname of the x-axis - * @param array $row_names keynames for the data rows - * @param unknown $colors colors for the data rows - * @param unknown $data the data + * + * @param string $dom_id + * @param string $key key name of the x-axis + * @param array $row_names key names for the data rows + * @param array $colors colors for the data rows + * @param array $data the data + * @return string */ -function bargraph($dom_id, $key, $row_names, $colors, $data) { - $labels = []; - foreach ($data as $dataset) { - $labels[] = $dataset[$key]; - } - - $datasets = []; - foreach ($row_names as $row_key => $name) { - $values = []; +function bargraph($dom_id, $key, $row_names, $colors, $data) +{ + $labels = []; foreach ($data as $dataset) { - $values[] = $dataset[$row_key]; + $labels[] = $dataset[$key]; } - $datasets[] = [ - 'label' => $name, - 'fillColor' => $colors[$row_key], - 'data' => $values - ]; - } - - return '<canvas id="' . $dom_id . '" style="width: 100%; height: 300px;"></canvas> + + $datasets = []; + foreach ($row_names as $row_key => $name) { + $values = []; + foreach ($data as $dataset) { + $values[] = $dataset[$row_key]; + } + $datasets[] = [ + 'label' => $name, + 'fillColor' => $colors[$row_key], + 'data' => $values + ]; + } + + return '<canvas id="' . $dom_id . '" style="width: 100%; height: 300px;"></canvas> <script type="text/javascript"> $(function(){ var ctx = $("#' . $dom_id . '").get(0).getContext("2d"); var chart = new Chart(ctx).Bar(' . json_encode([ - 'labels' => $labels, - 'datasets' => $datasets - ]) . '); + 'labels' => $labels, + 'datasets' => $datasets + ]) . '); }); </script>'; } - -?>
\ No newline at end of file diff --git a/includes/helper/internationalization_helper.php b/includes/helper/internationalization_helper.php index a537ef3d..ed16de15 100644 --- a/includes/helper/internationalization_helper.php +++ b/includes/helper/internationalization_helper.php @@ -1,71 +1,76 @@ <?php -$locales = [ - 'de_DE.UTF-8' => "Deutsch", - 'en_US.UTF-8' => "English" -]; - -$default_locale = 'en_US.UTF-8'; /** * Return currently active locale + * + * @return string */ -function locale() { - return $_SESSION['locale']; +function locale() +{ + return $_SESSION['locale']; } /** * Returns two letter language code from currently active locale + * + * @return string */ -function locale_short() { - return substr(locale(), 0, 2); +function locale_short() +{ + return substr(locale(), 0, 2); } /** * Initializes gettext for internationalization and updates the sessions locale to use for translation. */ -function gettext_init() { - global $locales, $default_locale; +function gettext_init() +{ + $locales = config('locales'); + $default_locale = config('default_locale'); - if (isset($_REQUEST['set_locale']) && isset($locales[$_REQUEST['set_locale']])) { - $_SESSION['locale'] = $_REQUEST['set_locale']; - } elseif (! isset($_SESSION['locale'])) { - $_SESSION['locale'] = $default_locale; - } + if (isset($_REQUEST['set_locale']) && isset($locales[$_REQUEST['set_locale']])) { + $_SESSION['locale'] = $_REQUEST['set_locale']; + } elseif (!isset($_SESSION['locale'])) { + $_SESSION['locale'] = $default_locale; + } - gettext_locale(); - bindtextdomain('default', realpath(__DIR__ . '/../../locale')); - bind_textdomain_codeset('default', 'UTF-8'); - textdomain('default'); + gettext_locale(); + bindtextdomain('default', realpath(__DIR__ . '/../../locale')); + bind_textdomain_codeset('default', 'UTF-8'); + textdomain('default'); } /** * Swich gettext locale. * - * @param string $locale + * @param string $locale */ -function gettext_locale($locale = null) { - if ($locale == null) { - $locale = $_SESSION['locale']; - } - - putenv('LC_ALL=' . $locale); - setlocale(LC_ALL, $locale); +function gettext_locale($locale = null) +{ + if ($locale == null) { + $locale = $_SESSION['locale']; + } + + putenv('LC_ALL=' . $locale); + setlocale(LC_ALL, $locale); } /** * Renders language selection. * - * @return string + * @return array */ -function make_langselect() { - global $locales; - $URL = $_SERVER["REQUEST_URI"] . (strpos($_SERVER["REQUEST_URI"], "?") > 0 ? '&' : '?') . "set_locale="; - - $items = []; - foreach ($locales as $locale => $name) { - $items[] = toolbar_item_link(htmlspecialchars($URL) . $locale, '', '<img src="pic/flag/' . $locale . '.png" alt="' . $name . '" title="' . $name . '"> ' . $name); - } - return $items; -} +function make_langselect() +{ + $url = $_SERVER['REQUEST_URI'] . (strpos($_SERVER['REQUEST_URI'], '?') > 0 ? '&' : '?') . 'set_locale='; -?>
\ No newline at end of file + $items = []; + foreach (config('locales') as $locale => $name) { + $items[] = toolbar_item_link( + htmlspecialchars($url) . $locale, + '', + '<img src="pic/flag/' . $locale . '.png" alt="' . $name . '" title="' . $name . '"> ' . $name + ); + } + return $items; +} diff --git a/includes/helper/message_helper.php b/includes/helper/message_helper.php index 37fc84bb..1f429c27 100644 --- a/includes/helper/message_helper.php +++ b/includes/helper/message_helper.php @@ -2,52 +2,76 @@ /** * Gibt zwischengespeicherte Fehlermeldungen zurück und löscht den Zwischenspeicher + * + * @return string */ -function msg() { - if (! isset($_SESSION['msg'])) { - return ""; - } - $msg = $_SESSION['msg']; - $_SESSION['msg'] = ""; - return $msg; +function msg() +{ + if (!isset($_SESSION['msg'])) { + return ''; + } + $msg = $_SESSION['msg']; + $_SESSION['msg'] = ''; + return $msg; } /** * Rendert eine Information + * + * @param string $msg + * @param bool $immediately + * @return string */ -function info($msg, $immediatly = false) { - return alert('info', $msg, $immediatly); +function info($msg, $immediately = false) +{ + return alert('info', $msg, $immediately); } /** * Rendert eine Fehlermeldung + * + * @param string $msg + * @param bool $immediately + * @return string */ -function error($msg, $immediatly = false) { - return alert('danger', $msg, $immediatly); +function error($msg, $immediately = false) +{ + return alert('danger', $msg, $immediately); } /** * Rendert eine Erfolgsmeldung + * + * @param string $msg + * @param bool $immediately + * @return string */ -function success($msg, $immediatly = false) { - return alert('success', $msg, $immediatly); +function success($msg, $immediately = false) +{ + return alert('success', $msg, $immediately); } /** * Renders an alert with given alert-* class. + * + * @param string $class + * @param string $msg + * @param bool $immediately + * @return string|null */ -function alert($class, $msg, $immediatly = false) { - if ($immediatly) { - if ($msg == "") { - return ""; +function alert($class, $msg, $immediately = false) +{ + if ($immediately) { + if ($msg == '') { + return ''; + } + return '<div class="alert alert-' . $class . '">' . $msg . '</div>'; } - return '<div class="alert alert-' . $class . '">' . $msg . '</div>'; - } - - if (! isset($_SESSION['msg'])) { - $_SESSION['msg'] = ""; - } - $_SESSION['msg'] .= alert($class, $msg, true); -} -?>
\ No newline at end of file + if (!isset($_SESSION['msg'])) { + $_SESSION['msg'] = ''; + } + $_SESSION['msg'] .= alert($class, $msg, true); + + return null; +} diff --git a/includes/mailer/shifts_mailer.php b/includes/mailer/shifts_mailer.php index e1bf422b..5c0e4310 100644 --- a/includes/mailer/shifts_mailer.php +++ b/includes/mailer/shifts_mailer.php @@ -1,104 +1,129 @@ <?php -function mail_shift_change($old_shift, $new_shift) { - $users = ShiftEntries_by_shift($old_shift["SID"]); - $old_room = Room($old_shift["RID"]); - $new_room = Room($new_shift["RID"]); - - $noticable_changes = false; - - $message = _("A Shift you are registered on has changed:"); - $message .= "\n"; - - if ($old_shift["name"] != $new_shift["name"]) { - $message .= sprintf(_("* Shift type changed from %s to %s"), $old_shift["name"], $new_shift["name"]) . "\n"; - $noticable_changes = true; - } - - if ($old_shift["title"] != $new_shift["title"]) { - $message .= sprintf(_("* Shift title changed from %s to %s"), $old_shift["title"], $new_shift["title"]) . "\n"; - $noticable_changes = true; - } - - if ($old_shift["start"] != $new_shift["start"]) { - $message .= sprintf(_("* Shift Start changed from %s to %s"), date("Y-m-d H:i", $old_shift["start"]), date("Y-m-d H:i", $new_shift["start"])) . "\n"; - $noticable_changes = true; - } - - if ($old_shift["end"] != $new_shift["end"]) { - $message .= sprintf(_("* Shift End changed from %s to %s"), date("Y-m-d H:i", $old_shift["end"]), date("Y-m-d H:i", $new_shift["end"])) . "\n"; - $noticable_changes = true; - } - - if ($old_shift["RID"] != $new_shift["RID"]) { - $message .= sprintf(_("* Shift Location changed from %s to %s"), $old_room["Name"], $new_room["Name"]) . "\n"; - $noticable_changes = true; - } - - if (! $noticable_changes) { - // There are no changes worth sending an E-Mail - return; - } - - $message .= "\n"; - $message .= _("The updated Shift:") . "\n"; - - $message .= $new_shift["name"] . "\n"; - $message .= $new_shift["title"] . "\n"; - $message .= date("Y-m-d H:i", $new_shift["start"]) . " - " . date("H:i", $new_shift["end"]) . "\n"; - $message .= $new_room["Name"] . "\n"; - - foreach ($users as $user) { - if ($user["email_shiftinfo"]) { - engelsystem_email_to_user($user, '[engelsystem] ' . _("Your Shift has changed"), $message, true); +/** + * @param array $old_shift + * @param array $new_shift + */ +function mail_shift_change($old_shift, $new_shift) +{ + $users = ShiftEntries_by_shift($old_shift['SID']); + $old_room = Room($old_shift['RID']); + $new_room = Room($new_shift['RID']); + + $noticeable_changes = false; + + $message = _('A Shift you are registered on has changed:'); + $message .= "\n"; + + if ($old_shift['name'] != $new_shift['name']) { + $message .= sprintf(_('* Shift type changed from %s to %s'), $old_shift['name'], $new_shift['name']) . "\n"; + $noticeable_changes = true; + } + + if ($old_shift['title'] != $new_shift['title']) { + $message .= sprintf(_('* Shift title changed from %s to %s'), $old_shift['title'], $new_shift['title']) . "\n"; + $noticeable_changes = true; + } + + if ($old_shift['start'] != $new_shift['start']) { + $message .= sprintf( + _('* Shift Start changed from %s to %s'), + date('Y-m-d H:i', $old_shift['start']), + date('Y-m-d H:i', $new_shift['start']) + ) . "\n"; + $noticeable_changes = true; } - } -} -function mail_shift_delete($shift) { - $users = ShiftEntries_by_shift($shift["SID"]); - $room = Room($shift["RID"]); - - $message = _("A Shift you are registered on was deleted:") . "\n"; - - $message .= $shift["name"] . "\n"; - $message .= $shift["title"] . "\n"; - $message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n"; - $message .= $room["Name"] . "\n"; - - foreach ($users as $user) { - if ($user["email_shiftinfo"]) { - engelsystem_email_to_user($user, '[engelsystem] ' . _("Your Shift was deleted"), $message, true); + if ($old_shift['end'] != $new_shift['end']) { + $message .= sprintf( + _('* Shift End changed from %s to %s'), + date('Y-m-d H:i', $old_shift['end']), + date('Y-m-d H:i', $new_shift['end']) + ) . "\n"; + $noticeable_changes = true; + } + + if ($old_shift['RID'] != $new_shift['RID']) { + $message .= sprintf(_('* Shift Location changed from %s to %s'), $old_room['Name'], $new_room['Name']) . "\n"; + $noticeable_changes = true; + } + + if (!$noticeable_changes) { + // There are no changes worth sending an E-Mail + return; + } + + $message .= "\n"; + $message .= _('The updated Shift:') . "\n"; + + $message .= $new_shift['name'] . "\n"; + $message .= $new_shift['title'] . "\n"; + $message .= date('Y-m-d H:i', $new_shift['start']) . ' - ' . date('H:i', $new_shift['end']) . "\n"; + $message .= $new_room['Name'] . "\n"; + + foreach ($users as $user) { + if ($user['email_shiftinfo']) { + engelsystem_email_to_user($user, '[engelsystem] ' . _('Your Shift has changed'), $message, true); + } } - } } -function mail_shift_assign($user, $shift) { - if ($user["email_shiftinfo"]) { - $room = Room($shift["RID"]); - - $message = _("You have been assigned to a Shift:") . "\n"; - $message .= $shift["name"] . "\n"; - $message .= $shift["title"] . "\n"; - $message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n"; - $message .= $room["Name"] . "\n"; - - engelsystem_email_to_user($user, '[engelsystem] ' . _("Assigned to Shift"), $message, true); - } +/** + * @param array $shift + */ +function mail_shift_delete($shift) +{ + $users = ShiftEntries_by_shift($shift['SID']); + $room = Room($shift['RID']); + + $message = _('A Shift you are registered on was deleted:') . "\n"; + + $message .= $shift['name'] . "\n"; + $message .= $shift['title'] . "\n"; + $message .= date('Y-m-d H:i', $shift['start']) . ' - ' . date('H:i', $shift['end']) . "\n"; + $message .= $room['Name'] . "\n"; + + foreach ($users as $user) { + if ($user['email_shiftinfo']) { + engelsystem_email_to_user($user, '[engelsystem] ' . _('Your Shift was deleted'), $message, true); + } + } } -function mail_shift_removed($user, $shift) { - if ($user["email_shiftinfo"]) { - $room = Room($shift["RID"]); - - $message = _("You have been removed from a Shift:") . "\n"; - $message .= $shift["name"] . "\n"; - $message .= $shift["title"] . "\n"; - $message .= date("Y-m-d H:i", $shift["start"]) . " - " . date("H:i", $shift["end"]) . "\n"; - $message .= $room["Name"] . "\n"; - - engelsystem_email_to_user($user, '[engelsystem] ' . _("Removed from Shift"), $message, true); - } +/** + * @param array $user + * @param array $shift + */ +function mail_shift_assign($user, $shift) +{ + if (!$user['email_shiftinfo']) { + return; + } + + $room = Room($shift['RID']); + + $message = _('You have been assigned to a Shift:') . "\n"; + $message .= $shift['name'] . "\n"; + $message .= $shift['title'] . "\n"; + $message .= date('Y-m-d H:i', $shift['start']) . ' - ' . date('H:i', $shift['end']) . "\n"; + $message .= $room['Name'] . "\n"; + + engelsystem_email_to_user($user, '[engelsystem] ' . _('Assigned to Shift'), $message, true); } -?> +function mail_shift_removed($user, $shift) +{ + if (!$user['email_shiftinfo']) { + return; + } + + $room = Room($shift['RID']); + + $message = _('You have been removed from a Shift:') . "\n"; + $message .= $shift['name'] . "\n"; + $message .= $shift['title'] . "\n"; + $message .= date('Y-m-d H:i', $shift['start']) . ' - ' . date('H:i', $shift['end']) . "\n"; + $message .= $room['Name'] . "\n"; + + engelsystem_email_to_user($user, '[engelsystem] ' . _('Removed from Shift'), $message, true); +} diff --git a/includes/mailer/users_mailer.php b/includes/mailer/users_mailer.php index b08af92b..b3f335d7 100644 --- a/includes/mailer/users_mailer.php +++ b/includes/mailer/users_mailer.php @@ -1,9 +1,14 @@ <?php /** - * @param User $user_source + * @param array $user + * @return bool */ -function mail_user_delete($user) { - engelsystem_email_to_user($user, '[engelsystem] ' . _("Your account has been deleted"), _("Your angelsystem account has been deleted. If you have any questions regarding your account deletion, please contact heaven.")); +function mail_user_delete($user) +{ + return engelsystem_email_to_user( + $user, + '[engelsystem] ' . _('Your account has been deleted'), + _('Your angelsystem account has been deleted. If you have any questions regarding your account deletion, please contact heaven.') + ); } -?>
\ No newline at end of file diff --git a/includes/model/AngelType_model.php b/includes/model/AngelType_model.php index 8d6a89b3..d437f526 100644 --- a/includes/model/AngelType_model.php +++ b/includes/model/AngelType_model.php @@ -1,236 +1,298 @@ <?php + +use Engelsystem\Database\DB; use Engelsystem\ValidationResult; /** * Returns an array containing the basic attributes of angeltypes. * FIXME! This is the big sign for needing entity objects */ -function AngelType_new() { - return [ - 'id' => null, - 'name' => "", - 'restricted' => false, - 'no_self_signup' => false, - 'description' => '', - 'requires_driver_license' => false, - 'contact_user_id' => null, - 'contact_name' => null, - 'contact_dect' => null, - 'contact_email' => null - ]; +function AngelType_new() +{ + return [ + 'id' => null, + 'name' => '', + 'restricted' => false, + 'no_self_signup' => false, + 'description' => '', + 'requires_driver_license' => false, + 'contact_user_id' => null, + 'contact_name' => null, + 'contact_dect' => null, + 'contact_email' => null + ]; } /** * Validates the contact user * - * @param Angeltype $angeltype - * The angeltype + * @param array $angeltype The angeltype * @return ValidationResult */ -function AngelType_validate_contact_user_id($angeltype) { - if (! isset($angeltype['contact_user_id'])) { - return new ValidationResult(true, null); - } - if (isset($angeltype['contact_name']) || isset($angeltype['contact_dect']) || isset($angeltype['contact_email'])) { - return new ValidationResult(false, $angeltype['contact_user_id']); - } - if (User($angeltype['contact_user_id']) == null) { - return new ValidationResult(false, $angeltype['contact_user_id']); - } - return new ValidationResult(true, $angeltype['contact_user_id']); +function AngelType_validate_contact_user_id($angeltype) +{ + if (!isset($angeltype['contact_user_id'])) { + return new ValidationResult(true, null); + } + if (isset($angeltype['contact_name']) || isset($angeltype['contact_dect']) || isset($angeltype['contact_email'])) { + return new ValidationResult(false, $angeltype['contact_user_id']); + } + if (User($angeltype['contact_user_id']) == null) { + return new ValidationResult(false, $angeltype['contact_user_id']); + } + return new ValidationResult(true, $angeltype['contact_user_id']); } /** * Returns contact data (name, dect, email) for given angeltype or null * - * @param Angeltype $angeltype - * The angeltype + * @param array $angeltype The angeltype + * @return array|null */ -function AngelType_contact_info($angeltype) { - if (isset($angeltype['contact_user_id'])) { - $contact_user = User($angeltype['contact_user_id']); - $contact_data = [ - 'contact_name' => $contact_user['Nick'], - 'contact_dect' => $contact_user['DECT'] - ]; - if ($contact_user['email_by_human_allowed']) { - $contact_data['contact_email'] = $contact_user['email']; +function AngelType_contact_info($angeltype) +{ + if (isset($angeltype['contact_user_id'])) { + $contact_user = User($angeltype['contact_user_id']); + $contact_data = [ + 'contact_name' => $contact_user['Nick'], + 'contact_dect' => $contact_user['DECT'] + ]; + if ($contact_user['email_by_human_allowed']) { + $contact_data['contact_email'] = $contact_user['email']; + } + return $contact_data; } - return $contact_data; - } - if (isset($angeltype['contact_name'])) { - return [ - 'contact_name' => $angeltype['contact_name'], - 'contact_dect' => $angeltype['contact_dect'], - 'contact_email' => $angeltype['contact_email'] - ]; - } - return null; + if (isset($angeltype['contact_name'])) { + return [ + 'contact_name' => $angeltype['contact_name'], + 'contact_dect' => $angeltype['contact_dect'], + 'contact_email' => $angeltype['contact_email'] + ]; + } + + return null; } /** * Delete an Angeltype. * - * @param Angeltype $angeltype + * @param array $angeltype + * @return bool */ -function AngelType_delete($angeltype) { - $result = sql_query(" - DELETE FROM `AngelTypes` - WHERE `id`='" . sql_escape($angeltype['id']) . "' - LIMIT 1"); - if ($result === false) { - engelsystem_error("Unable to delete angeltype."); - } - engelsystem_log("Deleted angeltype: " . AngelType_name_render($angeltype)); - return $result; +function AngelType_delete($angeltype) +{ + $result = DB::delete(' + DELETE FROM `AngelTypes` + WHERE `id`=? + LIMIT 1 + ', [$angeltype['id']]); + if (is_null($result)) { + engelsystem_error('Unable to delete angeltype.'); + } + engelsystem_log('Deleted angeltype: ' . AngelType_name_render($angeltype)); + return true; } /** * Update Angeltype. * - * @param Angeltype $angeltype - * The angeltype + * @param array $angeltype The angeltype + * @return bool */ -function AngelType_update($angeltype) { - $result = sql_query(" - UPDATE `AngelTypes` SET - `name`='" . sql_escape($angeltype['name']) . "', - `restricted`=" . sql_bool($angeltype['restricted']) . ", - `description`='" . sql_escape($angeltype['description']) . "', - `requires_driver_license`=" . sql_bool($angeltype['requires_driver_license']) . ", - `no_self_signup`=" . sql_bool($angeltype['no_self_signup']) . ", - `contact_user_id`=" . sql_null($angeltype['contact_user_id']) . ", - `contact_name`=" . sql_null($angeltype['contact_name']) . ", - `contact_dect`=" . sql_null($angeltype['contact_dect']) . ", - `contact_email`=" . sql_null($angeltype['contact_email']) . " - WHERE `id`='" . sql_escape($angeltype['id']) . "'"); - if ($result === false) { - engelsystem_error("Unable to update angeltype."); - } - engelsystem_log("Updated angeltype: " . $angeltype['name'] . ($angeltype['restricted'] ? ", restricted" : "") . ($angeltype['no_self_signup'] ? ", no_self_signup" : "") . ($angeltype['requires_driver_license'] ? ", requires driver license" : "")); - return $result; +function AngelType_update($angeltype) +{ + $result = DB::update(' + UPDATE `AngelTypes` SET + `name` = ?, + `restricted` = ?, + `description` = ?, + `requires_driver_license` = ?, + `no_self_signup` = ?, + `contact_user_id` = ?, + `contact_name` = ?, + `contact_dect` = ?, + `contact_email` = ? + WHERE `id` = ?', + [ + $angeltype['name'], + $angeltype['restricted'], + $angeltype['description'], + $angeltype['requires_driver_license'], + $angeltype['no_self_signup'], + $angeltype['contact_user_id'], + $angeltype['contact_name'], + $angeltype['contact_dect'], + $angeltype['contact_email'], + $angeltype['id'], + ] + ); + if (is_null($result)) { + engelsystem_error('Unable to update angeltype.'); + } + engelsystem_log( + 'Updated angeltype: ' . $angeltype['name'] . ($angeltype['restricted'] ? ', restricted' : '') + . ($angeltype['no_self_signup'] ? ', no_self_signup' : '') + . ($angeltype['requires_driver_license'] ? ', requires driver license' : '') + ); + return true; } /** * Create an Angeltype. * - * @param Angeltype $angeltype - * The angeltype - * @return the created angeltype + * @param array $angeltype The angeltype + * @return array the created angeltype */ -function AngelType_create($angeltype) { - $result = sql_query(" - INSERT INTO `AngelTypes` SET - `name`='" . sql_escape($angeltype['name']) . "', - `restricted`=" . sql_bool($angeltype['restricted']) . ", - `description`='" . sql_escape($angeltype['description']) . "', - `requires_driver_license`=" . sql_bool($angeltype['requires_driver_license']) . ", - `no_self_signup`=" . sql_bool($angeltype['no_self_signup']) . ", - `contact_user_id`=" . sql_null($angeltype['contact_user_id']) . ", - `contact_name`=" . sql_null($angeltype['contact_name']) . ", - `contact_dect`=" . sql_null($angeltype['contact_dect']) . ", - `contact_email`=" . sql_null($angeltype['contact_email'])); - if ($result === false) { - engelsystem_error("Unable to create angeltype."); - } - $angeltype['id'] = sql_id(); - engelsystem_log("Created angeltype: " . $angeltype['name'] . ($angeltype['restricted'] ? ", restricted" : "") . ($angeltype['requires_driver_license'] ? ", requires driver license" : "")); - return $angeltype; +function AngelType_create($angeltype) +{ + $result = DB::insert(' + INSERT INTO `AngelTypes` ( + `name`, + `restricted`, + `description`, + `requires_driver_license`, + `no_self_signup`, + `contact_user_id`, + `contact_name`, + `contact_dect`, + `contact_email` + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ', + [ + $angeltype['name'], + (bool)$angeltype['restricted'], + $angeltype['description'], + (bool)$angeltype['requires_driver_license'], + (bool)$angeltype['no_self_signup'], + $angeltype['contact_user_id'], + $angeltype['contact_name'], + $angeltype['contact_dect'], + $angeltype['contact_email'], + ] + ); + if (is_null($result)) { + engelsystem_error('Unable to create angeltype.'); + } + $angeltype['id'] = DB::getPdo()->lastInsertId(); + engelsystem_log( + 'Created angeltype: ' . $angeltype['name'] + . ($angeltype['restricted'] ? ', restricted' : '') + . ($angeltype['requires_driver_license'] ? ', requires driver license' : '') + ); + return $angeltype; } /** * Validates a name for angeltypes. * Returns ValidationResult containing validation success and validated name. * - * @param string $name - * Wanted name for the angeltype - * @param AngelType $angeltype - * The angeltype the name is for + * @param string $name Wanted name for the angeltype + * @param array $angeltype The angeltype the name is for + * * @return ValidationResult result and validated name */ -function AngelType_validate_name($name, $angeltype) { - $name = strip_item($name); - if ($name == "") { - return new ValidationResult(false, ""); - } - if ($angeltype != null && isset($angeltype['id'])) { - $valid = sql_num_query(" - SELECT * - FROM `AngelTypes` - WHERE `name`='" . sql_escape($name) . "' - AND NOT `id`='" . sql_escape($angeltype['id']) . "' - LIMIT 1") == 0; +function AngelType_validate_name($name, $angeltype) +{ + $name = strip_item($name); + if ($name == '') { + return new ValidationResult(false, ''); + } + if ($angeltype != null && isset($angeltype['id'])) { + $valid = (count(DB::select(' + SELECT `id` + FROM `AngelTypes` + WHERE `name`=? + AND NOT `id`=? + LIMIT 1 + ', [$name, $angeltype['id']])) == 0); + return new ValidationResult($valid, $name); + } + $valid = (count(DB::select(' + SELECT `id` + FROM `AngelTypes` + WHERE `name`=? + LIMIT 1', [$name])) == 0); return new ValidationResult($valid, $name); - } - $valid = sql_num_query(" - SELECT `id` - FROM `AngelTypes` - WHERE `name`='" . sql_escape($name) . "' - LIMIT 1") == 0; - return new ValidationResult($valid, $name); } /** * Returns all angeltypes and subscription state to each of them for given user. * - * @param User $user + * @param array $user + * @return array */ -function AngelTypes_with_user($user) { - $result = sql_select(" - SELECT `AngelTypes`.*, - `UserAngelTypes`.`id` as `user_angeltype_id`, +function AngelTypes_with_user($user) +{ + $result = DB::select(' + SELECT `AngelTypes`.*, + `UserAngelTypes`.`id` AS `user_angeltype_id`, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`supporter` - FROM `AngelTypes` - LEFT JOIN `UserAngelTypes` ON `AngelTypes`.`id`=`UserAngelTypes`.`angeltype_id` - AND `UserAngelTypes`.`user_id`=" . $user['UID'] . " - ORDER BY `name`"); - if ($result === false) { - engelsystem_error("Unable to load angeltypes."); - } - return $result; + FROM `AngelTypes` + LEFT JOIN `UserAngelTypes` ON `AngelTypes`.`id`=`UserAngelTypes`.`angeltype_id` + AND `UserAngelTypes`.`user_id` = ? + ORDER BY `name`', [$user['UID']]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load angeltypes.'); + } + return $result; } /** * Returns all angeltypes. + * + * @return array */ -function AngelTypes() { - $result = sql_select(" - SELECT * - FROM `AngelTypes` - ORDER BY `name`"); - if ($result === false) { - engelsystem_error("Unable to load angeltypes."); - } - return $result; +function AngelTypes() +{ + $result = DB::select(' + SELECT * + FROM `AngelTypes` + ORDER BY `name`'); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load angeltypes.'); + } + return $result; } /** * Returns AngelType id array + * + * @return array */ -function AngelType_ids() { - $result = sql_select("SELECT `id` FROM `AngelTypes`"); - if ($result === false) { - engelsystem_error("Unable to load angeltypes."); - } - return select_array($result, 'id', 'id'); +function AngelType_ids() +{ + $result = DB::select('SELECT `id` FROM `AngelTypes`'); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load angeltypes.'); + } + return select_array($result, 'id', 'id'); } /** * Returns angelType by id. * - * @param $angeltype_id angelType - * ID + * @param int $angeltype_id angelType ID + * @return array|null */ -function AngelType($angeltype_id) { - $angelType_source = sql_select("SELECT * FROM `AngelTypes` WHERE `id`='" . sql_escape($angeltype_id) . "'"); - if ($angelType_source === false) { - engelsystem_error("Unable to load angeltype."); - } - if (count($angelType_source) > 0) { - return $angelType_source[0]; - } - return null; -} +function AngelType($angeltype_id) +{ + $angelType_source = DB::select( + 'SELECT * FROM `AngelTypes` WHERE `id`=?', + [$angeltype_id] + ); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load angeltype.'); + } -?> + if (empty($angelType_source)) { + return null; + } + + return array_shift($angelType_source); +} diff --git a/includes/model/EventConfig_model.php b/includes/model/EventConfig_model.php index de5073d0..f5846870 100644 --- a/includes/model/EventConfig_model.php +++ b/includes/model/EventConfig_model.php @@ -1,46 +1,85 @@ <?php +use Engelsystem\Database\DB; + /** * Get event config. + * + * @return array|null */ -function EventConfig() { - $event_config = sql_select("SELECT * FROM `EventConfig` LIMIT 1"); - if ($event_config === false) { - engelsystem_error("Unable to load event config."); - return false; - } - if (count($event_config) > 0) { - return $event_config[0]; - } - return null; +function EventConfig() +{ + $event_config = DB::select('SELECT * FROM `EventConfig` LIMIT 1'); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load event config.'); + return null; + } + + if (empty($event_config)) { + return null; + } + + return array_shift($event_config); } /** * Update event config. * - * @param string $event_name - * @param int $buildup_start_date - * @param int $event_start_date - * @param int $event_end_date - * @param int $teardown_end_date - * @param string $event_welcome_msg + * @param string $event_name + * @param int $buildup_start_date + * @param int $event_start_date + * @param int $event_end_date + * @param int $teardown_end_date + * @param string $event_welcome_msg + * @return bool */ -function EventConfig_update($event_name, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date, $event_welcome_msg) { - if (EventConfig() == null) { - return sql_query("INSERT INTO `EventConfig` SET - `event_name`=" . sql_null($event_name) . ", - `buildup_start_date`=" . sql_null($buildup_start_date) . ", - `event_start_date`=" . sql_null($event_start_date) . ", - `event_end_date`=" . sql_null($event_end_date) . ", - `teardown_end_date`=" . sql_null($teardown_end_date) . ", - `event_welcome_msg`=" . sql_null($event_welcome_msg)); - } - return sql_query("UPDATE `EventConfig` SET - `event_name`=" . sql_null($event_name) . ", - `buildup_start_date`=" . sql_null($buildup_start_date) . ", - `event_start_date`=" . sql_null($event_start_date) . ", - `event_end_date`=" . sql_null($event_end_date) . ", - `teardown_end_date`=" . sql_null($teardown_end_date) . ", - `event_welcome_msg`=" . sql_null($event_welcome_msg)); +function EventConfig_update( + $event_name, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date, + $event_welcome_msg +) { + if (EventConfig() == null) { + return DB::insert(' + INSERT INTO `EventConfig` ( + `event_name`, + `buildup_start_date`, + `event_start_date`, + `event_end_date`, + `teardown_end_date`, + `event_welcome_msg` + ) + VALUES (?, ?, ?, ?, ?, ?) + ', + [ + $event_name, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date, + $event_welcome_msg + ] + ); + } + + return (bool)DB::update(' + UPDATE `EventConfig` SET + `event_name` = ?, + `buildup_start_date` = ?, + `event_start_date` = ?, + `event_end_date` = ?, + `teardown_end_date` = ?, + `event_welcome_msg` = ? + ', + [ + $event_name, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date, + $event_welcome_msg, + ] + ); } -?> diff --git a/includes/model/LogEntries_model.php b/includes/model/LogEntries_model.php index 09bd03dc..0e11bf8e 100644 --- a/includes/model/LogEntries_model.php +++ b/includes/model/LogEntries_model.php @@ -1,38 +1,62 @@ <?php +use Engelsystem\Database\DB; + /** * Creates a log entry. * - * @param $nick Username - * @param $message Log - * Message + * @param string $nick Username + * @param string $message Log Message + * @return bool */ -function LogEntry_create($nick, $message) { - return sql_query("INSERT INTO `LogEntries` SET `timestamp`='" . sql_escape(time()) . "', `nick`='" . sql_escape($nick) . "', `message`='" . sql_escape($message) . "'"); +function LogEntry_create($nick, $message) +{ + return DB::insert(' + INSERT INTO `LogEntries` (`timestamp`, `nick`, `message`) + VALUES(?, ?, ?) + ', [time(), $nick, $message]); } /** * Returns log entries with maximum count of 10000. + * + * @return array */ -function LogEntries() { - return sql_select("SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000"); +function LogEntries() +{ + return DB::select('SELECT * FROM `LogEntries` ORDER BY `timestamp` DESC LIMIT 10000'); } /** * Returns log entries filtered by a keyword + * + * @param string $keyword + * @return array */ -function LogEntries_filter($keyword) { - if ($keyword == "") { - return LogEntries(); - } - return sql_select("SELECT * FROM `LogEntries` WHERE `nick` LIKE '%" . sql_escape($keyword) . "%' OR `message` LIKE '%" . sql_escape($keyword) . "%' ORDER BY `timestamp` DESC"); +function LogEntries_filter($keyword) +{ + if ($keyword == '') { + return LogEntries(); + } + + $keyword = '%' . $keyword . '%'; + return DB::select(' + SELECT * + FROM `LogEntries` + WHERE `nick` LIKE ? + OR `message` LIKE ? + ORDER BY `timestamp` DESC + ', + [$keyword, $keyword] + ); } /** * Delete all log entries. + * + * @return bool */ -function LogEntries_clear_all() { - return sql_query("TRUNCATE `LogEntries`"); +function LogEntries_clear_all() +{ + return DB::statement('TRUNCATE `LogEntries`'); } - -?> diff --git a/includes/model/Message_model.php b/includes/model/Message_model.php index 652b60ea..ebd4b37e 100644 --- a/includes/model/Message_model.php +++ b/includes/model/Message_model.php @@ -1,27 +1,30 @@ <?php +use Engelsystem\Database\DB; + /** * Returns Message id array + * + * @return array */ -function Message_ids() { - return sql_select("SELECT `id` FROM `Messages`"); +function Message_ids() +{ + return DB::select('SELECT `id` FROM `Messages`'); } /** * Returns message by id. * - * @param $message_id message - * ID + * @param int $message_id message ID + * @return array|null */ -function Message($message_id) { - $message_source = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); - if ($message_source === false) { - return false; - } - if (count($message_source) > 0) { - return $message_source[0]; - } - return null; +function Message($message_id) +{ + $message_source = DB::select('SELECT * FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]); + if (empty($message_source)) { + return null; + } + return array_shift($message_source); } /** @@ -29,23 +32,39 @@ function Message($message_id) { * TODO: global $user con not be used in model! * send message * - * @param $receiver_user_id User - * ID of Reciever - * @param $text Text - * of Message + * @param int $receiver_user_id User ID of Reciever + * @param string $text Text of Message + * @return bool */ -function Message_send($receiver_user_id, $text) { - global $user; - - $text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($text)); - $receiver_user_id = preg_replace("/([^0-9]{1,})/ui", '', strip_tags($receiver_user_id)); - - if (($text != "" && is_numeric($receiver_user_id)) && (sql_num_query("SELECT * FROM `User` WHERE `UID`='" . sql_escape($receiver_user_id) . "' AND NOT `UID`='" . sql_escape($user['UID']) . "' LIMIT 1") > 0)) { - sql_query("INSERT INTO `Messages` SET `Datum`='" . sql_escape(time()) . "', `SUID`='" . sql_escape($user['UID']) . "', `RUID`='" . sql_escape($receiver_user_id) . "', `Text`='" . sql_escape($text) . "'"); - return true; - } - - return false; -} +function Message_send($receiver_user_id, $text) +{ + global $user; -?>
\ No newline at end of file + $text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($text)); + $receiver_user_id = preg_replace('/([^\d]{1,})/ui', '', strip_tags($receiver_user_id)); + + if ( + ($text != '' && is_numeric($receiver_user_id)) + && count(DB::select(' + SELECT `UID` + FROM `User` + WHERE `UID` = ? + AND NOT `UID` = ? + LIMIT 1 + ', [$receiver_user_id, $user['UID']])) > 0 + ) { + return DB::insert(' + INSERT INTO `Messages` (`Datum`, `SUID`, `RUID`, `Text`) + VALUES(?, ?, ?, ?) + ', + [ + time(), + $user['UID'], + $receiver_user_id, + $text + ] + ); + } + + return false; +} diff --git a/includes/model/NeededAngelTypes_model.php b/includes/model/NeededAngelTypes_model.php index 3bd3660f..97b085f0 100644 --- a/includes/model/NeededAngelTypes_model.php +++ b/includes/model/NeededAngelTypes_model.php @@ -1,5 +1,7 @@ <?php +use Engelsystem\Database\DB; + /** * Entity needed angeltypes describes how many angels of given type are needed for a shift or in a room. */ @@ -7,99 +9,107 @@ /** * Insert a new needed angel type. * - * @param int $shift_id - * The shift. Can be null, but then a room_id must be given. - * @param int $angeltype_id - * The angeltype - * @param int $room_id - * The room. Can be null, but then a shift_id must be given. - * @param int $count - * How many angels are needed? + * @param int $shift_id The shift. Can be null, but then a room_id must be given. + * @param int $angeltype_id The angeltype + * @param int $room_id The room. Can be null, but then a shift_id must be given. + * @param int $count How many angels are needed? + * @return int|false */ -function NeededAngelType_add($shift_id, $angeltype_id, $room_id, $count) { - $result = sql_query(" - INSERT INTO `NeededAngelTypes` SET - `shift_id`=" . sql_null($shift_id) . ", - `angel_type_id`='" . sql_escape($angeltype_id) . "', - `room_id`=" . sql_null($room_id) . ", - `count`='" . sql_escape($count) . "'"); - if ($result === false) { - return false; - } - return sql_id(); +function NeededAngelType_add($shift_id, $angeltype_id, $room_id, $count) +{ + $result = DB::insert(' + INSERT INTO `NeededAngelTypes` ( `shift_id`, `angel_type_id`, `room_id`, `count`) + VALUES (?, ?, ?, ?) + ', + [ + $shift_id, + $angeltype_id, + $room_id, + $count, + ]); + if ($result === false) { + return false; + } + + return DB::getPdo()->lastInsertId(); } /** * Deletes all needed angel types from given shift. * - * @param int $shift_id - * id of the shift + * @param int $shift_id id of the shift + * @return int count of affected rows */ -function NeededAngelTypes_delete_by_shift($shift_id) { - return sql_query("DELETE FROM `NeededAngelTypes` WHERE `shift_id`='" . sql_escape($shift_id) . "'"); +function NeededAngelTypes_delete_by_shift($shift_id) +{ + return (int)DB::delete('DELETE FROM `NeededAngelTypes` WHERE `shift_id` = ?', [$shift_id]); } /** * Deletes all needed angel types from given room. * - * @param int $room_id - * id of the room + * @param int $room_id id of the room + * @return int count of affected rows */ -function NeededAngelTypes_delete_by_room($room_id) { - return sql_query("DELETE FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($room_id) . "'"); +function NeededAngelTypes_delete_by_room($room_id) +{ + return (int)DB::delete( + 'DELETE FROM `NeededAngelTypes` WHERE `room_id` = ?', + [$room_id] + ); } /** * Returns all needed angeltypes and already taken needs. * - * @param int $shiftID - * id of shift + * @param int $shiftId id of shift + * @return array */ -function NeededAngelTypes_by_shift($shiftId) { - $needed_angeltypes_source = sql_select(" +function NeededAngelTypes_by_shift($shiftId) +{ + $needed_angeltypes_source = DB::select(' SELECT `NeededAngelTypes`.*, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` FROM `NeededAngelTypes` JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id` - WHERE `shift_id`='" . sql_escape($shiftId) . "' + WHERE `shift_id` = ? AND `count` > 0 - ORDER BY `room_id` DESC - "); - if ($needed_angeltypes_source === false) { - engelsystem_error("Unable to load needed angeltypes."); - } - - // Use settings from room - if (count($needed_angeltypes_source) == 0) { - $needed_angeltypes_source = sql_select(" + ORDER BY `room_id` DESC', + [$shiftId] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load needed angeltypes.'); + } + + // Use settings from room + if (count($needed_angeltypes_source) == 0) { + $needed_angeltypes_source = DB::select(' SELECT `NeededAngelTypes`.*, `AngelTypes`.`name`, `AngelTypes`.`restricted` FROM `NeededAngelTypes` JOIN `AngelTypes` ON `AngelTypes`.`id` = `NeededAngelTypes`.`angel_type_id` JOIN `Shifts` ON `Shifts`.`RID` = `NeededAngelTypes`.`room_id` - WHERE `Shifts`.`SID`='" . sql_escape($shiftId) . "' + WHERE `Shifts`.`SID` = ? AND `count` > 0 ORDER BY `room_id` DESC - "); - if ($needed_angeltypes_source === false) { - engelsystem_error("Unable to load needed angeltypes."); + ', [$shiftId]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load needed angeltypes.'); + } } - } - - $shift_entries = ShiftEntries_by_shift($shiftId); - $needed_angeltypes = []; - foreach ($needed_angeltypes_source as $angeltype) { - $angeltype['shift_entries'] = []; - $angeltype['taken'] = 0; - foreach ($shift_entries as $shift_entry) { - if ($shift_entry['TID'] == $angeltype['angel_type_id'] && $shift_entry['freeloaded'] == 0) { - $angeltype['taken'] ++; - $angeltype['shift_entries'][] = $shift_entry; - } + + $shift_entries = ShiftEntries_by_shift($shiftId); + $needed_angeltypes = []; + foreach ($needed_angeltypes_source as $angeltype) { + $angeltype['shift_entries'] = []; + $angeltype['taken'] = 0; + foreach ($shift_entries as $shift_entry) { + if ($shift_entry['TID'] == $angeltype['angel_type_id'] && $shift_entry['freeloaded'] == 0) { + $angeltype['taken']++; + $angeltype['shift_entries'][] = $shift_entry; + } + } + + $needed_angeltypes[] = $angeltype; } - - $needed_angeltypes[] = $angeltype; - } - - return $needed_angeltypes; -} -?>
\ No newline at end of file + return $needed_angeltypes; +} diff --git a/includes/model/Room_model.php b/includes/model/Room_model.php index 14935de0..c8399bc4 100644 --- a/includes/model/Room_model.php +++ b/includes/model/Room_model.php @@ -1,60 +1,82 @@ <?php +use Engelsystem\Database\DB; + /** * returns a list of rooms. + * * @param boolean $show_all returns also hidden rooms when true + * @return array */ -function Rooms($show_all = false) { - return sql_select("SELECT * FROM `Room`" . ($show_all ? "" : " WHERE `show`='Y'") . " ORDER BY `Name`"); +function Rooms($show_all = false) +{ + return DB::select('SELECT * FROM `Room`' . ($show_all ? '' : ' WHERE `show`=\'Y\'') . ' ORDER BY `Name`'); } /** * Delete a room * - * @param int $room_id + * @param int $room_id + * @return bool */ -function Room_delete($room_id) { - return sql_query("DELETE FROM `Room` WHERE `RID`=" . sql_escape($room_id)); +function Room_delete($room_id) +{ + return DB::delete('DELETE FROM `Room` WHERE `RID` = ?', [$room_id]); } /** * Create a new room * - * @param string $name - * Name of the room - * @param boolean $from_frab - * Is this a frab imported room? - * @param boolean $public - * Is the room visible for angels? + * @param string $name Name of the room + * @param boolean $from_frab Is this a frab imported room? + * @param boolean $public Is the room visible for angels? + * @param int $number Room number + * @return false|int */ -function Room_create($name, $from_frab, $public) { - $result = sql_query(" - INSERT INTO `Room` SET - `Name`='" . sql_escape($name) . "', - `FromPentabarf`='" . sql_escape($from_frab ? 'Y' : '') . "', - `show`='" . sql_escape($public ? 'Y' : '') . "', - `Number`=0"); - if ($result === false) { - return false; - } - return sql_id(); +function Room_create($name, $from_frab, $public, $number = null) +{ + $result = DB::insert(' + INSERT INTO `Room` (`Name`, `FromPentabarf`, `show`, `Number`) + VALUES (?, ?, ?, ?) + ', + [ + $name, + $from_frab ? 'Y' : '', + $public ? 'Y' : '', + (int)$number, + ] + ); + if (!$result) { + return false; + } + + return DB::getPdo()->lastInsertId(); } /** * Returns room by id. * - * @param $room_id RID + * @param int $room_id RID + * @param bool $show_only + * @return array|false */ -function Room($room_id) { - $room_source = sql_select("SELECT * FROM `Room` WHERE `RID`='" . sql_escape($room_id) . "'"); - - if ($room_source === false) { - return false; - } - if (count($room_source) > 0) { - return $room_source[0]; - } - return null; -} +function Room($room_id, $show_only = true) +{ + $room_source = DB::select(' + SELECT * + FROM `Room` + WHERE `RID` = ? + ' . ($show_only ? 'AND `show` = \'Y\'' : ''), + [$room_id] + ); -?> + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + if (empty($room_source)) { + return null; + } + + return array_shift($room_source); +} diff --git a/includes/model/ShiftEntry_model.php b/includes/model/ShiftEntry_model.php index 9f4faf9e..d7810feb 100644 --- a/includes/model/ShiftEntry_model.php +++ b/includes/model/ShiftEntry_model.php @@ -1,152 +1,251 @@ <?php +use Engelsystem\Database\DB; + /** * Returns an array with the attributes of shift entries. * FIXME! Needs entity object. + * + * @return array */ -function ShiftEntry_new() { - return [ - 'id' => null, - 'SID' => null, - 'TID' => null, - 'UID' => null, - 'Comment' => null, - 'freeloaded_comment' => null, - 'freeloaded' => false - ]; +function ShiftEntry_new() +{ + return [ + 'id' => null, + 'SID' => null, + 'TID' => null, + 'UID' => null, + 'Comment' => null, + 'freeloaded_comment' => null, + 'freeloaded' => false + ]; } /** * Counts all freeloaded shifts. + * + * @return int */ -function ShiftEntries_freeleaded_count() { - return sql_select_single_cell("SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1"); +function ShiftEntries_freeleaded_count() +{ + $result = DB::select('SELECT COUNT(*) FROM `ShiftEntry` WHERE `freeloaded` = 1'); + $result = array_shift($result); + + if (!is_array($result)) { + return 0; + } + + return (int)array_shift($result); } /** * List users subsribed to a given shift. + * + * @param int $shift_id + * @return array */ -function ShiftEntries_by_shift($shift_id) { - return sql_select(" - SELECT `User`.`Nick`, `User`.`email`, `User`.`email_shiftinfo`, `User`.`Sprache`, `User`.`Gekommen`, `ShiftEntry`.`UID`, `ShiftEntry`.`TID`, `ShiftEntry`.`SID`, `AngelTypes`.`name` as `angel_type_name`, `ShiftEntry`.`Comment`, `ShiftEntry`.`freeloaded` - FROM `ShiftEntry` - JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` - JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` - WHERE `ShiftEntry`.`SID`='" . sql_escape($shift_id) . "'"); +function ShiftEntries_by_shift($shift_id) +{ + return DB::select(' + SELECT + `User`.`Nick`, + `User`.`email`, + `User`.`email_shiftinfo`, + `User`.`Sprache`, + `User`.`Gekommen`, + `ShiftEntry`.`UID`, + `ShiftEntry`.`TID`, + `ShiftEntry`.`SID`, + `AngelTypes`.`name` AS `angel_type_name`, + `ShiftEntry`.`Comment`, + `ShiftEntry`.`freeloaded` + FROM `ShiftEntry` + JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` + JOIN `AngelTypes` ON `ShiftEntry`.`TID`=`AngelTypes`.`id` + WHERE `ShiftEntry`.`SID` = ?', + [$shift_id] + ); } /** * Create a new shift entry. * - * @param ShiftEntry $shift_entry + * @param array $shift_entry + * @return bool */ -function ShiftEntry_create($shift_entry) { - mail_shift_assign(User($shift_entry['UID']), Shift($shift_entry['SID'])); - return sql_query("INSERT INTO `ShiftEntry` SET - `SID`='" . sql_escape($shift_entry['SID']) . "', - `TID`='" . sql_escape($shift_entry['TID']) . "', - `UID`='" . sql_escape($shift_entry['UID']) . "', - `Comment`='" . sql_escape($shift_entry['Comment']) . "', - `freeload_comment`='" . sql_escape($shift_entry['freeload_comment']) . "', - `freeloaded`=" . sql_bool($shift_entry['freeloaded'])); +function ShiftEntry_create($shift_entry) +{ + mail_shift_assign(User($shift_entry['UID']), Shift($shift_entry['SID'])); + return DB::insert(' + INSERT INTO `ShiftEntry` ( + `SID`, + `TID`, + `UID`, + `Comment`, + `freeload_comment`, + `freeloaded` + ) + VALUES(?, ?, ?, ?, ?, ?) + ', + [ + $shift_entry['SID'], + $shift_entry['TID'], + $shift_entry['UID'], + $shift_entry['Comment'], + $shift_entry['freeload_comment'], + $shift_entry['freeloaded'], + ] + ); } /** * Update a shift entry. + * + * @param array $shift_entry + * @return bool */ -function ShiftEntry_update($shift_entry) { - return sql_query("UPDATE `ShiftEntry` SET - `Comment`='" . sql_escape($shift_entry['Comment']) . "', - `freeload_comment`='" . sql_escape($shift_entry['freeload_comment']) . "', - `freeloaded`=" . sql_bool($shift_entry['freeloaded']) . " - WHERE `id`='" . sql_escape($shift_entry['id']) . "'"); +function ShiftEntry_update($shift_entry) +{ + DB::update(' + UPDATE `ShiftEntry` + SET + `Comment` = ?, + `freeload_comment` = ?, + `freeloaded` = ? + WHERE `id` = ?', + [ + $shift_entry['Comment'], + $shift_entry['freeload_comment'], + $shift_entry['freeloaded'], + $shift_entry['id'] + ] + ); + + return (DB::getStm()->errorCode() == '00000'); } /** * Get a shift entry. + * + * @param int $shift_entry_id + * @return array|false|null */ -function ShiftEntry($shift_entry_id) { - $shift_entry = sql_select("SELECT * FROM `ShiftEntry` WHERE `id`='" . sql_escape($shift_entry_id) . "'"); - if ($shift_entry === false) { - return false; - } - if (count($shift_entry) == 0) { - return null; - } - return $shift_entry[0]; +function ShiftEntry($shift_entry_id) +{ + $shift_entry = DB::select('SELECT * FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]); + if (DB::getStm()->errorCode() != '00000') { + return false; + } + if (empty($shift_entry)) { + return null; + } + return $shift_entry[0]; } /** * Delete a shift entry. + * + * @param int $shift_entry_id + * @return bool */ -function ShiftEntry_delete($shift_entry_id) { - $shift_entry = ShiftEntry($shift_entry_id); - mail_shift_removed(User($shift_entry['UID']), Shift($shift_entry['SID'])); - return sql_query("DELETE FROM `ShiftEntry` WHERE `id`='" . sql_escape($shift_entry_id) . "'"); +function ShiftEntry_delete($shift_entry_id) +{ + $shift_entry = ShiftEntry($shift_entry_id); + mail_shift_removed(User($shift_entry['UID']), Shift($shift_entry['SID'])); + return DB::delete('DELETE FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]); } /** * Returns next (or current) shifts of given user. * - * @param User $user + * @param array $user + * @return array */ -function ShiftEntries_upcoming_for_user($user) { - return sql_select(" - SELECT * - FROM `ShiftEntry` - JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) - JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` - WHERE `ShiftEntry`.`UID`=" . sql_escape($user['UID']) . " - AND `Shifts`.`end` > " . sql_escape(time()) . " - ORDER BY `Shifts`.`end` - "); +function ShiftEntries_upcoming_for_user($user) +{ + return DB::select(' + SELECT * + FROM `ShiftEntry` + JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) + JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` + WHERE `ShiftEntry`.`UID` = ? + AND `Shifts`.`end` > ? + ORDER BY `Shifts`.`end` + ', + [ + $user['UID'], + time(), + ] + ); } /** * Returns shifts completed by the given user. * - * @param User $user + * @param array $user + * @return array */ -function ShiftEntries_finished_by_user($user) { - return sql_select(" - SELECT * - FROM `ShiftEntry` - JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) - JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` - WHERE `ShiftEntry`.`UID`=" . sql_escape($user['UID']) . " - AND `Shifts`.`end` < " . sql_escape(time()) . " - AND `ShiftEntry`.`freeloaded` = 0 - ORDER BY `Shifts`.`end` - "); +function ShiftEntries_finished_by_user($user) +{ + return DB::select(' + SELECT * + FROM `ShiftEntry` + JOIN `Shifts` ON (`Shifts`.`SID` = `ShiftEntry`.`SID`) + JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` + WHERE `ShiftEntry`.`UID` = ? + AND `Shifts`.`end` < ? + AND `ShiftEntry`.`freeloaded` = 0 + ORDER BY `Shifts`.`end` + ', + [ + $user['UID'], + time(), + ] + ); } /** * Returns all shift entries in given shift for given angeltype. * - * @param int $shift_id - * @param int $angeltype_id + * @param int $shift_id + * @param int $angeltype_id + * @return array */ -function ShiftEntries_by_shift_and_angeltype($shift_id, $angeltype_id) { - $result = sql_select(" - SELECT * - FROM `ShiftEntry` - WHERE `SID`=" . sql_escape($shift_id) . " - AND `TID`=" . sql_escape($angeltype_id) . " - "); - if ($result === false) { - engelsystem_error("Unable to load shift entries."); - } - return $result; +function ShiftEntries_by_shift_and_angeltype($shift_id, $angeltype_id) +{ + $result = DB::select(' + SELECT * + FROM `ShiftEntry` + WHERE `SID` = ? + AND `TID` = ? + ', + [ + $shift_id, + $angeltype_id, + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shift entries.'); + } + return $result; } /** * Returns all freeloaded shifts for given user. + * + * @param array $user + * @return array */ -function ShiftEntries_freeloaded_by_user($user) { - return sql_select("SELECT * - FROM `ShiftEntry` - WHERE `freeloaded` = 1 - AND `UID`=" . sql_escape($user['UID'])); +function ShiftEntries_freeloaded_by_user($user) +{ + return DB::select(' + SELECT * + FROM `ShiftEntry` + WHERE `freeloaded` = 1 + AND `UID` = ? + ', + [ + $user['UID'] + ] + ); } - -?> diff --git a/includes/model/ShiftSignupState.php b/includes/model/ShiftSignupState.php index 393023ee..9b3de496 100644 --- a/includes/model/ShiftSignupState.php +++ b/includes/model/ShiftSignupState.php @@ -6,112 +6,136 @@ namespace Engelsystem; * BO to represent if there are free slots on a shift for a given angeltype * and if signup for a given user is possible (or not, because of collisions, etc.) */ -class ShiftSignupState { - - /** - * Shift has free places - */ - const FREE = 'FREE'; - - /** - * Shift collides with users shifts - */ - const COLLIDES = 'COLLIDES'; - - /** - * User cannot join because of a restricted angeltype or user is not in the angeltype - */ - const ANGELTYPE = 'ANGELTYPE'; - - /** - * Shift is full - */ - const OCCUPIED = 'OCCUPIED'; - - /** - * User is admin and can do what he wants. - */ - const ADMIN = 'ADMIN'; - - /** - * Shift has already ended, no signup - */ - const SHIFT_ENDED = 'SHIFT_ENDED'; - - /** - * User is already signed up - */ - const SIGNED_UP = 'SIGNED_UP'; - - private $state; - - private $freeEntries; - - public function __construct($state, $free_entries) { - $this->state = $state; - $this->freeEntries = $free_entries; - } - - /** - * Combine this state with another state from the same shift. - * - * @param ShiftSignupState $shiftSignupState - * The other state to combine - */ - public function combineWith(ShiftSignupState $shiftSignupState) { - $this->freeEntries += $shiftSignupState->getFreeEntries(); - - if ($this->valueForState($shiftSignupState->state) > $this->valueForState($this->state)) { - $this->state = $shiftSignupState->state; +class ShiftSignupState +{ + /** + * Shift has free places + */ + const FREE = 'FREE'; + + /** + * Shift collides with users shifts + */ + const COLLIDES = 'COLLIDES'; + + /** + * User cannot join because of a restricted angeltype or user is not in the angeltype + */ + const ANGELTYPE = 'ANGELTYPE'; + + /** + * Shift is full + */ + const OCCUPIED = 'OCCUPIED'; + + /** + * User is admin and can do what he wants. + */ + const ADMIN = 'ADMIN'; + + /** + * Shift has already ended, no signup + */ + const SHIFT_ENDED = 'SHIFT_ENDED'; + + /** + * User is already signed up + */ + const SIGNED_UP = 'SIGNED_UP'; + + /** @var string */ + private $state; + + /** @var int */ + private $freeEntries; + + /** + * ShiftSignupState constructor. + * + * @param string $state + * @param int $free_entries + */ + public function __construct($state, $free_entries) + { + $this->state = $state; + $this->freeEntries = $free_entries; } - } - - private function valueForState($state) { - switch ($state) { - case ShiftSignupState::SHIFT_ENDED: - return 100; - - case ShiftSignupState::SIGNED_UP: - return 90; - - case ShiftSignupState::FREE: - return 80; - - case ShiftSignupState::ANGELTYPE: - case ShiftSignupState::COLLIDES: - return 70; - - case ShiftSignupState::OCCUPIED: - case ShiftSignupState::ADMIN: - return 60; + + /** + * Combine this state with another state from the same shift. + * + * @param ShiftSignupState $shiftSignupState + * The other state to combine + */ + public function combineWith(ShiftSignupState $shiftSignupState) + { + $this->freeEntries += $shiftSignupState->getFreeEntries(); + + if ($this->valueForState($shiftSignupState->state) > $this->valueForState($this->state)) { + $this->state = $shiftSignupState->state; + } } - } - - /** - * Returns true, if signup is allowed - */ - public function isSignupAllowed() { - switch ($this->state) { - case ShiftSignupState::FREE: - case ShiftSignupState::ADMIN: - return true; + + /** + * @param string $state + * @return int + */ + private function valueForState($state) + { + switch ($state) { + case ShiftSignupState::SHIFT_ENDED: + return 100; + + case ShiftSignupState::SIGNED_UP: + return 90; + + case ShiftSignupState::FREE: + return 80; + + case ShiftSignupState::ANGELTYPE: + case ShiftSignupState::COLLIDES: + return 70; + + case ShiftSignupState::OCCUPIED: + case ShiftSignupState::ADMIN: + return 60; + default: + return 0; + } + } + + /** + * Returns true, if signup is allowed + * + * @return bool + */ + public function isSignupAllowed() + { + switch ($this->state) { + case ShiftSignupState::FREE: + case ShiftSignupState::ADMIN: + return true; + } + return false; } - return false; - } - - /** - * Return the shift signup state - */ - public function getState() { - return $this->state; - } - - /** - * How many places are free in this shift for the angeltype? - */ - public function getFreeEntries() { - return $this->freeEntries; - } -} -?>
\ No newline at end of file + /** + * Return the shift signup state + * + * @return string + */ + public function getState() + { + return $this->state; + } + + /** + * How many places are free in this shift for the angeltype? + * + * @return int + */ + public function getFreeEntries() + { + return $this->freeEntries; + } +} diff --git a/includes/model/ShiftTypes_model.php b/includes/model/ShiftTypes_model.php index 89704a65..96a823d4 100644 --- a/includes/model/ShiftTypes_model.php +++ b/includes/model/ShiftTypes_model.php @@ -1,69 +1,105 @@ <?php +use Engelsystem\Database\DB; + /** * Delete a shift type. + * * @param int $shifttype_id + * @return bool */ -function ShiftType_delete($shifttype_id) { - return sql_query("DELETE FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'"); +function ShiftType_delete($shifttype_id) +{ + return DB::delete('DELETE FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]); } /** * Update a shift type. * - * @param int $shifttype_id - * @param string $name - * @param int $angeltype_id - * @param string $description + * @param int $shifttype_id + * @param string $name + * @param int $angeltype_id + * @param string $description + * @return bool */ -function ShiftType_update($shifttype_id, $name, $angeltype_id, $description) { - return sql_query("UPDATE `ShiftTypes` SET - `name`='" . sql_escape($name) . "', - `angeltype_id`=" . sql_null($angeltype_id) . ", - `description`='" . sql_escape($description) . "' - WHERE `id`='" . sql_escape($shifttype_id) . "'"); +function ShiftType_update($shifttype_id, $name, $angeltype_id, $description) +{ + DB::update(' + UPDATE `ShiftTypes` SET + `name`=?, + `angeltype_id`=?, + `description`=? + WHERE `id`=? + ', + [ + $name, + $angeltype_id, + $description, + $shifttype_id, + ] + ); + + return DB::getStm()->errorCode() == '00000'; } /** * Create a shift type. * - * @param string $name - * @param int $angeltype_id - * @param string $description - * @return new shifttype id + * @param string $name + * @param int $angeltype_id + * @param string $description + * @return int|false new shifttype id */ -function ShiftType_create($name, $angeltype_id, $description) { - $result = sql_query("INSERT INTO `ShiftTypes` SET - `name`='" . sql_escape($name) . "', - `angeltype_id`=" . sql_null($angeltype_id) . ", - `description`='" . sql_escape($description) . "'"); - if ($result === false) { - return false; - } - return sql_id(); +function ShiftType_create($name, $angeltype_id, $description) +{ + $result = DB::insert(' + INSERT INTO `ShiftTypes` (`name`, `angeltype_id`, `description`) + VALUES(?, ?, ?) + ', + [ + $name, + $angeltype_id, + $description + ] + ); + + if ($result === false) { + return false; + } + + return DB::getPdo()->lastInsertId(); } /** * Get a shift type by id. * - * @param int $shifttype_id + * @param int $shifttype_id + * @return array|null */ -function ShiftType($shifttype_id) { - $shifttype = sql_select("SELECT * FROM `ShiftTypes` WHERE `id`='" . sql_escape($shifttype_id) . "'"); - if ($shifttype === false) { - engelsystem_error('Unable to load shift type.'); - } - if ($shifttype == null) { - return null; - } - return $shifttype[0]; +function ShiftType($shifttype_id) +{ + $shifttype = DB::select('SELECT * FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shift type.'); + } + if (empty($shifttype)) { + return null; + } + return array_shift($shifttype); } /** * Get all shift types. + * + * @return array|false */ -function ShiftTypes() { - return sql_select("SELECT * FROM `ShiftTypes` ORDER BY `name`"); -} +function ShiftTypes() +{ + $result = DB::select('SELECT * FROM `ShiftTypes` ORDER BY `name`'); -?>
\ No newline at end of file + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + return $result; +} diff --git a/includes/model/ShiftsFilter.php b/includes/model/ShiftsFilter.php index ff1f5d40..47ef50d7 100644 --- a/includes/model/ShiftsFilter.php +++ b/includes/model/ShiftsFilter.php @@ -7,115 +7,170 @@ namespace Engelsystem; * * @author msquare */ -class ShiftsFilter { - - /** - * How long can the time interval be? - */ - const MAX_DURATION = 86400; - // one day - - /** - * Shift is completely full. - */ - const FILLED_FILLED = 1; - - /** - * Shift has some free slots. - */ - const FILLED_FREE = 0; - - /** - * Has the user "user shifts admin" privilege? - * - * @var boolean - */ - private $userShiftsAdmin; - - private $filled = []; - - private $rooms = []; - - private $types = []; - - private $startTime = null; - - private $endTime = null; - - public function __construct($user_shifts_admin, $rooms, $types) { - $this->user_shifts_admin = $user_shifts_admin; - $this->rooms = $rooms; - $this->types = $types; - - $this->filled = [ - ShiftsFilter::FILLED_FREE - ]; - - if ($user_shifts_admin) { - $this->filled[] = ShiftsFilter::FILLED_FILLED; +class ShiftsFilter +{ + /** + * How long can the time interval be? + * 86400 = one day + */ + const MAX_DURATION = 86400; + + /** + * Shift is completely full. + */ + const FILLED_FILLED = 1; + + /** + * Shift has some free slots. + */ + const FILLED_FREE = 0; + + /** + * Has the user "user shifts admin" privilege? + * + * @var boolean + */ + private $userShiftsAdmin; + + /** @var int[] */ + private $filled = []; + + /** @var int[] */ + private $rooms = []; + + /** @var int[] */ + private $types = []; + + /** @var int unix timestamp */ + private $startTime = null; + + /** @var int unix timestamp */ + private $endTime = null; + + /** + * ShiftsFilter constructor. + * + * @param bool $user_shifts_admin + * @param int[] $rooms + * @param int[] $types + */ + public function __construct($user_shifts_admin, $rooms, $types) + { + $this->user_shifts_admin = $user_shifts_admin; + $this->rooms = $rooms; + $this->types = $types; + + $this->filled = [ + ShiftsFilter::FILLED_FREE + ]; + + if ($user_shifts_admin) { + $this->filled[] = ShiftsFilter::FILLED_FILLED; + } } - } - public function getStartTime() { - return $this->startTime; - } + /** + * @return int unix timestamp + */ + public function getStartTime() + { + return $this->startTime; + } - public function setStartTime($startTime) { - $this->startTime = $startTime; - } + /** + * @param int $startTime unix timestamp + */ + public function setStartTime($startTime) + { + $this->startTime = $startTime; + } - public function getEndTime() { - return $this->endTime; - } + /** + * @return int unix timestamp + */ + public function getEndTime() + { + return $this->endTime; + } - public function setEndTime($endTime) { - if ($endTime - $this->startTime > ShiftsFilter::MAX_DURATION) { - $endTime = $this->startTime + ShiftsFilter::MAX_DURATION; + /** + * @param int $endTime unix timestamp + */ + public function setEndTime($endTime) + { + if ($endTime - $this->startTime > ShiftsFilter::MAX_DURATION) { + $endTime = $this->startTime + ShiftsFilter::MAX_DURATION; + } + $this->endTime = $endTime; } - $this->endTime = $endTime; - } - - public function getTypes() { - if (count($this->types) == 0) { - return [ - 0 - ]; + + /** + * @return int[] + */ + public function getTypes() + { + if (count($this->types) == 0) { + return [0]; + } + return $this->types; } - return $this->types; - } - - public function setTypes($types) { - $this->types = $types; - } - - public function getRooms() { - if (count($this->rooms) == 0) { - return [ - 0 - ]; + + /** + * @param int[] $types + */ + public function setTypes($types) + { + $this->types = $types; } - return $this->rooms; - } - public function setRooms($rooms) { - $this->rooms = $rooms; - } + /** + * @return int[] + */ + public function getRooms() + { + if (count($this->rooms) == 0) { + return [0]; + } + return $this->rooms; + } - public function isUserShiftsAdmin() { - return $this->userShiftsAdmin; - } + /** + * @param int[] $rooms + */ + public function setRooms($rooms) + { + $this->rooms = $rooms; + } - public function setUserShiftsAdmin($userShiftsAdmin) { - $this->userShiftsAdmin = $userShiftsAdmin; - } + /** + * @return bool + */ + public function isUserShiftsAdmin() + { + return $this->userShiftsAdmin; + } - public function getFilled() { - return $this->filled; - } + /** + * @param bool $userShiftsAdmin + */ + public function setUserShiftsAdmin($userShiftsAdmin) + { + $this->userShiftsAdmin = $userShiftsAdmin; + } - public function setFilled($filled) { - $this->filled = $filled; - } -} + /** + * @return int[] + */ + public function getFilled() + { + return $this->filled; + } -?>
\ No newline at end of file + /** + * @param int[] $filled + */ + public function setFilled($filled) + { + $this->filled = $filled; + } +} diff --git a/includes/model/Shifts_model.php b/includes/model/Shifts_model.php index 29156423..b0269362 100644 --- a/includes/model/Shifts_model.php +++ b/includes/model/Shifts_model.php @@ -1,432 +1,641 @@ <?php + +use Engelsystem\Database\DB; use Engelsystem\ShiftsFilter; use Engelsystem\ShiftSignupState; -function Shifts_by_room($room) { - $result = sql_select("SELECT * FROM `Shifts` WHERE `RID`=" . sql_escape($room['RID']) . " ORDER BY `start`"); - if ($result === false) { - engelsystem_error("Unable to load shifts."); - } - return $result; +/** + * @param array $room + * @return array + */ +function Shifts_by_room($room) +{ + $result = DB::select('SELECT * FROM `Shifts` WHERE `RID`=? ORDER BY `start`', [$room['RID']]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shifts.'); + } + return $result; } -function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { - $SQL = "SELECT * FROM ( - SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` as `room_name` +/** + * @param ShiftsFilter $shiftsFilter + * @return array[] + */ +function Shifts_by_ShiftsFilter(ShiftsFilter $shiftsFilter) +{ + $sql = 'SELECT * FROM ( + SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` AS `room_name` FROM `Shifts` JOIN `Room` USING (`RID`) JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` - WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") - AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " - AND `NeededAngelTypes`.`angel_type_id` IN (" . implode(',', $shiftsFilter->getTypes()) . ") + WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') + AND `start` BETWEEN ? AND ? + AND `NeededAngelTypes`.`angel_type_id` IN (' . implode(',', $shiftsFilter->getTypes()) . ') AND `NeededAngelTypes`.`count` > 0 AND `Shifts`.`PSID` IS NULL - + UNION - - SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` as `room_name` + + SELECT DISTINCT `Shifts`.*, `ShiftTypes`.`name`, `Room`.`Name` AS `room_name` FROM `Shifts` JOIN `Room` USING (`RID`) JOIN `ShiftTypes` ON `ShiftTypes`.`id` = `Shifts`.`shifttype_id` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`room_id`=`Shifts`.`RID` - WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") - AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " - AND `NeededAngelTypes`.`angel_type_id` IN (" . implode(',', $shiftsFilter->getTypes()) . ") + WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') + AND `start` BETWEEN ? AND ? + AND `NeededAngelTypes`.`angel_type_id` IN (' . implode(',', $shiftsFilter->getTypes()) . ') AND `NeededAngelTypes`.`count` > 0 - AND NOT `Shifts`.`PSID` IS NULL) as tmp_shifts - - ORDER BY `start`"; - $result = sql_select($SQL); - if ($result === false) { - engelsystem_error("Unable to load shifts by filter."); - } - return $result; + AND NOT `Shifts`.`PSID` IS NULL) AS tmp_shifts + + ORDER BY `start`'; + $result = DB::select( + $sql, + [ + $shiftsFilter->getStartTime(), + $shiftsFilter->getEndTime(), + $shiftsFilter->getStartTime(), + $shiftsFilter->getEndTime(), + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shifts by filter.'); + } + return $result; } -function NeededAngeltypes_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { - $SQL = "SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` +/** + * @param ShiftsFilter $shiftsFilter + * @return array[] + */ +function NeededAngeltypes_by_ShiftsFilter(ShiftsFilter $shiftsFilter) +{ + $sql = ' + SELECT + `NeededAngelTypes`.*, + `Shifts`.`SID`, + `AngelTypes`.`id`, + `AngelTypes`.`name`, + `AngelTypes`.`restricted`, + `AngelTypes`.`no_self_signup` FROM `Shifts` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` - WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") - AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " + WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') + AND `start` BETWEEN ? AND ? AND `Shifts`.`PSID` IS NULL UNION - SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` + SELECT + `NeededAngelTypes`.*, + `Shifts`.`SID`, + `AngelTypes`.`id`, + `AngelTypes`.`name`, + `AngelTypes`.`restricted`, + `AngelTypes`.`no_self_signup` FROM `Shifts` JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`room_id`=`Shifts`.`RID` JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` - WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") - AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " - AND NOT `Shifts`.`PSID` IS NULL"; - $result = sql_select($SQL); - if ($result === false) { - engelsystem_error("Unable to load needed angeltypes by filter."); - } - return $result; + WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') + AND `start` BETWEEN ? AND ? + AND NOT `Shifts`.`PSID` IS NULL'; + $result = DB::select( + $sql, + [ + $shiftsFilter->getStartTime(), + $shiftsFilter->getEndTime(), + $shiftsFilter->getStartTime(), + $shiftsFilter->getEndTime(), + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load needed angeltypes by filter.'); + } + return $result; } -function NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype) { - $result = sql_select("SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` - FROM `Shifts` - JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` - JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` - WHERE `Shifts`.`SID`=" . sql_escape($shift['SID']) . " - AND `AngelTypes`.`id`=" . sql_escape($angeltype['id']) . " - AND `Shifts`.`PSID` IS NULL - - UNION - - SELECT `NeededAngelTypes`.*, `Shifts`.`SID`, `AngelTypes`.`id`, `AngelTypes`.`name`, `AngelTypes`.`restricted`, `AngelTypes`.`no_self_signup` - FROM `Shifts` - JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`room_id`=`Shifts`.`RID` - JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` - WHERE `Shifts`.`SID`=" . sql_escape($shift['SID']) . " - AND `AngelTypes`.`id`=" . sql_escape($angeltype['id']) . " - AND NOT `Shifts`.`PSID` IS NULL"); - if ($result === false) { - engelsystem_error("Unable to load needed angeltypes by filter."); - } - if (count($result) == 0) { - return null; - } - return $result[0]; +/** + * @param array $shift + * @param array $angeltype + * @return array|null + */ +function NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype) +{ + $result = DB::select(' + SELECT + `NeededAngelTypes`.*, + `Shifts`.`SID`, + `AngelTypes`.`id`, + `AngelTypes`.`name`, + `AngelTypes`.`restricted`, + `AngelTypes`.`no_self_signup` + FROM `Shifts` + JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`shift_id`=`Shifts`.`SID` + JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` + WHERE `Shifts`.`SID`=? + AND `AngelTypes`.`id`=? + AND `Shifts`.`PSID` IS NULL + + UNION + + SELECT + `NeededAngelTypes`.*, + `Shifts`.`SID`, + `AngelTypes`.`id`, + `AngelTypes`.`name`, + `AngelTypes`.`restricted`, + `AngelTypes`.`no_self_signup` + FROM `Shifts` + JOIN `NeededAngelTypes` ON `NeededAngelTypes`.`room_id`=`Shifts`.`RID` + JOIN `AngelTypes` ON `AngelTypes`.`id`= `NeededAngelTypes`.`angel_type_id` + WHERE `Shifts`.`SID`=? + AND `AngelTypes`.`id`=? + AND NOT `Shifts`.`PSID` IS NULL + ', + [ + $shift['SID'], + $angeltype['id'], + $shift['SID'], + $angeltype['id'] + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load needed angeltypes by filter.'); + } + if (empty($result)) { + return null; + } + return $result[0]; } -function ShiftEntries_by_ShiftsFilter(ShiftsFilter $shiftsFilter) { - $SQL = "SELECT `User`.`Nick`, `User`.`email`, `User`.`email_shiftinfo`, `User`.`Sprache`, `User`.`Gekommen`, `ShiftEntry`.`UID`, `ShiftEntry`.`TID`, `ShiftEntry`.`SID`, `ShiftEntry`.`Comment`, `ShiftEntry`.`freeloaded` +/** + * @param ShiftsFilter $shiftsFilter + * @return array + */ +function ShiftEntries_by_ShiftsFilter(ShiftsFilter $shiftsFilter) +{ + $sql = ' + SELECT + `User`.`Nick`, + `User`.`email`, + `User`.`email_shiftinfo`, + `User`.`Sprache`, + `User`.`Gekommen`, + `ShiftEntry`.`UID`, + `ShiftEntry`.`TID`, + `ShiftEntry`.`SID`, + `ShiftEntry`.`Comment`, + `ShiftEntry`.`freeloaded` FROM `Shifts` JOIN `ShiftEntry` ON `ShiftEntry`.`SID`=`Shifts`.`SID` JOIN `User` ON `ShiftEntry`.`UID`=`User`.`UID` - WHERE `Shifts`.`RID` IN (" . implode(',', $shiftsFilter->getRooms()) . ") - AND `start` BETWEEN " . $shiftsFilter->getStartTime() . " AND " . $shiftsFilter->getEndTime() . " - ORDER BY `Shifts`.`start`"; - $result = sql_select($SQL); - if ($result === false) { - engelsystem_error("Unable to load shift entries by filter."); - } - return $result; + WHERE `Shifts`.`RID` IN (' . implode(',', $shiftsFilter->getRooms()) . ') + AND `start` BETWEEN ? AND ? + ORDER BY `Shifts`.`start`'; + $result = DB::select( + $sql, + [ + $shiftsFilter->getStartTime(), + $shiftsFilter->getEndTime(), + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shift entries by filter.'); + } + return $result; } /** * Check if a shift collides with other shifts (in time). * - * @param Shift $shift - * @param array<Shift> $shifts + * @param array $shift + * @param array $shifts + * @return bool */ -function Shift_collides($shift, $shifts) { - foreach ($shifts as $other_shift) { - if ($shift['SID'] != $other_shift['SID']) { - if (! ($shift['start'] >= $other_shift['end'] || $shift['end'] <= $other_shift['start'])) { - return true; - } - } - } - return false; +function Shift_collides($shift, $shifts) +{ + foreach ($shifts as $other_shift) { + if ($shift['SID'] != $other_shift['SID']) { + if (!($shift['start'] >= $other_shift['end'] || $shift['end'] <= $other_shift['start'])) { + return true; + } + } + } + return false; } /** * Returns the number of needed angels/free shift entries for an angeltype. + * + * @param array $needed_angeltype + * @param array[] $shift_entries + * @return int */ -function Shift_free_entries($needed_angeltype, $shift_entries) { - $taken = 0; - foreach ($shift_entries as $shift_entry) { - if ($shift_entry['freeloaded'] == 0) { - $taken ++; - } - } - return max(0, $needed_angeltype['count'] - $taken); +function Shift_free_entries($needed_angeltype, $shift_entries) +{ + $taken = 0; + foreach ($shift_entries as $shift_entry) { + if ($shift_entry['freeloaded'] == 0) { + $taken++; + } + } + return max(0, $needed_angeltype['count'] - $taken); } /** * Check if shift signup is allowed from the end users point of view (no admin like privileges) * - * @param Shift $shift - * The shift - * @param AngelType $angeltype - * The angeltype to which the user wants to sign up - * @param array<Shift> $user_shifts - * List of the users shifts - * @param boolean $angeltype_supporter - * True, if the user has angeltype supporter rights for the angeltype, which enables him to sign somebody up for the shift. + * @param array $user + * @param array $shift The shift + * @param array $angeltype The angeltype to which the user wants to sign up + * @param array|null $user_angeltype + * @param array|null $user_shifts List of the users shifts + * @param array $needed_angeltype + * @param array[] $shift_entries + * @return ShiftSignupState */ -function Shift_signup_allowed_angel($user, $shift, $angeltype, $user_angeltype, $user_shifts, $needed_angeltype, $shift_entries) { - $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); - - if ($user['Gekommen'] == 0) { - return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); - } - - if ($user_shifts == null) { - $user_shifts = Shifts_by_user($user); - } - - $signed_up = false; - foreach ($user_shifts as $user_shift) { - if ($user_shift['SID'] == $shift['SID']) { - $signed_up = true; - break; - } - } - - if ($signed_up) { - // you cannot join if you already singed up for this shift - return new ShiftSignupState(ShiftSignupState::SIGNED_UP, $free_entries); - } - - if (time() > $shift['start']) { - // you can only join if the shift is in future - return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); - } - if ($free_entries == 0) { - // you cannot join if shift is full - return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); - } - - if ($user_angeltype == null) { - $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); - } - - if ($user_angeltype == null || ($angeltype['no_self_signup'] == 1 && $user_angeltype != null) || ($angeltype['restricted'] == 1 && $user_angeltype != null && ! isset($user_angeltype['confirm_user_id']))) { - // you cannot join if user is not of this angel type - // you cannot join if you are not confirmed - // you cannot join if angeltype has no self signup - - return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries); - } - - if (Shift_collides($shift, $user_shifts)) { - // you cannot join if user alread joined a parallel or this shift - return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries); - } - - // Hooray, shift is free for you! - return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); +function Shift_signup_allowed_angel( + $user, + $shift, + $angeltype, + $user_angeltype, + $user_shifts, + $needed_angeltype, + $shift_entries +) { + $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); + + if ($user['Gekommen'] == 0) { + return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); + } + + if ($user_shifts == null) { + $user_shifts = Shifts_by_user($user); + } + + $signed_up = false; + foreach ($user_shifts as $user_shift) { + if ($user_shift['SID'] == $shift['SID']) { + $signed_up = true; + break; + } + } + + if ($signed_up) { + // you cannot join if you already singed up for this shift + return new ShiftSignupState(ShiftSignupState::SIGNED_UP, $free_entries); + } + + if (time() > $shift['start']) { + // you can only join if the shift is in future + return new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, $free_entries); + } + if ($free_entries == 0) { + // you cannot join if shift is full + return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); + } + + if ($user_angeltype == null) { + $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); + } + + if ( + $user_angeltype == null + || ($angeltype['no_self_signup'] == 1 && $user_angeltype != null) + || ($angeltype['restricted'] == 1 && $user_angeltype != null && !isset($user_angeltype['confirm_user_id'])) + ) { + // you cannot join if user is not of this angel type + // you cannot join if you are not confirmed + // you cannot join if angeltype has no self signup + + return new ShiftSignupState(ShiftSignupState::ANGELTYPE, $free_entries); + } + + if (Shift_collides($shift, $user_shifts)) { + // you cannot join if user alread joined a parallel or this shift + return new ShiftSignupState(ShiftSignupState::COLLIDES, $free_entries); + } + + // Hooray, shift is free for you! + return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); } /** * Check if an angeltype supporter can sign up a user to a shift. + * + * @param array $needed_angeltype + * @param array[] $shift_entries + * @return ShiftSignupState */ -function Shift_signup_allowed_angeltype_supporter($angeltype, $needed_angeltype, $shift_entries) { - $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); - if ($free_entries == 0) { - return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); - } - - return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); +function Shift_signup_allowed_angeltype_supporter($needed_angeltype, $shift_entries) +{ + $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); + if ($free_entries == 0) { + return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries); + } + + return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); } /** * Check if an admin can sign up a user to a shift. * - * @param Shift $shift - * The shift - * @param AngelType $angeltype - * The angeltype to which the user wants to sign up + * @param array $needed_angeltype + * @param array[] $shift_entries + * @return ShiftSignupState */ -function Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries) { - $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); - - if ($free_entries == 0) { - // User shift admins may join anybody in every shift - return new ShiftSignupState(ShiftSignupState::ADMIN, $free_entries); - } - - return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); +function Shift_signup_allowed_admin($needed_angeltype, $shift_entries) +{ + $free_entries = Shift_free_entries($needed_angeltype, $shift_entries); + + if ($free_entries == 0) { + // User shift admins may join anybody in every shift + return new ShiftSignupState(ShiftSignupState::ADMIN, $free_entries); + } + + return new ShiftSignupState(ShiftSignupState::FREE, $free_entries); } /** * Check if an angel can sign up for given shift. * - * @param Shift $shift - * The shift - * @param AngelType $angeltype - * The angeltype to which the user wants to sign up - * @param array<Shift> $user_shifts - * List of the users shifts + * @param array $signup_user + * @param array $shift The shift + * @param array $angeltype The angeltype to which the user wants to sign up + * @param array|null $user_angeltype + * @param array|null $user_shifts List of the users shifts + * @param array $needed_angeltype + * @param array[] $shift_entries + * @return ShiftSignupState */ -function Shift_signup_allowed($signup_user, $shift, $angeltype, $user_angeltype = null, $user_shifts = null, $needed_angeltype, $shift_entries) { - global $user, $privileges; - - if (in_array('user_shifts_admin', $privileges)) { - return Shift_signup_allowed_admin($angeltype, $needed_angeltype, $shift_entries); - } - - if (in_array('shiftentry_edit_angeltype_supporter', $privileges) && User_is_AngelType_supporter($user, $angeltype)) { - return Shift_signup_allowed_angeltype_supporter($angeltype, $needed_angeltype, $shift_entries); - } - - return Shift_signup_allowed_angel($signup_user, $shift, $angeltype, $user_angeltype, $user_shifts, $needed_angeltype, $shift_entries); +function Shift_signup_allowed( + $signup_user, + $shift, + $angeltype, + $user_angeltype, + $user_shifts, + $needed_angeltype, + $shift_entries +) { + global $user, $privileges; + + if (in_array('user_shifts_admin', $privileges)) { + return Shift_signup_allowed_admin($needed_angeltype, $shift_entries); + } + + if ( + in_array('shiftentry_edit_angeltype_supporter', $privileges) + && User_is_AngelType_supporter($user, $angeltype) + ) { + return Shift_signup_allowed_angeltype_supporter($needed_angeltype, $shift_entries); + } + + return Shift_signup_allowed_angel( + $signup_user, + $shift, + $angeltype, + $user_angeltype, + $user_shifts, + $needed_angeltype, + $shift_entries + ); } /** * Delete a shift by its external id. + * + * @param int $shift_psid + * @return bool */ -function Shift_delete_by_psid($shift_psid) { - return sql_query("DELETE FROM `Shifts` WHERE `PSID`='" . sql_escape($shift_psid) . "'"); +function Shift_delete_by_psid($shift_psid) +{ + DB::delete('DELETE FROM `Shifts` WHERE `PSID`=?', [$shift_psid]); + + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + return true; } /** * Delete a shift. + * + * @param int $shift_id + * @return bool */ -function Shift_delete($shift_id) { - mail_shift_delete(Shift($shift_id)); - - $result = sql_query("DELETE FROM `Shifts` WHERE `SID`='" . sql_escape($shift_id) . "'"); - if ($result === false) { - engelsystem_error('Unable to delete shift.'); - } - return $result; +function Shift_delete($shift_id) +{ + mail_shift_delete(Shift($shift_id)); + + $result = DB::delete('DELETE FROM `Shifts` WHERE `SID`=?', [$shift_id]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to delete shift.'); + } + return $result; } /** * Update a shift. + * + * @param array $shift + * @return bool */ -function Shift_update($shift) { - global $user; - $shift['name'] = ShiftType($shift['shifttype_id'])['name']; - mail_shift_change(Shift($shift['SID']), $shift); - - return sql_query("UPDATE `Shifts` SET - `shifttype_id`='" . sql_escape($shift['shifttype_id']) . "', - `start`='" . sql_escape($shift['start']) . "', - `end`='" . sql_escape($shift['end']) . "', - `RID`='" . sql_escape($shift['RID']) . "', - `title`=" . sql_null($shift['title']) . ", - `URL`=" . sql_null($shift['URL']) . ", - `PSID`=" . sql_null($shift['PSID']) . ", - `edited_by_user_id`='" . sql_escape($user['UID']) . "', - `edited_at_timestamp`=" . time() . " - WHERE `SID`='" . sql_escape($shift['SID']) . "'"); +function Shift_update($shift) +{ + global $user; + $shift['name'] = ShiftType($shift['shifttype_id'])['name']; + mail_shift_change(Shift($shift['SID']), $shift); + + return (bool)DB::update(' + UPDATE `Shifts` SET + `shifttype_id` = ?, + `start` = ?, + `end` = ?, + `RID` = ?, + `title` = ?, + `URL` = ?, + `PSID` = ?, + `edited_by_user_id` = ?, + `edited_at_timestamp` = ? + WHERE `SID` = ? + ', + [ + $shift['shifttype_id'], + $shift['start'], + $shift['end'], + $shift['RID'], + $shift['title'], + $shift['URL'], + $shift['PSID'], + $user['UID'], + time(), + $shift['SID'] + ] + ); } /** * Update a shift by its external id. + * + * @param array $shift + * @return bool|null */ -function Shift_update_by_psid($shift) { - $shift_source = sql_select("SELECT `SID` FROM `Shifts` WHERE `PSID`=" . $shift['PSID']); - if ($shift_source === false) { - return false; - } - if (count($shift_source) == 0) { - return null; - } - $shift['SID'] = $shift_source[0]['SID']; - return Shift_update($shift); +function Shift_update_by_psid($shift) +{ + $shift_source = DB::select('SELECT `SID` FROM `Shifts` WHERE `PSID`=?', [$shift['PSID']]); + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + if (empty($shift_source)) { + return null; + } + + $shift['SID'] = $shift_source[0]['SID']; + return Shift_update($shift); } /** * Create a new shift. * - * @return new shift id or false + * @param array $shift + * @return int|false shift id or false */ -function Shift_create($shift) { - global $user; - $result = sql_query("INSERT INTO `Shifts` SET - `shifttype_id`='" . sql_escape($shift['shifttype_id']) . "', - `start`='" . sql_escape($shift['start']) . "', - `end`='" . sql_escape($shift['end']) . "', - `RID`='" . sql_escape($shift['RID']) . "', - `title`=" . sql_null($shift['title']) . ", - `URL`=" . sql_null($shift['URL']) . ", - `PSID`=" . sql_null($shift['PSID']) . ", - `created_by_user_id`='" . sql_escape($user['UID']) . "', - `created_at_timestamp`=" . time()); - if ($result === false) { - return false; - } - return sql_id(); +function Shift_create($shift) +{ + global $user; + DB::insert(' + INSERT INTO `Shifts` ( + `shifttype_id`, + `start`, + `end`, + `RID`, + `title`, + `URL`, + `PSID`, + `created_by_user_id`, + `created_at_timestamp` + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ', + [ + $shift['shifttype_id'], + $shift['start'], + $shift['end'], + $shift['RID'], + $shift['title'], + $shift['URL'], + $shift['PSID'], + $user['UID'], + time(), + ] + ); + if (DB::getStm()->errorCode() != '00000') { + return false; + } + return DB::getPdo()->lastInsertId(); } /** * Return users shifts. + * + * @param array $user + * @param bool $include_freeload_comments + * @return array */ -function Shifts_by_user($user, $include_freeload_comments = false) { - $result = sql_select(" - SELECT `ShiftTypes`.`id` as `shifttype_id`, `ShiftTypes`.`name`, - `ShiftEntry`.`id`, `ShiftEntry`.`SID`, `ShiftEntry`.`TID`, `ShiftEntry`.`UID`, `ShiftEntry`.`freeloaded`, `ShiftEntry`.`Comment`, - " . ($include_freeload_comments ? "`ShiftEntry`.`freeload_comment`, " : "") . " - `Shifts`.*, `Room`.* - FROM `ShiftEntry` - JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) - JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) - JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) - WHERE `UID`='" . sql_escape($user['UID']) . "' - ORDER BY `start` - "); - if ($result === false) { - engelsystem_error('Unable to load users shifts.'); - } - return $result; +function Shifts_by_user($user, $include_freeload_comments = false) +{ + $result = DB::select(' + SELECT `ShiftTypes`.`id` AS `shifttype_id`, `ShiftTypes`.`name`, + `ShiftEntry`.`id`, `ShiftEntry`.`SID`, `ShiftEntry`.`TID`, `ShiftEntry`.`UID`, `ShiftEntry`.`freeloaded`, `ShiftEntry`.`Comment`, + ' . ($include_freeload_comments ? '`ShiftEntry`.`freeload_comment`, ' : '') . ' + `Shifts`.*, `Room`.* + FROM `ShiftEntry` + JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) + JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) + JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) + WHERE `UID` = ? + ORDER BY `start` + ', + [ + $user['UID'] + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load users shifts.'); + } + return $result; } /** * Returns Shift by id. * - * @param $shift_id Shift - * ID + * @param int $shift_id Shift ID + * @return array|null */ -function Shift($shift_id) { - $shifts_source = sql_select(" +function Shift($shift_id) +{ + $shifts_source = DB::select(' SELECT `Shifts`.*, `ShiftTypes`.`name` - FROM `Shifts` + FROM `Shifts` JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) - WHERE `SID`='" . sql_escape($shift_id) . "'"); - $shiftsEntry_source = sql_select("SELECT `id`, `TID` , `UID` , `freeloaded` FROM `ShiftEntry` WHERE `SID`='" . sql_escape($shift_id) . "'"); - - if ($shifts_source === false) { - engelsystem_error('Unable to load shift.'); - } - - if (empty($shifts_source)) { - return null; - } - - $result = $shifts_source[0]; - - $result['ShiftEntry'] = $shiftsEntry_source; - $result['NeedAngels'] = []; - - $temp = NeededAngelTypes_by_shift($shift_id); - foreach ($temp as $e) { - $result['NeedAngels'][] = [ - 'TID' => $e['angel_type_id'], - 'count' => $e['count'], - 'restricted' => $e['restricted'], - 'taken' => $e['taken'] - ]; - } - - return $result; + WHERE `SID`=?', [$shift_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load shift.'); + } + + if (empty($shifts_source)) { + return null; + } + + $result = $shifts_source[0]; + + $shiftsEntry_source = DB::select(' + SELECT `id`, `TID` , `UID` , `freeloaded` + FROM `ShiftEntry` + WHERE `SID`=?', [$shift_id]); + + $result['ShiftEntry'] = $shiftsEntry_source; + $result['NeedAngels'] = []; + + $angelTypes = NeededAngelTypes_by_shift($shift_id); + foreach ($angelTypes as $type) { + $result['NeedAngels'][] = [ + 'TID' => $type['angel_type_id'], + 'count' => $type['count'], + 'restricted' => $type['restricted'], + 'taken' => $type['taken'] + ]; + } + + return $result; } /** * Returns all shifts with needed angeltypes and count of subscribed jobs. + * + * @return array|false */ -function Shifts() { - $shifts_source = sql_select(" - SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.`RID`, `Room`.`Name` as `room_name` - FROM `Shifts` - JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) - JOIN `Room` ON `Room`.`RID` = `Shifts`.`RID` - "); - if ($shifts_source === false) { - return false; - } - - foreach ($shifts_source as &$shift) { - $needed_angeltypes = NeededAngelTypes_by_shift($shift['SID']); - if ($needed_angeltypes === false) { - return false; - } - - $shift['angeltypes'] = $needed_angeltypes; - } - - return $shifts_source; -} +function Shifts() +{ + $shifts_source = DB::select(' + SELECT `ShiftTypes`.`name`, `Shifts`.*, `Room`.`RID`, `Room`.`Name` AS `room_name` + FROM `Shifts` + JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) + JOIN `Room` ON `Room`.`RID` = `Shifts`.`RID` + '); + + if (DB::getStm()->errorCode() != '00000') { + return false; + } -?> + foreach ($shifts_source as &$shift) { + $needed_angeltypes = NeededAngelTypes_by_shift($shift['SID']); + $shift['angeltypes'] = $needed_angeltypes; + } + + return $shifts_source; +} diff --git a/includes/model/UserAngelTypes_model.php b/includes/model/UserAngelTypes_model.php index 11366cdf..82f390ee 100644 --- a/includes/model/UserAngelTypes_model.php +++ b/includes/model/UserAngelTypes_model.php @@ -1,5 +1,7 @@ <?php +use Engelsystem\Database\DB; + /** * User angeltypes model */ @@ -7,223 +9,283 @@ /** * Checks if a user joined an angeltype. * - * @param User $user - * The user to be checked - * @param Angeltype $angeltype - * The angeltype to be checked + * @param array $user The user to be checked + * @param array $angeltype The angeltype to be checked * @return boolean */ -function UserAngelType_exists($user, $angeltype) { - return sql_num_query(" - SELECT `id` +function UserAngelType_exists($user, $angeltype) +{ + return count(DB::select(' + SELECT `id` FROM `UserAngelTypes` - WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "' - AND `angeltype_id`='" . sql_escape($angeltype['id']) . "' - ") > 0; + WHERE `UserAngelTypes`.`user_id`=? + AND `angeltype_id`=? + ', [$user['UID'], $angeltype['id']])) > 0; } /** * List users angeltypes. * - * @param User $user + * @param array $user + * @return array|false */ -function User_angeltypes($user) { - $result = sql_select(" +function User_angeltypes($user) +{ + $result = DB::select(' SELECT `AngelTypes`.*, `UserAngelTypes`.`confirm_user_id`, `UserAngelTypes`.`supporter` FROM `UserAngelTypes` JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id` = `AngelTypes`.`id` - WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "' - "); - if ($result === false) { - engelsystem_error("Unable to load user angeltypes."); - return false; - } - return $result; + WHERE `UserAngelTypes`.`user_id`=? + ', [$user['UID']]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user angeltypes.'); + return false; + } + + return $result; } /** * Gets unconfirmed user angeltypes for angeltypes of which the given user is a supporter. * - * @param User $user + * @param array $user + * @return array */ -function User_unconfirmed_AngelTypes($user) { - $result = sql_select(" - SELECT - `UserAngelTypes`.*, - `AngelTypes`.`name`, - count(`UnconfirmedMembers`.`user_id`) as `count` - FROM `UserAngelTypes` - JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id`=`AngelTypes`.`id` - JOIN `UserAngelTypes` as `UnconfirmedMembers` ON `UserAngelTypes`.`angeltype_id`=`UnconfirmedMembers`.`angeltype_id` - WHERE `UserAngelTypes`.`user_id`='" . sql_escape($user['UID']) . "' - AND `UserAngelTypes`.`supporter`=TRUE - AND `AngelTypes`.`restricted`=TRUE - AND `UnconfirmedMembers`.`confirm_user_id` IS NULL - GROUP BY `UserAngelTypes`.`angeltype_id` - ORDER BY `AngelTypes`.`name`"); - if ($result === false) { - engelsystem_error("Unable to load user angeltypes."); - } - return $result; +function User_unconfirmed_AngelTypes($user) +{ + $result = DB::select(' + SELECT + `UserAngelTypes`.*, + `AngelTypes`.`name`, + count(`UnconfirmedMembers`.`user_id`) AS `count` + FROM `UserAngelTypes` + JOIN `AngelTypes` ON `UserAngelTypes`.`angeltype_id`=`AngelTypes`.`id` + JOIN `UserAngelTypes` AS `UnconfirmedMembers` ON `UserAngelTypes`.`angeltype_id`=`UnconfirmedMembers`.`angeltype_id` + WHERE `UserAngelTypes`.`user_id`=? + AND `UserAngelTypes`.`supporter`=TRUE + AND `AngelTypes`.`restricted`=TRUE + AND `UnconfirmedMembers`.`confirm_user_id` IS NULL + GROUP BY `UserAngelTypes`.`angeltype_id` + ORDER BY `AngelTypes`.`name` + ', [$user['UID']]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user angeltypes.'); + } + + return $result; } /** * Returns true if user is angeltype supporter or has privilege admin_user_angeltypes. * - * @param User $user - * @param AngelType $angeltype + * @param array $user + * @param array $angeltype + * @return bool */ -function User_is_AngelType_supporter(&$user, $angeltype) { - if(!isset($user['privileges'])) { - $user['privileges'] = privileges_for_user($user['UID']); - } - return (sql_num_query(" - SELECT `id` - FROM `UserAngelTypes` - WHERE `user_id`='" . sql_escape($user['UID']) . "' - AND `angeltype_id`='" . sql_escape($angeltype['id']) . "' - AND `supporter`=TRUE - LIMIT 1") > 0) || in_array('admin_user_angeltypes', $user['privileges']); +function User_is_AngelType_supporter(&$user, $angeltype) +{ + if (!isset($user['privileges'])) { + $user['privileges'] = privileges_for_user($user['UID']); + } + return (count(DB::select(' + SELECT `id` + FROM `UserAngelTypes` + WHERE `user_id`=? + AND `angeltype_id`=? + AND `supporter`=TRUE + LIMIT 1 + ', + [ + $user['UID'], + $angeltype['id'] + ] + )) > 0) + || in_array('admin_user_angeltypes', $user['privileges']); } /** * Add or remove supporter rights. * - * @param int $user_angeltype_id - * @param bool $supporter + * @param int $user_angeltype_id + * @param bool $supporter + * @return int */ -function UserAngelType_update($user_angeltype_id, $supporter) { - $result = sql_query(" +function UserAngelType_update($user_angeltype_id, $supporter) +{ + $result = DB::update(' UPDATE `UserAngelTypes` - SET `supporter`=" . sql_bool($supporter) . " - WHERE `id`='" . sql_escape($user_angeltype_id) . "' - LIMIT 1"); - if ($result === false) { - engelsystem_error("Unable to update supporter rights."); - } - return $result; + SET `supporter`=? + WHERE `id`=? + LIMIT 1 + ', [$supporter, $user_angeltype_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to update supporter rights.'); + } + + return $result; } /** * Delete all unconfirmed UserAngelTypes for given Angeltype. * - * @param int $angeltype_id + * @param int $angeltype_id + * @return bool */ -function UserAngelTypes_delete_all($angeltype_id) { - $result = sql_query(" +function UserAngelTypes_delete_all($angeltype_id) +{ + DB::delete(' DELETE FROM `UserAngelTypes` - WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "' - AND `confirm_user_id` IS NULL"); - if ($result === false) { - engelsystem_error("Unable to delete all unconfirmed users."); - } - return $result; + WHERE `angeltype_id`=? + AND `confirm_user_id` IS NULL + ', [$angeltype_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to delete all unconfirmed users.'); + } + + return true; } /** * Confirm all unconfirmed UserAngelTypes for given Angeltype. * - * @param int $angeltype_id - * @param User $confirm_user + * @param int $angeltype_id + * @param array $confirm_user + * @return bool */ -function UserAngelTypes_confirm_all($angeltype_id, $confirm_user) { - $result = sql_query(" +function UserAngelTypes_confirm_all($angeltype_id, $confirm_user) +{ + $result = DB::update(' UPDATE `UserAngelTypes` - SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "' - WHERE `angeltype_id`='" . sql_escape($angeltype_id) . "' - AND `confirm_user_id` IS NULL"); - if ($result === false) { - engelsystem_error("Unable to confirm all users."); - } - return $result; + SET `confirm_user_id`=? + WHERE `angeltype_id`=? + AND `confirm_user_id` IS NULL + ', [$confirm_user['UID'], $angeltype_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to confirm all users.'); + } + + return (bool)$result; } /** * Confirm an UserAngelType with confirming user. * - * @param int $user_angeltype_id - * @param User $confirm_user + * @param int $user_angeltype_id + * @param array $confirm_user + * @return bool */ -function UserAngelType_confirm($user_angeltype_id, $confirm_user) { - $result = sql_query(" +function UserAngelType_confirm($user_angeltype_id, $confirm_user) +{ + $result = DB::update(' UPDATE `UserAngelTypes` - SET `confirm_user_id`='" . sql_escape($confirm_user['UID']) . "' - WHERE `id`='" . sql_escape($user_angeltype_id) . "' - LIMIT 1"); - if ($result === false) { - engelsystem_error("Unable to confirm user angeltype."); - } - return $result; + SET `confirm_user_id`=? + WHERE `id`=? + LIMIT 1', [$confirm_user['UID'], $user_angeltype_id]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to confirm user angeltype.'); + } + return (bool)$result; } /** * Delete an UserAngelType. * - * @param UserAngelType $user_angeltype + * @param array $user_angeltype + * @return bool */ -function UserAngelType_delete($user_angeltype) { - return sql_query(" - DELETE FROM `UserAngelTypes` - WHERE `id`='" . sql_escape($user_angeltype['id']) . "' - LIMIT 1"); +function UserAngelType_delete($user_angeltype) +{ + return (bool)DB::delete(' + DELETE FROM `UserAngelTypes` + WHERE `id`=? + LIMIT 1', [$user_angeltype['id']]); } /** * Create an UserAngelType. * - * @param User $user - * @param Angeltype $angeltype + * @param array $user + * @param array $angeltype + * @return int */ -function UserAngelType_create($user, $angeltype) { - $result = sql_query(" - INSERT INTO `UserAngelTypes` SET - `user_id`='" . sql_escape($user['UID']) . "', - `angeltype_id`='" . sql_escape($angeltype['id']) . "'"); - if ($result === false) { - engelsystem_error("Unable to create user angeltype."); - } - return sql_id(); +function UserAngelType_create($user, $angeltype) +{ + DB::insert(' + INSERT INTO `UserAngelTypes` (`user_id`, `angeltype_id`) + VALUES (?, ?) + ', + [ + $user['UID'], + $angeltype['id'] + ] + ); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to create user angeltype.'); + } + + return DB::getPdo()->lastInsertId(); } /** * Get an UserAngelType by its id. * - * @param int $user_angeltype_id + * @param int $user_angeltype_id + * @return array|null */ -function UserAngelType($user_angeltype_id) { - $angeltype = sql_select(" +function UserAngelType($user_angeltype_id) +{ + $angeltype = DB::select(' SELECT * FROM `UserAngelTypes` - WHERE `id`='" . sql_escape($user_angeltype_id) . "' - LIMIT 1"); - if ($angeltype === false) { - engelsystem_error("Unable to load user angeltype."); - } - if (count($angeltype) == 0) { - return null; - } - return $angeltype[0]; + WHERE `id`=? + LIMIT 1', [$user_angeltype_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user angeltype.'); + } + + if (empty($angeltype)) { + return null; + } + + return $angeltype[0]; } /** * Get an UserAngelType by user and angeltype. * - * @param User $user - * @param Angeltype $angeltype + * @param array $user + * @param array $angeltype + * @return array|null */ -function UserAngelType_by_User_and_AngelType($user, $angeltype) { - $angeltype = sql_select(" - SELECT * - FROM `UserAngelTypes` - WHERE `user_id`='" . sql_escape($user['UID']) . "' - AND `angeltype_id`='" . sql_escape($angeltype['id']) . "' - LIMIT 1"); - if ($angeltype === false) { - engelsystem_error("Unable to load user angeltype."); - } - if (count($angeltype) == 0) { - return null; - } - return $angeltype[0]; +function UserAngelType_by_User_and_AngelType($user, $angeltype) +{ + $angeltype = DB::select(' + SELECT * + FROM `UserAngelTypes` + WHERE `user_id`=? + AND `angeltype_id`=? + LIMIT 1 + ', + [ + $user['UID'], + $angeltype['id'] + ] + ); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user angeltype.'); + } + + if (empty($angeltype)) { + return null; + } + + return array_shift($angeltype); } -?>
\ No newline at end of file diff --git a/includes/model/UserDriverLicenses_model.php b/includes/model/UserDriverLicenses_model.php index afc44575..5ff4df35 100644 --- a/includes/model/UserDriverLicenses_model.php +++ b/includes/model/UserDriverLicenses_model.php @@ -1,104 +1,152 @@ <?php +use Engelsystem\Database\DB; + /** * Returns a new empty UserDriverLicense * FIXME entity object needed + * + * @return array */ -function UserDriverLicense_new() { - return [ - 'user_id' => null, - 'has_car' => false, - 'has_license_car' => false, - 'has_license_3_5t_transporter' => false, - 'has_license_7_5t_truck' => false, - 'has_license_12_5t_truck' => false, - 'has_license_forklift' => false - ]; +function UserDriverLicense_new() +{ + return [ + 'user_id' => null, + 'has_car' => false, + 'has_license_car' => false, + 'has_license_3_5t_transporter' => false, + 'has_license_7_5t_truck' => false, + 'has_license_12_5t_truck' => false, + 'has_license_forklift' => false + ]; } /** * Is it valid? * - * @param UserDriverLicense $user_driver_license - * The UserDriverLicense to check + * @param array $user_driver_license The UserDriverLicense to check * @return boolean */ -function UserDriverLicense_valid($user_driver_license) { - return $user_driver_license['has_license_car'] || $user_driver_license['has_license_3_5t_transporter'] || $user_driver_license['has_license_7_5t_truck'] || $user_driver_license['has_license_12_5t_truck'] || $user_driver_license['has_license_forklift']; +function UserDriverLicense_valid($user_driver_license) +{ + return $user_driver_license['has_car'] + || $user_driver_license['has_license_car'] + || $user_driver_license['has_license_3_5t_transporter'] + || $user_driver_license['has_license_7_5t_truck'] + || $user_driver_license['has_license_12_5t_truck'] + || $user_driver_license['has_license_forklift']; } /** * Get a users driver license information * - * @param int $user_id - * The users id + * @param int $user_id The users id + * @return array|false|null */ -function UserDriverLicense($user_id) { - $user_driver_license = sql_select("SELECT * FROM `UserDriverLicenses` WHERE `user_id`='" . sql_escape($user_id) . "'"); - if ($user_driver_license === false) { - engelsystem_error('Unable to load user driver license.'); - return false; - } - if (count($user_driver_license) > 0) { - return $user_driver_license[0]; - } - return null; +function UserDriverLicense($user_id) +{ + $user_driver_license = DB::select(' + SELECT * + FROM `UserDriverLicenses` + WHERE `user_id`=?', [$user_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user driver license.'); + return false; + } + + if (empty($user_driver_license)) { + return null; + } + + return array_shift($user_driver_license); } /** * Create a user's driver license entry * - * @param UserDriverLicense $user_driver_license - * The UserDriverLicense to create + * @param array $user_driver_license The UserDriverLicense to create + * @param array $user + * @return array */ -function UserDriverLicenses_create($user_driver_license, $user) { - $user_driver_license['user_id'] = $user['UID']; - $result = sql_query(" - INSERT INTO `UserDriverLicenses` SET - `user_id`=" . sql_escape($user_driver_license['user_id']) . ", - `has_car`=" . sql_bool($user_driver_license['has_car']) . ", - `has_license_car`=" . sql_bool($user_driver_license['has_license_car']) . ", - `has_license_3_5t_transporter`=" . sql_bool($user_driver_license['has_license_3_5t_transporter']) . ", - `has_license_7_5t_truck`=" . sql_bool($user_driver_license['has_license_7_5t_truck']) . ", - `has_license_12_5t_truck`=" . sql_bool($user_driver_license['has_license_12_5t_truck']) . ", - `has_license_forklift`=" . sql_bool($user_driver_license['has_license_forklift'])); - if ($result === false) { - engelsystem_error('Unable to create user driver license'); - } - return $user_driver_license; +function UserDriverLicenses_create($user_driver_license, $user) +{ + $user_driver_license['user_id'] = $user['UID']; + DB::insert(' + INSERT INTO `UserDriverLicenses` ( + `user_id`, + `has_car`, + `has_license_car`, + `has_license_3_5t_transporter`, + `has_license_7_5t_truck`, + `has_license_12_5t_truck`, + `has_license_forklift` + ) + VALUES (?, ?, ?, ?, ?, ?, ?) + ', + [ + $user_driver_license['user_id'], + (bool)$user_driver_license['has_car'], + (bool)$user_driver_license['has_license_car'], + (bool)$user_driver_license['has_license_3_5t_transporter'], + (bool)$user_driver_license['has_license_7_5t_truck'], + (bool)$user_driver_license['has_license_12_5t_truck'], + (bool)$user_driver_license['has_license_forklift'], + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to create user driver license'); + } + + return $user_driver_license; } /** * Update a user's driver license entry * - * @param UserDriverLicense $user_driver_license - * The UserDriverLicense to update + * @param array $user_driver_license The UserDriverLicense to update + * @return bool */ -function UserDriverLicenses_update($user_driver_license) { - $result = sql_query("UPDATE `UserDriverLicenses` SET - `has_car`=" . sql_bool($user_driver_license['has_car']) . ", - `has_license_car`=" . sql_bool($user_driver_license['has_license_car']) . ", - `has_license_3_5t_transporter`=" . sql_bool($user_driver_license['has_license_3_5t_transporter']) . ", - `has_license_7_5t_truck`=" . sql_bool($user_driver_license['has_license_7_5t_truck']) . ", - `has_license_12_5t_truck`=" . sql_bool($user_driver_license['has_license_12_5t_truck']) . ", - `has_license_forklift`=" . sql_bool($user_driver_license['has_license_forklift']) . " - WHERE `user_id`='" . sql_escape($user_driver_license['user_id']) . "'"); - if ($result === false) { - engelsystem_error("Unable to update user driver license information"); - } - return $result; +function UserDriverLicenses_update($user_driver_license) +{ + $result = DB::update(' + UPDATE `UserDriverLicenses` + SET + `has_car`=?, + `has_license_car`=?, + `has_license_3_5t_transporter`=?, + `has_license_7_5t_truck`=?, + `has_license_12_5t_truck`=?, + `has_license_forklift`=? + WHERE `user_id`=? + ', + [ + (bool)$user_driver_license['has_car'], + (bool)$user_driver_license['has_license_car'], + (bool)$user_driver_license['has_license_3_5t_transporter'], + (bool)$user_driver_license['has_license_7_5t_truck'], + (bool)$user_driver_license['has_license_12_5t_truck'], + (bool)$user_driver_license['has_license_forklift'], + $user_driver_license['user_id'], + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to update user driver license information'); + } + return $result; } /** * Delete a user's driver license entry * - * @param int $user_id + * @param int $user_id + * @return bool */ -function UserDriverLicenses_delete($user_id) { - $result = sql_query("DELETE FROM `UserDriverLicenses` WHERE `user_id`=" . sql_escape($user_id)); - if ($result === false) { - engelsystem_error("Unable to remove user driver license information"); - } - return $result; +function UserDriverLicenses_delete($user_id) +{ + $result = DB::delete('DELETE FROM `UserDriverLicenses` WHERE `user_id`=?', [$user_id]); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to remove user driver license information'); + } + return $result; } -?>
\ No newline at end of file diff --git a/includes/model/UserGroups_model.php b/includes/model/UserGroups_model.php index 766f402f..d4baf638 100644 --- a/includes/model/UserGroups_model.php +++ b/includes/model/UserGroups_model.php @@ -1,17 +1,22 @@ <?php +use Engelsystem\Database\DB; + /** * Returns users groups - * @param User $user + * + * @param array $user + * @return array */ -function User_groups($user) { - return sql_select(" - SELECT `Groups`.* - FROM `UserGroups` - JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id` - WHERE `UserGroups`.`uid`='" . sql_escape($user['UID']) . "' - ORDER BY `UserGroups`.`group_id` - "); +function User_groups($user) +{ + return DB::select(' + SELECT `Groups`.* + FROM `UserGroups` + JOIN `Groups` ON `Groups`.`UID`=`UserGroups`.`group_id` + WHERE `UserGroups`.`uid`=? + ORDER BY `UserGroups`.`group_id` + ', + [$user['UID']] + ); } - -?>
\ No newline at end of file diff --git a/includes/model/User_model.php b/includes/model/User_model.php index 3ebd3bf9..2913c1a1 100644 --- a/includes/model/User_model.php +++ b/includes/model/User_model.php @@ -1,4 +1,6 @@ <?php + +use Engelsystem\Database\DB; use Engelsystem\ValidationResult; /** @@ -8,164 +10,292 @@ use Engelsystem\ValidationResult; /** * Delete a user * - * @param int $user_id + * @param int $user_id + * @return bool */ -function User_delete($user_id) { - return sql_query("DELETE FROM `User` WHERE `UID`='" . sql_escape($user_id) . "'"); +function User_delete($user_id) +{ + DB::delete('DELETE FROM `User` WHERE `UID`=?', [$user_id]); + + return DB::getStm()->errorCode() == '00000'; } /** * Update user. * - * @param User $user + * @param array $user + * @return bool */ -function User_update($user) { - return sql_query("UPDATE `User` SET - `Nick`='" . sql_escape($user['Nick']) . "', - `Name`='" . sql_escape($user['Name']) . "', - `Vorname`='" . sql_escape($user['Vorname']) . "', - `Alter`='" . sql_escape($user['Alter']) . "', - `Telefon`='" . sql_escape($user['Telefon']) . "', - `DECT`='" . sql_escape($user['DECT']) . "', - `Handy`='" . sql_escape($user['Handy']) . "', - `email`='" . sql_escape($user['email']) . "', - `email_shiftinfo`=" . sql_bool($user['email_shiftinfo']) . ", - `email_by_human_allowed`=" . sql_bool($user['email_by_human_allowed']) . ", - `jabber`='" . sql_escape($user['jabber']) . "', - `Size`='" . sql_escape($user['Size']) . "', - `Gekommen`='" . sql_escape($user['Gekommen']) . "', - `Aktiv`='" . sql_escape($user['Aktiv']) . "', - `force_active`=" . sql_bool($user['force_active']) . ", - `Tshirt`='" . sql_escape($user['Tshirt']) . "', - `color`='" . sql_escape($user['color']) . "', - `Sprache`='" . sql_escape($user['Sprache']) . "', - `Hometown`='" . sql_escape($user['Hometown']) . "', - `got_voucher`='" . sql_escape($user['got_voucher']) . "', - `arrival_date`='" . sql_escape($user['arrival_date']) . "', - `planned_arrival_date`='" . sql_escape($user['planned_arrival_date']) . "', - `planned_departure_date`=" . sql_null($user['planned_departure_date']) . " - WHERE `UID`='" . sql_escape($user['UID']) . "'"); +function User_update($user) +{ + return (bool)DB::update(' + UPDATE `User` SET + `Nick`=?, + `Name`=?, + `Vorname`=?, + `Alter`=?, + `Telefon`=?, + `DECT`=?, + `Handy`=?, + `email`=?, + `email_shiftinfo`=?, + `email_by_human_allowed`=?, + `jabber`=?, + `Size`=?, + `Gekommen`=?, + `Aktiv`=?, + `force_active`=?, + `Tshirt`=?, + `color`=?, + `Sprache`=?, + `Hometown`=?, + `got_voucher`=?, + `arrival_date`=?, + `planned_arrival_date`=?, + `planned_departure_date`=? + WHERE `UID`=? + ', + [ + $user['Nick'], + $user['Name'], + $user['Vorname'], + $user['Alter'], + $user['Telefon'], + $user['DECT'], + $user['Handy'], + $user['email'], + (bool)$user['email_shiftinfo'], + (bool)$user['email_by_human_allowed'], + $user['jabber'], + $user['Size'], + $user['Gekommen'], + $user['Aktiv'], + (bool)$user['force_active'], + $user['Tshirt'], + $user['color'], + $user['Sprache'], + $user['Hometown'], + $user['got_voucher'], + $user['arrival_date'], + $user['planned_arrival_date'], + $user['planned_departure_date'], + $user['UID'], + ] + ); } /** * Counts all forced active users. + * + * @return int */ -function User_force_active_count() { - return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `force_active` = 1"); +function User_force_active_count() +{ + $result = DB::select('SELECT COUNT(*) FROM `User` WHERE `force_active` = 1'); + $result = array_shift($result); + + if (empty($result)) { + return 0; + } + + return (int)array_shift($result); } -function User_active_count() { - return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Aktiv` = 1"); +/** + * @return int + */ +function User_active_count() +{ + $result = DB::select('SELECT COUNT(*) FROM `User` WHERE `Aktiv` = 1'); + $result = array_shift($result); + + if (empty($result)) { + return 0; + } + + return (int)array_shift($result); } -function User_got_voucher_count() { - return sql_select_single_cell("SELECT SUM(`got_voucher`) FROM `User`"); +/** + * @return int + */ +function User_got_voucher_count() +{ + $result = DB::select('SELECT SUM(`got_voucher`) FROM `User`'); + $result = array_shift($result); + + if (empty($result)) { + return 0; + } + + return (int)array_shift($result); } -function User_arrived_count() { - return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Gekommen` = 1"); +/** + * @return int + */ +function User_arrived_count() +{ + $result = DB::select('SELECT COUNT(*) FROM `User` WHERE `Gekommen` = 1'); + $result = array_shift($result); + + if (empty($result)) { + return 0; + } + + return (int)array_shift($result); } -function User_tshirts_count() { - return sql_select_single_cell("SELECT COUNT(*) FROM `User` WHERE `Tshirt` = 1"); +/** + * @return int + */ +function User_tshirts_count() +{ + $result = DB::select('SELECT COUNT(*) FROM `User` WHERE `Tshirt` = 1'); + $result = array_shift($result); + + if (empty($result)) { + return 0; + } + + return (int)array_shift($result); } /** * Returns all column names for sorting in an array. + * + * @return array */ -function User_sortable_columns() { - return [ - 'Nick', - 'Name', - 'Vorname', - 'Alter', - 'DECT', - 'email', - 'Size', - 'Gekommen', - 'Aktiv', - 'force_active', - 'Tshirt', - 'lastLogIn' - ]; +function User_sortable_columns() +{ + return [ + 'Nick', + 'Name', + 'Vorname', + 'Alter', + 'DECT', + 'email', + 'Size', + 'Gekommen', + 'Aktiv', + 'force_active', + 'Tshirt', + 'lastLogIn' + ]; } /** * Get all users, ordered by Nick by default or by given param. * - * @param string $order_by + * @param string $order_by + * @return array|false */ -function Users($order_by = 'Nick') { - return sql_select("SELECT * FROM `User` ORDER BY `" . sql_escape($order_by) . "` ASC"); +function Users($order_by = 'Nick') +{ + $result = DB::select(sprintf(' + SELECT * + FROM `User` + ORDER BY `%s` ASC + ', + trim(DB::getPdo()->quote($order_by), '\'') + )); + + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + return $result; } /** * Returns true if user is freeloader * - * @param User $user + * @param array $user + * @return bool */ -function User_is_freeloader($user) { - global $max_freeloadable_shifts, $user; - - return count(ShiftEntries_freeloaded_by_user($user)) >= $max_freeloadable_shifts; +function User_is_freeloader($user) +{ + global $user; + + return count(ShiftEntries_freeloaded_by_user($user)) >= config('max_freeloadable_shifts'); } /** * Returns all users that are not member of given angeltype. * - * @param Angeltype $angeltype + * @param array $angeltype Angeltype + * @return array */ -function Users_by_angeltype_inverted($angeltype) { - $result = sql_select(" - SELECT `User`.* - FROM `User` - LEFT JOIN `UserAngelTypes` ON (`User`.`UID`=`UserAngelTypes`.`user_id` AND `angeltype_id`='" . sql_escape($angeltype['id']) . "') - WHERE `UserAngelTypes`.`id` IS NULL - ORDER BY `Nick`"); - if ($result === false) { - engelsystem_error("Unable to load users."); - } - return $result; +function Users_by_angeltype_inverted($angeltype) +{ + $result = DB::select(' + SELECT `User`.* + FROM `User` + LEFT JOIN `UserAngelTypes` + ON (`User`.`UID`=`UserAngelTypes`.`user_id` AND `angeltype_id`=?) + WHERE `UserAngelTypes`.`id` IS NULL + ORDER BY `Nick` + ', + [ + $angeltype['id'] + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load users.'); + } + return $result; } /** * Returns all members of given angeltype. * - * @param Angeltype $angeltype + * @param array $angeltype + * @return array */ -function Users_by_angeltype($angeltype) { - $result = sql_select(" - SELECT - `User`.*, - `UserAngelTypes`.`id` as `user_angeltype_id`, - `UserAngelTypes`.`confirm_user_id`, - `UserAngelTypes`.`supporter`, - `UserDriverLicenses`.* - FROM `User` - JOIN `UserAngelTypes` ON `User`.`UID`=`UserAngelTypes`.`user_id` - LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id` - WHERE `UserAngelTypes`.`angeltype_id`='" . sql_escape($angeltype['id']) . "' - ORDER BY `Nick`"); - if ($result === false) { - engelsystem_error("Unable to load members."); - } - return $result; +function Users_by_angeltype($angeltype) +{ + $result = DB::select(' + SELECT + `User`.*, + `UserAngelTypes`.`id` AS `user_angeltype_id`, + `UserAngelTypes`.`confirm_user_id`, + `UserAngelTypes`.`supporter`, + `UserDriverLicenses`.* + FROM `User` + JOIN `UserAngelTypes` ON `User`.`UID`=`UserAngelTypes`.`user_id` + LEFT JOIN `UserDriverLicenses` ON `User`.`UID`=`UserDriverLicenses`.`user_id` + WHERE `UserAngelTypes`.`angeltype_id`=? + ORDER BY `Nick` + ', + [ + $angeltype['id'] + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load members.'); + } + return $result; } /** * Returns User id array + * + * @return array */ -function User_ids() { - return sql_select("SELECT `UID` FROM `User`"); +function User_ids() +{ + return DB::select('SELECT `UID` FROM `User`'); } /** * Strip unwanted characters from a users nick. * - * @param string $nick + * @param string $nick + * @return string */ -function User_validate_Nick($nick) { - return preg_replace("/([^a-z0-9üöäß. _+*-]{1,})/ui", '', $nick); +function User_validate_Nick($nick) +{ + return preg_replace('/([^\wüöäß. +*-]{1,})/ui', '', $nick); } /** @@ -175,9 +305,10 @@ function User_validate_Nick($nick) { * The email address to validate * @return ValidationResult */ -function User_validate_mail($mail) { - $mail = strip_item($mail); - return new ValidationResult(check_email($mail), $mail); +function User_validate_mail($mail) +{ + $mail = strip_item($mail); + return new ValidationResult(check_email($mail), $mail); } /** @@ -187,41 +318,42 @@ function User_validate_mail($mail) { * Jabber-ID to validate * @return ValidationResult */ -function User_validate_jabber($jabber) { - $jabber = strip_item($jabber); - if ($jabber == '') { - // Empty is ok - return new ValidationResult(true, ''); - } - return new ValidationResult(check_email($jabber), $jabber); +function User_validate_jabber($jabber) +{ + $jabber = strip_item($jabber); + if ($jabber == '') { + // Empty is ok + return new ValidationResult(true, ''); + } + return new ValidationResult(check_email($jabber), $jabber); } /** * Validate the planned arrival date * - * @param int $planned_arrival_date - * Unix timestamp + * @param int $planned_arrival_date Unix timestamp * @return ValidationResult */ -function User_validate_planned_arrival_date($planned_arrival_date) { - if ($planned_arrival_date == null) { - // null is not okay - return new ValidationResult(false, time()); - } - $event_config = EventConfig(); - if ($event_config == null) { - // Nothing to validate against +function User_validate_planned_arrival_date($planned_arrival_date) +{ + if ($planned_arrival_date == null) { + // null is not okay + return new ValidationResult(false, time()); + } + $event_config = EventConfig(); + if ($event_config == null) { + // Nothing to validate against + return new ValidationResult(true, $planned_arrival_date); + } + if (isset($event_config['buildup_start_date']) && $planned_arrival_date < $event_config['buildup_start_date']) { + // Planned arrival can not be before buildup start date + return new ValidationResult(false, $event_config['buildup_start_date']); + } + if (isset($event_config['teardown_end_date']) && $planned_arrival_date > $event_config['teardown_end_date']) { + // Planned arrival can not be after teardown end date + return new ValidationResult(false, $event_config['teardown_end_date']); + } return new ValidationResult(true, $planned_arrival_date); - } - if (isset($event_config['buildup_start_date']) && $planned_arrival_date < $event_config['buildup_start_date']) { - // Planned arrival can not be before buildup start date - return new ValidationResult(false, $event_config['buildup_start_date']); - } - if (isset($event_config['teardown_end_date']) && $planned_arrival_date > $event_config['teardown_end_date']) { - // Planned arrival can not be after teardown end date - return new ValidationResult(false, $event_config['teardown_end_date']); - } - return new ValidationResult(true, $planned_arrival_date); } /** @@ -233,45 +365,51 @@ function User_validate_planned_arrival_date($planned_arrival_date) { * Unix timestamp * @return ValidationResult */ -function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date) { - if ($planned_departure_date == null) { - // null is okay - return new ValidationResult(true, null); - } - if ($planned_arrival_date > $planned_departure_date) { - // departure cannot be before arrival - return new ValidationResult(false, $planned_arrival_date); - } - $event_config = EventConfig(); - if ($event_config == null) { - // Nothing to validate against +function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date) +{ + if ($planned_departure_date == null) { + // null is okay + return new ValidationResult(true, null); + } + if ($planned_arrival_date > $planned_departure_date) { + // departure cannot be before arrival + return new ValidationResult(false, $planned_arrival_date); + } + $event_config = EventConfig(); + if ($event_config == null) { + // Nothing to validate against + return new ValidationResult(true, $planned_departure_date); + } + if (isset($event_config['buildup_start_date']) && $planned_departure_date < $event_config['buildup_start_date']) { + // Planned arrival can not be before buildup start date + return new ValidationResult(false, $event_config['buildup_start_date']); + } + if (isset($event_config['teardown_end_date']) && $planned_departure_date > $event_config['teardown_end_date']) { + // Planned arrival can not be after teardown end date + return new ValidationResult(false, $event_config['teardown_end_date']); + } return new ValidationResult(true, $planned_departure_date); - } - if (isset($event_config['buildup_start_date']) && $planned_departure_date < $event_config['buildup_start_date']) { - // Planned arrival can not be before buildup start date - return new ValidationResult(false, $event_config['buildup_start_date']); - } - if (isset($event_config['teardown_end_date']) && $planned_departure_date > $event_config['teardown_end_date']) { - // Planned arrival can not be after teardown end date - return new ValidationResult(false, $event_config['teardown_end_date']); - } - return new ValidationResult(true, $planned_departure_date); } /** * Returns user by id. * - * @param $user_id UID + * @param int $user_id UID + * @return array|null */ -function User($user_id) { - $user_source = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - if ($user_source === false) { - engelsystem_error("Unable to load user."); - } - if (count($user_source) > 0) { - return $user_source[0]; - } - return null; +function User($user_id) +{ + $user_source = DB::select('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user.'); + } + + if (empty($user_source)) { + return null; + } + + return array_shift($user_source); } /** @@ -279,96 +417,138 @@ function User($user_id) { * * @param string $api_key * User api key - * @return Matching user, null or false on error + * @return array|null Matching user, null on error */ -function User_by_api_key($api_key) { - $user = sql_select("SELECT * FROM `User` WHERE `api_key`='" . sql_escape($api_key) . "' LIMIT 1"); - if ($user === false) { - engelsystem_error("Unable to find user by api key."); - } - if (count($user) == 0) { - return null; - } - return $user[0]; +function User_by_api_key($api_key) +{ + $user = DB::select('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to find user by api key.'); + } + + if (empty($user)) { + return null; + } + + return $user[0]; } /** * Returns User by email. * - * @param string $email - * @return Matching user, null or false on error + * @param string $email + * @return array|null Matching user, null or false on error */ -function User_by_email($email) { - $user = sql_select("SELECT * FROM `User` WHERE `email`='" . sql_escape($email) . "' LIMIT 1"); - if ($user === false) { - engelsystem_error("Unable to load user."); - } - if (count($user) == 0) { - return null; - } - return $user[0]; +function User_by_email($email) +{ + $user = DB::select('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user.'); + } + + if (empty($user)) { + return null; + } + + return array_shift($user); } /** * Returns User by password token. * - * @param string $token - * @return Matching user, null or false on error + * @param string $token + * @return array|null Matching user, null or false on error */ -function User_by_password_recovery_token($token) { - $user = sql_select("SELECT * FROM `User` WHERE `password_recovery_token`='" . sql_escape($token) . "' LIMIT 1"); - if ($user === false) { - engelsystem_error("Unable to load user."); - } - if (count($user) == 0) { - return null; - } - return $user[0]; +function User_by_password_recovery_token($token) +{ + $user = DB::select('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]); + + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to load user.'); + } + + if (empty($user)) { + return null; + } + + return array_shift($user); } /** * Generates a new api key for given user. * - * @param User $user + * @param array $user + * @param bool $log + * @return bool */ -function User_reset_api_key(&$user, $log = true) { - $user['api_key'] = md5($user['Nick'] . time() . rand()); - $result = sql_query("UPDATE `User` SET `api_key`='" . sql_escape($user['api_key']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1"); - if ($result === false) { - return false; - } - if ($log) { - engelsystem_log(sprintf("API key resetted (%s).", User_Nick_render($user))); - } +function User_reset_api_key(&$user, $log = true) +{ + $user['api_key'] = md5($user['Nick'] . time() . rand()); + DB::update(' + UPDATE `User` + SET `api_key`=? + WHERE `UID`=? + LIMIT 1 + ', + [ + $user['api_key'], + $user['UID'] + ] + ); + if (DB::getStm()->errorCode() != '00000') { + return false; + } + + if ($log) { + engelsystem_log(sprintf('API key resetted (%s).', User_Nick_render($user))); + } + + return true; } /** * Generates a new password recovery token for given user. * - * @param User $user + * @param array $user + * @return string */ -function User_generate_password_recovery_token(&$user) { - $user['password_recovery_token'] = md5($user['Nick'] . time() . rand()); - $result = sql_query("UPDATE `User` SET `password_recovery_token`='" . sql_escape($user['password_recovery_token']) . "' WHERE `UID`='" . sql_escape($user['UID']) . "' LIMIT 1"); - if ($result === false) { - engelsystem_error("Unable to generate password recovery token."); - } - engelsystem_log("Password recovery for " . User_Nick_render($user) . " started."); - return $user['password_recovery_token']; +function User_generate_password_recovery_token(&$user) +{ + $user['password_recovery_token'] = md5($user['Nick'] . time() . rand()); + DB::update(' + UPDATE `User` + SET `password_recovery_token`=? + WHERE `UID`=? + LIMIT 1 + ', + [ + $user['password_recovery_token'], + $user['UID'], + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to generate password recovery token.'); + } + engelsystem_log('Password recovery for ' . User_Nick_render($user) . ' started.'); + return $user['password_recovery_token']; } -function User_get_eligable_voucher_count(&$user) { - global $voucher_settings; - - $shifts_done = count(ShiftEntries_finished_by_user($user)); - - $earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers']; - $elegible_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers; - if ($elegible_vouchers < 0) { - return 0; - } - - return $elegible_vouchers; -} +/** + * @param array $user + * @return float + */ +function User_get_eligable_voucher_count(&$user) +{ + $voucher_settings = config('voucher_settings'); + $shifts_done = count(ShiftEntries_finished_by_user($user)); -?> + $earned_vouchers = $user['got_voucher'] - $voucher_settings['initial_vouchers']; + $elegible_vouchers = $shifts_done / $voucher_settings['shifts_per_voucher'] - $earned_vouchers; + if ($elegible_vouchers < 0) { + return 0; + } + + return $elegible_vouchers; +} diff --git a/includes/model/ValidationResult.php b/includes/model/ValidationResult.php index 0fc24161..7f88b432 100644 --- a/includes/model/ValidationResult.php +++ b/includes/model/ValidationResult.php @@ -6,37 +6,41 @@ namespace Engelsystem; * BO that represents the result of an entity attribute validation. * It contains the validated value and a bool for validation success. */ -class ValidationResult { +class ValidationResult +{ + /** @var bool */ + private $valid; - private $valid; + /** @var mixed */ + private $value; - private $value; + /** + * @param boolean $valid Is the value valid? + * @param mixed $value The validated value + */ + public function __construct($valid, $value) + { + $this->valid = $valid; + $this->value = $value; + } - /** - * Constructor. - * - * @param boolean $valid - * Is the value valid? - * @param * $value - * The validated value - */ - public function __construct($valid, $value) { - $this->valid = $valid; - $this->value = $value; - } + /** + * Is the value valid? + * + * @return bool + */ + public function isValid() + { + return $this->valid; + } - /** - * Is the value valid? - */ - public function isValid() { - return $this->valid; - } - - /** - * The parsed/validated value. - */ - public function getValue() { - return $this->value; - } + /** + * The parsed/validated value. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } } -?>
\ No newline at end of file diff --git a/includes/mysqli_provider.php b/includes/mysqli_provider.php deleted file mode 100644 index c81f157f..00000000 --- a/includes/mysqli_provider.php +++ /dev/null @@ -1,216 +0,0 @@ -<?php - -/** - * Close connection. - */ -function sql_close() { - global $sql_connection; - - return $sql_connection->close(); -} - -/** - * Return NULL if given value is null. - */ -function sql_null($value = null) { - return $value == null ? 'NULL' : ("'" . sql_escape($value) . "'"); -} - -/** - * Start new transaction. - */ -function sql_transaction_start() { - global $sql_nested_transaction_level; - - if ($sql_nested_transaction_level ++ == 0) { - return sql_query("BEGIN"); - } - - return true; -} - -/** - * Commit transaction. - */ -function sql_transaction_commit() { - global $sql_nested_transaction_level; - - if (-- $sql_nested_transaction_level == 0) { - return sql_query("COMMIT"); - } - - return true; -} - -/** - * Stop transaction, revert database. - */ -function sql_transaction_rollback() { - global $sql_nested_transaction_level; - - if (-- $sql_nested_transaction_level == 0) { - return sql_query("ROLLBACK"); - } - - return true; -} - -/** - * Logs an sql error. - * - * @param string $message - * @return false - */ -function sql_error($message) { - sql_close(); - - $message = trim($message) . "\n"; - $message .= debug_string_backtrace() . "\n"; - - error_log('mysql_provider error: ' . $message); - - return false; -} - -/** - * Connect to mysql server. - * - * @param string $host - * Host - * @param string $user - * Username - * @param string $pass - * Password - * @param string $db_name - * DB to select - * @return mysqli The connection handler - */ -function sql_connect($host, $user, $pass, $db_name) { - global $sql_connection; - - $sql_connection = new mysqli($host, $user, $pass, $db_name); - if ($sql_connection->connect_errno) { - error("Unable to connect to MySQL: " . $sql_connection->connect_error); - return sql_error("Unable to connect to MySQL: " . $sql_connection->connect_error); - } - - $result = $sql_connection->query("SET CHARACTER SET utf8;"); - if (! $result) { - return sql_error("Unable to set utf8 character set (" . $sql_connection->errno . ") " . $sql_connection->error); - } - - $result = $sql_connection->set_charset('utf8'); - if (! $result) { - return sql_error("Unable to set utf8 names (" . $sql_connection->errno . ") " . $sql_connection->error); - } - - return $sql_connection; -} - -/** - * Change the selected db in current mysql-connection. - * - * @param - * $db_name - * @return bool true on success, false on error - */ -function sql_select_db($db_name) { - global $sql_connection; - if (! $sql_connection->select_db($db_name)) { - return sql_error("No database selected."); - } - return true; -} - -/** - * MySQL SELECT query - * - * @param string $query - * @return Result array or false on error - */ -function sql_select($query) { - global $sql_connection; - -// echo $query . ";\n"; -// echo debug_string_backtrace() . "\n"; - - $result = $sql_connection->query($query); - if ($result) { - $data = []; - while ($line = $result->fetch_assoc()) { - array_push($data, $line); - } - return $data; - } - - return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error); -} - -/** - * MySQL execute a query - * - * @param string $query - * @return mysqli_result boolean resource or false on error - */ -function sql_query($query) { - global $sql_connection; - - $result = $sql_connection->query($query); - if ($result) { - return $result; - } - - return sql_error("MySQL-query error: " . $query . " (" . $sql_connection->errno . ") " . $sql_connection->error); -} - -/** - * Returns last inserted id. - * - * @return int - */ -function sql_id() { - global $sql_connection; - return $sql_connection->insert_id; -} - -/** - * Escape a string for a sql query. - * - * @param string $query - * @return string - */ -function sql_escape($query) { - global $sql_connection; - return $sql_connection->real_escape_string($query); -} - -/** - * Convert a boolean for mysql-queries. - * - * @param boolean $boolean - * @return string - */ -function sql_bool($boolean) { - return $boolean == true ? 'TRUE' : 'FALSE'; -} - -/** - * Count query result lines. - * - * @param string $query - * @return int Count of result lines - */ -function sql_num_query($query) { - return sql_query($query)->num_rows; -} - -function sql_select_single_col($query) { - $result = sql_select($query); - return array_map('array_shift', $result); -} - -function sql_select_single_cell($query) { - return array_shift(array_shift(sql_select($query))); -} - -?> diff --git a/includes/pages/admin_active.php b/includes/pages/admin_active.php index a1e31b11..d21afabe 100644 --- a/includes/pages/admin_active.php +++ b/includes/pages/admin_active.php @@ -1,202 +1,272 @@ <?php -function admin_active_title() { - return _("Active angels"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_active_title() +{ + return _('Active angels'); } -function admin_active() { - global $tshirt_sizes, $shift_sum_formula; - - $msg = ""; - $search = ""; - $forced_count = sql_num_query("SELECT * FROM `User` WHERE `force_active`=1"); - $count = $forced_count; - $limit = ""; - $set_active = ""; - - if (isset($_REQUEST['search'])) { - $search = strip_request_item('search'); - } - - $show_all_shifts = isset($_REQUEST['show_all_shifts']); - - if (isset($_REQUEST['set_active'])) { - $valid = true; - - if (isset($_REQUEST['count']) && preg_match("/^[0-9]+$/", $_REQUEST['count'])) { - $count = strip_request_item('count'); - if ($count < $forced_count) { - error(sprintf(_("At least %s angels are forced to be active. The number has to be greater."), $forced_count)); - redirect(page_link_to('admin_active')); - } - } else { - $valid = false; - $msg .= error(_("Please enter a number of angels to be marked as active."), true); - } - - if ($valid) { - $limit = " LIMIT " . $count; - } - if (isset($_REQUEST['ack'])) { - sql_query("UPDATE `User` SET `Aktiv` = 0 WHERE `Tshirt` = 0"); - $users = sql_select(" - SELECT `User`.*, COUNT(`ShiftEntry`.`id`) as `shift_count`, $shift_sum_formula as `shift_length` - FROM `User` - LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` - LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` - WHERE `User`.`Gekommen` = 1 AND `User`.`force_active`=0 - GROUP BY `User`.`UID` - ORDER BY `force_active` DESC, `shift_length` DESC" . $limit); - $user_nicks = []; - foreach ($users as $usr) { - sql_query("UPDATE `User` SET `Aktiv` = 1 WHERE `UID`='" . sql_escape($usr['UID']) . "'"); - $user_nicks[] = User_Nick_render($usr); - } - sql_query("UPDATE `User` SET `Aktiv`=1 WHERE `force_active`=TRUE"); - engelsystem_log("These angels are active now: " . join(", ", $user_nicks)); - - $limit = ""; - $msg = success(_("Marked angels."), true); - } else { - $set_active = '<a href="' . page_link_to('admin_active') . '&serach=' . $search . '">« ' . _("back") . '</a> | <a href="' . page_link_to('admin_active') . '&search=' . $search . '&count=' . $count . '&set_active&ack">' . _("apply") . '</a>'; - } - } - - if (isset($_REQUEST['active']) && preg_match("/^[0-9]+$/", $_REQUEST['active'])) { - $user_id = $_REQUEST['active']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Aktiv`=1 WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User " . User_Nick_render($user_source) . " is active now."); - $msg = success(_("Angel has been marked as active."), true); - } else { - $msg = error(_("Angel not found."), true); +/** + * @return string + */ +function admin_active() +{ + $tshirt_sizes = config('tshirt_sizes'); + $shift_sum_formula = config('shift_sum_formula'); + + $msg = ''; + $search = ''; + $forced_count = count(DB::select('SELECT `UID` FROM `User` WHERE `force_active`=1')); + $count = $forced_count; + $limit = ''; + $set_active = ''; + + if (isset($_REQUEST['search'])) { + $search = strip_request_item('search'); } - } elseif (isset($_REQUEST['not_active']) && preg_match("/^[0-9]+$/", $_REQUEST['not_active'])) { - $user_id = $_REQUEST['not_active']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Aktiv`=0 WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User " . User_Nick_render($user_source) . " is NOT active now."); - $msg = success(_("Angel has been marked as not active."), true); - } else { - $msg = error(_("Angel not found."), true); + + $show_all_shifts = isset($_REQUEST['show_all_shifts']); + + if (isset($_REQUEST['set_active'])) { + $valid = true; + + if (isset($_REQUEST['count']) && preg_match('/^\d+$/', $_REQUEST['count'])) { + $count = strip_request_item('count'); + if ($count < $forced_count) { + error(sprintf( + _('At least %s angels are forced to be active. The number has to be greater.'), + $forced_count + )); + redirect(page_link_to('admin_active')); + } + } else { + $valid = false; + $msg .= error(_('Please enter a number of angels to be marked as active.'), true); + } + + if ($valid) { + $limit = ' LIMIT ' . $count; + } + if (isset($_REQUEST['ack'])) { + DB::update('UPDATE `User` SET `Aktiv` = 0 WHERE `Tshirt` = 0'); + $users = DB::select(sprintf(' + SELECT + `User`.*, + COUNT(`ShiftEntry`.`id`) AS `shift_count`, + %s AS `shift_length` + FROM `User` + LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` + LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` + WHERE `User`.`Gekommen` = 1 + AND `User`.`force_active`=0 + GROUP BY `User`.`UID` + ORDER BY `force_active` DESC, `shift_length` DESC + %s + ', + $shift_sum_formula, + $limit + )); + $user_nicks = []; + foreach ($users as $usr) { + DB::update('UPDATE `User` SET `Aktiv` = 1 WHERE `UID`=?', [$usr['UID']]); + $user_nicks[] = User_Nick_render($usr); + } + DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `force_active`=TRUE'); + engelsystem_log('These angels are active now: ' . join(', ', $user_nicks)); + + $limit = ''; + $msg = success(_('Marked angels.'), true); + } else { + $set_active = '<a href="' . page_link_to('admin_active') . '&serach=' . $search . '">« ' + . _('back') . '</a> | <a href="' + . page_link_to('admin_active') . '&search=' . $search . '&count=' . $count . '&set_active&ack">' + . _('apply') + . '</a>'; + } } - } elseif (isset($_REQUEST['tshirt']) && preg_match("/^[0-9]+$/", $_REQUEST['tshirt'])) { - $user_id = $_REQUEST['tshirt']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Tshirt`=1 WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User " . User_Nick_render($user_source) . " has tshirt now."); - $msg = success(_("Angel has got a t-shirt."), true); - } else { - $msg = error("Angel not found.", true); + + if (isset($_REQUEST['active']) && preg_match('/^\d+$/', $_REQUEST['active'])) { + $user_id = $_REQUEST['active']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]); + engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.'); + $msg = success(_('Angel has been marked as active.'), true); + } else { + $msg = error(_('Angel not found.'), true); + } + } elseif (isset($_REQUEST['not_active']) && preg_match('/^\d+$/', $_REQUEST['not_active'])) { + $user_id = $_REQUEST['not_active']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]); + engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.'); + $msg = success(_('Angel has been marked as not active.'), true); + } else { + $msg = error(_('Angel not found.'), true); + } + } elseif (isset($_REQUEST['tshirt']) && preg_match('/^\d+$/', $_REQUEST['tshirt'])) { + $user_id = $_REQUEST['tshirt']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]); + engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.'); + $msg = success(_('Angel has got a t-shirt.'), true); + } else { + $msg = error('Angel not found.', true); + } + } elseif (isset($_REQUEST['not_tshirt']) && preg_match('/^\d+$/', $_REQUEST['not_tshirt'])) { + $user_id = $_REQUEST['not_tshirt']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]); + engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.'); + $msg = success(_('Angel has got no t-shirt.'), true); + } else { + $msg = error(_('Angel not found.'), true); + } } - } elseif (isset($_REQUEST['not_tshirt']) && preg_match("/^[0-9]+$/", $_REQUEST['not_tshirt'])) { - $user_id = $_REQUEST['not_tshirt']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Tshirt`=0 WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User " . User_Nick_render($user_source) . " has NO tshirt."); - $msg = success(_("Angel has got no t-shirt."), true); + + $users = DB::select(sprintf(' + SELECT + `User`.*, + COUNT(`ShiftEntry`.`id`) AS `shift_count`, + %s AS `shift_length` + FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` + LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` ' + . ($show_all_shifts ? '' : 'AND (`Shifts`.`end` < ' . time() . " OR `Shifts`.`end` IS NULL)") . ' + WHERE `User`.`Gekommen` = 1 + GROUP BY `User`.`UID` + ORDER BY `force_active` DESC, `shift_length` DESC + %s + ', + $shift_sum_formula, + $limit + )); + $matched_users = []; + if ($search == '') { + $tokens = []; } else { - $msg = error(_("Angel not found."), true); + $tokens = explode(' ', $search); } - } - - $users = sql_select(" - SELECT `User`.*, COUNT(`ShiftEntry`.`id`) as `shift_count`, ${shift_sum_formula} as `shift_length` - FROM `User` LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` - LEFT JOIN `Shifts` ON `ShiftEntry`.`SID` = `Shifts`.`SID` " . ($show_all_shifts ? "" : "AND (`Shifts`.`end` < " . time() . " OR `Shifts`.`end` IS NULL)") . " - WHERE `User`.`Gekommen` = 1 - GROUP BY `User`.`UID` - ORDER BY `force_active` DESC, `shift_length` DESC" . $limit); - $matched_users = []; - if ($search == "") { - $tokens = []; - } else { - $tokens = explode(" ", $search); - } - foreach ($users as &$usr) { - if (count($tokens) > 0) { - $match = false; - foreach ($tokens as $t) { - if (stristr($usr['Nick'], trim($t))) { - $match = true; - break; + foreach ($users as &$usr) { + if (count($tokens) > 0) { + $match = false; + foreach ($tokens as $t) { + if (stristr($usr['Nick'], trim($t))) { + $match = true; + break; + } + } + if (!$match) { + continue; + } } - } - if (! $match) { - continue; - } - } - $usr['nick'] = User_Nick_render($usr); - $usr['shirt_size'] = $tshirt_sizes[$usr['Size']]; - $usr['work_time'] = round($usr['shift_length'] / 60) . ' min (' . round($usr['shift_length'] / 3600) . ' h)'; - $usr['active'] = glyph_bool($usr['Aktiv'] == 1); - $usr['force_active'] = glyph_bool($usr['force_active'] == 1); - $usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1); - - $actions = []; - if ($usr['Aktiv'] == 0) { - $actions[] = '<a href="' . page_link_to('admin_active') . '&active=' . $usr['UID'] . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' . _("set active") . '</a>'; - } - if ($usr['Aktiv'] == 1 && $usr['Tshirt'] == 0) { - $actions[] = '<a href="' . page_link_to('admin_active') . '&not_active=' . $usr['UID'] . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' . _("remove active") . '</a>'; - $actions[] = '<a href="' . page_link_to('admin_active') . '&tshirt=' . $usr['UID'] . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' . _("got t-shirt") . '</a>'; - } - if ($usr['Tshirt'] == 1) { - $actions[] = '<a href="' . page_link_to('admin_active') . '&not_tshirt=' . $usr['UID'] . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' . _("remove t-shirt") . '</a>'; + $usr['nick'] = User_Nick_render($usr); + $usr['shirt_size'] = $tshirt_sizes[$usr['Size']]; + $usr['work_time'] = round($usr['shift_length'] / 60) . ' min (' . round($usr['shift_length'] / 3600) . ' h)'; + $usr['active'] = glyph_bool($usr['Aktiv'] == 1); + $usr['force_active'] = glyph_bool($usr['force_active'] == 1); + $usr['tshirt'] = glyph_bool($usr['Tshirt'] == 1); + + $actions = []; + if ($usr['Aktiv'] == 0) { + $actions[] = '<a href="' + . page_link_to('admin_active') . '&active=' . $usr['UID'] + . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' + . _('set active') + . '</a>'; + } + if ($usr['Aktiv'] == 1 && $usr['Tshirt'] == 0) { + $actions[] = '<a href="' + . page_link_to('admin_active') . '&not_active=' . $usr['UID'] + . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' + . _('remove active') + . '</a>'; + $actions[] = '<a href="' + . page_link_to('admin_active') . '&tshirt=' . $usr['UID'] + . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' + . _('got t-shirt') + . '</a>'; + } + if ($usr['Tshirt'] == 1) { + $actions[] = '<a href="' + . page_link_to('admin_active') . '&not_tshirt=' . $usr['UID'] + . ($show_all_shifts ? '&show_all_shifts=' : '') . '&search=' . $search . '">' + . _('remove t-shirt') + . '</a>'; + } + + $usr['actions'] = join(' ', $actions); + + $matched_users[] = $usr; } - - $usr['actions'] = join(' ', $actions); - - $matched_users[] = $usr; - } - - $shirt_statistics = []; - foreach (array_keys($tshirt_sizes) as $size) { - if ($size != '') { - $shirt_statistics[] = [ - 'size' => $size, - 'needed' => sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Size`='" . sql_escape($size) . "' AND `Gekommen`=1"), - 'given' => sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Size`='" . sql_escape($size) . "' AND `Tshirt`=1") - ]; + + $shirt_statistics = []; + foreach (array_keys($tshirt_sizes) as $size) { + if (!empty($size)) { + $sc = DB::select( + 'SELECT count(*) FROM `User` WHERE `Size`=? AND `Gekommen`=1', + [$size] + ); + $sc = array_shift($sc); + $sc = array_shift($sc); + + $gc = DB::select( + 'SELECT count(*) FROM `User` WHERE `Size`=? AND `Tshirt`=1', + [$size] + ); + $gc = array_shift($gc); + $gc = array_shift($gc); + + $shirt_statistics[] = [ + 'size' => $size, + 'needed' => (int)$sc, + 'given' => (int)$gc + ]; + } } - } - $shirt_statistics[] = [ - 'size' => '<b>' . _("Sum") . '</b>', - 'needed' => '<b>' . User_arrived_count() . '</b>', - 'given' => '<b>' . sql_select_single_cell("SELECT count(*) FROM `User` WHERE `Tshirt`=1") . '</b>' - ]; - - return page_with_title(admin_active_title(), [ - form([ - form_text('search', _("Search angel:"), $search), - form_checkbox('show_all_shifts', _("Show all shifts"), $show_all_shifts), - form_submit('submit', _("Search")) - ], page_link_to('admin_active')), - $set_active == "" ? form([ - form_text('count', _("How much angels should be active?"), $count), - form_submit('set_active', _("Preview")) - ]) : $set_active, - msg(), - table([ - 'nick' => _("Nickname"), - 'shirt_size' => _("Size"), - 'shift_count' => _("Shifts"), - 'work_time' => _("Length"), - 'active' => _("Active?"), - 'force_active' => _("Forced"), - 'tshirt' => _("T-shirt?"), - 'actions' => "" - ], $matched_users), - '<h2>' . _("Shirt statistics") . '</h2>', - table([ - 'size' => _("Size"), - 'needed' => _("Needed shirts"), - 'given' => _("Given shirts") - ], $shirt_statistics) - ]); + + $uc = DB::select('SELECT count(*) FROM `User` WHERE `Tshirt`=1'); + $uc = array_shift($uc); + $uc = array_shift($uc); + + $shirt_statistics[] = [ + 'size' => '<b>' . _('Sum') . '</b>', + 'needed' => '<b>' . User_arrived_count() . '</b>', + 'given' => '<b>' . (int)$uc . '</b>' + ]; + + return page_with_title(admin_active_title(), [ + form([ + form_text('search', _('Search angel:'), $search), + form_checkbox('show_all_shifts', _('Show all shifts'), $show_all_shifts), + form_submit('submit', _('Search')) + ], page_link_to('admin_active')), + $set_active == '' ? form([ + form_text('count', _('How much angels should be active?'), $count), + form_submit('set_active', _('Preview')) + ]) : $set_active, + $msg . msg(), + table([ + 'nick' => _('Nickname'), + 'shirt_size' => _('Size'), + 'shift_count' => _('Shifts'), + 'work_time' => _('Length'), + 'active' => _('Active?'), + 'force_active' => _('Forced'), + 'tshirt' => _('T-shirt?'), + 'actions' => '' + ], $matched_users), + '<h2>' . _('Shirt statistics') . '</h2>', + table([ + 'size' => _('Size'), + 'needed' => _('Needed shirts'), + 'given' => _('Given shirts') + ], $shirt_statistics) + ]); } -?> diff --git a/includes/pages/admin_arrive.php b/includes/pages/admin_arrive.php index 4a1ee8d7..77155dae 100644 --- a/includes/pages/admin_arrive.php +++ b/includes/pages/admin_arrive.php @@ -1,201 +1,222 @@ <?php -function admin_arrive_title() { - return _("Arrived angels"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_arrive_title() +{ + return _('Arrived angels'); } -function admin_arrive() { - $msg = ""; - $search = ""; - if (isset($_REQUEST['search'])) { - $search = strip_request_item('search'); - } - - if (isset($_REQUEST['reset']) && preg_match("/^[0-9]*$/", $_REQUEST['reset'])) { - $user_id = $_REQUEST['reset']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Gekommen`=0, `arrival_date` = NULL WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User set to not arrived: " . User_Nick_render($user_source)); - success(_("Reset done. Angel has not arrived.")); - redirect(user_link($user_source)); - } else { - $msg = error(_("Angel not found."), true); - } - } elseif (isset($_REQUEST['arrived']) && preg_match("/^[0-9]*$/", $_REQUEST['arrived'])) { - $user_id = $_REQUEST['arrived']; - $user_source = User($user_id); - if ($user_source != null) { - sql_query("UPDATE `User` SET `Gekommen`=1, `arrival_date`='" . time() . "' WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - engelsystem_log("User set has arrived: " . User_Nick_render($user_source)); - success(_("Angel has been marked as arrived.")); - redirect(user_link($user_source)); - } else { - $msg = error(_("Angel not found."), true); +/** + * @return string + */ +function admin_arrive() +{ + $msg = ''; + $search = ''; + if (isset($_REQUEST['search'])) { + $search = strip_request_item('search'); } - } - - $users = sql_select("SELECT * FROM `User` ORDER BY `Nick`"); - $arrival_count_at_day = []; - $planned_arrival_count_at_day = []; - $planned_departure_count_at_day = []; - $users_matched = []; - if ($search == "") { - $tokens = []; - } else { - $tokens = explode(" ", $search); - } - foreach ($users as $usr) { - if (count($tokens) > 0) { - $match = false; - $index = join(" ", $usr); - foreach ($tokens as $t) { - if (stristr($index, trim($t))) { - $match = true; - break; + + if (isset($_REQUEST['reset']) && preg_match('/^\d*$/', $_REQUEST['reset'])) { + $user_id = $_REQUEST['reset']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update(' + UPDATE `User` + SET `Gekommen`=0, `arrival_date` = NULL + WHERE `UID`=? + LIMIT 1 + ', [$user_id]); + engelsystem_log('User set to not arrived: ' . User_Nick_render($user_source)); + success(_('Reset done. Angel has not arrived.')); + redirect(user_link($user_source)); + } else { + $msg = error(_('Angel not found.'), true); + } + } elseif (isset($_REQUEST['arrived']) && preg_match('/^\d*$/', $_REQUEST['arrived'])) { + $user_id = $_REQUEST['arrived']; + $user_source = User($user_id); + if ($user_source != null) { + DB::update(' + UPDATE `User` + SET `Gekommen`=1, `arrival_date`=? + WHERE `UID`=? + LIMIT 1 + ', [time(), $user_id]); + engelsystem_log('User set has arrived: ' . User_Nick_render($user_source)); + success(_('Angel has been marked as arrived.')); + redirect(user_link($user_source)); + } else { + $msg = error(_('Angel not found.'), true); } - } - if (! $match) { - continue; - } } - - $usr['nick'] = User_Nick_render($usr); - if ($usr['planned_departure_date'] != null) { - $usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']); + + $users = DB::select('SELECT * FROM `User` ORDER BY `Nick`'); + $arrival_count_at_day = []; + $planned_arrival_count_at_day = []; + $planned_departure_count_at_day = []; + $users_matched = []; + if ($search == '') { + $tokens = []; } else { - $usr['rendered_planned_departure_date'] = '-'; + $tokens = explode(' ', $search); } - $usr['rendered_planned_arrival_date'] = date('Y-m-d', $usr['planned_arrival_date']); - $usr['rendered_arrival_date'] = $usr['arrival_date'] > 0 ? date('Y-m-d', $usr['arrival_date']) : "-"; - $usr['arrived'] = $usr['Gekommen'] == 1 ? _("yes") : ""; - $usr['actions'] = $usr['Gekommen'] == 1 ? '<a href="' . page_link_to('admin_arrive') . '&reset=' . $usr['UID'] . '&search=' . $search . '">' . _("reset") . '</a>' : '<a href="' . page_link_to('admin_arrive') . '&arrived=' . $usr['UID'] . '&search=' . $search . '">' . _("arrived") . '</a>'; - - if ($usr['arrival_date'] > 0) { - $day = date('Y-m-d', $usr['arrival_date']); - if (! isset($arrival_count_at_day[$day])) { - $arrival_count_at_day[$day] = 0; - } - $arrival_count_at_day[$day] ++; + foreach ($users as $usr) { + if (count($tokens) > 0) { + $match = false; + $index = join(' ', $usr); + foreach ($tokens as $t) { + if (stristr($index, trim($t))) { + $match = true; + break; + } + } + if (!$match) { + continue; + } + } + + $usr['nick'] = User_Nick_render($usr); + if ($usr['planned_departure_date'] != null) { + $usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']); + } else { + $usr['rendered_planned_departure_date'] = '-'; + } + $usr['rendered_planned_arrival_date'] = date('Y-m-d', $usr['planned_arrival_date']); + $usr['rendered_arrival_date'] = $usr['arrival_date'] > 0 ? date('Y-m-d', $usr['arrival_date']) : '-'; + $usr['arrived'] = $usr['Gekommen'] == 1 ? _('yes') : ''; + $usr['actions'] = $usr['Gekommen'] == 1 + ? '<a href="' . page_link_to('admin_arrive') . '&reset=' . $usr['UID'] . '&search=' . $search . '">' . _('reset') . '</a>' + : '<a href="' . page_link_to('admin_arrive') . '&arrived=' . $usr['UID'] . '&search=' . $search . '">' . _('arrived') . '</a>'; + + if ($usr['arrival_date'] > 0) { + $day = date('Y-m-d', $usr['arrival_date']); + if (!isset($arrival_count_at_day[$day])) { + $arrival_count_at_day[$day] = 0; + } + $arrival_count_at_day[$day]++; + } + + if ($usr['planned_arrival_date'] != null) { + $day = date('Y-m-d', $usr['planned_arrival_date']); + if (!isset($planned_arrival_count_at_day[$day])) { + $planned_arrival_count_at_day[$day] = 0; + } + $planned_arrival_count_at_day[$day]++; + } + + if ($usr['planned_departure_date'] != null && $usr['Gekommen'] == 1) { + $day = date('Y-m-d', $usr['planned_departure_date']); + if (!isset($planned_departure_count_at_day[$day])) { + $planned_departure_count_at_day[$day] = 0; + } + $planned_departure_count_at_day[$day]++; + } + + $users_matched[] = $usr; } - - if ($usr['planned_arrival_date'] != null) { - $day = date('Y-m-d', $usr['planned_arrival_date']); - if (! isset($planned_arrival_count_at_day[$day])) { - $planned_arrival_count_at_day[$day] = 0; - } - $planned_arrival_count_at_day[$day] ++; + + ksort($arrival_count_at_day); + ksort($planned_arrival_count_at_day); + ksort($planned_departure_count_at_day); + + $arrival_at_day = []; + $arrival_sum = 0; + foreach ($arrival_count_at_day as $day => $count) { + $arrival_sum += $count; + $arrival_at_day[$day] = [ + 'day' => $day, + 'count' => $count, + 'sum' => $arrival_sum + ]; } - - if ($usr['planned_departure_date'] != null && $usr['Gekommen'] == 1) { - $day = date('Y-m-d', $usr['planned_departure_date']); - if (! isset($planned_departure_count_at_day[$day])) { - $planned_departure_count_at_day[$day] = 0; - } - $planned_departure_count_at_day[$day] ++; + + $planned_arrival_at_day = []; + $planned_arrival_sum = 0; + foreach ($planned_arrival_count_at_day as $day => $count) { + $planned_arrival_sum += $count; + $planned_arrival_at_day[$day] = [ + 'day' => $day, + 'count' => $count, + 'sum' => $planned_arrival_sum + ]; } - - $users_matched[] = $usr; - } - - ksort($arrival_count_at_day); - ksort($planned_arrival_count_at_day); - ksort($planned_departure_count_at_day); - - $arrival_at_day = []; - $arrival_sum = 0; - foreach ($arrival_count_at_day as $day => $count) { - $arrival_sum += $count; - $arrival_at_day[$day] = [ - 'day' => $day, - 'count' => $count, - 'sum' => $arrival_sum - ]; - } - - $planned_arrival_at_day = []; - $planned_arrival_sum = 0; - foreach ($planned_arrival_count_at_day as $day => $count) { - $planned_arrival_sum += $count; - $planned_arrival_at_day[$day] = [ - 'day' => $day, - 'count' => $count, - 'sum' => $planned_arrival_sum - ]; - } - - $planned_departure_at_day = []; - $planned_departure_sum = 0; - foreach ($planned_departure_count_at_day as $day => $count) { - $planned_departure_sum += $count; - $planned_departure_at_day[$day] = [ - 'day' => $day, - 'count' => $count, - 'sum' => $planned_departure_sum - ]; - } - - return page_with_title(admin_arrive_title(), [ - msg(), - form([ - form_text('search', _("Search"), $search), - form_submit('submit', _("Search")) - ]), - table([ - 'nick' => _("Nickname"), - 'rendered_planned_arrival_date' => _("Planned arrival"), - 'arrived' => _("Arrived?"), - 'rendered_arrival_date' => _("Arrival date"), - 'rendered_planned_departure_date' => _("Planned departure"), - 'actions' => "" - ], $users_matched), - div('row', [ - div('col-md-4', [ - heading(_("Planned arrival statistics"), 2), - bargraph('planned_arrives', 'day', [ - 'count' => _("arrived"), - 'sum' => _("arrived sum") - ], [ - 'count' => '#090', - 'sum' => '#888' - ], $planned_arrival_at_day), - table([ - 'day' => _("Date"), - 'count' => _("Count"), - 'sum' => _("Sum") - ], $planned_arrival_at_day) - ]), - div('col-md-4', [ - heading(_("Arrival statistics"), 2), - bargraph('arrives', 'day', [ - 'count' => _("arrived"), - 'sum' => _("arrived sum") - ], [ - 'count' => '#090', - 'sum' => '#888' - ], $arrival_at_day), - table([ - 'day' => _("Date"), - 'count' => _("Count"), - 'sum' => _("Sum") - ], $arrival_at_day) - ]), - div('col-md-4', [ - heading(_("Planned departure statistics"), 2), - bargraph('planned_departures', 'day', [ - 'count' => _("arrived"), - 'sum' => _("arrived sum") - ], [ - 'count' => '#090', - 'sum' => '#888' - ], $planned_departure_at_day), - table([ - 'day' => _("Date"), - 'count' => _("Count"), - 'sum' => _("Sum") - ], $planned_departure_at_day) - ]) - ]) - ]); + + $planned_departure_at_day = []; + $planned_departure_sum = 0; + foreach ($planned_departure_count_at_day as $day => $count) { + $planned_departure_sum += $count; + $planned_departure_at_day[$day] = [ + 'day' => $day, + 'count' => $count, + 'sum' => $planned_departure_sum + ]; + } + + return page_with_title(admin_arrive_title(), [ + $msg . msg(), + form([ + form_text('search', _('Search'), $search), + form_submit('submit', _('Search')) + ]), + table([ + 'nick' => _('Nickname'), + 'rendered_planned_arrival_date' => _('Planned arrival'), + 'arrived' => _('Arrived?'), + 'rendered_arrival_date' => _('Arrival date'), + 'rendered_planned_departure_date' => _('Planned departure'), + 'actions' => '' + ], $users_matched), + div('row', [ + div('col-md-4', [ + heading(_('Planned arrival statistics'), 2), + bargraph('planned_arrives', 'day', [ + 'count' => _('arrived'), + 'sum' => _('arrived sum') + ], [ + 'count' => '#090', + 'sum' => '#888' + ], $planned_arrival_at_day), + table([ + 'day' => _('Date'), + 'count' => _('Count'), + 'sum' => _('Sum') + ], $planned_arrival_at_day) + ]), + div('col-md-4', [ + heading(_('Arrival statistics'), 2), + bargraph('arrives', 'day', [ + 'count' => _('arrived'), + 'sum' => _('arrived sum') + ], [ + 'count' => '#090', + 'sum' => '#888' + ], $arrival_at_day), + table([ + 'day' => _('Date'), + 'count' => _('Count'), + 'sum' => _('Sum') + ], $arrival_at_day) + ]), + div('col-md-4', [ + heading(_('Planned departure statistics'), 2), + bargraph('planned_departures', 'day', [ + 'count' => _('arrived'), + 'sum' => _('arrived sum') + ], [ + 'count' => '#090', + 'sum' => '#888' + ], $planned_departure_at_day), + table([ + 'day' => _('Date'), + 'count' => _('Count'), + 'sum' => _('Sum') + ], $planned_departure_at_day) + ]) + ]) + ]); } -?> diff --git a/includes/pages/admin_free.php b/includes/pages/admin_free.php index 427de61a..daaead22 100644 --- a/includes/pages/admin_free.php +++ b/includes/pages/admin_free.php @@ -1,101 +1,127 @@ <?php -function admin_free_title() { - return _("Free angels"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_free_title() +{ + return _('Free angels'); } -function admin_free() { - global $privileges; - - $search = ""; - if (isset($_REQUEST['search'])) { - $search = strip_request_item('search'); - } - - $angeltypesearch = ""; - if (empty($_REQUEST['angeltype'])) { - $_REQUEST['angeltype'] = ''; - } else { - $angeltypesearch = " INNER JOIN `UserAngelTypes` ON (`UserAngelTypes`.`angeltype_id` = '" . sql_escape($_REQUEST['angeltype']) . "' AND `UserAngelTypes`.`user_id` = `User`.`UID`"; - if (isset($_REQUEST['confirmed_only'])) { - $angeltypesearch .= " AND `UserAngelTypes`.`confirm_user_id`"; +/** + * @return string + */ +function admin_free() +{ + global $privileges; + + $search = ''; + if (isset($_REQUEST['search'])) { + $search = strip_request_item('search'); } - $angeltypesearch .= ") "; - } - - $angel_types_source = sql_select("SELECT `id`, `name` FROM `AngelTypes` ORDER BY `name`"); - $angel_types = [ - '' => 'alle Typen' - ]; - foreach ($angel_types_source as $angel_type) { - $angel_types[$angel_type['id']] = $angel_type['name']; - } - - $users = sql_select(" - SELECT `User`.* - FROM `User` - ${angeltypesearch} - LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` - LEFT JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID` AND `Shifts`.`start` < '" . sql_escape(time()) . "' AND `Shifts`.`end` > '" . sql_escape(time()) . "') - WHERE `User`.`Gekommen` = 1 AND `Shifts`.`SID` IS NULL - GROUP BY `User`.`UID` - ORDER BY `Nick`"); - - $free_users_table = []; - if ($search == "") { - $tokens = []; - } else { - $tokens = explode(" ", $search); - } - foreach ($users as $usr) { - if (count($tokens) > 0) { - $match = false; - $index = join("", $usr); - foreach ($tokens as $t) { - if (stristr($index, trim($t))) { - $match = true; - break; + + $angelTypeSearch = ''; + if (empty($_REQUEST['angeltype'])) { + $_REQUEST['angeltype'] = ''; + } else { + $angelTypeSearch = ' INNER JOIN `UserAngelTypes` ON (`UserAngelTypes`.`angeltype_id` = ' + . DB::getPdo()->quote($_REQUEST['angeltype']) + . ' AND `UserAngelTypes`.`user_id` = `User`.`UID`'; + if (isset($_REQUEST['confirmed_only'])) { + $angelTypeSearch .= ' AND `UserAngelTypes`.`confirm_user_id`'; } - } - if (! $match) { - continue; - } + $angelTypeSearch .= ') '; } - - $free_users_table[] = [ - 'name' => User_Nick_render($usr), - 'shift_state' => User_shift_state_render($usr), - 'dect' => $usr['DECT'], - 'jabber' => $usr['jabber'], - 'email' => $usr['email_by_human_allowed'] ? $usr['email'] : glyph('eye-close'), - 'actions' => in_array('admin_user', $privileges) ? button(page_link_to('admin_user') . '&id=' . $usr['UID'], _("edit"), 'btn-xs') : '' + + $angel_types_source = DB::select('SELECT `id`, `name` FROM `AngelTypes` ORDER BY `name`'); + $angel_types = [ + '' => 'alle Typen' ]; - } - return page_with_title(admin_free_title(), [ - form([ - div('row', [ - div('col-md-4', [ - form_text('search', _("Search"), $search) - ]), - div('col-md-4', [ - form_select('angeltype', _("Angeltype"), $angel_types, $_REQUEST['angeltype']) - ]), - div('col-md-2', [ - form_checkbox('confirmed_only', _("Only confirmed"), isset($_REQUEST['confirmed_only'])) - ]), - div('col-md-2', [ - form_submit('submit', _("Search")) - ]) - ]) - ]), - table([ - 'name' => _("Nick"), - 'shift_state' => '', - 'dect' => _("DECT"), - 'jabber' => _("Jabber"), - 'email' => _("E-Mail"), - 'actions' => '' - ], $free_users_table) - ]); + foreach ($angel_types_source as $angel_type) { + $angel_types[$angel_type['id']] = $angel_type['name']; + } + + $users = DB::select(' + SELECT `User`.* + FROM `User` + ' . $angelTypeSearch . ' + LEFT JOIN `ShiftEntry` ON `User`.`UID` = `ShiftEntry`.`UID` + LEFT JOIN `Shifts` + ON ( + `ShiftEntry`.`SID` = `Shifts`.`SID` + AND `Shifts`.`start` < ? + AND `Shifts`.`end` > ? + ) + WHERE `User`.`Gekommen` = 1 + AND `Shifts`.`SID` IS NULL + GROUP BY `User`.`UID` + ORDER BY `Nick` + ', + [ + time(), + time(), + ] + ); + + $free_users_table = []; + if ($search == '') { + $tokens = []; + } else { + $tokens = explode(' ', $search); + } + foreach ($users as $usr) { + if (count($tokens) > 0) { + $match = false; + $index = join('', $usr); + foreach ($tokens as $t) { + if (stristr($index, trim($t))) { + $match = true; + break; + } + } + if (!$match) { + continue; + } + } + + $free_users_table[] = [ + 'name' => User_Nick_render($usr), + 'shift_state' => User_shift_state_render($usr), + 'dect' => $usr['DECT'], + 'jabber' => $usr['jabber'], + 'email' => $usr['email_by_human_allowed'] ? $usr['email'] : glyph('eye-close'), + 'actions' => + in_array('admin_user', $privileges) + ? button(page_link_to('admin_user') . '&id=' . $usr['UID'], _('edit'), 'btn-xs') + : '' + ]; + } + return page_with_title(admin_free_title(), [ + form([ + div('row', [ + div('col-md-4', [ + form_text('search', _('Search'), $search) + ]), + div('col-md-4', [ + form_select('angeltype', _('Angeltype'), $angel_types, $_REQUEST['angeltype']) + ]), + div('col-md-2', [ + form_checkbox('confirmed_only', _('Only confirmed'), isset($_REQUEST['confirmed_only'])) + ]), + div('col-md-2', [ + form_submit('submit', _('Search')) + ]) + ]) + ]), + table([ + 'name' => _('Nick'), + 'shift_state' => '', + 'dect' => _('DECT'), + 'jabber' => _('Jabber'), + 'email' => _('E-Mail'), + 'actions' => '' + ], $free_users_table) + ]); } -?> diff --git a/includes/pages/admin_groups.php b/includes/pages/admin_groups.php index 388e2c68..4011ccf1 100644 --- a/includes/pages/admin_groups.php +++ b/includes/pages/admin_groups.php @@ -1,97 +1,144 @@ <?php -function admin_groups_title() { - return _("Grouprights"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_groups_title() +{ + return _('Grouprights'); } -function admin_groups() { - $html = ""; - $groups = sql_select("SELECT * FROM `Groups` ORDER BY `Name`"); - if (! isset($_REQUEST["action"])) { - $groups_table = []; - foreach ($groups as $group) { - $privileges = sql_select("SELECT * FROM `GroupPrivileges` JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) WHERE `group_id`='" . sql_escape($group['UID']) . "'"); - $privileges_html = []; - - foreach ($privileges as $priv) { - $privileges_html[] = $priv['name']; - } - - $groups_table[] = [ - 'name' => $group['Name'], - 'privileges' => join(', ', $privileges_html), - 'actions' => button(page_link_to('admin_groups') . '&action=edit&id=' . $group['UID'], _("edit"), 'btn-xs') - ]; - } - - return page_with_title(admin_groups_title(), [ - table([ - 'name' => _("Name"), - 'privileges' => _("Privileges"), - 'actions' => '' - ], $groups_table) - ]); - } else { - switch ($_REQUEST["action"]) { - case 'edit': - if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) { - $group_id = $_REQUEST['id']; - } else { - return error("Incomplete call, missing Groups ID.", true); - } - - $group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1"); - if (count($group) > 0) { - list($group) = $group; - $privileges = sql_select("SELECT `Privileges`.*, `GroupPrivileges`.`group_id` FROM `Privileges` LEFT OUTER JOIN `GroupPrivileges` ON (`Privileges`.`id` = `GroupPrivileges`.`privilege_id` AND `GroupPrivileges`.`group_id`='" . sql_escape($group_id) . "') ORDER BY `Privileges`.`name`"); - $privileges_html = ""; - $privileges_form = []; - foreach ($privileges as $priv) { - $privileges_form[] = form_checkbox('privileges[]', $priv['desc'] . ' (' . $priv['name'] . ')', $priv['group_id'] != "", $priv['id']); - $privileges_html .= sprintf('<tr><td><input type="checkbox" ' . 'name="privileges[]" value="%s" %s />' . '</td> <td>%s</td> <td>%s</td></tr>', $priv['id'], ($priv['group_id'] != "" ? 'checked="checked"' : ''), $priv['name'], $priv['desc']); - } - - $privileges_form[] = form_submit('submit', _("Save")); - $html .= page_with_title(_("Edit group"), [ - form($privileges_form, page_link_to('admin_groups') . '&action=save&id=' . $group_id) - ]); - } else { - return error("No Group found.", true); - } - break; - - case 'save': - if (isset($_REQUEST['id']) && preg_match("/^-[0-9]{1,11}$/", $_REQUEST['id'])) { - $group_id = $_REQUEST['id']; - } else { - return error("Incomplete call, missing Groups ID.", true); - } - - $group = sql_select("SELECT * FROM `Groups` WHERE `UID`='" . sql_escape($group_id) . "' LIMIT 1"); - if (! is_array($_REQUEST['privileges'])) { - $_REQUEST['privileges'] = []; - } - if (count($group) > 0) { - list($group) = $group; - sql_query("DELETE FROM `GroupPrivileges` WHERE `group_id`='" . sql_escape($group_id) . "'"); - $privilege_names = []; - foreach ($_REQUEST['privileges'] as $priv) { - if (preg_match("/^[0-9]{1,}$/", $priv)) { - $group_privileges_source = sql_select("SELECT * FROM `Privileges` WHERE `id`='" . sql_escape($priv) . "' LIMIT 1"); - if (count($group_privileges_source) > 0) { - sql_query("INSERT INTO `GroupPrivileges` SET `group_id`='" . sql_escape($group_id) . "', `privilege_id`='" . sql_escape($priv) . "'"); - $privilege_names[] = $group_privileges_source[0]['name']; - } +/** + * @return string + */ +function admin_groups() +{ + $html = ''; + $groups = DB::select('SELECT * FROM `Groups` ORDER BY `Name`'); + if (!isset($_REQUEST['action'])) { + $groups_table = []; + foreach ($groups as $group) { + $privileges = DB::select(' + SELECT `name` + FROM `GroupPrivileges` + JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) + WHERE `group_id`=? + ', [$group['UID']]); + $privileges_html = []; + + foreach ($privileges as $privilege) { + $privileges_html[] = $privilege['name']; } - } - engelsystem_log("Group privileges of group " . $group['Name'] . " edited: " . join(", ", $privilege_names)); - redirect(page_link_to("admin_groups")); - } else { - return error("No Group found.", true); + + $groups_table[] = [ + 'name' => $group['Name'], + 'privileges' => join(', ', $privileges_html), + 'actions' => button( + page_link_to('admin_groups') . '&action=edit&id=' . $group['UID'], + _('edit'), + 'btn-xs' + ) + ]; + } + + return page_with_title(admin_groups_title(), [ + table([ + 'name' => _('Name'), + 'privileges' => _('Privileges'), + 'actions' => '' + ], $groups_table) + ]); + } else { + switch ($_REQUEST['action']) { + case 'edit': + if (isset($_REQUEST['id']) && preg_match('/^-\d{1,11}$/', $_REQUEST['id'])) { + $group_id = $_REQUEST['id']; + } else { + return error('Incomplete call, missing Groups ID.', true); + } + + $group = DB::select('SELECT * FROM `Groups` WHERE `UID`=? LIMIT 1', [$group_id]); + if (!empty($group)) { + $privileges = DB::select(' + SELECT `Privileges`.*, `GroupPrivileges`.`group_id` + FROM `Privileges` + LEFT OUTER JOIN `GroupPrivileges` + ON ( + `Privileges`.`id` = `GroupPrivileges`.`privilege_id` + AND `GroupPrivileges`.`group_id`=? + ) + ORDER BY `Privileges`.`name` + ', [$group_id]); + $privileges_html = ''; + $privileges_form = []; + foreach ($privileges as $privilege) { + $privileges_form[] = form_checkbox( + 'privileges[]', + $privilege['desc'] . ' (' . $privilege['name'] . ')', + $privilege['group_id'] != '', + $privilege['id'] + ); + $privileges_html .= sprintf( + '<tr><td><input type="checkbox" name="privileges[]" value="%s" %s /></td> <td>%s</td> <td>%s</td></tr>', + $privilege['id'], + ($privilege['group_id'] != '' ? 'checked="checked"' : ''), + $privilege['name'], + $privilege['desc'] + ); + } + + $privileges_form[] = form_submit('submit', _('Save')); + $html .= page_with_title(_('Edit group'), [ + form($privileges_form, page_link_to('admin_groups') . '&action=save&id=' . $group_id) + ]); + } else { + return error('No Group found.', true); + } + break; + + case 'save': + if (isset($_REQUEST['id']) && preg_match('/^-\d{1,11}$/', $_REQUEST['id'])) { + $group_id = $_REQUEST['id']; + } else { + return error('Incomplete call, missing Groups ID.', true); + } + + $group = DB::select('SELECT * FROM `Groups` WHERE `UID`=? LIMIT 1', [$group_id]); + if (!is_array($_REQUEST['privileges'])) { + $_REQUEST['privileges'] = []; + } + if (!empty($group)) { + $group = array_shift($group); + DB::delete('DELETE FROM `GroupPrivileges` WHERE `group_id`=?', [$group_id]); + $privilege_names = []; + foreach ($_REQUEST['privileges'] as $privilege) { + if (preg_match('/^\d{1,}$/', $privilege)) { + $group_privileges_source = DB::select( + 'SELECT `name` FROM `Privileges` WHERE `id`=? LIMIT 1', + [$privilege] + ); + if (!empty($group_privileges_source)) { + $group_privileges_source = array_shift($group_privileges_source); + DB::insert( + 'INSERT INTO `GroupPrivileges` (`group_id`, `privilege_id`) VALUES (?, ?)', + [$group_id, $privilege] + ); + $privilege_names[] = $group_privileges_source['name']; + } + } + } + engelsystem_log( + 'Group privileges of group ' . $group['Name'] + . ' edited: ' . join(', ', $privilege_names) + ); + redirect(page_link_to('admin_groups')); + } else { + return error('No Group found.', true); + } + break; } - break; } - } - return $html; + return $html; } -?> diff --git a/includes/pages/admin_import.php b/includes/pages/admin_import.php index 0669029d..7a246b4b 100644 --- a/includes/pages/admin_import.php +++ b/includes/pages/admin_import.php @@ -1,392 +1,473 @@ <?php -function admin_import_title() { - return _("Frab import"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_import_title() +{ + return _('Frab import'); } -function admin_import() { - global $rooms_import; - global $user; - $html = ""; - $import_dir = __DIR__ . '/../../import'; - - $step = "input"; - if (isset($_REQUEST['step']) && in_array($step, [ - 'input', - 'check', - 'import' - ])) { - $step = $_REQUEST['step']; - } - - if ($test_handle = @fopen($import_dir . '/tmp', 'w')) { - fclose($test_handle); - @unlink($import_dir . '/tmp'); - } else { - error(_('Webserver has no write-permission on import directory.')); - } - - $import_file = $import_dir . '/import_' . $user['UID'] . '.xml'; - $shifttype_id = null; - $add_minutes_start = 15; - $add_minutes_end = 15; - - $shifttypes_source = ShiftTypes(); - if ($shifttypes_source === false) { - engelsystem_error('Unable to load shifttypes.'); - } - $shifttypes = []; - foreach ($shifttypes_source as $shifttype) { - $shifttypes[$shifttype['id']] = $shifttype['name']; - } - - switch ($step) { - case 'input': - $valid = false; - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { - $shifttype_id = $_REQUEST['shifttype_id']; - } else { - $valid = false; - error(_('Please select a shift type.')); - } - - if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { - $add_minutes_start = trim($_REQUEST['add_minutes_start']); - } else { - $valid = false; - error(_("Please enter an amount of minutes to add to a talk's begin.")); - } - - if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { - $add_minutes_end = trim($_REQUEST['add_minutes_end']); - } else { - $valid = false; - error(_("Please enter an amount of minutes to add to a talk's end.")); - } - - if (isset($_FILES['xcal_file']) && ($_FILES['xcal_file']['error'] == 0)) { - if (move_uploaded_file($_FILES['xcal_file']['tmp_name'], $import_file)) { - libxml_use_internal_errors(true); - if (simplexml_load_file($import_file) === false) { - $valid = false; - error(_('No valid xml/xcal file provided.')); - unlink($import_file); - } - } else { +/** + * @return string + */ +function admin_import() +{ + global $rooms_import; + global $user; + $html = ''; + $import_dir = __DIR__ . '/../../import'; + + $step = 'input'; + if ( + isset($_REQUEST['step']) + && in_array($step, [ + 'input', + 'check', + 'import' + ]) + ) { + $step = $_REQUEST['step']; + } + + if ($test_handle = @fopen($import_dir . '/tmp', 'w')) { + fclose($test_handle); + @unlink($import_dir . '/tmp'); + } else { + error(_('Webserver has no write-permission on import directory.')); + } + + $import_file = $import_dir . '/import_' . $user['UID'] . '.xml'; + $shifttype_id = null; + $add_minutes_start = 15; + $add_minutes_end = 15; + + $shifttypes_source = ShiftTypes(); + if ($shifttypes_source === false) { + engelsystem_error('Unable to load shifttypes.'); + } + $shifttypes = []; + foreach ($shifttypes_source as $shifttype) { + $shifttypes[$shifttype['id']] = $shifttype['name']; + } + + switch ($step) { + case 'input': $valid = false; - error(_('File upload went wrong.')); - } - } else { - $valid = false; - error(_('Please provide some data.')); - } - } - - if ($valid) { - redirect(page_link_to('admin_import') . "&step=check&shifttype_id=" . $shifttype_id . "&add_minutes_end=" . $add_minutes_end . "&add_minutes_start=" . $add_minutes_start); - } else { - $html .= div('well well-sm text-center', [ - _('File Upload') . mute(glyph('arrow-right')) . mute(_('Validation')) . mute(glyph('arrow-right')) . mute(_('Import')) - ]) . div('row', [ - div('col-md-offset-3 col-md-6', [ - form([ - form_info('', _("This import will create/update/delete rooms and shifts by given FRAB-export file. The needed file format is xcal.")), - form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), - form_spinner('add_minutes_start', _("Add minutes to start"), $add_minutes_start), - form_spinner('add_minutes_end', _("Add minutes to end"), $add_minutes_end), - form_file('xcal_file', _("xcal-File (.xcal)")), - form_submit('submit', _("Import")) - ]) - ]) - ]); - } - break; - - case 'check': - if (! file_exists($import_file)) { - error(_('Missing import file.')); - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { - $shifttype_id = $_REQUEST['shifttype_id']; - } else { - error(_('Please select a shift type.')); - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { - $add_minutes_start = trim($_REQUEST['add_minutes_start']); - } else { - error(_("Please enter an amount of minutes to add to a talk's begin.")); - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { - $add_minutes_end = trim($_REQUEST['add_minutes_end']); - } else { - error(_("Please enter an amount of minutes to add to a talk's end.")); - redirect(page_link_to('admin_import')); - } - - list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); - list($events_new, $events_updated, $events_deleted) = prepare_events($import_file, $shifttype_id, $add_minutes_start, $add_minutes_end); - - $html .= div('well well-sm text-center', [ - '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' . mute(glyph('arrow-right')) . _('Validation') . mute(glyph('arrow-right')) . mute(_('Import')) - ]) . form([ - div('row', [ - div('col-sm-6', [ - '<h3>' . _("Rooms to create") . '</h3>', - table(_("Name"), $rooms_new) - ]), - div('col-sm-6', [ - '<h3>' . _("Rooms to delete") . '</h3>', - table(_("Name"), $rooms_deleted) - ]) - ]), - '<h3>' . _("Shifts to create") . '</h3>', - table([ - 'day' => _("Day"), - 'start' => _("Start"), - 'end' => _("End"), - 'shifttype' => _('Shift type'), - 'title' => _("Title"), - 'room' => _("Room") - ], shifts_printable($events_new, $shifttypes)), - '<h3>' . _("Shifts to update") . '</h3>', - table([ - 'day' => _("Day"), - 'start' => _("Start"), - 'end' => _("End"), - 'shifttype' => _('Shift type'), - 'title' => _("Title"), - 'room' => _("Room") - ], shifts_printable($events_updated, $shifttypes)), - '<h3>' . _("Shifts to delete") . '</h3>', - table([ - 'day' => _("Day"), - 'start' => _("Start"), - 'end' => _("End"), - 'shifttype' => _('Shift type'), - 'title' => _("Title"), - 'room' => _("Room") - ], shifts_printable($events_deleted, $shifttypes)), - form_submit('submit', _("Import")) - ], page_link_to('admin_import') . '&step=import&shifttype_id=' . $shifttype_id . "&add_minutes_end=" . $add_minutes_end . "&add_minutes_start=" . $add_minutes_start); - break; - - case 'import': - if (! file_exists($import_file)) { - error(_('Missing import file.')); - redirect(page_link_to('admin_import')); - } - - if (! file_exists($import_file)) { - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { - $shifttype_id = $_REQUEST['shifttype_id']; - } else { - error(_('Please select a shift type.')); - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { - $add_minutes_start = trim($_REQUEST['add_minutes_start']); - } else { - error(_("Please enter an amount of minutes to add to a talk's begin.")); - redirect(page_link_to('admin_import')); - } - - if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { - $add_minutes_end = trim($_REQUEST['add_minutes_end']); - } else { - error(_("Please enter an amount of minutes to add to a talk's end.")); - redirect(page_link_to('admin_import')); - } - - list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); - foreach ($rooms_new as $room) { - $result = Room_create($room, true, true); - if ($result === false) { - engelsystem_error('Unable to create room.'); - } - $rooms_import[trim($room)] = sql_id(); - } - foreach ($rooms_deleted as $room) { - sql_query("DELETE FROM `Room` WHERE `Name`='" . sql_escape($room) . "' LIMIT 1"); - } - - list($events_new, $events_updated, $events_deleted) = prepare_events($import_file, $shifttype_id, $add_minutes_start, $add_minutes_end); - foreach ($events_new as $event) { - $result = Shift_create($event); - if ($result === false) { - engelsystem_error('Unable to create shift.'); - } - } - - foreach ($events_updated as $event) { - $result = Shift_update_by_psid($event); - if ($result === false) { - engelsystem_error('Unable to update shift.'); - } - } - - foreach ($events_deleted as $event) { - $result = Shift_delete_by_psid($event['PSID']); - if ($result === false) { - engelsystem_error('Unable to delete shift.'); - } - } - - engelsystem_log("Frab import done"); - - unlink($import_file); - - $html .= div('well well-sm text-center', [ - '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' . mute(glyph('arrow-right')) . '<span class="text-success">' . _('Validation') . glyph('ok-circle') . '</span>' . mute(glyph('arrow-right')) . '<span class="text-success">' . _('Import') . glyph('ok-circle') . '</span>' - ]) . success(_("It's done!"), true); - break; - default: - redirect(page_link_to('admin_import')); - } - - return page_with_title(admin_import_title(), [ - msg(), - $html - ]); -} -function prepare_rooms($file) { - global $rooms_import; - $data = read_xml($file); - - // Load rooms from db for compare with input - $rooms = sql_select("SELECT * FROM `Room` WHERE `FromPentabarf`='Y'"); - $rooms_db = []; - $rooms_import = []; - foreach ($rooms as $room) { - $rooms_db[] = (string) $room['Name']; - $rooms_import[$room['Name']] = $room['RID']; - } - - $events = $data->vcalendar->vevent; - $rooms_pb = []; - foreach ($events as $event) { - $rooms_pb[] = (string) $event->location; - if (! isset($rooms_import[trim($event->location)])) { - $rooms_import[trim($event->location)] = trim($event->location); + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { + $shifttype_id = $_REQUEST['shifttype_id']; + } else { + $valid = false; + error(_('Please select a shift type.')); + } + + if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { + $add_minutes_start = trim($_REQUEST['add_minutes_start']); + } else { + $valid = false; + error(_('Please enter an amount of minutes to add to a talk\'s begin.')); + } + + if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { + $add_minutes_end = trim($_REQUEST['add_minutes_end']); + } else { + $valid = false; + error(_('Please enter an amount of minutes to add to a talk\'s end.')); + } + + if (isset($_FILES['xcal_file']) && ($_FILES['xcal_file']['error'] == 0)) { + if (move_uploaded_file($_FILES['xcal_file']['tmp_name'], $import_file)) { + libxml_use_internal_errors(true); + if (simplexml_load_file($import_file) === false) { + $valid = false; + error(_('No valid xml/xcal file provided.')); + unlink($import_file); + } + } else { + $valid = false; + error(_('File upload went wrong.')); + } + } else { + $valid = false; + error(_('Please provide some data.')); + } + } + + if ($valid) { + redirect( + page_link_to('admin_import') + . '&step=check&shifttype_id=' . $shifttype_id + . '&add_minutes_end=' . $add_minutes_end + . '&add_minutes_start=' . $add_minutes_start + ); + } else { + $html .= div('well well-sm text-center', [ + _('File Upload') . mute(glyph('arrow-right')) . mute(_('Validation')) . mute(glyph('arrow-right')) . mute(_('Import')) + ]) . div('row', [ + div('col-md-offset-3 col-md-6', [ + form([ + form_info( + '', + _('This import will create/update/delete rooms and shifts by given FRAB-export file. The needed file format is xcal.') + ), + form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), + form_spinner('add_minutes_start', _('Add minutes to start'), $add_minutes_start), + form_spinner('add_minutes_end', _('Add minutes to end'), $add_minutes_end), + form_file('xcal_file', _('xcal-File (.xcal)')), + form_submit('submit', _('Import')) + ]) + ]) + ]); + } + break; + + case 'check': + if (!file_exists($import_file)) { + error(_('Missing import file.')); + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { + $shifttype_id = $_REQUEST['shifttype_id']; + } else { + error(_('Please select a shift type.')); + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { + $add_minutes_start = trim($_REQUEST['add_minutes_start']); + } else { + error(_('Please enter an amount of minutes to add to a talk\'s begin.')); + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { + $add_minutes_end = trim($_REQUEST['add_minutes_end']); + } else { + error(_('Please enter an amount of minutes to add to a talk\'s end.')); + redirect(page_link_to('admin_import')); + } + + list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); + list($events_new, $events_updated, $events_deleted) = prepare_events( + $import_file, + $shifttype_id, + $add_minutes_start, + $add_minutes_end + ); + + $html .= div( + 'well well-sm text-center', + [ + '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' + . mute(glyph('arrow-right')) . _('Validation') . mute(glyph('arrow-right')) . mute(_('Import')) + ] + ) + . form( + [ + div('row', [ + div('col-sm-6', [ + '<h3>' . _('Rooms to create') . '</h3>', + table(_('Name'), $rooms_new) + ]), + div('col-sm-6', [ + '<h3>' . _('Rooms to delete') . '</h3>', + table(_('Name'), $rooms_deleted) + ]) + ]), + '<h3>' . _('Shifts to create') . '</h3>', + table([ + 'day' => _('Day'), + 'start' => _('Start'), + 'end' => _('End'), + 'shifttype' => _('Shift type'), + 'title' => _('Title'), + 'room' => _('Room') + ], shifts_printable($events_new, $shifttypes)), + '<h3>' . _('Shifts to update') . '</h3>', + table([ + 'day' => _('Day'), + 'start' => _('Start'), + 'end' => _('End'), + 'shifttype' => _('Shift type'), + 'title' => _('Title'), + 'room' => _('Room') + ], shifts_printable($events_updated, $shifttypes)), + '<h3>' . _('Shifts to delete') . '</h3>', + table([ + 'day' => _('Day'), + 'start' => _('Start'), + 'end' => _('End'), + 'shifttype' => _('Shift type'), + 'title' => _('Title'), + 'room' => _('Room') + ], shifts_printable($events_deleted, $shifttypes)), + form_submit('submit', _('Import')) + ], + page_link_to('admin_import') + . '&step=import&shifttype_id=' . $shifttype_id + . '&add_minutes_end=' . $add_minutes_end + . '&add_minutes_start=' . $add_minutes_start + ); + break; + + case 'import': + if (!file_exists($import_file)) { + error(_('Missing import file.')); + redirect(page_link_to('admin_import')); + } + + if (!file_exists($import_file)) { + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { + $shifttype_id = $_REQUEST['shifttype_id']; + } else { + error(_('Please select a shift type.')); + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { + $add_minutes_start = trim($_REQUEST['add_minutes_start']); + } else { + error(_('Please enter an amount of minutes to add to a talk\'s begin.')); + redirect(page_link_to('admin_import')); + } + + if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { + $add_minutes_end = trim($_REQUEST['add_minutes_end']); + } else { + error(_('Please enter an amount of minutes to add to a talk\'s end.')); + redirect(page_link_to('admin_import')); + } + + list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); + foreach ($rooms_new as $room) { + $result = Room_create($room, true, true); + if ($result === false) { + engelsystem_error('Unable to create room.'); + } + $rooms_import[trim($room)] = $result; + } + foreach ($rooms_deleted as $room) { + DB::delete('DELETE FROM `Room` WHERE `Name`=? LIMIT 1', [$room]); + } + + list($events_new, $events_updated, $events_deleted) = prepare_events( + $import_file, + $shifttype_id, + $add_minutes_start, + $add_minutes_end + ); + foreach ($events_new as $event) { + $result = Shift_create($event); + if ($result === false) { + engelsystem_error('Unable to create shift.'); + } + } + + foreach ($events_updated as $event) { + $result = Shift_update_by_psid($event); + if ($result === false) { + engelsystem_error('Unable to update shift.'); + } + } + + foreach ($events_deleted as $event) { + $result = Shift_delete_by_psid($event['PSID']); + if ($result === false) { + engelsystem_error('Unable to delete shift.'); + } + } + + engelsystem_log('Frab import done'); + + unlink($import_file); + + $html .= div('well well-sm text-center', [ + '<span class="text-success">' . _('File Upload') . glyph('ok-circle') . '</span>' + . mute(glyph('arrow-right')) + . '<span class="text-success">' . _('Validation') . glyph('ok-circle') . '</span>' + . mute(glyph('arrow-right')) + . '<span class="text-success">' . _('Import') . glyph('ok-circle') . '</span>' + ]) . success(_('It\'s done!'), true); + break; + default: + redirect(page_link_to('admin_import')); } - } - $rooms_pb = array_unique($rooms_pb); - - $rooms_new = array_diff($rooms_pb, $rooms_db); - $rooms_deleted = array_diff($rooms_db, $rooms_pb); - - return [ - $rooms_new, - $rooms_deleted - ]; + + return page_with_title(admin_import_title(), [ + msg(), + $html + ]); } -function prepare_events($file, $shifttype_id, $add_minutes_start, $add_minutes_end) { - global $rooms_import; - $data = read_xml($file); - - $rooms = sql_select("SELECT * FROM `Room`"); - $rooms_db = []; - foreach ($rooms as $room) { - $rooms_db[$room['Name']] = $room['RID']; - } - - $events = $data->vcalendar->vevent; - $shifts_pb = []; - foreach ($events as $event) { - $event_pb = $event->children("http://pentabarf.org"); - $event_id = trim($event_pb->{ - 'event-id' }); - $shifts_pb[$event_id] = [ - 'shifttype_id' => $shifttype_id, - 'start' => parse_date("Ymd\THis", $event->dtstart) - $add_minutes_start * 60, - 'end' => parse_date("Ymd\THis", $event->dtend) + $add_minutes_end * 60, - 'RID' => $rooms_import[trim($event->location)], - 'title' => trim($event->summary), - 'URL' => trim($event->url), - 'PSID' => $event_id +/** + * @param string $file + * @return array + */ +function prepare_rooms($file) +{ + global $rooms_import; + $data = read_xml($file); + + // Load rooms from db for compare with input + $rooms = DB::select('SELECT `Name`, `RID` FROM `Room` WHERE `FromPentabarf`=\'Y\''); + $rooms_db = []; + $rooms_import = []; + foreach ($rooms as $room) { + $rooms_db[] = $room['Name']; + $rooms_import[$room['Name']] = $room['RID']; + } + + $events = $data->vcalendar->vevent; + $rooms_pb = []; + foreach ($events as $event) { + $rooms_pb[] = (string)$event->location; + if (!isset($rooms_import[trim($event->location)])) { + $rooms_import[trim($event->location)] = trim($event->location); + } + } + $rooms_pb = array_unique($rooms_pb); + + $rooms_new = array_diff($rooms_pb, $rooms_db); + $rooms_deleted = array_diff($rooms_db, $rooms_pb); + + return [ + $rooms_new, + $rooms_deleted ]; - } - - $shifts = sql_select("SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`"); - $shifts_db = []; - foreach ($shifts as $shift) { - $shifts_db[$shift['PSID']] = $shift; - } - - $shifts_new = []; - $shifts_updated = []; - foreach ($shifts_pb as $shift) { - if (! isset($shifts_db[$shift['PSID']])) { - $shifts_new[] = $shift; - } else { - $tmp = $shifts_db[$shift['PSID']]; - if ($shift['shifttype_id'] != $tmp['shifttype_id'] || $shift['title'] != $tmp['title'] || $shift['start'] != $tmp['start'] || $shift['end'] != $tmp['end'] || $shift['RID'] != $tmp['RID'] || $shift['URL'] != $tmp['URL']) { - $shifts_updated[] = $shift; - } +} + +/** + * @param string $file + * @param int $shifttype_id + * @param int $add_minutes_start + * @param int $add_minutes_end + * @return array + */ +function prepare_events($file, $shifttype_id, $add_minutes_start, $add_minutes_end) +{ + global $rooms_import; + $data = read_xml($file); + + $rooms = Rooms(true); + $rooms_db = []; + foreach ($rooms as $room) { + $rooms_db[$room['Name']] = $room['RID']; + } + + $events = $data->vcalendar->vevent; + $shifts_pb = []; + foreach ($events as $event) { + $event_pb = $event->children('http://pentabarf.org'); + $event_id = trim($event_pb->{'event-id'}); + $shifts_pb[$event_id] = [ + 'shifttype_id' => $shifttype_id, + 'start' => parse_date("Ymd\THis", $event->dtstart) - $add_minutes_start * 60, + 'end' => parse_date("Ymd\THis", $event->dtend) + $add_minutes_end * 60, + 'RID' => $rooms_import[trim($event->location)], + 'title' => trim($event->summary), + 'URL' => trim($event->url), + 'PSID' => $event_id + ]; } - } - - $shifts_deleted = []; - foreach ($shifts_db as $shift) { - if (! isset($shifts_pb[$shift['PSID']])) { - $shifts_deleted[] = $shift; + + $shifts = DB::select('SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`'); + $shifts_db = []; + foreach ($shifts as $shift) { + $shifts_db[$shift['PSID']] = $shift; } - } - - return [ - $shifts_new, - $shifts_updated, - $shifts_deleted - ]; + + $shifts_new = []; + $shifts_updated = []; + foreach ($shifts_pb as $shift) { + if (!isset($shifts_db[$shift['PSID']])) { + $shifts_new[] = $shift; + } else { + $tmp = $shifts_db[$shift['PSID']]; + if ( + $shift['shifttype_id'] != $tmp['shifttype_id'] + || $shift['title'] != $tmp['title'] + || $shift['start'] != $tmp['start'] + || $shift['end'] != $tmp['end'] + || $shift['RID'] != $tmp['RID'] + || $shift['URL'] != $tmp['URL'] + ) { + $shifts_updated[] = $shift; + } + } + } + + $shifts_deleted = []; + foreach ($shifts_db as $shift) { + if (!isset($shifts_pb[$shift['PSID']])) { + $shifts_deleted[] = $shift; + } + } + + return [ + $shifts_new, + $shifts_updated, + $shifts_deleted + ]; } -function read_xml($file) { - global $xml_import; - if (! isset($xml_import)) { - $xml_import = simplexml_load_file($file); - } - return $xml_import; +/** + * @param string $file + * @return SimpleXMLElement + */ +function read_xml($file) +{ + global $xml_import; + if (!isset($xml_import)) { + $xml_import = simplexml_load_file($file); + } + return $xml_import; } -function shifts_printable($shifts, $shifttypes) { - global $rooms_import; - $rooms = array_flip($rooms_import); - - uasort($shifts, 'shift_sort'); - - $shifts_printable = []; - foreach ($shifts as $shift) { - $shifts_printable[] = [ - 'day' => date("l, Y-m-d", $shift['start']), - 'start' => date("H:i", $shift['start']), - 'shifttype' => ShiftType_name_render([ - 'id' => $shift['shifttype_id'], - 'name' => $shifttypes[$shift['shifttype_id']] - ]), - 'title' => shorten($shift['title']), - 'end' => date("H:i", $shift['end']), - 'room' => $rooms[$shift['RID']] - ]; - } - return $shifts_printable; +/** + * @param array $shifts + * @param array $shifttypes + * @return array + */ +function shifts_printable($shifts, $shifttypes) +{ + global $rooms_import; + $rooms = array_flip($rooms_import); + + uasort($shifts, 'shift_sort'); + + $shifts_printable = []; + foreach ($shifts as $shift) { + $shifts_printable[] = [ + 'day' => date('l, Y-m-d', $shift['start']), + 'start' => date('H:i', $shift['start']), + 'shifttype' => ShiftType_name_render([ + 'id' => $shift['shifttype_id'], + 'name' => $shifttypes[$shift['shifttype_id']] + ]), + 'title' => shorten($shift['title']), + 'end' => date('H:i', $shift['end']), + 'room' => $rooms[$shift['RID']] + ]; + } + return $shifts_printable; } -function shift_sort($shift_a, $shift_b) { - return ($shift_a['start'] < $shift_b['start']) ? - 1 : 1; +/** + * @param array $shift_a + * @param array $shift_b + * @return int + */ +function shift_sort($shift_a, $shift_b) +{ + return ($shift_a['start'] < $shift_b['start']) ? -1 : 1; } -?> diff --git a/includes/pages/admin_log.php b/includes/pages/admin_log.php index 97b81585..9e5e5827 100644 --- a/includes/pages/admin_log.php +++ b/includes/pages/admin_log.php @@ -1,33 +1,40 @@ <?php -function admin_log_title() { - return _("Log"); +/** + * @return string + */ +function admin_log_title() +{ + return _('Log'); } -function admin_log() { - $filter = ""; - if (isset($_REQUEST['keyword'])) { - $filter = strip_request_item('keyword'); - } - $log_entries_source = LogEntries_filter($filter); - - $log_entries = []; - foreach ($log_entries_source as $log_entry) { - $log_entry['date'] = date("d.m.Y H:i", $log_entry['timestamp']); - $log_entries[] = $log_entry; - } - - return page_with_title(admin_log_title(), [ - msg(), - form([ - form_text('keyword', _("Search"), $filter), - form_submit(_("Search"), "Go") - ]), - table([ - 'date' => "Time", - 'nick' => "Angel", - 'message' => "Log Entry" - ], $log_entries) - ]); +/** + * @return string + */ +function admin_log() +{ + $filter = ''; + if (isset($_REQUEST['keyword'])) { + $filter = strip_request_item('keyword'); + } + $log_entries_source = LogEntries_filter($filter); + + $log_entries = []; + foreach ($log_entries_source as $log_entry) { + $log_entry['date'] = date('d.m.Y H:i', $log_entry['timestamp']); + $log_entries[] = $log_entry; + } + + return page_with_title(admin_log_title(), [ + msg(), + form([ + form_text('keyword', _('Search'), $filter), + form_submit(_('Search'), 'Go') + ]), + table([ + 'date' => 'Time', + 'nick' => 'Angel', + 'message' => 'Log Entry' + ], $log_entries) + ]); } -?> diff --git a/includes/pages/admin_news.php b/includes/pages/admin_news.php index 789fc728..bc242831 100644 --- a/includes/pages/admin_news.php +++ b/includes/pages/admin_news.php @@ -1,67 +1,82 @@ <?php -function admin_news() { - global $user; - - if (! isset($_GET["action"])) { - redirect(page_link_to("news")); - } - - $html = '<div class="col-md-12"><h1>' . _("Edit news entry") . '</h1>' . msg(); - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $news_id = $_REQUEST['id']; - } else { - return error("Incomplete call, missing News ID.", true); - } - - $news = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($news_id) . "' LIMIT 1"); - if (empty($news)) { - return error("No News found.", true); - } - switch ($_REQUEST["action"]) { - default: - redirect(page_link_to('news')); - case 'edit': - list($news) = $news; - - $user_source = User($news['UID']); - - $html .= form([ - form_info(_("Date"), date("Y-m-d H:i", $news['Datum'])), - form_info(_("Author"), User_Nick_render($user_source)), - form_text('eBetreff', _("Subject"), $news['Betreff']), - form_textarea('eText', _("Message"), $news['Text']), - form_checkbox('eTreffen', _("Meeting"), $news['Treffen'] == 1, 1), - form_submit('submit', _("Save")) - ], page_link_to('admin_news&action=save&id=' . $news_id)); - - $html .= '<a class="btn btn-danger" href="' . page_link_to('admin_news&action=delete&id=' . $news_id) . '"><span class="glyphicon glyphicon-trash"></span> ' . _("Delete") . '</a>'; - break; - - case 'save': - list($news) = $news; - - sql_query("UPDATE `News` SET - `Datum`='" . sql_escape(time()) . "', - `Betreff`='" . sql_escape($_POST["eBetreff"]) . "', - `Text`='" . sql_escape($_POST["eText"]) . "', - `UID`='" . sql_escape($user['UID']) . "', - `Treffen`='" . sql_escape($_POST["eTreffen"]) . "' - WHERE `ID`='" . sql_escape($news_id) . "'"); - engelsystem_log("News updated: " . $_POST["eBetreff"]); - success(_("News entry updated.")); - redirect(page_link_to("news")); - break; - - case 'delete': - list($news) = $news; - - sql_query("DELETE FROM `News` WHERE `ID`='" . sql_escape($news_id) . "' LIMIT 1"); - engelsystem_log("News deleted: " . $news['Betreff']); - success(_("News entry deleted.")); - redirect(page_link_to("news")); - break; - } - return $html . '</div>'; +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_news() +{ + global $user; + + if (!isset($_GET['action'])) { + redirect(page_link_to('news')); + } + + $html = '<div class="col-md-12"><h1>' . _('Edit news entry') . '</h1>' . msg(); + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $news_id = $_REQUEST['id']; + } else { + return error('Incomplete call, missing News ID.', true); + } + + $news = DB::select('SELECT * FROM `News` WHERE `ID`=? LIMIT 1', [$news_id]); + if (empty($news)) { + return error('No News found.', true); + } + + switch ($_REQUEST['action']) { + case 'edit': + $news = array_shift($news); + $user_source = User($news['UID']); + + $html .= form([ + form_info(_('Date'), date('Y-m-d H:i', $news['Datum'])), + form_info(_('Author'), User_Nick_render($user_source)), + form_text('eBetreff', _('Subject'), $news['Betreff']), + form_textarea('eText', _('Message'), $news['Text']), + form_checkbox('eTreffen', _('Meeting'), $news['Treffen'] == 1, 1), + form_submit('submit', _('Save')) + ], page_link_to('admin_news&action=save&id=' . $news_id)); + + $html .= '<a class="btn btn-danger" href="' . page_link_to('admin_news&action=delete&id=' . $news_id) . '">' + . '<span class="glyphicon glyphicon-trash"></span> ' . _('Delete') + . '</a>'; + break; + + case 'save': + DB::update(' + UPDATE `News` SET + `Datum`=?, + `Betreff`=?, + `Text`=?, + `UID`=?, + `Treffen`=? + WHERE `ID`=? + ', + [ + time(), + $_POST["eBetreff"], + $_POST["eText"], + $user['UID'], + isset($_POST["eTreffen"]) ? 1 : 0, + $news_id + ] + ); + engelsystem_log('News updated: ' . $_POST['eBetreff']); + success(_('News entry updated.')); + redirect(page_link_to('news')); + break; + + case 'delete': + $news = array_shift($news); + DB::delete('DELETE FROM `News` WHERE `ID`=? LIMIT 1', [$news_id]); + engelsystem_log('News deleted: ' . $news['Betreff']); + success(_('News entry deleted.')); + redirect(page_link_to('news')); + break; + default: + redirect(page_link_to('news')); + } + return $html . '</div>'; } -?>
\ No newline at end of file diff --git a/includes/pages/admin_questions.php b/includes/pages/admin_questions.php index f53cfab9..098701e3 100644 --- a/includes/pages/admin_questions.php +++ b/includes/pages/admin_questions.php @@ -1,120 +1,163 @@ <?php -function admin_questions_title() { - return _("Answer questions"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_questions_title() +{ + return _('Answer questions'); } /** * Renders a hint for new questions to answer. + * + * @return string|null */ -function admin_new_questions() { - global $privileges, $page; - - if ($page != "admin_questions") { - if (in_array("admin_questions", $privileges)) { - $new_messages = sql_num_query("SELECT * FROM `Questions` WHERE `AID` IS NULL"); - - if ($new_messages > 0) { - return '<a href="' . page_link_to("admin_questions") . '">' . _('There are unanswered questions!') . '</a>'; - } +function admin_new_questions() +{ + global $privileges, $page; + + if ($page != 'admin_questions') { + if (in_array('admin_questions', $privileges)) { + $new_messages = count(DB::select('SELECT `QID` FROM `Questions` WHERE `AID` IS NULL')); + + if ($new_messages > 0) { + return '<a href="' . page_link_to('admin_questions') . '">' . _('There are unanswered questions!') . '</a>'; + } + } } - } - - return null; + + return null; } -function admin_questions() { - global $user; - - if (! isset($_REQUEST['action'])) { - $unanswered_questions_table = []; - $questions = sql_select("SELECT * FROM `Questions` WHERE `AID` IS NULL"); - foreach ($questions as $question) { - $user_source = User($question['UID']); - - $unanswered_questions_table[] = [ - 'from' => User_Nick_render($user_source), - 'question' => str_replace("\n", "<br />", $question['Question']), - 'answer' => form([ - form_textarea('answer', '', ''), - form_submit('submit', _("Save")) - ], page_link_to('admin_questions') . '&action=answer&id=' . $question['QID']), - 'actions' => button(page_link_to("admin_questions") . '&action=delete&id=' . $question['QID'], _("delete"), 'btn-xs') - ]; - } - - $answered_questions_table = []; - $questions = sql_select("SELECT * FROM `Questions` WHERE NOT `AID` IS NULL"); - foreach ($questions as $question) { - $user_source = User($question['UID']); - $answer_user_source = User($question['AID']); - $answered_questions_table[] = [ - 'from' => User_Nick_render($user_source), - 'question' => str_replace("\n", "<br />", $question['Question']), - 'answered_by' => User_Nick_render($answer_user_source), - 'answer' => str_replace("\n", "<br />", $question['Answer']), - 'actions' => button(page_link_to("admin_questions") . '&action=delete&id=' . $question['QID'], _("delete"), 'btn-xs') - ]; - } - - return page_with_title(admin_questions_title(), [ - '<h2>' . _("Unanswered questions") . '</h2>', - table([ - 'from' => _("From"), - 'question' => _("Question"), - 'answer' => _("Answer"), - 'actions' => '' - ], $unanswered_questions_table), - '<h2>' . _("Answered questions") . '</h2>', - table([ - 'from' => _("From"), - 'question' => _("Question"), - 'answered_by' => _("Answered by"), - 'answer' => _("Answer"), - 'actions' => '' - ], $answered_questions_table) - ]); - } else { - switch ($_REQUEST['action']) { - case 'answer': - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $question_id = $_REQUEST['id']; - } else { - return error("Incomplete call, missing Question ID.", true); - } - - $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - if (count($question) > 0 && $question[0]['AID'] == null) { - $answer = trim(preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($_REQUEST['answer']))); - - if ($answer != "") { - sql_query("UPDATE `Questions` SET `AID`='" . sql_escape($user['UID']) . "', `Answer`='" . sql_escape($answer) . "' WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - engelsystem_log("Question " . $question[0]['Question'] . " answered: " . $answer); - redirect(page_link_to("admin_questions")); - } else { - return error("Enter an answer!", true); - } - } else { - return error("No question found.", true); +/** + * @return string + */ +function admin_questions() +{ + global $user; + + if (!isset($_REQUEST['action'])) { + $unanswered_questions_table = []; + $questions = DB::select('SELECT * FROM `Questions` WHERE `AID` IS NULL'); + foreach ($questions as $question) { + $user_source = User($question['UID']); + + $unanswered_questions_table[] = [ + 'from' => User_Nick_render($user_source), + 'question' => str_replace("\n", '<br />', $question['Question']), + 'answer' => form([ + form_textarea('answer', '', ''), + form_submit('submit', _('Save')) + ], page_link_to('admin_questions') . '&action=answer&id=' . $question['QID']), + 'actions' => button( + page_link_to('admin_questions') . '&action=delete&id=' . $question['QID'], + _('delete'), + 'btn-xs' + ) + ]; } - break; - case 'delete': - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $question_id = $_REQUEST['id']; - } else { - return error("Incomplete call, missing Question ID.", true); + + $answered_questions_table = []; + $questions = DB::select('SELECT * FROM `Questions` WHERE NOT `AID` IS NULL'); + foreach ($questions as $question) { + $user_source = User($question['UID']); + $answer_user_source = User($question['AID']); + $answered_questions_table[] = [ + 'from' => User_Nick_render($user_source), + 'question' => str_replace("\n", '<br />', $question['Question']), + 'answered_by' => User_Nick_render($answer_user_source), + 'answer' => str_replace("\n", '<br />', $question['Answer']), + 'actions' => button( + page_link_to('admin_questions') . '&action=delete&id=' . $question['QID'], + _('delete'), + 'btn-xs' + ) + ]; } - - $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - if (count($question) > 0) { - sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - engelsystem_log("Question deleted: " . $question[0]['Question']); - redirect(page_link_to("admin_questions")); - } else { - return error("No question found.", true); + + return page_with_title(admin_questions_title(), [ + '<h2>' . _('Unanswered questions') . '</h2>', + table([ + 'from' => _('From'), + 'question' => _('Question'), + 'answer' => _('Answer'), + 'actions' => '' + ], $unanswered_questions_table), + '<h2>' . _('Answered questions') . '</h2>', + table([ + 'from' => _('From'), + 'question' => _('Question'), + 'answered_by' => _('Answered by'), + 'answer' => _('Answer'), + 'actions' => '' + ], $answered_questions_table) + ]); + } else { + switch ($_REQUEST['action']) { + case 'answer': + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $question_id = $_REQUEST['id']; + } else { + return error('Incomplete call, missing Question ID.', true); + } + + $question = DB::select( + 'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1', + [$question_id] + ); + if (count($question) > 0 && $question[0]['AID'] == null) { + $answer = trim( + preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", + '', + strip_tags($_REQUEST['answer']) + )); + + if ($answer != '') { + DB::update(' + UPDATE `Questions` + SET `AID`=?, `Answer`=? + WHERE `QID`=? + LIMIT 1 + ', + [ + $user['UID'], + $answer, + $question_id, + ] + ); + engelsystem_log('Question ' . $question[0]['Question'] . ' answered: ' . $answer); + redirect(page_link_to('admin_questions')); + } else { + return error('Enter an answer!', true); + } + } else { + return error('No question found.', true); + } + break; + case 'delete': + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $question_id = $_REQUEST['id']; + } else { + return error('Incomplete call, missing Question ID.', true); + } + + $question = DB::select( + 'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1', + [$question_id] + ); + if (count($question) > 0) { + DB::delete('DELETE FROM `Questions` WHERE `QID`=? LIMIT 1', [$question_id]); + engelsystem_log('Question deleted: ' . $question[0]['Question']); + redirect(page_link_to('admin_questions')); + } else { + return error('No question found.', true); + } + break; } - break; } - } + + return ''; } -?> diff --git a/includes/pages/admin_rooms.php b/includes/pages/admin_rooms.php index 129ed423..d483f99e 100644 --- a/includes/pages/admin_rooms.php +++ b/includes/pages/admin_rooms.php @@ -1,196 +1,251 @@ <?php -function admin_rooms_title() { - return _("Rooms"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_rooms_title() +{ + return _('Rooms'); } -function admin_rooms() { - $rooms_source = sql_select("SELECT * FROM `Room` ORDER BY `Name`"); - $rooms = []; - foreach ($rooms_source as $room) { - $rooms[] = [ - 'name' => Room_name_render($room), - 'from_pentabarf' => $room['FromPentabarf'] == 'Y' ? '✓' : '', - 'public' => $room['show'] == 'Y' ? '✓' : '', - 'actions' => table_buttons([ - button(page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID'], _("edit"), 'btn-xs'), - button(page_link_to('admin_rooms') . '&show=delete&id=' . $room['RID'], _("delete"), 'btn-xs') - ]) - ]; - } - $room = null; - - if (isset($_REQUEST['show'])) { - $msg = ""; - $name = ""; - $from_pentabarf = ""; - $public = 'Y'; - $number = ""; - - $angeltypes_source = sql_select("SELECT * FROM `AngelTypes` ORDER BY `name`"); - $angeltypes = []; - $angeltypes_count = []; - foreach ($angeltypes_source as $angeltype) { - $angeltypes[$angeltype['id']] = $angeltype['name']; - $angeltypes_count[$angeltype['id']] = 0; - } - - if (test_request_int('id')) { - $room = Room($_REQUEST['id']); - if ($room === false) { - engelsystem_error("Unable to load room."); - } - if ($room == null) { - redirect(page_link_to('admin_rooms')); - } - - $room_id = $_REQUEST['id']; - $name = $room['Name']; - $from_pentabarf = $room['FromPentabarf']; - $public = $room['show']; - $number = $room['Number']; - - $needed_angeltypes = sql_select("SELECT * FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($room_id) . "'"); - foreach ($needed_angeltypes as $needed_angeltype) { - $angeltypes_count[$needed_angeltype['angel_type_id']] = $needed_angeltype['count']; - } +/** + * @return string + */ +function admin_rooms() +{ + $rooms_source = DB::select('SELECT * FROM `Room` ORDER BY `Name`'); + $rooms = []; + foreach ($rooms_source as $room) { + $rooms[] = [ + 'name' => Room_name_render($room), + 'from_pentabarf' => $room['FromPentabarf'] == 'Y' ? '✓' : '', + 'public' => $room['show'] == 'Y' ? '✓' : '', + 'actions' => table_buttons([ + button(page_link_to('admin_rooms') . '&show=edit&id=' . $room['RID'], _('edit'), 'btn-xs'), + button(page_link_to('admin_rooms') . '&show=delete&id=' . $room['RID'], _('delete'), 'btn-xs') + ]) + ]; } - - if ($_REQUEST['show'] == 'edit') { - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['name']) && strlen(strip_request_item('name')) > 0) { - $name = strip_request_item('name'); - if (isset($room) && sql_num_query("SELECT * FROM `Room` WHERE `Name`='" . sql_escape($name) . "' AND NOT `RID`=" . sql_escape($room_id)) > 0) { - $valid = false; - $msg .= error(_("This name is already in use."), true); - } - } else { - $valid = false; - $msg .= error(_("Please enter a name."), true); - } - - if (isset($_REQUEST['from_pentabarf'])) { - $from_pentabarf = 'Y'; - } else { - $from_pentabarf = ''; - } - - if (isset($_REQUEST['public'])) { - $public = 'Y'; - } else { - $public = ''; - } - - if (isset($_REQUEST['number'])) { - $number = strip_request_item('number'); - } else { - $valid = false; - } - - foreach ($angeltypes as $angeltype_id => $angeltype) { - if (isset($_REQUEST['angeltype_count_' . $angeltype_id]) && preg_match("/^[0-9]{1,4}$/", $_REQUEST['angeltype_count_' . $angeltype_id])) { - $angeltypes_count[$angeltype_id] = $_REQUEST['angeltype_count_' . $angeltype_id]; - } else { - $valid = false; - $msg .= error(sprintf(_("Please enter needed angels for type %s.", $angeltype)), true); - } + $room = null; + + if (isset($_REQUEST['show'])) { + $msg = ''; + $name = ''; + $from_pentabarf = ''; + $public = 'Y'; + $number = ''; + $room_id = 0; + + $angeltypes_source = DB::select('SELECT `id`, `name` FROM `AngelTypes` ORDER BY `name`'); + $angeltypes = []; + $angeltypes_count = []; + foreach ($angeltypes_source as $angeltype) { + $angeltypes[$angeltype['id']] = $angeltype['name']; + $angeltypes_count[$angeltype['id']] = 0; } - - if ($valid) { - if (isset($room_id)) { - sql_query("UPDATE `Room` SET `Name`='" . sql_escape($name) . "', `FromPentabarf`='" . sql_escape($from_pentabarf) . "', `show`='" . sql_escape($public) . "', `Number`='" . sql_escape($number) . "' WHERE `RID`='" . sql_escape($room_id) . "' LIMIT 1"); - engelsystem_log("Room updated: " . $name . ", pentabarf import: " . $from_pentabarf . ", public: " . $public . ", number: " . $number); - } else { - $room_id = Room_create($name, $from_pentabarf, $public, $number); - if ($room_id === false) { - engelsystem_error("Unable to create room."); + + if (test_request_int('id')) { + $room = Room($_REQUEST['id'], false); + if ($room === false) { + engelsystem_error('Unable to load room.'); } - engelsystem_log("Room created: " . $name . ", pentabarf import: " . $from_pentabarf . ", public: " . $public . ", number: " . $number); - } - - NeededAngelTypes_delete_by_room($room_id); - $needed_angeltype_info = []; - foreach ($angeltypes_count as $angeltype_id => $angeltype_count) { - $angeltype = AngelType($angeltype_id); - if ($angeltype != null) { - NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count); - $needed_angeltype_info[] = $angeltype['name'] . ": " . $angeltype_count; + if ($room == null) { + redirect(page_link_to('admin_rooms')); + } + + $room_id = $_REQUEST['id']; + $name = $room['Name']; + $from_pentabarf = $room['FromPentabarf']; + $public = $room['show']; + $number = $room['Number']; + + $needed_angeltypes = DB::select( + 'SELECT `angel_type_id`, `count` FROM `NeededAngelTypes` WHERE `room_id`=?', + [$room_id] + ); + foreach ($needed_angeltypes as $needed_angeltype) { + $angeltypes_count[$needed_angeltype['angel_type_id']] = $needed_angeltype['count']; } - } - - engelsystem_log("Set needed angeltypes of room " . $name . " to: " . join(", ", $needed_angeltype_info)); - success(_("Room saved.")); - redirect(page_link_to("admin_rooms")); } - } - $angeltypes_count_form = []; - foreach ($angeltypes as $angeltype_id => $angeltype) { - $angeltypes_count_form[] = div('col-lg-4 col-md-6 col-xs-6', [ - form_spinner('angeltype_count_' . $angeltype_id, $angeltype, $angeltypes_count[$angeltype_id]) - ]); - } - - return page_with_title(admin_rooms_title(), [ - buttons([ - button(page_link_to('admin_rooms'), _("back"), 'back') - ]), - $msg, - form([ - div('row', [ - div('col-md-6', [ - form_text('name', _("Name"), $name), - form_checkbox('from_pentabarf', _("Frab import"), $from_pentabarf), - form_checkbox('public', _("Public"), $public), - form_text('number', _("Room number"), $number) - ]), - div('col-md-6', [ - div('row', [ - div('col-md-12', [ - form_info(_("Needed angels:")) - ]), - join($angeltypes_count_form) - ]) - ]) - ]), - form_submit('submit', _("Save")) - ]) - ]); - } elseif ($_REQUEST['show'] == 'delete') { - if (isset($_REQUEST['ack'])) { - if (! Room_delete($room_id)) { - engelsystem_error("Unable to delete room."); + + if ($_REQUEST['show'] == 'edit') { + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['name']) && strlen(strip_request_item('name')) > 0) { + $name = strip_request_item('name'); + if ( + isset($room) + && count(DB::select( + 'SELECT RID FROM `Room` WHERE `Name`=? AND NOT `RID`=?', + [$name, $room_id] + )) > 0 + ) { + $valid = false; + $msg .= error(_('This name is already in use.'), true); + } + } else { + $valid = false; + $msg .= error(_('Please enter a name.'), true); + } + + if (isset($_REQUEST['from_pentabarf'])) { + $from_pentabarf = 'Y'; + } else { + $from_pentabarf = ''; + } + + if (isset($_REQUEST['public'])) { + $public = 'Y'; + } else { + $public = ''; + } + + if (isset($_REQUEST['number'])) { + $number = strip_request_item('number'); + } else { + $valid = false; + } + + foreach ($angeltypes as $angeltype_id => $angeltype) { + if ( + isset($_REQUEST['angeltype_count_' . $angeltype_id]) + && preg_match('/^\d{1,4}$/', $_REQUEST['angeltype_count_' . $angeltype_id]) + ) { + $angeltypes_count[$angeltype_id] = $_REQUEST['angeltype_count_' . $angeltype_id]; + } else { + $valid = false; + $msg .= error(sprintf(_('Please enter needed angels for type %s.'), $angeltype), true); + } + } + + if ($valid) { + if (!empty($room_id)) { + DB::update(' + UPDATE `Room` + SET + `Name`=?, + `FromPentabarf`=?, + `show`=?, + `Number`=? + WHERE `RID`=? + LIMIT 1 + ', [ + $name, + $from_pentabarf, + $public, + $number, + $room_id, + ]); + engelsystem_log( + 'Room updated: ' . $name + . ', pentabarf import: ' . $from_pentabarf + . ', public: ' . $public + . ', number: ' . $number + ); + } else { + $room_id = Room_create($name, $from_pentabarf, $public, $number); + if ($room_id === false) { + engelsystem_error('Unable to create room.'); + } + engelsystem_log( + 'Room created: ' . $name + . ', pentabarf import: ' + . $from_pentabarf + . ', public: ' . $public + . ', number: ' . $number + ); + } + + NeededAngelTypes_delete_by_room($room_id); + $needed_angeltype_info = []; + foreach ($angeltypes_count as $angeltype_id => $angeltype_count) { + $angeltype = AngelType($angeltype_id); + if ($angeltype != null) { + NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count); + $needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count; + } + } + + engelsystem_log( + 'Set needed angeltypes of room ' . $name + . ' to: ' . join(', ', $needed_angeltype_info) + ); + success(_('Room saved.')); + redirect(page_link_to('admin_rooms')); + } + } + $angeltypes_count_form = []; + foreach ($angeltypes as $angeltype_id => $angeltype) { + $angeltypes_count_form[] = div('col-lg-4 col-md-6 col-xs-6', [ + form_spinner('angeltype_count_' . $angeltype_id, $angeltype, $angeltypes_count[$angeltype_id]) + ]); + } + + return page_with_title(admin_rooms_title(), [ + buttons([ + button(page_link_to('admin_rooms'), _('back'), 'back') + ]), + $msg, + form([ + div('row', [ + div('col-md-6', [ + form_text('name', _('Name'), $name), + form_checkbox('from_pentabarf', _('Frab import'), $from_pentabarf), + form_checkbox('public', _('Public'), $public), + form_text('number', _('Room number'), $number) + ]), + div('col-md-6', [ + div('row', [ + div('col-md-12', [ + form_info(_('Needed angels:')) + ]), + join($angeltypes_count_form) + ]) + ]) + ]), + form_submit('submit', _('Save')) + ]) + ]); + } elseif ($_REQUEST['show'] == 'delete') { + if (isset($_REQUEST['ack'])) { + if (!Room_delete($room_id)) { + engelsystem_error('Unable to delete room.'); + } + + engelsystem_log('Room deleted: ' . $name); + success(sprintf(_('Room %s deleted.'), $name)); + redirect(page_link_to('admin_rooms')); + } + + return page_with_title(admin_rooms_title(), [ + buttons([ + button(page_link_to('admin_rooms'), _('back'), 'back') + ]), + sprintf(_('Do you want to delete room %s?'), $name), + buttons([ + button( + page_link_to('admin_rooms') . '&show=delete&id=' . $room_id . '&ack', + _('Delete'), + 'delete btn-danger' + ) + ]) + ]); } - - engelsystem_log("Room deleted: " . $name); - success(sprintf(_("Room %s deleted."), $name)); - redirect(page_link_to('admin_rooms')); - } - - return page_with_title(admin_rooms_title(), [ - buttons([ - button(page_link_to('admin_rooms'), _("back"), 'back') - ]), - sprintf(_("Do you want to delete room %s?"), $name), - buttons([ - button(page_link_to('admin_rooms') . '&show=delete&id=' . $room_id . '&ack', _("Delete"), 'delete') - ]) - ]); } - } - - return page_with_title(admin_rooms_title(), [ - buttons([ - button(page_link_to('admin_rooms') . '&show=edit', _("add")) - ]), - msg(), - table([ - 'name' => _("Name"), - 'from_pentabarf' => _("Frab import"), - 'public' => _("Public"), - 'actions' => "" - ], $rooms) - ]); + + return page_with_title(admin_rooms_title(), [ + buttons([ + button(page_link_to('admin_rooms') . '&show=edit', _('add')) + ]), + msg(), + table([ + 'name' => _('Name'), + 'from_pentabarf' => _('Frab import'), + 'public' => _('Public'), + 'actions' => '' + ], $rooms) + ]); } -?> diff --git a/includes/pages/admin_shifts.php b/includes/pages/admin_shifts.php index 42a8c682..06071233 100644 --- a/includes/pages/admin_shifts.php +++ b/includes/pages/admin_shifts.php @@ -1,346 +1,419 @@ <?php -function admin_shifts_title() { - return _("Create shifts"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_shifts_title() +{ + return _('Create shifts'); } -// Assistent zum Anlegen mehrerer neuer Schichten -function admin_shifts() { - $valid = true; - - $rid = 0; - $start = parse_date("Y-m-d H:i", date("Y-m-d") . " 00:00"); - $end = $start; - $mode = 'single'; - $angelmode = 'manually'; - $length = ''; - $change_hours = []; - $title = ""; - $shifttype_id = null; - - // Locations laden (auch unsichtbare - fuer Erzengel ist das ok) - $rooms = sql_select("SELECT * FROM `Room` ORDER BY `Name`"); - $room_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 = []; - 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) { - $valid = false; - error(_('Please select a shift type.')); - } else { - $shifttype_id = $_REQUEST['shifttype_id']; - } - } else { - $valid = false; - error(_('Please select a shift type.')); - } - - // Name/Bezeichnung der Schicht, darf leer sein - $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 { - $valid = false; - $rid = $rooms[0]['RID']; - error(_('Please select a location.')); +/** + * Assistent zum Anlegen mehrerer neuer Schichten + * + * @return string + */ +function admin_shifts() +{ + $valid = true; + + $start = parse_date('Y-m-d H:i', date('Y-m-d') . ' 00:00'); + $end = $start; + $mode = 'single'; + $angelmode = 'manually'; + $length = ''; + $change_hours = []; + $title = ''; + $shifttype_id = null; + + // Locations laden (auch unsichtbare - fuer Erzengel ist das ok) + $rooms = DB::select('SELECT `RID`, `Name` FROM `Room` ORDER BY `Name`'); + $room_array = []; + foreach ($rooms as $room) { + $room_array[$room['RID']] = $room['Name']; } - - if (isset($_REQUEST['start']) && $tmp = parse_date("Y-m-d H:i", $_REQUEST['start'])) { - $start = $tmp; - } else { - $valid = false; - error(_('Please select a start time.')); + + // Engeltypen laden + $types = DB::select('SELECT * FROM `AngelTypes` ORDER BY `name`'); + $needed_angel_types = []; + foreach ($types as $type) { + $needed_angel_types[$type['id']] = 0; } - - if (isset($_REQUEST['end']) && $tmp = parse_date("Y-m-d H:i", $_REQUEST['end'])) { - $end = $tmp; - } else { - $valid = false; - error(_('Please select an end time.')); + + // Load shift types + $shifttypes_source = ShiftTypes(); + if ($shifttypes_source === false) { + engelsystem_error('Unable to load shift types.'); } - - if ($start >= $end) { - $valid = false; - error(_('The shifts end has to be after its start.')); + $shifttypes = []; + foreach ($shifttypes_source as $shifttype) { + $shifttypes[$shifttype['id']] = $shifttype['name']; } - - if (isset($_REQUEST['mode'])) { - if ($_REQUEST['mode'] == 'single') { - $mode = 'single'; - } elseif ($_REQUEST['mode'] == 'multi') { - if (isset($_REQUEST['length']) && preg_match("/^[0-9]+$/", trim($_REQUEST['length']))) { - $mode = 'multi'; - $length = trim($_REQUEST['length']); + + if (isset($_REQUEST['preview']) || isset($_REQUEST['back'])) { + if (isset($_REQUEST['shifttype_id'])) { + $shifttype = ShiftType($_REQUEST['shifttype_id']); + if ($shifttype == null) { + $valid = false; + error(_('Please select a shift type.')); + } else { + $shifttype_id = $_REQUEST['shifttype_id']; + } } else { - $valid = false; - error(_('Please enter a shift duration in minutes.')); + $valid = false; + error(_('Please select a shift type.')); } - } elseif ($_REQUEST['mode'] == 'variable') { - if (isset($_REQUEST['change_hours']) && preg_match("/^([0-9]{2}(,|$))/", trim(str_replace(" ", "", $_REQUEST['change_hours'])))) { - $mode = 'variable'; - $change_hours = array_map('trim', explode(",", $_REQUEST['change_hours'])); + + // Name/Bezeichnung der Schicht, darf leer sein + $title = strip_request_item('title'); + + // Auswahl der sichtbaren Locations für die Schichten + if ( + isset($_REQUEST['rid']) + && preg_match('/^\d+$/', $_REQUEST['rid']) + && isset($room_array[$_REQUEST['rid']]) + ) { + $rid = $_REQUEST['rid']; } else { - $valid = false; - error(_('Please split the shift-change hours by colons.')); + $valid = false; + $rid = $rooms[0]['RID']; + error(_('Please select a location.')); } - } - } else { - $valid = false; - error(_('Please select a mode.')); - } - - if (isset($_REQUEST['angelmode'])) { - if ($_REQUEST['angelmode'] == 'location') { - $angelmode = 'location'; - } elseif ($_REQUEST['angelmode'] == 'manually') { - $angelmode = 'manually'; - foreach ($types 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']]); - } else { + + if (isset($_REQUEST['start']) && $tmp = parse_date('Y-m-d H:i', $_REQUEST['start'])) { + $start = $tmp; + } else { + $valid = false; + error(_('Please select a start time.')); + } + + if (isset($_REQUEST['end']) && $tmp = parse_date('Y-m-d H:i', $_REQUEST['end'])) { + $end = $tmp; + } else { $valid = false; - error(sprintf(_('Please check the needed angels for team %s.'), $type['name'])); - } + error(_('Please select an end time.')); } - if (array_sum($needed_angel_types) == 0) { - $valid = false; - error(_('There are 0 angels needed. Please enter the amounts of needed angels.')); + + if ($start >= $end) { + $valid = false; + error(_('The shifts end has to be after its start.')); } - } else { - $valid = false; - error(_('Please select a mode for needed angels.')); - } - } else { - $valid = false; - error(_('Please select needed angels.')); - } - - // Beim Zurück-Knopf das Formular zeigen - if (isset($_REQUEST['back'])) { - $valid = false; - } - - // Alle Eingaben in Ordnung - if ($valid) { - if ($angelmode == 'location') { - $needed_angel_types = []; - $needed_angel_types_location = sql_select("SELECT * FROM `NeededAngelTypes` WHERE `room_id`='" . sql_escape($rid) . "'"); - foreach ($needed_angel_types_location as $type) { - $needed_angel_types[$type['angel_type_id']] = $type['count']; + + if (isset($_REQUEST['mode'])) { + if ($_REQUEST['mode'] == 'single') { + $mode = 'single'; + } elseif ($_REQUEST['mode'] == 'multi') { + if (isset($_REQUEST['length']) && preg_match('/^\d+$/', trim($_REQUEST['length']))) { + $mode = 'multi'; + $length = trim($_REQUEST['length']); + } else { + $valid = false; + error(_('Please enter a shift duration in minutes.')); + } + } elseif ($_REQUEST['mode'] == 'variable') { + if ( + isset($_REQUEST['change_hours']) + && preg_match('/^(\d{2}(,|$))/', trim(str_replace(' ', '', $_REQUEST['change_hours']))) + ) { + $mode = 'variable'; + $change_hours = array_map('trim', explode(',', $_REQUEST['change_hours'])); + } else { + $valid = false; + error(_('Please split the shift-change hours by colons.')); + } + } + } else { + $valid = false; + error(_('Please select a mode.')); } - } - $shifts = []; - if ($mode == 'single') { - $shifts[] = [ - 'start' => $start, - 'end' => $end, - 'RID' => $rid, - '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[] = [ - 'start' => $shift_start, - 'end' => $shift_end, - 'RID' => $rid, - 'title' => $title, - 'shifttype_id' => $shifttype_id - ]; - - $shift_start = $shift_end; - } while ($shift_end < $end); - } elseif ($mode == 'variable') { - rsort($change_hours); - $day = parse_date("Y-m-d H:i", date("Y-m-d", $start) . " 00:00"); - $change_index = 0; - // Ersten/nächsten passenden Schichtwechsel suchen - foreach ($change_hours as $i => $change_hour) { - if ($start < $day + $change_hour * 60 * 60) { - $change_index = $i; - } elseif ($start == $day + $change_hour * 60 * 60) { - // Start trifft Schichtwechsel - $change_index = ($i + count($change_hours) - 1) % count($change_hours); - break; - } else { - break; - } + + if (isset($_REQUEST['angelmode'])) { + if ($_REQUEST['angelmode'] == 'location') { + $angelmode = 'location'; + } elseif ($_REQUEST['angelmode'] == 'manually') { + $angelmode = 'manually'; + foreach ($types as $type) { + if ( + isset($_REQUEST['type_' . $type['id']]) + && preg_match('/^\d+$/', trim($_REQUEST['type_' . $type['id']])) + ) { + $needed_angel_types[$type['id']] = trim($_REQUEST['type_' . $type['id']]); + } else { + $valid = false; + error(sprintf(_('Please check the needed angels for team %s.'), $type['name'])); + } + } + if (array_sum($needed_angel_types) == 0) { + $valid = false; + error(_('There are 0 angels needed. Please enter the amounts of needed angels.')); + } + } else { + $valid = false; + error(_('Please select a mode for needed angels.')); + } + } else { + $valid = false; + error(_('Please select needed angels.')); } - - $shift_start = $start; - do { - $day = parse_date("Y-m-d H:i", date("Y-m-d", $shift_start) . " 00:00"); - $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[] = [ - 'start' => $shift_start, - 'end' => $shift_end, - 'RID' => $rid, - 'title' => $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 = []; - foreach ($shifts as $shift) { - $shifts_table_entry = [ - 'timeslot' => '<span class="glyphicon glyphicon-time"></span> ' . date("Y-m-d H:i", $shift['start']) . ' - ' . date("H:i", $shift['end']) . '<br />' . Room_name_render(Room($shift['RID'])), - 'title' => ShiftType_name_render(ShiftType($shifttype_id)) . ($shift['title'] ? '<br />' . $shift['title'] : ''), - 'needed_angels' => '' - ]; - foreach ($types as $type) { - if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) { - $shifts_table_entry['needed_angels'] .= '<b>' . AngelType_name_render($type) . ':</b> ' . $needed_angel_types[$type['id']] . '<br />'; - } + + // Beim Zurück-Knopf das Formular zeigen + if (isset($_REQUEST['back'])) { + $valid = false; } - $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"), [ - form([ - $hidden_types, - 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)), - form_hidden('mode', $mode), - form_hidden('length', $length), - form_hidden('change_hours', implode(', ', $change_hours)), - form_hidden('angelmode', $angelmode), - form_submit('back', _("back")), - table([ - 'timeslot' => _('Time and location'), - 'title' => _('Type and title'), - 'needed_angels' => _('Needed angels') - ], $shifts_table), - form_submit('submit', _("Save")) - ]) - ]); + + // Alle Eingaben in Ordnung + if ($valid) { + if ($angelmode == 'location') { + $needed_angel_types = []; + $needed_angel_types_location = DB::select(' + SELECT `angel_type_id`, `count` + FROM `NeededAngelTypes` + WHERE `room_id`=? + ', + [$rid] + ); + foreach ($needed_angel_types_location as $type) { + $needed_angel_types[$type['angel_type_id']] = $type['count']; + } + } + $shifts = []; + if ($mode == 'single') { + $shifts[] = [ + 'start' => $start, + 'end' => $end, + 'RID' => $rid, + 'title' => $title, + 'shifttype_id' => $shifttype_id + ]; + } elseif ($mode == 'multi') { + $shift_start = (int)$start; + do { + $shift_end = $shift_start + (int)$length * 60; + + if ($shift_end > $end) { + $shift_end = $end; + } + if ($shift_start >= $shift_end) { + break; + } + + $shifts[] = [ + 'start' => $shift_start, + 'end' => $shift_end, + 'RID' => $rid, + 'title' => $title, + 'shifttype_id' => $shifttype_id + ]; + + $shift_start = $shift_end; + } while ($shift_end < $end); + } elseif ($mode == 'variable') { + rsort($change_hours); + $day = parse_date('Y-m-d H:i', date('Y-m-d', $start) . ' 00:00'); + $change_index = 0; + // Ersten/nächsten passenden Schichtwechsel suchen + foreach ($change_hours as $i => $change_hour) { + if ($start < $day + $change_hour * 60 * 60) { + $change_index = $i; + } elseif ($start == $day + $change_hour * 60 * 60) { + // Start trifft Schichtwechsel + $change_index = ($i + count($change_hours) - 1) % count($change_hours); + break; + } else { + break; + } + } + + $shift_start = $start; + do { + $day = parse_date('Y-m-d H:i', date('Y-m-d', $shift_start) . ' 00:00'); + $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[] = [ + 'start' => $shift_start, + 'end' => $shift_end, + 'RID' => $rid, + 'title' => $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 = []; + foreach ($shifts as $shift) { + $shifts_table_entry = [ + 'timeslot' => + '<span class="glyphicon glyphicon-time"></span> ' + . date('Y-m-d H:i', $shift['start']) + . ' - ' + . date('H:i', $shift['end']) + . '<br />' + . Room_name_render(Room($shift['RID'])), + 'title' => + ShiftType_name_render(ShiftType($shifttype_id)) + . ($shift['title'] ? '<br />' . $shift['title'] : ''), + 'needed_angels' => '' + ]; + foreach ($types as $type) { + if (isset($needed_angel_types[$type['id']]) && $needed_angel_types[$type['id']] > 0) { + $shifts_table_entry['needed_angels'] .= '<b>' . AngelType_name_render($type) . ':</b> ' . $needed_angel_types[$type['id']] . '<br />'; + } + } + $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'), [ + form([ + $hidden_types, + 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)), + form_hidden('mode', $mode), + form_hidden('length', $length), + form_hidden('change_hours', implode(', ', $change_hours)), + form_hidden('angelmode', $angelmode), + form_submit('back', _('back')), + table([ + 'timeslot' => _('Time and location'), + 'title' => _('Type and title'), + 'needed_angels' => _('Needed angels') + ], $shifts_table), + form_submit('submit', _('Save')) + ]) + ]); + } + } elseif (isset($_REQUEST['submit'])) { + if ( + !isset($_SESSION['admin_shifts_shifts']) + || !isset($_SESSION['admin_shifts_types']) + || !is_array($_SESSION['admin_shifts_shifts']) + || !is_array($_SESSION['admin_shifts_types']) + ) { + redirect(page_link_to('admin_shifts')); + } + + $needed_angel_types_info = []; + 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: ' . $shifttypes[$shift['shifttype_id']] + . ' with title ' . $shift['title'] + . ' from ' . date('Y-m-d H:i', $shift['start']) + . ' to ' . date('Y-m-d H:i', $shift['end']) + ); + + foreach ($_SESSION['admin_shifts_types'] as $type_id => $count) { + $angel_type_source = DB::select(' + SELECT * + FROM `AngelTypes` + WHERE `id` = ? + LIMIT 1', [$type_id]); + if (!empty($angel_type_source)) { + DB::insert(' + INSERT INTO `NeededAngelTypes` (`shift_id`, `angel_type_id`, `count`) + VALUES (?, ?, ?) + ', + [ + $shift_id, + $type_id, + $count + ] + ); + $needed_angel_types_info[] = $angel_type_source[0]['name'] . ': ' . $count; + } + } + } + + engelsystem_log('Shift needs following angel types: ' . join(', ', $needed_angel_types_info)); + success('Schichten angelegt.'); + redirect(page_link_to('admin_shifts')); + } else { + unset($_SESSION['admin_shifts_shifts']); + unset($_SESSION['admin_shifts_types']); } - } elseif (isset($_REQUEST['submit'])) { - if (! is_array($_SESSION['admin_shifts_shifts']) || ! is_array($_SESSION['admin_shifts_types'])) { - redirect(page_link_to('admin_shifts')); + + if (!isset($_REQUEST['rid'])) { + $_REQUEST['rid'] = null; } - - 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: " . $shifttypes[$shift['shifttype_id']] . " with title " . $shift['title'] . " from " . date("Y-m-d H:i", $shift['start']) . " to " . date("Y-m-d H:i", $shift['end'])); - $needed_angel_types_info = []; - foreach ($_SESSION['admin_shifts_types'] as $type_id => $count) { - $angel_type_source = sql_select("SELECT * FROM `AngelTypes` WHERE `id`='" . sql_escape($type_id) . "' LIMIT 1"); - if (count($angel_type_source) > 0) { - 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_type_source[0]['name'] . ": " . $count; - } - } + $angel_types = ''; + foreach ($types as $type) { + $angel_types .= '<div class="col-md-4">' . form_spinner( + 'type_' . $type['id'], + $type['name'], + $needed_angel_types[$type['id']] + ) + . '</div>'; } - - engelsystem_log("Shift needs following angel types: " . join(", ", $needed_angel_types_info)); - 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; - } - $angel_types = ""; - foreach ($types as $type) { - $angel_types .= '<div class="col-md-4">' . form_spinner('type_' . $type['id'], $type['name'], $needed_angel_types[$type['id']]) . '</div>'; - } - - return page_with_title(admin_shifts_title(), [ - msg(), - form([ - form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), - form_text('title', _("Title"), $title), - form_select('rid', _("Room"), $room_array, $_REQUEST['rid']), - div('row', [ - div('col-md-6', [ - form_text('start', _("Start"), date("Y-m-d H:i", $start)), - form_text('end', _("End"), date("Y-m-d H:i", $end)), - form_info(_("Mode"), ''), - form_radio('mode', _("Create one shift"), $mode == 'single', 'single'), - form_radio('mode', _("Create multiple shifts"), $mode == 'multi', 'multi'), - form_text('length', _("Length"), ! empty($_REQUEST['length']) ? $_REQUEST['length'] : '120'), - form_radio('mode', _("Create multiple shifts with variable length"), $mode == 'variable', 'variable'), - form_text('change_hours', _("Shift change hours"), ! empty($_REQUEST['change_hours']) ? $_REQUEST['change_hours'] : '00, 04, 08, 10, 12, 14, 16, 18, 20, 22') - ]), - div('col-md-6', [ - form_info(_("Needed angels"), ''), - form_radio('angelmode', _("Take needed angels from room settings"), $angelmode == 'location', 'location'), - form_radio('angelmode', _("The following angels are needed"), $angelmode == 'manually', 'manually'), - div('row', [ - $angel_types - ]) - ]) - ]), - form_submit('preview', _("Preview")) - ]) - ]); + + return page_with_title(admin_shifts_title(), [ + msg(), + form([ + form_select('shifttype_id', _('Shifttype'), $shifttypes, $shifttype_id), + form_text('title', _('Title'), $title), + form_select('rid', _('Room'), $room_array, $_REQUEST['rid']), + div('row', [ + div('col-md-6', [ + form_text('start', _('Start'), date('Y-m-d H:i', $start)), + form_text('end', _('End'), date('Y-m-d H:i', $end)), + form_info(_('Mode'), ''), + form_radio('mode', _('Create one shift'), $mode == 'single', 'single'), + form_radio('mode', _('Create multiple shifts'), $mode == 'multi', 'multi'), + form_text('length', _('Length'), !empty($_REQUEST['length']) ? $_REQUEST['length'] : '120'), + form_radio( + 'mode', + _('Create multiple shifts with variable length'), + $mode == 'variable', + 'variable' + ), + form_text( + 'change_hours', + _('Shift change hours'), + !empty($_REQUEST['change_hours']) ? $_REQUEST['change_hours'] : '00, 04, 08, 10, 12, 14, 16, 18, 20, 22' + ) + ]), + div('col-md-6', [ + form_info(_('Needed angels'), ''), + form_radio( + 'angelmode', + _('Take needed angels from room settings'), + $angelmode == 'location', + 'location' + ), + form_radio('angelmode', _('The following angels are needed'), $angelmode == 'manually', 'manually'), + div('row', [ + $angel_types + ]) + ]) + ]), + form_submit('preview', _('Preview')) + ]) + ]); } -?> diff --git a/includes/pages/admin_user.php b/includes/pages/admin_user.php index 737bd91f..8f833087 100644 --- a/includes/pages/admin_user.php +++ b/includes/pages/admin_user.php @@ -1,208 +1,310 @@ <?php -function admin_user_title() { - return _("All Angels"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function admin_user_title() +{ + return _('All Angels'); } -function admin_user() { - global $user, $privileges, $tshirt_sizes, $privileges; - - $html = ''; - - if (! isset($_REQUEST['id'])) { - redirect(users_link()); - } - - $user_id = $_REQUEST['id']; - if (! isset($_REQUEST['action'])) { - $user_source = User($user_id); - if ($user_source == null) { - error(_('This user does not exist.')); - redirect(users_link()); - } - - $html .= "Hallo,<br />" . "hier kannst du den Eintrag ändern. Unter dem Punkt 'Gekommen' " . "wird der Engel als anwesend markiert, ein Ja bei Aktiv bedeutet, " . "dass der Engel aktiv war und damit ein Anspruch auf ein T-Shirt hat. " . "Wenn T-Shirt ein 'Ja' enthält, bedeutet dies, dass der Engel " . "bereits sein T-Shirt erhalten hat.<br /><br />\n"; - - $html .= "<form action=\"" . page_link_to("admin_user") . "&action=save&id=$user_id\" method=\"post\">\n"; - $html .= "<table border=\"0\">\n"; - $html .= "<input type=\"hidden\" name=\"Type\" value=\"Normal\">\n"; - $html .= "<tr><td>\n"; - $html .= "<table>\n"; - $html .= " <tr><td>Nick</td><td>" . "<input type=\"text\" size=\"40\" name=\"eNick\" value=\"" . $user_source['Nick'] . "\"></td></tr>\n"; - $html .= " <tr><td>lastLogIn</td><td>" . date("Y-m-d H:i", $user_source['lastLogIn']) . "</td></tr>\n"; - $html .= " <tr><td>Name</td><td>" . "<input type=\"text\" size=\"40\" name=\"eName\" value=\"" . $user_source['Name'] . "\"></td></tr>\n"; - $html .= " <tr><td>Vorname</td><td>" . "<input type=\"text\" size=\"40\" name=\"eVorname\" value=\"" . $user_source['Vorname'] . "\"></td></tr>\n"; - $html .= " <tr><td>Alter</td><td>" . "<input type=\"text\" size=\"5\" name=\"eAlter\" value=\"" . $user_source['Alter'] . "\"></td></tr>\n"; - $html .= " <tr><td>Telefon</td><td>" . "<input type=\"text\" size=\"40\" name=\"eTelefon\" value=\"" . $user_source['Telefon'] . "\"></td></tr>\n"; - $html .= " <tr><td>Handy</td><td>" . "<input type=\"text\" size=\"40\" name=\"eHandy\" value=\"" . $user_source['Handy'] . "\"></td></tr>\n"; - $html .= " <tr><td>DECT</td><td>" . "<input type=\"text\" size=\"4\" name=\"eDECT\" value=\"" . $user_source['DECT'] . "\"></td></tr>\n"; - if ($user_source['email_by_human_allowed']) { - $html .= " <tr><td>email</td><td>" . "<input type=\"text\" size=\"40\" name=\"eemail\" value=\"" . $user_source['email'] . "\"></td></tr>\n"; - } - $html .= " <tr><td>jabber</td><td>" . "<input type=\"text\" size=\"40\" name=\"ejabber\" value=\"" . $user_source['jabber'] . "\"></td></tr>\n"; - $html .= " <tr><td>Size</td><td>" . html_select_key('size', 'eSize', $tshirt_sizes, $user_source['Size']) . "</td></tr>\n"; - - $options = [ - '1' => _("Yes"), - '0' => _("No") - ]; - - // Gekommen? - $html .= " <tr><td>Gekommen</td><td>\n"; - $html .= html_options('eGekommen', $options, $user_source['Gekommen']) . "</td></tr>\n"; - - // Aktiv? - $html .= " <tr><td>Aktiv</td><td>\n"; - $html .= html_options('eAktiv', $options, $user_source['Aktiv']) . "</td></tr>\n"; - - // Aktiv erzwingen - if (in_array('admin_active', $privileges)) { - $html .= " <tr><td>" . _("Force active") . "</td><td>\n"; - $html .= html_options('force_active', $options, $user_source['force_active']) . "</td></tr>\n"; - } - - // T-Shirt bekommen? - $html .= " <tr><td>T-Shirt</td><td>\n"; - $html .= html_options('eTshirt', $options, $user_source['Tshirt']) . "</td></tr>\n"; - - $html .= " <tr><td>Hometown</td><td>" . "<input type=\"text\" size=\"40\" name=\"Hometown\" value=\"" . $user_source['Hometown'] . "\"></td></tr>\n"; - - $html .= "</table>\n</td><td valign=\"top\"></td></tr>"; - - $html .= "</td></tr>\n"; - $html .= "</table>\n<br />\n"; - $html .= "<input type=\"submit\" value=\"Speichern\">\n"; - $html .= "</form>"; - - $html .= "<hr />"; - - $html .= form_info('', _('Please visit the angeltypes page or the users profile to manage users angeltypes.')); - - $html .= "Hier kannst Du das Passwort dieses Engels neu setzen:<form action=\"" . page_link_to("admin_user") . "&action=change_pw&id=$user_id\" method=\"post\">\n"; - $html .= "<table>\n"; - $html .= " <tr><td>Passwort</td><td>" . "<input type=\"password\" size=\"40\" name=\"new_pw\" value=\"\"></td></tr>\n"; - $html .= " <tr><td>Wiederholung</td><td>" . "<input type=\"password\" size=\"40\" name=\"new_pw2\" value=\"\"></td></tr>\n"; - - $html .= "</table>"; - $html .= "<input type=\"submit\" value=\"Speichern\">\n"; - $html .= "</form>"; - - $html .= "<hr />"; - - $my_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user['UID']) . "' ORDER BY `group_id` LIMIT 1"); - if (count($my_highest_group) > 0) { - $my_highest_group = $my_highest_group[0]['group_id']; - } - - $his_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user_id) . "' ORDER BY `group_id` LIMIT 1"); - if (count($his_highest_group) > 0) { - $his_highest_group = $his_highest_group[0]['group_id']; +/** + * @return string + */ +function admin_user() +{ + global $user, $privileges; + $tshirt_sizes = config('tshirt_sizes'); + + foreach ($tshirt_sizes as $key => $size) { + if (empty($size)) { + unset($tshirt_sizes[$key]); + } } - - if ($user_id != $user['UID'] && $my_highest_group <= $his_highest_group) { - $html .= "Hier kannst Du die Benutzergruppen des Engels festlegen:<form action=\"" . page_link_to("admin_user") . "&action=save_groups&id=" . $user_id . "\" method=\"post\">\n"; - $html .= '<table>'; - - $groups = sql_select("SELECT * FROM `Groups` LEFT OUTER JOIN `UserGroups` ON (`UserGroups`.`group_id` = `Groups`.`UID` AND `UserGroups`.`uid` = '" . sql_escape($user_id) . "') WHERE `Groups`.`UID` >= '" . sql_escape($my_highest_group) . "' ORDER BY `Groups`.`Name`"); - foreach ($groups as $group) { - $html .= '<tr><td><input type="checkbox" name="groups[]" value="' . $group['UID'] . '"' . ($group['group_id'] != "" ? ' checked="checked"' : '') . ' /></td><td>' . $group['Name'] . '</td></tr>'; - } - - $html .= '</table>'; - - $html .= "<input type=\"submit\" value=\"Speichern\">\n"; - $html .= "</form>"; - - $html .= "<hr />"; + + $html = ''; + + if (!isset($_REQUEST['id'])) { + redirect(users_link()); } - - $html .= buttons([ - button(user_delete_link($user_source), glyph('lock') . _("delete"), 'btn-danger') - ]); - - $html .= "<hr />"; - } else { - switch ($_REQUEST['action']) { - case 'save_groups': - if ($user_id != $user['UID']) { - $my_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user['UID']) . "' ORDER BY `group_id`"); - $his_highest_group = sql_select("SELECT * FROM `UserGroups` WHERE `uid`='" . sql_escape($user_id) . "' ORDER BY `group_id`"); - - if (count($my_highest_group) > 0 && (count($his_highest_group) == 0 || ($my_highest_group[0]['group_id'] <= $his_highest_group[0]['group_id']))) { - $groups_source = sql_select("SELECT * FROM `Groups` LEFT OUTER JOIN `UserGroups` ON (`UserGroups`.`group_id` = `Groups`.`UID` AND `UserGroups`.`uid` = '" . sql_escape($user_id) . "') WHERE `Groups`.`UID` >= '" . sql_escape($my_highest_group[0]['group_id']) . "' ORDER BY `Groups`.`Name`"); - $groups = []; - $grouplist = []; - foreach ($groups_source as $group) { - $groups[$group['UID']] = $group; - $grouplist[] = $group['UID']; - } - - if (! is_array($_REQUEST['groups'])) { - $_REQUEST['groups'] = []; - } - - sql_query("DELETE FROM `UserGroups` WHERE `uid`='" . sql_escape($user_id) . "'"); - $user_groups_info = []; - foreach ($_REQUEST['groups'] as $group) { - if (in_array($group, $grouplist)) { - sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`='" . sql_escape($group) . "'"); - $user_groups_info[] = $groups[$group]['Name']; - } - } - $user_source = User($user_id); - engelsystem_log("Set groups of " . User_Nick_render($user_source) . " to: " . join(", ", $user_groups_info)); - $html .= success("Benutzergruppen gespeichert.", true); - } else { - $html .= error("Du kannst keine Engel mit mehr Rechten bearbeiten.", true); - } - } else { - $html .= error("Du kannst Deine eigenen Rechte nicht bearbeiten.", true); + + $user_id = $_REQUEST['id']; + if (!isset($_REQUEST['action'])) { + $user_source = User($user_id); + if ($user_source == null) { + error(_('This user does not exist.')); + redirect(users_link()); + } + + $html .= 'Hallo,<br />' + . 'hier kannst du den Eintrag ändern. Unter dem Punkt \'Gekommen\' ' + . 'wird der Engel als anwesend markiert, ein Ja bei Aktiv bedeutet, ' + . 'dass der Engel aktiv war und damit ein Anspruch auf ein T-Shirt hat. ' + . 'Wenn T-Shirt ein \'Ja\' enthält, bedeutet dies, dass der Engel ' + . 'bereits sein T-Shirt erhalten hat.<br /><br />' . "\n"; + + $html .= '<form action="' . page_link_to('admin_user') . '&action=save&id=' . $user_id . '" method="post">' . "\n"; + $html .= '<table border="0">' . "\n"; + $html .= '<input type="hidden" name="Type" value="Normal">' . "\n"; + $html .= '<tr><td>' . "\n"; + $html .= '<table>' . "\n"; + $html .= ' <tr><td>Nick</td><td>' . '<input type="text" size="40" name="eNick" value="' . $user_source['Nick'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Last login</td><td><p class="help-block">' + . date('Y-m-d H:i', $user_source['lastLogIn']) + . '</p></td></tr>' . "\n"; + $html .= ' <tr><td>Name</td><td>' . '<input type="text" size="40" name="eName" value="' . $user_source['Name'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Vorname</td><td>' . '<input type="text" size="40" name="eVorname" value="' . $user_source['Vorname'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Alter</td><td>' . '<input type="text" size="5" name="eAlter" value="' . $user_source['Alter'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Telefon</td><td>' . '<input type="text" size="40" name="eTelefon" value="' . $user_source['Telefon'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Handy</td><td>' . '<input type="text" size="40" name="eHandy" value="' . $user_source['Handy'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>DECT</td><td>' . '<input type="text" size="4" name="eDECT" value="' . $user_source['DECT'] . '" class="form-control"></td></tr>' . "\n"; + if ($user_source['email_by_human_allowed']) { + $html .= " <tr><td>email</td><td>" . '<input type="text" size="40" name="eemail" value="' . $user_source['email'] . '" class="form-control"></td></tr>' . "\n"; } - break; - - case 'save': - $force_active = $user['force_active']; + $html .= " <tr><td>jabber</td><td>" . '<input type="text" size="40" name="ejabber" value="' . $user_source['jabber'] . '" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Size</td><td>' + . html_select_key('size', 'eSize', $tshirt_sizes, $user_source['Size']) . '</td></tr>' . "\n"; + + $options = [ + '1' => _('Yes'), + '0' => _('No') + ]; + + // Gekommen? + $html .= ' <tr><td>Gekommen</td><td>' . "\n"; + $html .= html_options('eGekommen', $options, $user_source['Gekommen']) . '</td></tr>' . "\n"; + + // Aktiv? + $html .= ' <tr><td>Aktiv</td><td>' . "\n"; + $html .= html_options('eAktiv', $options, $user_source['Aktiv']) . '</td></tr>' . "\n"; + + // Aktiv erzwingen if (in_array('admin_active', $privileges)) { - $force_active = $_REQUEST['force_active']; + $html .= ' <tr><td>' . _('Force active') . '</td><td>' . "\n"; + $html .= html_options('force_active', $options, $user_source['force_active']) . '</td></tr>' . "\n"; + } + + // T-Shirt bekommen? + $html .= ' <tr><td>T-Shirt</td><td>' . "\n"; + $html .= html_options('eTshirt', $options, $user_source['Tshirt']) . '</td></tr>' . "\n"; + + $html .= ' <tr><td>Hometown</td><td>' . '<input type="text" size="40" name="Hometown" value="' . $user_source['Hometown'] . '" class="form-control"></td></tr>' . "\n"; + + $html .= '</table>' . "\n" . '</td><td valign="top"></td></tr>'; + + $html .= '</td></tr>' . "\n"; + $html .= '</table>' . "\n" . '<br />' . "\n"; + $html .= '<input type="submit" value="Speichern" class="btn btn-primary">'; + $html .= '</form>'; + + $html .= '<hr />'; + + $html .= form_info('', _('Please visit the angeltypes page or the users profile to manage users angeltypes.')); + + $html .= 'Hier kannst Du das Passwort dieses Engels neu setzen:<form action="' + . page_link_to('admin_user') . '&action=change_pw&id=' . $user_id . '" method="post">' . "\n"; + $html .= '<table>' . "\n"; + $html .= ' <tr><td>Passwort</td><td>' . '<input type="password" size="40" name="new_pw" value="" class="form-control"></td></tr>' . "\n"; + $html .= ' <tr><td>Wiederholung</td><td>' . '<input type="password" size="40" name="new_pw2" value="" class="form-control"></td></tr>' . "\n"; + + $html .= '</table>' . "\n" . '<br />' . "\n"; + $html .= '<input type="submit" value="Speichern" class="btn btn-primary">' . "\n"; + $html .= '</form>'; + + $html .= '<hr />'; + + $my_highest_group = DB::select( + 'SELECT group_id FROM `UserGroups` WHERE `uid`=? ORDER BY `group_id` LIMIT 1', + [$user['UID']] + ); + if (count($my_highest_group) > 0) { + $my_highest_group = $my_highest_group[0]['group_id']; } - $SQL = "UPDATE `User` SET - `Nick` = '" . sql_escape($_POST["eNick"]) . "', - `Name` = '" . sql_escape($_POST["eName"]) . "', - `Vorname` = '" . sql_escape($_POST["eVorname"]) . "', - `Telefon` = '" . sql_escape($_POST["eTelefon"]) . "', - `Handy` = '" . sql_escape($_POST["eHandy"]) . "', - `Alter` = '" . sql_escape($_POST["eAlter"]) . "', - `DECT` = '" . sql_escape($_POST["eDECT"]) . "', - " . ($user_source['email_by_human_allowed'] ? "`email` = '" . sql_escape($_POST["eemail"]) . "'" : "") . " - `jabber` = '" . sql_escape($_POST["ejabber"]) . "', - `Size` = '" . sql_escape($_POST["eSize"]) . "', - `Gekommen`= '" . sql_escape($_POST["eGekommen"]) . "', - `Aktiv`= '" . sql_escape($_POST["eAktiv"]) . "', - `force_active`= " . sql_escape($force_active) . ", - `Tshirt` = '" . sql_escape($_POST["eTshirt"]) . "', - `Hometown` = '" . sql_escape($_POST["Hometown"]) . "' - WHERE `UID` = '" . sql_escape($user_id) . "' - LIMIT 1"; - sql_query($SQL); - engelsystem_log("Updated user: " . $_POST["eNick"] . ", " . $_POST["eSize"] . ", arrived: " . $_POST["eGekommen"] . ", active: " . $_POST["eAktiv"] . ", tshirt: " . $_POST["eTshirt"]); - $html .= success("Änderung wurde gespeichert...\n", true); - break; - - case 'change_pw': - if ($_REQUEST['new_pw'] != "" && $_REQUEST['new_pw'] == $_REQUEST['new_pw2']) { - set_password($user_id, $_REQUEST['new_pw']); - $user_source = User($user_id); - engelsystem_log("Set new password for " . User_Nick_render($user_source)); - $html .= success("Passwort neu gesetzt.", true); - } else { - $html .= error("Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!", true); + + $his_highest_group = DB::select( + 'SELECT `group_id` FROM `UserGroups` WHERE `uid`=? ORDER BY `group_id` LIMIT 1', + [$user_id] + ); + if (count($his_highest_group) > 0) { + $his_highest_group = $his_highest_group[0]['group_id']; + } + + if ($user_id != $user['UID'] && $my_highest_group <= $his_highest_group) { + $html .= 'Hier kannst Du die Benutzergruppen des Engels festlegen:<form action="' + . page_link_to('admin_user') . '&action=save_groups&id=' . $user_id . '" method="post">' . "\n"; + $html .= '<table>'; + + $groups = DB::select(' + SELECT * + FROM `Groups` + LEFT OUTER JOIN `UserGroups` ON ( + `UserGroups`.`group_id` = `Groups`.`UID` + AND `UserGroups`.`uid` = ? + ) + WHERE `Groups`.`UID` >= ? + ORDER BY `Groups`.`Name` + ', + [ + $user_id, + $my_highest_group, + ] + ); + foreach ($groups as $group) { + $html .= '<tr><td><input type="checkbox" name="groups[]" value="' . $group['UID'] . '" ' + . ($group['group_id'] != '' ? ' checked="checked"' : '') + . ' /></td><td>' . $group['Name'] . '</td></tr>'; + } + + $html .= '</table><br>'; + + $html .= '<input type="submit" value="Speichern" class="btn btn-primary">' . "\n"; + $html .= '</form>'; + + $html .= '<hr />'; + } + + $html .= buttons([ + button(user_delete_link($user_source), glyph('lock') . _('delete'), 'btn-danger') + ]); + + $html .= "<hr />"; + } else { + switch ($_REQUEST['action']) { + case 'save_groups': + if ($user_id != $user['UID']) { + $my_highest_group = DB::select( + 'SELECT * FROM `UserGroups` WHERE `uid`=? ORDER BY `group_id`', + [$user['UID']] + ); + $his_highest_group = DB::select( + 'SELECT * FROM `UserGroups` WHERE `uid`=? ORDER BY `group_id`', + [$user_id] + ); + + if ( + count($my_highest_group) > 0 + && ( + count($his_highest_group) == 0 + || ($my_highest_group[0]['group_id'] <= $his_highest_group[0]['group_id']) + ) + ) { + $groups_source = DB::select(' + SELECT * + FROM `Groups` + LEFT OUTER JOIN `UserGroups` ON ( + `UserGroups`.`group_id` = `Groups`.`UID` + AND `UserGroups`.`uid` = ? + ) + WHERE `Groups`.`UID` >= ? + ORDER BY `Groups`.`Name` + ', + [ + $user_id, + $my_highest_group[0]['group_id'], + ] + ); + $groups = []; + $grouplist = []; + foreach ($groups_source as $group) { + $groups[$group['UID']] = $group; + $grouplist[] = $group['UID']; + } + + if (!is_array($_REQUEST['groups'])) { + $_REQUEST['groups'] = []; + } + + DB::delete('DELETE FROM `UserGroups` WHERE `uid`=?', [$user_id]); + $user_groups_info = []; + foreach ($_REQUEST['groups'] as $group) { + if (in_array($group, $grouplist)) { + DB::insert( + 'INSERT INTO `UserGroups` (`uid`, `group_id`) VALUES (?, ?)', + [$user_id, $group] + ); + $user_groups_info[] = $groups[$group]['Name']; + } + } + $user_source = User($user_id); + engelsystem_log( + 'Set groups of ' . User_Nick_render($user_source) . ' to: ' . join(', ', $user_groups_info) + ); + $html .= success('Benutzergruppen gespeichert.', true); + } else { + $html .= error('Du kannst keine Engel mit mehr Rechten bearbeiten.', true); + } + } else { + $html .= error('Du kannst Deine eigenen Rechte nicht bearbeiten.', true); + } + break; + + case 'save': + $force_active = $user['force_active']; + $user_source = User($user_id); + if (in_array('admin_active', $privileges)) { + $force_active = $_REQUEST['force_active']; + } + $sql = ' + UPDATE `User` SET + `Nick` = ?, + `Name` = ?, + `Vorname` = ?, + `Telefon` = ?, + `Handy` = ?, + `Alter` =?, + `DECT` = ?, + ' . ($user_source['email_by_human_allowed'] ? '`email` = ' . DB::getPdo()->quote($_POST["eemail"]) . ',' : '') . ' + `jabber` = ?, + `Size` = ?, + `Gekommen`= ?, + `Aktiv`= ?, + `force_active`= ?, + `Tshirt` = ?, + `Hometown` = ? + WHERE `UID` = ? + LIMIT 1'; + DB::update($sql, [ + $_POST['eNick'], + $_POST['eName'], + $_POST['eVorname'], + $_POST['eTelefon'], + $_POST['eHandy'], + $_POST['eAlter'], + $_POST['eDECT'], + $_POST['ejabber'], + $_POST['eSize'], + $_POST['eGekommen'], + $_POST['eAktiv'], + $force_active, + $_POST['eTshirt'], + $_POST['Hometown'], + $user_id, + ]); + engelsystem_log( + 'Updated user: ' . $_POST['eNick'] . ', ' . $_POST['eSize'] + . ', arrived: ' . $_POST['eGekommen'] + . ', active: ' . $_POST['eAktiv'] + . ', tshirt: ' . $_POST['eTshirt'] + ); + $html .= success('Änderung wurde gespeichert...' . "\n", true); + break; + + case 'change_pw': + if ($_REQUEST['new_pw'] != '' && $_REQUEST['new_pw'] == $_REQUEST['new_pw2']) { + set_password($user_id, $_REQUEST['new_pw']); + $user_source = User($user_id); + engelsystem_log('Set new password for ' . User_Nick_render($user_source)); + $html .= success('Passwort neu gesetzt.', true); + } else { + $html .= error('Die Eingaben müssen übereinstimmen und dürfen nicht leer sein!', true); + } + break; } - break; } - } - - return page_with_title(_("Edit user"), [ - $html - ]); + + return page_with_title(_('Edit user'), [ + $html + ]); } -?> diff --git a/includes/pages/guest_credits.php b/includes/pages/guest_credits.php index cbdc3133..d9224cbb 100644 --- a/includes/pages/guest_credits.php +++ b/includes/pages/guest_credits.php @@ -1,9 +1,17 @@ <?php -function credits_title() { - return _("Credits"); + +/** + * @return string + */ +function credits_title() +{ + return _('Credits'); } -function guest_credits() { - return template_render(__DIR__ . '/../../templates/guest_credits.html', []); +/** + * @return string + */ +function guest_credits() +{ + return template_render(__DIR__ . '/../../templates/guest_credits.html', []); } -?>
\ No newline at end of file diff --git a/includes/pages/guest_login.php b/includes/pages/guest_login.php index 54abe5ca..99970a01 100644 --- a/includes/pages/guest_login.php +++ b/includes/pages/guest_login.php @@ -1,400 +1,492 @@ <?php -function login_title() { - return _("Login"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function login_title() +{ + return _('Login'); } -function register_title() { - return _("Register"); +/** + * @return string + */ +function register_title() +{ + return _('Register'); } -function logout_title() { - return _("Logout"); +/** + * @return string + */ +function logout_title() +{ + return _('Logout'); } -// Engel registrieren -function guest_register() { - global $tshirt_sizes, $enable_tshirt_size, $default_theme, $user, $min_password_length; - - $event_config = EventConfig(); - - $msg = ""; - $nick = ""; - $lastname = ""; - $prename = ""; - $age = ""; - $tel = ""; - $dect = ""; - $mobile = ""; - $mail = ""; - $email_shiftinfo = false; - $email_by_human_allowed = false; - $jabber = ""; - $hometown = ""; - $comment = ""; - $tshirt_size = ''; - $password_hash = ""; - $selected_angel_types = []; - $planned_arrival_date = null; - - $angel_types_source = AngelTypes(); - $angel_types = []; - foreach ($angel_types_source as $angel_type) { - $angel_types[$angel_type['id']] = $angel_type['name'] . ($angel_type['restricted'] ? " (restricted)" : ""); - if (! $angel_type['restricted']) { - $selected_angel_types[] = $angel_type['id']; - } - } - - if (isset($_REQUEST['submit'])) { - $valid = true; - - if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 1) { - $nick = User_validate_Nick($_REQUEST['nick']); - if (sql_num_query("SELECT * FROM `User` WHERE `Nick`='" . sql_escape($nick) . "' LIMIT 1") > 0) { - $valid = false; - $msg .= error(sprintf(_("Your nick "%s" already exists."), $nick), true); - } - } else { - $valid = false; - $msg .= error(sprintf(_("Your nick "%s" is too short (min. 2 characters)."), User_validate_Nick($_REQUEST['nick'])), true); - } - - if (isset($_REQUEST['mail']) && strlen(strip_request_item('mail')) > 0) { - $mail = strip_request_item('mail'); - if (! check_email($mail)) { - $valid = false; - $msg .= error(_("E-mail address is not correct."), true); - } - } else { - $valid = false; - $msg .= error(_("Please enter your e-mail."), true); - } - - if (isset($_REQUEST['email_shiftinfo'])) { - $email_shiftinfo = true; - } - - if (isset($_REQUEST['email_by_human_allowed'])) { - $email_by_human_allowed = true; - } - - if (isset($_REQUEST['jabber']) && strlen(strip_request_item('jabber')) > 0) { - $jabber = strip_request_item('jabber'); - if (! check_email($jabber)) { - $valid = false; - $msg .= error(_("Please check your jabber account information."), true); - } - } - - if ($enable_tshirt_size) { - if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']]) && $_REQUEST['tshirt_size'] != '') { - $tshirt_size = $_REQUEST['tshirt_size']; - } else { - $valid = false; - $msg .= error(_("Please select your shirt size."), true); - } - } - - if (isset($_REQUEST['password']) && strlen($_REQUEST['password']) >= $min_password_length) { - if ($_REQUEST['password'] != $_REQUEST['password2']) { - $valid = false; - $msg .= error(_("Your passwords don't match."), true); - } - } else { - $valid = false; - $msg .= error(sprintf(_("Your password is too short (please use at least %s characters)."), $min_password_length), true); - } - - if (isset($_REQUEST['planned_arrival_date'])) { - $tmp = parse_date("Y-m-d H:i", $_REQUEST['planned_arrival_date'] . " 00:00"); - $result = User_validate_planned_arrival_date($tmp); - $planned_arrival_date = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.")); - } - } - +/** + * Engel registrieren + * + * @return string + */ +function guest_register() +{ + global $user; + $tshirt_sizes = config('tshirt_sizes'); + $enable_tshirt_size = config('enable_tshirt_size'); + $min_password_length = config('min_password_length'); + $event_config = EventConfig(); + + $msg = ''; + $nick = ''; + $lastName = ''; + $preName = ''; + $age = ''; + $tel = ''; + $dect = ''; + $mobile = ''; + $mail = ''; + $email_shiftinfo = false; + $email_by_human_allowed = false; + $jabber = ''; + $hometown = ''; + $comment = ''; + $tshirt_size = ''; + $password_hash = ''; $selected_angel_types = []; - foreach (array_keys($angel_types) as $angel_type_id) { - if (isset($_REQUEST['angel_types_' . $angel_type_id])) { - $selected_angel_types[] = $angel_type_id; - } - } - - // Trivia - if (isset($_REQUEST['lastname'])) { - $lastname = strip_request_item('lastname'); - } - if (isset($_REQUEST['prename'])) { - $prename = strip_request_item('prename'); - } - if (isset($_REQUEST['age']) && preg_match("/^[0-9]{0,4}$/", $_REQUEST['age'])) { - $age = strip_request_item('age'); - } - if (isset($_REQUEST['tel'])) { - $tel = strip_request_item('tel'); - } - if (isset($_REQUEST['dect'])) { - $dect = strip_request_item('dect'); - } - if (isset($_REQUEST['mobile'])) { - $mobile = strip_request_item('mobile'); - } - if (isset($_REQUEST['hometown'])) { - $hometown = strip_request_item('hometown'); - } - if (isset($_REQUEST['comment'])) { - $comment = strip_request_item_nl('comment'); + $planned_arrival_date = null; + + $angel_types_source = AngelTypes(); + $angel_types = []; + foreach ($angel_types_source as $angel_type) { + $angel_types[$angel_type['id']] = $angel_type['name'] . ($angel_type['restricted'] ? ' (restricted)' : ''); + if (!$angel_type['restricted']) { + $selected_angel_types[] = $angel_type['id']; + } } - - if ($valid) { - sql_query(" - INSERT INTO `User` SET - `color`='" . sql_escape($default_theme) . "', - `Nick`='" . sql_escape($nick) . "', - `Vorname`='" . sql_escape($prename) . "', - `Name`='" . sql_escape($lastname) . "', - `Alter`='" . sql_escape($age) . "', - `Telefon`='" . sql_escape($tel) . "', - `DECT`='" . sql_escape($dect) . "', - `Handy`='" . sql_escape($mobile) . "', - `email`='" . sql_escape($mail) . "', - `email_shiftinfo`=" . sql_bool($email_shiftinfo) . ", - `email_by_human_allowed`=" . sql_bool($email_by_human_allowed) . ", - `jabber`='" . sql_escape($jabber) . "', - `Size`='" . sql_escape($tshirt_size) . "', - `Passwort`='" . sql_escape($password_hash) . "', - `kommentar`='" . sql_escape($comment) . "', - `Hometown`='" . sql_escape($hometown) . "', - `CreateDate`=NOW(), - `Sprache`='" . sql_escape($_SESSION["locale"]) . "', - `arrival_date`=NULL, - `planned_arrival_date`='" . sql_escape($planned_arrival_date) . "'"); - - // Assign user-group and set password - $user_id = sql_id(); - sql_query("INSERT INTO `UserGroups` SET `uid`='" . sql_escape($user_id) . "', `group_id`=-2"); - set_password($user_id, $_REQUEST['password']); - - // Assign angel-types - $user_angel_types_info = []; - foreach ($selected_angel_types as $selected_angel_type_id) { - sql_query("INSERT INTO `UserAngelTypes` SET `user_id`='" . sql_escape($user_id) . "', `angeltype_id`='" . sql_escape($selected_angel_type_id) . "'"); - $user_angel_types_info[] = $angel_types[$selected_angel_type_id]; - } - - engelsystem_log("User " . User_Nick_render(User($user_id)) . " signed up as: " . join(", ", $user_angel_types_info)); - success(_("Angel registration successful!")); - - // User is already logged in - that means a supporter has registered an angel. Return to register page. - if (isset($user)) { - redirect(page_link_to('register')); - } - - // If a welcome message is present, display registration success page. - if ($event_config != null && $event_config['event_welcome_msg'] != null) { - return User_registration_success_view($event_config['event_welcome_msg']); - } - - redirect('?'); + + foreach ($tshirt_sizes as $key => $size) { + if (empty($size)) { + unset($tshirt_sizes[$key]); + } } - } - - $buildup_start_date = time(); - $teardown_end_date = null; - if ($event_config != null) { - if (isset($event_config['buildup_start_date'])) { - $buildup_start_date = $event_config['buildup_start_date']; + + if (isset($_REQUEST['submit'])) { + $valid = true; + + if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 1) { + $nick = User_validate_Nick($_REQUEST['nick']); + if (count(DB::select('SELECT `UID` FROM `User` WHERE `Nick`=? LIMIT 1', [$nick])) > 0) { + $valid = false; + $msg .= error(sprintf(_('Your nick "%s" already exists.'), $nick), true); + } + } else { + $valid = false; + $msg .= error(sprintf( + _('Your nick "%s" is too short (min. 2 characters).'), + User_validate_Nick($_REQUEST['nick']) + ), true); + } + + if (isset($_REQUEST['mail']) && strlen(strip_request_item('mail')) > 0) { + $mail = strip_request_item('mail'); + if (!check_email($mail)) { + $valid = false; + $msg .= error(_('E-mail address is not correct.'), true); + } + } else { + $valid = false; + $msg .= error(_('Please enter your e-mail.'), true); + } + + if (isset($_REQUEST['email_shiftinfo'])) { + $email_shiftinfo = true; + } + + if (isset($_REQUEST['email_by_human_allowed'])) { + $email_by_human_allowed = true; + } + + if (isset($_REQUEST['jabber']) && strlen(strip_request_item('jabber')) > 0) { + $jabber = strip_request_item('jabber'); + if (!check_email($jabber)) { + $valid = false; + $msg .= error(_('Please check your jabber account information.'), true); + } + } + + if ($enable_tshirt_size) { + if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']]) && $_REQUEST['tshirt_size'] != '') { + $tshirt_size = $_REQUEST['tshirt_size']; + } else { + $valid = false; + $msg .= error(_('Please select your shirt size.'), true); + } + } + + if (isset($_REQUEST['password']) && strlen($_REQUEST['password']) >= $min_password_length) { + if ($_REQUEST['password'] != $_REQUEST['password2']) { + $valid = false; + $msg .= error(_('Your passwords don\'t match.'), true); + } + } else { + $valid = false; + $msg .= error(sprintf( + _('Your password is too short (please use at least %s characters).'), + $min_password_length + ), true); + } + + if (isset($_REQUEST['planned_arrival_date'])) { + $tmp = parse_date('Y-m-d H:i', $_REQUEST['planned_arrival_date'] . ' 00:00'); + $result = User_validate_planned_arrival_date($tmp); + $planned_arrival_date = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.')); + } + } + + $selected_angel_types = []; + foreach (array_keys($angel_types) as $angel_type_id) { + if (isset($_REQUEST['angel_types_' . $angel_type_id])) { + $selected_angel_types[] = $angel_type_id; + } + } + + // Trivia + if (isset($_REQUEST['lastname'])) { + $lastName = strip_request_item('lastname'); + } + if (isset($_REQUEST['prename'])) { + $preName = strip_request_item('prename'); + } + if (isset($_REQUEST['age']) && preg_match('/^\d{0,4}$/', $_REQUEST['age'])) { + $age = strip_request_item('age'); + } + if (isset($_REQUEST['tel'])) { + $tel = strip_request_item('tel'); + } + if (isset($_REQUEST['dect'])) { + $dect = strip_request_item('dect'); + } + if (isset($_REQUEST['mobile'])) { + $mobile = strip_request_item('mobile'); + } + if (isset($_REQUEST['hometown'])) { + $hometown = strip_request_item('hometown'); + } + if (isset($_REQUEST['comment'])) { + $comment = strip_request_item_nl('comment'); + } + + if ($valid) { + DB::insert(' + INSERT INTO `User` ( + `color`, + `Nick`, + `Vorname`, + `Name`, + `Alter`, + `Telefon`, + `DECT`, + `Handy`, + `email`, + `email_shiftinfo`, + `email_by_human_allowed`, + `jabber`, + `Size`, + `Passwort`, + `kommentar`, + `Hometown`, + `CreateDate`, + `Sprache`, + `arrival_date`, + `planned_arrival_date` + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?, NULL, ?) + ', + [ + config('theme'), + $nick, + $preName, + $lastName, + $age, + $tel, + $dect, + $mobile, + $mail, + (bool)$email_shiftinfo, + (bool)$email_by_human_allowed, + $jabber, + $tshirt_size, + $password_hash, + $comment, + $hometown, + $_SESSION['locale'], + $planned_arrival_date, + ] + ); + + // Assign user-group and set password + $user_id = DB::getPdo()->lastInsertId(); + DB::insert('INSERT INTO `UserGroups` (`uid`, `group_id`) VALUES (?, -2)', [$user_id]); + set_password($user_id, $_REQUEST['password']); + + // Assign angel-types + $user_angel_types_info = []; + foreach ($selected_angel_types as $selected_angel_type_id) { + DB::insert( + 'INSERT INTO `UserAngelTypes` (`user_id`, `angeltype_id`) VALUES (?, ?)', + [$user_id, $selected_angel_type_id] + ); + $user_angel_types_info[] = $angel_types[$selected_angel_type_id]; + } + + engelsystem_log( + 'User ' . User_Nick_render(User($user_id)) + . ' signed up as: ' . join(', ', $user_angel_types_info) + ); + success(_('Angel registration successful!')); + + // User is already logged in - that means a supporter has registered an angel. Return to register page. + if (isset($user)) { + redirect(page_link_to('register')); + } + + // If a welcome message is present, display registration success page. + if ($event_config != null && $event_config['event_welcome_msg'] != null) { + return User_registration_success_view($event_config['event_welcome_msg']); + } + + redirect('?'); + } } - if(isset($event_config['teardown_end_date'])) { - $teardown_end_date = $event_config['teardown_end_date']; + + $buildup_start_date = time(); + $teardown_end_date = null; + if ($event_config != null) { + if (isset($event_config['buildup_start_date'])) { + $buildup_start_date = $event_config['buildup_start_date']; + } + if (isset($event_config['teardown_end_date'])) { + $teardown_end_date = $event_config['teardown_end_date']; + } } - } - - return page_with_title(register_title(), [ - _("By completing this form you're registering as a Chaos-Angel. This script will create you an account in the angel task scheduler."), - $msg, - msg(), - form([ - div('row', [ - div('col-md-6', [ - div('row', [ - div('col-sm-4', [ - form_text('nick', _("Nick") . ' ' . entry_required(), $nick) - ]), - div('col-sm-8', [ - form_email('mail', _("E-Mail") . ' ' . entry_required(), $mail), - form_checkbox('email_shiftinfo', _("The engelsystem is allowed to send me an email (e.g. when my shifts change)"), $email_shiftinfo), - form_checkbox('email_by_human_allowed', _("Humans are allowed to send me an email (e.g. for ticket vouchers)"), $email_by_human_allowed) - ]) - ]), - div('row', [ - div('col-sm-6', [ - form_date('planned_arrival_date', _("Planned date of arrival") . ' ' . entry_required(), $planned_arrival_date, $buildup_start_date, $teardown_end_date) - ]), - div('col-sm-6', [ - $enable_tshirt_size ? form_select('tshirt_size', _("Shirt size") . ' ' . entry_required(), $tshirt_sizes, $tshirt_size) : '' - ]) - ]), - div('row', [ - div('col-sm-6', [ - form_password('password', _("Password") . ' ' . entry_required()) - ]), - div('col-sm-6', [ - form_password('password2', _("Confirm password") . ' ' . entry_required()) - ]) - ]), - form_checkboxes('angel_types', _("What do you want to do?") . sprintf(" (<a href=\"%s\">%s</a>)", page_link_to('angeltypes') . '&action=about', _("Description of job types")), $angel_types, $selected_angel_types), - form_info("", _("Restricted angel types need will be confirmed later by a supporter. You can change your selection in the options section.")) - ]), - div('col-md-6', [ - div('row', [ - div('col-sm-4', [ - form_text('dect', _("DECT"), $dect) - ]), - div('col-sm-4', [ - form_text('mobile', _("Mobile"), $mobile) - ]), - div('col-sm-4', [ - form_text('tel', _("Phone"), $tel) - ]) - ]), - form_text('jabber', _("Jabber"), $jabber), - div('row', [ - div('col-sm-6', [ - form_text('prename', _("First name"), $prename) - ]), - div('col-sm-6', [ - form_text('lastname', _("Last name"), $lastname) - ]) - ]), - div('row', [ - div('col-sm-3', [ - form_text('age', _("Age"), $age) - ]), - div('col-sm-9', [ - form_text('hometown', _("Hometown"), $hometown) - ]) - ]), - form_info(entry_required() . ' = ' . _("Entry required!")) - ]) - ]), - // form_textarea('comment', _("Did you help at former CCC events and which tasks have you performed then?"), $comment), - form_submit('submit', _("Register")) - ]) - ]); + + return page_with_title(register_title(), [ + _('By completing this form you\'re registering as a Chaos-Angel. This script will create you an account in the angel task scheduler.'), + $msg, + msg(), + form([ + div('row', [ + div('col-md-6', [ + div('row', [ + div('col-sm-4', [ + form_text('nick', _('Nick') . ' ' . entry_required(), $nick) + ]), + div('col-sm-8', [ + form_email('mail', _('E-Mail') . ' ' . entry_required(), $mail), + form_checkbox( + 'email_shiftinfo', + _('The engelsystem is allowed to send me an email (e.g. when my shifts change)'), + $email_shiftinfo + ), + form_checkbox( + 'email_by_human_allowed', + _('Humans are allowed to send me an email (e.g. for ticket vouchers)'), + $email_by_human_allowed + ) + ]) + ]), + div('row', [ + div('col-sm-6', [ + form_date( + 'planned_arrival_date', + _('Planned date of arrival') . ' ' . entry_required(), + $planned_arrival_date, $buildup_start_date, $teardown_end_date + ) + ]), + div('col-sm-6', [ + $enable_tshirt_size ? form_select('tshirt_size', + _('Shirt size') . ' ' . entry_required(), + $tshirt_sizes, $tshirt_size) : '' + ]) + ]), + div('row', [ + div('col-sm-6', [ + form_password('password', _('Password') . ' ' . entry_required()) + ]), + div('col-sm-6', [ + form_password('password2', _('Confirm password') . ' ' . entry_required()) + ]) + ]), + form_checkboxes( + 'angel_types', + _('What do you want to do?') . sprintf( + ' (<a href="%s">%s</a>)', + page_link_to('angeltypes') . '&action=about', + _('Description of job types') + ), + $angel_types, + $selected_angel_types + ), + form_info( + '', + _('Restricted angel types need will be confirmed later by a supporter. You can change your selection in the options section.') + ) + ]), + div('col-md-6', [ + div('row', [ + div('col-sm-4', [ + form_text('dect', _('DECT'), $dect) + ]), + div('col-sm-4', [ + form_text('mobile', _('Mobile'), $mobile) + ]), + div('col-sm-4', [ + form_text('tel', _('Phone'), $tel) + ]) + ]), + form_text('jabber', _('Jabber'), $jabber), + div('row', [ + div('col-sm-6', [ + form_text('prename', _('First name'), $preName) + ]), + div('col-sm-6', [ + form_text('lastname', _('Last name'), $lastName) + ]) + ]), + div('row', [ + div('col-sm-3', [ + form_text('age', _('Age'), $age) + ]), + div('col-sm-9', [ + form_text('hometown', _('Hometown'), $hometown) + ]) + ]), + form_info(entry_required() . ' = ' . _('Entry required!')) + ]) + ]), + // form_textarea('comment', _('Did you help at former CCC events and which tasks have you performed then?'), $comment), + form_submit('submit', _('Register')) + ]) + ]); } -function entry_required() { - return '<span class="text-info glyphicon glyphicon-warning-sign"></span>'; +function entry_required() +{ + return '<span class="text-info glyphicon glyphicon-warning-sign"></span>'; } -function guest_logout() { - session_destroy(); - redirect(page_link_to("start")); +function guest_logout() +{ + session_destroy(); + redirect(page_link_to('start')); + return true; } -function guest_login() { - $nick = ""; - - unset($_SESSION['uid']); - $valid = true; - - if (isset($_REQUEST['submit'])) { - - if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 0) { - $nick = User_validate_Nick($_REQUEST['nick']); - $login_user = sql_select("SELECT * FROM `User` WHERE `Nick`='" . sql_escape($nick) . "'"); - if (count($login_user) > 0) { - $login_user = $login_user[0]; - if (isset($_REQUEST['password'])) { - if (! verify_password($_REQUEST['password'], $login_user['Passwort'], $login_user['UID'])) { - $valid = false; - error(_("Your password is incorrect. Please try it again.")); - } +function guest_login() +{ + $nick = ''; + + unset($_SESSION['uid']); + $valid = true; + + if (isset($_REQUEST['submit'])) { + if (isset($_REQUEST['nick']) && strlen(User_validate_Nick($_REQUEST['nick'])) > 0) { + $nick = User_validate_Nick($_REQUEST['nick']); + $login_user = DB::select('SELECT * FROM `User` WHERE `Nick`=?', [$nick]); + if (count($login_user) > 0) { + $login_user = $login_user[0]; + if (isset($_REQUEST['password'])) { + if (!verify_password($_REQUEST['password'], $login_user['Passwort'], $login_user['UID'])) { + $valid = false; + error(_('Your password is incorrect. Please try it again.')); + } + } else { + $valid = false; + error(_('Please enter a password.')); + } + } else { + $valid = false; + error(_('No user was found with that Nickname. Please try again. If you are still having problems, ask a Dispatcher.')); + } } else { - $valid = false; - error(_("Please enter a password.")); + $valid = false; + error(_('Please enter a nickname.')); + } + + if ($valid && !empty($login_user)) { + $_SESSION['uid'] = $login_user['UID']; + $_SESSION['locale'] = $login_user['Sprache']; + + redirect(page_link_to('news')); } - } else { - $valid = false; - error(_("No user was found with that Nickname. Please try again. If you are still having problems, ask a Dispatcher.")); - } - } else { - $valid = false; - error(_("Please enter a nickname.")); - } - - if ($valid) { - $_SESSION['uid'] = $login_user['UID']; - $_SESSION['locale'] = $login_user['Sprache']; - - redirect(page_link_to('news')); } - } - - $event_config = EventConfig(); - - return page([ - div('col-md-12', [ - div('row', [ - EventConfig_countdown_page($event_config) - ]), - div('row', [ - div('col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4', [ - div('panel panel-primary first', [ - div('panel-heading', [ - '<span class="icon-icon_angel"></span> ' . _("Login") - ]), - div('panel-body', [ - msg(), - form([ - form_text_placeholder('nick', _("Nick"), $nick), - form_password_placeholder('password', _("Password")), - form_submit('submit', _("Login")), - ! $valid ? buttons([ - button(page_link_to('user_password_recovery'), _("I forgot my password")) - ]) : '' - ]) - ]), - div('panel-footer', [ - glyph('info-sign') . _("Please note: You have to activate cookies!") - ]) - ]) - ]) - ]), - div('row', [ - div('col-sm-6 text-center', [ - heading(register_title(), 2), - get_register_hint() - ]), - div('col-sm-6 text-center', [ - heading(_("What can I do?"), 2), - '<p>' . _("Please read about the jobs you can do to help us.") . '</p>', - buttons([ - button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' »') - ]) - ]) - ]) - ]) - ]); -} -function get_register_hint() { - global $privileges; - - if (in_array('register', $privileges)) { - return join('', [ - '<p>' . _("Please sign up, if you want to help us!") . '</p>', - buttons([ - button(page_link_to('register'), register_title() . ' »') - ]) + $event_config = EventConfig(); + + return page([ + div('col-md-12', [ + div('row', [ + EventConfig_countdown_page($event_config) + ]), + div('row', [ + div('col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4', [ + div('panel panel-primary first', [ + div('panel-heading', [ + '<span class="icon-icon_angel"></span> ' . _('Login') + ]), + div('panel-body', [ + msg(), + form([ + form_text_placeholder('nick', _('Nick'), $nick), + form_password_placeholder('password', _('Password')), + form_submit('submit', _('Login')), + !$valid ? buttons([ + button(page_link_to('user_password_recovery'), _('I forgot my password')) + ]) : '' + ]) + ]), + div('panel-footer', [ + glyph('info-sign') . _('Please note: You have to activate cookies!') + ]) + ]) + ]) + ]), + div('row', [ + div('col-sm-6 text-center', [ + heading(register_title(), 2), + get_register_hint() + ]), + div('col-sm-6 text-center', [ + heading(_('What can I do?'), 2), + '<p>' . _('Please read about the jobs you can do to help us.') . '</p>', + buttons([ + button(page_link_to('angeltypes') . '&action=about', _('Teams/Job description') . ' »') + ]) + ]) + ]) + ]) ]); - } - - //FIXME: return error(_("Registration is disabled."), true); - return error("Registration is <a href='https://engelsystem.de/33c3/overwhelmed.html'>disabled</a>.", true); } -?> + +function get_register_hint() +{ + global $privileges; + + if (in_array('register', $privileges)) { + return join('', [ + '<p>' . _('Please sign up, if you want to help us!') . '</p>', + buttons([ + button(page_link_to('register'), register_title() . ' »') + ]) + ]); + } + + //FIXME: return error(_('Registration is disabled.'), true); + return error('Registration is <a href="https://engelsystem.de/33c3/overwhelmed.html">disabled</a>.', true); +} diff --git a/includes/pages/guest_start.php b/includes/pages/guest_start.php index 8f008a8d..4cd2fa42 100644 --- a/includes/pages/guest_start.php +++ b/includes/pages/guest_start.php @@ -1,5 +1,6 @@ <?php -function guest_start() { - redirect(page_link_to('login')); +function guest_start() +{ + redirect(page_link_to('login')); + return true; } -?>
\ No newline at end of file diff --git a/includes/pages/guest_stats.php b/includes/pages/guest_stats.php index 71fde137..6b6f0572 100644 --- a/includes/pages/guest_stats.php +++ b/includes/pages/guest_stats.php @@ -1,35 +1,48 @@ <?php -function guest_stats() { - global $api_key; - - if (isset($_REQUEST['api_key'])) { - if ($_REQUEST['api_key'] == $api_key) { - $stats = []; - - list($user_count) = sql_select("SELECT count(*) as `user_count` FROM `User`"); - $stats['user_count'] = $user_count['user_count']; - - list($arrived_user_count) = sql_select("SELECT count(*) as `user_count` FROM `User` WHERE `Gekommen`=1"); - $stats['arrived_user_count'] = $arrived_user_count['user_count']; - - $done_shifts_seconds = sql_select_single_cell("SELECT SUM(`Shifts`.`end` - `Shifts`.`start`) FROM `ShiftEntry` JOIN `Shifts` USING (`SID`) WHERE `Shifts`.`end` < UNIX_TIMESTAMP()"); - $stats['done_work_hours'] = round($done_shifts_seconds / (60 * 60), 0); - - $users_in_action = sql_select("SELECT `Shifts`.`start`, `Shifts`.`end` FROM `ShiftEntry` JOIN `Shifts` ON `Shifts`.`SID`=`ShiftEntry`.`SID` WHERE UNIX_TIMESTAMP() BETWEEN `Shifts`.`start` AND `Shifts`.`end`"); - $stats['users_in_action'] = count($users_in_action); - - header("Content-Type: application/json"); - raw_output(json_encode($stats)); - return; +use Engelsystem\Database\DB; + +function guest_stats() +{ + $apiKey = config('api_key'); + + if (isset($_REQUEST['api_key'])) { + if ($_REQUEST['api_key'] == $apiKey && !empty($apiKey)) { + $stats = []; + + list($user_count) = DB::select('SELECT count(*) AS `user_count` FROM `User`'); + $stats['user_count'] = $user_count['user_count']; + + list($arrived_user_count) = DB::select('SELECT count(*) AS `user_count` FROM `User` WHERE `Gekommen`=1'); + $stats['arrived_user_count'] = $arrived_user_count['user_count']; + + $done_shifts_seconds = DB::select(' + SELECT SUM(`Shifts`.`end` - `Shifts`.`start`) + FROM `ShiftEntry` + JOIN `Shifts` USING (`SID`) + WHERE `Shifts`.`end` < UNIX_TIMESTAMP() + '); + $done_shifts_seconds = array_shift($done_shifts_seconds); + $done_shifts_seconds = (int)array_shift($done_shifts_seconds); + $stats['done_work_hours'] = round($done_shifts_seconds / (60 * 60), 0); + + $users_in_action = DB::select(' + SELECT `Shifts`.`start`, `Shifts`.`end` + FROM `ShiftEntry` + JOIN `Shifts` ON `Shifts`.`SID`=`ShiftEntry`.`SID` + WHERE UNIX_TIMESTAMP() BETWEEN `Shifts`.`start` AND `Shifts`.`end` + '); + $stats['users_in_action'] = count($users_in_action); + + header('Content-Type: application/json'); + raw_output(json_encode($stats)); + return; + } + raw_output(json_encode([ + 'error' => 'Wrong api_key.' + ])); } raw_output(json_encode([ - 'error' => "Wrong api_key." + 'error' => 'Missing parameter api_key.' ])); - } - raw_output(json_encode([ - 'error' => "Missing parameter api_key." - ])); } - -?> diff --git a/includes/pages/user_atom.php b/includes/pages/user_atom.php index 9a765634..d7c77d52 100644 --- a/includes/pages/user_atom.php +++ b/includes/pages/user_atom.php @@ -1,51 +1,73 @@ <?php -// publically available page to feed the news to feedreaders -function user_atom() { - global $user, $DISPLAY_NEWS; - - if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { - engelsystem_error("Missing key."); - } - $key = $_REQUEST['key']; - - $user = User_by_api_key($key); - if ($user == null) { - engelsystem_error("Key invalid."); - } - if (! in_array('atom', privileges_for_user($user['UID']))) { - engelsystem_error("No privilege for atom."); - } - - $news = sql_select("SELECT * FROM `News` " . (empty($_REQUEST['meetings']) ? '' : 'WHERE `Treffen` = 1 ') . "ORDER BY `ID` DESC LIMIT " . sql_escape($DISPLAY_NEWS)); - - $output = make_atom_entries_from_news($news); - - header('Content-Type: application/atom+xml; charset=utf-8'); - header("Content-Length: " . strlen($output)); - raw_output($output); +use Engelsystem\Database\DB; + +/** + * Publically available page to feed the news to feedreaders + */ +function user_atom() +{ + global $user; + + if (!isset($_REQUEST['key']) || !preg_match('/^[\da-f]{32}$/', $_REQUEST['key'])) { + engelsystem_error('Missing key.'); + } + $key = $_REQUEST['key']; + + $user = User_by_api_key($key); + if ($user == null) { + engelsystem_error('Key invalid.'); + } + if (!in_array('atom', privileges_for_user($user['UID']))) { + engelsystem_error('No privilege for atom.'); + } + + $news = DB::select(' + SELECT * + FROM `News` + ' . (empty($_REQUEST['meetings']) ? '' : 'WHERE `Treffen` = 1 ') . ' + ORDER BY `ID` + DESC LIMIT ' . (int)config('display_news') + ); + + $output = make_atom_entries_from_news($news); + + header('Content-Type: application/atom+xml; charset=utf-8'); + header('Content-Length: ' . strlen($output)); + raw_output($output); } -function make_atom_entries_from_news($news_entries) { - $html = '<?xml version="1.0" encoding="utf-8"?> +/** + * @param array[] $news_entries + * @return string + */ +function make_atom_entries_from_news($news_entries) +{ + $html = '<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Engelsystem</title> - <id>' . $_SERVER['HTTP_HOST'] . htmlspecialchars(preg_replace('#[&?]key=[a-f0-9]{32}#', '', $_SERVER['REQUEST_URI'])) . '</id> - <updated>' . date('Y-m-d\TH:i:sP', $news_entries[0]['Datum']) . "</updated>\n"; - foreach ($news_entries as $news_entry) { - $html .= make_atom_entry_from_news($news_entry); - } - $html .= "</feed>"; - return $html; + <id>' . $_SERVER['HTTP_HOST'] + . htmlspecialchars(preg_replace( + '#[&?]key=[a-f\d]{32}#', + '', + $_SERVER['REQUEST_URI'] + )) + . '</id> + <updated>' . date('Y-m-d\TH:i:sP', $news_entries[0]['Datum']) . '</updated>' . "\n"; + foreach ($news_entries as $news_entry) { + $html .= make_atom_entry_from_news($news_entry); + } + $html .= '</feed>'; + return $html; } -function make_atom_entry_from_news($news_entry) { - return " <entry> - <title>" . htmlspecialchars($news_entry['Betreff']) . "</title> - <link href=\"" . page_link_to_absolute("news_comments&nid=") . "${news_entry['ID']}\"/> - <id>" . preg_replace('#^https?://#', '', page_link_to_absolute("news")) . "-${news_entry['ID']}</id> - <updated>" . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . "</updated> - <summary type=\"html\">" . htmlspecialchars($news_entry['Text']) . "</summary> - </entry>\n"; +function make_atom_entry_from_news($news_entry) +{ + return ' <entry> + <title>' . htmlspecialchars($news_entry['Betreff']) . '</title> + <link href="' . page_link_to_absolute('news_comments&nid=') . $news_entry['ID'] . '"/> + <id>' . preg_replace('#^https?://#', '', page_link_to_absolute('news')) . '-' . $news_entry['ID'] . '</id> + <updated>' . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . '</updated> + <summary type="html">' . htmlspecialchars($news_entry['Text']) . '</summary> + </entry>' . "\n"; } -?> diff --git a/includes/pages/user_ical.php b/includes/pages/user_ical.php index 34860b70..ce474a9e 100644 --- a/includes/pages/user_ical.php +++ b/includes/pages/user_ical.php @@ -3,61 +3,66 @@ /** * Controller for ical output of users own shifts or any user_shifts filter. */ -function user_ical() { - global $user; - - if (! isset($_REQUEST['key']) || ! preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) { - engelsystem_error("Missing key."); - } - $key = $_REQUEST['key']; - - $user = User_by_api_key($key); - if ($user == null) { - engelsystem_error("Key invalid."); - } - - if (! in_array('ical', privileges_for_user($user['UID']))) { - engelsystem_error("No privilege for ical."); - } - - $ical_shifts = load_ical_shifts(); - - send_ical_from_shifts($ical_shifts); +function user_ical() +{ + global $user; + + if (!isset($_REQUEST['key']) || !preg_match('/^[\da-f]{32}$/', $_REQUEST['key'])) { + engelsystem_error('Missing key.'); + } + $key = $_REQUEST['key']; + + $user = User_by_api_key($key); + if ($user == null) { + engelsystem_error('Key invalid.'); + } + + if (!in_array('ical', privileges_for_user($user['UID']))) { + engelsystem_error('No privilege for ical.'); + } + + $ical_shifts = load_ical_shifts(); + + send_ical_from_shifts($ical_shifts); } /** * Renders an ical calender from given shifts array. * - * @param array<Shift> $shifts + * @param array <Shift> $shifts */ -function send_ical_from_shifts($shifts) { - header("Content-Type: text/calendar; charset=utf-8"); - $output = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//-//Engelsystem//DE\r\nCALSCALE:GREGORIAN\r\n"; - foreach ($shifts as $shift) { - $output .= make_ical_entry_from_shift($shift); - } - $output .= "END:VCALENDAR\r\n"; - $output = trim($output, "\x0A"); - header("Content-Length: " . strlen($output)); - raw_output($output); +function send_ical_from_shifts($shifts) +{ + header('Content-Type: text/calendar; charset=utf-8'); + header('Content-Disposition: attachment; filename=shifts.ics'); + $output = "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//-//Engelsystem//DE\r\nCALSCALE:GREGORIAN\r\n"; + foreach ($shifts as $shift) { + $output .= make_ical_entry_from_shift($shift); + } + $output .= "END:VCALENDAR\r\n"; + $output = trim($output, "\x0A"); + header('Content-Length: ' . strlen($output)); + raw_output($output); } /** * Renders an ical vevent from given shift. * - * @param Shift $shift + * @param array $shift + * @return string */ -function make_ical_entry_from_shift($shift) { - $output = "BEGIN:VEVENT\r\n"; - $output .= "UID:" . md5($shift['start'] . $shift['end'] . $shift['name']) . "\r\n"; - $output .= "SUMMARY:" . str_replace("\n", "\\n", $shift['name']) . " (" . str_replace("\n", "\\n", $shift['title']) . ")\r\n"; - if (isset($shift['Comment'])) { - $output .= "DESCRIPTION:" . str_replace("\n", "\\n", $shift['Comment']) . "\r\n"; - } - $output .= "DTSTART;TZID=Europe/Berlin:" . date("Ymd\THis", $shift['start']) . "\r\n"; - $output .= "DTEND;TZID=Europe/Berlin:" . date("Ymd\THis", $shift['end']) . "\r\n"; - $output .= "LOCATION:" . $shift['Name'] . "\r\n"; - $output .= "END:VEVENT\r\n"; - return $output; +function make_ical_entry_from_shift($shift) +{ + $output = "BEGIN:VEVENT\r\n"; + $output .= 'UID:' . md5($shift['start'] . $shift['end'] . $shift['name']) . "\r\n"; + $output .= 'SUMMARY:' . str_replace("\n", "\\n", $shift['name']) + . ' (' . str_replace("\n", "\\n", $shift['title']) . ")\r\n"; + if (isset($shift['Comment'])) { + $output .= 'DESCRIPTION:' . str_replace("\n", "\\n", $shift['Comment']) . "\r\n"; + } + $output .= 'DTSTART;TZID=Europe/Berlin:' . date("Ymd\THis", $shift['start']) . "\r\n"; + $output .= 'DTEND;TZID=Europe/Berlin:' . date("Ymd\THis", $shift['end']) . "\r\n"; + $output .= 'LOCATION:' . $shift['Name'] . "\r\n"; + $output .= "END:VEVENT\r\n"; + return $output; } -?> diff --git a/includes/pages/user_messages.php b/includes/pages/user_messages.php index eb07deea..dd22cd66 100644 --- a/includes/pages/user_messages.php +++ b/includes/pages/user_messages.php @@ -1,131 +1,180 @@ <?php -function messages_title() { - return _("Messages"); -} +use Engelsystem\Database\DB; -function user_unread_messages() { - global $user; - - if (isset($user)) { - $new_messages = sql_num_query("SELECT * FROM `Messages` WHERE isRead='N' AND `RUID`='" . sql_escape($user['UID']) . "'"); - if ($new_messages > 0) { - return ' <span class="badge danger">' . $new_messages . '</span>'; - } - } - return ''; +/** + * @return string + */ +function messages_title() +{ + return _('Messages'); } -function user_messages() { - global $user; - - if (! isset($_REQUEST['action'])) { - $users = sql_select("SELECT * FROM `User` WHERE NOT `UID`='" . sql_escape($user['UID']) . "' ORDER BY `Nick`"); - - $to_select_data = [ - "" => _("Select recipient...") - ]; - - foreach ($users as $u) { - $to_select_data[$u['UID']] = $u['Nick']; - } - - $to_select = html_select_key('to', 'to', $to_select_data, ''); - - $messages = sql_select("SELECT * FROM `Messages` WHERE `SUID`='" . sql_escape($user['UID']) . "' OR `RUID`='" . sql_escape($user['UID']) . "' ORDER BY `isRead`,`Datum` DESC"); - - $messages_table = [ - [ - 'news' => '', - 'timestamp' => date("Y-m-d H:i"), - 'from' => User_Nick_render($user), - 'to' => $to_select, - 'text' => form_textarea('text', '', ''), - 'actions' => form_submit('submit', _("Save")) - ] - ]; - - foreach ($messages as $message) { - $sender_user_source = User($message['SUID']); - $receiver_user_source = User($message['RUID']); - - $messages_table_entry = [ - 'new' => $message['isRead'] == 'N' ? '<span class="glyphicon glyphicon-envelope"></span>' : '', - 'timestamp' => date("Y-m-d H:i", $message['Datum']), - 'from' => User_Nick_render($sender_user_source), - 'to' => User_Nick_render($receiver_user_source), - 'text' => str_replace("\n", '<br />', $message['Text']) - ]; - - if ($message['RUID'] == $user['UID']) { - if ($message['isRead'] == 'N') { - $messages_table_entry['actions'] = button(page_link_to("user_messages") . '&action=read&id=' . $message['id'], _("mark as read"), 'btn-xs'); +/** + * @return string + */ +function user_unread_messages() +{ + global $user; + + if (isset($user)) { + $new_messages = count(DB::select( + 'SELECT `id` FROM `Messages` WHERE isRead=\'N\' AND `RUID`=?', + [$user['UID']] + )); + if ($new_messages > 0) { + return ' <span class="badge danger">' . $new_messages . '</span>'; } - } else { - $messages_table_entry['actions'] = button(page_link_to("user_messages") . '&action=delete&id=' . $message['id'], _("delete message"), 'btn-xs'); - } - $messages_table[] = $messages_table_entry; } - - return page_with_title(messages_title(), [ - msg(), - sprintf(_("Hello %s, here can you leave messages for other angels"), User_Nick_render($user)), - form([ - table([ - 'new' => _("New"), - 'timestamp' => _("Date"), - 'from' => _("Transmitted"), - 'to' => _("Recipient"), - 'text' => _("Message"), - 'actions' => '' - ], $messages_table) - ], page_link_to('user_messages') . '&action=send') - ]); - } else { - switch ($_REQUEST['action']) { - case "read": - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $message_id = $_REQUEST['id']; - } else { - return error(_("Incomplete call, missing Message ID."), true); - } - - $message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); - if (count($message) > 0 && $message[0]['RUID'] == $user['UID']) { - sql_query("UPDATE `Messages` SET `isRead`='Y' WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); - redirect(page_link_to("user_messages")); - } else { - return error(_("No Message found."), true); - } - break; - - case "delete": - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $message_id = $_REQUEST['id']; - } else { - return error(_("Incomplete call, missing Message ID."), true); + return ''; +} + +/** + * @return string + */ +function user_messages() +{ + global $user; + + if (!isset($_REQUEST['action'])) { + $users = DB::select( + 'SELECT `UID`, `Nick` FROM `User` WHERE NOT `UID`=? ORDER BY `Nick`', + [$user['UID']] + ); + + $to_select_data = [ + '' => _('Select recipient...') + ]; + + foreach ($users as $u) { + $to_select_data[$u['UID']] = $u['Nick']; } - - $message = sql_select("SELECT * FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); - if (count($message) > 0 && $message[0]['SUID'] == $user['UID']) { - sql_query("DELETE FROM `Messages` WHERE `id`='" . sql_escape($message_id) . "' LIMIT 1"); - redirect(page_link_to("user_messages")); - } else { - return error(_("No Message found."), true); + + $to_select = html_select_key('to', 'to', $to_select_data, ''); + + $messages = DB::select(' + SELECT * + FROM `Messages` + WHERE `SUID`=? + OR `RUID`=? + ORDER BY `isRead`,`Datum` DESC + ', + [ + $user['UID'], + $user['UID'], + ] + ); + + $messages_table = [ + [ + 'news' => '', + 'timestamp' => date('Y-m-d H:i'), + 'from' => User_Nick_render($user), + 'to' => $to_select, + 'text' => form_textarea('text', '', ''), + 'actions' => form_submit('submit', _('Save')) + ] + ]; + + foreach ($messages as $message) { + $sender_user_source = User($message['SUID']); + $receiver_user_source = User($message['RUID']); + + $messages_table_entry = [ + 'new' => $message['isRead'] == 'N' ? '<span class="glyphicon glyphicon-envelope"></span>' : '', + 'timestamp' => date('Y-m-d H:i', $message['Datum']), + 'from' => User_Nick_render($sender_user_source), + 'to' => User_Nick_render($receiver_user_source), + 'text' => str_replace("\n", '<br />', $message['Text']) + ]; + + if ($message['RUID'] == $user['UID']) { + if ($message['isRead'] == 'N') { + $messages_table_entry['actions'] = button( + page_link_to('user_messages') . '&action=read&id=' . $message['id'], + _('mark as read'), + 'btn-xs' + ); + } + } else { + $messages_table_entry['actions'] = button( + page_link_to('user_messages') . '&action=delete&id=' . $message['id'], + _('delete message'), + 'btn-xs' + ); + } + $messages_table[] = $messages_table_entry; } - break; - - case "send": - if (Message_send($_REQUEST['to'], $_REQUEST['text']) === true) { - redirect(page_link_to("user_messages")); - } else { - return error(_("Transmitting was terminated with an Error."), true); + + return page_with_title(messages_title(), [ + msg(), + sprintf(_('Hello %s, here can you leave messages for other angels'), User_Nick_render($user)), + form([ + table([ + 'new' => _('New'), + 'timestamp' => _('Date'), + 'from' => _('Transmitted'), + 'to' => _('Recipient'), + 'text' => _('Message'), + 'actions' => '' + ], $messages_table) + ], page_link_to('user_messages') . '&action=send') + ]); + } else { + switch ($_REQUEST['action']) { + case 'read': + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $message_id = $_REQUEST['id']; + } else { + return error(_('Incomplete call, missing Message ID.'), true); + } + + $message = DB::select( + 'SELECT `RUID` FROM `Messages` WHERE `id`=? LIMIT 1', + [$message_id] + ); + if (count($message) > 0 && $message[0]['RUID'] == $user['UID']) { + DB::update( + 'UPDATE `Messages` SET `isRead`=\'Y\' WHERE `id`=? LIMIT 1', + [$message_id] + ); + redirect(page_link_to('user_messages')); + } else { + return error(_('No Message found.'), true); + } + break; + + case 'delete': + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $message_id = $_REQUEST['id']; + } else { + return error(_('Incomplete call, missing Message ID.'), true); + } + + $message = DB::select( + 'SELECT `SUID` FROM `Messages` WHERE `id`=? LIMIT 1', + [$message_id] + ); + if (count($message) > 0 && $message[0]['SUID'] == $user['UID']) { + DB::delete('DELETE FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]); + redirect(page_link_to('user_messages')); + } else { + return error(_('No Message found.'), true); + } + break; + + case 'send': + if (Message_send($_REQUEST['to'], $_REQUEST['text'])) { + redirect(page_link_to('user_messages')); + } else { + return error(_('Transmitting was terminated with an Error.'), true); + } + break; + + default: + return error(_('Wrong action.'), true); } - break; - - default: - return error(_("Wrong action."), true); } - } + + return ''; } -?> diff --git a/includes/pages/user_myshifts.php b/includes/pages/user_myshifts.php index 3cf0c571..6048093a 100644 --- a/includes/pages/user_myshifts.php +++ b/includes/pages/user_myshifts.php @@ -1,118 +1,176 @@ <?php -function myshifts_title() { - return _("My shifts"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function myshifts_title() +{ + return _('My shifts'); } -// Zeigt die Schichten an, die ein Benutzer belegt -function user_myshifts() { - global $LETZTES_AUSTRAGEN; - global $user, $privileges; - - if (isset($_REQUEST['id']) && in_array("user_shifts_admin", $privileges) && preg_match("/^[0-9]{1,}$/", $_REQUEST['id']) && sql_num_query("SELECT * FROM `User` WHERE `UID`='" . sql_escape($_REQUEST['id']) . "'") > 0) { - $user_id = $_REQUEST['id']; - } else { - $user_id = $user['UID']; - } - - list($shifts_user) = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($user_id) . "' LIMIT 1"); - - if (isset($_REQUEST['reset'])) { - if ($_REQUEST['reset'] == "ack") { - User_reset_api_key($user); - success(_("Key changed.")); - redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); +/** + * Zeigt die Schichten an, die ein Benutzer belegt + * + * @return string + */ +function user_myshifts() +{ + global $user, $privileges; + + if ( + isset($_REQUEST['id']) + && in_array('user_shifts_admin', $privileges) + && preg_match('/^\d{1,}$/', $_REQUEST['id']) + && count(DB::select('SELECT `UID` FROM `User` WHERE `UID`=?', [$_REQUEST['id']])) > 0 + ) { + $user_id = $_REQUEST['id']; + } else { + $user_id = $user['UID']; } - return page_with_title(_("Reset API key"), [ - error(_("If you reset the key, the url to your iCal- and JSON-export and your atom feed changes! You have to update it in every application using one of these exports."), true), - button(page_link_to('user_myshifts') . '&reset=ack', _("Continue"), 'btn-danger') - ]); - } elseif (isset($_REQUEST['edit']) && preg_match("/^[0-9]*$/", $_REQUEST['edit'])) { - $user_id = $_REQUEST['edit']; - $shift = sql_select("SELECT - `ShiftEntry`.`freeloaded`, - `ShiftEntry`.`freeload_comment`, - `ShiftEntry`.`Comment`, - `ShiftEntry`.`UID`, - `ShiftTypes`.`name`, - `Shifts`.*, - `Room`.`Name`, - `AngelTypes`.`name` as `angel_type` - FROM `ShiftEntry` - JOIN `AngelTypes` ON (`ShiftEntry`.`TID` = `AngelTypes`.`id`) - JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) - JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) - JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) - WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "' - AND `UID`='" . sql_escape($shifts_user['UID']) . "' LIMIT 1"); - if (count($shift) > 0) { - $shift = $shift[0]; - $freeloaded = $shift['freeloaded']; - $freeload_comment = $shift['freeload_comment']; - - if (isset($_REQUEST['submit'])) { - $valid = true; - if (in_array("user_shifts_admin", $privileges)) { - $freeloaded = isset($_REQUEST['freeloaded']); - $freeload_comment = strip_request_item_nl('freeload_comment'); - if ($freeloaded && $freeload_comment == '') { - $valid = false; - error(_("Please enter a freeload comment!")); - } + + $shifts_user = DB::select('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]); + $shifts_user = array_shift($shifts_user); + + if (isset($_REQUEST['reset'])) { + if ($_REQUEST['reset'] == 'ack') { + User_reset_api_key($user); + success(_('Key changed.')); + redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); } - - $comment = strip_request_item_nl('comment'); - $user_source = User($shift['UID']); - - if ($valid) { - $result = ShiftEntry_update([ - 'id' => $user_id, - 'Comment' => $comment, - 'freeloaded' => $freeloaded, - 'freeload_comment' => $freeload_comment - ]); - if ($result === false) { - engelsystem_error('Unable to update shift entry.'); - } - - engelsystem_log("Updated " . User_Nick_render($user_source) . "'s shift " . $shift['name'] . " from " . date("Y-m-d H:i", $shift['start']) . " to " . date("Y-m-d H:i", $shift['end']) . " with comment " . $comment . ". Freeloaded: " . ($freeloaded ? "YES Comment: " . $freeload_comment : "NO")); - success(_("Shift saved.")); - redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); + return page_with_title(_('Reset API key'), [ + error( + _('If you reset the key, the url to your iCal- and JSON-export and your atom feed changes! You have to update it in every application using one of these exports.'), + true + ), + button(page_link_to('user_myshifts') . '&reset=ack', _('Continue'), 'btn-danger') + ]); + } elseif (isset($_REQUEST['edit']) && preg_match('/^\d*$/', $_REQUEST['edit'])) { + $user_id = $_REQUEST['edit']; + $shift = DB::select(' + SELECT + `ShiftEntry`.`freeloaded`, + `ShiftEntry`.`freeload_comment`, + `ShiftEntry`.`Comment`, + `ShiftEntry`.`UID`, + `ShiftTypes`.`name`, + `Shifts`.*, + `Room`.`Name`, + `AngelTypes`.`name` AS `angel_type` + FROM `ShiftEntry` + JOIN `AngelTypes` ON (`ShiftEntry`.`TID` = `AngelTypes`.`id`) + JOIN `Shifts` ON (`ShiftEntry`.`SID` = `Shifts`.`SID`) + JOIN `ShiftTypes` ON (`ShiftTypes`.`id` = `Shifts`.`shifttype_id`) + JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) + WHERE `ShiftEntry`.`id`=? + AND `UID`=? + LIMIT 1 + ', + [ + $user_id, + $shifts_user['UID'], + ] + ); + if (count($shift) > 0) { + $shift = array_shift($shift); + $freeloaded = $shift['freeloaded']; + $freeload_comment = $shift['freeload_comment']; + + if (isset($_REQUEST['submit'])) { + $valid = true; + if (in_array('user_shifts_admin', $privileges)) { + $freeloaded = isset($_REQUEST['freeloaded']); + $freeload_comment = strip_request_item_nl('freeload_comment'); + if ($freeloaded && $freeload_comment == '') { + $valid = false; + error(_('Please enter a freeload comment!')); + } + } + + $comment = strip_request_item_nl('comment'); + $user_source = User($shift['UID']); + + if ($valid) { + $result = ShiftEntry_update([ + 'id' => $user_id, + 'Comment' => $comment, + 'freeloaded' => $freeloaded, + 'freeload_comment' => $freeload_comment + ]); + if ($result === false) { + engelsystem_error('Unable to update shift entry.'); + } + + engelsystem_log( + 'Updated ' . User_Nick_render($user_source) . '\'s shift ' . $shift['name'] + . ' from ' . date('Y-m-d H:i', $shift['start']) + . ' to ' . date('Y-m-d H:i', $shift['end']) + . ' with comment ' . $comment + . '. Freeloaded: ' . ($freeloaded ? 'YES Comment: ' . $freeload_comment : 'NO') + ); + success(_('Shift saved.')); + redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); + } + } + + return ShiftEntry_edit_view( + User_Nick_render($shifts_user), + date('Y-m-d H:i', $shift['start']) . ', ' . shift_length($shift), + $shift['Name'], + $shift['name'], + $shift['angel_type'], + $shift['Comment'], + $shift['freeloaded'], + $shift['freeload_comment'], + in_array('user_shifts_admin', $privileges) + ); + } else { + redirect(page_link_to('user_myshifts')); } - } - - return ShiftEntry_edit_view(User_Nick_render($shifts_user), date("Y-m-d H:i", $shift['start']) . ', ' . shift_length($shift), $shift['Name'], $shift['name'], $shift['angel_type'], $shift['Comment'], $shift['freeloaded'], $shift['freeload_comment'], in_array("user_shifts_admin", $privileges)); - } else { - redirect(page_link_to('user_myshifts')); - } - } elseif (isset($_REQUEST['cancel']) && preg_match("/^[0-9]*$/", $_REQUEST['cancel'])) { - $user_id = $_REQUEST['cancel']; - $shift = sql_select(" - SELECT * - FROM `Shifts` - INNER JOIN `ShiftEntry` USING (`SID`) - WHERE `ShiftEntry`.`id`='" . sql_escape($user_id) . "' AND `UID`='" . sql_escape($shifts_user['UID']) . "'"); - if (count($shift) > 0) { - $shift = $shift[0]; - if (($shift['start'] > time() + $LETZTES_AUSTRAGEN * 3600) || in_array('user_shifts_admin', $privileges)) { - $result = ShiftEntry_delete($user_id); - if ($result === false) { - engelsystem_error('Unable to delete shift entry.'); + } elseif (isset($_REQUEST['cancel']) && preg_match('/^\d*$/', $_REQUEST['cancel'])) { + $user_id = $_REQUEST['cancel']; + $shift = DB::select(' + SELECT * + FROM `Shifts` + INNER JOIN `ShiftEntry` USING (`SID`) + WHERE `ShiftEntry`.`id`=? AND `UID`=? + ', + [ + $user_id, + $shifts_user['UID'], + ] + ); + if (count($shift) > 0) { + $shift = array_shift($shift); + if ( + ($shift['start'] > time() + config('last_unsubscribe') * 3600) + || in_array('user_shifts_admin', $privileges) + ) { + $result = ShiftEntry_delete($user_id); + if ($result === false) { + engelsystem_error('Unable to delete shift entry.'); + } + $room = Room($shift['RID']); + $angeltype = AngelType($shift['TID']); + $shifttype = ShiftType($shift['shifttype_id']); + + engelsystem_log( + 'Deleted own shift: ' . $shifttype['name'] + . ' at ' . $room['Name'] + . ' from ' . date('Y-m-d H:i', $shift['start']) + . ' to ' . date('Y-m-d H:i', $shift['end']) + . ' as ' . $angeltype['name'] + ); + success(_('Shift canceled.')); + } else { + error(_('It\'s too late to sign yourself off the shift. If neccessary, ask the dispatcher to do so.')); + } + } else { + redirect(user_link($shifts_user)); } - $room = Room($shift['RID']); - $angeltype = AngelType($shift['TID']); - $shifttype = ShiftType($shift['shifttype_id']); - - engelsystem_log("Deleted own shift: " . $shifttype['name'] . " at " . $room['Name'] . " from " . date("Y-m-d H:i", $shift['start']) . " to " . date("Y-m-d H:i", $shift['end']) . " as " . $angeltype['name']); - success(_("Shift canceled.")); - } else { - error(_("It's too late to sign yourself off the shift. If neccessary, ask the dispatcher to do so.")); - } - } else { - redirect(user_link($shifts_user)); } - } - - redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); + + redirect(page_link_to('users') . '&action=view&user_id=' . $shifts_user['UID']); + return ''; } -?> diff --git a/includes/pages/user_news.php b/includes/pages/user_news.php index 97f7ec83..b1e337b6 100644 --- a/includes/pages/user_news.php +++ b/includes/pages/user_news.php @@ -1,169 +1,251 @@ <?php -function user_news_comments_title() { - return _("News comments"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function user_news_comments_title() +{ + return _('News comments'); } -function news_title() { - return _("News"); +/** + * @return string + */ +function news_title() +{ + return _('News'); } -function meetings_title() { - return _("Meetings"); +/** + * @return string + */ +function meetings_title() +{ + return _('Meetings'); } -function user_meetings() { - global $DISPLAY_NEWS; - - $html = '<div class="col-md-12"><h1>' . meetings_title() . '</h1>' . msg(); - - if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) { - $page = $_REQUEST['page']; - } else { - $page = 0; - } - - $news = sql_select("SELECT * FROM `News` WHERE `Treffen`=1 ORDER BY `Datum` DESC LIMIT " . sql_escape($page * $DISPLAY_NEWS) . ", " . sql_escape($DISPLAY_NEWS)); - foreach ($news as $entry) { - $html .= display_news($entry); - } - - $dis_rows = ceil(sql_num_query("SELECT * FROM `News`") / $DISPLAY_NEWS); - $html .= '<div class="text-center">' . '<ul class="pagination">'; - for ($i = 0; $i < $dis_rows; $i ++) { - if (isset($_REQUEST['page']) && $i == $_REQUEST['page']) { - $html .= '<li class="active">'; - } elseif (! isset($_REQUEST['page']) && $i == 0) { - $html .= '<li class="active">'; +/** + * @return string + */ +function user_meetings() +{ + $display_news = config('display_news'); + $html = '<div class="col-md-12"><h1>' . meetings_title() . '</h1>' . msg(); + + if (isset($_REQUEST['page']) && preg_match('/^\d{1,}$/', $_REQUEST['page'])) { + $page = $_REQUEST['page']; } else { - $html .= '<li>'; + $page = 0; } - $html .= '<a href="' . page_link_to("user_meetings") . '&page=' . $i . '">' . ($i + 1) . '</a></li>'; - } - $html .= '</ul></div></div>'; - - return $html; -} -function display_news($news) { - global $privileges, $page; - - $html = ''; - $html .= '<div class="panel' . ($news['Treffen'] == 1 ? ' panel-info' : ' panel-default') . '">'; - $html .= '<div class="panel-heading">'; - $html .= '<h3 class="panel-title">' . ($news['Treffen'] == 1 ? '[Meeting] ' : '') . ReplaceSmilies($news['Betreff']) . '</h3>'; - $html .= '</div>'; - $html .= '<div class="panel-body">' . ReplaceSmilies(nl2br($news['Text'])) . '</div>'; - - $html .= '<div class="panel-footer text-muted">'; - if (in_array("admin_news", $privileges)) { - $html .= '<div class="pull-right">' . button_glyph(page_link_to("admin_news") . '&action=edit&id=' . $news['ID'], 'edit', 'btn-xs') . '</div>'; - } - $html .= '<span class="glyphicon glyphicon-time"></span> ' . date("Y-m-d H:i", $news['Datum']) . ' '; - - $user_source = User($news['UID']); - - $html .= User_Nick_render($user_source); - if ($page != "news_comments") { - $html .= ' <a href="' . page_link_to("news_comments") . '&nid=' . $news['ID'] . '"><span class="glyphicon glyphicon-comment"></span> ' . _("Comments") . ' »</a> <span class="badge">' . sql_num_query("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($news['ID']) . "'") . '</span>'; - } - $html .= '</div>'; - $html .= '</div>'; - return $html; + $news = DB::select(sprintf(' + SELECT * + FROM `News` + WHERE `Treffen`=1 + ORDER BY `Datum`DESC + LIMIT %u, %u', + $page * $display_news, + $display_news + )); + foreach ($news as $entry) { + $html .= display_news($entry); + } + + $dis_rows = ceil(count(DB::select('SELECT `ID` FROM `News`')) / $display_news); + $html .= '<div class="text-center">' . '<ul class="pagination">'; + for ($i = 0; $i < $dis_rows; $i++) { + if (isset($_REQUEST['page']) && $i == $_REQUEST['page']) { + $html .= '<li class="active">'; + } elseif (!isset($_REQUEST['page']) && $i == 0) { + $html .= '<li class="active">'; + } else { + $html .= '<li>'; + } + $html .= '<a href="' . page_link_to('user_meetings') . '&page=' . $i . '">' . ($i + 1) . '</a></li>'; + } + $html .= '</ul></div></div>'; + + return $html; } -function user_news_comments() { - global $user; - - $html = '<div class="col-md-12"><h1>' . user_news_comments_title() . '</h1>'; - if (isset($_REQUEST["nid"]) && preg_match("/^[0-9]{1,}$/", $_REQUEST['nid']) && sql_num_query("SELECT * FROM `News` WHERE `ID`='" . sql_escape($_REQUEST['nid']) . "' LIMIT 1") > 0) { - $nid = $_REQUEST["nid"]; - list($news) = sql_select("SELECT * FROM `News` WHERE `ID`='" . sql_escape($nid) . "' LIMIT 1"); - if (isset($_REQUEST["text"])) { - $text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($_REQUEST['text'])); - sql_query("INSERT INTO `NewsComments` (`Refid`, `Datum`, `Text`, `UID`) VALUES ('" . sql_escape($nid) . "', '" . date("Y-m-d H:i:s") . "', '" . sql_escape($text) . "', '" . sql_escape($user["UID"]) . "')"); - engelsystem_log("Created news_comment: " . $text); - $html .= success(_("Entry saved."), true); +/** + * @param array $news + * @return string + */ +function display_news($news) +{ + global $privileges, $page; + + $html = ''; + $html .= '<div class="panel' . ($news['Treffen'] == 1 ? ' panel-info' : ' panel-default') . '">'; + $html .= '<div class="panel-heading">'; + $html .= '<h3 class="panel-title">' . ($news['Treffen'] == 1 ? '[Meeting] ' : '') . ReplaceSmilies($news['Betreff']) . '</h3>'; + $html .= '</div>'; + $html .= '<div class="panel-body">' . ReplaceSmilies(nl2br($news['Text'])) . '</div>'; + + $html .= '<div class="panel-footer text-muted">'; + if (in_array('admin_news', $privileges)) { + $html .= '<div class="pull-right">' + . button_glyph(page_link_to('admin_news') . '&action=edit&id=' . $news['ID'], 'edit', 'btn-xs') + . '</div>'; } - - $html .= display_news($news); - - $comments = sql_select("SELECT * FROM `NewsComments` WHERE `Refid`='" . sql_escape($nid) . "' ORDER BY 'ID'"); - foreach ($comments as $comment) { - $user_source = User($comment['UID']); - - $html .= '<div class="panel panel-default">'; - $html .= '<div class="panel-body">' . nl2br($comment['Text']) . '</div>'; - $html .= '<div class="panel-footer text-muted">'; - $html .= '<span class="glyphicon glyphicon-time"></span> ' . $comment['Datum'] . ' '; - $html .= User_Nick_render($user_source); - $html .= '</div>'; - $html .= '</div>'; + $html .= '<span class="glyphicon glyphicon-time"></span> ' . date('Y-m-d H:i', $news['Datum']) . ' '; + + $user_source = User($news['UID']); + + $html .= User_Nick_render($user_source); + if ($page != 'news_comments') { + $html .= ' <a href="' . page_link_to('news_comments') . '&nid=' . $news['ID'] . '">' + . '<span class="glyphicon glyphicon-comment"></span> ' + . _('Comments') . ' »</a> ' + . '<span class="badge">' + . count(DB::select('SELECT `ID` FROM `NewsComments` WHERE `Refid`=?', [$news['ID']])) + . '</span>'; } - - $html .= '<hr /><h2>' . _("New Comment:") . '</h2>'; - $html .= form([ - form_textarea('text', _("Message"), ''), - form_submit('submit', _("Save")) - ], page_link_to('news_comments') . '&nid=' . $news['ID']); - } else { - $html .= _("Invalid request."); - } - - return $html . '</div>'; + $html .= '</div>'; + $html .= '</div>'; + return $html; } -function user_news() { - global $DISPLAY_NEWS, $privileges, $user; - - $html = '<div class="col-md-12"><h1>' . news_title() . '</h1>' . msg(); - - if (isset($_POST["text"]) && isset($_POST["betreff"]) && in_array("admin_news", $privileges)) { - if (! isset($_POST["treffen"]) || ! in_array("admin_news", $privileges)) { - $_POST["treffen"] = 0; +/** + * @return string + */ +function user_news_comments() +{ + global $user; + + $html = '<div class="col-md-12"><h1>' . user_news_comments_title() . '</h1>'; + if ( + isset($_REQUEST['nid']) + && preg_match('/^\d{1,}$/', $_REQUEST['nid']) + && count(DB::select('SELECT `ID` FROM `News` WHERE `ID`=? LIMIT 1', [$_REQUEST['nid']])) > 0 + ) { + $nid = $_REQUEST['nid']; + $news = DB::select('SELECT * FROM `News` WHERE `ID`=? LIMIT 1', [$nid]); + $news = array_shift($news); + if (isset($_REQUEST['text'])) { + $text = preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui", '', strip_tags($_REQUEST['text'])); + DB::insert(' + INSERT INTO `NewsComments` (`Refid`, `Datum`, `Text`, `UID`) + VALUES (?, ?, ?, ?) + ', + [ + $nid, + date('Y-m-d H:i:s'), + $text, + $user["UID"], + ] + ); + engelsystem_log('Created news_comment: ' . $text); + $html .= success(_('Entry saved.'), true); + } + + $html .= display_news($news); + + $comments = DB::select( + 'SELECT * FROM `NewsComments` WHERE `Refid`=? ORDER BY \'ID\'', + [$nid] + ); + foreach ($comments as $comment) { + $user_source = User($comment['UID']); + + $html .= '<div class="panel panel-default">'; + $html .= '<div class="panel-body">' . nl2br($comment['Text']) . '</div>'; + $html .= '<div class="panel-footer text-muted">'; + $html .= '<span class="glyphicon glyphicon-time"></span> ' . $comment['Datum'] . ' '; + $html .= User_Nick_render($user_source); + $html .= '</div>'; + $html .= '</div>'; + } + + $html .= '<hr /><h2>' . _('New Comment:') . '</h2>'; + $html .= form([ + form_textarea('text', _('Message'), ''), + form_submit('submit', _('Save')) + ], page_link_to('news_comments') . '&nid=' . $news['ID']); + } else { + $html .= _('Invalid request.'); + } + + return $html . '</div>'; +} + +/** + * @return string + */ +function user_news() +{ + global $privileges, $user; + $display_news = config('display_news'); + + $html = '<div class="col-md-12"><h1>' . news_title() . '</h1>' . msg(); + + if (isset($_POST['text']) && isset($_POST['betreff']) && in_array('admin_news', $privileges)) { + if (!isset($_POST['treffen']) || !in_array('admin_news', $privileges)) { + $_POST['treffen'] = 0; + } + DB::insert(' + INSERT INTO `News` (`Datum`, `Betreff`, `Text`, `UID`, `Treffen`) + VALUES (?, ?, ?, ?, ?) + ', + [ + time(), + $_POST['betreff'], + $_POST['text'], + $user['UID'], + $_POST['treffen'], + ] + ); + engelsystem_log('Created news: ' . $_POST['betreff'] . ', treffen: ' . $_POST['treffen']); + success(_('Entry saved.')); + redirect(page_link_to('news')); } - sql_query("INSERT INTO `News` (`Datum`, `Betreff`, `Text`, `UID`, `Treffen`) " . "VALUES ('" . sql_escape(time()) . "', '" . sql_escape($_POST["betreff"]) . "', '" . sql_escape($_POST["text"]) . "', '" . sql_escape($user['UID']) . "', '" . sql_escape($_POST["treffen"]) . "');"); - engelsystem_log("Created news: " . $_POST["betreff"] . ", treffen: " . $_POST["treffen"]); - success(_("Entry saved.")); - redirect(page_link_to('news')); - } - - if (isset($_REQUEST['page']) && preg_match("/^[0-9]{1,}$/", $_REQUEST['page'])) { - $page = $_REQUEST['page']; - } else { - $page = 0; - } - - $news = sql_select("SELECT * FROM `News` ORDER BY `Datum` DESC LIMIT " . sql_escape($page * $DISPLAY_NEWS) . ", " . sql_escape($DISPLAY_NEWS)); - foreach ($news as $entry) { - $html .= display_news($entry); - } - - $dis_rows = ceil(sql_num_query("SELECT * FROM `News`") / $DISPLAY_NEWS); - $html .= '<div class="text-center">' . '<ul class="pagination">'; - for ($i = 0; $i < $dis_rows; $i ++) { - if (isset($_REQUEST['page']) && $i == $_REQUEST['page']) { - $html .= '<li class="active">'; - } elseif (! isset($_REQUEST['page']) && $i == 0) { - $html .= '<li class="active">'; + + if (isset($_REQUEST['page']) && preg_match('/^\d{1,}$/', $_REQUEST['page'])) { + $page = $_REQUEST['page']; } else { - $html .= '<li>'; + $page = 0; + } + + $news = DB::select(sprintf(' + SELECT * + FROM `News` + ORDER BY `Datum` + DESC LIMIT %u, %u + ', + $page * $display_news, + $display_news + )); + foreach ($news as $entry) { + $html .= display_news($entry); + } + + $dis_rows = ceil(count(DB::select('SELECT `ID` FROM `News`')) / $display_news); + $html .= '<div class="text-center">' . '<ul class="pagination">'; + for ($i = 0; $i < $dis_rows; $i++) { + if (isset($_REQUEST['page']) && $i == $_REQUEST['page']) { + $html .= '<li class="active">'; + } elseif (!isset($_REQUEST['page']) && $i == 0) { + $html .= '<li class="active">'; + } else { + $html .= '<li>'; + } + $html .= '<a href="' . page_link_to('news') . '&page=' . $i . '">' . ($i + 1) . '</a></li>'; + } + $html .= '</ul></div>'; + + if (in_array('admin_news', $privileges)) { + $html .= '<hr />'; + $html .= '<h2>' . _('Create news:') . '</h2>'; + + $html .= form([ + form_text('betreff', _('Subject'), ''), + form_textarea('text', _('Message'), ''), + form_checkbox('treffen', _('Meeting'), false, 1), + form_submit('submit', _('Save')) + ]); } - $html .= '<a href="' . page_link_to("news") . '&page=' . $i . '">' . ($i + 1) . '</a></li>'; - } - $html .= '</ul></div>'; - - if (in_array("admin_news", $privileges)) { - $html .= '<hr />'; - $html .= '<h2>' . _("Create news:") . '</h2>'; - - $html .= form([ - form_text('betreff', _("Subject"), ''), - form_textarea('text', _("Message"), ''), - form_checkbox('treffen', _("Meeting"), false, 1), - form_submit('submit', _("Save")) - ]); - } - return $html . '</div>'; + return $html . '</div>'; } -?> diff --git a/includes/pages/user_questions.php b/includes/pages/user_questions.php index 4abceb92..5cb60db3 100644 --- a/includes/pages/user_questions.php +++ b/includes/pages/user_questions.php @@ -1,57 +1,85 @@ <?php -function questions_title() { - return _("Ask the Heaven"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function questions_title() +{ + return _('Ask the Heaven'); } -function user_questions() { - global $user; - - if (! isset($_REQUEST['action'])) { - $open_questions = sql_select("SELECT * FROM `Questions` WHERE `AID` IS NULL AND `UID`='" . sql_escape($user['UID']) . "'"); - - $answered_questions = sql_select("SELECT * FROM `Questions` WHERE NOT `AID` IS NULL AND `UID`='" . sql_escape($user['UID']) . "'"); - foreach ($answered_questions as &$question) { - $answer_user_source = User($question['AID']); - $question['answer_user'] = User_Nick_render($answer_user_source); - } - - return Questions_view($open_questions, $answered_questions, page_link_to("user_questions") . '&action=ask'); - } else { - switch ($_REQUEST['action']) { - case 'ask': - $question = strip_request_item_nl('question'); - if ($question != "") { - $result = sql_query("INSERT INTO `Questions` SET `UID`='" . sql_escape($user['UID']) . "', `Question`='" . sql_escape($question) . "'"); - if ($result === false) { - engelsystem_error(_("Unable to save question.")); - } - success(_("You question was saved.")); - redirect(page_link_to("user_questions")); - } else { - return page_with_title(questions_title(), [ - error(_("Please enter a question!"), true) - ]); - } - break; - case 'delete': - if (isset($_REQUEST['id']) && preg_match("/^[0-9]{1,11}$/", $_REQUEST['id'])) { - $question_id = $_REQUEST['id']; - } else { - return error(_("Incomplete call, missing Question ID."), true); +/** + * @return string + */ +function user_questions() +{ + global $user; + + if (!isset($_REQUEST['action'])) { + $open_questions = DB::select( + 'SELECT * FROM `Questions` WHERE `AID` IS NULL AND `UID`=?', + [$user['UID']] + ); + + $answered_questions = DB::select( + 'SELECT * FROM `Questions` WHERE NOT `AID` IS NULL AND `UID`=?', + [$user['UID']] + ); + foreach ($answered_questions as &$question) { + $answer_user_source = User($question['AID']); + $question['answer_user'] = User_Nick_render($answer_user_source); } - - $question = sql_select("SELECT * FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - if (count($question) > 0 && $question[0]['UID'] == $user['UID']) { - sql_query("DELETE FROM `Questions` WHERE `QID`='" . sql_escape($question_id) . "' LIMIT 1"); - redirect(page_link_to("user_questions")); - } else { - return page_with_title(questions_title(), [ - error(_("No question found."), true) - ]); + + return Questions_view($open_questions, $answered_questions, page_link_to('user_questions') . '&action=ask'); + } else { + switch ($_REQUEST['action']) { + case 'ask': + $question = strip_request_item_nl('question'); + if ($question != '') { + $result = DB::insert(' + INSERT INTO `Questions` (`UID`, `Question`) + VALUES (?, ?) + ', + [$user['UID'], $question] + ); + if (!$result) { + engelsystem_error(_('Unable to save question.')); + } + success(_('You question was saved.')); + redirect(page_link_to('user_questions')); + } else { + return page_with_title(questions_title(), [ + error(_('Please enter a question!'), true) + ]); + } + break; + case 'delete': + if (isset($_REQUEST['id']) && preg_match('/^\d{1,11}$/', $_REQUEST['id'])) { + $question_id = $_REQUEST['id']; + } else { + return error(_('Incomplete call, missing Question ID.'), true); + } + + $question = DB::select( + 'SELECT `UID` FROM `Questions` WHERE `QID`=? LIMIT 1', + [$question_id] + ); + if (count($question) > 0 && $question[0]['UID'] == $user['UID']) { + DB::delete( + 'DELETE FROM `Questions` WHERE `QID`=? LIMIT 1', + [$question_id] + ); + redirect(page_link_to('user_questions')); + } else { + return page_with_title(questions_title(), [ + error(_('No question found.'), true) + ]); + } + break; } - break; } - } + + return ''; } -?>
\ No newline at end of file diff --git a/includes/pages/user_settings.php b/includes/pages/user_settings.php index e776320f..a2a486f4 100644 --- a/includes/pages/user_settings.php +++ b/includes/pages/user_settings.php @@ -1,194 +1,242 @@ <?php -function settings_title() { - return _("Settings"); +use Engelsystem\Database\DB; + +/** + * @return string + */ +function settings_title() +{ + return _('Settings'); } /** * Change user main attributes (name, dates, etc.) * - * @param User $user_source - * The user + * @param array $user_source The user + * @param bool $enable_tshirt_size + * @param array $tshirt_sizes + * @return array */ -function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes) { - $valid = true; - - if (isset($_REQUEST['mail'])) { - $result = User_validate_mail($_REQUEST['mail']); - $user_source['email'] = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("E-mail address is not correct.")); +function user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes) +{ + $valid = true; + + if (isset($_REQUEST['mail'])) { + $result = User_validate_mail($_REQUEST['mail']); + $user_source['email'] = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('E-mail address is not correct.')); + } + } else { + $valid = false; + error(_('Please enter your e-mail.')); } - } else { - $valid = false; - error(_("Please enter your e-mail.")); - } - - $user_source['email_shiftinfo'] = isset($_REQUEST['email_shiftinfo']); - $user_source['email_by_human_allowed'] = isset($_REQUEST['email_by_human_allowed']); - - if (isset($_REQUEST['jabber'])) { - $result = User_validate_jabber($_REQUEST['jabber']); - $user_source['jabber'] = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("Please check your jabber account information.")); + + $user_source['email_shiftinfo'] = isset($_REQUEST['email_shiftinfo']); + $user_source['email_by_human_allowed'] = isset($_REQUEST['email_by_human_allowed']); + + if (isset($_REQUEST['jabber'])) { + $result = User_validate_jabber($_REQUEST['jabber']); + $user_source['jabber'] = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('Please check your jabber account information.')); + } } - } - - if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']])) { - $user_source['Size'] = $_REQUEST['tshirt_size']; - } elseif ($enable_tshirt_size) { - $valid = false; - } - - if (isset($_REQUEST['planned_arrival_date'])) { - $tmp = parse_date("Y-m-d H:i", $_REQUEST['planned_arrival_date'] . " 00:00"); - $result = User_validate_planned_arrival_date($tmp); - $user_source['planned_arrival_date'] = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.")); + + if (isset($_REQUEST['tshirt_size']) && isset($tshirt_sizes[$_REQUEST['tshirt_size']])) { + $user_source['Size'] = $_REQUEST['tshirt_size']; + } elseif ($enable_tshirt_size) { + $valid = false; } - } - - if (isset($_REQUEST['planned_departure_date'])) { - $tmp = parse_date("Y-m-d H:i", $_REQUEST['planned_departure_date'] . " 00:00"); - $result = User_validate_planned_departure_date($user_source['planned_arrival_date'], $tmp); - $user_source['planned_departure_date'] = $result->getValue(); - if (! $result->isValid()) { - $valid = false; - error(_("Please enter your planned date of departure. It should be after your planned arrival date and after buildup start date and before teardown end date.")); + + if (isset($_REQUEST['planned_arrival_date'])) { + $tmp = parse_date('Y-m-d H:i', $_REQUEST['planned_arrival_date'] . ' 00:00'); + $result = User_validate_planned_arrival_date($tmp); + $user_source['planned_arrival_date'] = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('Please enter your planned date of arrival. It should be after the buildup start date and before teardown end date.')); + } } - } - - // Trivia - $user_source['Name'] = strip_request_item('lastname', $user_source['Name']); - $user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']); - $user_source['Alter'] = strip_request_item('age', $user_source['Alter']); - $user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']); - $user_source['DECT'] = strip_request_item('dect', $user_source['DECT']); - $user_source['Handy'] = strip_request_item('mobile', $user_source['Handy']); - $user_source['Hometown'] = strip_request_item('hometown', $user_source['Hometown']); - - if ($valid) { - User_update($user_source); - success(_("Settings saved.")); - redirect(page_link_to('user_settings')); - } - - return $user_source; + + if (isset($_REQUEST['planned_departure_date'])) { + $tmp = parse_date('Y-m-d H:i', $_REQUEST['planned_departure_date'] . ' 00:00'); + $result = User_validate_planned_departure_date($user_source['planned_arrival_date'], $tmp); + $user_source['planned_departure_date'] = $result->getValue(); + if (!$result->isValid()) { + $valid = false; + error(_('Please enter your planned date of departure. It should be after your planned arrival date and after buildup start date and before teardown end date.')); + } + } + + // Trivia + $user_source['Name'] = strip_request_item('lastname', $user_source['Name']); + $user_source['Vorname'] = strip_request_item('prename', $user_source['Vorname']); + $user_source['Alter'] = strip_request_item('age', $user_source['Alter']); + $user_source['Telefon'] = strip_request_item('tel', $user_source['Telefon']); + $user_source['DECT'] = strip_request_item('dect', $user_source['DECT']); + $user_source['Handy'] = strip_request_item('mobile', $user_source['Handy']); + $user_source['Hometown'] = strip_request_item('hometown', $user_source['Hometown']); + + if ($valid) { + User_update($user_source); + success(_('Settings saved.')); + redirect(page_link_to('user_settings')); + } + + return $user_source; } /** * Change user password. * - * @param User $user_source - * The user + * @param array $user_source The user */ -function user_settings_password($user_source) { - global $min_password_length; - if (! isset($_REQUEST['password']) || ! verify_password($_REQUEST['password'], $user_source['Passwort'], $user_source['UID'])) { - error(_("-> not OK. Please try again.")); - } elseif (strlen($_REQUEST['new_password']) < $min_password_length) { - error(_("Your password is to short (please use at least 6 characters).")); - } elseif ($_REQUEST['new_password'] != $_REQUEST['new_password2']) { - error(_("Your passwords don't match.")); - } elseif (set_password($user_source['UID'], $_REQUEST['new_password'])) { - success(_("Password saved.")); - } else { - error(_("Failed setting password.")); - } - redirect(page_link_to('user_settings')); +function user_settings_password($user_source) +{ + if ( + !isset($_REQUEST['password']) + || !verify_password($_REQUEST['password'], $user_source['Passwort'], $user_source['UID']) + ) { + error(_('-> not OK. Please try again.')); + } elseif (strlen($_REQUEST['new_password']) < config('min_password_length')) { + error(_('Your password is to short (please use at least 6 characters).')); + } elseif ($_REQUEST['new_password'] != $_REQUEST['new_password2']) { + error(_('Your passwords don\'t match.')); + } elseif (set_password($user_source['UID'], $_REQUEST['new_password'])) { + success(_('Password saved.')); + } else { + error(_('Failed setting password.')); + } + redirect(page_link_to('user_settings')); } /** * Change user theme * - * @param User $user_sources - * The user - * @param array<String> $themes - * List of available themes + * @param array $user_source The user + * @param array $themes List of available themes + * @return mixed */ -function user_settings_theme($user_source, $themes) { - $valid = true; - - if (isset($_REQUEST['theme']) && isset($themes[$_REQUEST['theme']])) { - $user_source['color'] = $_REQUEST['theme']; - } else { - $valid = false; - } - - if ($valid) { - sql_query("UPDATE `User` SET `color`='" . sql_escape($user_source['color']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'"); - - success(_("Theme changed.")); - redirect(page_link_to('user_settings')); - } - - return $user_source; +function user_settings_theme($user_source, $themes) +{ + $valid = true; + + if (isset($_REQUEST['theme']) && isset($themes[$_REQUEST['theme']])) { + $user_source['color'] = $_REQUEST['theme']; + } else { + $valid = false; + } + + if ($valid) { + DB::update(' + UPDATE `User` + SET `color`=? + WHERE `UID`=? + ', + [ + $user_source['color'], + $user_source['UID'], + ] + ); + + success(_('Theme changed.')); + redirect(page_link_to('user_settings')); + } + + return $user_source; } /** * Change use locale * - * @param User $user_source - * The user - * @param array<String> $locales - * List of available locales + * @param array $user_source The user + * @param array $locales List of available locales + * @return array */ -function user_settings_locale($user_source, $locales) { - $valid = true; - - if (isset($_REQUEST['language']) && isset($locales[$_REQUEST['language']])) { - $user_source['Sprache'] = $_REQUEST['language']; - } else { - $valid = false; - } - - if ($valid) { - sql_query("UPDATE `User` SET `Sprache`='" . sql_escape($user_source['Sprache']) . "' WHERE `UID`='" . sql_escape($user_source['UID']) . "'"); - $_SESSION['locale'] = $user_source['Sprache']; - - success("Language changed."); - redirect(page_link_to('user_settings')); - } - - return $user_source; +function user_settings_locale($user_source, $locales) +{ + $valid = true; + + if (isset($_REQUEST['language']) && isset($locales[$_REQUEST['language']])) { + $user_source['Sprache'] = $_REQUEST['language']; + } else { + $valid = false; + } + + if ($valid) { + DB::update(' + UPDATE `User` + SET `Sprache`=? + WHERE `UID`=? + ', + [ + $user_source['Sprache'], + $user_source['UID'], + ] + ); + $_SESSION['locale'] = $user_source['Sprache']; + + success('Language changed.'); + redirect(page_link_to('user_settings')); + } + + return $user_source; } /** * Main user settings page/controller + * + * @return string */ -function user_settings() { - global $enable_tshirt_size, $tshirt_sizes, $themes, $locales; - global $user; - - $buildup_start_date = null; - $teardown_end_date = null; - $event_config = EventConfig(); - if ($event_config != null) { - if (isset($event_config['buildup_start_date'])) { - $buildup_start_date = $event_config['buildup_start_date']; +function user_settings() +{ + global $themes, $user; + + $enable_tshirt_size = config('enable_tshirt_size'); + $tshirt_sizes = config('tshirt_sizes'); + $locales = config('locales'); + + $buildup_start_date = null; + $teardown_end_date = null; + $event_config = EventConfig(); + if ($event_config != null) { + if (isset($event_config['buildup_start_date'])) { + $buildup_start_date = $event_config['buildup_start_date']; + } + if (isset($event_config['teardown_end_date'])) { + $teardown_end_date = $event_config['teardown_end_date']; + } } - if (isset($event_config['teardown_end_date'])) { - $teardown_end_date = $event_config['teardown_end_date']; + + foreach ($tshirt_sizes as $key => $size) { + if (empty($size)) { + unset($tshirt_sizes[$key]); + } } - } - - $user_source = $user; - - if (isset($_REQUEST['submit'])) { - $user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes); - } elseif (isset($_REQUEST['submit_password'])) { - user_settings_password($user_source); - } elseif (isset($_REQUEST['submit_theme'])) { - $user_source = user_settings_theme($user_source, $themes); - } elseif (isset($_REQUEST['submit_language'])) { - $user_source = user_settings_locale($user_source, $locales); - } - - return User_settings_view($user_source, $locales, $themes, $buildup_start_date, $teardown_end_date, $enable_tshirt_size, $tshirt_sizes); + + $user_source = $user; + + if (isset($_REQUEST['submit'])) { + $user_source = user_settings_main($user_source, $enable_tshirt_size, $tshirt_sizes); + } elseif (isset($_REQUEST['submit_password'])) { + user_settings_password($user_source); + } elseif (isset($_REQUEST['submit_theme'])) { + $user_source = user_settings_theme($user_source, $themes); + } elseif (isset($_REQUEST['submit_language'])) { + $user_source = user_settings_locale($user_source, $locales); + } + + return User_settings_view( + $user_source, + $locales, + $themes, + $buildup_start_date, + $teardown_end_date, + $enable_tshirt_size, + $tshirt_sizes + ); } -?> diff --git a/includes/pages/user_shifts.php b/includes/pages/user_shifts.php index c990ee4a..55e49e4f 100644 --- a/includes/pages/user_shifts.php +++ b/includes/pages/user_shifts.php @@ -1,8 +1,14 @@ <?php + +use Engelsystem\Database\DB; use Engelsystem\ShiftsFilter; -function shifts_title() { - return _("Shifts"); +/** + * @return string + */ +function shifts_title() +{ + return _('Shifts'); } /** @@ -11,187 +17,257 @@ function shifts_title() { * Transform into shift controller and shift entry controller. * Split actions into shift edit, shift delete, shift entry edit, shift entry delete * Introduce simpler and beautiful actions for shift entry join/leave for users + * + * @return string */ -function user_shifts() { - global $user; - - if (User_is_freeloader($user)) { - redirect(page_link_to('user_myshifts')); - } - - // Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins - if (isset($_REQUEST['entry_id'])) { - return shift_entry_delete_controller(); - } elseif (isset($_REQUEST['edit_shift'])) { - return shift_edit_controller(); - } elseif (isset($_REQUEST['delete_shift'])) { - return shift_delete_controller(); - } elseif (isset($_REQUEST['shift_id'])) { - return shift_entry_add_controller(); - } - return view_user_shifts(); +function user_shifts() +{ + global $user; + + if (User_is_freeloader($user)) { + redirect(page_link_to('user_myshifts')); + } + + // Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins + if (isset($_REQUEST['entry_id'])) { + shift_entry_delete_controller(); + return ''; + } elseif (isset($_REQUEST['edit_shift'])) { + return shift_edit_controller(); + } elseif (isset($_REQUEST['delete_shift'])) { + return shift_delete_controller(); + } elseif (isset($_REQUEST['shift_id'])) { + return shift_entry_add_controller(); + } + return view_user_shifts(); } /** * Helper function that updates the start and end time from request data. * Use update_ShiftsFilter(). * - * @param ShiftsFilter $shiftsFilter - * The shiftfilter to update. + * @param ShiftsFilter $shiftsFilter The shiftfilter to update. + * @param string[] $days */ -function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days) { - $start_time = $shiftsFilter->getStartTime(); - if ($start_time == null) { - $start_time = time(); - } - - $end_time = $shiftsFilter->getEndTime(); - if ($end_time == null) { - $end_time = $start_time + 24 * 60 * 60; - } - - $shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time)); - $shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time)); - - if ($shiftsFilter->getStartTime() > $shiftsFilter->getEndTime()) { - $shiftsFilter->setEndTime($shiftsFilter->getStartTime() + 24 * 60 * 60); - } +function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days) +{ + $start_time = $shiftsFilter->getStartTime(); + if ($start_time == null) { + $start_time = time(); + } + + $end_time = $shiftsFilter->getEndTime(); + if ($end_time == null) { + $end_time = $start_time + 24 * 60 * 60; + } + + $shiftsFilter->setStartTime(check_request_datetime('start_day', 'start_time', $days, $start_time)); + $shiftsFilter->setEndTime(check_request_datetime('end_day', 'end_time', $days, $end_time)); + + 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 + * @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); - $shiftsFilter->setFilled(check_request_int_array('filled', $shiftsFilter->getFilled())); - $shiftsFilter->setRooms(check_request_int_array('rooms', $shiftsFilter->getRooms())); - $shiftsFilter->setTypes(check_request_int_array('types', $shiftsFilter->getTypes())); - update_ShiftsFilter_timerange($shiftsFilter, $days); +function update_ShiftsFilter(ShiftsFilter $shiftsFilter, $user_shifts_admin, $days) +{ + $shiftsFilter->setUserShiftsAdmin($user_shifts_admin); + $shiftsFilter->setFilled(check_request_int_array('filled', $shiftsFilter->getFilled())); + $shiftsFilter->setRooms(check_request_int_array('rooms', $shiftsFilter->getRooms())); + $shiftsFilter->setTypes(check_request_int_array('types', $shiftsFilter->getTypes())); + 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; +/** + * @return array + */ +function load_rooms() +{ + $rooms = DB::select( + 'SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`=\'Y\' ORDER BY `Name`' + ); + if (empty($rooms)) { + error(_('The administration has not configured any rooms yet.')); + redirect('?'); + } + return $rooms; } -function load_days() { - $days = sql_select_single_col(" +/** + * @return array + */ +function load_days() +{ + $days = DB::select(' 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; + ORDER BY `start` + '); + $days = array_map('array_shift', $days); + + if (empty($days)) { + 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; +/** + * @return array|false + */ +function load_types() +{ + global $user; + + if (!count(DB::select('SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0'))) { + error(_('The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype.')); + redirect('?'); + } + $types = DB::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`=? + ) + ORDER BY `AngelTypes`.`name` + ', + [ + $user['UID'], + ] + ); + if (empty($types)) { + return DB::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 = [ - $rooms[0]['id'] +/** + * @return string + */ +function view_user_shifts() +{ + global $user, $privileges, $ical_shifts; + + $ical_shifts = []; + $days = load_days(); + $rooms = load_rooms(); + $types = load_types(); + + if (!isset($_SESSION['ShiftsFilter'])) { + $room_ids = [ + $rooms[0]['id'] + ]; + $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']; + + $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); + + if ($user['api_key'] == '') { + User_reset_api_key($user, false); + } + + $filled = [ + [ + 'id' => '1', + 'name' => _('occupied') + ], + [ + 'id' => '0', + 'name' => _('free') + ] ]; - $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']; - - $shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter); - - if ($user['api_key'] == "") { - User_reset_api_key($user, false); - } - - $filled = [ - [ - 'id' => '1', - 'name' => _("occupied") - ], - [ - 'id' => '0', - 'name' => _("free") - ] - ]; - $start_day = date("Y-m-d", $shiftsFilter->getStartTime()); - $start_time = date("H:i", $shiftsFilter->getStartTime()); - $end_day = date("Y-m-d", $shiftsFilter->getEndTime()); - $end_time = date("H:i", $shiftsFilter->getEndTime()); - - return page([ - div('col-md-12', [ - msg(), - template_render(__DIR__ . '/../../templates/user_shifts.html', [ - 'title' => shifts_title(), - 'room_select' => make_select($rooms, $shiftsFilter->getRooms(), "rooms", _("Rooms")), - 'start_select' => html_select_key("start_day", "start_day", array_combine($days, $days), $start_day), - 'start_time' => $start_time, - 'end_select' => html_select_key("end_day", "end_day", array_combine($days, $days), $end_day), - 'end_time' => $end_time, - 'type_select' => make_select($types, $shiftsFilter->getTypes(), "types", _("Angeltypes") . '<sup>1</sup>'), - 'filled_select' => make_select($filled, $shiftsFilter->getFilled(), "filled", _("Occupancy")), - 'task_notice' => '<sup>1</sup>' . _("The tasks shown here are influenced by the angeltypes you joined already!") . " <a href=\"" . page_link_to('angeltypes') . '&action=about' . "\">" . _("Description of the jobs.") . "</a>", - 'shifts_table' => msg() . $shiftCalendarRenderer->render(), - 'ical_text' => '<h2>' . _("iCal export") . '</h2><p>' . sprintf(_("Export of shown shifts. <a href=\"%s\">iCal format</a> or <a href=\"%s\">JSON format</a> available (please keep secret, otherwise <a href=\"%s\">reset the api key</a>)."), 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') . '</p>', - 'filter' => _("Filter") - ]) - ]) - ]); + $start_day = date('Y-m-d', $shiftsFilter->getStartTime()); + $start_time = date('H:i', $shiftsFilter->getStartTime()); + $end_day = date('Y-m-d', $shiftsFilter->getEndTime()); + $end_time = date('H:i', $shiftsFilter->getEndTime()); + + return page([ + div('col-md-12', [ + msg(), + template_render(__DIR__ . '/../../templates/user_shifts.html', [ + 'title' => shifts_title(), + 'room_select' => make_select($rooms, $shiftsFilter->getRooms(), 'rooms', _('Rooms')), + 'start_select' => html_select_key('start_day', 'start_day', array_combine($days, $days), $start_day), + 'start_time' => $start_time, + 'end_select' => html_select_key('end_day', 'end_day', array_combine($days, $days), $end_day), + 'end_time' => $end_time, + 'type_select' => make_select( + $types, + $shiftsFilter->getTypes(), + 'types', + _('Angeltypes') . '<sup>1</sup>' + ), + 'filled_select' => make_select($filled, $shiftsFilter->getFilled(), 'filled', _('Occupancy')), + 'task_notice' => + '<sup>1</sup>' + . _('The tasks shown here are influenced by the angeltypes you joined already!') + . ' <a href="' . page_link_to('angeltypes') . '&action=about' . '">' + . _('Description of the jobs.') + . '</a>', + 'shifts_table' => msg() . $shiftCalendarRenderer->render(), + 'ical_text' => '<h2>' . _('iCal export') . '</h2><p>' . sprintf( + _('Export of shown shifts. <a href="%s">iCal format</a> or <a href="%s">JSON format</a> available (please keep secret, otherwise <a href="%s">reset the api key</a>).'), + 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' + ) . '</p>', + 'filter' => _('Filter') + ]) + ]) + ]); } -function get_ids_from_array($array) { - return $array["id"]; +/** + * @param array $array + * @return array + */ +function get_ids_from_array($array) +{ + return $array['id']; } -function make_select($items, $selected, $name, $title = null) { - $html_items = []; - if (isset($title)) { - $html_items[] = '<h4>' . $title . '</h4>' . "\n"; - } - - foreach ($items as $i) { - $html_items[] = '<div class="checkbox"><label><input type="checkbox" name="' . $name . '[]" value="' . $i['id'] . '"' . (in_array($i['id'], $selected) ? ' checked="checked"' : '') . '> ' . $i['name'] . '</label>' . (! isset($i['enabled']) || $i['enabled'] ? '' : glyph("lock")) . '</div><br />'; - } - $html = '<div id="selection_' . $name . '" class="selection ' . $name . '">' . "\n"; - $html .= implode("\n", $html_items); - $html .= buttons([ - button("javascript: checkAll('selection_" . $name . "', true)", _("All"), ""), - button("javascript: checkAll('selection_" . $name . "', false)", _("None"), "") - ]); - $html .= '</div>' . "\n"; - return $html; +function make_select($items, $selected, $name, $title = null) +{ + $html_items = []; + if (isset($title)) { + $html_items[] = '<h4>' . $title . '</h4>' . "\n"; + } + + foreach ($items as $i) { + $html_items[] = '<div class="checkbox">' + . '<label><input type="checkbox" name="' . $name . '[]" value="' . $i['id'] . '" ' + . (in_array($i['id'], $selected) ? ' checked="checked"' : '') + . ' > ' . $i['name'] . '</label>' + . (!isset($i['enabled']) || $i['enabled'] ? '' : glyph('lock')) + . '</div><br />'; + } + $html = '<div id="selection_' . $name . '" class="selection ' . $name . '">' . "\n"; + $html .= implode("\n", $html_items); + $html .= buttons([ + button('javascript: checkAll(\'selection_' . $name . '\', true)', _('All'), ''), + button('javascript: checkAll(\'selection_' . $name . '\', false)', _('None'), '') + ]); + $html .= '</div>' . "\n"; + return $html; } -?> diff --git a/includes/sys_auth.php b/includes/sys_auth.php index 7a1dd4b7..856ed4ab 100644 --- a/includes/sys_auth.php +++ b/includes/sys_auth.php @@ -1,91 +1,160 @@ <?php +use Engelsystem\Database\DB; + /** * Testet ob ein User eingeloggt ist und lädt die entsprechenden Privilegien */ -function load_auth() { - global $user, $privileges; - - $user = null; - if (isset($_SESSION['uid'])) { - $user = sql_select("SELECT * FROM `User` WHERE `UID`='" . sql_escape($_SESSION['uid']) . "' LIMIT 1"); - if (count($user) > 0) { - // User ist eingeloggt, Datensatz zur Verfügung stellen und Timestamp updaten - list($user) = $user; - sql_query("UPDATE `User` SET " . "`lastLogIn` = '" . time() . "'" . " WHERE `UID` = '" . sql_escape($_SESSION['uid']) . "' LIMIT 1;"); - $privileges = privileges_for_user($user['UID']); - return; +function load_auth() +{ + global $user, $privileges; + + $user = null; + if (isset($_SESSION['uid'])) { + $user = DB::select('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$_SESSION['uid']]); + if (count($user) > 0) { + // User ist eingeloggt, Datensatz zur Verfügung stellen und Timestamp updaten + $user = array_shift($user); + DB::update(' + UPDATE `User` + SET `lastLogIn` = ? + WHERE `UID` = ? + LIMIT 1 + ', [ + time(), + $_SESSION['uid'], + ]); + $privileges = privileges_for_user($user['UID']); + return; + } + unset($_SESSION['uid']); } - unset($_SESSION['uid']); - } - - // guest privileges - $privileges = privileges_for_group(- 1); + + // guest privileges + $privileges = privileges_for_group(-1); } /** * generate a salt (random string) of arbitrary length suitable for the use with crypt() + * + * @param int $length + * @return string */ -function generate_salt($length = 16) { - $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - $salt = ""; - for ($i = 0; $i < $length; $i ++) { - $salt .= $alphabet[rand(0, strlen($alphabet) - 1)]; - } - return $salt; +function generate_salt($length = 16) +{ + $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + $salt = ''; + for ($i = 0; $i < $length; $i++) { + $salt .= $alphabet[rand(0, strlen($alphabet) - 1)]; + } + return $salt; } /** * set the password of a user + * + * @param int $uid + * @param string $password + * @return bool */ -function set_password($uid, $password) { - global $crypt_alg; - $result = sql_query("UPDATE `User` SET `Passwort` = '" . sql_escape(crypt($password, $crypt_alg . '$' . generate_salt(16) . '$')) . "', `password_recovery_token`=NULL WHERE `UID` = " . intval($uid) . " LIMIT 1"); - if ($result === false) { - engelsystem_error('Unable to update password.'); - } - return $result; +function set_password($uid, $password) +{ + $result = DB::update(' + UPDATE `User` + SET `Passwort` = ?, + `password_recovery_token`=NULL + WHERE `UID` = ? + LIMIT 1 + ', + [ + crypt($password, config('crypt_alg') . '$' . generate_salt(16) . '$'), + $uid + ] + ); + if (DB::getStm()->errorCode() != '00000') { + engelsystem_error('Unable to update password.'); + } + return $result; } /** * verify a password given a precomputed salt. * if $uid is given and $salt is an old-style salt (plain md5), we convert it automatically + * + * @param string $password + * @param string $salt + * @param int $uid + * @return bool */ -function verify_password($password, $salt, $uid = false) { - global $crypt_alg; - $correct = false; - if (substr($salt, 0, 1) == '$') { // new-style crypt() - $correct = crypt($password, $salt) == $salt; - } elseif (substr($salt, 0, 7) == '{crypt}') { // old-style crypt() with DES and static salt - not used anymore - $correct = crypt($password, '77') == $salt; - } elseif (strlen($salt) == 32) { // old-style md5 without salt - not used anymore - $correct = md5($password) == $salt; - } +function verify_password($password, $salt, $uid = null) +{ + $crypt_alg = config('crypt_alg'); + $correct = false; + if (substr($salt, 0, 1) == '$') { // new-style crypt() + $correct = crypt($password, $salt) == $salt; + } elseif (substr($salt, 0, 7) == '{crypt}') { // old-style crypt() with DES and static salt - not used anymore + $correct = crypt($password, '77') == $salt; + } elseif (strlen($salt) == 32) { // old-style md5 without salt - not used anymore + $correct = md5($password) == $salt; + } - if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && $uid) { - // this password is stored in another format than we want it to be. - // let's update it! - // we duplicate the query from the above set_password() function to have the extra safety of checking the old hash - sql_query("UPDATE `User` SET `Passwort` = '" . sql_escape(crypt($password, $crypt_alg . '$' . generate_salt() . '$')) . "' WHERE `UID` = " . intval($uid) . " AND `Passwort` = '" . sql_escape($salt) . "' LIMIT 1"); - } - return $correct; + if ($correct && substr($salt, 0, strlen($crypt_alg)) != $crypt_alg && intval($uid)) { + // this password is stored in another format than we want it to be. + // let's update it! + // we duplicate the query from the above set_password() function to have the extra safety of checking the old hash + DB::update(' + UPDATE `User` + SET `Passwort` = ? + WHERE `UID` = ? + AND `Passwort` = ? + LIMIT 1 + ', + [ + crypt($password, $crypt_alg . '$' . generate_salt() . '$'), + $uid, + $salt, + ] + ); + } + return $correct; } -function privileges_for_user($user_id) { - $privileges = []; - $user_privs = sql_select("SELECT `Privileges`.`name` FROM `User` JOIN `UserGroups` ON (`User`.`UID` = `UserGroups`.`uid`) JOIN `GroupPrivileges` ON (`UserGroups`.`group_id` = `GroupPrivileges`.`group_id`) JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) WHERE `User`.`UID`='" . sql_escape($user_id) . "'"); - foreach ($user_privs as $user_priv) { - $privileges[] = $user_priv['name']; - } - return $privileges; +/** + * @param int $user_id + * @return array + */ +function privileges_for_user($user_id) +{ + $privileges = []; + $user_privileges = DB::select(' + SELECT `Privileges`.`name` + FROM `User` + JOIN `UserGroups` ON (`User`.`UID` = `UserGroups`.`uid`) + JOIN `GroupPrivileges` ON (`UserGroups`.`group_id` = `GroupPrivileges`.`group_id`) + JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) + WHERE `User`.`UID`=? + ', [$user_id]); + foreach ($user_privileges as $user_privilege) { + $privileges[] = $user_privilege['name']; + } + return $privileges; } -function privileges_for_group($group_id) { - $privileges = []; - $groups_privs = sql_select("SELECT * FROM `GroupPrivileges` JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) WHERE `group_id`='" . sql_escape($group_id) . "'"); - foreach ($groups_privs as $guest_priv) { - $privileges[] = $guest_priv['name']; - } - return $privileges; +/** + * @param int $group_id + * @return array + */ +function privileges_for_group($group_id) +{ + $privileges = []; + $groups_privileges = DB::select(' + SELECT `name` + FROM `GroupPrivileges` + JOIN `Privileges` ON (`GroupPrivileges`.`privilege_id` = `Privileges`.`id`) + WHERE `group_id`=? + ', [$group_id]); + foreach ($groups_privileges as $guest_privilege) { + $privileges[] = $guest_privilege['name']; + } + return $privileges; } -?> diff --git a/includes/sys_form.php b/includes/sys_form.php index 98ef2134..936e3203 100644 --- a/includes/sys_form.php +++ b/includes/sys_form.php @@ -4,21 +4,26 @@ /** * Renders a hidden input * - * @param string $name - * Name of the input - * @param string $value - * The value + * @param string $name Name of the input + * @param string $value The value * @return string rendered html */ -function form_hidden($name, $value) { - return '<input type="hidden" name="' . $name . '" value="' . $value . '" />'; +function form_hidden($name, $value) +{ + return '<input type="hidden" name="' . $name . '" value="' . $value . '" />'; } /** * Rendert ein Zahlenfeld mit Buttons zum verstellen + * + * @param string $name + * @param string $label + * @param string $value + * @return string */ -function form_spinner($name, $label, $value) { - return form_element($label, ' +function form_spinner($name, $label, $value) +{ + return form_element($label, ' <div class="input-group"> <input id="spinner-' . $name . '" class="form-control" type="text" name="' . $name . '" value="' . $value . '" /> <div class="input-group-btn"> @@ -31,11 +36,13 @@ function form_spinner($name, $label, $value) { </div> </div> <script type="text/javascript"> - $("#spinner-' . $name . '-down").click(function(e) { - $("#spinner-' . $name . '").val(parseInt($("#spinner-' . $name . '").val()) - 1); + $("#spinner-' . $name . '-down").click(function() { + var spinner = $("#spinner-' . $name . '"); + spinner.val(parseInt(spinner.val()) - 1); }); - $("#spinner-' . $name . '-up").click(function(e) { - $("#spinner-' . $name . '").val(parseInt($("#spinner-' . $name . '").val()) + 1); + $("#spinner-' . $name . '-up").click(function() { + var spinner = $("#spinner-' . $name . '"); + spinner.val(parseInt(spinner.val()) + 1); }); </script> '); @@ -44,22 +51,20 @@ function form_spinner($name, $label, $value) { /** * Render a bootstrap datepicker * - * @param string $name - * Name of the parameter - * @param string $label - * Label - * @param int $value - * Unix Timestamp - * @param int $min_date - * Earliest possible date - * @return HTML + * @param string $name Name of the parameter + * @param string $label Label + * @param int $value Unix Timestamp + * @param string $start_date Earliest possible date + * @param string $end_date + * @return string HTML */ -function form_date($name, $label, $value, $start_date = '', $end_date = '') { - $dom_id = $name . '-date'; - $value = is_numeric($value) ? date('Y-m-d', $value) : ''; - $start_date = is_numeric($start_date) ? date('Y-m-d', $start_date) : ''; - $end_date = is_numeric($end_date) ? date('Y-m-d', $end_date) : ''; - return form_element($label, ' +function form_date($name, $label, $value, $start_date = '', $end_date = '') +{ + $dom_id = $name . '-date'; + $value = is_numeric($value) ? date('Y-m-d', $value) : ''; + $start_date = is_numeric($start_date) ? date('Y-m-d', $start_date) : ''; + $end_date = is_numeric($end_date) ? date('Y-m-d', $end_date) : ''; + return form_element($label, ' <div class="input-group date" id="' . $dom_id . '"> <input type="text" name="' . $name . '" class="form-control" value="' . $value . '"><span class="input-group-addon">' . glyph('th') . '</span> </div> @@ -80,202 +85,332 @@ function form_date($name, $label, $value, $start_date = '', $end_date = '') { /** * Rendert eine Liste von Checkboxen für ein Formular * - * @param - * name Die Namen der Checkboxen werden aus name_key gebildet - * @param - * label Die Beschriftung der Liste - * @param - * items Array mit den einzelnen Checkboxen - * @param - * selected Array mit den Keys, die ausgewählt sind + * @param string $name Die Namen der Checkboxen werden aus name_key gebildet + * @param string $label Die Beschriftung der Liste + * @param array $items Array mit den einzelnen Checkboxen + * @param array $selected Array mit den Keys, die ausgewählt sind + * @return string */ -function form_checkboxes($name, $label, $items, $selected) { - $html = form_element($label, ''); - foreach ($items as $key => $item) { - $html .= form_checkbox($name . '_' . $key, $item, array_search($key, $selected) !== false); - } - return $html; +function form_checkboxes($name, $label, $items, $selected) +{ + $html = form_element($label, ''); + foreach ($items as $key => $item) { + $html .= form_checkbox($name . '_' . $key, $item, array_search($key, $selected) !== false); + } + return $html; } /** * Rendert eine Tabelle von Checkboxen für ein Formular * - * @param - * names Assoziatives Array mit Namen der Checkboxen als Keys und Überschriften als Values - * @param - * label Die Beschriftung der gesamten Tabelle - * @param - * items Array mit den Beschriftungen der Zeilen - * @param - * selected Mehrdimensionales Array, wobei $selected[foo] ein Array der in der Datenreihe foo markierten Checkboxen ist - * @param - * disabled Wie selected, nur dass die entsprechenden Checkboxen deaktiviert statt markiert sind + * @param string[] $names Assoziatives Array mit Namen der Checkboxen als Keys und Überschriften als Values + * @param string $label Die Beschriftung der gesamten Tabelle + * @param string[] $items Array mit den Beschriftungen der Zeilen + * @param array[] $selected Mehrdimensionales Array, wobei $selected[foo] ein Array der in der Datenreihe foo + * markierten Checkboxen ist + * @param array $disabled Wie selected, nur dass die entsprechenden Checkboxen deaktiviert statt markiert sind + * @return string */ -function form_multi_checkboxes($names, $label, $items, $selected, $disabled = []) { - $html = "<table><thead><tr>"; - foreach ($names as $title) { - $html .= "<th>$title</th>"; - } - $html .= "</tr></thead><tbody>"; - foreach ($items as $key => $item) { - $html .= "<tr>"; - foreach ($names as $name => $title) { - $dom_id = $name . '_' . $key; - $sel = array_search($key, $selected[$name]) !== false ? ' checked="checked"' : ""; - if (! empty($disabled) && ! empty($disabled[$name]) && array_search($key, $disabled[$name]) !== false) { - $sel .= ' disabled="disabled"'; - } - $html .= '<td style="text-align: center;"><input type="checkbox" id="' . $dom_id . '" name="' . $name . '[]" value="' . $key . '"' . $sel . ' /></td>'; +function form_multi_checkboxes($names, $label, $items, $selected, $disabled = []) +{ + $html = '<table><thead><tr>'; + foreach ($names as $title) { + $html .= '<th>' . $title . '</th>'; + } + $html .= '</tr></thead><tbody>'; + foreach ($items as $key => $item) { + $html .= '<tr>'; + $dom_id = ''; + foreach ($names as $name => $title) { + $dom_id = $name . '_' . $key; + $sel = array_search($key, $selected[$name]) !== false ? ' checked="checked"' : ''; + if (!empty($disabled) && !empty($disabled[$name]) && array_search($key, $disabled[$name]) !== false) { + $sel .= ' disabled="disabled"'; + } + $html .= '<td style="text-align: center;">' + . '<input type="checkbox" id="' . $dom_id . '" name="' . $name . '[]" value="' . $key . '" ' . $sel . ' />' + . '</td>'; + } + $html .= '<td><label for="' . $dom_id . '">' . $item . '</label></td></tr>'; } - $html .= '<td><label for="' . $dom_id . '">' . $item . '</label></td></tr>'; - } - $html .= "</tbody></table>"; - return form_element($label, $html); + $html .= '</tbody></table>'; + return form_element($label, $html); } /** * Rendert eine Checkbox + * + * @param string $name + * @param string $label + * @param string $selected + * @param string $value + * @return string */ -function form_checkbox($name, $label, $selected, $value = 'checked') { - return '<div class="checkbox"><label><input type="checkbox" id="' . $name . '" name="' . $name . '" value="' . $value . '"' . ($selected ? ' checked="checked"' : '') . ' /> ' . $label . '</label></div>'; +function form_checkbox($name, $label, $selected, $value = 'checked') +{ + return '<div class="checkbox"><label>' + . '<input type="checkbox" id="' . $name . '" name="' . $name . '" value="' . $value . '" ' + . ($selected ? ' checked="checked"' : '') . ' /> ' + . $label + . '</label></div>'; } /** * Rendert einen Radio + * + * @param string $name + * @param string $label + * @param string $selected + * @param string $value + * @return string */ -function form_radio($name, $label, $selected, $value) { - return '<div class="radio"><label><input type="radio" id="' . $name . '" name="' . $name . '" value="' . $value . '"' . ($selected ? ' checked="checked"' : '') . ' /> ' . $label . '</label></div>'; +function form_radio($name, $label, $selected, $value) +{ + return '<div class="radio">' + . '<label><input type="radio" id="' . $name . '" name="' . $name . '" value="' . $value . '" ' + . ($selected ? ' checked="checked"' : '') . ' /> ' + . $label + . '</label></div>'; } /** * Rendert einen Infotext in das Formular + * + * @param string $label + * @param string $text + * @return string */ -function form_info($label, $text = "") { - if ($label == "") { - return '<span class="help-block">' . glyph('info-sign') . $text . '</span>'; - } - if ($text == "") { - return '<h4>' . $label . '</h4>'; - } - return form_element($label, '<p class="form-control-static">' . $text . '</p>', ''); +function form_info($label, $text = '') +{ + if ($label == '') { + return '<span class="help-block">' . glyph('info-sign') . $text . '</span>'; + } + if ($text == '') { + return '<h4>' . $label . '</h4>'; + } + return form_element($label, '<p class="form-control-static">' . $text . '</p>', ''); } /** * Rendert den Absenden-Button eines Formulars + * + * @param string $name + * @param string $label + * @return string */ -function form_submit($name, $label) { - return form_element('<input class="btn btn-primary" type="submit" name="' . $name . '" value="' . $label . '" />', ""); +function form_submit($name, $label) +{ + return form_element( + '<input class="btn btn-primary" type="submit" name="' . $name . '" value="' . $label . '" />', + '' + ); } /** * Rendert ein Formular-Textfeld + * + * @param string $name + * @param string $label + * @param string $value + * @param bool $disabled + * @return string */ -function form_text($name, $label, $value, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element($label, '<input class="form-control" id="form_' . $name . '" type="text" name="' . $name . '" value="' . htmlspecialchars($value) . '" ' . $disabled . '/>', 'form_' . $name); +function form_text($name, $label, $value, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element( + $label, + '<input class="form-control" id="form_' . $name . '" type="text" name="' . $name + . '" value="' . htmlspecialchars($value) . '" ' . $disabled . '/>', + 'form_' . $name + ); } /** * Renders a text input with placeholder instead of label. * - * @param String $name - * Input name - * @param String $placeholder - * Placeholder - * @param String $value - * The value - * @param Boolean $disabled - * Is the field enabled? + * @param String $name Input name + * @param String $placeholder Placeholder + * @param String $value The value + * @param Boolean $disabled Is the field enabled? + * @return string */ -function form_text_placeholder($name, $placeholder, $value, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element('', '<input class="form-control" id="form_' . $name . '" type="text" name="' . $name . '" value="' . htmlspecialchars($value) . '" placeholder="' . $placeholder . '" ' . $disabled . '/>'); +function form_text_placeholder($name, $placeholder, $value, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element('', + '<input class="form-control" id="form_' . $name . '" type="text" name="' . $name + . '" value="' . htmlspecialchars($value) . '" placeholder="' . $placeholder + . '" ' . $disabled . '/>' + ); } /** * Rendert ein Formular-Emailfeld + * + * @param string $name + * @param string $label + * @param string $value + * @param bool $disabled + * @return string */ -function form_email($name, $label, $value, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element($label, '<input class="form-control" id="form_' . $name . '" type="email" name="' . $name . '" value="' . htmlspecialchars($value) . '" ' . $disabled . '/>', 'form_' . $name); +function form_email($name, $label, $value, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element( + $label, + '<input class="form-control" id="form_' . $name . '" type="email" name="' . $name . '" value="' + . htmlspecialchars($value) . '" ' . $disabled . '/>', + 'form_' . $name + ); } /** * Rendert ein Formular-Dateifeld + * + * @param string $name + * @param string $label + * @return string */ -function form_file($name, $label) { - return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name); +function form_file($name, $label) +{ + return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name); } /** * Rendert ein Formular-Passwortfeld + * + * @param string $name + * @param string $label + * @param bool $disabled + * @return string */ -function form_password($name, $label, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element($label, '<input class="form-control" id="form_' . $name . '" type="password" name="' . $name . '" value="" ' . $disabled . '/>', 'form_' . $name); +function form_password($name, $label, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element( + $label, + '<input class="form-control" id="form_' . $name . '" type="password" name="' . $name . '" value="" ' . $disabled . '/>', + 'form_' . $name + ); } /** * Renders a password input with placeholder instead of label. + * + * @param string $name + * @param string $placeholder + * @param bool $disabled + * @return string */ -function form_password_placeholder($name, $placeholder, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element('', '<input class="form-control" id="form_' . $name . '" type="password" name="' . $name . '" value="" placeholder="' . $placeholder . '" ' . $disabled . '/>', 'form_' . $name); +function form_password_placeholder($name, $placeholder, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element( + '', + '<input class="form-control" id="form_' . $name . '" type="password" name="' + . $name . '" value="" placeholder="' . $placeholder . '" ' . $disabled . '/>', + 'form_' . $name + ); } /** * Rendert ein Formular-Textfeld + * + * @param string $name + * @param string $label + * @param string $value + * @param bool $disabled + * @return string */ -function form_textarea($name, $label, $value, $disabled = false) { - $disabled = $disabled ? ' disabled="disabled"' : ''; - return form_element($label, '<textarea rows="5" class="form-control" id="form_' . $name . '" type="text" name="' . $name . '" ' . $disabled . '>' . $value . '</textarea>', 'form_' . $name); +function form_textarea($name, $label, $value, $disabled = false) +{ + $disabled = $disabled ? ' disabled="disabled"' : ''; + return form_element( + $label, + '<textarea rows="5" class="form-control" id="form_' . $name . '" type="text" name="' + . $name . '" ' . $disabled . '>' . $value . '</textarea>', + 'form_' . $name + ); } /** * Rendert ein Formular-Auswahlfeld + * + * @param string $name + * @param string $label + * @param string[] $values + * @param string $selected + * @return string */ -function form_select($name, $label, $values, $selected) { - return form_element($label, html_select_key('form_' . $name, $name, $values, $selected), 'form_' . $name); +function form_select($name, $label, $values, $selected) +{ + return form_element($label, html_select_key('form_' . $name, $name, $values, $selected), 'form_' . $name); } /** * Rendert ein Formular-Element + * + * @param string $label + * @param string $input + * @param string $for + * @return string */ -function form_element($label, $input, $for = "") { - if ($label == '') { - return '<div class="form-group">' . $input . '</div>'; - } - - return '<div class="form-group">' . '<label for="' . $for . '">' . $label . '</label>' . $input . '</div>'; +function form_element($label, $input, $for = '') +{ + if ($label == '') { + return '<div class="form-group">' . $input . '</div>'; + } + + return '<div class="form-group">' . '<label for="' . $for . '">' . $label . '</label>' . $input . '</div>'; } /** * Rendert ein Formular + * + * @param string[] $elements + * @param string $action + * @return string */ -function form($elements, $action = "") { - return '<form role="form" action="' . $action . '" enctype="multipart/form-data" method="post">' . join($elements) . '</form>'; +function form($elements, $action = '') +{ + return '<form role="form" action="' . $action . '" enctype="multipart/form-data" method="post">' . join($elements) . '</form>'; } -function html_options($name, $options, $selected = "") { - $html = ""; - foreach ($options as $value => $label) { - $html .= '<input type="radio"' . ($value == $selected ? ' checked="checked"' : '') . ' name="' . $name . '" value="' . $value . '"> ' . $label; - } - - return $html; +/** + * @param string $name + * @param String[] $options + * @param string $selected + * @return string + */ +function html_options($name, $options, $selected = '') +{ + $html = ''; + foreach ($options as $value => $label) { + $html .= '<input type="radio"' . ($value == $selected ? ' checked="checked"' : '') . ' name="' + . $name . '" value="' . $value . '"> ' . $label; + } + + return $html; } -function html_select_key($dom_id, $name, $rows, $selected) { - $html = '<select class="form-control" id="' . $dom_id . '" name="' . $name . '">'; - foreach ($rows as $key => $row) { - if (($key == $selected) || ($row == $selected)) { - $html .= '<option value="' . $key . '" selected="selected">' . $row . '</option>'; - } else { - $html .= '<option value="' . $key . '">' . $row . '</option>'; +/** + * @param string $dom_id + * @param string $name + * @param string[] $rows + * @param string $selected + * @return string + */ +function html_select_key($dom_id, $name, $rows, $selected) +{ + $html = '<select class="form-control" id="' . $dom_id . '" name="' . $name . '">'; + foreach ($rows as $key => $row) { + if (($key == $selected) || ($row == $selected)) { + $html .= '<option value="' . $key . '" selected="selected">' . $row . '</option>'; + } else { + $html .= '<option value="' . $key . '">' . $row . '</option>'; + } } - } - $html .= '</select>'; - return $html; + $html .= '</select>'; + return $html; } - -?>
\ No newline at end of file diff --git a/includes/sys_log.php b/includes/sys_log.php index 66c323c1..c4ef890e 100644 --- a/includes/sys_log.php +++ b/includes/sys_log.php @@ -4,36 +4,15 @@ * Write a log entry. * This should be used to log user's activity. * - * @param - * $message + * @param string $message */ -function engelsystem_log($message) { - global $user; - - $nick = "Guest"; - if (isset($user)) { - $nick = User_Nick_render($user); - } - LogEntry_create($nick, $message); -} +function engelsystem_log($message) +{ + global $user; -/** - * Generates a PHP Stacktrace. - */ -function debug_string_backtrace() { - ob_start(); - debug_print_backtrace(); - $trace = ob_get_contents(); - ob_end_clean(); - - // Remove first item from backtrace as it's this function which - // is redundant. - $trace = preg_replace('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1); - - // Renumber backtrace items. - // $trace = preg_replace('/^#(\d+)/me', '\'#\' . ($1 - 1)', $trace); - - return $trace; + $nick = "Guest"; + if (isset($user)) { + $nick = User_Nick_render($user); + } + LogEntry_create($nick, $message); } - -?>
\ No newline at end of file diff --git a/includes/sys_menu.php b/includes/sys_menu.php index cb90fb7b..0b7d6b37 100644 --- a/includes/sys_menu.php +++ b/includes/sys_menu.php @@ -1,185 +1,223 @@ <?php use Engelsystem\UserHintsRenderer; -function page_link_to($page = "") { - if ($page == "") { - return '?'; - } - return '?p=' . $page; +/** + * @param string $page + * @return string + */ +function page_link_to($page = '') +{ + if ($page == '') { + return '?'; + } + return '?p=' . $page; } -function page_link_to_absolute($page) { - return (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . preg_replace("/\?.*$/", '', $_SERVER['REQUEST_URI']) . page_link_to($page); +/** + * @param string $page + * @return string + */ +function page_link_to_absolute($page) +{ + return (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' + . $_SERVER['HTTP_HOST'] + . preg_replace("/\?.*$/", '', $_SERVER['REQUEST_URI']) + . page_link_to($page); } /** * Render the user hints + * + * @return string */ -function header_render_hints() { - global $user; - - $hints_renderer = new UserHintsRenderer(); - - if (isset($user)) { - $hints_renderer->addHint(admin_new_questions()); - $hints_renderer->addHint(user_angeltypes_unconfirmed_hint()); - $hints_renderer->addHint(render_user_departure_date_hint()); - $hints_renderer->addHint(user_driver_license_required_hint()); - - // Important hints: - $hints_renderer->addHint(render_user_freeloader_hint(), true); - $hints_renderer->addHint(render_user_arrived_hint(), true); - $hints_renderer->addHint(render_user_tshirt_hint(), true); - $hints_renderer->addHint(render_user_dect_hint(), true); - } - - return $hints_renderer->render(); +function header_render_hints() +{ + global $user; + + $hints_renderer = new UserHintsRenderer(); + + if (isset($user)) { + $hints_renderer->addHint(admin_new_questions()); + $hints_renderer->addHint(user_angeltypes_unconfirmed_hint()); + $hints_renderer->addHint(render_user_departure_date_hint()); + $hints_renderer->addHint(user_driver_license_required_hint()); + + // Important hints: + $hints_renderer->addHint(render_user_freeloader_hint(), true); + $hints_renderer->addHint(render_user_arrived_hint(), true); + $hints_renderer->addHint(render_user_tshirt_hint(), true); + $hints_renderer->addHint(render_user_dect_hint(), true); + } + + return $hints_renderer->render(); } /** * Renders the header toolbar containing search, login/logout, user and settings links. + * + * @return string */ -function header_toolbar() { - global $page, $privileges, $user; - - $toolbar_items = []; - - if (isset($user)) { - $toolbar_items[] = toolbar_item_link(page_link_to('shifts') . '&action=next', '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(), $page == 'register'); - } - - if (in_array('login', $privileges)) { - $toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $page == 'login'); - } - - if (isset($user) && in_array('user_messages', $privileges)) { - $toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages()); - } - - $toolbar_items[] = header_render_hints(); - if (in_array('user_myshifts', $privileges)) { - $toolbar_items[] = toolbar_item_link(page_link_to('users') . '&action=view', ' icon-icon_angel', $user['Nick'], $page == 'users'); - } - - $user_submenu = make_user_submenu(); - if (count($user_submenu) > 0) { - $toolbar_items[] = toolbar_dropdown('', '', $user_submenu); - } - - return toolbar($toolbar_items, true); +function header_toolbar() +{ + global $page, $privileges, $user; + + $toolbar_items = []; + + if (isset($user)) { + $toolbar_items[] = toolbar_item_link( + page_link_to('shifts') . '&action=next', + '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(), $page == 'register'); + } + + if (in_array('login', $privileges)) { + $toolbar_items[] = toolbar_item_link(page_link_to('login'), 'log-in', login_title(), $page == 'login'); + } + + if (isset($user) && in_array('user_messages', $privileges)) { + $toolbar_items[] = toolbar_item_link(page_link_to('user_messages'), 'envelope', user_unread_messages()); + } + + $toolbar_items[] = header_render_hints(); + if (in_array('user_myshifts', $privileges)) { + $toolbar_items[] = toolbar_item_link( + page_link_to('users') . '&action=view', + ' icon-icon_angel', + $user['Nick'], + $page == 'users' + ); + } + + $user_submenu = make_user_submenu(); + if (count($user_submenu) > 0) { + $toolbar_items[] = toolbar_dropdown('', '', $user_submenu); + } + + return toolbar($toolbar_items, true); } -function make_user_submenu() { - global $privileges, $page; - - $user_submenu = make_langselect(); - - if (in_array('user_settings', $privileges) || in_array('logout', $privileges)) { - $user_submenu[] = toolbar_item_divider(); - } - - if (in_array('user_settings', $privileges)) { - $user_submenu[] = toolbar_item_link(page_link_to('user_settings'), 'list-alt', settings_title(), $page == 'user_settings'); - } - - if (in_array('logout', $privileges)) { - $user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $page == 'logout'); - } - - return $user_submenu; +/** + * @return array + */ +function make_user_submenu() +{ + global $privileges, $page; + + $user_submenu = make_langselect(); + + if (in_array('user_settings', $privileges) || in_array('logout', $privileges)) { + $user_submenu[] = toolbar_item_divider(); + } + + if (in_array('user_settings', $privileges)) { + $user_submenu[] = toolbar_item_link( + page_link_to('user_settings'), + 'list-alt', + settings_title(), + $page == 'user_settings' + ); + } + + if (in_array('logout', $privileges)) { + $user_submenu[] = toolbar_item_link(page_link_to('logout'), 'log-out', logout_title(), $page == 'logout'); + } + + return $user_submenu; } -function make_navigation() { - global $page, $privileges; - - $menu = []; - $pages = [ - "news" => news_title(), - "user_meetings" => meetings_title(), - "user_shifts" => shifts_title(), - "angeltypes" => angeltypes_title(), - "user_questions" => questions_title() - ]; - - foreach ($pages as $menu_page => $title) { - if (in_array($menu_page, $privileges)) { - $menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); - } - } - - $menu = make_room_navigation($menu); - - $admin_menu = []; - $admin_pages = [ - "admin_arrive" => admin_arrive_title(), - "admin_active" => admin_active_title(), - "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_event_config" => event_config_title() - ]; - - foreach ($admin_pages as $menu_page => $title) { - if (in_array($menu_page, $privileges)) { - $admin_menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); - } - } - - if (count($admin_menu) > 0) { - $menu[] = toolbar_dropdown('', _("Admin"), $admin_menu); - } - - return toolbar($menu); +/** + * @return string + */ +function make_navigation() +{ + global $page, $privileges; + + $menu = []; + $pages = [ + 'news' => news_title(), + 'user_meetings' => meetings_title(), + 'user_shifts' => shifts_title(), + 'angeltypes' => angeltypes_title(), + 'user_questions' => questions_title() + ]; + + foreach ($pages as $menu_page => $title) { + if (in_array($menu_page, $privileges)) { + $menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); + } + } + + $menu = make_room_navigation($menu); + + $admin_menu = []; + $admin_pages = [ + 'admin_arrive' => admin_arrive_title(), + 'admin_active' => admin_active_title(), + '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_event_config' => event_config_title() + ]; + + foreach ($admin_pages as $menu_page => $title) { + if (in_array($menu_page, $privileges)) { + $admin_menu[] = toolbar_item_link(page_link_to($menu_page), '', $title, $menu_page == $page); + } + } + + if (count($admin_menu) > 0) { + $menu[] = toolbar_dropdown('', _('Admin'), $admin_menu); + } + + return toolbar($menu); } /** * Adds room navigation to the given menu. * - * @param string[] $menu - * Rendered menu + * @param string[] $menu Rendered menu + * @return string[] */ -function make_room_navigation($menu) { - global $privileges; - - if (! in_array('view_rooms', $privileges)) { +function make_room_navigation($menu) +{ + global $privileges; + + if (!in_array('view_rooms', $privileges)) { + return $menu; + } + + $rooms = Rooms(); + $room_menu = []; + if (in_array('admin_rooms', $privileges)) { + $room_menu[] = toolbar_item_link(page_link_to('admin_rooms'), 'list', _('Manage rooms')); + } + if (count($room_menu) > 0) { + $room_menu[] = toolbar_item_divider(); + } + foreach ($rooms as $room) { + $room_menu[] = toolbar_item_link(room_link($room), 'map-marker', $room['Name']); + } + if (count($room_menu) > 0) { + $menu[] = toolbar_dropdown('map-marker', _('Rooms'), $room_menu); + } return $menu; - } - - //get a list of all rooms - $rooms = Rooms(true); - - $room_menu = []; - if (in_array('admin_rooms', $privileges)) { - $room_menu[] = toolbar_item_link(page_link_to('admin_rooms'), 'list', _("Manage rooms")); - } - if (count($room_menu) > 0) { - $room_menu[] = toolbar_item_divider(); - } - foreach ($rooms as $room) { - if($room['show'] == 'Y' || // room is public - ($room['show'] != 'Y' && in_array('admin_rooms', $privileges)) // room is not public, but user can admin_rooms - ) { - $room_menu[] = toolbar_item_link(room_link($room), 'map-marker', $room['Name']); - } - } - if (count($room_menu > 0)) { - $menu[] = toolbar_dropdown('map-marker', _("Rooms"), $room_menu); - } - return $menu; } -function make_menu() { - return make_navigation(); +/** + * @return string + */ +function make_menu() +{ + return make_navigation(); } - -?> diff --git a/includes/sys_page.php b/includes/sys_page.php index 82ce9896..b2199988 100644 --- a/includes/sys_page.php +++ b/includes/sys_page.php @@ -8,184 +8,200 @@ use Engelsystem\ValidationResult; /** * Parse a date from da day and a time textfield. * - * @param string $date_name - * Name of the textfield containing the day (format Y-m-d) - * @param string $time_name - * Name of the textfield containing the time (format H:i) - * @param string[] $allowed_days - * List of allowed days in format Y-m-d - * @param int $default_value - * Default value unix timestamp + * @param string $date_name Name of the textfield containing the day (format Y-m-d) + * @param string $time_name Name of the textfield containing the time (format H:i) + * @param string[] $allowed_days List of allowed days in format Y-m-d + * @param int $default_value Default value unix timestamp + * @return int|null */ -function check_request_datetime($date_name, $time_name, $allowed_days, $default_value) { - $time = date("H:i", $default_value); - $day = date("Y-m-d", $default_value); - - if (isset($_REQUEST[$time_name]) && preg_match('#^\d{1,2}:\d\d$#', trim($_REQUEST[$time_name]))) { - $time = trim($_REQUEST[$time_name]); - } - if (isset($_REQUEST[$date_name]) && in_array($_REQUEST[$date_name], $allowed_days)) { - $day = $_REQUEST[$date_name]; - } - - return parse_date("Y-m-d H:i", $day . " " . $time); +function check_request_datetime($date_name, $time_name, $allowed_days, $default_value) +{ + $time = date('H:i', $default_value); + $day = date('Y-m-d', $default_value); + + if (isset($_REQUEST[$time_name]) && preg_match('#^\d{1,2}:\d\d$#', trim($_REQUEST[$time_name]))) { + $time = trim($_REQUEST[$time_name]); + } + if (isset($_REQUEST[$date_name]) && in_array($_REQUEST[$date_name], $allowed_days)) { + $day = $_REQUEST[$date_name]; + } + + return parse_date('Y-m-d H:i', $day . ' ' . $time); } /** * Parse a date into unix timestamp * - * @param string $pattern - * The date pattern (i.e. Y-m-d H:i) - * @param string $value - * The string to parse - * @return The parsed unix timestamp + * @param string $pattern The date pattern (i.e. Y-m-d H:i) + * @param string $value The string to parse + * @return int|null The parsed unix timestamp */ -function parse_date($pattern, $value) { - $datetime = DateTime::createFromFormat($pattern, trim($value)); - if ($datetime == null) { - return null; - } - return $datetime->getTimestamp(); +function parse_date($pattern, $value) +{ + $datetime = DateTime::createFromFormat($pattern, trim($value)); + if ($datetime == null) { + return null; + } + return $datetime->getTimestamp(); } /** * Leitet den Browser an die übergebene URL weiter und hält das Script an. + * + * @param string $url */ -function redirect($url) { - header("Location: " . $url, true, 302); - raw_output(""); +function redirect($url) +{ + header('Location: ' . $url, true, 302); + raw_output(''); } /** * Echoes given output and dies. * - * @param String $output - * String to display + * @param String $output String to display */ -function raw_output($output) { - echo $output; - die(); +function raw_output($output = '') +{ + echo $output; + die(); } /** * Helper function for transforming list of entities into array for select boxes. * - * @param array $data - * The data array - * @param string $key_name - * name of the column to use as id/key - * @param string $value_name - * name of the column to use as displayed value + * @param array $data The data array + * @param string $key_name name of the column to use as id/key + * @param string $value_name name of the column to use as displayed value + * + * @return array */ -function select_array($data, $key_name, $value_name) { - $ret = []; - foreach ($data as $value) { - $ret[$value[$key_name]] = $value[$value_name]; - } - return $ret; +function select_array($data, $key_name, $value_name) +{ + $return = []; + foreach ($data as $value) { + $return[$value[$key_name]] = $value[$value_name]; + } + return $return; } /** * Returns an int[] from given request param name. * - * @param String $name - * Name of the request param - * @param array<int> $default - * Default return value, if param is not set + * @param string $name Name of the request param + * @param array $default Default return value, if param is not set + * @return array */ -function check_request_int_array($name, $default = []) { - if (isset($_REQUEST[$name]) && is_array($_REQUEST[$name])) { - return array_filter($_REQUEST[$name], 'is_numeric'); - } - return $default; +function check_request_int_array($name, $default = []) +{ + if (isset($_REQUEST[$name]) && is_array($_REQUEST[$name])) { + return array_filter($_REQUEST[$name], 'is_numeric'); + } + return $default; } /** * Checks if given request item (name) can be parsed to a date. * If not parsable, given error message is put into msg() and null is returned. * - * @param string $input - * String to be parsed into a date. - * @param string $error_message - * the error message displayed if $input is not parsable - * @param boolean $null_allowed - * is a null value allowed? + * @param string $name to be parsed into a date. + * @param string $error_message the error message displayed if $input is not parsable + * @param boolean $null_allowed is a null value allowed? * @return ValidationResult containing the parsed date */ -function check_request_date($name, $error_message = null, $null_allowed = false) { - if (! isset($_REQUEST[$name])) { - return new ValidationResult($null_allowed, null); - } - return check_date($_REQUEST[$name], $error_message, $null_allowed); +function check_request_date($name, $error_message = null, $null_allowed = false) +{ + if (!isset($_REQUEST[$name])) { + return new ValidationResult($null_allowed, null); + } + return check_date($_REQUEST[$name], $error_message, $null_allowed); } /** * Checks if given string can be parsed to a date. * If not parsable, given error message is put into msg() and null is returned. * - * @param string $input - * String to be parsed into a date. - * @param string $error_message - * the error message displayed if $input is not parsable - * @param boolean $null_allowed - * is a null value allowed? + * @param string $input String to be parsed into a date. + * @param string $error_message the error message displayed if $input is not parsable + * @param boolean $null_allowed is a null value allowed? * @return ValidationResult containing the parsed date */ -function check_date($input, $error_message = null, $null_allowed = false) { - if ($tmp = parse_date("Y-m-d H:i", trim($input) . " 00:00")) { - return new ValidationResult(true, $tmp); - } - if ($null_allowed) { - return new ValidationResult(true, null); - } - - error($error_message); - return new ValidationResult(false, null); +function check_date($input, $error_message = null, $null_allowed = false) +{ + if ($tmp = parse_date('Y-m-d H:i', trim($input) . ' 00:00')) { + return new ValidationResult(true, $tmp); + } + if ($null_allowed) { + return new ValidationResult(true, null); + } + + error($error_message); + return new ValidationResult(false, null); } /** * Returns REQUEST value filtered or default value (null) if not set. + * + * @param string $name + * @param string $default_value + * @return mixed|null */ -function strip_request_item($name, $default_value = null) { - if (isset($_REQUEST[$name])) { - return strip_item($_REQUEST[$name]); - } - return $default_value; +function strip_request_item($name, $default_value = null) +{ + if (isset($_REQUEST[$name])) { + return strip_item($_REQUEST[$name]); + } + return $default_value; } /** * Testet, ob der angegebene REQUEST Wert ein Integer ist, bzw. * eine ID sein könnte. + * + * @param string $name + * @return int|false */ -function test_request_int($name) { - if (isset($_REQUEST[$name])) { - return preg_match("/^[0-9]*$/", $_REQUEST[$name]); - } - return false; +function test_request_int($name) +{ + if (isset($_REQUEST[$name])) { + return preg_match('/^\d*$/', $_REQUEST[$name]); + } + return false; } /** * Gibt den gefilterten REQUEST Wert mit Zeilenumbrüchen zurück + * + * @param string $name + * @param mixed $default_value + * @return mixed */ -function strip_request_item_nl($name, $default_value = null) { - if (isset($_REQUEST[$name])) { - return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+\n]{1,})/ui", '', strip_tags($_REQUEST[$name])); - } - return $default_value; +function strip_request_item_nl($name, $default_value = null) +{ + if (isset($_REQUEST[$name])) { + return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+\n]{1,})/ui", '', strip_tags($_REQUEST[$name])); + } + return $default_value; } /** * Entfernt unerwünschte Zeichen + * + * @param string $item + * @return string */ -function strip_item($item) { - return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+]{1,})/ui", '', strip_tags($item)); +function strip_item($item) +{ + return preg_replace("/([^\p{L}\p{S}\p{P}\p{Z}\p{N}+]{1,})/ui", '', strip_tags($item)); } /** * Überprüft eine E-Mail-Adresse. + * + * @param string $email + * @return bool */ -function check_email($email) { - return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); +function check_email($email) +{ + return (bool)filter_var($email, FILTER_VALIDATE_EMAIL); } - -?> diff --git a/includes/sys_template.php b/includes/sys_template.php index 3679328b..7aa458b8 100644 --- a/includes/sys_template.php +++ b/includes/sys_template.php @@ -4,116 +4,192 @@ * Liste der verfügbaren Themes */ $themes = [ - '4' => "Engelsystem 33c3 (2016)", - '3' => "Engelsystem 32c3 (2015)", - "2" => "Engelsystem cccamp15", - "0" => "Engelsystem light", - "1" => "Engelsystem dark" + '4' => 'Engelsystem 33c3 (2016)', + '3' => 'Engelsystem 32c3 (2015)', + '2' => 'Engelsystem cccamp15', + '0' => 'Engelsystem light', + '1' => 'Engelsystem dark' ]; /** * Display muted (grey) text. * - * @param string $text + * @param string $text + * @return string */ -function mute($text) { - return '<span class="text-muted">' . $text . '</span>'; +function mute($text) +{ + return '<span class="text-muted">' . $text . '</span>'; } /** * Renders a bootstrap label with given content and class. * - * @param string $content - * The text - * @param string $class - * default, primary, info, success, warning, danger + * @param string $content The text + * @param string $class default, primary, info, success, warning, danger + * @return string */ -function label($content, $class = 'default') { - return '<span class="label label-' . $class . '">' . $content . '</span>'; +function label($content, $class = 'default') +{ + return '<span class="label label-' . $class . '">' . $content . '</span>'; } -function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') { - return '<div class="progress"><div class="progress-bar ' . $class . '" role="progressbar" aria-valuenow="' . $valuenow . '" aria-valuemin="' . $valuemin . '" aria-valuemax="' . $valuemax . '" style="width: ' . floor(($valuenow - $valuemin) * 100 / ($valuemax - $valuemin)) . '%">' . $content . '</div></div>'; +/** + * @param int $valuemin + * @param int $valuemax + * @param int $valuenow + * @param string $class + * @param string $content + * @return string + */ +function progress_bar($valuemin, $valuemax, $valuenow, $class = '', $content = '') +{ + return '<div class="progress">' + . '<div class="progress-bar ' . $class . '" role="progressbar" ' + . 'aria-valuenow="' . $valuenow . '" aria-valuemin="' . $valuemin . '" aria-valuemax="' . $valuemax . '" ' + . 'style="width: ' . floor(($valuenow - $valuemin) * 100 / ($valuemax - $valuemin)) . '%"' + . '>' + . $content . '' + . '</div>' + . '</div>'; } /** * Render glyphicon * - * @param string $glyph_name + * @param string $glyph_name + * @return string */ -function glyph($glyph_name) { - return ' <span class="glyphicon glyphicon-' . $glyph_name . '"></span> '; +function glyph($glyph_name) +{ + return ' <span class="glyphicon glyphicon-' . $glyph_name . '"></span> '; } /** * Renders a tick or a cross by given boolean * - * @param boolean $boolean + * @param boolean $boolean + * @return string */ -function glyph_bool($boolean) { - return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">' . glyph($boolean ? 'ok' : 'remove') . '</span>'; +function glyph_bool($boolean) +{ + return '<span class="text-' . ($boolean ? 'success' : 'danger') . '">' . glyph($boolean ? 'ok' : 'remove') . '</span>'; } -function div($class, $content = [], $dom_id = "") { - if (is_array($content)) { - $content = join("\n", $content); - } - $dom_id = $dom_id != '' ? ' id="' . $dom_id . '"' : ''; - return '<div' . $dom_id . ' class="' . $class . '">' . $content . '</div>'; +/** + * @param string $class + * @param array $content + * @param string $dom_id + * @return string + */ +function div($class, $content = [], $dom_id = '') +{ + if (is_array($content)) { + $content = join("\n", $content); + } + $dom_id = $dom_id != '' ? ' id="' . $dom_id . '"' : ''; + return '<div' . $dom_id . ' class="' . $class . '">' . $content . '</div>'; } -function heading($content, $number = 1) { - return "<h" . $number . ">" . $content . "</h" . $number . ">"; +/** + * @param string $content + * @param int $number + * @return string + */ +function heading($content, $number = 1) +{ + return '<h' . $number . '>' . $content . '</h' . $number . '>'; } /** * Render a toolbar. * - * @param array $items + * @param array $items + * @param bool $right * @return string */ -function toolbar($items = [], $right = false) { - return '<ul class="nav navbar-nav' . ($right ? ' navbar-right' : '') . '">' . join("\n", $items) . '</ul>'; +function toolbar($items = [], $right = false) +{ + return '<ul class="nav navbar-nav' . ($right ? ' navbar-right' : '') . '">' . join("\n", $items) . '</ul>'; } -function toolbar_pills($items) { - return '<ul class="nav nav-pills">' . join("\n", $items) . '</ul>'; +/** + * @param string[] $items + * @return string + */ +function toolbar_pills($items) +{ + return '<ul class="nav nav-pills">' . join("\n", $items) . '</ul>'; } /** * Render a link for a toolbar. * - * @param string $href - * @param string $glyphicon - * @param string $label - * @param bool $selected + * @param string $href + * @param string $glyphicon + * @param string $label + * @param bool $selected * @return string */ -function toolbar_item_link($href, $glyphicon, $label, $selected = false) { - return '<li class="' . ($selected ? 'active' : '') . '"><a href="' . $href . '">' . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') . $label . '</a></li>'; +function toolbar_item_link($href, $glyphicon, $label, $selected = false) +{ + return '<li class="' . ($selected ? 'active' : '') . '">' + . '<a href="' . $href . '">' + . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') + . $label + . '</a>' + . '</li>'; } -function toolbar_item_divider() { - return '<li class="divider"></li>'; +/** + * @return string + */ +function toolbar_item_divider() +{ + return '<li class="divider"></li>'; } -function toolbar_dropdown($glyphicon, $label, $submenu, $class = '') { - return '<li class="dropdown ' . $class . '"> - <a href="#" class="dropdown-toggle" data-toggle="dropdown">' . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') . $label . ' <span class="caret"></span></a> - <ul class="dropdown-menu" role="menu">' . join("\n", $submenu) . '</ul></li>'; +/** + * @param string $glyphicon + * @param string $label + * @param array $submenu + * @param string $class + * @return string + */ +function toolbar_dropdown($glyphicon, $label, $submenu, $class = '') +{ + return '<li class="dropdown ' . $class . '"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">' + . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') + . $label + . ' <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu">' + . join("\n", $submenu) + . '</ul></li>'; } -function toolbar_popover($glyphicon, $label, $content, $class = '') { - $dom_id = md5(microtime() . $glyphicon . $label); - return '<li class="dropdown messages ' . $class . '"> - <a id="' . $dom_id . '" href="#" tabindex="0">' . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') . $label . ' <span class="caret"></span></a> +/** + * @param string $glyphicon + * @param string $label + * @param string[] $content + * @param string $class + * @return string + */ +function toolbar_popover($glyphicon, $label, $content, $class = '') +{ + $dom_id = md5(microtime() . $glyphicon . $label); + return '<li class="dropdown messages ' . $class . '"> + <a id="' . $dom_id . '" href="#" tabindex="0">' + . ($glyphicon != '' ? '<span class="glyphicon glyphicon-' . $glyphicon . '"></span> ' : '') + . $label + . ' <span class="caret"></span></a> <script type="text/javascript"> $(function(){ $("#' . $dom_id . '").popover({ - trigger: "focus", - html: true, - content: "' . addslashes(join('', $content)) . '", - placement: "bottom", + trigger: "focus", + html: true, + content: "' . addslashes(join('', $content)) . '", + placement: "bottom", container: "#navbar-collapse-1" }) }); @@ -124,155 +200,222 @@ function toolbar_popover($glyphicon, $label, $content, $class = '') { /** * Generiert HTML Code für eine "Seite". * Fügt dazu die übergebenen Elemente zusammen. + * + * @param string[] $elements + * @return string */ -function page($elements) { - return join($elements); +function page($elements) +{ + return join($elements); } /** * Generiert HTML Code für eine "Seite" mit zentraler Überschrift * Fügt dazu die übergebenen Elemente zusammen. + * + * @param string $title + * @param string[] $elements + * @return string */ -function page_with_title($title, $elements) { - return '<div class="col-md-12"><h1>' . $title . '</h1>' . join($elements) . '</div>'; +function page_with_title($title, $elements) +{ + return '<div class="col-md-12"><h1>' . $title . '</h1>' . join($elements) . '</div>'; } /** * Rendert eine Datentabelle + * + * @param array|string $columns + * @param array[] $rows_raw + * @param bool $data + * @return string */ -function table($columns, $rows_raw, $data = true) { - // If only one column is given - if (! is_array($columns)) { - $rows = []; - foreach ($rows_raw as $row) { - $rows[] = [ - 'col' => $row - ]; +function table($columns, $rows_raw, $data = true) +{ + // If only one column is given + if (!is_array($columns)) { + $rows = []; + foreach ($rows_raw as $row) { + $rows[] = [ + 'col' => $row + ]; + } + return render_table([ + 'col' => $columns + ], $rows, $data); } - return render_table([ - 'col' => $columns - ], $rows, $data); - } - - return render_table($columns, $rows_raw, $data); + + return render_table($columns, $rows_raw, $data); } /** * Helper for rendering a html-table. * use table() + * + * @param string[] $columns + * @param array[] $rows + * @param bool $data + * @return string */ -function render_table($columns, $rows, $data = true) { - if (count($rows) == 0) { - return info(_("No data found."), true); - } - - $html = '<table class="table table-striped' . ($data ? ' data' : '') . '">'; - $html .= '<thead><tr>'; - foreach ($columns as $key => $column) { - $html .= '<th class="column_' . $key . '">' . $column . '</th>'; - } - $html .= '</tr></thead>'; - $html .= '<tbody>'; - foreach ($rows as $row) { - $html .= '<tr>'; +function render_table($columns, $rows, $data = true) +{ + if (count($rows) == 0) { + return info(_('No data found.'), true); + } + + $html = '<table class="table table-striped' . ($data ? ' data' : '') . '">'; + $html .= '<thead><tr>'; foreach ($columns as $key => $column) { - $value = " "; - if (isset($row[$key])) { - $value = $row[$key]; - } - $html .= '<td class="column_' . $key . '">' . $value . '</td>'; + $html .= '<th class="column_' . $key . '">' . $column . '</th>'; } - $html .= '</tr>'; - } - $html .= '</tbody>'; - $html .= '</table>'; - return $html; + $html .= '</tr></thead>'; + $html .= '<tbody>'; + foreach ($rows as $row) { + $html .= '<tr>'; + foreach ($columns as $key => $column) { + $value = " "; + if (isset($row[$key])) { + $value = $row[$key]; + } + $html .= '<td class="column_' . $key . '">' . $value . '</td>'; + } + $html .= '</tr>'; + } + $html .= '</tbody>'; + $html .= '</table>'; + return $html; } /** * Rendert einen Knopf + * + * @param string $href + * @param string $label + * @param string $class + * @return string */ -function button($href, $label, $class = "") { - return '<a href="' . $href . '" class="btn btn-default ' . $class . '">' . $label . '</a>'; +function button($href, $label, $class = '') +{ + return '<a href="' . $href . '" class="btn btn-default ' . $class . '">' . $label . '</a>'; } /** * Rendert einen Knopf mit Glyph + * + * @param string $href + * @param string $glyph + * @param string $class + * @return string */ -function button_glyph($href, $glyph, $class = "") { - return button($href, glyph($glyph), $class); +function button_glyph($href, $glyph, $class = '') +{ + return button($href, glyph($glyph), $class); } /** * Rendert eine Toolbar mit Knöpfen + * + * @param array $buttons + * @return string */ -function buttons($buttons = []) { - return '<div class="form-group">' . table_buttons($buttons) . '</div>'; +function buttons($buttons = []) +{ + return '<div class="form-group">' . table_buttons($buttons) . '</div>'; } -function table_buttons($buttons = []) { - return '<div class="btn-group">' . join(' ', $buttons) . '</div>'; +/** + * @param array $buttons + * @return string + */ +function table_buttons($buttons = []) +{ + return '<div class="btn-group">' . join(' ', $buttons) . '</div>'; } -// Load and render template -function template_render($file, $data) { - if (file_exists($file)) { - $template = file_get_contents($file); - if (is_array($data)) { - foreach ($data as $name => $content) { - $template = str_replace("%" . $name . "%", $content, $template); - } +/** + * Load and render template + * + * @param string $file + * @param string $data + * @return string + */ +function template_render($file, $data) +{ + if (file_exists($file)) { + $template = file_get_contents($file); + if (is_array($data)) { + foreach ($data as $name => $content) { + $template = str_replace('%' . $name . '%', $content, $template); + } + } + return $template; } - return $template; - } - engelsystem_error("Cannot find template file «" . $file . "»."); + engelsystem_error('Cannot find template file «' . $file . '».'); + return ''; } -function shorten($str, $length = 50) { - if (strlen($str) < $length) { - return $str; - } - return '<span title="' . htmlentities($str, ENT_COMPAT, 'UTF-8') . '">' . substr($str, 0, $length - 3) . '...</span>'; +/** + * @param string $str + * @param int $length + * @return string + */ +function shorten($str, $length = 50) +{ + if (strlen($str) < $length) { + return $str; + } + return '<span title="' . htmlentities($str, ENT_COMPAT, 'UTF-8') . '">' + . substr($str, 0, $length - 3) + . '...</span>'; } -function table_body($array) { - $html = ""; - foreach ($array as $line) { - $html .= "<tr>"; - if (is_array($line)) { - foreach ($line as $td) { - $html .= "<td>" . $td . "</td>"; - } - } else { - $html .= "<td>" . $line . "</td>"; +/** + * @param array[] $array + * @return string + */ +function table_body($array) +{ + $html = ''; + foreach ($array as $line) { + $html .= '<tr>'; + if (is_array($line)) { + foreach ($line as $td) { + $html .= '<td>' . $td . '</td>'; + } + } else { + $html .= '<td>' . $line . '</td>'; + } + $html .= '</tr>'; } - $html .= "</tr>"; - } - return $html; + return $html; } -function ReplaceSmilies($neueckig) { - $neueckig = str_replace(";o))", "<img src=\"pic/smiles/icon_redface.gif\">", $neueckig); - $neueckig = str_replace(":-))", "<img src=\"pic/smiles/icon_redface.gif\">", $neueckig); - $neueckig = str_replace(";o)", "<img src=\"pic/smiles/icon_wind.gif\">", $neueckig); - $neueckig = str_replace(":)", "<img src=\"pic/smiles/icon_smile.gif\">", $neueckig); - $neueckig = str_replace(":-)", "<img src=\"pic/smiles/icon_smile.gif\">", $neueckig); - $neueckig = str_replace(":(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); - $neueckig = str_replace(":-(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); - $neueckig = str_replace(":o(", "<img src=\"pic/smiles/icon_sad.gif\">", $neueckig); - $neueckig = str_replace(":o)", "<img src=\"pic/smiles/icon_lol.gif\">", $neueckig); - $neueckig = str_replace(";o(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); - $neueckig = str_replace(";(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); - $neueckig = str_replace(";-(", "<img src=\"pic/smiles/icon_cry.gif\">", $neueckig); - $neueckig = str_replace("8)", "<img src=\"pic/smiles/icon_rolleyes.gif\">", $neueckig); - $neueckig = str_replace("8o)", "<img src=\"pic/smiles/icon_rolleyes.gif\">", $neueckig); - $neueckig = str_replace(":P", "<img src=\"pic/smiles/icon_evil.gif\">", $neueckig); - $neueckig = str_replace(":-P", "<img src=\"pic/smiles/icon_evil.gif\">", $neueckig); - $neueckig = str_replace(":oP", "<img src=\"pic/smiles/icon_evil.gif\">", $neueckig); - $neueckig = str_replace(";P", "<img src=\"pic/smiles/icon_mad.gif\">", $neueckig); - $neueckig = str_replace(";oP", "<img src=\"pic/smiles/icon_mad.gif\">", $neueckig); - $neueckig = str_replace("?)", "<img src=\"pic/smiles/icon_question.gif\">", $neueckig); - - return $neueckig; +/** + * @param string $msg + * @return mixed + */ +function ReplaceSmilies($msg) +{ + $msg = str_replace(';o))', '<img src="pic/smiles/icon_redface.gif">', $msg); + $msg = str_replace(':-))', '<img src="pic/smiles/icon_redface.gif">', $msg); + $msg = str_replace(';o)', '<img src="pic/smiles/icon_wind.gif">', $msg); + $msg = str_replace(':)', '<img src="pic/smiles/icon_smile.gif">', $msg); + $msg = str_replace(':-)', '<img src="pic/smiles/icon_smile.gif">', $msg); + $msg = str_replace(':(', '<img src="pic/smiles/icon_sad.gif">', $msg); + $msg = str_replace(':-(', '<img src="pic/smiles/icon_sad.gif">', $msg); + $msg = str_replace(':o(', '<img src="pic/smiles/icon_sad.gif">', $msg); + $msg = str_replace(':o)', '<img src="pic/smiles/icon_lol.gif">', $msg); + $msg = str_replace(';o(', '<img src="pic/smiles/icon_cry.gif">', $msg); + $msg = str_replace(';(', '<img src="pic/smiles/icon_cry.gif">', $msg); + $msg = str_replace(';-(', '<img src="pic/smiles/icon_cry.gif">', $msg); + $msg = str_replace('8)', '<img src="pic/smiles/icon_rolleyes.gif">', $msg); + $msg = str_replace('8o)', '<img src="pic/smiles/icon_rolleyes.gif">', $msg); + $msg = str_replace(':P', '<img src="pic/smiles/icon_evil.gif">', $msg); + $msg = str_replace(':-P', '<img src="pic/smiles/icon_evil.gif">', $msg); + $msg = str_replace(':oP', '<img src="pic/smiles/icon_evil.gif">', $msg); + $msg = str_replace(';P', '<img src="pic/smiles/icon_mad.gif">', $msg); + $msg = str_replace(';oP', '<img src="pic/smiles/icon_mad.gif">', $msg); + $msg = str_replace('?)', '<img src="pic/smiles/icon_question.gif">', $msg); + + return $msg; } -?> diff --git a/includes/view/AngelTypes_view.php b/includes/view/AngelTypes_view.php index 592f8d6b..bd258d3a 100644 --- a/includes/view/AngelTypes_view.php +++ b/includes/view/AngelTypes_view.php @@ -7,323 +7,455 @@ /** * Renders the angeltypes name as link. * - * @param AngelType $angeltype + * @param array $angeltype + * @return string */ -function AngelType_name_render($angeltype) { - return '<a href="' . angeltype_link($angeltype['id']) . '">' . ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name'] . '</a>'; +function AngelType_name_render($angeltype) +{ + return '<a href="' . angeltype_link($angeltype['id']) . '">' . ($angeltype['restricted'] ? glyph('lock') : '') . $angeltype['name'] . '</a>'; } /** * Render angeltype membership state * - * @param UserAngelType $user_angeltype - * UserAngelType and AngelType + * @param array $user_angeltype UserAngelType and AngelType * @return string */ -function AngelType_render_membership($user_angeltype) { - if ($user_angeltype['user_angeltype_id'] != null) { - if ($user_angeltype['restricted']) { - if ($user_angeltype['confirm_user_id'] == null) { - return glyph('lock') . _("Unconfirmed"); - } elseif ($user_angeltype['supporter']) { - return glyph_bool(true) . _("supporter"); - } - return glyph_bool(true) . _("Member"); - } elseif ($user_angeltype['supporter']) { - return glyph_bool(true) . _("supporter"); +function AngelType_render_membership($user_angeltype) +{ + if ($user_angeltype['user_angeltype_id'] != null) { + if ($user_angeltype['restricted']) { + if ($user_angeltype['confirm_user_id'] == null) { + return glyph('lock') . _('Unconfirmed'); + } elseif ($user_angeltype['supporter']) { + return glyph_bool(true) . _('supporter'); + } + return glyph_bool(true) . _('Member'); + } elseif ($user_angeltype['supporter']) { + return glyph_bool(true) . _('supporter'); + } + return glyph_bool(true) . _('Member'); } - return glyph_bool(true) . _("Member"); - } - return glyph_bool(false); + return glyph_bool(false); } -function AngelType_delete_view($angeltype) { - return page_with_title(sprintf(_("Delete angeltype %s"), $angeltype['name']), [ - info(sprintf(_("Do you want to delete angeltype %s?"), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes'), _("cancel"), 'cancel'), - button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'] . '&confirmed', _("delete"), 'ok') - ]) - ]); +/** + * @param array $angeltype + * @return string + */ +function AngelType_delete_view($angeltype) +{ + return page_with_title(sprintf(_('Delete angeltype %s'), $angeltype['name']), [ + info(sprintf(_('Do you want to delete angeltype %s?'), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes'), _('cancel'), 'cancel'), + button( + page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'] . '&confirmed', + _('delete'), + 'ok' + ) + ]) + ]); } /** * Render angeltype edit form. * - * @param Angeltype $angeltype - * The angeltype to edit - * @param boolean $supporter_mode - * Is the user a supporter of this angeltype? + * @param array $angeltype The angeltype to edit + * @param boolean $supporter_mode Is the user a supporter of this angeltype? + * @return string */ -function AngelType_edit_view($angeltype, $supporter_mode) { - $contact_info = AngelType_contact_info($angeltype); - return page_with_title(sprintf(_("Edit %s"), $angeltype['name']), [ - buttons([ - button(page_link_to('angeltypes'), _("Angeltypes"), 'back') - ]), - msg(), - form([ - $supporter_mode ? form_info(_("Name"), $angeltype['name']) : form_text('name', _("Name"), $angeltype['name']), - $supporter_mode ? form_info(_("Restricted"), $angeltype['restricted'] ? _("Yes") : _("No")) : form_checkbox('restricted', _("Restricted"), $angeltype['restricted']), - $supporter_mode ? form_info(_("No Self Sign Up"), $angeltype['no_self_signup'] ? _("Yes") : _("No")) : form_checkbox('no_self_signup', _("No Self Sign Up"), $angeltype['no_self_signup']), - $supporter_mode ? form_info(_("Requires driver license"), $angeltype['requires_driver_license'] ? _("Yes") : _("No")) : form_checkbox('requires_driver_license', _("Requires driver license"), $angeltype['requires_driver_license']), - //form_text('contact_name', _("Name"), $angeltype['contact_name']), - //form_text('contact_dect', _("DECT"), $angeltype['contact_dect']), - //form_text('contact_email', _("E-Mail"), $angeltype['contact_email']), - form_info("", _("Restricted angel types can only be used by an angel if enabled by a supporter (double opt-in).")), - form_textarea('description', _("Description"), $angeltype['description']), - form_info("", _("Please use markdown for the description.")), - form_submit('submit', _("Save")) - ]) - ]); +function AngelType_edit_view($angeltype, $supporter_mode) +{ + $contact_info = AngelType_contact_info($angeltype); + return page_with_title(sprintf(_('Edit %s'), $angeltype['name']), [ + buttons([ + button(page_link_to('angeltypes'), _('Angeltypes'), 'back') + ]), + msg(), + form([ + $supporter_mode + ? form_info(_('Name'), $angeltype['name']) + : form_text('name', _('Name'), $angeltype['name']), + $supporter_mode + ? form_info(_('Restricted'), $angeltype['restricted'] ? _('Yes') : _('No')) + : form_checkbox('restricted', _('Restricted'), $angeltype['restricted']), + $supporter_mode + ? form_info(_('No Self Sign Up'), $angeltype['no_self_signup'] ? _('Yes') : _('No')) + : form_checkbox('no_self_signup', _('No Self Sign Up'), $angeltype['no_self_signup']), + $supporter_mode + ? form_info(_('Requires driver license'), $angeltype['requires_driver_license'] ? _('Yes') : _('No')) + : form_checkbox( + 'requires_driver_license', + _('Requires driver license'), + $angeltype['requires_driver_license'] + ), + //form_text('contact_name', _('Name'), $angeltype['contact_name']), + //form_text('contact_dect', _('DECT'), $angeltype['contact_dect']), + //form_text('contact_email', _('E-Mail'), $angeltype['contact_email']), + form_info( + '', + _('Restricted angel types can only be used by an angel if enabled by a supporter (double opt-in).') + ), + form_textarea('description', _('Description'), $angeltype['description']), + form_info('', _('Please use markdown for the description.')), + form_submit('submit', _('Save')) + ]) + ]); } /** * Renders the buttons for the angeltype view. + * + * @param array $angeltype + * @param array|null $user_angeltype + * @param bool $admin_angeltypes + * @param bool $supporter + * @param array|null $user_driver_license + * @param array|null $user + * @return string */ -function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user) { - $buttons = [ - button(page_link_to('angeltypes'), _("Angeltypes"), 'back') - ]; - - if ($angeltype['requires_driver_license']) { - $buttons[] = button(user_driver_license_edit_link($user), glyph("road") . _("my driving license")); - } - - if ($user_angeltype == null) { - $buttons[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), 'add'); - } else { - if ($angeltype['requires_driver_license'] && $user_driver_license == null) { - error(_("This angeltype requires a driver license. Please enter your driver license information!")); +function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user) +{ + $buttons = [ + button(page_link_to('angeltypes'), _('Angeltypes'), 'back') + ]; + + if ($angeltype['requires_driver_license']) { + $buttons[] = button(user_driver_license_edit_link($user), glyph('road') . _('my driving license')); + } + + if ($user_angeltype == null) { + $buttons[] = button( + page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], + _('join'), + 'add' + ); + } else { + if ($angeltype['requires_driver_license'] && $user_driver_license == null) { + error(_('This angeltype requires a driver license. Please enter your driver license information!')); + } + + if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null) { + error(sprintf( + _('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'), + $angeltype['name'] + )); + } + $buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'], + _('leave'), 'cancel'); + } + + if ($admin_angeltypes || $supporter) { + $buttons[] = button( + page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], + _('edit'), + 'edit' + ); } - - if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null) { - error(sprintf(_("You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed."), $angeltype['name'])); + if ($admin_angeltypes) { + $buttons[] = button( + page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], + _('delete'), + 'delete' + ); } - $buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'], _("leave"), 'cancel'); - } - - if ($admin_angeltypes || $supporter) { - $buttons[] = button(page_link_to('angeltypes') . '&action=edit&angeltype_id=' . $angeltype['id'], _("edit"), 'edit'); - } - if ($admin_angeltypes) { - $buttons[] = button(page_link_to('angeltypes') . '&action=delete&angeltype_id=' . $angeltype['id'], _("delete"), 'delete'); - } - - return buttons($buttons); + + return buttons($buttons); } /** * Renders and sorts the members of an angeltype into supporters, members and unconfirmed members. * - * @return [supporters, members, unconfirmed members] + * @param array $angeltype + * @param array $members + * @param bool $admin_user_angeltypes + * @param bool $admin_angeltypes + * @return array [supporters, members, unconfirmed members] */ -function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $admin_angeltypes) { - $supporters = []; - $members_confirmed = []; - $members_unconfirmed = []; - foreach ($members as $member) { - $member['Nick'] = User_Nick_render($member); +function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $admin_angeltypes) +{ + $supporters = []; + $members_confirmed = []; + $members_unconfirmed = []; + foreach ($members as $member) { + $member['Nick'] = User_Nick_render($member); - if ($angeltype['requires_driver_license']) { - $member['wants_to_drive'] = glyph_bool($member['wants_to_drive']); - $member['has_car'] = glyph_bool($member['has_car']); - $member['has_license_car'] = glyph_bool($member['has_license_car']); - $member['has_license_3_5t_transporter'] = glyph_bool($member['has_license_3_5t_transporter']); - $member['has_license_7_5t_truck'] = glyph_bool($member['has_license_7_5t_truck']); - $member['has_license_12_5t_truck'] = glyph_bool($member['has_license_12_5t_truck']); - $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']); - } - - if ($angeltype['restricted'] && $member['confirm_user_id'] == null) { - $member['actions'] = table_buttons([ - button(page_link_to('user_angeltypes') . '&action=confirm&user_angeltype_id=' . $member['user_angeltype_id'], _("confirm"), 'btn-xs'), - button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], _("deny"), 'btn-xs') - ]); - $members_unconfirmed[] = $member; - } elseif ($member['supporter']) { - if ($admin_angeltypes) { - $member['actions'] = table_buttons([ - button(page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $member['user_angeltype_id'] . '&supporter=0', _("Remove supporter rights"), 'btn-xs') - ]); - } else { - $member['actions'] = ''; - } - $supporters[] = $member; - } else { - if ($admin_user_angeltypes) { - $member['actions'] = table_buttons([ - $admin_angeltypes ? button(page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $member['user_angeltype_id'] . '&supporter=1', _("Add supporter rights"), 'btn-xs') : '', - button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], _("remove"), 'btn-xs') - ]); - } - $members_confirmed[] = $member; + if ($angeltype['requires_driver_license']) { + $member['wants_to_drive'] = glyph_bool($member['user_id']); + $member['has_car'] = glyph_bool($member['has_car']); + $member['has_license_car'] = glyph_bool($member['has_license_car']); + $member['has_license_3_5t_transporter'] = glyph_bool($member['has_license_3_5t_transporter']); + $member['has_license_7_5t_truck'] = glyph_bool($member['has_license_7_5t_truck']); + $member['has_license_12_5t_truck'] = glyph_bool($member['has_license_12_5t_truck']); + $member['has_license_forklift'] = glyph_bool($member['has_license_forklift']); + } + + if ($angeltype['restricted'] && $member['confirm_user_id'] == null) { + $member['actions'] = table_buttons([ + button( + page_link_to('user_angeltypes') . '&action=confirm&user_angeltype_id=' . $member['user_angeltype_id'], + _('confirm'), + 'btn-xs' + ), + button( + page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], + _('deny'), + 'btn-xs' + ) + ]); + $members_unconfirmed[] = $member; + } elseif ($member['supporter']) { + if ($admin_angeltypes) { + $member['actions'] = table_buttons([ + button( + page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $member['user_angeltype_id'] . '&supporter=0', + _('Remove supporter rights'), + 'btn-xs' + ) + ]); + } else { + $member['actions'] = ''; + } + $supporters[] = $member; + } else { + if ($admin_user_angeltypes) { + $member['actions'] = table_buttons([ + $admin_angeltypes + ? button(page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $member['user_angeltype_id'] . '&supporter=1', + _('Add supporter rights'), 'btn-xs') + : '', + button( + page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $member['user_angeltype_id'], + _('remove'), + 'btn-xs' + ) + ]); + } + $members_confirmed[] = $member; + } } - } - - return [ - $supporters, - $members_confirmed, - $members_unconfirmed - ]; + + return [ + $supporters, + $members_confirmed, + $members_unconfirmed + ]; } /** * Creates the needed member table headers according to given rights and settings from the angeltype. + * + * @param array $angeltype + * @param bool $supporter + * @param bool $admin_angeltypes + * @return array */ -function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes) { - if ($angeltype['requires_driver_license'] && ($supporter || $admin_angeltypes)) { +function AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes) +{ + if ($angeltype['requires_driver_license'] && ($supporter || $admin_angeltypes)) { + return [ + 'Nick' => _('Nick'), + 'DECT' => _('DECT'), + 'wants_to_drive' => _('Driver'), + 'has_car' => _('Has car'), + 'has_license_car' => _('Car'), + 'has_license_3_5t_transporter' => _('3,5t Transporter'), + 'has_license_7_5t_truck' => _('7,5t Truck'), + 'has_license_12_5t_truck' => _('12,5t Truck'), + 'has_license_forklift' => _('Forklift'), + 'actions' => '' + ]; + } return [ - 'Nick' => _("Nick"), - 'DECT' => _("DECT"), - 'wants_to_drive' => _("Driver"), - 'has_car' => _("Has car"), - 'has_license_car' => _("Car"), - 'has_license_3_5t_transporter' => _("3,5t Transporter"), - 'has_license_7_5t_truck' => _("7,5t Truck"), - 'has_license_12_5t_truck' => _("12,5t Truck"), - 'has_license_forklift' => _("Forklift"), - 'actions' => '' + 'Nick' => _('Nick'), + 'DECT' => _('DECT'), + 'actions' => '' ]; - } - return [ - 'Nick' => _("Nick"), - 'DECT' => _("DECT"), - 'actions' => '' - ]; } /** * Render an angeltype page containing the member lists. + * + * @param array $angeltype + * @param array[] $members + * @param array $user_angeltype + * @param bool $admin_user_angeltypes + * @param bool $admin_angeltypes + * @param bool $supporter + * @param array $user_driver_license + * @param array $user + * @return string */ -function AngelType_view($angeltype, $members, $user_angeltype, $admin_user_angeltypes, $admin_angeltypes, $supporter, $user_driver_license, $user) { - $page = [ - AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user), - msg() - ]; - - $page[] = '<h3>' . _("Description") . '</h3>'; - $parsedown = new Parsedown(); - if ($angeltype['description'] != "") { - $page[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; - } - - list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $admin_angeltypes); - $table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes); - - if (count($supporters) > 0) { - $page[] = '<h3>' . _("supporters") . '</h3>'; - $page[] = table($table_headers, $supporters); - } - - if (count($members_confirmed) > 0) { - $members_confirmed[] = [ - 'Nick' => _('Sum'), - 'DECT' => count($members_confirmed), - 'actions' => '' +function AngelType_view( + $angeltype, + $members, + $user_angeltype, + $admin_user_angeltypes, + $admin_angeltypes, + $supporter, + $user_driver_license, + $user +) { + $page = [ + AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes, $supporter, $user_driver_license, $user), + msg() ]; - } - - if (count($members_unconfirmed) > 0) { - $members_unconfirmed[] = [ - 'Nick' => _('Sum'), - 'DECT' => count($members_unconfirmed), - 'actions' => '' - ]; - } - - $page[] = '<h3>' . _("Members") . '</h3>'; - if ($admin_user_angeltypes) { - $page[] = buttons([ - button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("Add"), 'add') - ]); - } - $page[] = table($table_headers, $members_confirmed); - - if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) { - $page[] = '<h3>' . _("Unconfirmed") . '</h3>'; - $page[] = buttons([ - button(page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'], _("confirm all"), 'ok'), - button(page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'], _("deny all"), 'cancel') - ]); - $page[] = table($table_headers, $members_unconfirmed); - } - - return page_with_title(sprintf(_("Team %s"), $angeltype['name']), $page); + + $page[] = '<h3>' . _('Description') . '</h3>'; + $parsedown = new Parsedown(); + if ($angeltype['description'] != '') { + $page[] = '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; + } + + list($supporters, $members_confirmed, $members_unconfirmed) = AngelType_view_members( + $angeltype, + $members, + $admin_user_angeltypes, + $admin_angeltypes + ); + $table_headers = AngelType_view_table_headers($angeltype, $supporter, $admin_angeltypes); + + if (count($supporters) > 0) { + $page[] = '<h3>' . _('supporters') . '</h3>'; + $page[] = table($table_headers, $supporters); + } + + if (count($members_confirmed) > 0) { + $members_confirmed[] = [ + 'Nick' => _('Sum'), + 'DECT' => count($members_confirmed), + 'actions' => '' + ]; + } + + if (count($members_unconfirmed) > 0) { + $members_unconfirmed[] = [ + 'Nick' => _('Sum'), + 'DECT' => count($members_unconfirmed), + 'actions' => '' + ]; + } + + $page[] = '<h3>' . _('Members') . '</h3>'; + if ($admin_user_angeltypes) { + $page[] = buttons([ + button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _('Add'), 'add') + ]); + } + $page[] = table($table_headers, $members_confirmed); + + if ($admin_user_angeltypes && $angeltype['restricted'] && count($members_unconfirmed) > 0) { + $page[] = '<h3>' . _('Unconfirmed') . '</h3>'; + $page[] = buttons([ + button( + page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'], + _('confirm all'), + 'ok' + ), + button( + page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'], + _('deny all'), + 'cancel' + ) + ]); + $page[] = table($table_headers, $members_unconfirmed); + } + + return page_with_title(sprintf(_('Team %s'), $angeltype['name']), $page); } /** * Display the list of angeltypes. * - * @param array $angeltypes + * @param array $angeltypes + * @param bool $admin_angeltypes + * @return string */ -function AngelTypes_list_view($angeltypes, $admin_angeltypes) { - return page_with_title(angeltypes_title(), [ - msg(), - buttons([ - $admin_angeltypes ? button(page_link_to('angeltypes') . '&action=edit', _("New angeltype"), 'add') : '', - button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description")) - ]), - table([ - 'name' => _("Name"), - 'restricted' => glyph('lock') . _("Restricted"), - 'no_self_signup' => glyph('share') . _("Self Sign Up Allowed"), - 'membership' => _("Membership"), - 'actions' => "" - ], $angeltypes) - ]); +function AngelTypes_list_view($angeltypes, $admin_angeltypes) +{ + return page_with_title(angeltypes_title(), [ + msg(), + buttons([ + $admin_angeltypes ? button(page_link_to('angeltypes') . '&action=edit', _('New angeltype'), 'add') : '', + button(page_link_to('angeltypes') . '&action=about', _('Teams/Job description')) + ]), + table([ + 'name' => _('Name'), + 'restricted' => glyph('lock') . _('Restricted'), + 'no_self_signup' => glyph('share') . _('Self Sign Up Allowed'), + 'membership' => _('Membership'), + 'actions' => '' + ], $angeltypes) + ]); } /** * Renders the about info for an angeltype. + * + * @param array $angeltype + * @return string */ -function AngelTypes_about_view_angeltype($angeltype) { - $parsedown = new Parsedown(); - - $html = '<h2>' . $angeltype['name'] . '</h2>'; - - if (isset($angeltype['user_angeltype_id'])) { - $buttons = []; - if ($angeltype['user_angeltype_id'] != null) { - $buttons[] = button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], _("leave"), 'cancel'); - } else { - $buttons[] = button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], _("join"), 'add'); +function AngelTypes_about_view_angeltype($angeltype) +{ + $parsedown = new Parsedown(); + + $html = '<h2>' . $angeltype['name'] . '</h2>'; + + if (isset($angeltype['user_angeltype_id'])) { + $buttons = []; + if ($angeltype['user_angeltype_id'] != null) { + $buttons[] = button( + page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $angeltype['user_angeltype_id'], + _('leave'), + 'cancel' + ); + } else { + $buttons[] = button( + page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], + _('join'), + 'add' + ); + } + $html .= buttons($buttons); + } + + if ($angeltype['restricted']) { + $html .= info( + _('This angeltype is restricted by double-opt-in by a team supporter. Please show up at the according introduction meetings.'), + true + ); } - $html .= buttons($buttons); - } - - if ($angeltype['restricted']) { - $html .= info(_("This angeltype is restricted by double-opt-in by a team supporter. Please show up at the according introduction meetings."), true); - } - if ($angeltype['description'] != "") { - $html .= '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; - } - $html .= '<hr />'; - - return $html; + if ($angeltype['description'] != '') { + $html .= '<div class="well">' . $parsedown->parse($angeltype['description']) . '</div>'; + } + $html .= '<hr />'; + + return $html; } /** * Renders a site that contains every angeltype and its description, basically as an overview of the needed help types. + * + * @param array[] $angeltypes + * @param bool $user_logged_in + * @return string */ -function AngelTypes_about_view($angeltypes, $user_logged_in) { - global $faq_url; - - $content = [ - buttons([ - ! $user_logged_in ? button(page_link_to('register'), register_title()) : '', - ! $user_logged_in ? button(page_link_to('login'), login_title()) : '', - $user_logged_in ? button(page_link_to('angeltypes'), angeltypes_title(), 'back') : '', - button($faq_url, _("FAQ"), "btn-primary") - ]), - '<p>' . _("Here is the list of teams and their tasks. If you have questions, read the FAQ.") . '</p>', - '<hr />' - ]; - foreach ($angeltypes as $angeltype) { - $content[] = AngelTypes_about_view_angeltype($angeltype); - } - - return page_with_title(_("Teams/Job description"), $content); -} +function AngelTypes_about_view($angeltypes, $user_logged_in) +{ + $content = [ + buttons([ + !$user_logged_in ? button(page_link_to('register'), register_title()) : '', + !$user_logged_in ? button(page_link_to('login'), login_title()) : '', + $user_logged_in ? button(page_link_to('angeltypes'), angeltypes_title(), 'back') : '', + button(config('faq_url'), _('FAQ'), 'btn-primary') + ]), + '<p>' . _('Here is the list of teams and their tasks. If you have questions, read the FAQ.') . '</p>', + '<hr />' + ]; + foreach ($angeltypes as $angeltype) { + $content[] = AngelTypes_about_view_angeltype($angeltype); + } -?> + return page_with_title(_('Teams/Job description'), $content); +} diff --git a/includes/view/EventConfig_view.php b/includes/view/EventConfig_view.php index 37a19839..2b092962 100644 --- a/includes/view/EventConfig_view.php +++ b/includes/view/EventConfig_view.php @@ -2,128 +2,154 @@ /** * Shows basic event infos and countdowns. - * @param EventConfig $event_config The event configuration + * + * @param array $event_config The event configuration + * @return string */ -function EventConfig_countdown_page($event_config) { - if ($event_config == null) { - return div('col-md-12 text-center', [ - heading(sprintf(_("Welcome to the %s!"), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2) - ]); - } - - $elements = []; - - if ($event_config['event_name'] != null) { - $elements[] = div('col-sm-12 text-center', [ - heading(sprintf(_("Welcome to the %s!"), $event_config['event_name'] . ' <span class="icon-icon_angel"></span> ENGELSYSTEM'), 2) - ]); - } - - if ($event_config['buildup_start_date'] != null && time() < $event_config['buildup_start_date']) { - $elements[] = div('col-sm-3 text-center hidden-xs', [ - heading(_("Buildup starts"), 4), - '<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>', - '<small>' . date(_("Y-m-d"), $event_config['buildup_start_date']) . '</small>' - ]); - } - - if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) { - $elements[] = div('col-sm-3 text-center hidden-xs', [ - heading(_("Event starts"), 4), - '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>', - '<small>' . date(_("Y-m-d"), $event_config['event_start_date']) . '</small>' - ]); - } - - if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) { - $elements[] = div('col-sm-3 text-center hidden-xs', [ - heading(_("Event ends"), 4), - '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>', - '<small>' . date(_("Y-m-d"), $event_config['event_end_date']) . '</small>' - ]); - } - - if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) { - $elements[] = div('col-sm-3 text-center hidden-xs', [ - heading(_("Teardown ends"), 4), - '<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>', - '<small>' . date(_("Y-m-d"), $event_config['teardown_end_date']) . '</small>' - ]); - } - - return join("", $elements); +function EventConfig_countdown_page($event_config) +{ + if ($event_config == null) { + return div('col-md-12 text-center', [ + heading(sprintf(_('Welcome to the %s!'), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2) + ]); + } + + $elements = []; + + if ($event_config['event_name'] != null) { + $elements[] = div('col-sm-12 text-center', [ + heading(sprintf( + _('Welcome to the %s!'), + $event_config['event_name'] . ' <span class="icon-icon_angel"></span> ENGELSYSTEM' + ), 2) + ]); + } + + if ($event_config['buildup_start_date'] != null && time() < $event_config['buildup_start_date']) { + $elements[] = div('col-sm-3 text-center hidden-xs', [ + heading(_('Buildup starts'), 4), + '<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>', + '<small>' . date(_('Y-m-d'), $event_config['buildup_start_date']) . '</small>' + ]); + } + + if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) { + $elements[] = div('col-sm-3 text-center hidden-xs', [ + heading(_('Event starts'), 4), + '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>', + '<small>' . date(_('Y-m-d'), $event_config['event_start_date']) . '</small>' + ]); + } + + if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) { + $elements[] = div('col-sm-3 text-center hidden-xs', [ + heading(_('Event ends'), 4), + '<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>', + '<small>' . date(_('Y-m-d'), $event_config['event_end_date']) . '</small>' + ]); + } + + if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) { + $elements[] = div('col-sm-3 text-center hidden-xs', [ + heading(_('Teardown ends'), 4), + '<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>', + '<small>' . date(_('Y-m-d'), $event_config['teardown_end_date']) . '</small>' + ]); + } + + return join('', $elements); } /** * Converts event name and start+end date into a line of text. + * + * @param array $event_config + * @return string */ -function EventConfig_info($event_config) { - if ($event_config == null) { - return ""; - } - - // Event name, start+end date are set - if ($event_config['event_name'] != null && $event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { - return sprintf(_("%s, from %s to %s"), $event_config['event_name'], date(_("Y-m-d"), $event_config['event_start_date']), date(_("Y-m-d"), $event_config['event_end_date'])); - } - - // Event name, start date are set - if ($event_config['event_name'] != null && $event_config['event_start_date'] != null) { - return sprintf(_("%s, starting %s"), $event_config['event_name'], date(_("Y-m-d"), $event_config['event_start_date'])); - } - - // Event start+end date are set - if ($event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { - return sprintf(_("Event from %s to %s"), date(_("Y-m-d"), $event_config['event_start_date']), date(_("Y-m-d"), $event_config['event_end_date'])); - } - - // Only event name is set - if ($event_config['event_name'] != null) { - return sprintf($event_config['event_name']); - } - - return ""; +function EventConfig_info($event_config) +{ + if ($event_config == null) { + return ''; + } + + // Event name, start+end date are set + if ($event_config['event_name'] != null && $event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { + return sprintf( + _('%s, from %s to %s'), + $event_config['event_name'], + date(_('Y-m-d'), $event_config['event_start_date']), + date(_('Y-m-d'), $event_config['event_end_date']) + ); + } + + // Event name, start date are set + if ($event_config['event_name'] != null && $event_config['event_start_date'] != null) { + return sprintf( + _('%s, starting %s'), $event_config['event_name'], + date(_('Y-m-d'), $event_config['event_start_date']) + ); + } + + // Event start+end date are set + if ($event_config['event_start_date'] != null && $event_config['event_end_date'] != null) { + return sprintf( + _('Event from %s to %s'), + date(_('Y-m-d'), $event_config['event_start_date']), + date(_('Y-m-d'), $event_config['event_end_date']) + ); + } + + // Only event name is set + if ($event_config['event_name'] != null) { + return sprintf($event_config['event_name']); + } + + return ''; } /** * Render edit page for event config. * - * @param string $event_name - * The event name - * @param string $event_welcome_msg - * The welcome message - * @param date $buildup_start_date - * @param date $event_start_date - * @param date $event_end_date - * @param date $teardown_end_date + * @param string $event_name The event name + * @param string $event_welcome_msg The welcome message + * @param int $buildup_start_date unix time stamp + * @param int $event_start_date unix time stamp + * @param int $event_end_date unix time stamp + * @param int $teardown_end_date unix time stamp + * @return string */ -function EventConfig_edit_view($event_name, $event_welcome_msg, $buildup_start_date, $event_start_date, $event_end_date, $teardown_end_date) { - return page_with_title(event_config_title(), [ - msg(), - form([ - div('row', [ - div('col-md-6', [ - form_text('event_name', _("Event Name"), $event_name), - form_info('', _("Event Name is shown on the start page.")), - form_textarea('event_welcome_msg', _("Event Welcome Message"), $event_welcome_msg), - form_info('', _("Welcome message is shown after successful registration. You can use markdown.")) - ]), - div('col-md-3 col-xs-6', [ - form_date('buildup_start_date', _("Buildup date"), $buildup_start_date), - form_date('event_start_date', _("Event start date"), $event_start_date) - ]), - div('col-md-3 col-xs-6', [ - form_date('teardown_end_date', _("Teardown end date"), $teardown_end_date), - form_date('event_end_date', _("Event end date"), $event_end_date) - ]) - ]), - div('row', [ - div('col-md-6', [ - form_submit('submit', _("Save")) - ]) - ]) - ]) - ]); +function EventConfig_edit_view( + $event_name, + $event_welcome_msg, + $buildup_start_date, + $event_start_date, + $event_end_date, + $teardown_end_date +) { + return page_with_title(event_config_title(), [ + msg(), + form([ + div('row', [ + div('col-md-6', [ + form_text('event_name', _('Event Name'), $event_name), + form_info('', _('Event Name is shown on the start page.')), + form_textarea('event_welcome_msg', _('Event Welcome Message'), $event_welcome_msg), + form_info('', _('Welcome message is shown after successful registration. You can use markdown.')) + ]), + div('col-md-3 col-xs-6', [ + form_date('buildup_start_date', _('Buildup date'), $buildup_start_date), + form_date('event_start_date', _('Event start date'), $event_start_date) + ]), + div('col-md-3 col-xs-6', [ + form_date('teardown_end_date', _('Teardown end date'), $teardown_end_date), + form_date('event_end_date', _('Event end date'), $event_end_date) + ]) + ]), + div('row', [ + div('col-md-6', [ + form_submit('submit', _('Save')) + ]) + ]) + ]) + ]); } - -?>
\ No newline at end of file diff --git a/includes/view/Questions_view.php b/includes/view/Questions_view.php index a44a29d1..dee7585c 100644 --- a/includes/view/Questions_view.php +++ b/includes/view/Questions_view.php @@ -1,37 +1,42 @@ <?php -function Questions_view($open_questions, $answered_questions, $ask_action) { - foreach ($open_questions as &$question) { - $question['actions'] = '<a href="' . page_link_to("user_questions") . '&action=delete&id=' . $question['QID'] . '">' . _("delete") . '</a>'; - $question['Question'] = str_replace("\n", '<br />', $question['Question']); - } - - foreach ($answered_questions as &$question) { - $question['Question'] = str_replace("\n", '<br />', $question['Question']); - $question['Answer'] = str_replace("\n", '<br />', $question['Answer']); - $question['actions'] = '<a href="' . page_link_to("user_questions") . '&action=delete&id=' . $question['QID'] . '">' . _("delete") . '</a>'; - } - - return page_with_title(questions_title(), [ - msg(), - heading(_("Open questions"), 2), - table([ - 'Question' => _("Question"), - 'actions' => "" - ], $open_questions), - heading(_("Answered questions"), 2), - table([ - 'Question' => _("Question"), - 'answer_user' => _("Answered by"), - 'Answer' => _("Answer"), - 'actions' => "" - ], $answered_questions), - heading(_("Ask the Heaven"), 2), - form([ - form_textarea('question', _("Your Question:"), ""), - form_submit('submit', _("Save")) - ], $ask_action) - ]); -} +/** + * @param array[] $open_questions + * @param array[] $answered_questions + * @param string $ask_action + * @return string + */ +function Questions_view($open_questions, $answered_questions, $ask_action) +{ + foreach ($open_questions as &$question) { + $question['actions'] = '<a href="' . page_link_to('user_questions') . '&action=delete&id=' . $question['QID'] . '">' . _('delete') . '</a>'; + $question['Question'] = str_replace("\n", '<br />', $question['Question']); + } + + foreach ($answered_questions as &$question) { + $question['Question'] = str_replace("\n", '<br />', $question['Question']); + $question['Answer'] = str_replace("\n", '<br />', $question['Answer']); + $question['actions'] = '<a href="' . page_link_to('user_questions') . '&action=delete&id=' . $question['QID'] . '">' . _('delete') . '</a>'; + } -?>
\ No newline at end of file + return page_with_title(questions_title(), [ + msg(), + heading(_('Open questions'), 2), + table([ + 'Question' => _('Question'), + 'actions' => '' + ], $open_questions), + heading(_('Answered questions'), 2), + table([ + 'Question' => _('Question'), + 'answer_user' => _('Answered by'), + 'Answer' => _('Answer'), + 'actions' => '' + ], $answered_questions), + heading(_('Ask the Heaven'), 2), + form([ + form_textarea('question', _('Your Question:'), ''), + form_submit('submit', _('Save')) + ], $ask_action) + ]); +} diff --git a/includes/view/Rooms_view.php b/includes/view/Rooms_view.php index 7afdc67b..802b4c8e 100644 --- a/includes/view/Rooms_view.php +++ b/includes/view/Rooms_view.php @@ -1,20 +1,30 @@ <?php -use Engelsystem\ShiftsFilterRenderer; use Engelsystem\ShiftCalendarRenderer; +use Engelsystem\ShiftsFilterRenderer; -function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer) { - return page_with_title(glyph('map-marker') . $room['Name'], [ - $shiftsFilterRenderer->render(room_link($room)) , - $shiftCalendarRenderer->render() - ]); +/** + * @param array $room + * @param ShiftsFilterRenderer $shiftsFilterRenderer + * @param ShiftCalendarRenderer $shiftCalendarRenderer + * @return string + */ +function Room_view($room, ShiftsFilterRenderer $shiftsFilterRenderer, ShiftCalendarRenderer $shiftCalendarRenderer) +{ + return page_with_title(glyph('map-marker') . $room['Name'], [ + $shiftsFilterRenderer->render(room_link($room)), + $shiftCalendarRenderer->render() + ]); } -function Room_name_render($room) { - global $privileges; - if (in_array('view_rooms', $privileges)) { - return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>'; - } - return glyph('map-marker') . $room['Name']; +/** + * @param array $room + * @return string + */ +function Room_name_render($room) +{ + global $privileges; + if (in_array('view_rooms', $privileges)) { + return '<a href="' . room_link($room) . '">' . glyph('map-marker') . $room['Name'] . '</a>'; + } + return glyph('map-marker') . $room['Name']; } - -?>
\ No newline at end of file diff --git a/includes/view/ShiftCalendarLane.php b/includes/view/ShiftCalendarLane.php index 33fccec3..774683bd 100644 --- a/includes/view/ShiftCalendarLane.php +++ b/includes/view/ShiftCalendarLane.php @@ -5,59 +5,80 @@ namespace Engelsystem; /** * Represents a single lane in a shifts calendar. */ -class ShiftCalendarLane { - - private $firstBlockStartTime; - - private $blockCount; - - private $header; - - private $shifts = []; - - public function __construct($header, $firstBlockStartTime, $blockCount) { - $this->header = $header; - $this->firstBlockStartTime = $firstBlockStartTime; - $this->blockCount = $blockCount; - } - - /** - * Adds a shift to the lane, but only if it fits. - * Returns true on success. - * - * @param Shift $shift - * The shift to add - * @return boolean true on success - */ - public function addShift($shift) { - if ($this->shiftFits($shift)) { - $this->shifts[] = $shift; - return true; +class ShiftCalendarLane +{ + /** @var int */ + private $firstBlockStartTime; + + /** @var int */ + private $blockCount; + + /** @var string */ + private $header; + + /** @var array[] */ + private $shifts = []; + + /** + * ShiftCalendarLane constructor. + * + * @param string $header + * @param int $firstBlockStartTime Unix timestamp + * @param int $blockCount + */ + public function __construct($header, $firstBlockStartTime, $blockCount) + { + $this->header = $header; + $this->firstBlockStartTime = $firstBlockStartTime; + $this->blockCount = $blockCount; } - return false; - } - - /** - * Returns true if given shift fits into this lane. - * - * @param Shift $shift - * The shift to fit into this lane - */ - public function shiftFits($newShift) { - foreach ($this->shifts as $laneShift) { - if (! ($newShift['start'] >= $laneShift['end'] || $newShift['end'] <= $laneShift['start'])) { + + /** + * Adds a shift to the lane, but only if it fits. + * Returns true on success. + * + * @param array $shift The shift to add + * @return boolean true on success + */ + public function addShift($shift) + { + if ($this->shiftFits($shift)) { + $this->shifts[] = $shift; + return true; + } return false; - } } - return true; - } - public function getHeader() { - return $this->header; - } + /** + * Returns true if given shift fits into this lane. + * + * @param array $newShift + * @return bool + * @internal param array $shift The shift to fit into this lane + */ + public function shiftFits($newShift) + { + foreach ($this->shifts as $laneShift) { + if (!($newShift['start'] >= $laneShift['end'] || $newShift['end'] <= $laneShift['start'])) { + return false; + } + } + return true; + } + + /** + * @return string + */ + public function getHeader() + { + return $this->header; + } - public function getShifts() { - return $this->shifts; - } + /** + * @return array[] + */ + public function getShifts() + { + return $this->shifts; + } } -?>
\ No newline at end of file diff --git a/includes/view/ShiftCalendarRenderer.php b/includes/view/ShiftCalendarRenderer.php index 8c8e72a4..aad0d643 100644 --- a/includes/view/ShiftCalendarRenderer.php +++ b/includes/view/ShiftCalendarRenderer.php @@ -2,256 +2,312 @@ namespace Engelsystem; -class ShiftCalendarRenderer { - - /** - * 15m * 60s/m = 900s - */ - const SECONDS_PER_ROW = 900; - - /** - * Height of a block in pixel. - * Do not change - corresponds with theme/css - */ - const BLOCK_HEIGHT = 30; - - /** - * Distance between two shifts in pixels - */ - const MARGIN = 5; - - /** - * Seconds added to the start and end time - */ - const TIME_MARGIN = 1800; - - private $lanes; - - private $shiftsFilter; - - private $firstBlockStartTime = null; - - private $lastBlockEndTime = null; - - private $blocksPerSlot = null; - - private $needed_angeltypes = null; - - private $shift_entries = null; - - public function __construct($shifts, $needed_angeltypes, $shift_entries, ShiftsFilter $shiftsFilter) { - $this->shiftsFilter = $shiftsFilter; - $this->firstBlockStartTime = $this->calcFirstBlockStartTime($shifts); - $this->lastBlockEndTime = $this->calcLastBlockEndTime($shifts); - $this->lanes = $this->assignShiftsToLanes($shifts); - $this->needed_angeltypes = $needed_angeltypes; - $this->shift_entries = $shift_entries; - } - - /** - * Assigns the shifts to different lanes per room if they collide - * - * @param Shift[] $shifts - * The shifts to assign - * - * @return Returns an array that assigns a room_id to an array of ShiftCalendarLane containing the shifts - */ - private function assignShiftsToLanes($shifts) { - // array that assigns a room id to a list of lanes (per room) - $lanes = []; - - foreach ($shifts as $shift) { - $room_id = $shift['RID']; - $header = Room_name_render([ - 'RID' => $room_id, - 'Name' => $shift['room_name'] - ]); - if (! isset($lanes[$room_id])) { - // initialize room with one lane - $lanes[$room_id] = [ - new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()) - ]; - } - // Try to add the shift to the existing lanes for this room - $shift_added = false; - foreach ($lanes[$room_id] as $lane) { - $shift_added = $lane->addShift($shift); - if ($shift_added == true) { - break; - } - } - // If all lanes for this room are busy, create a new lane and add shift to it - if ($shift_added == false) { - $newLane = new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()); - if (! $newLane->addShift($shift)) { - engelsystem_error("Unable to add shift to new lane."); +class ShiftCalendarRenderer +{ + /** + * 15m * 60s/m = 900s + */ + const SECONDS_PER_ROW = 900; + + /** + * Height of a block in pixel. + * Do not change - corresponds with theme/css + */ + const BLOCK_HEIGHT = 30; + + /** + * Distance between two shifts in pixels + */ + const MARGIN = 5; + + /** + * Seconds added to the start and end time + */ + const TIME_MARGIN = 1800; + + /** @var array */ + private $lanes; + + /** @var ShiftsFilter */ + private $shiftsFilter; + + /** @var int */ + private $firstBlockStartTime = 0; + + /** @var int */ + private $lastBlockEndTime = 0; + + /** @var int */ + private $blocksPerSlot = null; + + /** @var array[] */ + private $needed_angeltypes = []; + + /** @var array[] */ + private $shift_entries = []; + + /** + * ShiftCalendarRenderer constructor. + * + * @param array[] $shifts + * @param array[] $needed_angeltypes + * @param array[] $shift_entries + * @param ShiftsFilter $shiftsFilter + */ + public function __construct($shifts, $needed_angeltypes, $shift_entries, ShiftsFilter $shiftsFilter) + { + $this->shiftsFilter = $shiftsFilter; + $this->firstBlockStartTime = $this->calcFirstBlockStartTime($shifts); + $this->lastBlockEndTime = $this->calcLastBlockEndTime($shifts); + $this->lanes = $this->assignShiftsToLanes($shifts); + $this->needed_angeltypes = $needed_angeltypes; + $this->shift_entries = $shift_entries; + } + + /** + * Assigns the shifts to different lanes per room if they collide + * + * @param array[] $shifts The shifts to assign + * + * @return array Returns an array that assigns a room_id to an array of ShiftCalendarLane containing the shifts + */ + private function assignShiftsToLanes($shifts) + { + // array that assigns a room id to a list of lanes (per room) + $lanes = []; + + foreach ($shifts as $shift) { + $room_id = $shift['RID']; + $header = Room_name_render([ + 'RID' => $room_id, + 'Name' => $shift['room_name'] + ]); + if (!isset($lanes[$room_id])) { + // initialize room with one lane + $lanes[$room_id] = [ + new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()) + ]; + } + // Try to add the shift to the existing lanes for this room + $shift_added = false; + foreach ($lanes[$room_id] as $lane) { + /** @var ShiftCalendarLane $lane */ + $shift_added = $lane->addShift($shift); + if ($shift_added == true) { + break; + } + } + // If all lanes for this room are busy, create a new lane and add shift to it + if ($shift_added == false) { + $newLane = new ShiftCalendarLane($header, $this->getFirstBlockStartTime(), $this->getBlocksPerSlot()); + if (!$newLane->addShift($shift)) { + engelsystem_error('Unable to add shift to new lane.'); + } + $lanes[$room_id][] = $newLane; + } } - $lanes[$room_id][] = $newLane; - } + + return $lanes; } - - return $lanes; - } - public function getFirstBlockStartTime() { - return $this->firstBlockStartTime; - } + /** + * @return int + */ + public function getFirstBlockStartTime() + { + return $this->firstBlockStartTime; + } - public function getLastBlockEndTime() { - return $this->lastBlockEndTime; - } + /** + * @return int + */ + public function getLastBlockEndTime() + { + return $this->lastBlockEndTime; + } - public function getBlocksPerSlot() { - if ($this->blocksPerSlot == null) { - $this->blocksPerSlot = $this->calcBlocksPerSlot(); + /** + * @return float + */ + public function getBlocksPerSlot() + { + if ($this->blocksPerSlot == null) { + $this->blocksPerSlot = $this->calcBlocksPerSlot(); + } + return $this->blocksPerSlot; + } + + /** + * Renders the whole calendar + * + * @return string the generated html + */ + public function render() + { + if (count($this->lanes) == 0) { + return ''; + } + return div('shift-calendar', [ + $this->renderTimeLane(), + $this->renderShiftLanes() + ]) . $this->renderLegend(); } - return $this->blocksPerSlot; - } - - /** - * Renders the whole calendar - * - * @return the generated html - */ - public function render() { - if (count($this->lanes) == 0) { - return ''; + + /** + * Renders the lanes containing the shifts + * + * @return string + */ + private function renderShiftLanes() + { + $html = ''; + foreach ($this->lanes as $room_lanes) { + foreach ($room_lanes as $lane) { + $html .= $this->renderLane($lane); + } + } + + return $html; } - return div('shift-calendar', [ - $this->renderTimeLane(), - $this->renderShiftLanes() - ]) . $this->renderLegend(); - } - - /** - * Renders the lanes containing the shifts - */ - private function renderShiftLanes() { - $html = ""; - foreach ($this->lanes as $room_lanes) { - foreach ($room_lanes as $lane) { - $html .= $this->renderLane($lane); - } + + /** + * Renders a single lane + * + * @param ShiftCalendarLane $lane The lane to render + * @return string + */ + private function renderLane(ShiftCalendarLane $lane) + { + global $user; + + $shift_renderer = new ShiftCalendarShiftRenderer(); + $html = ''; + $rendered_until = $this->getFirstBlockStartTime(); + + foreach ($lane->getShifts() as $shift) { + while ($rendered_until + ShiftCalendarRenderer::SECONDS_PER_ROW <= $shift['start']) { + $html .= $this->renderTick($rendered_until); + $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; + } + + list($shift_height, $shift_html) = $shift_renderer->render( + $shift, + $this->needed_angeltypes[$shift['SID']], + $this->shift_entries[$shift['SID']], + $user + ); + $html .= $shift_html; + $rendered_until += $shift_height * ShiftCalendarRenderer::SECONDS_PER_ROW; + } + + while ($rendered_until < $this->getLastBlockEndTime()) { + $html .= $this->renderTick($rendered_until); + $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; + } + + return div('lane', [ + div('header', $lane->getHeader()), + $html + ]); } - - return $html; - } - - /** - * Renders a single lane - * - * @param ShiftCalendarLane $lane - * The lane to render - */ - private function renderLane(ShiftCalendarLane $lane) { - global $user; - - $shift_renderer = new ShiftCalendarShiftRenderer(); - $html = ""; - $rendered_until = $this->getFirstBlockStartTime(); - - foreach ($lane->getShifts() as $shift) { - while ($rendered_until + ShiftCalendarRenderer::SECONDS_PER_ROW <= $shift['start']) { - $html .= $this->renderTick($rendered_until); - $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; - } - - list($shift_height, $shift_html) = $shift_renderer->render($shift, $this->needed_angeltypes[$shift['SID']], $this->shift_entries[$shift['SID']], $user); - $html .= $shift_html; - $rendered_until += $shift_height * ShiftCalendarRenderer::SECONDS_PER_ROW; + + /** + * Renders a tick/block for given time + * + * @param int $time unix timestamp + * @param boolean $label Should time labels be generated? + * @return string rendered tick html + */ + private function renderTick($time, $label = false) + { + if ($time % (24 * 60 * 60) == 23 * 60 * 60) { + if (!$label) { + return div('tick day'); + } + return div('tick day', [ + date('m-d<b\r />H:i', $time) + ]); + } elseif ($time % (60 * 60) == 0) { + if (!$label) { + return div('tick hour'); + } + return div('tick hour', [ + date('m-d<b\r />H:i', $time) + ]); + } + return div('tick'); } - - while ($rendered_until < $this->getLastBlockEndTime()) { - $html .= $this->renderTick($rendered_until); - $rendered_until += ShiftCalendarRenderer::SECONDS_PER_ROW; + + /** + * Renders the left time lane including hour/day ticks + * + * @return string + */ + private function renderTimeLane() + { + $time_slot = [ + div('header', [ + _('Time') + ]) + ]; + for ($block = 0; $block < $this->getBlocksPerSlot(); $block++) { + $thistime = $this->getFirstBlockStartTime() + ($block * ShiftCalendarRenderer::SECONDS_PER_ROW); + $time_slot[] = $this->renderTick($thistime, true); + } + return div('lane time', $time_slot); } - - return div('lane', [ - div('header', $lane->getHeader()), - $html - ]); - } - - /** - * Renders a tick/block for given time - * - * @param int $time - * unix timestamp - * @param boolean $label - * Should time labels be generated? - * @return rendered tick html - */ - private function renderTick($time, $label = false) { - if ($time % (24 * 60 * 60) == 23 * 60 * 60) { - if (! $label) { - return div('tick day'); - } - return div('tick day', [ - date('m-d<b\r />H:i', $time) - ]); - } elseif ($time % (60 * 60) == 0) { - if (! $label) { - return div('tick hour'); - } - return div('tick hour', [ - date('m-d<b\r />H:i', $time) - ]); + + /** + * @param array[] $shifts + * @return int + */ + private function calcFirstBlockStartTime($shifts) + { + $start_time = $this->shiftsFilter->getEndTime(); + foreach ($shifts as $shift) { + if ($shift['start'] < $start_time) { + $start_time = $shift['start']; + } + } + return ShiftCalendarRenderer::SECONDS_PER_ROW * floor(($start_time - ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW); } - return div('tick'); - } - - /** - * Renders the left time lane including hour/day ticks - */ - private function renderTimeLane() { - $time_slot = [ - div('header', [ - _("Time") - ]) - ]; - for ($block = 0; $block < $this->getBlocksPerSlot(); $block ++) { - $thistime = $this->getFirstBlockStartTime() + ($block * ShiftCalendarRenderer::SECONDS_PER_ROW); - $time_slot[] = $this->renderTick($thistime, true); + + /** + * @param array[] $shifts + * @return int + */ + private function calcLastBlockEndTime($shifts) + { + $end_time = $this->shiftsFilter->getStartTime(); + foreach ($shifts as $shift) { + if ($shift['end'] > $end_time) { + $end_time = $shift['end']; + } + } + return ShiftCalendarRenderer::SECONDS_PER_ROW * ceil(($end_time + ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW); } - return div('lane time', $time_slot); - } - - private function calcFirstBlockStartTime($shifts) { - $start_time = $this->shiftsFilter->getEndTime(); - foreach ($shifts as $shift) { - if ($shift['start'] < $start_time) { - $start_time = $shift['start']; - } + + /** + * @return int + */ + private function calcBlocksPerSlot() + { + return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW); } - return ShiftCalendarRenderer::SECONDS_PER_ROW * floor(($start_time - ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW); - } - - private function calcLastBlockEndTime($shifts) { - $end_time = $this->shiftsFilter->getStartTime(); - foreach ($shifts as $shift) { - if ($shift['end'] > $end_time) { - $end_time = $shift['end']; - } + + /** + * Renders a legend explaining the shift coloring + * + * @return string + */ + private function renderLegend() + { + return div('legend', [ + label(_('Your shift'), 'primary'), + label(_('Help needed'), 'danger'), + label(_('Other angeltype needed / collides with my shifts'), 'warning'), + label(_('Shift is full'), 'success'), + label(_('Shift running/ended'), 'default') + ]); } - return ShiftCalendarRenderer::SECONDS_PER_ROW * ceil(($end_time + ShiftCalendarRenderer::TIME_MARGIN) / ShiftCalendarRenderer::SECONDS_PER_ROW); - } - - private function calcBlocksPerSlot() { - return ceil(($this->getLastBlockEndTime() - $this->getFirstBlockStartTime()) / ShiftCalendarRenderer::SECONDS_PER_ROW); - } - - /** - * Renders a legend explaining the shift coloring - */ - private function renderLegend() { - return div('legend', [ - label(_('Your shift'), 'primary'), - label(_('Help needed'), 'danger'), - label(_('Other angeltype needed / collides with my shifts'), 'warning'), - label(_('Shift is full'), 'success'), - label(_('Shift running/ended'), 'default') - ]); - } } - -?>
\ No newline at end of file diff --git a/includes/view/ShiftCalendarShiftRenderer.php b/includes/view/ShiftCalendarShiftRenderer.php index fdfefcc2..8560d47d 100644 --- a/includes/view/ShiftCalendarShiftRenderer.php +++ b/includes/view/ShiftCalendarShiftRenderer.php @@ -5,191 +5,243 @@ namespace Engelsystem; /** * Renders a single shift for the shift calendar */ -class ShiftCalendarShiftRenderer { - - /** - * Renders a shift - * - * @param Shift $shift - * The shift to render - * @param User $user - * The user who is viewing the shift calendar - */ - public function render($shift, $needed_angeltypes, $shift_entries, $user) { - $info_text = ""; - if ($shift['title'] != '') { - $info_text = glyph('info-sign') . $shift['title'] . '<br>'; - } - list($shift_signup_state, $shifts_row) = $this->renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user); - - $class = $this->classForSignupState($shift_signup_state); - - $blocks = ceil(($shift["end"] - $shift["start"]) / ShiftCalendarRenderer::SECONDS_PER_ROW); - $blocks = max(1, $blocks); - return [ - $blocks, - div('shift panel panel-' . $class . '" style="height: ' . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px"', [ - $this->renderShiftHead($shift), - div('panel-body', [ - $info_text, - Room_name_render([ - 'RID' => $shift['RID'], - 'Name' => $shift['room_name'] - ]) - ]), - $shifts_row, - div('shift-spacer') - ]) - ]; - } - - private function classForSignupState(ShiftSignupState $shiftSignupState) { - switch ($shiftSignupState->getState()) { - case ShiftSignupState::ADMIN: - case ShiftSignupState::OCCUPIED: - return 'success'; - - case ShiftSignupState::SIGNED_UP: - return 'primary'; - - case ShiftSignupState::SHIFT_ENDED: - return 'default'; - - case ShiftSignupState::ANGELTYPE: - case ShiftSignupState::COLLIDES: - return 'warning'; - - case ShiftSignupState::FREE: - return 'danger'; - } - } - - private function renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user) { - global $privileges; - - $shift_entries_filtered = []; - foreach ($needed_angeltypes as $needed_angeltype) { - $shift_entries_filtered[$needed_angeltype['id']] = []; +class ShiftCalendarShiftRenderer +{ + /** + * Renders a shift + * + * @param array $shift The shift to render + * @param array $needed_angeltypes + * @param array $shift_entries + * @param array $user The user who is viewing the shift calendar + * @return array + */ + public function render($shift, $needed_angeltypes, $shift_entries, $user) + { + $info_text = ''; + if ($shift['title'] != '') { + $info_text = glyph('info-sign') . $shift['title'] . '<br>'; + } + list($shift_signup_state, $shifts_row) = $this->renderShiftNeededAngeltypes( + $shift, + $needed_angeltypes, + $shift_entries, + $user + ); + + $class = $this->classForSignupState($shift_signup_state); + + $blocks = ceil(($shift['end'] - $shift['start']) / ShiftCalendarRenderer::SECONDS_PER_ROW); + $blocks = max(1, $blocks); + return [ + $blocks, + div( + 'shift panel panel-' . $class . '" style="height: ' . ($blocks * ShiftCalendarRenderer::BLOCK_HEIGHT - ShiftCalendarRenderer::MARGIN) . 'px"', + [ + $this->renderShiftHead($shift), + div('panel-body', [ + $info_text, + Room_name_render([ + 'RID' => $shift['RID'], + 'Name' => $shift['room_name'] + ]) + ]), + $shifts_row, + div('shift-spacer') + ] + ) + ]; } - foreach ($shift_entries as $shift_entry) { - $shift_entries_filtered[$shift_entry['TID']][] = $shift_entry; + + /** + * @param ShiftSignupState $shiftSignupState + * @return string + */ + private function classForSignupState(ShiftSignupState $shiftSignupState) + { + switch ($shiftSignupState->getState()) { + case ShiftSignupState::ADMIN: + case ShiftSignupState::OCCUPIED: + return 'success'; + + case ShiftSignupState::SIGNED_UP: + return 'primary'; + + case ShiftSignupState::SHIFT_ENDED: + return 'default'; + + case ShiftSignupState::ANGELTYPE: + case ShiftSignupState::COLLIDES: + return 'warning'; + + case ShiftSignupState::FREE: + return 'danger'; + default: + return ''; + } } - - $html = ""; - $shift_signup_state = null; - foreach ($needed_angeltypes as $angeltype) { - if ($angeltype['count'] > 0 || count($shift_entries_filtered[$angeltype['id']]) > 0) { - list($angeltype_signup_state, $angeltype_html) = $this->renderShiftNeededAngeltype($shift, $shift_entries_filtered[$angeltype['id']], $angeltype, $user); + + /** + * @param array $shift + * @param array[] $needed_angeltypes + * @param array[] $shift_entries + * @param array $user + * @return array + */ + private function renderShiftNeededAngeltypes($shift, $needed_angeltypes, $shift_entries, $user) + { + global $privileges; + + $shift_entries_filtered = []; + foreach ($needed_angeltypes as $needed_angeltype) { + $shift_entries_filtered[$needed_angeltype['id']] = []; + } + foreach ($shift_entries as $shift_entry) { + $shift_entries_filtered[$shift_entry['TID']][] = $shift_entry; + } + + $html = ''; + /** @var ShiftSignupState $shift_signup_state */ + $shift_signup_state = null; + foreach ($needed_angeltypes as $angeltype) { + if ($angeltype['count'] > 0 || count($shift_entries_filtered[$angeltype['id']]) > 0) { + list($angeltype_signup_state, $angeltype_html) = $this->renderShiftNeededAngeltype( + $shift, + $shift_entries_filtered[$angeltype['id']], + $angeltype, + $user + ); + if ($shift_signup_state == null) { + $shift_signup_state = $angeltype_signup_state; + } else { + $shift_signup_state->combineWith($angeltype_signup_state); + } + $html .= $angeltype_html; + } + } if ($shift_signup_state == null) { - $shift_signup_state = $angeltype_signup_state; - } else { - $shift_signup_state->combineWith($angeltype_signup_state); + $shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0); } - $html .= $angeltype_html; - } - } - if ($shift_signup_state == null) { - $shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0); - } - - if (in_array('user_shifts_admin', $privileges)) { - $html .= '<li class="list-group-item">' . button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'], _("Add more angels"), 'btn-xs') . '</li>'; - } - if ($html != '') { - return [ - $shift_signup_state, - '<ul class="list-group">' . $html . '</ul>' - ]; - } - return [ - $shift_signup_state, - "" - ]; - } - - /** - * Renders a list entry containing the needed angels for an angeltype - * - * @param Shift $shift - * The shift which is rendered - * @param Angeltype $angeltype - * The angeltype, containing informations about needed angeltypes and already signed up angels - * @param User $user - * The user who is viewing the shift calendar - */ - private function renderShiftNeededAngeltype($shift, $shift_entries, $angeltype, $user) { - $entry_list = []; - foreach ($shift_entries as $entry) { - $style = $entry['freeloaded'] ? " text-decoration: line-through;" : ''; - $entry_list[] = "<span style=\"$style\">" . User_Nick_render($entry) . "</span>"; + + if (in_array('user_shifts_admin', $privileges)) { + $html .= '<li class="list-group-item">' . button( + page_link_to('user_shifts') . '&shift_id=' . $shift['SID'], + _('Add more angels'), + 'btn-xs' + ) . '</li>'; + } + if ($html != '') { + return [ + $shift_signup_state, + '<ul class="list-group">' . $html . '</ul>' + ]; + } + return [ + $shift_signup_state, + '' + ]; } - $shift_signup_state = Shift_signup_allowed($user, $shift, $angeltype, null, null, $angeltype, $shift_entries); - $inner_text = sprintf(ngettext("%d helper needed", "%d helpers needed", $shift_signup_state->getFreeEntries()), $shift_signup_state->getFreeEntries()); - switch ($shift_signup_state->getState()) { - case ShiftSignupState::ADMIN: - case ShiftSignupState::FREE: - // When admin or free display a link + button for sign up - $entry_list[] = '<a href="' . page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'] . '">' . $inner_text . '</a> ' . button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], _('Sign up'), 'btn-xs btn-primary'); - break; - - case ShiftSignupState::SHIFT_ENDED: - // No link and add a text hint, when the shift ended - $entry_list[] = $inner_text . ' (' . _('ended') . ')'; - break; - - case ShiftSignupState::ANGELTYPE: - if ($angeltype['restricted'] == 1) { - // User has to be confirmed on the angeltype first - $entry_list[] = $inner_text . glyph('lock'); - } else { - // Add link to join the angeltype first - $entry_list[] = $inner_text . '<br />' . button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], sprintf(_('Become %s'), $angeltype['name']), 'btn-xs'); + + /** + * Renders a list entry containing the needed angels for an angeltype + * + * @param array $shift The shift which is rendered + * @param array[] $shift_entries + * @param array[] $angeltype The angeltype, containing informations about needed angeltypes + * and already signed up angels + * @param array $user The user who is viewing the shift calendar + * @return array + */ + private function renderShiftNeededAngeltype($shift, $shift_entries, $angeltype, $user) + { + $entry_list = []; + foreach ($shift_entries as $entry) { + $style = $entry['freeloaded'] ? ' text-decoration: line-through;' : ''; + $entry_list[] = '<span style="' . $style . '">' . User_Nick_render($entry) . '</span>'; + } + $shift_signup_state = Shift_signup_allowed($user, $shift, $angeltype, null, null, $angeltype, $shift_entries); + $inner_text = sprintf( + ngettext('%d helper needed', '%d helpers needed', $shift_signup_state->getFreeEntries()), + $shift_signup_state->getFreeEntries() + ); + + switch ($shift_signup_state->getState()) { + case ShiftSignupState::ADMIN: + case ShiftSignupState::FREE: + // When admin or free display a link + button for sign up + $entry_list[] = '<a href="' . page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'] . '">' + . $inner_text + . '</a> ' + . button( + page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], + _('Sign up'), 'btn-xs btn-primary' + ); + break; + + case ShiftSignupState::SHIFT_ENDED: + // No link and add a text hint, when the shift ended + $entry_list[] = $inner_text . ' (' . _('ended') . ')'; + break; + + case ShiftSignupState::ANGELTYPE: + if ($angeltype['restricted'] == 1) { + // User has to be confirmed on the angeltype first + $entry_list[] = $inner_text . glyph('lock'); + } else { + // Add link to join the angeltype first + $entry_list[] = $inner_text . '<br />' + . button( + page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'], + sprintf(_('Become %s'), $angeltype['name']), + 'btn-xs' + ); + } + break; + + case ShiftSignupState::COLLIDES: + case ShiftSignupState::SIGNED_UP: + // Shift collides or user is already signed up: No signup allowed + $entry_list[] = $inner_text; + break; + + case ShiftSignupState::OCCUPIED: + // Shift is full + break; } - break; - - case ShiftSignupState::COLLIDES: - case ShiftSignupState::SIGNED_UP: - // Shift collides or user is already signed up: No signup allowed - $entry_list[] = $inner_text; - break; - - case ShiftSignupState::OCCUPIED: - // Shift is full - break; + + $shifts_row = '<li class="list-group-item">'; + $shifts_row .= '<strong>' . AngelType_name_render($angeltype) . ':</strong> '; + $shifts_row .= join(', ', $entry_list); + $shifts_row .= '</li>'; + return [ + $shift_signup_state, + $shifts_row + ]; } - - $shifts_row = '<li class="list-group-item">'; - $shifts_row .= '<strong>' . AngelType_name_render($angeltype) . ':</strong> '; - $shifts_row .= join(", ", $entry_list); - $shifts_row .= '</li>'; - return [ - $shift_signup_state, - $shifts_row - ]; - } - - /** - * Renders the shift header - * - * @param Shift $shift - * The shift - */ - private function renderShiftHead($shift) { - global $privileges; - - $header_buttons = ""; - if (in_array('admin_shifts', $privileges)) { - $header_buttons = '<div class="pull-right">' . table_buttons([ - 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') - ]) . '</div>'; + + /** + * Renders the shift header + * + * @param array $shift The shift + * @return string + */ + private function renderShiftHead($shift) + { + global $privileges; + + $header_buttons = ''; + if (in_array('admin_shifts', $privileges)) { + $header_buttons = '<div class="pull-right">' . table_buttons([ + 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') + ]) . '</div>'; + } + $shift_heading = date('H:i', $shift['start']) . ' ‐ ' + . date('H:i', $shift['end']) . ' — ' + . $shift['name']; + return div('panel-heading', [ + '<a href="' . shift_link($shift) . '">' . $shift_heading . '</a>', + $header_buttons + ]); } - $shift_heading = date('H:i', $shift['start']) . ' ‐ ' . date('H:i', $shift['end']) . ' — ' . $shift['name']; - return div('panel-heading', [ - '<a href="' . shift_link($shift) . '">' . $shift_heading . '</a>', - $header_buttons - ]); - } } - -?>
\ No newline at end of file diff --git a/includes/view/ShiftEntry_view.php b/includes/view/ShiftEntry_view.php index 5bf10a91..2e638df6 100644 --- a/includes/view/ShiftEntry_view.php +++ b/includes/view/ShiftEntry_view.php @@ -2,36 +2,47 @@ /** * Display form for adding/editing a shift entry. + * * @param string $angel * @param string $date * @param string $location * @param string $title * @param string $type * @param string $comment - * + * @param bool $freeloaded + * @param string $freeload_comment + * @param bool $user_admin_shifts * @return string */ -function ShiftEntry_edit_view($angel, $date, $location, $title, $type, $comment, $freeloaded, $freeload_comment, $user_admin_shifts = false) { - $freeload_form = []; - if ($user_admin_shifts) { - $freeload_form = [ - form_checkbox('freeloaded', _("Freeloaded"), $freeloaded), - form_textarea('freeload_comment', _("Freeload comment (Only for shift coordination):"), $freeload_comment) - ]; - } - return page_with_title(_("Edit shift entry"), [ - msg(), - form([ - form_info(_("Angel:"), $angel), - form_info(_("Date, Duration:"), $date), - form_info(_("Location:"), $location), - form_info(_("Title:"), $title), - form_info(_("Type:"), $type), - form_textarea('comment', _("Comment (for your eyes only):"), $comment), - join("", $freeload_form), - form_submit('submit', _("Save")) - ]) - ]); +function ShiftEntry_edit_view( + $angel, + $date, + $location, + $title, + $type, + $comment, + $freeloaded, + $freeload_comment, + $user_admin_shifts = false +) { + $freeload_form = []; + if ($user_admin_shifts) { + $freeload_form = [ + form_checkbox('freeloaded', _('Freeloaded'), $freeloaded), + form_textarea('freeload_comment', _('Freeload comment (Only for shift coordination):'), $freeload_comment) + ]; + } + return page_with_title(_('Edit shift entry'), [ + msg(), + form([ + form_info(_('Angel:'), $angel), + form_info(_('Date, Duration:'), $date), + form_info(_('Location:'), $location), + form_info(_('Title:'), $title), + form_info(_('Type:'), $type), + form_textarea('comment', _('Comment (for your eyes only):'), $comment), + join('', $freeload_form), + form_submit('submit', _('Save')) + ]) + ]); } - -?>
\ No newline at end of file diff --git a/includes/view/ShiftTypes_view.php b/includes/view/ShiftTypes_view.php index 3e4cccc6..e0750617 100644 --- a/includes/view/ShiftTypes_view.php +++ b/includes/view/ShiftTypes_view.php @@ -1,84 +1,127 @@ <?php -function ShiftType_name_render($shifttype) { - global $privileges; - if (in_array('shifttypes', $privileges)) { - return '<a href="' . shifttype_link($shifttype) . '">' . $shifttype['name'] . '</a>'; - } - return $shifttype['name']; +/** + * @param array $shifttype + * @return string + */ +function ShiftType_name_render($shifttype) +{ + global $privileges; + if (in_array('shifttypes', $privileges)) { + return '<a href="' . shifttype_link($shifttype) . '">' . $shifttype['name'] . '</a>'; + } + return $shifttype['name']; } -function ShiftType_delete_view($shifttype) { - return page_with_title(sprintf(_("Delete shifttype %s"), $shifttype['name']), [ - info(sprintf(_("Do you want to delete shifttype %s?"), $shifttype['name']), true), - buttons([ - button(page_link_to('shifttypes'), _("cancel"), 'cancel'), - button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'] . '&confirmed', _("delete"), 'ok') - ]) - ]); +/** + * @param array $shifttype + * @return string + */ +function ShiftType_delete_view($shifttype) +{ + return page_with_title(sprintf(_('Delete shifttype %s'), $shifttype['name']), [ + info(sprintf(_('Do you want to delete shifttype %s?'), $shifttype['name']), true), + buttons([ + button(page_link_to('shifttypes'), _('cancel'), 'cancel'), + button( + page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'] . '&confirmed', + _('delete'), + 'ok btn-danger' + ) + ]) + ]); } -function ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) { - $angeltypes_select = [ - '' => _('All') - ]; - foreach ($angeltypes as $angeltype) { - $angeltypes_select[$angeltype['id']] = $angeltype['name']; - } - - return page_with_title($shifttype_id ? _('Edit shifttype') : _('Create shifttype'), [ - msg(), - buttons([ - button(page_link_to('shifttypes'), shifttypes_title(), 'back') - ]), - form([ - form_text('name', _('Name'), $name), - form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype_id), - form_textarea('description', _('Description'), $description), - form_info('', _('Please use markdown for the description.')), - form_submit('submit', _('Save')) - ]) - ]); -} +/** + * @param string $name + * @param int $angeltype_id + * @param array[] $angeltypes + * @param string $description + * @param int|bool $shifttype_id + * @return string + */ +function ShiftType_edit_view($name, $angeltype_id, $angeltypes, $description, $shifttype_id) +{ + $angeltypes_select = [ + '' => _('All') + ]; + foreach ($angeltypes as $angeltype) { + $angeltypes_select[$angeltype['id']] = $angeltype['name']; + } -function ShiftType_view($shifttype, $angeltype) { - $parsedown = new Parsedown(); - $title = $shifttype['name']; - if ($angeltype) { - $title .= ' <small>' . sprintf(_('for team %s'), $angeltype['name']) . '</small>'; - } - return page_with_title($title, [ - msg(), - buttons([ - button(page_link_to('shifttypes'), shifttypes_title(), 'back'), - $angeltype ? button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], $angeltype['name']) : '', - button(page_link_to('shifttypes') . '&action=edit&shifttype_id=' . $shifttype['id'], _('edit'), 'edit'), - button(page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], _('delete'), 'delete') - ]), - heading(_("Description"), 2), - $parsedown->parse($shifttype['description']) - ]); + return page_with_title($shifttype_id ? _('Edit shifttype') : _('Create shifttype'), [ + msg(), + buttons([ + button(page_link_to('shifttypes'), shifttypes_title(), 'back') + ]), + form([ + form_text('name', _('Name'), $name), + form_select('angeltype_id', _('Angeltype'), $angeltypes_select, $angeltype_id), + form_textarea('description', _('Description'), $description), + form_info('', _('Please use markdown for the description.')), + form_submit('submit', _('Save')) + ]) + ]); } -function ShiftTypes_list_view($shifttypes) { - foreach ($shifttypes as &$shifttype) { - $shifttype['name'] = '<a href="' . page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id'] . '">' . $shifttype['name'] . '</a>'; - $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=' . $shifttype['id'], _('delete'), 'btn-xs') +/** + * @param array $shifttype + * @param array $angeltype + * @return string + */ +function ShiftType_view($shifttype, $angeltype) +{ + $parsedown = new Parsedown(); + $title = $shifttype['name']; + if ($angeltype) { + $title .= ' <small>' . sprintf(_('for team %s'), $angeltype['name']) . '</small>'; + } + return page_with_title($title, [ + msg(), + buttons([ + button(page_link_to('shifttypes'), shifttypes_title(), 'back'), + $angeltype ? button( + page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], + $angeltype['name'] + ) : '', + button(page_link_to('shifttypes') . '&action=edit&shifttype_id=' . $shifttype['id'], _('edit'), 'edit'), + button( + page_link_to('shifttypes') . '&action=delete&shifttype_id=' . $shifttype['id'], + _('delete'), + 'delete' + ) + ]), + heading(_('Description'), 2), + $parsedown->parse($shifttype['description']) ]); - } - - return page_with_title(shifttypes_title(), [ - msg(), - buttons([ - button(page_link_to('shifttypes') . '&action=edit', _('New shifttype'), 'add') - ]), - table([ - 'name' => _('Name'), - 'actions' => '' - ], $shifttypes) - ]); } -?>
\ No newline at end of file +/** + * @param array[] $shifttypes + * @return string + */ +function ShiftTypes_list_view($shifttypes) +{ + foreach ($shifttypes as &$shifttype) { + $shifttype['name'] = '<a href="' . page_link_to('shifttypes') . '&action=view&shifttype_id=' . $shifttype['id'] . '">' . $shifttype['name'] . '</a>'; + $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=' . $shifttype['id'], + _('delete'), + 'btn-xs' + ) + ]); + } + + return page_with_title(shifttypes_title(), [ + msg(), + buttons([ + button(page_link_to('shifttypes') . '&action=edit', _('New shifttype'), 'add') + ]), + table([ + 'name' => _('Name'), + 'actions' => '' + ], $shifttypes) + ]); +} diff --git a/includes/view/ShiftsFilterRenderer.php b/includes/view/ShiftsFilterRenderer.php index 301f31a2..43a23ef6 100644 --- a/includes/view/ShiftsFilterRenderer.php +++ b/includes/view/ShiftsFilterRenderer.php @@ -2,68 +2,80 @@ namespace Engelsystem; -class ShiftsFilterRenderer { +class ShiftsFilterRenderer +{ + /** + * The shiftFilter to render. + * + * @var ShiftsFilter + */ + private $shiftsFilter; - /** - * The shiftFilter to render. - * - * @var ShiftsFilter - */ - private $shiftsFilter; + /** + * Should the filter display a day selection. + * + * @var boolean + */ + private $daySelectionEnabled = false; - /** - * Should the filter display a day selection. - * - * @var boolean - */ - private $daySelectionEnabled = false; + /** + * Days that can be selected. + * Format Y-m-d + * + * @var string[] + */ + private $days = []; - /** - * Days that can be selected. - * Format Y-m-d - * - * @var string[] - */ - private $days = []; - - public function __construct(ShiftsFilter $shiftsFilter) { - $this->shiftsFilter = $shiftsFilter; - } + /** + * ShiftsFilterRenderer constructor. + * + * @param ShiftsFilter $shiftsFilter + */ + public function __construct(ShiftsFilter $shiftsFilter) + { + $this->shiftsFilter = $shiftsFilter; + } - /** - * Renders the filter. - * - * @return Generated HTML - */ - public function render($link_base) { - $toolbar = []; - if ($this->daySelectionEnabled && ! empty($this->days)) { - $selected_day = date("Y-m-d", $this->shiftsFilter->getStartTime()); - $day_dropdown_items = []; - foreach ($this->days as $day) { - $day_dropdown_items[] = toolbar_item_link($link_base . '&shifts_filter_day=' . $day, '', $day); - } - $toolbar[] = toolbar_dropdown('', $selected_day, $day_dropdown_items, 'active'); + /** + * Renders the filter. + * + * @param string $link_base + * @return string Generated HTML + */ + public function render($link_base) + { + $toolbar = []; + if ($this->daySelectionEnabled && !empty($this->days)) { + $selected_day = date('Y-m-d', $this->shiftsFilter->getStartTime()); + $day_dropdown_items = []; + foreach ($this->days as $day) { + $day_dropdown_items[] = toolbar_item_link($link_base . '&shifts_filter_day=' . $day, '', $day); + } + $toolbar[] = toolbar_dropdown('', $selected_day, $day_dropdown_items, 'active'); + } + return div('form-group', [ + toolbar_pills($toolbar) + ]); } - return div('form-group', [ - toolbar_pills($toolbar) - ]); - } - /** - * Should the filter display a day selection. - */ - public function enableDaySelection($days) { - $this->daySelectionEnabled = true; - $this->days = $days; - } + /** + * Should the filter display a day selection. + * + * @param string[] $days + */ + public function enableDaySelection($days) + { + $this->daySelectionEnabled = true; + $this->days = $days; + } - /** - * Should the filter display a day selection. - */ - public function isDaySelectionEnabled() { - return $this->daySelectionEnabled; - } + /** + * Should the filter display a day selection. + * + * @return bool + */ + public function isDaySelectionEnabled() + { + return $this->daySelectionEnabled; + } } - -?>
\ No newline at end of file diff --git a/includes/view/Shifts_view.php b/includes/view/Shifts_view.php index 765a6f3b..094af7ad 100644 --- a/includes/view/Shifts_view.php +++ b/includes/view/Shifts_view.php @@ -1,163 +1,232 @@ <?php use Engelsystem\ShiftSignupState; -function Shift_editor_info_render($shift) { - $info = []; - if ($shift['created_by_user_id'] != null) { - $info[] = sprintf(glyph('plus') . _("created at %s by %s"), date('Y-m-d H:i', $shift['created_at_timestamp']), User_Nick_render(User($shift['created_by_user_id']))); - } - if ($shift['edited_by_user_id'] != null) { - $info[] = sprintf(glyph('pencil') . _("edited at %s by %s"), date('Y-m-d H:i', $shift['edited_at_timestamp']), User_Nick_render(User($shift['edited_by_user_id']))); - } - return join('<br />', $info); +/** + * @param array $shift + * @return string + */ +function Shift_editor_info_render($shift) +{ + $info = []; + if ($shift['created_by_user_id'] != null) { + $info[] = sprintf( + glyph('plus') . _('created at %s by %s'), + date('Y-m-d H:i', $shift['created_at_timestamp']), + User_Nick_render(User($shift['created_by_user_id'])) + ); + } + if ($shift['edited_by_user_id'] != null) { + $info[] = sprintf( + glyph('pencil') . _('edited at %s by %s'), + date('Y-m-d H:i', $shift['edited_at_timestamp']), + User_Nick_render(User($shift['edited_by_user_id'])) + ); + } + return join('<br />', $info); } -function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null) { - global $user; - - if ($user_angeltype == null) { - $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); - } - - if ($angeltype['shift_signup_state']->isSignupAllowed()) { - return button(page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], _('Sign up')); - } elseif ($user_angeltype == null) { - return button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], sprintf(_('Become %s'), $angeltype['name'])); - } - return ''; +/** + * @param array $shift + * @param array $angeltype + * @param array $user_angeltype + * @return string + */ +function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null) +{ + global $user; + + if ($user_angeltype == null) { + $user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype); + } + + if ($angeltype['shift_signup_state']->isSignupAllowed()) { + return button( + page_link_to('user_shifts') . '&shift_id=' . $shift['SID'] . '&type_id=' . $angeltype['id'], + _('Sign up') + ); + } elseif ($user_angeltype == null) { + return button( + page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], + sprintf(_('Become %s'), + $angeltype['name']) + ); + } + return ''; } -function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupState $shift_signup_state) { - global $privileges; - - $shift_admin = in_array('admin_shifts', $privileges); - $user_shift_admin = in_array('user_shifts_admin', $privileges); - $admin_rooms = in_array('admin_rooms', $privileges); - $admin_shifttypes = in_array('shifttypes', $privileges); - - $parsedown = new Parsedown(); - - $angeltypes = []; - foreach ($angeltypes_source as $angeltype) { - $angeltypes[$angeltype['id']] = $angeltype; - } - - $needed_angels = ''; - foreach ($shift['NeedAngels'] as $needed_angeltype) { - $needed_angels .= Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin); - } - - return page_with_title($shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', [ - msg(), - $shift_signup_state->getState() == ShiftSignupState::COLLIDES ? info(_('This shift collides with one of your shifts.'), true) : '', - $shift_signup_state->getState() == ShiftSignupState::SIGNED_UP ? info(_('You are signed up for this shift.'), true) : '', - ($shift_admin || $admin_shifttypes || $admin_rooms) ? buttons([ - $shift_admin ? button(shift_edit_link($shift), glyph('pencil') . _('edit')) : '', - $shift_admin ? button(shift_delete_link($shift), glyph('trash') . _('delete')) : '', - $admin_shifttypes ? button(shifttype_link($shifttype), $shifttype['name']) : '', - $admin_rooms ? button(room_link($room), glyph('map-marker') . $room['Name']) : '' - ]) : '', - div('row', [ - div('col-sm-3 col-xs-6', [ - '<h4>' . _('Title') . '</h4>', - '<p class="lead">' . ($shift['URL'] != '' ? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>' : $shift['title']) . '</p>' - ]), - div('col-sm-3 col-xs-6', [ - '<h4>' . _('Start') . '</h4>', - '<p class="lead' . (time() >= $shift['start'] ? ' text-success' : '') . '">', - glyph('calendar') . date(_('Y-m-d'), $shift['start']), - '<br />', - glyph('time') . date('H:i', $shift['start']), - '</p>' - ]), - div('col-sm-3 col-xs-6', [ - '<h4>' . _('End') . '</h4>', - '<p class="lead' . (time() >= $shift['end'] ? ' text-success' : '') . '">', - glyph('calendar') . date(_('Y-m-d'), $shift['end']), - '<br />', - glyph('time') . date('H:i', $shift['end']), - '</p>' - ]), - div('col-sm-3 col-xs-6', [ - '<h4>' . _('Location') . '</h4>', - '<p class="lead">' . Room_name_render($room) . '</p>' - ]) - ]), - div('row', [ - div('col-sm-6', [ - '<h2>' . _('Needed angels') . '</h2>', - '<div class="list-group">' . $needed_angels . '</div>' - ]), - div('col-sm-6', [ - '<h2>' . _('Description') . '</h2>', - $parsedown->parse($shifttype['description']) - ]) - ]), - $shift_admin ? Shift_editor_info_render($shift) : '' - ]); +/** + * @param array $shift + * @param array $shifttype + * @param array $room + * @param array[] $angeltypes_source + * @param ShiftSignupState $shift_signup_state + * @return string + */ +function Shift_view($shift, $shifttype, $room, $angeltypes_source, ShiftSignupState $shift_signup_state) +{ + global $privileges; + + $shift_admin = in_array('admin_shifts', $privileges); + $user_shift_admin = in_array('user_shifts_admin', $privileges); + $admin_rooms = in_array('admin_rooms', $privileges); + $admin_shifttypes = in_array('shifttypes', $privileges); + + $parsedown = new Parsedown(); + + $angeltypes = []; + foreach ($angeltypes_source as $angeltype) { + $angeltypes[$angeltype['id']] = $angeltype; + } + + $needed_angels = ''; + foreach ($shift['NeedAngels'] as $needed_angeltype) { + $needed_angels .= Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin); + } + + return page_with_title( + $shift['name'] . ' <small class="moment-countdown" data-timestamp="' . $shift['start'] . '">%c</small>', + [ + msg(), + $shift_signup_state->getState() == ShiftSignupState::COLLIDES + ? info(_('This shift collides with one of your shifts.'), true) + : '', + $shift_signup_state->getState() == ShiftSignupState::SIGNED_UP + ? info(_('You are signed up for this shift.'), true) + : '', + ($shift_admin || $admin_shifttypes || $admin_rooms) ? buttons([ + $shift_admin ? button(shift_edit_link($shift), glyph('pencil') . _('edit')) : '', + $shift_admin ? button(shift_delete_link($shift), glyph('trash') . _('delete')) : '', + $admin_shifttypes ? button(shifttype_link($shifttype), $shifttype['name']) : '', + $admin_rooms ? button(room_link($room), glyph('map-marker') . $room['Name']) : '' + ]) : '', + div('row', [ + div('col-sm-3 col-xs-6', [ + '<h4>' . _('Title') . '</h4>', + '<p class="lead">' . ($shift['URL'] != '' ? '<a href="' . $shift['URL'] . '">' . $shift['title'] . '</a>' : $shift['title']) . '</p>' + ]), + div('col-sm-3 col-xs-6', [ + '<h4>' . _('Start') . '</h4>', + '<p class="lead' . (time() >= $shift['start'] ? ' text-success' : '') . '">', + glyph('calendar') . date(_('Y-m-d'), $shift['start']), + '<br />', + glyph('time') . date('H:i', $shift['start']), + '</p>' + ]), + div('col-sm-3 col-xs-6', [ + '<h4>' . _('End') . '</h4>', + '<p class="lead' . (time() >= $shift['end'] ? ' text-success' : '') . '">', + glyph('calendar') . date(_('Y-m-d'), $shift['end']), + '<br />', + glyph('time') . date('H:i', $shift['end']), + '</p>' + ]), + div('col-sm-3 col-xs-6', [ + '<h4>' . _('Location') . '</h4>', + '<p class="lead">' . Room_name_render($room) . '</p>' + ]) + ]), + div('row', [ + div('col-sm-6', [ + '<h2>' . _('Needed angels') . '</h2>', + '<div class="list-group">' . $needed_angels . '</div>' + ]), + div('col-sm-6', [ + '<h2>' . _('Description') . '</h2>', + $parsedown->parse($shifttype['description']) + ]) + ]), + $shift_admin ? Shift_editor_info_render($shift) : '' + ] + ); } -function Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin) { - global $user; - - $angeltype = $angeltypes[$needed_angeltype['TID']]; - $angeltype_supporter = User_is_AngelType_supporter($user, $angeltype); - - $needed_angels = ''; - - $class = 'progress-bar-warning'; - if ($needed_angeltype['taken'] == 0) { - $class = 'progress-bar-danger'; - } - if ($needed_angeltype['taken'] >= $needed_angeltype['count']) { - $class = 'progress-bar-success'; - } - $needed_angels .= '<div class="list-group-item">'; - - $needed_angels .= '<div class="pull-right">' . Shift_signup_button_render($shift, $angeltype) . '</div>'; - - $needed_angels .= '<h3>' . AngelType_name_render($angeltype) . '</h3>'; - $bar_max = max($needed_angeltype['count'] * 10, $needed_angeltype['taken'] * 10, 10); - $bar_value = max(1, $needed_angeltype['taken'] * 10); - $needed_angels .= progress_bar(0, $bar_max, $bar_value, $class, $needed_angeltype['taken'] . ' / ' . $needed_angeltype['count']); - - $angels = []; - foreach ($shift['ShiftEntry'] as $shift_entry) { - if ($shift_entry['TID'] == $needed_angeltype['TID']) { - $angels[] = Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angeltype_supporter); +/** + * @param array $needed_angeltype + * @param array $angeltypes + * @param array[] $shift + * @param bool $user_shift_admin + * @return string + */ +function Shift_view_render_needed_angeltype($needed_angeltype, $angeltypes, $shift, $user_shift_admin) +{ + global $user; + + $angeltype = $angeltypes[$needed_angeltype['TID']]; + $angeltype_supporter = User_is_AngelType_supporter($user, $angeltype); + + $needed_angels = ''; + + $class = 'progress-bar-warning'; + if ($needed_angeltype['taken'] == 0) { + $class = 'progress-bar-danger'; } - } - - $needed_angels .= join(', ', $angels); - $needed_angels .= '</div>'; - - return $needed_angels; + if ($needed_angeltype['taken'] >= $needed_angeltype['count']) { + $class = 'progress-bar-success'; + } + $needed_angels .= '<div class="list-group-item">'; + + $needed_angels .= '<div class="pull-right">' . Shift_signup_button_render($shift, $angeltype) . '</div>'; + + $needed_angels .= '<h3>' . AngelType_name_render($angeltype) . '</h3>'; + $bar_max = max($needed_angeltype['count'] * 10, $needed_angeltype['taken'] * 10, 10); + $bar_value = max(1, $needed_angeltype['taken'] * 10); + $needed_angels .= progress_bar( + 0, + $bar_max, + $bar_value, + $class, + $needed_angeltype['taken'] . ' / ' . $needed_angeltype['count'] + ); + + $angels = []; + foreach ($shift['ShiftEntry'] as $shift_entry) { + if ($shift_entry['TID'] == $needed_angeltype['TID']) { + $angels[] = Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angeltype_supporter); + } + } + + $needed_angels .= join(', ', $angels); + $needed_angels .= '</div>'; + + return $needed_angels; } -function Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angeltype_supporter) { - $entry = User_Nick_render(User($shift_entry['UID'])); - if ($shift_entry['freeloaded']) { - $entry = '<strike>' . $entry . '</strike>'; - } - if ($user_shift_admin || $angeltype_supporter) { - $entry .= ' <div class="btn-group">'; - if ($user_shift_admin) { - $entry .= button_glyph(page_link_to('user_myshifts') . '&edit=' . $shift_entry['id'] . '&id=' . $shift_entry['UID'], 'pencil', 'btn-xs'); +/** + * @param array $shift_entry + * @param bool $user_shift_admin + * @param bool $angeltype_supporter + * @return string + */ +function Shift_view_render_shift_entry($shift_entry, $user_shift_admin, $angeltype_supporter) +{ + $entry = User_Nick_render(User($shift_entry['UID'])); + if ($shift_entry['freeloaded']) { + $entry = '<del>' . $entry . '</del>'; + } + if ($user_shift_admin || $angeltype_supporter) { + $entry .= ' <div class="btn-group">'; + if ($user_shift_admin) { + $entry .= button_glyph( + page_link_to('user_myshifts') . '&edit=' . $shift_entry['id'] . '&id=' . $shift_entry['UID'], + 'pencil', + 'btn-xs' + ); + } + $entry .= button_glyph(page_link_to('user_shifts') . '&entry_id=' . $shift_entry['id'], 'trash', 'btn-xs'); + $entry .= '</div>'; } - $entry .= button_glyph(page_link_to('user_shifts') . '&entry_id=' . $shift_entry['id'], 'trash', 'btn-xs'); - $entry .= '</div>'; - } - return $entry; + return $entry; } /** * Calc shift length in format 12:23h. * - * @param Shift $shift + * @param array $shift + * @return string */ -function shift_length($shift) { - $length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ":"; - $length .= str_pad((($shift['end'] - $shift['start']) % (60 * 60)) / 60, 2, "0", STR_PAD_LEFT) . "h"; - return $length; +function shift_length($shift) +{ + $length = floor(($shift['end'] - $shift['start']) / (60 * 60)) . ':'; + $length .= str_pad((($shift['end'] - $shift['start']) % (60 * 60)) / 60, 2, '0', STR_PAD_LEFT) . 'h'; + return $length; } -?> diff --git a/includes/view/UserAngelTypes_view.php b/includes/view/UserAngelTypes_view.php index da4a2352..15d99961 100644 --- a/includes/view/UserAngelTypes_view.php +++ b/includes/view/UserAngelTypes_view.php @@ -1,88 +1,164 @@ <?php -function UserAngelType_update_view($user_angeltype, $user, $angeltype, $supporter) { - return page_with_title($supporter ? _("Add supporter rights") : _("Remove supporter rights"), [ - msg(), - info(sprintf($supporter ? _("Do you really want to add supporter rights for %s to %s?") : _("Do you really want to remove supporter rights for %s from %s?"), $angeltype['name'], User_Nick_render($user)), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=update&user_angeltype_id=' . $user_angeltype['id'] . '&supporter=' . ($supporter ? '1' : '0') . '&confirmed', _("yes"), 'ok') - ]) - ]); +/** + * @param array $user_angeltype + * @param array $user + * @param array $angeltype + * @param bool $supporter + * @return string + */ +function UserAngelType_update_view($user_angeltype, $user, $angeltype, $supporter) +{ + return page_with_title($supporter ? _('Add supporter rights') : _('Remove supporter rights'), [ + msg(), + info(sprintf( + $supporter + ? _('Do you really want to add supporter rights for %s to %s?') + : _('Do you really want to remove supporter rights for %s from %s?'), + $angeltype['name'], + User_Nick_render($user) + ), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') + . '&action=update&user_angeltype_id=' . $user_angeltype['id'] + . '&supporter=' . ($supporter ? '1' : '0') + . '&confirmed', + _('yes'), + 'ok' + ) + ]) + ]); } -function UserAngelTypes_delete_all_view($angeltype) { - return page_with_title(_("Deny all users"), [ - msg(), - info(sprintf(_("Do you really want to deny all users for %s?"), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'] . '&confirmed', _("yes"), 'ok') - ]) - ]); +/** + * @param array $angeltype + * @return string + */ +function UserAngelTypes_delete_all_view($angeltype) +{ + return page_with_title(_('Deny all users'), [ + msg(), + info(sprintf(_('Do you really want to deny all users for %s?'), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') . '&action=delete_all&angeltype_id=' . $angeltype['id'] . '&confirmed', + _('yes'), + 'ok' + ) + ]) + ]); } -function UserAngelTypes_confirm_all_view($angeltype) { - return page_with_title(_("Confirm all users"), [ - msg(), - info(sprintf(_("Do you really want to confirm all users for %s?"), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'] . '&confirmed', _("yes"), 'ok') - ]) - ]); +/** + * @param array $angeltype + * @return string + */ +function UserAngelTypes_confirm_all_view($angeltype) +{ + return page_with_title(_('Confirm all users'), [ + msg(), + info(sprintf(_('Do you really want to confirm all users for %s?'), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') . '&action=confirm_all&angeltype_id=' . $angeltype['id'] . '&confirmed', + _('yes'), + 'ok' + ) + ]) + ]); } -function UserAngelType_confirm_view($user_angeltype, $user, $angeltype) { - return page_with_title(_("Confirm angeltype for user"), [ - msg(), - info(sprintf(_("Do you really want to confirm %s for %s?"), User_Nick_render($user), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=confirm&user_angeltype_id=' . $user_angeltype['id'] . '&confirmed', _("yes"), 'ok') - ]) - ]); +/** + * @param array $user_angeltype + * @param array $user + * @param array $angeltype + * @return string + */ +function UserAngelType_confirm_view($user_angeltype, $user, $angeltype) +{ + return page_with_title(_('Confirm angeltype for user'), [ + msg(), + info(sprintf(_('Do you really want to confirm %s for %s?'), User_Nick_render($user), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') . '&action=confirm&user_angeltype_id=' . $user_angeltype['id'] . '&confirmed', + _('yes'), + 'ok' + ) + ]) + ]); } -function UserAngelType_delete_view($user_angeltype, $user, $angeltype) { - return page_with_title(_("Remove angeltype"), [ - msg(), - info(sprintf(_("Do you really want to delete %s from %s?"), User_Nick_render($user), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'] . '&confirmed', _("yes"), 'ok') - ]) - ]); +/** + * @param array $user_angeltype + * @param array $user + * @param array $angeltype + * @return string + */ +function UserAngelType_delete_view($user_angeltype, $user, $angeltype) +{ + return page_with_title(_('Remove angeltype'), [ + msg(), + info(sprintf(_('Do you really want to delete %s from %s?'), User_Nick_render($user), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') . '&action=delete&user_angeltype_id=' . $user_angeltype['id'] . '&confirmed', + _('yes'), + 'ok' + ) + ]) + ]); } -function UserAngelType_add_view($angeltype, $users_source, $user_id) { - $users = []; - foreach ($users_source as $user_source) { - $users[$user_source['UID']] = User_Nick_render($user_source); - } - - return page_with_title(_("Add user to angeltype"), [ - msg(), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("back"), 'back') - ]), - form([ - form_info(_("Angeltype"), $angeltype['name']), - form_select('user_id', _("User"), $users, $user_id), - form_submit('submit', _("Add")) - ]) - ]); -} +/** + * @param array $angeltype + * @param array[] $users_source + * @param int $user_id + * @return string + */ +function UserAngelType_add_view($angeltype, $users_source, $user_id) +{ + $users = []; + foreach ($users_source as $user_source) { + $users[$user_source['UID']] = User_Nick_render($user_source); + } -function UserAngelType_join_view($user, $angeltype) { - return page_with_title(sprintf(_("Become a %s"), $angeltype['name']), [ - msg(), - info(sprintf(_("Do you really want to add %s to %s?"), User_Nick_render($user), $angeltype['name']), true), - buttons([ - button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _("cancel"), 'cancel'), - button(page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'] . '&user_id=' . $user['UID'] . '&confirmed', _("save"), 'ok') - ]) - ]); + return page_with_title(_('Add user to angeltype'), [ + msg(), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('back'), 'back') + ]), + form([ + form_info(_('Angeltype'), $angeltype['name']), + form_select('user_id', _('User'), $users, $user_id), + form_submit('submit', _('Add')) + ]) + ]); } -?>
\ No newline at end of file +/** + * @param array $user + * @param array $angeltype + * @return string + */ +function UserAngelType_join_view($user, $angeltype) +{ + return page_with_title(sprintf(_('Become a %s'), $angeltype['name']), [ + msg(), + info(sprintf(_('Do you really want to add %s to %s?'), User_Nick_render($user), $angeltype['name']), true), + buttons([ + button(page_link_to('angeltypes') . '&action=view&angeltype_id=' . $angeltype['id'], _('cancel'), 'cancel'), + button( + page_link_to('user_angeltypes') . '&action=add&angeltype_id=' . $angeltype['id'] . '&user_id=' . $user['UID'] . '&confirmed', + _('save'), + 'ok' + ) + ]) + ]); +} diff --git a/includes/view/UserDriverLicenses_view.php b/includes/view/UserDriverLicenses_view.php index 3c0eaf8d..dce08c29 100644 --- a/includes/view/UserDriverLicenses_view.php +++ b/includes/view/UserDriverLicenses_view.php @@ -3,45 +3,60 @@ /** * Edit a user's driving license information. * - * @param User $user_source - * The user - * @param bool $wants_to_drive - * true, if the user wants to drive - * @param UserDriverLicense $user_driver_license - * The user driver license + * @param array $user_source The user + * @param bool $wants_to_drive true, if the user wants to drive + * @param array $user_driver_license The user driver license * @return string */ -function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) { - return page_with_title(sprintf(_("Edit %s driving license information"), User_Nick_render($user_source)), [ - buttons([ - button(user_link($user_source), _("Back to profile"), 'back') - ]), - msg(), - form([ - form_info(_("Privacy"), _("Your driving license information is only visible for supporters and admins.")), - form_checkbox('wants_to_drive', _("I am willing to drive a car for the event"), $wants_to_drive), - div('panel panel-default', [ - div('panel-body', [ - form_checkbox('has_car', _("I have my own car with me and am willing to use it for the event (You'll get reimbursed for fuel)"), $user_driver_license['has_car']), - heading(_("Driver license"), 3), - form_checkbox('has_license_car', _("Car"), $user_driver_license['has_license_car']), - form_checkbox('has_license_3_5t_transporter', _("Transporter 3,5t"), $user_driver_license['has_license_3_5t_transporter']), - form_checkbox('has_license_7_5t_truck', _("Truck 7,5t"), $user_driver_license['has_license_7_5t_truck']), - form_checkbox('has_license_12_5t_truck', _("Truck 12,5t"), $user_driver_license['has_license_12_5t_truck']), - form_checkbox('has_license_forklift', _("Forklift"), $user_driver_license['has_license_forklift']) - ]) - ], 'driving_license'), - form_submit('submit', _("Save")) - ]), - '<script type="text/javascript"> +function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver_license) +{ + return page_with_title(sprintf(_('Edit %s driving license information'), User_Nick_render($user_source)), [ + buttons([ + button(user_link($user_source), _('Back to profile'), 'back') + ]), + msg(), + form([ + form_info(_('Privacy'), _('Your driving license information is only visible for supporters and admins.')), + form_checkbox('wants_to_drive', _('I am willing to operate cars for the PL'), $wants_to_drive), + div('panel panel-default', [ + div('panel-body', [ + form_checkbox( + 'has_car', + _('I have my own car with me and am willing to use it for the PL (You\'ll get reimbursed for fuel)'), + $user_driver_license['has_car'] + ), + heading(_('Driver license'), 3), + form_checkbox('has_license_car', _('Car'), $user_driver_license['has_license_car']), + form_checkbox( + 'has_license_3_5t_transporter', + _('Transporter 3,5t'), + $user_driver_license['has_license_3_5t_transporter'] + ), + form_checkbox( + 'has_license_7_5t_truck', + _('Truck 7,5t'), + $user_driver_license['has_license_7_5t_truck'] + ), + form_checkbox( + 'has_license_12_5t_truck', + _('Truck 12,5t'), + $user_driver_license['has_license_12_5t_truck'] + ), + form_checkbox('has_license_forklift', _('Forklift'), $user_driver_license['has_license_forklift']) + ]) + ], 'driving_license'), + form_submit('submit', _('Save')) + ]), + '<script type="text/javascript"> $(function() { - if($("#wants_to_drive").is(":checked")) + var checkbox = $("#wants_to_drive"); + if(checkbox.is(":checked")) $("#driving_license").show(); else $("#driving_license").hide(); - - $("#wants_to_drive").click( - function(e) { + + checkbox.click( + function() { if($("#wants_to_drive").is(":checked")) $("#driving_license").show(); else @@ -49,8 +64,6 @@ function UserDriverLicense_edit_view($user_source, $wants_to_drive, $user_driver } ); }); - </script>' - ]); + </script>' + ]); } - -?>
\ No newline at end of file diff --git a/includes/view/UserHintsRenderer.php b/includes/view/UserHintsRenderer.php index cf4b1414..aac8ecfd 100644 --- a/includes/view/UserHintsRenderer.php +++ b/includes/view/UserHintsRenderer.php @@ -2,58 +2,65 @@ namespace Engelsystem; -class UserHintsRenderer { +class UserHintsRenderer +{ + /** @var string[] */ + private $hints = []; - private $hints = []; + private $important = false; - private $important = false; + /** + * Render the added hints to a popover for the toolbar. + * + * @return string + */ + public function render() + { + if (count($this->hints) > 0) { + $hint_class = $this->important ? 'danger' : 'info'; + $glyphicon = $this->important ? 'warning-sign' : 'info-sign'; - /** - * Render the added hints to a popover for the toolbar. - */ - public function render() { - if (count($this->hints) > 0) { - $hint_class = $this->important ? 'danger' : 'info'; - $glyphicon = $this->important ? 'warning-sign' : 'info-sign'; - - return toolbar_popover($glyphicon . ' text-' . $hint_class, '', $this->hints, 'bg-' . $hint_class); + return toolbar_popover($glyphicon . ' text-' . $hint_class, '', $this->hints, 'bg-' . $hint_class); + } + + return ''; } - - return ''; - } - - /** - * Add a hint to the list, if its not null and a not empty string. - * - * @param string $hint - * The hint - * @param boolean $important - * Is the hint important? - */ - public function addHint($hint, $important = false) { - if ($hint != null && $hint != '') { - if ($important) { - $this->important = true; - $this->hints[] = error($hint, true); - } else { - $this->hints[] = info($hint, true); - } + + /** + * Add a hint to the list, if its not null and a not empty string. + * + * @param string $hint The hint + * @param boolean $important Is the hint important? + */ + public function addHint($hint, $important = false) + { + if ($hint != null && $hint != '') { + if ($important) { + $this->important = true; + $this->hints[] = error($hint, true); + } else { + $this->hints[] = info($hint, true); + } + } } - } - - /** - * Get all hints. - */ - public function getHints() { - return $this->hints; - } - - /** - * Are there important hints? This leads to a more intensive icon. - */ - public function isImportant() { - return $this->important; - } -} -?>
\ No newline at end of file + /** + * Get all hints. + * + * @return string[] + */ + public function getHints() + { + return $this->hints; + } + + /** + * Are there important hints? This leads to a more intensive icon. + * + * @return bool + */ + public function isImportant() + { + return $this->important; + } +} diff --git a/includes/view/User_view.php b/includes/view/User_view.php index 65cb36b3..932614a7 100644 --- a/includes/view/User_view.php +++ b/includes/view/User_view.php @@ -1,494 +1,687 @@ <?php /** - * Available T-Shirt sizes - */ -$tshirt_sizes = [ - '' => _("Please select..."), - 'S' => "S", - 'M' => "M", - 'L' => "L", - 'XL' => "XL", - '2XL' => "2XL", - '3XL' => "3XL", - '4XL' => "4XL", - '5XL' => "5XL", - 'S-G' => "S Girl", - 'M-G' => "M Girl", - 'L-G' => "L Girl", - 'XL-G' => "XL Girl" -]; - -/** * Renders user settings page * - * @param User $user_source - * The user - * @param array<String> $locales - * Available languages - * @param array<String> $themes - * Available themes + * @param array $user_source The user + * @param array $locales Available languages + * @param array $themes Available themes + * @param int $buildup_start_date Unix timestamp + * @param int $teardown_end_date Unix timestamp + * @param bool $enable_tshirt_size + * @param array $tshirt_sizes + * @return string */ -function User_settings_view($user_source, $locales, $themes, $buildup_start_date, $teardown_end_date, $enable_tshirt_size, $tshirt_sizes) { - return page_with_title(settings_title(), [ - msg(), - div('row', [ - div('col-md-6', [ - form([ - form_info('', _("Here you can change your user details.")), - form_info(entry_required() . ' = ' . _("Entry required!")), - form_text('nick', _("Nick"), $user_source['Nick'], true), - form_text('lastname', _("Last name"), $user_source['Name']), - form_text('prename', _("First name"), $user_source['Vorname']), - form_date('planned_arrival_date', _("Planned date of arrival") . ' ' . entry_required(), $user_source['planned_arrival_date'], $buildup_start_date, $teardown_end_date), - form_date('planned_departure_date', _("Planned date of departure"), $user_source['planned_departure_date'], $buildup_start_date, $teardown_end_date), - form_text('age', _("Age"), $user_source['Alter']), - form_text('tel', _("Phone"), $user_source['Telefon']), - form_text('dect', _("DECT"), $user_source['DECT']), - form_text('mobile', _("Mobile"), $user_source['Handy']), - form_text('mail', _("E-Mail") . ' ' . entry_required(), $user_source['email']), - form_checkbox('email_shiftinfo', _("The engelsystem is allowed to send me an email (e.g. when my shifts change)"), $user_source['email_shiftinfo']), - form_checkbox('email_by_human_allowed', _("Humans are allowed to send me an email (e.g. for ticket vouchers)"), $user_source['email_by_human_allowed']), - form_text('jabber', _("Jabber"), $user_source['jabber']), - form_text('hometown', _("Hometown"), $user_source['Hometown']), - $enable_tshirt_size ? form_select('tshirt_size', _("Shirt size"), $tshirt_sizes, $user_source['Size']) : '', - form_info('', _('Please visit the angeltypes page to manage your angeltypes.')), - form_submit('submit', _("Save")) - ]) - ]), - div('col-md-6', [ - form([ - form_info(_("Here you can change your password.")), - form_password('password', _("Old password:")), - form_password('new_password', _("New password:")), - form_password('new_password2', _("Password confirmation:")), - form_submit('submit_password', _("Save")) - ]), - form([ - form_info(_("Here you can choose your color settings:")), - form_select('theme', _("Color settings:"), $themes, $user_source['color']), - form_submit('submit_theme', _("Save")) - ]), - form([ - form_info(_("Here you can choose your language:")), - form_select('language', _("Language:"), $locales, $user_source['Sprache']), - form_submit('submit_language', _("Save")) - ]) - ]) - ]) - ]); +function User_settings_view( + $user_source, + $locales, + $themes, + $buildup_start_date, + $teardown_end_date, + $enable_tshirt_size, + $tshirt_sizes +) { + return page_with_title(settings_title(), [ + msg(), + div('row', [ + div('col-md-6', [ + form([ + form_info('', _('Here you can change your user details.')), + form_info(entry_required() . ' = ' . _('Entry required!')), + form_text('nick', _('Nick'), $user_source['Nick'], true), + form_text('lastname', _('Last name'), $user_source['Name']), + form_text('prename', _('First name'), $user_source['Vorname']), + form_date( + 'planned_arrival_date', + _('Planned date of arrival') . ' ' . entry_required(), + $user_source['planned_arrival_date'], + $buildup_start_date, + $teardown_end_date + ), + form_date( + 'planned_departure_date', + _('Planned date of departure'), + $user_source['planned_departure_date'], + $buildup_start_date, + $teardown_end_date + ), + form_text('age', _('Age'), $user_source['Alter']), + form_text('tel', _('Phone'), $user_source['Telefon']), + form_text('dect', _('DECT'), $user_source['DECT']), + form_text('mobile', _('Mobile'), $user_source['Handy']), + form_text('mail', _('E-Mail') . ' ' . entry_required(), $user_source['email']), + form_checkbox( + 'email_shiftinfo', + _('The engelsystem is allowed to send me an email (e.g. when my shifts change)'), + $user_source['email_shiftinfo'] + ), + form_checkbox( + 'email_by_human_allowed', + _('Humans are allowed to send me an email (e.g. for ticket vouchers)'), + $user_source['email_by_human_allowed'] + ), + form_text('jabber', _('Jabber'), $user_source['jabber']), + form_text('hometown', _('Hometown'), $user_source['Hometown']), + $enable_tshirt_size ? form_select( + 'tshirt_size', + _('Shirt size'), + $tshirt_sizes, + $user_source['Size'] + ) : '', + form_info('', _('Please visit the angeltypes page to manage your angeltypes.')), + form_submit('submit', _('Save')) + ]) + ]), + div('col-md-6', [ + form([ + form_info(_('Here you can change your password.')), + form_password('password', _('Old password:')), + form_password('new_password', _('New password:')), + form_password('new_password2', _('Password confirmation:')), + form_submit('submit_password', _('Save')) + ]), + form([ + form_info(_('Here you can choose your color settings:')), + form_select('theme', _('Color settings:'), $themes, $user_source['color']), + form_submit('submit_theme', _('Save')) + ]), + form([ + form_info(_('Here you can choose your language:')), + form_select('language', _('Language:'), $locales, $user_source['Sprache']), + form_submit('submit_language', _('Save')) + ]) + ]) + ]) + ]); } /** * Displays the welcome message to the user and shows a login form. + * + * @param string $event_welcome_message + * @return string */ -function User_registration_success_view($event_welcome_message) { - $parsedown = new Parsedown(); - $event_welcome_message = $parsedown->text($event_welcome_message); - return page_with_title(_("Registration successful"), [ - msg(), - div('row', [ - div('col-md-4', [ - $event_welcome_message - ]), - div('col-md-4', [ - '<h2>' . _("Login") . '</h2>', - form([ - form_text('nick', _("Nick"), ""), - form_password('password', _("Password")), - form_submit('submit', _("Login")), - buttons([ - button(page_link_to('user_password_recovery'), _("I forgot my password")) - ]), - info(_("Please note: You have to activate cookies!"), true) - ], page_link_to('login')) - ]), - div('col-md-4', [ - '<h2>' . _("What can I do?") . '</h2>', - '<p>' . _("Please read about the jobs you can do to help us.") . '</p>', - buttons([ - button(page_link_to('angeltypes') . '&action=about', _("Teams/Job description") . ' »') - ]) - ]) - ]) - ]); +function User_registration_success_view($event_welcome_message) +{ + $parsedown = new Parsedown(); + $event_welcome_message = $parsedown->text($event_welcome_message); + return page_with_title(_('Registration successful'), [ + msg(), + div('row', [ + div('col-md-4', [ + $event_welcome_message + ]), + div('col-md-4', [ + '<h2>' . _('Login') . '</h2>', + form([ + form_text('nick', _('Nick'), ''), + form_password('password', _('Password')), + form_submit('submit', _('Login')), + buttons([ + button(page_link_to('user_password_recovery'), _('I forgot my password')) + ]), + info(_('Please note: You have to activate cookies!'), true) + ], page_link_to('login')) + ]), + div('col-md-4', [ + '<h2>' . _('What can I do?') . '</h2>', + '<p>' . _('Please read about the jobs you can do to help us.') . '</p>', + buttons([ + button(page_link_to('angeltypes') . '&action=about', _('Teams/Job description') . ' »') + ]) + ]) + ]) + ]); } /** * Gui for deleting user with password field. + * + * @param array $user + * @return string */ -function User_delete_view($user) { - return page_with_title(sprintf(_("Delete %s"), User_Nick_render($user)), [ - msg(), - buttons([ - button(user_edit_link($user), glyph('chevron-left') . _("back")) - ]), - error(_("Do you really want to delete the user including all his shifts and every other piece of his data?"), true), - form([ - form_password('password', _("Your password")), - form_submit('submit', _("Delete")) - ]) - ]); +function User_delete_view($user) +{ + return page_with_title(sprintf(_('Delete %s'), User_Nick_render($user)), [ + msg(), + buttons([ + button(user_edit_link($user), glyph('chevron-left') . _('back')) + ]), + error( + _('Do you really want to delete the user including all his shifts and every other piece of his data?'), + true + ), + form([ + form_password('password', _('Your password')), + form_submit('submit', _('Delete')) + ]) + ]); } /** * View for editing the number of given vouchers + * + * @param array $user + * @return string */ -function User_edit_vouchers_view($user) { - return page_with_title(sprintf(_("%s's vouchers"), User_Nick_render($user)), [ - msg(), - buttons([ - button(user_link($user), glyph('chevron-left') . _("back")) - ]), - info(sprintf(_("Angel should receive at least %d vouchers."), User_get_eligable_voucher_count($user)), true), - form([ - form_spinner('vouchers', _("Number of vouchers given out"), $user['got_voucher']), - form_submit('submit', _("Save")) - ], page_link_to('users') . '&action=edit_vouchers&user_id=' . $user['UID']) - ]); +function User_edit_vouchers_view($user) +{ + return page_with_title(sprintf(_('%s\'s vouchers'), User_Nick_render($user)), [ + msg(), + buttons([ + button(user_link($user), glyph('chevron-left') . _('back')) + ]), + info(sprintf(_('Angel should receive at least %d vouchers.'), User_get_eligable_voucher_count($user)), true), + form([ + form_spinner('vouchers', _('Number of vouchers given out'), $user['got_voucher']), + form_submit('submit', _('Save')) + ], page_link_to('users') . '&action=edit_vouchers&user_id=' . $user['UID']) + ]); } -function Users_view($users, $order_by, $arrived_count, $active_count, $force_active_count, $freeloads_count, $tshirts_count, $voucher_count) { - foreach ($users as &$user) { - $user['Nick'] = User_Nick_render($user); - $user['Gekommen'] = glyph_bool($user['Gekommen']); - $user['got_voucher'] = $user['got_voucher']; - $user['Aktiv'] = glyph_bool($user['Aktiv']); - $user['force_active'] = glyph_bool($user['force_active']); - $user['Tshirt'] = glyph_bool($user['Tshirt']); - $user['lastLogIn'] = date(_('m/d/Y h:i a'), $user['lastLogIn']); - $user['actions'] = table_buttons([ - button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs') +/** + * @param array[] $users + * @param string $order_by + * @param int $arrived_count + * @param int $active_count + * @param int $force_active_count + * @param int $freeloads_count + * @param int $tshirts_count + * @param int $voucher_count + * @return string + */ +function Users_view( + $users, + $order_by, + $arrived_count, + $active_count, + $force_active_count, + $freeloads_count, + $tshirts_count, + $voucher_count +) { + foreach ($users as &$user) { + $user['Nick'] = User_Nick_render($user); + $user['Gekommen'] = glyph_bool($user['Gekommen']); + $user['Aktiv'] = glyph_bool($user['Aktiv']); + $user['force_active'] = glyph_bool($user['force_active']); + $user['Tshirt'] = glyph_bool($user['Tshirt']); + $user['lastLogIn'] = date(_('m/d/Y h:i a'), $user['lastLogIn']); + $user['actions'] = table_buttons([ + button_glyph(page_link_to('admin_user') . '&id=' . $user['UID'], 'edit', 'btn-xs') + ]); + } + $users[] = [ + 'Nick' => '<strong>' . _('Sum') . '</strong>', + 'Gekommen' => $arrived_count, + 'got_voucher' => $voucher_count, + 'Aktiv' => $active_count, + 'force_active' => $force_active_count, + 'freeloads' => $freeloads_count, + 'Tshirt' => $tshirts_count, + 'actions' => '<strong>' . count($users) . '</strong>' + ]; + + return page_with_title(_('All users'), [ + msg(), + buttons([ + button(page_link_to('register'), glyph('plus') . _('New user')) + ]), + table([ + 'Nick' => Users_table_header_link('Nick', _('Nick'), $order_by), + 'Vorname' => Users_table_header_link('Vorname', _('Prename'), $order_by), + 'Name' => Users_table_header_link('Name', _('Name'), $order_by), + 'DECT' => Users_table_header_link('DECT', _('DECT'), $order_by), + 'Gekommen' => Users_table_header_link('Gekommen', _('Arrived'), $order_by), + 'got_voucher' => Users_table_header_link('got_voucher', _('Voucher'), $order_by), + 'freeloads' => _('Freeloads'), + 'Aktiv' => Users_table_header_link('Aktiv', _('Active'), $order_by), + 'force_active' => Users_table_header_link('force_active', _('Forced'), $order_by), + '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) ]); - } - $users[] = [ - 'Nick' => '<strong>' . _('Sum') . '</strong>', - 'Gekommen' => $arrived_count, - 'got_voucher' => $voucher_count, - 'Aktiv' => $active_count, - 'force_active' => $force_active_count, - 'freeloads' => $freeloads_count, - 'Tshirt' => $tshirts_count, - 'actions' => '<strong>' . count($users) . '</strong>' - ]; - - return page_with_title(_("All users"), [ - msg(), - buttons([ - button(page_link_to('register'), glyph('plus') . _("New user")) - ]), - table([ - 'Nick' => Users_table_header_link('Nick', _("Nick"), $order_by), - 'Vorname' => Users_table_header_link('Vorname', _("Prename"), $order_by), - 'Name' => Users_table_header_link('Name', _("Name"), $order_by), - 'DECT' => Users_table_header_link('DECT', _("DECT"), $order_by), - 'Gekommen' => Users_table_header_link('Gekommen', _("Arrived"), $order_by), - 'got_voucher' => Users_table_header_link('got_voucher', _("Voucher"), $order_by), - 'freeloads' => _('Freeloads'), - 'Aktiv' => Users_table_header_link('Aktiv', _("Active"), $order_by), - 'force_active' => Users_table_header_link('force_active', _("Forced"), $order_by), - '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) - ]); } -function Users_table_header_link($column, $label, $order_by) { - return '<a href="' . page_link_to('users') . '&OrderBy=' . $column . '">' . $label . ($order_by == $column ? ' <span class="caret"></span>' : '') . '</a>'; +/** + * @param string $column + * @param string $label + * @param string $order_by + * @return string + */ +function Users_table_header_link($column, $label, $order_by) +{ + return '<a href="' . page_link_to('users') . '&OrderBy=' . $column . '">' . $label . ($order_by == $column ? ' <span class="caret"></span>' : '') . '</a>'; } -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 '<span class="text-success">' . _("Free") . '</span>'; - } - - if ($upcoming_shifts[0]['start'] > time()) { - if ($upcoming_shifts[0]['start'] - time() > 3600) { - return '<span class="text-success moment-countdown" data-timestamp="' . $upcoming_shifts[0]['start'] . '">' . _("Next shift %c") . '</span>'; +/** + * @param array $user + * @return string|false + */ +function User_shift_state_render($user) +{ + $upcoming_shifts = ShiftEntries_upcoming_for_user($user); + + if (empty($upcoming_shifts)) { + return '<span class="text-success">' . _('Free') . '</span>'; + } + + $nextShift = array_shift($upcoming_shifts); + + if ($nextShift['start'] > time()) { + if ($nextShift['start'] - time() > 3600) { + return '<span class="text-success moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Next shift %c') . '</span>'; + } + return '<span class="text-warning moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Next shift %c') . '</span>'; } - return '<span class="text-warning moment-countdown" data-timestamp="' . $upcoming_shifts[0]['start'] . '">' . _("Next shift %c") . '</span>'; - } - $halfway = ($upcoming_shifts[0]['start'] + $upcoming_shifts[0]['end']) / 2; - - if (time() < $halfway) { - return '<span class="text-danger moment-countdown" data-timestamp="' . $upcoming_shifts[0]['start'] . '">' . _("Shift starts %c") . '</span>'; - } - return '<span class="text-danger moment-countdown" data-timestamp="' . $upcoming_shifts[0]['end'] . '">' . _("Shift ends %c") . '</span>'; + $halfway = ($nextShift['start'] + $nextShift['end']) / 2; + + if (time() < $halfway) { + return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['start'] . '">' . _('Shift starts %c') . '</span>'; + } + return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift['end'] . '">' . _('Shift ends %c') . '</span>'; } -function User_view_shiftentries($needed_angel_type) { - $shift_info = '<br><b>' . $needed_angel_type['name'] . ':</b> '; - - $shift_entries = []; - foreach ($needed_angel_type['users'] as $user_shift) { - $member = User_Nick_render($user_shift); - if ($user_shift['freeloaded']) { - $member = '<strike>' . $member . '</strike>'; +/** + * @param array $needed_angel_type + * @return string + */ +function User_view_shiftentries($needed_angel_type) +{ + $shift_info = '<br><b>' . $needed_angel_type['name'] . ':</b> '; + + $shift_entries = []; + foreach ($needed_angel_type['users'] as $user_shift) { + $member = User_Nick_render($user_shift); + if ($user_shift['freeloaded']) { + $member = '<del>' . $member . '</del>'; + } + + $shift_entries[] = $member; } - - $shift_entries[] = $member; - } - $shift_info .= join(", ", $shift_entries); - - return $shift_info; + $shift_info .= join(', ', $shift_entries); + + return $shift_info; } /** * Helper that renders a shift line for user view + * + * @param array $shift + * @param array $user_source + * @param bool $its_me + * @return array */ -function User_view_myshift($shift, $user_source, $its_me) { - global $LETZTES_AUSTRAGEN, $privileges; - - $shift_info = '<a href="' . shift_link($shift) . '">' . $shift['name'] . '</a>'; - if ($shift['title']) { - $shift_info .= '<br /><a href="' . shift_link($shift) . '">' . $shift['title'] . '</a>'; - } - foreach ($shift['needed_angeltypes'] as $needed_angel_type) { - $shift_info .= User_view_shiftentries($needed_angel_type); - } - - $myshift = [ - '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'] - ]; - - if ($shift['freeloaded']) { - if (in_array("user_shifts_admin", $privileges)) { - $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . ': ' . $shift['freeload_comment'] . '</p>'; - } else { - $myshift['comment'] .= '<br /><p class="error">' . _("Freeloaded") . '</p>'; +function User_view_myshift($shift, $user_source, $its_me) +{ + global $privileges; + + $shift_info = '<a href="' . shift_link($shift) . '">' . $shift['name'] . '</a>'; + if ($shift['title']) { + $shift_info .= '<br /><a href="' . shift_link($shift) . '">' . $shift['title'] . '</a>'; + } + foreach ($shift['needed_angeltypes'] as $needed_angel_type) { + $shift_info .= User_view_shiftentries($needed_angel_type); + } + + $myshift = [ + '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'] + ]; + + if ($shift['freeloaded']) { + if (in_array('user_shifts_admin', $privileges)) { + $myshift['comment'] .= '<br /><p class="error">' . _('Freeloaded') . ': ' . $shift['freeload_comment'] . '</p>'; + } else { + $myshift['comment'] .= '<br /><p class="error">' . _('Freeloaded') . '</p>'; + } + } + + $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() + config('last_unsubscribe') * 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'] = [ - 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']); - - return $myshift; + $myshift['actions'] = table_buttons($myshift['actions']); + + return $myshift; } /** * Helper that prepares the shift table for user view + * + * @param array[] $shifts + * @param array $user_source + * @param bool $its_me + * @return array */ -function User_view_myshifts($shifts, $user_source, $its_me) { - $myshifts_table = []; - $timesum = 0; - foreach ($shifts as $shift) { - $myshifts_table[] = User_view_myshift($shift, $user_source, $its_me); - - if ($shift['freeloaded']) { - $timesum += (- 2 * ($shift['end'] - $shift['start'])); - } else { - $timesum += ($shift['end'] - $shift['start']); +function User_view_myshifts($shifts, $user_source, $its_me) +{ + $myshifts_table = []; + $timesum = 0; + foreach ($shifts as $shift) { + $myshifts_table[] = User_view_myshift($shift, $user_source, $its_me); + + if ($shift['freeloaded']) { + $timesum += (-2 * ($shift['end'] - $shift['start'])); + } else { + $timesum += ($shift['end'] - $shift['start']); + } } - } - - if (count($myshifts_table) > 0) { - $myshifts_table[] = [ - 'date' => '<b>' . _("Sum:") . '</b>', - 'time' => "<b>" . round($timesum / 3600, 1) . " h</b>", - 'room' => "", - 'shift_info' => "", - 'comment' => "", - 'actions' => "" - ]; - } - return $myshifts_table; + + if (count($myshifts_table) > 0) { + $myshifts_table[] = [ + 'date' => '<b>' . _('Sum:') . '</b>', + 'time' => '<b>' . round($timesum / 3600, 1) . ' h</b>', + 'room' => '', + 'shift_info' => '', + 'comment' => '', + 'actions' => '' + ]; + } + return $myshifts_table; } /** * Renders view for a single user + * + * @param array $user_source + * @param bool $admin_user_privilege + * @param bool $freeloader + * @param array[] $user_angeltypes + * @param array[] $user_groups + * @param array[] $shifts + * @param bool $its_me + * @return string */ -function User_view($user_source, $admin_user_privilege, $freeloader, $user_angeltypes, $user_groups, $shifts, $its_me) { - $user_name = htmlspecialchars($user_source['Vorname']) . " " . htmlspecialchars($user_source['Name']); - $myshifts_table = User_view_myshifts($shifts, $user_source, $its_me); - - return page_with_title('<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', [ - msg(), - div('row space-top', [ - div('col-md-12', [ - buttons([ - $admin_user_privilege ? button(page_link_to('admin_user') . '&id=' . $user_source['UID'], glyph("edit") . _("edit")) : '', - $admin_user_privilege ? button(user_driver_license_edit_link($user_source), glyph("road") . _("driving license")) : '', - ($admin_user_privilege && ! $user_source['Gekommen']) ? button(page_link_to('admin_arrive') . '&arrived=' . $user_source['UID'], _("arrived")) : '', - $admin_user_privilege ? button(page_link_to('users') . '&action=edit_vouchers&user_id=' . $user_source['UID'], glyph('cutlery') . _('Edit vouchers')) : '', - $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')) : '' - ]) - ]) - ]), - div('row', [ - div('col-md-3', [ - '<h1>', - '<span class="glyphicon glyphicon-phone"></span>', - $user_source['DECT'], - '</h1>' - ]), - div('col-md-3', [ - '<h4>' . _("User state") . '</h4>', - ($admin_user_privilege && $freeloader) ? '<span class="text-danger"><span class="glyphicon glyphicon-exclamation-sign"></span> ' . _("Freeloader") . '</span><br />' : '', - $user_source['Gekommen'] ? User_shift_state_render($user_source) . '<br />' : '', - $admin_user_privilege || $its_me ? ($user_source['Gekommen'] ? '<span class="text-success"><span class="glyphicon glyphicon-home"></span> ' . sprintf(_("Arrived at %s"), date('Y-m-d', $user_source['arrival_date'])) . '</span>' : '<span class="text-danger">' . sprintf(_("Not arrived (Planned: %s)"), date('Y-m-d', $user_source['planned_arrival_date'])) . '</span>') : ($user_source['Gekommen'] ? '<span class="text-success"><span class="glyphicon glyphicon-home"></span> ' . _("Arrived") . '</span>' : '<span class="text-danger">' . _("Not arrived") . '</span>'), - $admin_user_privilege ? ($user_source['got_voucher'] > 0 ? '<br /><span class="text-success">' . glyph('cutlery') . sprintf(ngettext("Got %s voucher", "Got %s vouchers", $user_source['got_voucher']), $user_source['got_voucher']) . '</span><br />' : '<br /><span class="text-danger">' . _("Got no vouchers") . '</span><br />') : '', - ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Aktiv']) ? ' <span class="text-success">' . _("Active") . '</span>' : '', - ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' <span class="text-success">' . _("T-Shirt") . '</span>' : '' - ]), - div('col-md-3', [ - '<h4>' . _("Angeltypes") . '</h4>', - User_angeltypes_render($user_angeltypes) - ]), - div('col-md-3', [ - '<h4>' . _("Rights") . '</h4>', - User_groups_render($user_groups) - ]) - ]), - ($its_me || $admin_user_privilege) ? '<h2>' . _("Shifts") . '</h2>' : '', - ($its_me || $admin_user_privilege) ? table([ - 'date' => _("Day"), - 'time' => _("Time"), - 'room' => _("Location"), - 'shift_info' => _("Name & workmates"), - 'comment' => _("Comment"), - 'actions' => _("Action") - ], $myshifts_table) : '', - $its_me ? info(glyph('info-sign') . _("Your night shifts between 2 and 8 am count twice."), true) : '', - $its_me && count($shifts) == 0 ? error(sprintf(_("Go to the <a href=\"%s\">shifts table</a> to sign yourself up for some shifts."), page_link_to('user_shifts')), true) : '' - ]); +function User_view($user_source, $admin_user_privilege, $freeloader, $user_angeltypes, $user_groups, $shifts, $its_me) +{ + $user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']); + $myshifts_table = User_view_myshifts($shifts, $user_source, $its_me); + + return page_with_title( + '<span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . ' <small>' . $user_name . '</small>', + [ + msg(), + div('row space-top', [ + div('col-md-12', [ + buttons([ + $admin_user_privilege ? button( + page_link_to('admin_user') . '&id=' . $user_source['UID'], + glyph('edit') . _('edit') + ) : '', + $admin_user_privilege ? button( + user_driver_license_edit_link($user_source), + glyph('road') . _('driving license') + ) : '', + ($admin_user_privilege && !$user_source['Gekommen']) ? button( + page_link_to('admin_arrive') . '&arrived=' . $user_source['UID'], + _('arrived') + ) : '', + $admin_user_privilege ? button( + page_link_to('users') . '&action=edit_vouchers&user_id=' . $user_source['UID'], + glyph('cutlery') . _('Edit vouchers') + ) : '', + $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') + ) : '' + ]) + ]) + ]), + div('row', [ + div('col-md-3', [ + '<h1>', + '<span class="glyphicon glyphicon-phone"></span>', + $user_source['DECT'], + '</h1>' + ]), + div('col-md-3', [ + '<h4>' . _('User state') . '</h4>', + ($admin_user_privilege && $freeloader) + ? '<span class="text-danger"><span class="glyphicon glyphicon-exclamation-sign"></span> ' . _('Freeloader') . '</span><br />' + : '', + $user_source['Gekommen'] + ? User_shift_state_render($user_source) . '<br />' + : '', + $admin_user_privilege || $its_me + ? ( + $user_source['Gekommen'] + ? '<span class="text-success"><span class="glyphicon glyphicon-home"></span> ' + . sprintf(_('Arrived at %s'), date('Y-m-d', $user_source['arrival_date'])) + . '</span>' + : '<span class="text-danger">' + . sprintf(_('Not arrived (Planned: %s)'), date('Y-m-d', $user_source['planned_arrival_date'])) + . '</span>' + ) + : ( + $user_source['Gekommen'] + ? '<span class="text-success"><span class="glyphicon glyphicon-home"></span> ' . _('Arrived') . '</span>' + : '<span class="text-danger">' . _('Not arrived') . '</span>'), + $admin_user_privilege + ? ( + $user_source['got_voucher'] > 0 + ? '<br /><span class="text-success">' + . glyph('cutlery') + . sprintf( + ngettext('Got %s voucher', 'Got %s vouchers', $user_source['got_voucher']), + $user_source['got_voucher'] + ) + . '</span><br />' + : '<br /><span class="text-danger">' . _('Got no vouchers') . '</span><br />') + : '', + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Aktiv']) ? ' <span class="text-success">' . _('Active') . '</span>' : '', + ($user_source['Gekommen'] && $admin_user_privilege && $user_source['Tshirt']) ? ' <span class="text-success">' . _('T-Shirt') . '</span>' : '' + ]), + div('col-md-3', [ + '<h4>' . _('Angeltypes') . '</h4>', + User_angeltypes_render($user_angeltypes) + ]), + div('col-md-3', [ + '<h4>' . _('Rights') . '</h4>', + User_groups_render($user_groups) + ]) + ]), + ($its_me || $admin_user_privilege) ? '<h2>' . _('Shifts') . '</h2>' : '', + ($its_me || $admin_user_privilege) ? table([ + 'date' => _('Day'), + 'time' => _('Time'), + 'room' => _('Location'), + 'shift_info' => _('Name & workmates'), + 'comment' => _('Comment'), + 'actions' => _('Action') + ], $myshifts_table) : '', + $its_me ? info(glyph('info-sign') . _('Your night shifts between 2 and 8 am count twice.'), true) : '', + $its_me && count($shifts) == 0 + ? error(sprintf( + _('Go to the <a href="%s">shifts table</a> to sign yourself up for some shifts.'), + page_link_to('user_shifts') + ), true) + : '' + ] + ); } /** * View for password recovery step 1: E-Mail + * + * @return string */ -function User_password_recovery_view() { - return page_with_title(user_password_recovery_title(), [ - msg(), - _("We will send you an e-mail with a password recovery link. Please use the email address you used for registration."), - form([ - form_text('email', _("E-Mail"), ""), - form_submit('submit', _("Recover")) - ]) - ]); +function User_password_recovery_view() +{ + return page_with_title(user_password_recovery_title(), [ + msg(), + _('We will send you an e-mail with a password recovery link. Please use the email address you used for registration.'), + form([ + form_text('email', _('E-Mail'), ''), + form_submit('submit', _('Recover')) + ]) + ]); } /** * View for password recovery step 2: New password + * + * @return string */ -function User_password_set_view() { - return page_with_title(user_password_recovery_title(), [ - msg(), - _("Please enter a new password."), - form([ - form_password('password', _("Password")), - form_password('password2', _("Confirm password")), - form_submit('submit', _("Save")) - ]) - ]); +function User_password_set_view() +{ + return page_with_title(user_password_recovery_title(), [ + msg(), + _('Please enter a new password.'), + form([ + form_password('password', _('Password')), + form_password('password2', _('Confirm password')), + form_submit('submit', _('Save')) + ]) + ]); } -function User_angeltypes_render($user_angeltypes) { - $output = []; - foreach ($user_angeltypes as $angeltype) { - $class = ""; - if ($angeltype['restricted'] == 1) { - if ($angeltype['confirm_user_id'] != null) { +/** + * @param array[] $user_angeltypes + * @return string + */ +function User_angeltypes_render($user_angeltypes) +{ + $output = []; + foreach ($user_angeltypes as $angeltype) { $class = 'text-success'; - } else { - $class = 'text-warning'; - } - } else { - $class = 'text-success'; + if ($angeltype['restricted'] == 1 && $angeltype['confirm_user_id'] == null) { + $class = 'text-warning'; + } + $output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">' + . ($angeltype['supporter'] ? glyph('education') : '') . $angeltype['name'] + . '</a>'; } - $output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">' . ($angeltype['supporter'] ? glyph('education') : '') . $angeltype['name'] . '</a>'; - } - return join('<br />', $output); + return join('<br />', $output); } -function User_groups_render($user_groups) { - $output = []; - foreach ($user_groups as $group) { - $output[] = substr($group['Name'], 2); - } - return join('<br />', $output); +/** + * @param array[] $user_groups + * @return string + */ +function User_groups_render($user_groups) +{ + $output = []; + foreach ($user_groups as $group) { + $output[] = substr($group['Name'], 2); + } + return join('<br />', $output); } /** * Render a user nickname. * - * @param User $user_source + * @param array $user_source * @return string */ -function User_Nick_render($user_source) { - return '<a class="' . ($user_source['Gekommen'] ? '' : 'text-muted') . '" href="' . page_link_to('users') . '&action=view&user_id=' . $user_source['UID'] . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>'; +function User_Nick_render($user_source) +{ + return '<a class="' . ($user_source['Gekommen'] ? '' : 'text-muted') . '" href="' + . page_link_to('users') . '&action=view&user_id=' . $user_source['UID'] + . '"><span class="icon-icon_angel"></span> ' . htmlspecialchars($user_source['Nick']) . '</a>'; } -function render_user_departure_date_hint() { - global $user; - - if (! isset($user['planned_departure_date']) || $user['planned_departure_date'] == null) { - return _("Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities."); - } - - return null; -} +/** + * @return string|null + */ +function render_user_departure_date_hint() +{ + global $user; -function render_user_freeloader_hint() { - global $user, $max_freeloadable_shifts; - - if (User_is_freeloader($user)) { - return sprintf(_("You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again."), $max_freeloadable_shifts); - } - - return null; + if (!isset($user['planned_departure_date']) || $user['planned_departure_date'] == null) { + return _('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.'); + } + + return null; } -// Hinweis für Engel, die noch nicht angekommen sind -function render_user_arrived_hint() { - global $user; - - if ($user['Gekommen'] == 0) { - return _("You are not marked as arrived. Please go to heaven's desk, get your angel badge and/or tell them that you arrived already."); - } - - return null; +/** + * @return string|null + */ +function render_user_freeloader_hint() +{ + global $user; + + if (User_is_freeloader($user)) { + return sprintf( + _('You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again.'), + config('max_freeloadable_shifts') + ); + } + + return null; } -function render_user_tshirt_hint() { - global $enable_tshirt_size, $user; - - if ($enable_tshirt_size && $user['Size'] == "") { - return _("You need to specify a tshirt size in your settings!"); - } - - return null; +/** + * Hinweis für Engel, die noch nicht angekommen sind + * + * @return string|null + */ +function render_user_arrived_hint() +{ + global $user; + + if ($user['Gekommen'] == 0) { + return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.'); + } + + return null; } -function render_user_dect_hint() { - global $user; - - if ($user['DECT'] == "") { - return _("You need to specify a DECT phone number in your settings! If you don't have a DECT phone, just enter \"-\"."); - } - - return null; +/** + * @return string|null + */ +function render_user_tshirt_hint() +{ + global $user; + + if (config('enable_tshirt_size') && $user['Size'] == '') { + return _('You need to specify a tshirt size in your settings!'); + } + + return null; } -?> +/** + * @return string|null + */ +function render_user_dect_hint() +{ + global $user; + + if ($user['DECT'] == '') { + return _('You need to specify a DECT phone number in your settings! If you don\'t have a DECT phone, just enter \'-\'.'); + } + + return null; +} |